Ma tâche consiste maintenant à apprendre à envoyer des commandes aux climatiseurs et autres appareils de la maison. Au départ, ces appareils ne disposent que d'une télécommande infrarouge. Pour résoudre ce problème, j'ai un bouclier d'émetteur-récepteur Raspberry Pi et IR. Dans l'article, vous pouvez trouver des configurations, des équipes, des conseils et un peu de théorie. Du logiciel sera LIRC (Linux Infrared Remote Control) et Python.
J'ai trouvé LIRC avec l'aide de Google. Au cours de l'étude, j'ai découvert que le LIRC fonctionne avec des émetteurs et des récepteurs de signaux IR, peut décoder le signal reçu et effectuer certaines actions à cet égard. Maintenant, je n'ai pas besoin de réception du signal, mais à l'avenir, cela pourrait être utile. Si vous jouez avec LIRC vous-même, il est fortement recommandé de lire le Guide de configuration LIRC .
La configuration
apt-get update apt-get install lirc
# /etc/modules ( ) lirc_dev lirc_rpi gpio_in_pin=18 gpio_out_pin=17
# /etc/lirc/hardware.conf ( , ) LIRCD_ARGS="--uinput --listen" LOAD_MODULES=true DRIVER="default" DEVICE="/dev/lirc0" MODULES="lirc_rpi"
# /boot/config.txt ( lirc, ) dtoverlay=lirc-rpi,gpio_in_pin=18,gpio_out_pin=17
# /etc/lirc/lirc_options.conf ( ) driver = default device = /dev/lirc0
reboot sudo /etc/init.d/lircd status
Record
Vous devez d'abord créer un fichier de configuration avec des séquences de données pour toutes les commandes nécessaires. Je continue d'appeler ce fichier lircd.conf
, mais sur chaque périphérique lui-même, il crée son propre fichier my_device_name.lircd.conf
dans le répertoire /etc/lirc/lircd.conf.d
.
Le format de fichier est décrit ici . Si vous avez une télécommande, vous pouvez écrire les signaux transmis par elle dans un fichier en utilisant l'utilitaire irrecord .
/etc/init.d/lircd stop irrecord -d /dev/lirc0 ~/my_device.lircd.conf mv ~/my_device.lircd.conf /etc/lirc/lircd.conf.d/
irrecord
analyse les séquences et essaie de déterminer le protocole et les paramètres temporels. Dans certains cas, irrecord
échoue dans l'analyse, il est donc possible d'enregistrer la séquence telle qu'elle a été acceptée sous une forme brute, il existe un commutateur --force
pour cela.
Mais même avec --force
irrecord
essaie d'analyser quelque chose et peut également échouer. Ensuite, vous pouvez enregistrer les séquences à l'aide de mode2
et créer le fichier vous-même.
mode2
imprime séquentiellement la durée de la présence et de l'absence d'un signal, à partir duquel les données transmises sont composées. La durée est mesurée en microsecondes (1e-6 secondes). Dans le format brut, les mêmes durées sont indiquées dans lircd.conf, en commençant par 'pulse' (le premier 'espace' n'est pas nécessaire). Par conséquent, il devrait toujours y avoir un nombre impair de nombres (il commence et se termine par la présence d'un signal - «impulsion»).
Pour l'automatisation, j'ai fait un script d'enregistrement qui demande le nom de la commande, exécute mode2
pendant 5 secondes, se souvient et finalement imprime le résultat au format prêt pour lircd.conf (voir sous le spoiler).
irrecord --analyse
fichier, vous pouvez essayer de le "reconnaître" à nouveau en utilisant irrecord --analyse
. Ce n'est pas toujours réussi, ne vous précipitez pas pour jeter l'ancien fichier. Mes statistiques sont les suivantes: la télécommande du téléviseur LG était facile à comprendre, tous les climatiseurs et un aspirateur nécessitaient une création manuelle, l'aspirateur a ensuite été traité par --analyse
.
À titre d'exemple: voici à quoi ressemble le fichier pour mon aspirateur .
Noms d'équipe standard
Aux fins prévues, le LIRC doit transformer le signal IR reçu et reconnu en un événement d' entrée Linux . Par conséquent, par défaut, nous devons avoir les noms de commande dans lircd.conf de la liste standard. Vous pouvez voir une liste de noms valides:
irrecord --list-namespace
Les climatiseurs ne relèvent pas de ce modèle. L'exigence de nom peut être désactivée en ajoutant un paramètre lors de l'écriture:
irrecord --disable-namespace ....
Débogage
Vérifiez que le récepteur aide l'utilitaire mode2
, qui imprime tous les signaux visibles.
/etc/init.d/lircd stop mode2 -d /dev/lirc0
Il est plus facile de vérifier la transmission s'il y a un autre récepteur et mode2
fonctionnement. Dans des cas particulièrement désespérés, vous pouvez modifier la valeur à la sortie du GPIO et vérifier avec un testeur ou un oscilloscope où va le signal. L'équipe gpio
fait partie du package de wirepi .
while sleep 1; do gpio -g toggle 17 done
Vous pouvez consulter les journaux à l'aide de journalctl
, en particulier, cela vous permet de voir les erreurs dans le fichier de configuration:
journalctl -b 0 /usr/sbin/lircd
Envoi de commandes
Il existe un utilitaire d' irsend
pour transmettre les commandes enregistrées. Elle peut également afficher une liste des appareils connus et une liste des commandes connues pour chaque appareil. Faites attention aux "arguments vides" dans l'exemple ci-dessous, ils y sont nécessaires.
irsend
est un client pour lircd
, donc si quelque chose ne va pas, regardez dans les journaux (voir ci-dessus).
Théoriquement, il existe une autre possibilité: envoyer des commandes à lircd via son socket. Je n'ai pas compris.
Appel de Python
Presque toutes les bibliothèques ne sont qu'un kit sur irsend
. La seule bibliothèque que j'ai trouvée qui compile le client pour l'API via le socket ne fonctionne pas sur Raspberry (une autre version de lircd est nécessaire). Par conséquent, il y a peu de sens en eux; je peux appeler la commande moi-même:
import subprocess subprocess.call(["irsend", "send_once", "BEDROOM_AC", "OFF"])
Matériel informatique

J'utilise une planche prête à l'emploi, il y en a beaucoup sur Amazon et AliExpress . Vous pouvez le google comme "Sheild infrarouge framboise." Il utilise GPIO 17 pour la sortie et GPIO 18 pour l'entrée, comme on peut le voir dans les configurations ci-dessus.
Il y a une place sur la carte pour la deuxième LED (supplémentaire) D2, qui n'est pas installée par défaut. Lorsque vous utilisez deux LED, elles sont connectées en série . Par conséquent, en l'absence de LED D2, vous devez fermer le cavalier SJ1. J'ai été surpris de constater que sur toutes mes planches, le cavalier était initialement ouvert. J'ai dû modifier le fer à souder.
Photo plus grande pour ceux qui souhaitent y jeter un œil Résumé
Cela fonctionne: le signal est transmis, les appareils le voient et y réagissent correctement.
Cela dépend beaucoup de la position de l'émetteur de diode, il doit être orienté avec précision vers le récepteur. Un émetteur fixe ne peut pas contrôler tous les appareils de la pièce. Le clonage d'une solution basée sur Raspberry Pi pour chaque gadget coûte cher, vous devez soit modifier l'émetteur pour "couvrir une zone plus grande", soit trouver une plateforme moins chère.
LIRC a été créé à l'origine pour convertir les signaux IR en événements Linux standard des périphériques d'entrée. Par conséquent, il est naturel pour lui qu'un bouton soit un code. Ce n'est pas le cas pour certains appareils (la plupart des climatiseurs): lorsque vous cliquez sur n'importe quel bouton, la télécommande transmet un paquet de données contenant l'état complet de l'appareil (allumé, mode de fonctionnement, température, modes de fonctionnement du ventilateur, heure, minuterie, etc.). Il n'y a aucun moyen de construire un package multi-composants basé sur plusieurs paramètres dans LIRC, donc, cela aide comme un outil rapide hors de la boîte, mais alors vous devrez chercher autre chose. Bien que dans la plupart des cas, les données enregistrées avec les paramètres de ventilateur habituels et sans modes exotiques suffisent largement.