Введение и практика использования GPIO на Raspberry Pi

Аппаратное окружение: Raspberry Pi 4 Model B Rev 1.5 · Debian 12 Bookworm · Ядро 6.12.25
Дата тестирования: апрель 2026 г.
Автор: zeruns (https://blog.zeruns.com/)
Текст написан с помощью ИИ,仅供参考 (Hermes Agent + DeepSeek V4 Flash)


Содержание

  1. Основы GPIO
  2. Подготовка среды и инструменты
  3. Ввод/вывод GPIO (через Shell)
  4. Ввод/вывод GPIO (через Python)
  5. I2C-коммуникация
  6. SPI-коммуникация
  7. Комплексный пример
  8. Рекомендации и устранение неисправностей

1. Основы GPIO

1.1 Что такое GPIO

GPIO (General Purpose Input/Output — универсальные входы/выходы) — это набор программируемых контактов на микроконтроллере. С помощью ПО вы можете настроить каждый контакт как:

  • Выход: подача высокого (3,3 В) или низкого (0 В) уровня напряжения для управления светодиодами, реле, зуммерами и т.д.
  • Вход: чтение внешнего состояния напряжения (высокое/низкое), например, с кнопок или датчиков
  • Альтернативные функции: для специализированных протоколов, таких как I2C, SPI, UART, PWM и др.

1.2 Распиновка Raspberry Pi 4B

Raspberry Pi 4B имеет 40-пиновый разъём расширения. Существует три способа обозначения контактов:

Тип нумерации Описание Пример библиотеки
Физический (Board) От 1 до 40, верхний левый — 1 RPi.GPIO: setmode(GPIO.BOARD)
BCM-номера (Broadcom) Номера GPIO согласно чипу, например GPIO17 RPi.GPIO: setmode(GPIO.BCM), libgpiod
wiringPi-номера Собственная нумерация wiringPi (устарела) wiringPi

Таблица функций 40-пинового разъёма

                    ┌─────────────────────────────┐
                    │  🥝 Схема 40 пинов RPi 4B   │
  3.3V  (01) ──●  ●── (02)  5V                    │
 GPIO2  (03) ──●  ●── (04)  5V                    │
 GPIO3  (05) ──●  ●── (06)  GND                   │
 GPIO4  (07) ──●  ●── (08)  GPIO14 (UART TX)      │
   GND  (09) ──●  ●── (10)  GPIO15 (UART RX)      │
GPIO17  (11) ──●  ●── (12)  GPIO18 (PWM0)         │
GPIO27  (13) ──●  ●── (14)  GND                   │
GPIO22  (15) ──●  ●── (16)  GPIO23                │
  3.3V  (17) ──●  ●── (18)  GPIO24                │
GPIO10 (19) ──●  ●── (20)  GND  (SPI_MOSI)        │
 GPIO9 (21) ──●  ●── (22)  GPIO25 (SPI_MISO)      │
GPIO11 (23) ──●  ●── (24)  GPIO8  (SPI_SCLK)      │
   GND (25) ──●  ●── (26)  GPIO7  (SPI_CE0)       │
 GPIO0 (27) ──●  ●── (28)  GPIO1  (ID_SDA / I2C)  │
 GPIO5 (29) ──●  ●── (30)  GND                    │
 GPIO6 (31) ──●  ●── (32)  GPIO12 (PWM0)          │
GPIO13 (33) ──●  ●── (34)  GND                    │
GPIO19 (35) ──●  ●── (36)  GPIO16                 │
GPIO26 (37) ──●  ●── (38)  GPIO20                 │
   GND (39) ──●  ●── (40)  GPIO21                 │
                    └─────────────────────────────┘

Таблица основных контактов Raspberry Pi 4B

Физ. пин BCM Функция Физ. пин BCM Функция
1 3.3V 2 5V
3 GPIO2 I2C1 SDA 4 5V
5 GPIO3 I2C1 SCL 6 GND
7 GPIO4 8 GPIO14 UART TX
9 GND 10 GPIO15 UART RX
11 GPIO17 12 GPIO18 PCM_CLK / PWM0
13 GPIO27 14 GND
15 GPIO22 16 GPIO23
17 3.3V 18 GPIO24
19 GPIO10 SPI0 MOSI 20 GND
21 GPIO9 SPI0 MISO 22 GPIO25
23 GPIO11 SPI0 SCLK 24 GPIO8 SPI0 CE0
25 GND 26 GPIO7 SPI0 CE1
27 GPIO0 ID_SDA (EEPROM) 28 GPIO1 ID_SCL (EEPROM)
29 GPIO5 30 GND
31 GPIO6 32 GPIO12 PWM0
33 GPIO13 PWM1 34 GND
35 GPIO19 PCM_FS / PWM1 36 GPIO16
37 GPIO26 38 GPIO20 PCM_DIN
39 GND 40 GPIO21 PCM_DOUT

1.3 Важные замечания

  • Уровень логики: GPIO Raspberry Pi работает с напряжением 3,3 В, нельзя подавать 5 В напрямую
  • Ограничение по току: максимальный ток с одного GPIO — около 16 мА, суммарный ток со всех GPIO — не более 50 мА
  • Исходное состояние: большинство GPIO по умолчанию — в режиме входа, у некоторых есть внутренние подтягивающие резисторы
  • 3,3 В контакты (01/17): максимум около 500 мА суммарного тока
  • 5 В контакты (02/04): питаются напрямую от USB-C, максимальный ток зависит от блока питания

2. Подготовка среды и инструменты

2.1 Установленные инструменты

Тестирование выполнено под Debian 12 Bookworm. Перечисленные ниже инструменты уже установлены:

Инструмент/библиотека Версия Назначение
libgpiod / gpioset / gpioget 1.6.3 Управление GPIO через Shell
python3-libgpiod 1.6.3 Привязка libgpiod для Python
RPi.GPIO 0.7.2 Классическая библиотека для GPIO на Python
smbus2 установлено I2C-коммуникация в Python
spidev установлено SPI-коммуникация в Python
pigpiod 1.79 Демон GPIO (PWM, удалённое управление)
i2c-tools 4.3 Сканирование I2C-устройств

2.2 Установка необходимых инструментов

Если каких-то инструментов нет, установите их командами:

# Основные инструменты для GPIO
sudo apt install gpiod libgpiod-dev python3-libgpiod

# I2C-инструменты
sudo apt install i2c-tools

# Библиотеки Python
pip install RPi.GPIO smbus2 spidev gpiozero

# Демон pigpio (аппаратный PWM — рекомендуется)
sudo apt install pigpio pigpiod
sudo systemctl enable pigpiod --now

2.3 Включение интерфейсов I2C / SPI

Используйте утилиту raspi-config:

sudo raspi-config

Путь в меню:
Interface OptionsI2CEnableYes
Interface OptionsSPIEnableYes

Или вручную отредактируйте файл /boot/firmware/config.txt (в Debian 12):

# Добавьте вручную
sudo tee -a /boot/firmware/config.txt <<EOF
dtparam=i2c_arm=on
dtparam=spi=on
EOF

# Перезагрузка для применения изменений
sudo reboot

Проверка успешного включения:

# Проверить I2C
ls /dev/i2c*
# Вывод: /dev/i2c-20  /dev/i2c-21

# Проверить SPI (после включения)
ls /dev/spi*
# Вывод: /dev/spidev0.0  /dev/spidev0.1

2.4 Просмотр всех gpiochip

$ gpioinfo
gpiochip0 - 58 линий:
        line   0:     "ID_SDA"       не используется   вход  активный-высокий
        line   1:     "ID_SCL"       не используется   вход  активный-высокий
        line   2:      "GPIO2"       не используется   вход  активный-высокий
        ...

Чип BCM2711 на Raspberry Pi 4B предоставляет один gpiochip0, всего 58 GPIO, но только GPIO0-GPIO27 выведены на 40-контактную колодку.


3. Ввод/вывод GPIO (через командную строку)

3.1 Набор инструментов libgpiod

Рекомендуется использовать инструменты libgpiod, они не зависят от wiringPi и являются современным решением.

Основные команды:

Команда Функция Пример
gpioinfo Просмотр состояния всех GPIO gpioinfo
gpioset Установка уровня вывода GPIO gpioset 0 17=1
gpioget Чтение уровня входа GPIO gpioget 0 17
gpiomon Мониторинг событий на GPIO gpiomon 0 17

Пояснение формата: `gpioset <чip> =<vaОбычно chip равен 0 (gpiochip0), pin — это нумерация BCM

3.2 Выход: включение светодиода

Подключите анод светодиода (длинная ножка) через резистор 330 Ом к GPIO17 (физический контакт 11), катод (короткая ножка) подключите к GND (физический контакт 9).

# Установить уровень высокого напряжения на GPIO17 → светодиод включается
gpioset 0 17=1

# Установить уровень низкого напряжения на GPIO17 → светодиод выключается
gpioset 0 17=0

3.3 Вход: чтение состояния кнопки

Одну сторону кнопки подключите к GPIO18 (физический контакт 12), другую — к GND (физический контакт 14).

# Прочитать уровень сигнала на GPIO18 (требуется внешний подтягивающий резистор или включение внутреннего)
gpioget 0 18
# Вывод: 1 (кнопка не нажата, высокий уровень)
# Вывод: 0 (кнопка нажата, низкий уровень)

3.4 Просмотр состояния всех выводов

# Показать все выводы
gpioinfo

# Показать конкретный вывод (по BCM-номеру 17)
gpioinfo | grep "GPIO17"
# Вывод: line  17:      "GPIO17"       "myapp"   output  active-high

3.5 Установка подтягивания/снижения в gpioset

В libgpiod 1.6 поддерживается настройка смещения при запросе:

# Установить GPIO17 как выход, начальное высокое напряжение, с подтягивающим резистором
gpioset --bias=enable 0 17=1

4. Ввод/вывод GPIO (на Python)

4.1 Использование RPi.GPIO (классическая библиотека)

RPi.GPIO — самая популярная библиотека GPIO для Python, простая и интуитивно понятная.

4.1.1 Выход: мигание светодиода

import RPi.GPIO as GPIO
import time

# Использовать BCM-нумерацию выводов
GPIO.setmode(GPIO.BCM)

# Назначить GPIO17 как выход
GPIO.setup(17, GPIO.OUT)

# Мигание светодиодом 5 раз
for _ in range(5):
    GPIO.output(17, GPIO.HIGH)  # Включить
    time.sleep(0.5)
    GPIO.output(17, GPIO.LOW)   # Выключить
    time.sleep(0.5)

# Освободить ресурсы
GPIO.cleanup()

4.1.2 Вход: чтение кнопки

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

# GPIO18 в режиме ввода, включить внутренний подтягивающий резистор
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

try:
    while True:
        if GPIO.input(18) == GPIO.LOW:
            print("Кнопка нажата")
        else:
            print("Кнопка отпущена")
        time.sleep(0.1)
except KeyboardInterrupt:
    GPIO.cleanup()

GPIO.PUD_UP = внутренний подтягивающий резистор (по умолчанию высокий уровень, при нажатии — низкий)
GPIO.PUD_DOWN = внутренний подтягивающий вниз резистор (по умолчанию низкий уровень, при нажатии — высокий)

4.1.3 ШИМ-выход: дышащий свет (светодиод)

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.OUT)  # GPIO18 поддерживает аппаратный ШИМ

pwm = GPIO.PWM(18, 1000)  # Частота 1 кГц
pwm.start(0)  # Начальный коэффициент заполнения 0%

try:
    while True:
        # Постепенно ярче
        for duty in range(0, 101, 5):
            pwm.ChangeDutyCycle(duty)
            time.sleep(0.05)
        # Постепенно тусклее
        for duty in range(100, -1, -5):
            pwm.ChangeDutyCycle(duty)
            time.sleep(0.05)
except KeyboardInterrupt:
    pwm.stop()
    GPIO.cleanup()

4.1.4 Обнаружение событий: чтение кнопки через прерывания

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)
GPIO.setup(18, GPIO.IN, pull_up_down=GPIO.PUD_UP)

def button_callback(channel):
    print(f"Кнопка нажата! (Контакт {channel})")

# Обнаружение спадающего фронта сигнала
GPIO.add_event_detect(18, GPIO.FALLING,
                      callback=button_callback,
                      bouncetime=200)

try:
    print("Ожидание нажатия кнопки...")
    time.sleep(60)
except KeyboardInterrupt:
    GPIO.cleanup()

4.2 Использование gpiozero (высокоуровневая обёртка)

gpiozero предоставляет удобные объектно-ориентированные классы, подходящие для быстрой разработки:

# Установка
pip install gpiozero
from gpiozero import LED, Button, Buzzer
from signal import pause

# Светодиод: автоматически мигает
led = LED(17)
led.blink()

# Кнопка: при нажатии включается светодиод
btn = Button(18, pull_up=True)

# Способ 1: простое присвоение
btn.when_pressed = led.on
btn.when_released = led.off

# Способ 2: пользовательская функция
btn.when_pressed = lambda: print("Нажата!")

# Продолжаем работу
pause()

Встроенные компоненты gpiozero:

Компонент Имя класса Описание
Светодиод LED(pin) Управление включением/миганием/дыханием
Кнопка Button(pin, pull_up=True) Чтение состояния, обнаружение долгого нажатия
Пищалка Buzzer(pin) Управление активной пищалкой
Датчик расстояния DistanceSensor(echo, trigger) Ультразвуковой датчик HC-SR04
Сервопривод Servo(pin) Управление углом поворота сервопривода
Мотор Motor(forward, backward) Управление постоянным током мотора

4.3 Использование Python-биндингов libgpiod (низкоуровневое управление)

import gpiod
import time

# Открыть gpiochip0
chip = gpiod.Chip('gpiochip0')

# Получить линию GPIO17 и запросить как выход
line = chip.get_line(17)
line.request(consumer='myapp', type=gpiod.LINE_REQ_DIR_OUT)

# Установить высокий уровень
line.set_value(1)
time.sleep(1)

# Установить низкий уровень
line.set_value(0)

# Освободить ресурс
line.release()

Режим ввода:

import gpiod

chip = gpiod.Chip('gpiochip0')
line = chip.get_line(18)

# Запросить как вход, внутренний подтягивающий резистор включён
line.request(consumer='myapp',
             type=gpiod.LINE_REQ_DIR_IN,
             flags=gpiod.LINE_REQ_FLAG_BIAS_PULL_UP)

value = line.get_value()  # 0 или 1
print(f"GPIO18 = {value}")

line.release()

5. I2C-связь

5.1 Основы I2C

I2C (Inter-Integrated Circuit) — последовательная шина связи, использует две линии:

Сигнал Контакт Назначение
SCL GPIO3 (физический контакт 5) Линия тактирования
SDA GPIO2 (физический контакт 3) Линия данных

Характеристики:

  • Архитектура ведущий-ведомый: Raspberry Pi — ведущий (Master), датчики и т.д. — ведомые (Slave)
  • 7-битный адрес: каждый ведомый имеет уникальный адрес (например, 0x44)
  • Общая шина: на один I2C-канал можно подключить несколько устройств
  • Скорость: стандартная 100 кГц, быстрая — 400 кГц

5.2 Просмотр I2C-шин

# Просмотр списка I2C-шин
$ i2cdetect -l
i2c-20  i2c        bcm2711_i2c1                   Адаптер I2C
i2c-21  i2c        bcm2711_i2c0                   Адаптер I2C
  • i2c-20: соответствует физическим контактам 3(SDA)/5(SCL) — основная I2C-шина
  • i2c-21: соответствует ID_EEPROM (контакты 27/28), обычно не используется для внешних устройств

5.3 Сканирование I2C-устройств

# Сканирование устройств на шине i2c-20
$ i2cdetect -y 20
     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f
00:                         -- -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- 44 -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --

На адресе 0x44 обнаружено устройство — это датчик температуры и влажности SHT30 (I2C-адрес 0x44).

Если устройства не отображаются (везде --), значит, на шине нет подключённых устройств.

5.4 Чтение и запись через smbus2

smbus2 — наиболее популярная Python-библиотека для работы с I2C.

5.4.1 Чтение данных с датчика SHT30

import smbus2
import time

# Адрес SHT30 по I2C
SHT30_ADDR = 0x44

# Открыть I2C-шину 20
bus = smbus2.SMBus(20)

# Отправить команду измерения: режим высокой точности
bus.write_i2c_block_data(SHT30_ADDR, 0x2C, [0x06])

time.sleep(0.015)  # Ожидание завершения измерений (15 мс)

# Прочитать 6 байт данных
data = bus.read_i2c_block_data(SHT30_ADDR, 0x00, 6)

# Рассчитать температуру и влажность
temp_raw = ((data[0] << 8) | data[1])
temp = -45 + 175 * temp_raw / 65535.0

hum_raw = ((data[3] << 8) | data[4])
hum = 100 * hum_raw / 65535.0

print(f"Температура: {temp:.2f}°C")
print(f"Влажность: {hum:.2f}%")

5.4.2 Инкапсуляция в функцию

import smbus2
import time

class SHT30:
    def __init__(self, bus_id=20, addr=0x44):
        self.bus = smbus2.SMBus(bus_id)
        self.addr = addr

    def read(self):
        """Считывает температуру и влажность, возвращает (температура°C, влажность%)"""
        self.bus.write_i2c_block_data(self.addr, 0x2C, [0x06])
        time.sleep(0.015)
        data = self.bus.read_i2c_block_data(self.addr, 0x00, 6)

        temp_raw = (data[0] << 8) | data[1]
        temp = -45 + 175 * temp_raw / 65535.0

        hum_raw = (data[3] << 8) | data[4]
        hum = 100 * hum_raw / 65535.0

        return round(temp, 2), round(hum, 2)

# Использование
sensor = SHT30()
t, h = sensor.read()
print(f"{t}°C, {h}%RH")

5.4.3 Общие операции чтения/записи по I2C

import smbus2

bus = smbus2.SMBus(20)
addr = 0x44  # I2C-адрес устройства

# Записать один байт в регистр
bus.write_byte_data(addr, 0x2C, 0x06)

# Прочитать один байт
value = bus.read_byte_data(addr, 0x00)

# Прочитать несколько байт
data = bus.read_i2c_block_data(addr, 0x00, 6)

# Записать несколько байт
bus.write_i2c_block_data(addr, 0x2C, [0x06])

# Записать один байт (без указания регистра)
bus.write_byte(addr, 0x06)

# Прочитать один байт (без указания регистра)
value = bus.read_byte(addr)

bus.close()

5.5 Использование командной строки i2cget / i2cset

# Прочитать регистр состояния SHT30 (1 байт)
$ i2cget -y 20 0x44 0x00
0x65

# Прочитать 6 байт необработанных данных
$ i2cget -y 20 0x44 0x00 b 6

6. SPI-связь

6.1 Основы SPI

SPI (Serial Peripheral Interface)

6.3.2 Обмен данными по SPI

import spidev

spi = spidev.SpiDev()
spi.open(0, 0)
spi.max_speed_hz = 500000
spi.mode = 0

# Отправка и приём (полнодуплексный режим: одновременно отправляем 0xFF и читаем ответ)
data_out = [0xFF, 0x00, 0x55]
data_in = spi.xfer2(data_out)  # Передаём 3 байта, принимаем 3 байта
print(f"Отправлено: {[hex(x) for x in data_out]}")
print(f"Получено: {[hex(x) for x in data_in]}")

# Только отправка (игнорируем ответ)
spi.writebytes([0x01, 0x02, 0x03])

spi.close()

7. Практические примеры

7.1 Пример 1: Светодиод «дыхание» + управление кнопкой

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BCM)

LED_PIN = 17      # BCM 17
BTN_PIN = 18      # BCM 18

GPIO.setup(LED_PIN, GPIO.OUT)
GPIO.setup(BTN_PIN, GPIO.IN, pull_up_down=GPIO.PUD_UP)

pwm = GPIO.PWM(LED_PIN, 500)
pwm.start(0)

running = True  # Состояние светодиода

try:
    while True:
        if GPIO.input(BTN_PIN) == GPIO.LOW:
            running = not running
            time.sleep(0.3)  # Устранение дребезга

        if running:
            # Эффект «дыхания»
            for duty in range(0, 101, 2):
                pwm.ChangeDutyCycle(duty)
                time.sleep(0.01)
            for duty in range(100, -1, -2):
                pwm.ChangeDutyCycle(duty)
                time.sleep(0.01)
        else:
            pwm.ChangeDutyCycle(0)

except KeyboardInterrupt:
    pwm.stop()
    GPIO.cleanup()

7.2 Пример 2: Измерение температуры и влажности SHT30 + автоматическая запись

import smbus2
import time
import csv
from datetime import datetime

class SHT30:
    def __init__(self, bus_id=20, addr=0x44):
        self.bus = smbus2.SMBus(bus_id)
        self.addr = addr

    def read(self):
        self.bus.write_i2c_block_data(self.addr, 0x2C, [0x06])
        time.sleep(0.015)
        data = self.bus.read_i2c_block_data(self.addr, 0x00, 6)
        t = -45 + 175 * ((data[0] << 8) | data[1]) / 65535.0
        h = 100 * ((data[3] << 8) | data[4]) / 65535.0
        return round(t, 2), round(h, 2)

sensor = SHT30()

# Тестовое чтение
t, h = sensor.read()
print(f"[{datetime.now()}] Температура: {t}°C, Влажность: {h}%")

# Непрерывная запись в CSV (каждую минуту)
with open('sensor_log.csv', 'w', newline='') as f:
    writer = csv.writer(f)
    writer.writerow(['Время', 'Температура (°C)', 'Влажность (%)'])
    for i in range(10):  # Записать 10 раз
        t, h = sensor.read()
        now = datetime.now().strftime('%H:%M:%S')
        writer.writerow([now, t, h])
        print(f"[{now}] {t}°C, {h}%")
        time.sleep(60)

7.3 Пример 3: gpiozero — управление одной кнопкой

from gpiozero import LED, Button
from signal import pause
import time

led = LED(17)
btn = Button(18, pull_up=True)

# Нажата — включить, отпущена — выключить
btn.when_pressed = led.on
btn.when_released = led.off

# Двойной щелчок — мигание
press_count = 0

def double_click():
    global press_count
    press_count += 1
    time.sleep(0.3)
    if press_count == 2:
        led.blink()
        print("Двойное нажатие! Режим мигания LED")
        press_count = 0

btn.when_pressed = double_click

pause()

8. Рекомендации и устранение неисправностей

8.1 Преобразование уровней напряжения (3.3В и 5В)

:warning: GPIO Raspberry Pi работает с логикой 3.3В — НЕЛЬЗЯ напрямую подключать 5В устройства!

Ситуация Решение
Выход 5В датчика → Вход Raspberry Pi Использовать преобразователь уровней (например, TXS0108E) или делитель напряжения
Выход Raspberry Pi → Вход 5В устройства Некоторые 5В устройства могут распознавать 3.3В как высокий уровень (например, WS2812B)
3.3В датчик → Raspberry Pi Можно подключать напрямую :white_check_mark:

Делитель напряжения (5В → 3.3В):

    5В ──┬── R1 (1.8кОм) ──┬── GPIO Raspberry Pi
         │                │
        GND ── R2 (3.3кОм) ─┘

8.2 Подтягивающие/понижающие резисторы

  • Внутренний подтягивающий (pull-up): в RPi.GPIO — pull_up_down=GPIO.PUD_UP
  • Внутренний понижающий (pull-down): в RPi.GPIO — pull_up_down=GPIO.PUD_DOWN
  • libgpiod: gpiod.LINE_REQ_FLAG_BIAS_PULL_UP
  • Внешний подтягивающий: резистор 4.7кОм ~ 10кОм к 3.3В

8.3 Ограничение по току

Параметр Ограничения
Макс. ток одного GPIO 16 мА
Суммарный ток всех GPIO 50 мА
Общий ток с пинов 3.3В ~500 мА
Общий ток с пинов 5В Зависит от источника питания

:light_bulb: При подключении светодиодов обязательно используйте токоограничивающий резистор 220–330 Ом!

8.4 Распространённые ошибки

Ошибка Причина Решение
RuntimeError: No access to /dev/mem Недостаточно прав Используйте sudo python3 script.py
RuntimeError: Pin already in use Пин занят другой программой Проверьте /sys/class/gpio/, завершите процесс или перезагрузите систему
[Errno 13] Permission denied + i2c I2C не включен или нет прав Добавьте пользователя в группу i2c
Could not open /dev/spidev0.0 SPI не включен Проверьте /boot/config.txt
Светодиод не горит Перепутаны анод и катод Длинный вывод (анод) подключается к GPIO, короткий (катод) — к GND
Ложные срабатывания кнопки Нет антидребезга Добавьте bouncetime в коде или программный антидребезг

8.5 Настройка прав доступа

# Добавление текущего пользователя в группы i2c и gpio
sudo usermod -aG i2c,gpio $USER

# Перезайдите в систему
exec su - $USER

8.6 Онлайн-ресурсы


Автор: zeruns
Данный учебник написан на основе практических тестов на Raspberry Pi 4B + Debian 12 Bookworm