IR-Fernbedienungsbefehle auf Raspberry Pi ohne LIRC erfassen: Python UART-Ansatz
Die Integration einer IR-Fernbedienung mit einem Raspberry Pi ist unkompliziert, wenn man LIRC umgeht und direkt auf die UART-Serienschnittstelle zugreift. Der folgende Leitfaden führt durch den gesamten Prozess – von der Hardware-Einrichtung bis zum Python-Decoding – damit Sie Fernbedienungssignale mit minimalem Code zuverlässig erfassen können.
Warum LIRC überspringen?
LIRC bietet ein generisches Framework für IR-Geräte, kann aber für einfache Projekte überdimensioniert sein und manchmal Latenz oder Kompatibilitätsprobleme verursachen. Durch die Nutzung der eingebauten UART-Pins (TX/RX) und eines Low-Speed-Serialprotokolls erreichen Sie eine leichte, deterministische Lösung, die einfacher zu debuggen ist.
Hardware-Überblick
- IR-Sensor: HX1838 (oder jeder 5V IR-Empfänger), der serielle Daten ausgibt.
- Raspberry Pi GPIO: Verbinden Sie den Ausgabe-Pin des Sensors mit GPIO 15 (RX). Verbinden Sie VCC des Sensors mit 5V und GND mit einem Masse-Pin.
- UART-Pin-Konfiguration: Deaktivieren Sie die Standard-Konsole auf ttyAMA0, damit der UART ausschließlich für Sensoreingang genutzt werden kann.
Schritt 1 – Raspberry Pi für UART vorbereiten
1. Kernel-Kommandozeile sichern:
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
2. ttyAMA0-Parameter entfernen (z. B. console=ttyAMA0,115200 und kgdboc=ttyAMA0,115200) aus /boot/cmdline.txt:
sudo nano /boot/cmdline.txt
Die resultierende Zeile sollte ähnlich aussehen wie:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
3. ttyAMA0-Login-Prompt maskieren in /etc/inittab:
sudo nano /etc/inittab
Auskommentieren:
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Schritt 2 – pySerial installieren
Installieren Sie die Python-Serial-Bibliothek, die das serial Modul für UART-Kommunikation bereitstellt:
sudo apt-get install python-serial
Nach der Installation können Sie es in Ihrem Skript importieren:
import serial
Schritt 3 – IR-Sensor verdrahten
- Verbinden Sie den Ausgabe-Pin des Sensors mit GPIO 15 (RX).
- Versorgen Sie den Sensor mit 5 V und Masse.
- Da der Sensor nur Daten ausgibt, wird TX (GPIO 14) für dieses Projekt nicht verwendet.
Schritt 4 – Basales Python-Skript zum Lesen von IR-Bytes
Der HX1838 überträgt einen seriellen Strom mit 2400 bps. Das folgende Snippet liest 12–16 Bytes pro Tastendruck und gibt ihre ASCII-Codes aus.
import serial
ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 2400
for _ in range(15): # bis zu 15 Bytes erfassen
byte = ser.read(1)
print(ord(byte))
Versuch und Irrtum zeigte, dass 2400 bps die zuverlässigste Erfassung bietet, wahrscheinlich weil niedrigere Geschwindigkeiten die Bitfehlerwahrscheinlichkeit über die Luft reduzieren.
Schritt 5 – Samsung-Fernbedienungstasten decodieren
Mit einer Samsung-TV-Fernbedienung stellten wir fest, dass jeder Tastendruck 12–16 Bytes liefert:
- Bytes 0-5: Header – konstant über alle Tasten.
- Bytes 6-11: Payload – identifiziert die gedrückte Taste eindeutig.
- Byte 12: Tail (spezifisch für diese Fernbedienung).
Um eine Taste zu mappen, berechnen wir eine einfache gewichtete Summe der Bytes 6-11:
keyidentity = (byte[6] + 2*byte[7] + 3*byte[8] + 4*byte[9] + 5*byte[10] + 6*byte[11])
Obwohl dies nicht die robusteste Methode ist, liefert sie einen eindeutigen Wert für jede Taste, was den Vergleich trivial macht. Ersetzen Sie sie gerne durch einen Hash oder XOR, wenn Sie strengere Kollisionsresistenz benötigen.
Vollständiges Beispiel: ir_serial3samsung.py
Unten ist ein optimiertes Skript, das:
- 24 Bytes (zwei vollständige Frames) liest, um den seriellen Puffer zu leeren.
- Nur die ersten 12 Bytes zur Dekodierung der Taste verwendet.
- Den berechneten
keyidentityfür schnelle Referenz ausgibt.
import serial
ser = serial.Serial('/dev/ttyAMA0', 2400)
while True:
# 24 Bytes lesen, um Puffer zu leeren
raw = ser.read(24)
# Erste 12 Bytes entsprechen einem Tastendruck
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}')
Führen Sie das Skript aus und drücken Sie Tasten an der Samsung-Fernbedienung. Jeder Tastendruck gibt eine eindeutige Key ID aus. Speichern Sie diese IDs in einer Lookup-Tabelle, um sie in Ihrer Anwendung auf Aktionen zu mappen.
Fazit
Die Verwendung von UART und einem einfachen Python-Skript zur Erfassung von IR-Fernbedienungssignalen eliminiert die Notwendigkeit für LIRC, reduziert Latenz und bietet volle Kontrolle über die Dekodierungslogik. Da der Code minimal und transparent ist, ist Debugging unkompliziert. Sie können dieses Muster für jede IR-Fernbedienung anpassen, die serielle Daten ausgibt, was es zu einer vielseitigen Lösung für Raspberry Pi Projekte macht.
Für detailliertere Anweisungen siehe den Originalbeitrag: How to Use and Emulate…
Herstellungsprozess
- Präzises Raspberry Pi Temperaturprofiling mit Python, SQLite und LabVIEW
- Temperatur mit DS18B20 am Raspberry Pi 2 auslesen
- Temperaturmessung mit Maxim 1-Wire Sensoren und DS2482 I2C-Bridge am Raspberry Pi
- Fern-Temperatursensor mit Raspberry Pi & Python bauen – Schritt-für-Schritt-Anleitung
- Präzise Temperaturüberwachung im Server-Schrank mit Raspberry Pi
- Remote-Wetterüberwachung mit Raspberry Pi 3 & PubNub
- TI SensorTag mit Blynk via Node-RED auf Raspberry Pi Zero integrieren
- Blitzdetektion mit Raspberry Pi und AS3935: Praktischer Leitfaden
- Analoge Sensoren am Raspberry Pi ohne nativen ADC auslesen – Step-Response Methode
- Professionelle Raspberry Pi Universalfernbedienung mit LIRC bauen