В этой статье описаны эксперименты с 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: * Simple test program to blink an LED on pin 7 */ #include #include int main (void) { int pin = 7; printf("Raspberry Pi wiringPi blink testn"); if (wiringPiSetup() == -1) exit (1); pinMode(pin, OUTPUT); for (;;){ printf("LED Onn"); digitalWrite(pin, 1); delay(250); printf("LED Offn"); digitalWrite(pin, 0); delay(250); } return 0; }
Компилируем код:
gcc -o blink blink.c -L/usr/local/lib -lwiringPi
И запускаем:
sudo ./blink
У вас должен получиться мигающий светодиод. Теперь можно сделать что-то более интересное:
/* * buttonLED.c: * Simple test program to change the blinking rate of an LED when a button is pressed */ #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 button LED testn") ; if (wiringPiSetup() == -1) exit (1); pinMode(pin_LED, OUTPUT); pinMode(pin_switch, INPUT); for (;;){ if (digitalRead (8) == 0){ // button pressed del = 100; } else { del = 250; } digitalWrite(pin_LED, 1); delay(del); digitalWrite(pin_LED, 0); delay(del); } return 0 ; }
А как же функция analogRead? К сожалению, в отличие от Arduino, RPi не имеет встроенного АЦП (аналого-цифрового преобразователя). Но некоторые из разрабатываемых плат будут включать в себя АЦП, например Gertboard