Arduino, IR Fernbedienung dekodieren 9.10.2015 Im Zuge meiner weiteren Arduino Studien bin ich auf die Frage gestoßen, wie kann man Befehle in den Arduino transportieren? Aus einem Youtube Beitrag über Robotersteuerung mit Arduino entnahm ich, daß eine IR Fernbedienung (Audio Standard) sich als Befehls-Eingabemedium gut eignet. Die Aufgabe war, die seriell mit einer IR Fernbedienung gesendeten Befehle in den Arduino einzulesen, dort zu dekodieren und sie an Digitalausgänge einzeln auszugeben. Die Fernbedienung und das aus einem Fernseher ausgeschlachtete IR Epfängermodul: Also gings an die Arbeit: 1
Die Hardware dazu: Als erstes mußten die aus dem IR Empfängermodul kommenden Signale hardwaremäßig für den Arduino aufbereitet werden, dies geschieht auf dem unteren Steckbrett. In der Mitte mein Arduino Nachbau, oben die Ausgabe auf 16 digitale Ausgänge (LEDs): 2
Das Schaltbild (hergestellt mit Abacom splan) zeigt oben die Signalaufbereitung und unten die Ausgabe auf die LED Arrays, 16 Tasten der Fernbedienung sind jetzt jeweils einem Ausgang des Arduino zugeordnet: Aus der Schaltung entstand dann die Platine hergestellt mit Abacom Sprint Layout: 3
Das ist der Bestückungsplan der Platine: Der Entwurf des Platinenaufdrucks: 4
Jetzt wird die fertige Platine ausprobiert: Das Empfangsteil und die Signalaufbereitung auf der linken Seite: 5
Die Platine in Gesamtansicht: Das ist die Arduino Platine mit dem Adapter, auf dem das IR Dekoder Shield platziert wird: 6
Zusammengesteckt sieht das so aus: Detaillansicht: 7
Jetzt gehts ans Programmieren: Die Arduino Software: 8
Die Zuordnung der Fernbedienungstasten zu den Arduino Ausgängen: Fernbedienung Ausgang Arduino Text Taste 0 LED an Pin 2 Taste 0 Taste 9 LED an Pin 3 Taste 9 Taste 8 LED an Pin 4 Taste 8 Taste 7 LED an Pin 5 Taste 7 Taste 6 LED an Pin 6 Taste 6 Taste 5 LED an Pin 7 Taste 5 Taste 4 LED an Pin 8 Taste 4 Taste 3 LED an Pin 9 Taste 3 Taste 2 LED an Pin 10 Taste 2 Taste 1 LED an Pin 11 Taste 1 Taste auf LED an Pin A0 Taste auf Taste ab LED an Pin A1 Taste ab Taste links LED an Pin A2 Taste links Taste rechts LED an Pin A3 Taste rechts Taste ein LED an Pin A4 Taste Ein Taste LS LED an Pin A5 Taste LS Der Programmcode, erste Versuche, und es funktioniert: /* Arduino IR Shield Philips Fernbedienung SRP1 101/10, programmiert auf Loewe digi code 1660. */ #include <IRremote.h> int RECV_PIN = 13; int state; IRrecv irrecv(recv_pin); decode_results results; void setup() { Serial.begin(9600); pinmode (2, OUTPUT); pinmode (3, OUTPUT); pinmode (4, OUTPUT); pinmode (5, OUTPUT); pinmode (6, OUTPUT); pinmode (7, OUTPUT); pinmode (8, OUTPUT); pinmode (9, OUTPUT); pinmode (10, OUTPUT); pinmode (11, OUTPUT); pinmode (12, INPUT); pinmode (A0, OUTPUT); pinmode (A1, OUTPUT); pinmode (A2, OUTPUT); pinmode (A3, OUTPUT); pinmode (A4, OUTPUT); pinmode (A5, OUTPUT); //einbinden Unterprogramm //Eingangspin fuer neg. Infrarot-Signal //Beginn Setup //serial Monitor einschalten //an Pin 2 wird LED2 angeschlossen. //an Pin 3 wird LED3 angeschlossen. //an Pin 4 wird LED4 angeschlossen. //an Pin 5 wird LED5 angeschlossen. //an Pin 6 wird LED6 angeschlossen. //an Pin 7 wird LED7 angeschlossen. //an Pin 8 wird LED8 angeschlossen. //an Pin 9 wird LED9 angeschlossen. //an Pin 10 wird LED10 angeschlossen. //an Pin 11 wird LED11 angeschlossen. //an Pin 12 wird LED12 angeschlossen. //an Pin A0 LED A0 angeschlossen. //an Pin A1 LED A1 angeschlossen. //an Pin A2 LED A2 angeschlossen. //an Pin A3 LED A3 angeschlossen. //an Pin A4 LED A4 angeschlossen. //an Pin A5 LED A5 angeschlossen. irrecv.enableirin(); } void loop() { if (digitalread(12)==low) //wenn Eingang 12 (Taste gedrueckt ist low dann... { digitalwrite (2, LOW); // Ausgang 2 low digitalwrite (3, LOW); // Ausgang 3 low digitalwrite (4, LOW); // Ausgang 4 low digitalwrite (5, LOW); // Ausgang 5 low digitalwrite (6, LOW); // Ausgang 6 low digitalwrite (7, LOW); // Ausgang 7 low digitalwrite (8, LOW); // Ausgang 8 low digitalwrite (9, LOW); // Ausgang 9 low digitalwrite (10, LOW); // Ausgang 10 low digitalwrite (11, LOW); // Ausgang 11 low digitalwrite (A0, LOW); // Ausgang A0 low digitalwrite (A1, LOW); // Ausgang A1 low digitalwrite (A2, LOW); // Ausgang A2 low digitalwrite (A3, LOW); // Ausgang A3 low digitalwrite (A4, LOW); // Ausgang A4 low digitalwrite (A5, LOW); // Ausgang A5 low } if (irrecv.decode(&results)) // wenn die IR Bibliothek ein decodiertes Signal liefert... { 9
Serial.println(results.value, DEC); //... dann soll dieses auf der Ser. Schnittstelle ausgegeben werden if (results.value==3772784863) Serial.println ("Taste 1"); if (results.value==3772817503) Serial.println ("Taste 2"); if (results.value==3772801183) Serial.println ("Taste 3"); if (results.value==3772780783) Serial.println ("Taste 4"); if (results.value==3772813423) Serial.println ("Taste 5"); if (results.value==3772797103) Serial.println ("Taste 6"); if (results.value==3772788943) Serial.println ("Taste 7"); if (results.value==3772821583) Serial.println ("Taste 8"); if (results.value==3772805263) Serial.println ("Taste 9"); if (results.value==3772811383) Serial.println ("Taste 0"); if (results.value==3772795063) Serial.println ("Taste auf"); if (results.value==3772778743) Serial.println ("Taste ab"); if (results.value==3772829743) Serial.println ("Taste links"); if (results.value==3772833823) Serial.println ("Taste rechts"); if (results.value==3772793023) Serial.println ("Taste ein/aus"); if (results.value==3772837903) Serial.println ("Taste LS"); //Print "Taste1" //Print "Taste2" //Print "Taste3" //Print "Taste4" //Print "Taste5" //Print "Taste6" //Print "Taste7" //Print "Taste8" //Print "Taste9" //Print "Taste0" //Print "Taste auf" //Print "Taste ab" //Print "Taste links" //Print "Taste rechts" //Print "Taste ein/aus" //Print "Taste LS" if (digitalread(12)==high) Serial.println ("Taste gedrueckt"); //Eingang 12, Print "Taste gedrueckt" if (results.value == 3772784863) {digitalwrite (11, HIGH);} //Taste 1, LED11 High if (results.value == 3772817503) {digitalwrite (10, HIGH);} //Taste 2, LED10 High if (results.value == 3772801183) {digitalwrite (9, HIGH);} //Taste 3, LED9 High if (results.value == 3772780783) {digitalwrite (8, HIGH);} //Taste 4, LED8 High if (results.value == 3772813423) {digitalwrite (7, HIGH);} //Taste 5, LED7 High if (results.value == 3772797103) {digitalwrite (6, HIGH);} //Taste 6, LED6 High if (results.value == 3772788943) {digitalwrite (5, HIGH);} //Taste 7, LED5 High if (results.value == 3772821583) {digitalwrite (4, HIGH);} //Taste 8, LED4 High if (results.value == 3772805263) {digitalwrite (3, HIGH);} //Taste 9, LED3 High if (results.value == 3772811383) {digitalwrite (2, HIGH);} //Taste 0, LED2 HIGH if (results.value == 3772795063) {digitalwrite (A0, HIGH);} //Taste auf, LED A0 HIGH if (results.value == 3772778743) {digitalwrite (A1, HIGH);} //Taste ab, LED A1 HIGH if (results.value == 3772829743) {digitalwrite (A2, HIGH);} //Taste links, LED A2 HIGH if (results.value == 3772833823) {digitalwrite (A3, HIGH);} //Taste rechts,led A3 HIGH if (results.value == 3772793023) {digitalwrite (A4, HIGH);} //Taste ein/aus,led A4 HIGH if (results.value == 3772837903) {digitalwrite (A5, HIGH);} //Taste LS, LED A5 HIGH irrecv.resume(); } } // Receive the next value /* Fernbedienung Philips SRP1 101/10, digi code 1660 Taste Code (dezimal) 0 3772811383 1 3772784863 2 3772817503 3 3772801183 4 3772780783 5 3772813423 6 3772797103 7 3772788943 8 3772821583 9 3772805263 nach oben 3772795063 nach unten 3772778743 nach links 3772829743 nach rechts 3772833823 ein/aus 3772793023 Lautspr. 3772837903 */ Die Copyrights: IRrecvDemo - demonstrates receiving IR codes with IRrecv Version 0.1 July, 2009, Copyright 2009 Ken Shirriff, http://arcfn.com, <IRremote.h>. Vielleicht hat auch diese Doku einige Anregungen zum Nachmachen. Gruß Günter Kurschatke 10