Використання GPIO виводів Raspberry Pi
В цій статті описані експерименти з GPIO (General Purpose Input/Output, Входи/Виходи загального призначення) контактами Raspberry Pi. Я спробував працювати з ними трьома способами: Python, Bash і C. У цій статті будуть описані всі три способи. Але для початку трохи інформації про налаштування та підготовку.
Підключення до GPIO контактам RPi: Я використав старий IDE шлейф від флоппі дисковода. Він має 34 контакти, а RPi має тільки 26 контактів, тому частина роз'єму не використовується. На іншому кінці шлейфа припаяні BLS штифти, які вставлені в макетну плату і до сих пір дуже добре працюють.
Підключення виводів: По посиланнях є таблиця з значенням виводів і схема їх розташування. Виводи рахуються зліва направо, зверху вниз, починаючи з виводу 3.3В. Ось як використані контакти у мене:
Вивід 2: 5В
Вивід 3: "GPIO0". До нього підключений один з виводів вимикача, інший його вивід підключений до GND. Цей вивід GPIO має внутрішній підтягуючий pull-up резистор. Це означає, що коли вимикач не замкнутий, на виході високий рівень, а коли замкнутий – низький.
Вивід 6: GND (цей вивід підключений до GND макетної плати)
Вивід 7: "GPIO4". До нього підключається анод світлодіода через резистор 220 Ом.
У всіх наступних прикладах буде використано таке підключення. Різні бібліотеки використовують різні виводи, створюючи плутанину, тому я намагатимусь позбутися від неї. Також зазначимо, що все це робиться в режимі SSH, тому монітор не підключений.
Важливе зауваження: В RPi Wiki написано, що GPIO виводи небуферизовані і незащищені, тому коротке замикання становить небезпеку для всього RPi, тому будьте обережні! Розробляється нова версія плати з захистом.
Важливе зауваження: Всі програми, які звертаються до GPIO контактів, повинні бути запущені з правами адміністратора, інакше ви отримаєте повідомлення про помилку.
Python
Це одна з моїх улюблених мов, тому я вирішив спробувати її. По-перше, встановіть pip (Python package installer, пакет установки Python):
sudo curl https://raw.github.com/pypa/pip/master/contrib/get-pip.py | python
Потім встановіть модуль RPi.GPIO для Python:
sudo pip install rpi.gpio
Тепер ви можете увійти до інтерпретатора Python (sudo python), і робити такі речі:
import RPi.GPIO as GPIO
GPIO.setup(7, GPIO.OUT)
GPIO.output(7, True)
GPIO.output(7,False)
Bash
Я завжди любив Unix за те, що основною його ідеєю є те, що все є файлом. GPIO контакти Raspberry Pi також є файлами! З використанням нашої макетної плати ми можемо запалювати і гасити світлодіод.
sudo su -
echo "4" > /sys/class/gpio/export
echo "4" > /sys/class/gpio/export
echo "out" > /sys/class/gpio/gpio4/direction
echo "1" > /sys/class/gpio/gpio4/value
echo "0" > /sys/class/gpio/gpio4/value
Для читання входів використовуйте команду "cat" і шлях файлу.
echo "0" > /sys/class/gpio/export
echo "in" > /sys/class/gpio/gpio0/direction
cat /sys/class/gpio/gpio0/value
C
Старий добрий C. Базовий приклад для C дійсно складний, але, на щастя, Гордон написав Arduino подібну бібліотеку, але для Raspberry Pi! Отже, ось що потрібно зробити:
Завантажте і встановіть бібліотеку:
cd /tmp
wget http://project-downloads.drogon.net/files/wiringPi-1.tgz
tar xfz wiringPi-1.tgz
cd wiringPi/wiringPi
make
sudo make install
У системі вашого Raspberry Pi тепер встановлена бібліотека wiringPi, тому ми можемо написати невелику програму з використанням її.
cd ~
nano blink.c
Скопіюйте код даної програми:
/* * blink.c: * Простий тестовий програму для миготіння світлодіода на піні 7 */ #include#include int main (void) { int pin = 7; printf("Тест миготіння світлодіода Raspberry Pi wiringPi\n"); if (wiringPiSetup() == -1) exit (1); pinMode(pin, OUTPUT); for (;;){ printf("Світлодіод увімкнено\n"); digitalWrite(pin, 1); delay(250); printf("Світлодіод вимкнено\n"); digitalWrite(pin, 0); delay(250); } return 0; }
Компіліруємо код:
gcc -o blink blink.c -L/usr/local/lib -lwiringPi
І запускаємо:
sudo ./blink
У вас повинен вийти миготючий світлодіод. Тепер можна зробити щось більш цікаве:
/* * buttonLED.c: * Простий тестовий програму для зміни швидкості миготіння світлодіода, коли кнопка натиснута */ #include#include int main (void) { int pin_LED = 7; // GPIO7 / header pin 7 int pin_switch = 8; // SDA0 / header pin 3 int del = 250; printf ("Тест кнопки світлодіода Raspberry Pi wiringPi\n") ; if (wiringPiSetup() == -1) exit (1); pinMode(pin_LED, OUTPUT); pinMode(pin_switch, INPUT); for (;;){ if (digitalRead (8) == 0){ // кнопка натиснута del = 100; } else { del = 250; } digitalWrite(pin_LED, 1); delay(del); digitalWrite(pin_LED, 0); delay(del); } return 0 ; }
А як же функція analogRead? На жаль, на відміну від Arduino, RPi не має вбудованого АЦП (аналогово-цифрового перетворювача). Але деякі з розроблюваних плат будуть включати в себе АЦП, наприклад Gertboard