Аппаратное окружение: 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)
Содержание
- Основы GPIO
- Подготовка среды и инструменты
- Ввод/вывод GPIO (через Shell)
- Ввод/вывод GPIO (через Python)
- I2C-коммуникация
- SPI-коммуникация
- Комплексный пример
- Рекомендации и устранение неисправностей
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 Options → I2C → Enable → Yes
Interface Options → SPI → Enable → Yes
Или вручную отредактируйте файл /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В)
GPIO Raspberry Pi работает с логикой 3.3В — НЕЛЬЗЯ напрямую подключать 5В устройства!
| Ситуация | Решение |
|---|---|
| Выход 5В датчика → Вход Raspberry Pi | Использовать преобразователь уровней (например, TXS0108E) или делитель напряжения |
| Выход Raspberry Pi → Вход 5В устройства | Некоторые 5В устройства могут распознавать 3.3В как высокий уровень (например, WS2812B) |
| 3.3В датчик → Raspberry Pi | Можно подключать напрямую |
Делитель напряжения (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В | Зависит от источника питания |
При подключении светодиодов обязательно используйте токоограничивающий резистор 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 Онлайн-ресурсы
- Официальная документация по GPIO Raspberry Pi
- Документация RPi.GPIO
- Документация gpiozero
- Документация libgpiod
Автор: zeruns
Данный учебник написан на основе практических тестов на Raspberry Pi 4B + Debian 12 Bookworm
