Raspberry Pi представляет собой не просто миникомпьютер, предназначенный для того, чтобы из него сделали медиацентр и проигрывали на нем музыку. Он может применяться и в более серьезных электротехнических проектах. Для этого у него имеются линии ввода/вывода общего назначения (GPIO), которые мы сегодня рассмотрим.

GPIO находятся на разъеме 2×13, на котором можно найти интерфейсы SPI, I2C, UART и линии питания 3.3 В и 5 В.

Восемь из этих выводов могут быть непосредственно задействованы в качестве цифрового ввода или вывода. Поэтому с помощью них можно управлять светодиодами, драйверами двигателей и прочими подобными устройствами. Естественно, к ним могут быть подсоединены кнопки и переключатели для ввода информации в Raspberry Pi.

Итак, как же управлять линиями GPIO на Raspberry Pi?
Для начала нужно установить библиотеку RPi.GPIO Python Library. Возможно, она уже была предустановленна на ваш дистрибутив операционной системы Raspbian OS. Чтобы проверить это, введите:
sudo python
Затем введите в строчке:
import RPi.GPIO as GPIO
Если не появилась ошибка, то все хорошо. Но если же она возникла, то нужно сделать следующие шаги.
Для начала загружаем RPi GPIO Library:
wget http://pypi.python.org/packages/source/R/RPi.GPIO/RPi.GPIO-0.3.1a.tar.gz
Затем извлекаем файлы:
tar zxf RPi.GPIO-0.3.1a.tar.gz
Потом переходим в извлеченный каталог:
cd RPi.GPIO-0.3.1a
И устанавливаем библиотеку:
sudo python setup.py install
Использование библиотеки RPi.GPIO Python Library
# импорт библиотеки
import RPi.GPIO as GPIO
# используем нумерацию разъема Raspberry Pi
GPIO.setmode(GPIO.BOARD) # или GPIO.setmode(GPIO.BCM)
# настраиваем выводы GPIO на вход или выход
GPIO.setup(11, GPIO.IN)
GPIO.setup(13, GPIO.OUT)
# берем входное значение с вывода 11
input_value = GPIO.input(11)
# устанавливаем выходное значение на вывод 13
GPIO.output(13, GPIO.HIGH)
#GPIO.output(13, GPIO.LOW)
Различие между GPIO.setmode(GPIO.BOARD) и GPIO.setmode(GPIO.BCM) заключается в системе нумерации выводов. В первом случае используется нумерация разъема P1 на борту Raspberry Pi, а во втором случае нумерация выводов системы-на-кристалле Broadcom, являющейся ядром Raspberry Pi. Следует знать, что в случае с BCM нумерация выводов между первой и второй ревизиями немного отличается, а при использовании BOARD ревизия не имеет никакого значения, все остается тем же самым.
Теперь подключим к Raspberry Pi светодиоды и кнопки. На разъеме нам доступны восемь GPIO.

Соединения:

Значения сопротивлений резисторов могут быть вычислены следующим образом. Используемые в данном случае 5-миллиметровые светодиоды потребляют ток 20 мА. Напряжение, подаваемое с Raspberry Pi, составляет 3.3 В. Тогда сопротивление будет равно 3.3 В / 20 мА = 165 Ом. Для кнопок были задействованы резисторы 1 КОм.

Код
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setup(16, GPIO.IN)
GPIO.setup(18, GPIO.IN)
GPIO.setup(11, GPIO.OUT)
GPIO.setup(13, GPIO.OUT)
GPIO.setup(15, GPIO.OUT)
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
# state - определяет должен ли светодиод быть включенным или выключенным
state = 0
# increment - направление изменения состояний
inc = 1
while True:
# кнопка нажата
if ( GPIO.input(16) == True ):
if (inc == 1):
state = state + 1;
else:
state = state - 1;
# достигнуто максимальное состояние state, возвращаемся назад (декремент)
if (state == 3):
inc = 0
#достигнуто минимальное состояние state, возвращаемся назад (инкремент)
elif (state == 0):
inc = 1
if (state == 1):
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
elif (state == 2):
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.LOW)
elif (state == 3):
GPIO.output(11, GPIO.HIGH)
GPIO.output(13, GPIO.HIGH)
GPIO.output(15, GPIO.HIGH)
else:
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
print("pressed B1 ", state)
# нажата кнопка сброса
if ( GPIO.input(18) == True ):
state = 0
inc = 1
GPIO.output(11, GPIO.LOW)
GPIO.output(13, GPIO.LOW)
GPIO.output(15, GPIO.LOW)
print("pressed B2 ", state)
sleep(0.2);
Итак, как мы видим, использовать GPIO на Raspberry Pi довольно-таки просто. Хотя их не так много, как у Arduino, но в совокупности с вычислительной мощностью системы-на-кристалле этот миникомпьютер будет полезен во многих проектах любительской радиоэлектроники.
Перевод © digitrode.ru