Общие понятия о GPIO
Операционная система Raspbian предлагает пользователям удобный модуль для программного управления GPIO. Называется он RPi.GPIO и является стандартным приложением. Перед его применением, модуль рекомендуется обновить. Сделать это можно набрав в консоли следующие строки:
sudo apt-get update sudo apt-get install python-rpi.gpio
Некоторые GPIO имеют альтернативные функции, назначение которых указано в синих блоках (на рисунке сверху). К тому же нельзя нарушать нагрузочные способности порта, чтобы не вывести Raspberry Pi из строя. Следует помнить, что GPIO работает с напряжением 3,3V и максимальным током нагрузки 50mA на один вывод. При добавлении резисторов все выводы будут гарантированно защищены от перегрузок.
Подтягивающие резисторы (pull-up/pull-down) на Raspberry Pi обеспечивают стабильный логический уровень (0 или 1) на GPIO-пинах, когда к ним не подключено активное устройство, предотвращая «плавающие» состояния. Внутренние резисторы (50-65 кОм) можно включить программно, а для стабильной работы кнопок и датчиков обычно достаточно подтяжки к 3.3В (pull-up).
- Внутренняя подтяжка: Можно управлять через библиотеку RPi.GPIO (настройка pull_up_down=GPIO.PUD_UP или PUD_DOWN).
- Pull-up (подтяжка к 3.3В): Кнопка замыкается на землю (GND). По умолчанию GPIO «1», при нажатии — «0».
- Pull-down (подтяжка к GND): Кнопка замыкается на 3.3В. По умолчанию GPIO «0», при нажатии — «1».
- Внешние резисторы: Рекомендуется использовать для длинных проводов или если встроенного сопротивления недостаточно (обычно 1-10 кОм).
- I2C шина: На линиях SDA/SCL обычно необходимы внешние резисторы, хотя на некоторых платах есть встроенные, например, на 1.8 кОм на Pi 4.
import RPi.GPIO as GPIO
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP) # Включение внутреннего pull-up на 18 пине
Для сброса всех GPIO портов Raspberry Pi в безопасное состояние (режим входа INPUT) и очистки настроек библиотеки RPi.GPIO, необходимо использовать функцию cleanup(). Это предотвратит повреждение пинов и вернет их в исходное состояние, что критически важно при завершении работы скриптов управления.
import RPi.GPIO as GPIO
# ... ваш код ...
GPIO.cleanup() # Сбрасывает все использованные GPIO в режим INPUT
GPIO.setmode(GPIO.BCM)
GPIO.setmode(GPIO.BCM) Эта функция настраивает библиотеку Python RPi.GPIO для использования номеров каналов Broadcom SOC (System on a Chip) для обращения к выводам GPIO на Raspberry Pi. Она обращается к номеру "GPIO" (например, GPIO17), а не к физическому положению вывода на 40-контактном разъеме.

Основные сведения:
- Назначение: Определяет способ идентификации контактов в вашем скрипте (по имени канала BCM или физическому положению 1-40).
- Применение: Используется при первоначальной настройке скрипта, обычно после import RPi.GPIO as GPIO.
- Преимущество: нумерация BCM часто предпочтительнее в продвинутых учебных пособиях и документации, поскольку она более единообразна в различных программных библиотеках.
- Предупреждение: номера контактов BCM могут различаться в зависимости от версии Raspberry Pi (например, между Pi 1 Model B Rev 1 и Rev 2), в отличие от того, GPIO.BOARD какой номер остается относительно постоянным.
Пример настройки:
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT) # Uses GPIO 18, not physical pin 18
В RPi.GPIO можно использовать либо номера контактов (BOARD), либо номера контактов Broadcom GPIO (BCM), но в каждой программе можно использовать только одну систему. Я обычно использую номера GPIO, но ни один из способов не является неправильным. У обоих есть свои преимущества и недостатки.
import RPi.GPIO as GPIO
# Для нумерации GPIO выберите BCM
GPIO.setmode(GPIO.BCM)
# или для нумерации контактов выберите ПЛАТА
GPIO.setmode(GPIO.BOARD)
# Но вы не можете использовать оба варианта, поэтому используйте только один!!!
Теперь практика. Кнопка и мигание LED
Чтобы иметь практическое представление о работе с GPIO, создадим небольшой проект, который заставит Raspberry Pi мигать светодиодом один раз в секунду, а при нажатии на кнопку увеличивать частоту мигания в 5 раз. Схема будущего проекта показана на рисунке более подробнее у первоисточника: За управление светодиодом будет отвечать GPIO4, а за чтение состояния кнопки GPIO21.
По классике, программы для Raspberry Pi пишутся на скриптовом языке программирования Python. Особенность его в том, что для запуска программы не требуется компилятор. Скрипт запускается и начинает работу сразу, но его необходимо сохранить в файл с последующей загрузкой в плату. Для этого открываем терминал и прописываем следующую строку:
nano /home/pi/led_key_test.py
Тем самым мы создаём файл «led_key_test.py» в директории «/home/pi». Как следствие откроется редактор, в который необходимо написать нижеследующий код (работает, проверил):
#!/usr/bin/env python
#coding: utf-8 # -*-
# Подключение библиотек для работы с GPIO и организации задержек по времени
import time
import RPi.GPIO as GPIO
# Определение выводов GPIO, к которым подключены светодиод и кнопка
LED = 4
KEY = 21
# Сброс портов (все выводы настраиваются на вход - INPUT)
GPIO.cleanup()
# Режим нумерации пинов - по названию (не по порядковому номеру на колодке)
GPIO.setmode(GPIO.BCM)
# Настройка пина LED на выход (OUTPUT)
GPIO.setup(LED, GPIO.OUT)
# Установка логического (0) на выводе
#LED.output(LED, GPIO.LOW)
# Настройка пина KEY на вход (INPUT)
GPIO.setup(KEY, GPIO.IN)
# Вывод приветствия на экран
print("Hello Raspberry Pi")
# Проверка на прерывание программы по нажатию (CTRL+C) на клавиатуре
try:
# Бесконечный цикл
while True:
# Если кнопка нажата (на пине KEY логический 0)
if GPIO.input(KEY) == False:
# Выставляем задержку 0,1 сек. и выводим сообщение
timeout = 0.1
print("Key is pressed.")
GPIO.output(LED, GPIO.HIGH)
# Задержка
time.sleep(timeout)
# Гасим светодиод
GPIO.output(LED, GPIO.LOW)
time.sleep(timeout)
else:
# иначе задержка - 0,5 сек.
timeout = 0.5
# Включаем светодиод
GPIO.output(LED, GPIO.HIGH)
# Задержка
time.sleep(timeout)
# Гасим светодиод
GPIO.output(LED, GPIO.LOW)
time.sleep(timeout)
# Если CTRL+C была нажата - сбрасываем порт и завершаем выполнение программы
except KeyboardInterrupt:
GPIO.cleanup()
Ещё одной немаловажной особенностью программы Python является строгое соблюдение отступов (табуляций) при написании программ. Учитывайте это правило при создании своего кода.
Итак, переходим к последнему этапу. Чтобы выйти из редактора жмём CTRL+X и сохраняем программу нажатием «у» + ENTER. Осталось только сделать скрипт исполняемым. Для этого вводим в терминале следующие строки:
chmod +x /home/pi/led_key_test.py /home/pi/led_key_test.py
Видим на экране приветствие и мигающий 1 раз в секунду светодиод. Теперь проверяем работоспособность кнопки, и если всё сделано правильно, то при её нажатии частота мигания возрастёт и возвратиться к прежней при её отпускании.
Модель светофора наглядная демонстрация работы GPIO контактов
На основе этой статьиИспользуем GPIO для моделирования работы светофора по нажатию кнопки, как это делается на редко используемых пешеходных переходах, где обычно горит зеленый свет для транспорта, а пешеход может кнопкой запустить программу включения красного света для транспорта. Алгоритм этой программы такой: при нажатии кнопки начинает мигать зеленый свет, затем на короткое время загорается желтый, затем красный; красный свет горит некоторое время, затем короткое время горят красный и желтый, и, наконец, снова зеленый; далее система ждет очередного нажатия кнопки. Для программирования этого алгоритма воспользуемся встроенной в образ ОС Raspbian интегрированной среды разработки (IDE) на языке Python (Питон). Язык Python имеет имеет большое число достоинств, о которых можно почитать в сети, что делает его весьма хорошим инструментом как для начинающих программистов, так и для профессионалов. Это интерпретируемый язык , его команды выполняются последовательно, одна за другой. В IDE Python команды можно выполнять, просто вводя их с клавиатуры и нажимая клавишу Enter в конце строки.
Первая строка указывает, где в ОС находится интерпретатор Python.
Далее, вслед за строками, указывающими на необходимые библиотеки, следует назначение переменных, называющих светодиоды соответствующего цвета и кнопку. Им присваиваются номера контактов GPIO.
#!/usr/bin/python
import RPi.GPIO as GPIO
from time import sleep
RED_PIN = 36
YELLOW_PIN = 32
GREEN_PIN = 29
BUTTON_PIN = 40
print ("RPi.GPIO init start")
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
print ("RPi.GPIO init end")
print ("GPIO setup")
GPIO.setup(RED_PIN, GPIO.OUT)
GPIO.setup(YELLOW_PIN, GPIO.OUT)
GPIO.setup(GREEN_PIN, GPIO.OUT)
GPIO.setup(BUTTON_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.output(RED_PIN, 0)
GPIO.output(YELLOW_PIN, 0)
GPIO.output(GREEN_PIN, 1)
while True:
inp = GPIO.input(BUTTON_PIN)
if inp==0:
for x in range(0, 5):
GPIO.output(GREEN_PIN, 1)
sleep(0.5)
GPIO.output(GREEN_PIN, 0)
sleep(0.5)
GPIO.output(YELLOW_PIN, 1)
sleep(2)
GPIO.output(YELLOW_PIN, 0)
GPIO.output(RED_PIN, 1)
sleep(5)
GPIO.output(YELLOW_PIN, 1)
sleep(1)
GPIO.output(RED_PIN, 0)
GPIO.output(YELLOW_PIN, 0)
GPIO.output(GREEN_PIN, 1)
Условная (без резисторов) монтажная схема "пешеходного светофора":
Не забываем про токоограничивающие резисторы!!!
