Steuerung mit Infrarot

  • Hi Kai,

    echt top !! Du bist schon ein Genie und hast hier einen riesigen Berg Arbeit bewältigt und für uns schön präsentiert.

    Vielen Dank !

  • Hallo an alle im Forum und hallo Doxa,


    gestern ist meine Lieferung von Reichelt angekommen, sodass ich mich heute mal mit dem Empfang von Infrarot Daten beschäftigen konnte.


    Ich habe meine Versuche mit dem TSOP31238 (also 38kHz) Chip gemacht (Datenblatt). Ein Bauteil für 56 Eurocent. Der Anschluss ist ganz einfach. Es gibt drei PINS: Vs, GND und Data. Die Arbeitsspannung kann sich im Bereich von 2,5V bis 5,5V bewegen. Der Empfänger ist also sowohl für ESP32/ESP8266 (3,3V) als auch für Arduino (5V) geeignet.


    Zum Ausprobieren habe ich den Sketch IRrecvDumpV2 benutzt, welcher bei den Beispielen der Bibliothek IRremote von Rafi Khan zu finden ist. Für den Datenempfang, ist in dem vorgenannten Sketch der PIN 11 definiert. Also muss nur der PIN 11 des Mikrocontrollers mit dem Datenpin des IR-Receivers verbunden werden.


    Ich habe meine Versuche mit einer Sony, sowie einer Panasonic Fernbedienung gemacht. Die Signale der Sony Fernbedienung wurden einwandfrei und reproduzierbar empfangen. Auf der seriellen Konsole wurden keine wechselnden Codes beim mehrmaligen Drücken der gleichen Taste angezeigt, es waren immer die gleichen. So wie es sein soll.

    Lediglich wenn man eine Taste länger gedrückt gehalten hat, wurde erst der Sony Code (20 Bits) angezeigt und anschließend immer ein Sanyo - Code 0xFFFFFFFF (0Bits). Das halte ich jetzt nicht für problematisch, weil sich das programmiertechnisch leicht abfangen lässt.


    Probleme gab es mit der Panasonic Fernbedienung. Diese wurde in den weitaus meisten Fällen nicht erkannt, also als UNKNOWN angezeigt, mit einem 32 Bit Code. Dieser war jedoch auch (fast) konstant der gleiche, wenn man ein und dieselbe Taste wiederholt gedrückt hat. In seltenen Fällen, wurde die Fernbedienung aber doch als Panasonic Fernbedienung erkannt und ein 48Bit Wert ausgegeben (16 Bit Adresse / 32 Bit Daten).


    Um der Sache auf den Grund zu gehen, habe ich mir die IRremote.h Datei angeschaut. Es gibt dort in Zeile 127 einen Eintrag #define DEBUG  0.

    Diesen Wert habe ich auf 1 gesetzt und den Sketch neu compiliert. Dabei wurde dann folgendes bei einem Tastendruck auf die Fernbedienung angezeigt:


    IR-Panasonic2.png


    Hier kann man sich anschauen, welche Signale vom Mikrocontroller empfangen und welche von der Software erwartet werden. Erscheint bei dieser Ausgabe zu oft die Angabe "FAILED", so wird die Fernbedienung nicht erkannt. Das war bei meiner Panasonic Fernbedienung der Fall.


    Also muss die Software auf die tatsächlich von der Fernbedienung gesendeten Impulse angepasst werden. Die Standardausgabe des IRrecvDumpV2 Sketches (also ohne Debug) zeigt die Signale an, wie sie empfangen wurden. Im folgenden Screenshot sieht man die Ausgabe des Sketches ohne Debugging. Dort werden die Impulsintervalle in Mikrosekunden angezeigt.


    IR-Panasonic.png


    Die Werte welche ein (+) als Vorzeichen haben zeigen an, wie lange die Spannung auf 0V gezogen wird, die Werte mit negativem Vorzeichen entsprechen einer Zeitspanne in der das Signal 5V hat. Auf dem Oszilloskop sieht das dann so aus:


    DS1Z_QuickPrint8.png


    Wird keine Taste gedrückt, ist der Pegel permanent auf ca. 5V am Datenpin des Mikrocontrollers. Wird auf der Fernbedienung eine Taste gedrückt, werden die Impulse erzeugt.


    Hier sieht man ein +450µs Abschnitt:


    DS1Z_QuickPrint10.png


    Hier sieht man einen -1250µs Abschnitt:


    DS1Z_QuickPrint9.png



    Warum erzähle ich das alles? Wenn man weiß welche Fernbedienung bzw. welches Protokoll eigentlich erkannt werden soll, so kann man in der passenden C++ Datei der Library bestimmte Werte mit Hilfe der Dumpausgaben so anpassen, dass die Fernbedienung richtig erkannt wird.

    In meinem Beispiel ist es die ir_panasonic.cpp Datei. Dort findet man folgende Einträge:


    #define PANASONIC_BITS          48

    #define PANASONIC_HDR_MARK    3502

    #define PANASONIC_HDR_SPACE   1750

    #define PANASONIC_BIT_MARK     502

    #define PANASONIC_ONE_SPACE   1244

    #define PANASONIC_ZERO_SPACE   400


    Wenn man diese nun mit den Werten der Dumpausgabe vergleicht, kann man durch etwas herumprobieren die Definitionen anpassen. Ein Oszilloskop ist dazu nicht erforderlich. Die angezeigten Zahlenwerte reichen aus, um die Muster zu erkennen. Im Falle der Panasonic Fernbedienung gibt es wohl ein Startbit (Kombination aus PANASONIC_HDR_MARK und PANASONIC_HDR_Space), Datenbits (Kombination aus PANASONIC_BIT_MARK und den beiden Werten PANASONIC_ONE_SPACE bzw. PANASONIC_ZERO_SPACE) und ein Stopbit, welches scheinbar einem PANASONIC_ONE_SPACE Impuls entspricht.


    In meinem Fall habe ich die Werte wie folgt abgeändert:


    #define PANASONIC_BITS          48

    #define PANASONIC_HDR_MARK    3450 //(+)

    #define PANASONIC_HDR_SPACE   1750 //(-)

    #define PANASONIC_BIT_MARK     400 //(-)

    #define PANASONIC_ONE_SPACE    450 //(+)

    #define PANASONIC_ZERO_SPACE  1300 //(-)



    Nachdem ich diese Änderungen vorgenommen habe, wurde auch die Panasonic Fernbedienung zuverlässig erkannt und die Tastaturcodes reproduzierbar identisch angezeigt. In der Datei IRremoteInt.h ist in der Zeile 93 noch folgender Eintrag zu finden:


    #define TOLERANCE       25


    Die Konstante TOLERANCE besagt, dass die beschriebenen Werte um 25% nach oben wie unten abweichen dürfen, um noch als gültig akzeptiert zu werden. Also auch hier ist noch ein Stellparameter zum Decoden der Infrarotsignale. Das scheint aber nicht so ganz genau zu sein, denn das Decoding der Software arbeitet nur mit 50µs Schritten, wie man an der Datenausgabe erkennen kann.


    Es gibt da noch ein paar Sachen die mir noch nicht klar sind. Vor allem wundert es mich, dass ich die Werte PANASONIC_ONE_SPACE und PANASONIC_ZERO_SPACE für eine zuverlässige Erkennung quasi vertauschen musste und dadurch im Prinzip das Signal invertiere (0 wird 1 und umgekehrt). Wenn man die Fernbedienung nutzt um ein eigenes Gerät zu steuern mag das egal sein, solange die Signale immer zu gleichen Codes pro Taste führen. Soll mit den empfangenen Codes ein Herstellergerät gesteuert werden, muss jedoch herausgefunden werden, ob die "Interpretation" der Impulse wirklich stimmt.


    Das soll es aber erst einmal gewesen sein. Das war jetzt keine Protokollanalyse. So weit bin ich noch nicht eingestiegen. Ich habe nur die Wiederholbarkeit der angezeigten Werte überprüft. Und das scheint geklappt zu haben ;).


    Gruß Kai

  • Naja, das Thema interessiert mich auch. Ich habe mir bei Reichelt mal drei IR Receiver Typen (TSOP31236 bis TSOP31240) und zwei IR Dioden geordert. Ich werde mich dann auch mal etwas intensiver mit IR befassen. Ich hätte da nämlich eine Idee für eine Art IR-Proxy... dass man eine Fernbedienung quasi „um die Ecke“ nutzen kann.


    Wir könne da ja im Austausch bleiben...


    Gruß Kai

  • Vielen Dank Kai,


    du hast mir sehr geholfen. Auf der Basis der neuen Erkenntnisse werde ich weiter probieren, bzw, wenn sich zeigen sollte, dass doch immer wieder Fehlimpulse kommen, mich anderen Steuermethoden widmen.


    LG Doxa

  • Hallo Doxa,


    ich habe mal bei Reichelt nach IR- Receivern geschaut, dabei habe ich mir ein Datenblatt von einem TSOP 4838 Empfänger herunter geladen, welches ich recht aufschlussreich finde. Dort kann man nämlich folgendes lernen:

    Der IR Sende-/Empfangsbereich von den gängigsten Fernbedienungen geht von 36 bis 56 kHz.

    So ist z.b. für rc5, rc6 und Panasonic ein Receiver im 36kHz Bereich empfohlen. Für NEC, Sharp und R-Step ist ein 38kHz Receiver empfohlen. Dann noch einmal r-step und Thomson RCA mit 56kHz. Für SIRCS 15 sowie Sony 12 Bit wird wieder ein anderer Receiver (40kHz) empfohlen.


    So wie ich das erkennen kann, sind diese Sensoren aus den Arduino Sensor Kits, was man so als Breakout für „Maker“ bekommt hauptsächlich 38kHz Receiver. Von daher kann ich mir schon vorstellen, dass die nicht mit allen Fernbedienungen einwandfrei funktionieren und bei manchen nur Datenbrei beim Mikrocontroller ankommt.


    Das sind jetzt aber meine Schlüsse. Ich bin kein Fachmann. Mich hat die Thematik aber interessiert und deshalb habe ich mir das angeschaut.


    Gruß Kai

  • Hallo Doxa,


    nein ich habe das bei mir noch nicht ausprobiert. Ich habe keinen IR Receiver für Mikrocomtroller. Ich weiß nur, dass es unterschiedliche IR Protokolle, je nach Hersteller, gibt.


    Wenn nun das Protokoll nicht erkannt wird (UNKNOWN), wird das wohl auch die Ursache für die wechselnden Codes beim Drücken der gleichen Taste sein.


    Wenn Du jetzt wüsstest, nach welchem Protokoll dein Sender funktioniert, könntest Du das evtl. fest einstellen. Dazu musst du in der IRremote.h Datei bei allen Protokollen, bis auf das eine gewünschte, bei den #defines eine 0 statt einer 1 setzen.


    Bei den Fernbedienungen bei denen der Typ erkannt wird, sollte eigentlich ein konsistentes Verhalten zu beobachten sein. Oder nicht?



    Ich habe hier ein Video gefunden, welches das Ganze auch etwas beschreibt. Demnach scheint es nicht ganz ungewöhnlich zu sein, dass es auch mal Empfangsfehler gibt. Video.


    Gruß Kai

  • Je nach Typ der IR-Sender gibt es eine entsprechende Anzeige (NEC,JVC,..), meistens aber UNKNOWN. Was ich aber nicht nachvollziehen kann ist, dass z.B mein Fernseher-IR-Sender eine exakte Steuerung des Fernsehers zulässt, er da offenbar eindeutige Signale sendet, beim Arduino aber nicht. Bei häufigen Versuchen, d.h. mehrfachem Drücken einer Taste kommt auch mal eine Serie gleicher Codes beim Serial Monitor an, die dann aber wieder von "wilden" Zahlen abgelöst wird.


    Hast du das mal ausprobiert und ist es bei dir anders?


    LG Eberhard

  • Bekommst Du denn beim Ausführen des Sketches IR-Rcv-Demo2 irgend einen Decode Typen (z.B. RC5 oder Sony o.ä.) angezeigt oder wird UNKNOWN auf der seriellen Konsole ausgegeben?


    Gruß Kai

  • Hallo KaiR,


    vielen Dank für deine schnelle Reaktion.

    Den Code ermittle ich über die beigefügten Sketche und da mit dem den SerialMonitor.

    Mit verschiedenen IR-Sendern ist das Ergebnis immer dasselbe: verschiedene Codes werden geliefert, die sich bei häufigem drücken derselben Taste auch mal wiederholen, aber eben nicht immer.

  • Wie ermittelst Du denn den Code? Manche IR- Protokolle arbeiten mit einem Toggle Bit um einen langen Tastendruck von einem mehrfachen Tastendruck unterscheiden zu können. Dadurch würde sich bei falschem decodieren auch der Code ändern.

    Was für eine Library benutzt du (iremote)?


    Gruß Kai

  • Beim Versuch meinen Fernseh-IR-Sender für die Steuerung eines kleinen (Roboter-) Autos mit Arduino einzusetzen, stelle ich fest, dass der Sender bei mehrmaligem Drücken derselben Taste verschiedene Zahlen liefert. So kann keine Auswertung funktionieren. Mich wundert, dass die Bedienung des Fernsehers mit dem IR-Sender aber ganz exakt funktioniert. Bei anderen IR-Sender ist derselbe Effekt (keine eindeutige Zahl) feststellbar.

    Kann mir da jemand weiterhelfen?

    Im Voraus vielen Dank.