Перехват команд ИК-пульта на Raspberry Pi без LIRC: подход через Python UART
Интеграция ИК-пульта с Raspberry Pi становится простой, если обойти LIRC и обратиться напрямую к последовательному интерфейсу UART. Следующее руководство ведет через весь процесс — от настройки железа до Python-декодирования — чтобы надежно захватывать сигналы пульта с минимальным кодом.
Зачем отказываться от LIRC?
LIRC предоставляет общий фреймворк для ИК-устройств, но может быть избыточен для простых проектов и иногда вводит задержки или проблемы совместимости. Используя встроенные UART-выводы (TX/RX) и протокол последовательной связи низкой скорости, получаете легковесное, детерминированное решение, легче отлаживаемое.
Обзор железа
- ИК-датчик: HX1838 (или любой 5V ИК-приемник) с последовательным выходом данных.
- Raspberry Pi GPIO: подключите выход датчика к GPIO 15 (RX). Питание датчика к 5V, землю к земле Pi.
- Настройка UART: отключите стандартную консоль на ttyAMA0, чтобы UART использовался только для ввода с датчика.
Шаг 1 — Подготовка Raspberry Pi для UART
1. Резервная копия командной строки ядра:
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
2. Удалите параметры ttyAMA0 (например, console=ttyAMA0,115200 и kgdboc=ttyAMA0,115200) из /boot/cmdline.txt:
sudo nano /boot/cmdline.txt
Результирующая строка должна выглядеть примерно так:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
3. Замаскируйте приглашение входа ttyAMA0 в /etc/inittab:
sudo nano /etc/inittab
Закомментируйте:
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Шаг 2 — Установка pySerial
Установите библиотеку Python serial, предоставляющую модуль serial для UART-коммуникации:
sudo apt-get install python-serial
После установки можно импортировать в скрипте:
import serial
Шаг 3 — Подключение ИК-датчика
- Соедините выходной контакт датчика с GPIO 15 (RX).
- Подайте на датчик 5 В и землю.
- Поскольку датчик только выдает данные, TX (GPIO 14) не используется в этом проекте.
Шаг 4 — Базовый Python-скрипт для чтения байтов ИК
HX1838 передает последовательный поток на 2400 бод. Следующий фрагмент читает 12–16 байт на нажатие клавиши и печатает их ASCII-коды.
import serial
ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 2400
for _ in range(15): # захват до 15 байт
byte = ser.read(1)
print(ord(byte))
Экспериментально установлено, что 2400 бод дает наиболее надежный захват, вероятно, потому что более низкие скорости снижают вероятность битовых ошибок по воздуху.
Шаг 5 — Декодирование клавиш пульта Samsung
Используя пульт Samsung TV, обнаружили, что каждое нажатие дает 12–16 байт:
- Байты 0–5: Заголовок — константа для всех клавиш.
- Байты 6–11: Полезная нагрузка — уникально идентифицирует нажатую кнопку.
- Байт 12: Хвост (специфичен для этого пульта).
Для отображения клавиши вычисляем простую взвешенную сумму байтов 6–11:
keyidentity = (byte[6] + 2*byte[7] + 3*byte[8] + 4*byte[9] + 5*byte[10] + 6*byte[11])
Хотя это не самый надежный метод, он дает уникальное значение для каждой кнопки, упрощая сравнение. При желании замените на хеш или XOR для строгой устойчивости к коллизиям.
Полный пример: ir_serial3samsung.py
Ниже — упрощенный скрипт, который:
- Захватывает 24 байта (два полных кадра) для очистки буфера UART.
- Использует только первые 12 байт для декодирования клавиши.
- Печатает вычисленный
keyidentityдля быстрой справки.
import serial
ser = serial.Serial('/dev/ttyAMA0', 2400)
while True:
# Чтение 24 байт для очистки буфера
raw = ser.read(24)
# Первые 12 байт соответствуют одному нажатию
key_bytes = raw[:12]
key_id = sum((i+1)*b for i, b in enumerate(key_bytes[6:12]))
print(f'Key ID: {key_id}')
Запустите скрипт и нажимайте кнопки на пульте Samsung. Каждое нажатие печатает уникальный Key ID. Сохраните эти ID в таблице соответствия для маппинга на действия в вашем приложении.
Заключение
Использование UART и простого Python-скрипта для захвата сигналов ИК-пульта устраняет необходимость в LIRC, снижает задержки и дает полный контроль над логикой декодирования. Благодаря минимальному и прозрачному коду отладка проста. Этот паттерн можно адаптировать для любого ИК-пульта с последовательным выходом, делая его универсальным решением для проектов на Raspberry Pi.
Для более детальных инструкций см. оригинальный пост: How to Use and Emulate…
Производственный процесс
- Точный температурный профиль Raspberry Pi с Python, SQLite и LabVIEW
- Как считывать температуру с DS18B20 на Raspberry Pi 2
- Измерение температуры на Raspberry Pi с датчиками Maxim 1-Wire и мостом DS2482 I2C
- Создание удалённого датчика температуры на Raspberry Pi и Python — пошаговое руководство
- Точный мониторинг температуры в серверной на Raspberry Pi
- Удалённый мониторинг погоды на Raspberry Pi 3 с PubNub
- Интеграция TI SensorTag с Blynk через Node‑RED на Raspberry Pi Zero
- Обнаружение молний с Raspberry Pi и AS3935: практическое руководство
- Чтение аналоговых датчиков на Raspberry Pi без встроенного АЦП
- Создание профессионального универсального пульта на Raspberry Pi с LIRC