Geräte, die mit einer Infrarot-Fernbedienung gesteuert werden, sind eng in unser Leben integriert. Manchmal geht die Fernbedienung des Fernsehgeräts oder eines alten Audiosystems verloren, und es ist bereits unmöglich, eine neue Fernbedienung zu kaufen. Es ist nicht immer möglich, eine neue Fernbedienung zu bestellen oder einen Klon zu erstellen. Wenn Sie jedoch einen Spender oder Informationen dazu haben, können Sie einen Konverter erstellen. Ein solcher Transcoder empfängt Befehle von einer Konsole und übersetzt sie in ein anderes Format.Für Arduino gibt es eine wunderbare IRemote- Bibliothek, die das Erstellen einer Vielzahl von IR-Steuerungssystemen sehr einfach macht. Aber selbst wenn Sie eine so einfache Aufgabe wie einen Transcoder lösen, gibt es immer Probleme, deren Lösung interessant ist.Für den Anfang benötigen wir also einen integrierten IR-Empfänger wie TSOP312 oder die entsprechende Abschirmung für Arduino. Vergessen Sie nicht, dass es viele IR-Empfänger gibt und deren Pinbelegung zufällig variiert. Zum Beispiel habe ich ein bestimmtes namenloses Element verwendet, das mit dem TSOP382 übereinstimmt, jedoch in einem reduzierten Fall und ohne Teilungsschlüssel.
Wir benötigen die zusammengebaute Schaltung, um Befehlscodes von beiden Konsolen zu empfangen. Leider ist das Entfernen von Befehlen von einem Gerät, für das die Konsole verloren gegangen ist, etwas komplizierter. Sie können immer noch die Spenderfernbedienung finden, mit der Universalfernbedienung einen Code auswählen (warum benötigen Sie dann einen Transcoder, da die Fernbedienung hochgefahren ist?) Oder versuchen Sie, Daten aus Internetdatenbanken mit IR-Codes zu verwenden. Für mich war es am einfachsten, eine Anwendung für Android zu verwenden, die die benötigte Fernbedienung emuliert.Zum Lesen der Daten verwenden wir das IRrecvDumpV2-Beispiel aus der IRremote-Lieferung. Wenn Ihre Fernbedienung zu einer erkennbaren Bibliothek gehört, benötigen Sie kein Roh-Scan-Ergebnis, obwohl beispielsweise die LG-Fernbedienung fälschlicherweise als Samsung erkannt wurde und nicht funktionierte, als ich versuchte, Befehle über sendLG zu senden.Ein Beispiel für die unter dem Spoiler erhaltenen Daten:Encoding: SAMSUNG
Code: 34346897 (32 bits)
Timing[67]:
+4450, -4350 + 600, — 500 + 600, — 500 + 600, -1600
+ 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500
+ 600, — 500 + 600, — 500 + 600, — 500 + 600, -1600
+ 600, -1600 + 600, — 500 + 600, -1600 + 600, — 500
+ 600, — 500 + 600, — 500 + 600, -1600 + 600, -1600
+ 600, — 500 + 600, -1600 + 600, — 500 + 600, — 500
+ 600, — 500 + 550, -1650 + 550, — 550 + 550, — 550
+ 550, -1650 + 550, — 550 + 550, -1650 + 550, -1600
+ 600, -1600 + 600
unsigned int rawData[67] = {4450,4350, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 600,1600, 600,1600, 600,500, 600,1600, 600,500, 600,500, 600,500, 550,1650, 550,550, 550,550, 550,1650, 550,550, 550,1650, 550,1600, 600,1600, 600}; // SAMSUNG 34346897
unsigned int data = 0x34346897;
Wenn auf dem Capture die Meldung „IR-Code zu lang. Bearbeiten Sie IRremoteInt.h und erhöhen Sie RAWLEN. “Die Bibliothek muss ein wenig repariert werden, wodurch der Puffer für Befehle vergrößert wird. Für die Konsole, die Sie steuern möchten, reicht es aus, den 32-Bit-Befehlscode zu kennen. Beachten Sie, dass sich bei einigen Fernbedienungen der Code der gedrückten Taste im gedrückten und freigegebenen Modus von derselben Taste unterscheidet. Diese Schaltflächen erfordern zwei Werte. Wir reduzieren die empfangenen Codes auf eine für Sie geeignete Tabelle. In derselben Tabelle speichern wir die Codes für die Spenderfernbedienung in Rohform.Wir verbinden eine Infrarot-LED mit dem Arduino und schreiben ein einfaches Programm, das ein Infrarotsignal mit einem bestimmten Code empfängt und einen weiteren Code über die LED sendet. Der Widerstand 82 wird für das, was verfügbar ist, ausgewählt. Für ein eingebettetes Gerät können Sie es sicher auf 200 Ohm erhöhen. Wenn der Sender eine große Reichweite haben soll, müssen Sie ihn durch eine einfache Transistorkaskade ergänzen, da sonst der Strom von Arduino nicht ausreicht.
Wenn Befehlscodes von beiden Fernbedienungen vorhanden sind, hat der Transcodercode die folgende Formvoid loop() {
if (irrecv.decode(&results)) {
switch(results.value){
case(0x845E5420):{
irsend.sendRaw(irSignal, sizeof(irSignal) / sizeof(irSignal[0]), khz);
}break;
}
}
irrecv.resume();
irrecv.enableIRIn();
}
Führen Sie die Skizze aus und füllen Sie sie in Arduino aus. Seltsamerweise vergeht nach dem Start ein Befehl, nach dem alle nachfolgenden Geräte ignoriert werden. Um das Debuggen nicht zu beeinträchtigen, fügen wir dem Zyklus am 13. Pin ein Blinklicht hinzu und stellen fest, dass die Karte nach dem ersten Versuch, einen Befehl zu senden, einfriert. Nun, es bedeutet, dass bei der gleichzeitigen Verwendung des Sendens und Empfangens eines IR-Signals in einem Projekt nicht alles so reibungslos ist. Nachdem die verwendeten Timer ein wenig durchsucht wurden, stellt sich heraus, dass der Code nach dem Start des Sendens warten muss, bis das Senden endet, da sowohl das Senden als auch das Empfangen einen gemeinsamen Timer verwenden. Sie können empirisch eine Verzögerung von einer halben Sekunde hinzufügen (Verzögerung (500)) und alles wird funktionieren. Wenn Sie jedoch wissen, dass die Rohdaten in unserem Land Zeitmuster in Millisekunden sind, können Sie einfach eine Sendefunktion mit einer Verzögerung hinzufügen. Es gibt sogar eine geeignete custom_delay_usec-Funktion im Irsend-Modul.was ich anfangs falsch verwendet habe und vergessen habe, die Verzögerung mit einem Faktor von USECPERTICK aus der Bibliothek (50 ms) zu multiplizieren.void sendDelayed(unsigned int array[]){
irsend.sendRaw(array, sizeof(array) / sizeof(array[0]), khz);
int array_size = sizeof(array) / sizeof(array[0]);
for(int i=0;i<array_size;i++){
irsend.custom_delay_usec(array[i]*USECPERTICK);
}
}
Ein solcher Code funktioniert einwandfrei. Beim Umschalten reicht es aus, die erforderliche Anzahl von Groß- und Kleinschreibung für Schaltflächen einzugeben, und alles funktioniert. Aber es war nicht da. RawData-Codes werden als int-Array geschrieben, und wir haben eine Plattform auf einem Mikrocontroller. Der Speicher für die Variablen wird bereits von fünf Befehlen mit einer Länge von 100 Elementen belegt. Auf der Fernbedienung befinden sich jedoch 25 Tasten.Es ist kein Problem, wenn Sie die Rohdarstellung von Daten nicht verwenden. Hierzu kann die Bibliothek Befehle an bekannte Protokolle senden, z. B. für Sony-kompatible Fernbedienungen ist es sendSony. Die Bibliothek hat bereits Fernbedienungen bekannter Hersteller implementiert, aber ich konnte nicht sofort mit meiner Fernbedienung umgehen. Aus diesem Grund gehen wir zu primitiveren Methoden über, um Speicherplatz zu sparen, der denjenigen hilft, die über nicht standardmäßige Fernbedienungen verfügen.Das erste, was mir in den Sinn kommt, ist, rawData nicht in Form von int festzulegen, sondern auf Byte umzuschalten. Alle Werte in diesem Array sind das Ergebnis des Lesens des IR-Signals mit einem Timer mit einer Periode von 50 Millisekunden. Da diese Daten ein Vielfaches von 50 sind, verliert das Teilen durch 50 nichts. Die Obergrenze ist auf 50 * 255 = 12750 begrenzt, und dies sind 12 Sekunden, was sogar ausreicht, um einen gemächlichen Morsecode zu dekodieren - falls dies erforderlich ist.Der Bibliothek wurde eine Methode hinzugefügt, die Bytes für die Eingabe akzeptiert, wodurch der Speicherverbrauch halbiert wurdeIRsend::sendRaw (byte buf[], unsigned int len, unsigned int hz)
Nur Arduino verfügt nur über zwei Kilobyte Speicher für Variablen, was maximal 40 Befehlen mit jeweils 50 Byte entspricht. Wir brauchen mehr Speicher. Und wir werden diesen Speicher aus dem Befehlssegment extrahieren. Es reicht aus, ein Array mit ausreichender Größe zu reservieren und zu füllen, bevor eine Reihe von Aufgaben gesendet wird. Insgesamt werden aus dem Codesegment ungefähr 100 Bytes für einen Befehl ausgegeben, aber wir haben mindestens zehn Kilobyte Code-Speicherplatz. Für die durchschnittliche Fernbedienung mit hundert Tasten haben wir also schon genug.Um die Zuweisungen nicht mit Ihren Händen zu füllen, wurde der Bibliothek ein Beispiel IRrecvDumpRawByte hinzugefügt, das Rohdaten nicht nur in Form von Bytes, sondern auch in Form eines Zuweisungsblocks anzeigtBeispiel unter dem SpoilerrawData[0]=87;rawData[1]=87;rawData[2]=10;rawData[3]=9;rawData[4]=10;rawData[5]=9;rawData[6]=10;rawData[7]=10;rawData[8]=10;rawData[9]=9;rawData[10]=10;rawData[11]=9;rawData[12]=10;rawData[13]=29;rawData[14]=10;rawData[15]=9;rawData[16]=10;rawData[17]=9;rawData[18]=10;rawData[19]=10;rawData[20]=10;rawData[21]=9;rawData[22]=10;rawData[23]=9;rawData[24]=10;rawData[25]=10;rawData[26]=10;rawData[27]=9;rawData[28]=10;rawData[29]=9;rawData[30]=10;rawData[31]=10;rawData[32]=10;rawData[33]=9;rawData[34]=10;rawData[35]=86;rawData[36]=10;rawData[37]=9;rawData[38]=11;rawData[39]=9;rawData[40]=10;rawData[41]=9;rawData[42]=10;rawData[43]=9;rawData[44]=10;rawData[45]=28;rawData[46]=10;rawData[47]=29;rawData[48]=10;rawData[49]=28;rawData[50]=10;rawData[51]=9;rawData[52]=10;rawData[53]=28;rawData[54]=10;rawData[55]=10;rawData[56]=10;rawData[57]=9;rawData[58]=10;rawData[59]=28;rawData[60]=10;rawData[61]=10;rawData[62]=10;rawData[63]=9;rawData[64]=10;rawData[65]=9;rawData[66]=10;rawData[67]=28;rawData[68]=10;rawData[69]=9;rawData[70]=11;rawData[71]=27;rawData[72]=10;rawData[73]=29;rawData[74]=10;rawData[75]=9;rawData[76]=10;
Ein Beispiel für eine bereits geschriebene Skizze, mit der Sie Samsung DVD HR-755 mit der Daewoo R40A01-Fernbedienung steuern können, finden Sie in den Beispielen unter dem Namen DaewooR40A01toDVDHR755Transcoder. Pull - Request Beispiele , die den gemeinsamen Thread hinzuzufügen bisher keine hat ein genommen so laden eine modifizierte Bibliothek a fork .Viele Fotos mit einem überarbeiteten Rekorder Unter der Katze befinden sich Fotos von der Integration des Arduino Nano in diesen DVD-Recorder, der Arduino Mini nimmt zwar deutlich weniger Platz ein, aber nur Nano war zur Hand. Ich habe das Bedienfeld mit Strom versorgt. Das Signal vom eingebauten Empfänger wurde mit dem Arduino verbunden und ein anderer IR-Empfänger auf der gegenüberliegenden Seite des ersten wurde parallel mit ihm verlötet. Mit der gleichen montierten Installation wurde eine IR-LED darauf gelötet. Im Prinzip hätte diese Wiederholung vermieden werden können - aber das Signal vom IR-Empfänger ist invertiert -, sodass ich das TTL-Signal nicht direkt zum Gerät leiten kann - aber ich habe den Wechselrichter nicht mehr an der Logik oder am Transistor hergestellt.Trotz der Tatsache, dass in meinem Fall die Rohdaten einwandfrei funktionierten, zeigten Experimente mit dem Rest der Heimausrüstung, dass nicht alle erfassten Signale beim Versuch, ein bestimmtes Gerät zu steuern, ordnungsgemäß funktionierten. Der Befehl zum Einschalten der Klimaanlage funktionierte nicht. Wenn er jedoch bereits eingeschaltet war, funktionierte der Moduswechsel ordnungsgemäß. Die LG-Kolumne lehnte ebenfalls die Annahme von Rohbefehlen ab, reagierte jedoch gut auf das Senden von Codes über sendSamsung. Gleichzeitig reagierten fünf von Bekannten gesammelte Fernseher sehr gut auf Rohdaten. Ich habe die Option mit verschiedenen Signalfrequenzen ausprobiert - es hat nicht geholfen. Möglicherweise liegt das Problem in der Signalabtastrate von 50 ms. Gemessen an der Funktionsfähigkeit von Teams im Samsung-Format mit LG-Technologie sollte das Protokoll in Analogie zu ir_LG.cpp ir_JVC.cpp ir_Dish.cpp, als separates Modul formalisiert werden.Auswählen des Headers und der Codierungsparameter von Nullen und Einsen für ein bestimmtes Gerät. Wahrscheinlich wird das Parsen des Schreibens eines solchen Protokolls als gutes Thema für den Artikel dienen.Außerdem ist IRLib die zweite große IR-Bibliothek für Arduino . Es verfügt über ähnliche Funktionen und sogar über ein vorgefertigtes Modul zum Parsen von IR-Protokollen für den Desktop. Es wurde ein schneller Vergleichstest zum Lesen der Rohdaten durchgeführt, bei dem kein Unterschied zwischen den Proben und IRemote festgestellt wurde. Von den Pluspunkten hat IRLib bereits ein Beispiel für die Bestimmung, bei welcher Frequenz der IR-Sender arbeitet. Beispiel Samsung36 implementiert tatsächlich eine Protokollanalyse unter Verwendung von Daten aus dem Internet. Darüber hinaus beschreibt die Dokumentation perfekt, wie IR-Empfänger mit Kaskadierung und vielem mehr verbunden werden. Obwohl IRemote meiner Meinung nach viel einfacher zu verstehen und zu verwenden ist.