Программирование GPIO на Raspberry Pi с помощью Python 3
Одним из ключевых преимуществ Raspberry Pi и аналогичных одноплатных компьютеров являются встроенные контакты GPIO (General Purpose Input/Output). Ранние модели Raspberry Pi имеют 26 контактов, тогда как современные модели оснащены 40-контактным разъемом GPIO. Эти контакты позволяют взаимодействовать с внешними устройствами, датчиками и исполнительными механизмами.
Программирование GPIO на Raspberry Pi с помощью Python 3
Введение
Одним из ключевых преимуществ Raspberry Pi и аналогичных одноплатных компьютеров являются встроенные контакты GPIO (General Purpose Input/Output). Ранние модели Raspberry Pi имеют 26 контактов, тогда как современные модели оснащены 40-контактным разъемом GPIO. Эти контакты позволяют взаимодействовать с внешними устройствами, датчиками и исполнительными механизмами.
Получение информации о распиновке
Для просмотра распиновки GPIO выполните команду в терминале:
1
pinout
Команда отобразит схему расположения контактов, где:
- Контакт №1 находится в левом верхнем углу
- Контакт №2 отмечен красным кругом
- Контакт №3 расположен рядом с контактом №1 и т.д.
Типы контактов GPIO
На Raspberry Pi доступны следующие типы контактов:
- Питание: 3V3, 5V, GND
- Цифровые входы/выходы: GPIOxx
- Специализированные интерфейсы: I2C, SPI, UART
Программирование светодиодов с помощью GPIO
Схема подключения светодиода
Для создания простой схемы мигания светодиода понадобится:
- Соединительные провода
- Светодиод
- Резистор 220 Ом
Схема подключения:
- Анод светодиода → физический пин 8 через резистор 220 Ом
- Катод светодиода → физический пин 6 (GND)
Установка библиотеки GPIO
Библиотека RPi.GPIO обычно предустановлена в последних версиях Raspberry Pi OS. При необходимости установите ее:
1
sudo apt-get install python3-rpi.gpio -y
Базовый пример мигания светодиодом
Создайте файл prog05.py со следующим кодом:
1
2
3
4
5
6
7
8
9
10
11
12
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
while True:
GPIO.output(8, GPIO.HIGH)
sleep(1)
GPIO.output(8, GPIO.LOW)
sleep(1)
Объяснение кода:
GPIO.setmode(GPIO.BOARD)- использование физической нумерации контактовGPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)- настройка пина 8 как выходаGPIO.output(8, GPIO.HIGH/LOW)- установка высокого/низкого уровня
Сигнал SOS с помощью светодиода
Расширенный пример передачи сообщения “SOS” азбукой Морзе:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
def flash(led, duration):
GPIO.output(led, GPIO.HIGH)
sleep(duration)
GPIO.output(led, GPIO.LOW)
sleep(duration)
while True:
# Три точки (S)
flash(8, 0.2)
flash(8, 0.2)
flash(8, 0.2)
sleep(0.3)
# Три тире (O)
flash(8, 0.5)
flash(8, 0.5)
flash(8, 0.5)
# Три точки (S)
flash(8, 0.2)
flash(8, 0.2)
flash(8, 0.2)
sleep(1)
Попеременное мигание двумя светодиодами
Схема подключения:
- Второй светодиод: анод → пин 10 через резистор, катод → GND
Код для попеременного мигания:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW)
while True:
GPIO.output(8, GPIO.HIGH)
GPIO.output(10, GPIO.LOW)
sleep(1)
GPIO.output(8, GPIO.LOW)
GPIO.output(10, GPIO.HIGH)
sleep(1)
Альтернативная реализация с использованием счетчика:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import RPi.GPIO as GPIO
from time import sleep
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)
GPIO.setup(8, GPIO.OUT, initial=GPIO.LOW)
GPIO.setup(10, GPIO.OUT, initial=GPIO.LOW)
counter = 0
while True:
if counter % 2 == 0:
led1 = 8
led2 = 10
else:
led1 = 10
led2 = 8
GPIO.output(led1, GPIO.HIGH)
GPIO.output(led2, GPIO.LOW)
sleep(1)
counter = counter + 1
Светодиодная гирлянда с библиотекой gpiozero
Установка библиотеки:
1
pip3 install gpiozero
Код для светодиодной гирлянды:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from gpiozero import LED
from time import sleep
# Инициализация светодиодов (BCM нумерация)
led1 = LED(2)
led2 = LED(3)
led3 = LED(4)
led4 = LED(17)
led5 = LED(27)
led6 = LED(22)
led7 = LED(10)
led8 = LED(9)
led9 = LED(11)
sleeptime = 0.2
while True:
led1.on()
sleep(sleeptime)
led1.off()
led2.on()
sleep(sleeptime)
led2.off()
# ... аналогично для остальных светодиодов
led9.on()
sleep(sleeptime)
led9.off()
Программирование кнопок с GPIO
Схема с подключением к питанию:
- Один конец кнопки → пин 7
- Другой конец кнопки → GND
Код для обработки нажатия кнопки:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
button = 7
GPIO.setup(button, GPIO.IN, GPIO.PUD_UP)
while True:
button_state = GPIO.input(button)
if button_state == GPIO.HIGH:
print("HIGH")
else:
print("LOW")
sleep(0.5)
Схема с подключением к земле:
- Один конец кнопки → пин 7
- Другой конец кнопки → 3V3 (НЕ 5V!)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
from time import sleep
import RPi.GPIO as GPIO
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
button = 7
GPIO.setup(button, GPIO.IN, GPIO.PUD_DOWN)
while True:
button_state = GPIO.input(button)
if button_state == GPIO.HIGH:
print("HIGH")
else:
print("LOW")
sleep(0.5)
Типичные проблемы и решения
Проблема: Светодиод не мигает
- Решение: Проверьте правильность подключения и полярность светодиода
- Убедитесь, что резистор подключен правильно
Проблема: Кнопка не реагирует на нажатие
- Решение: Проверьте подключение кнопки и используемый пин
- Убедитесь, что используется правильный тип подтягивающего резистора
Проблема: Ошибки при импорте библиотек
- Решение: Убедитесь, что библиотеки установлены правильно
- Проверьте версию Python и совместимость библиотек
Проблема: Повреждение Raspberry Pi
- Решение: Никогда не подключайте кнопку к пину 5V при использовании GPIO.PUD_UP
- Всегда используйте резисторы для защиты светодиодов
Рекомендации по безопасности
- Всегда отключайте питание перед изменением схемы
- Используйте резисторы для ограничения тока через светодиоды
- Не подключайте источники напряжения выше 3.3V к GPIO пинам
- Регулярно проверяйте целостность соединений
Программирование GPIO открывает безграничные возможности для создания интерфейсов между Raspberry Pi и физическим миром. Начните с простых проектов и постепенно переходите к более сложным схемам, соблюдая меры предосторожности для защиты вашего оборудования.


