Пост

Программирование 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 и физическим миром. Начните с простых проектов и постепенно переходите к более сложным схемам, соблюдая меры предосторожности для защиты вашего оборудования.

Авторский пост защищен лицензией CC BY 4.0 .

© evdokimoff. Некоторые права защищены.

Использует тему Chirpy для Jekyll