После освоения управления выходными сигналами (output), следующим логическим шагом является получение данных из внешнего мира. GPIO-контакты, сконфигурированные как вход (INPUT
), позволяют системе отслеживать напряжение на пине и интерпретировать его как логический HIGH
(высокий уровень) или LOW
(низкий уровень). Основной функцией для этого является GPIO.input()
.
Фундаментальная проблема: "Плавающий" вход
При работе с пинами в режиме входа возникает критически важный нюанс, известный как неопределенное, или "плавающее" состояние (floating state).
Если входной пин ни к чему не подключен или подключен к разомкнутой цепи (например, к отжатой кнопке), его логический уровень не является ни HIGH
, ни LOW
. Он становится похож на флюгер на ветру, будучи крайне чувствительным к любым внешним электромагнитным наводкам. Это приводит к тому, что программа может считывать хаотичные, случайные значения, что делает невозможным получение достоверных данных.
Решение: Внешние стягивающие резисторы
Для борьбы с неопределенностью пину необходимо задать состояние по умолчанию. Поскольку внутренняя подтяжка в текущей версии библиотеки не реализована, для этого используется внешний резистор.
- Стягивающий резистор (Pull-Down): Внешний резистор подключается между GPIO-пином и землей (
GND
). Если никакое другое напряжение на пин не подается, этот резистор будет "стягивать" его уровень кLOW
. Это и есть наше состояние по умолчанию. - Подтягивающий резистор (Pull-Up): Альтернативный вариант, где резистор подключается между пином и питанием (
3.3V
). В этом случае состояние по умолчанию было быHIGH
.
В нашем примере мы будем использовать стягивающий резистор (Pull-Down), как показано на схеме.
Практический пример: Чтение кнопки с внешним резистором
1. Аппаратная часть:
- Repka Pi
- Макетная плата (Breadboard)
- Тактовая кнопка
- Светодиод
- Два резистора (один для светодиода, ~220 Ом; второй для стяжки, ~10 кОм)
- Соединительные провода
2. Схема подключения Внимательно соберите схему, как показано на рисунке.
-
Питание и земля:
- Подключите пин №1 (3.3V) на Repka Pi к красной (+) шине питания на макетной плате.
- Подключите пин №6 (GND) на Repka Pi к синей (-) шине земли на макетной плате.
-
Схема светодиода:
- Подключите пин №11 на Repka Pi к одной ножке резистора (~220 Ом).
- Вторую ножку этого резистора подключите к длинной ножке светодиода (аноду,
+
). - Короткую ножку светодиода (катод,
-
) подключите к синей (-) шине земли.
-
Схема кнопки (с Pull-Down резистором):
- Установите кнопку на макетную плату.
- Подключите пин №7 на Repka Pi к одной из ножек кнопки.
- К этой же ножке подключите один контакт стягивающего резистора (~10 кОм).
- Второй контакт стягивающего резистора подключите к синей (-) шине земли.
- Противоположную ножку кнопки подключите к красной (+) шине питания (3.3V).
Логика схемы: Когда кнопка не нажата, стягивающий резистор соединяет пин №7 с землей, поэтому его состояние по умолчанию — LOW
. Когда вы нажимаете кнопку, она замыкает пин на 3.3V, и его состояние становится HIGH
.
3. Программный код (read_button_external.py
)
# -*- coding: utf-8 -*-
import RepkaPi.GPIO as GPIO
from time import sleep
# --- 1. Настройка ---
# Используем физическую нумерацию пинов, как на схеме
GPIO.setmode(GPIO.BOARD)
# Определяем пины для кнопки и светодиода согласно схеме
BUTTON_PIN = 7
LED_PIN = 11
# Настраиваем пин светодиода как ВЫХОД
GPIO.setup(LED_PIN, GPIO.OUT)
# Настраиваем пин кнопки как ВХОД.
# ПАРАМЕТР pull_up_down НЕ УКАЗЫВАЕМ, так как он реализован внешним резистором.
GPIO.setup(BUTTON_PIN, GPIO.IN)
# --- 2. Основной цикл ---
try:
print("Программа запущена. Нажмите кнопку, чтобы зажечь светодиод.")
print("Нажмите CTRL+C для выхода.")
while True:
# Считываем состояние пина кнопки
button_state = GPIO.input(BUTTON_PIN)
# Проверяем состояние. Так как мы используем Pull-Down,
# нажатие кнопки приведет к состоянию HIGH.
if button_state == GPIO.HIGH:
# Кнопка нажата - включаем светодиод
GPIO.output(LED_PIN, GPIO.HIGH)
else:
# Кнопка не нажата - выключаем светодиод
GPIO.output(LED_PIN, GPIO.LOW)
sleep(0.05) # Небольшая задержка для снижения нагрузки на процессор
# --- 3. Очистка ---
except KeyboardInterrupt:
print("\nЗавершение работы.")
finally:
GPIO.cleanup() # Сбрасываем состояние всех использованных пинов
4. Запуск и результат
Запустите скрипт командой python3 read_button_external.py
. Изначально светодиод будет выключен. При каждом нажатии на кнопку он будет загораться, а при отпускании — гаснуть.
Этот пример демонстрирует канонический способ работы с вводом данных, когда требуется максимальная надежность. Использование внешнего стягивающего (или подтягивающего) резистора — это фундаментальная практика в цифровой электронике, гарантирующая предсказуемое поведение системы.