IR-afstandsbediening-commando's vastleggen op Raspberry Pi zonder LIRC: Een Python UART-benadering
Een IR-afstandsbediening integreren met een Raspberry Pi is eenvoudig wanneer je LIRC overlaat en direct in de UART-seriële interface tapt. De volgende gids loopt het hele proces af – van hardware-opstelling tot Python-decodering – zodat je betrouwbaar remote-signalen kunt vastleggen met minimale code.
Waarom LIRC overslaan?
LIRC biedt een generiek framework voor IR-apparaten, maar kan overkill zijn voor simpele projecten en introduceert soms latentie of compatibiliteitsproblemen. Door de ingebouwde UART-pinnen (TX/RX) en een laagsnelheid serieel protocol te gebruiken, bereik je een lichtgewicht, deterministische oplossing die makkelijker te debuggen is.
Hardware-overzicht
- IR-sensor: HX1838 (of elke 5V IR-ontvanger) die seriële data uitgeeft.
- Raspberry Pi GPIO: Verbind de uitgang van de sensor met GPIO 15 (RX). Koppel de VCC van de sensor aan 5V en GND aan een massepin.
- UART-pinconfiguratie: Schakel de standaard console op ttyAMA0 uit zodat de UART uitsluitend voor sensor-invoer kan worden gebruikt.
Stap 1 – Raspberry Pi voorbereiden voor UART
1. Backup de kernel commandoregel:
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
2. Verwijder ttyAMA0-parameters (bijv. console=ttyAMA0,115200 en kgdboc=ttyAMA0,115200) uit /boot/cmdline.txt:
sudo nano /boot/cmdline.txt
De resulterende regel moet er ongeveer zo uitzien:
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
3. Masker de ttyAMA0-login prompt in /etc/inittab:
sudo nano /etc/inittab
Commentarieer uit:
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Stap 2 – pySerial installeren
Installeer de Python seriële bibliotheek, die de serial-module voor UART-communicatie biedt:
sudo apt-get install python-serial
Na installatie kun je het importeren in je script:
import serial
Stap 3 – De IR-sensor bedraden
- Verbind de uitgangspin van de sensor met GPIO 15 (RX).
- Voorzie de sensor van 5 V en massa.
- Omdat de sensor alleen data uitgeeft, is TX (GPIO 14) voor dit project ongebruikt.
Stap 4 – Basis Python-script om IR-bytes te lezen
De HX1838 transmiteert een seriële stroom van 2400 bps. Het volgende fragment leest 12–16 bytes per toetsaanslag en print hun ASCII-codes.
import serial
ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 2400
for _ in range(15): # vang tot 15 bytes
byte = ser.read(1)
print(ord(byte))
Proef en fout toonde aan dat 2400 bps de meest betrouwbare opname biedt, waarschijnlijk omdat lagere snelheden de bit-foutkans door de lucht verminderen.
Stap 5 – Samsung-afstandsbediening-toetsen decoderen
Met een Samsung TV-afstandsbediening ontdekten we dat elke toetsaanslag 12–16 bytes oplevert:
- Bytes 0–5: Header – constant voor alle toetsen.
- Bytes 6–11: Payload – identificeert uniek de ingedrukte knop.
- Byte 12: Staart (specifiek voor deze afstandsbediening).
Om een toets te mappen, berekenen we een eenvoudige gewogen som van bytes 6–11:
keyidentity = (byte[6] + 2*byte[7] + 3*byte[8] + 4*byte[9] + 5*byte[10] + 6*byte[11])
Hoewel dit niet de meest robuuste methode is, levert het een unieke waarde per knop op, wat vergelijking triviaal maakt. Vervang het gerust door een hash of XOR als je strengere botsingsweerstand nodig hebt.
Compleet voorbeeld: ir_serial3samsung.py
Hieronder een gestroomlijnd script dat:
- 24 bytes vastlegt (twee volledige frames) om de seriële buffer leeg te maken.
- Alleen de eerste 12 bytes gebruikt om de toets te decoderen.
- De berekende
keyidentityprint voor snelle referentie.
import serial
ser = serial.Serial('/dev/ttyAMA0', 2400)
while True:
# Lees 24 bytes om buffer te wissen
raw = ser.read(24)
# Eerste 12 bytes corresponderen met een enkele toetsaanslag
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}')
Voer het script uit en druk op knoppen van de Samsung-afstandsbediening. Elke toetsaanslag print een unieke Key ID. Bewaar deze IDs in een lookup-tabel om ze te mappen op acties in je applicatie.
Conclusie
Het gebruik van UART en een eenvoudig Python-script om IR-afstandsbedieningssignalen vast te leggen, elimineert de noodzaak voor LIRC, vermindert latentie en biedt volledige controle over de decoderinglogica. Omdat de code minimaal en transparant is, is debuggen eenvoudig. Je kunt dit patroon aanpassen voor elke IR-afstandsbediening die seriële data uitgeeft, wat het een veelzijdige oplossing maakt voor Raspberry Pi-projecten.
Voor meer diepgaande instructies, zie de originele post: How to Use and Emulate…
Productieproces
- Nauwkeurige Raspberry Pi Temperatuurprofielering Met Python, SQLite En LabVIEW
- Hoe Temperatuur Te Lezen Met Een DS18B20 Op Raspberry Pi 2
- Temperatuurmeting op Raspberry Pi met Maxim 1-Wire sensoren en DS2482 I2C-brug
- Een externe temperatuursensor bouwen met Raspberry Pi en Python – Stap-voor-stap handleiding
- Accurate temperatuurbewaking in een serverkast met Raspberry Pi
- Externe weerbewaking met Raspberry Pi 3 en PubNub
- TI SensorTag integreren met Blynk via Node-RED op Raspberry Pi Zero
- Bliksemdetectie met Raspberry Pi en AS3935: Een Praktische Handleiding
- Analoge Sensoren Meten op Raspberry Pi Zonder Native ADC
- Een Professionele Raspberry Pi Universele Afstandsbediening Bouwen met LIRC
- Een LED Besturen met een PIR-bewegingssensor op Raspberry Pi