Capturer les commandes de télécommande IR sur Raspberry Pi sans LIRC : Approche Python UART
Intégrer une télécommande IR à un Raspberry Pi est simple lorsque vous contournez LIRC et accédez directement à l'interface série UART. Le guide suivant parcourt tout le processus — de la configuration matérielle au décodage Python — pour que vous puissiez capturer fiablement les signaux de télécommande avec un code minimal.
Pourquoi éviter LIRC ?
LIRC fournit un cadre générique pour les périphériques IR, mais il peut être excessif pour des projets simples et introduit parfois de la latence ou des problèmes de compatibilité. En utilisant les broches UART intégrées (TX/RX) et un protocole série à basse vitesse, vous obtenez une solution légère, déterministe et plus facile à déboguer.
Aperçu matériel
- Capteur IR : HX1838 (ou tout récepteur IR 5V) qui sort des données série.
- GPIO Raspberry Pi : Connectez la sortie du capteur au GPIO 15 (RX). Alimentez le VCC du capteur en 5V et sa masse sur une broche de masse.
- Configuration des broches UART : Désactivez la console par défaut sur ttyAMA0 pour que l'UART puisse être utilisé uniquement pour l'entrée du capteur.
Étape 1 – Préparer le Raspberry Pi pour l'UART
1. Sauvegarder la ligne de commande du noyau :
sudo cp /boot/cmdline.txt /boot/cmdline_bp.txt
2. Supprimer les paramètres ttyAMA0 (ex. : console=ttyAMA0,115200 et kgdboc=ttyAMA0,115200) de /boot/cmdline.txt :
sudo nano /boot/cmdline.txt
La ligne résultante doit ressembler à :
dwc_otg.lpm_enable=0 console=tty1 root=/dev/mmcblk0p6 rootfstype=ext4 elevator=deadline rootwait
3. Masquer l'invite de connexion ttyAMA0 dans /etc/inittab :
sudo nano /etc/inittab
Mettez en commentaire :
#X:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
Étape 2 – Installer pySerial
Installez la bibliothèque Python pour la communication série, qui fournit le module serial pour l'UART :
sudo apt-get install python-serial
Après installation, vous pouvez l'importer dans votre script :
import serial
Étape 3 – Câbler le capteur IR
- Connectez la broche de sortie du capteur au GPIO 15 (RX).
- Alimentez le capteur en 5 V et masse.
- Comme le capteur ne sort que des données, TX (GPIO 14) n'est pas utilisé pour ce projet.
Étape 4 – Script Python de base pour lire les octets IR
Le HX1838 transmet un flux série à 2400 bauds. L'extrait suivant lit 12 à 16 octets par pression de touche et affiche leurs codes ASCII.
import serial
ser = serial.Serial('/dev/ttyAMA0')
ser.baudrate = 2400
for _ in range(15): # capturer jusqu'à 15 octets
byte = ser.read(1)
print(ord(byte))
Les essais ont montré que 2400 bauds offre la capture la plus fiable, probablement parce que les vitesses plus basses réduisent la probabilité d'erreur de bit sur les ondes.
Étape 5 – Décodage des touches de télécommande Samsung
En utilisant une télécommande Samsung TV, nous avons découvert que chaque pression de touche produit 12 à 16 octets :
- Octets 0‑5 : En-tête – constant pour toutes les touches.
- Octets 6‑11 : Charge utile – identifie de manière unique le bouton pressé.
- Octet 12 : Queue (spécifique à cette télécommande).
Pour mapper une touche, nous calculons une somme pondérée simple des octets 6‑11 :
keyidentity = (byte[6] + 2*byte[7] + 3*byte[8] + 4*byte[9] + 5*byte[10] + 6*byte[11])
Bien que ce ne soit pas la méthode la plus robuste, elle produit une valeur unique pour chaque bouton, rendant la comparaison triviale. N'hésitez pas à la remplacer par un hash ou XOR si vous avez besoin d'une résistance aux collisions plus stricte.
Exemple complet : ir_serial3samsung.py
Voici un script rationalisé qui :
- Capture 24 octets (deux trames complètes) pour vider le tampon série.
- Utilise seulement les 12 premiers octets pour décoder la touche.
- Affiche le
keyidentitycalculé pour référence rapide.
import serial
ser = serial.Serial('/dev/ttyAMA0', 2400)
while True:
# Lire 24 octets pour vider le tampon
raw = ser.read(24)
# Les 12 premiers octets correspondent à une pression de touche
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}')
Exécutez le script et appuyez sur les boutons de la télécommande Samsung. Chaque pression affiche un Key ID unique. Stockez ces IDs dans une table de correspondance pour les associer à des actions dans votre application.
Conclusion
Utiliser l'UART et un script Python simple pour capturer les signaux de télécommande IR élimine le besoin de LIRC, réduit la latence et offre un contrôle total sur la logique de décodage. Comme le code est minimal et transparent, le débogage est simple. Vous pouvez adapter ce motif pour toute télécommande IR qui sort des données série, ce qui en fait une solution polyvalente pour les projets Raspberry Pi.
Pour des instructions plus détaillées, voir l'article original : How to Use and Emulate…
Processus de fabrication
- Profilage température Raspberry Pi précis avec Python, SQLite et LabVIEW
- Comment lire la température avec un DS18B20 sur Raspberry Pi 2
- Mesure de température sur Raspberry Pi avec capteurs 1‑Wire Maxim et pont I2C DS2482
- Construire un capteur de température distant avec Raspberry Pi et Python – Guide étape par étape
- Surveillance précise de la température dans un placard serveur avec Raspberry Pi
- Surveillance météo à distance avec Raspberry Pi 3 et PubNub
- Intégration du TI SensorTag à Blynk via Node‑RED sur Raspberry Pi Zero
- Détection d'éclairs avec Raspberry Pi et AS3935 : Guide pratique
- Mesurer des capteurs analogiques sur Raspberry Pi sans ADC natif