IR-Schnittstelle, Himbeere und LIRC

Meine Aufgabe ist es nun zu lernen, wie man Befehle an Klimaanlagen und andere Geräte im Haus sendet. Anfangs haben diese Geräte nur eine IR-Fernbedienung. Um dieses Problem zu lösen, habe ich einen Raspberry Pi und einen IR Transceiver Shield. Im Artikel finden Sie Konfigurationen, Teams, Tipps und eine kleine Theorie. Von der Software werden LIRC (Linux Infrared Remote Control) und Python sein.


Ich habe LIRC mit Hilfe von Google gefunden. Während des Forschungsprozesses fand ich heraus, dass LIRC sowohl mit Sendern als auch mit Empfängern von IR-Signalen zusammenarbeitet, das empfangene Signal decodieren und in diesem Zusammenhang einige Aktionen ausführen kann. Jetzt brauche ich keinen Signalempfang, aber in Zukunft kann es nützlich sein. Wenn Sie selbst mit LIRC herumspielen, wird dringend empfohlen, das LIRC-Konfigurationshandbuch zu lesen.


Konfiguration


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 

Aufzeichnen


Zuerst müssen Sie eine Konfigurationsdatei mit Datensequenzen für alle erforderlichen Befehle erstellen. Ich rufe diese Datei weiterhin lircd.conf , aber auf jedem Gerät selbst wird eine eigene Datei my_device_name.lircd.conf im Verzeichnis /etc/lirc/lircd.conf.d .


Das Dateiformat wird hier beschrieben. Wenn Sie eine Fernbedienung haben, können Sie die von ihr übertragenen Signale mit dem Dienstprogramm irrecord in eine Datei schreiben .


 /etc/init.d/lircd stop irrecord -d /dev/lirc0 ~/my_device.lircd.conf mv ~/my_device.lircd.conf /etc/lirc/lircd.conf.d/ 

irrecord analysiert die Sequenzen und versucht, die Protokoll- und Zeitparameter zu bestimmen. In einigen Fällen schlägt irrecord in der Analyse fehl, sodass es möglich ist, die Sequenz so zu speichern, wie sie in einer Rohform akzeptiert wurde. --force gibt es einen --force Schalter.


Aber selbst mit --force irrecord versucht es, etwas zu analysieren, und kann auch fehlschlagen. Anschließend können Sie die Sequenzen mit mode2 aufzeichnen und die Datei selbst erstellen.


mode2 nacheinander die Dauer des Vorhandenseins und Nichtvorhandenseins eines Signals aus, aus dem die übertragenen Daten bestehen. Die Dauer wird in Mikrosekunden (1e-6 Sekunden) gemessen. Im Rohformat werden in lircd.conf die gleichen Dauern angegeben, beginnend mit 'puls' (das führende 'Leerzeichen' wird nicht benötigt). Dementsprechend sollte es immer eine ungerade Anzahl von Zahlen geben (sie beginnt und endet mit dem Vorhandensein eines Signals - "Impuls").


Zur Automatisierung habe ich ein Skript für die Aufzeichnung erstellt, das nach dem Namen des Befehls fragt, mode2 5 Sekunden lang ausführt, das Ergebnis speichert und schließlich in dem für lircd.conf bereitgestellten Format druckt (siehe unter dem Spoiler).


Skript
 #!/usr/bin/env python3 import io import sys import os r = """begin remote name DEVICE_NAME_CHANGE_ME flags RAW_CODES eps 30 aeps 100 gap 19037 begin raw_codes """ while True: print() print("enter the command name, or just press Enter to finish") a = sys.stdin.readline().rstrip("\n\r") if not a: break first_space = True n = 0 r += " name " + a + "\n" for line in os.popen('timeout 5s mode2 -d /dev/lirc0 2> /dev/null').read().split('\n'): words = line.split() if len(words) < 2: continue if words[0] != 'space' and words[0] != 'pulse': continue if first_space and words[0] == 'space': first_space = False continue if n % 4 == 0: r += "\n " r += words[1] + " " n = n+1 if n > 5: print ("got", n, "values, looks good") else: print ("no signal, something went wrong") r += "\n\n" r += """ end raw_codes end remote """ print() print(r) print() 

irrecord --analyse Datei erstellt haben, können Sie versuchen, sie mit irrecord --analyse erneut zu "erkennen". Dies ist nicht immer erfolgreich, beeilen Sie sich nicht, die alte Datei wegzuwerfen. Meine Statistiken lauten wie folgt: Die Fernbedienung des LG-Fernsehers war leicht zu verstehen, alle Klimaanlagen und ein Staubsauger mussten manuell erstellt werden, der Staubsauger wurde dann von --analyse verarbeitet.


Nur als Beispiel: So sieht die Datei für meinen Staubsauger aus .


Standard-Teamnamen


Für den beabsichtigten Zweck sollte der LIRC das empfangene und erkannte IR-Signal in ein Linux-Eingabeereignis umwandeln. Daher müssen wir standardmäßig die Befehlsnamen in lircd.conf aus der Standardliste haben. Sie können eine Liste gültiger Namen sehen:


 irrecord --list-namespace 

Klimaanlagen fallen nicht unter dieses Muster. Die Namensanforderung kann durch Hinzufügen eines Parameters beim Schreiben deaktiviert werden:


 irrecord --disable-namespace .... 

Debuggen


Überprüfen Sie, mode2 Hilfsprogramm mode2 des Empfängers alle sichtbaren Signale druckt.


 /etc/init.d/lircd stop mode2 -d /dev/lirc0 

Es ist am einfachsten, die Übertragung zu überprüfen, wenn ein anderer Empfänger und mode2 ausgeführt werden. In besonders hoffnungslosen Fällen können Sie den Wert am Ausgang des GPIO ändern und mit einem Tester oder Oszilloskop prüfen, wohin das Signal geht. Das gpio Team ist Teil des Wiringpi- Pakets.


 while sleep 1; do gpio -g toggle 17 done 

Sie können die Protokolle mit journalctl , insbesondere können Sie Fehler in der Konfigurationsdatei sehen:


 journalctl -b 0 /usr/sbin/lircd 

Befehle senden


Es gibt ein irsend Dienstprogramm zum Übertragen aufgezeichneter Befehle. Sie kann auch eine Liste bekannter Geräte und eine Liste bekannter Befehle für jedes Gerät anzeigen. Beachten Sie die "leeren Argumente" im folgenden Beispiel, sie werden dort benötigt.


irsend ist ein Client für lircd . Wenn also etwas schief gelaufen ist, schauen Sie in die Protokolle (siehe oben).


 #   irsend LIST "" "" #     LG_TV irsend LIST LG_TV "" #   ON irsend SEND_ONCE LG_TV ON 

Theoretisch gibt es eine andere Möglichkeit: Senden Sie Befehle über den Socket an lircd . Ich habe es nicht verstanden


Anruf von Python


Fast alle Bibliotheken sind nur ein Kit über irsend . Die einzige Bibliothek, die ich gefunden habe und die den Client für die API über den Socket kompiliert, funktioniert nicht mit Raspberry (eine andere Version von lircd wird benötigt). Daher haben sie wenig Sinn, ich kann den Befehl selbst nennen:


 import subprocess subprocess.call(["irsend", "send_once", "BEDROOM_AC", "OFF"]) 

Hardware


IR Hut

Ich benutze ein fertiges Board, es gibt viele davon bei Amazon und AliExpress . Sie können es wie "Raspberry Infrarot Sheild" googeln. Es verwendet GPIO 17 für die Ausgabe und GPIO 18 für die Eingabe, wie aus den obigen Konfigurationen ersichtlich ist.


Auf der Platine befindet sich ein Platz für die zweite (zusätzliche) LED D2, die standardmäßig nicht installiert ist. Bei Verwendung von zwei LEDs sind diese in Reihe geschaltet. Wenn keine LED D2 vorhanden ist, müssen Sie daher den Jumper SJ1 schließen. Ich war überrascht, dass auf allen meinen Boards der Jumper anfangs offen war. Ich musste den Lötkolben modifizieren.


Größeres Foto für diejenigen, die einen Blick darauf werfen möchten

IRDA-Hut


Zusammenfassung


Es funktioniert: Das Signal wird übertragen, die Geräte sehen es und reagieren korrekt darauf.


Viel hängt von der Position des Diodenemitters ab, er muss genau auf den Empfänger gerichtet sein. Ein fester Sender kann nicht alle Geräte im Raum steuern. Das Klonen einer Raspberry Pi-basierten Lösung für jedes Gadget ist teuer. Sie müssen entweder den Emitter so ändern, dass er "einen größeren Bereich abdeckt", oder eine billigere Plattform finden.


LIRC wurde ursprünglich entwickelt, um IR-Signale in Standard-Linux-Ereignisse von Eingabegeräten umzuwandeln. Daher ist es für ihn selbstverständlich, dass eine Schaltfläche ein Code ist. Bei einigen Geräten (den meisten Klimaanlagen) ist dies nicht der Fall: Wenn Sie auf eine Schaltfläche klicken, sendet die Fernbedienung ein Datenpaket mit dem vollständigen Status des Geräts (Ein, Betriebsmodus, Temperatur, Lüfterbetriebsmodus, Zeit, Timer usw.). Es gibt keine Möglichkeit, ein Mehrkomponentenpaket basierend auf mehreren Parametern in LIRC zu erstellen. Daher ist es ein sofort einsatzbereites Tool, aber dann müssen Sie nach etwas anderem suchen. Obwohl in den meisten Fällen die aufgezeichneten Daten mit den üblichen Lüftereinstellungen und ohne exotische Modi völlig ausreichen.

Source: https://habr.com/ru/post/de461195/


All Articles