Arduino, IR Fernbedienung dekodieren

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
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
LED
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
Taste
0
9
8
7
6
5
4
3
2
1
auf
ab
links
rechts
ein
LS
an
an
an
an
an
an
an
an
an
an
an
an
an
an
an
an
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
Pin
2
3
4
5
6
7
8
9
10
11
A0
A1
A2
A3
A4
A5
0
9
8
7
6
5
4
3
2
1
auf
ab
links
rechts
Ein
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);
//einbinden Unterprogramm
//Eingangspin fuer neg. Infrarot-Signal
//serial
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
//an Pin
Monitor einschalten
2 wird LED2 angeschlossen.
3 wird LED3 angeschlossen.
4 wird LED4 angeschlossen.
5 wird LED5 angeschlossen.
6 wird LED6 angeschlossen.
7 wird LED7 angeschlossen.
8 wird LED8 angeschlossen.
9 wird LED9 angeschlossen.
10 wird LED10 angeschlossen.
11 wird LED11 angeschlossen.
12 wird LED12 angeschlossen.
pinMode
pinMode
pinMode
pinMode
pinMode
pinMode
//an
//an
//an
//an
//an
//an
A0
A1
A2
A3
A4
A5
(A0,
(A1,
(A2,
(A3,
(A4,
(A5,
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
OUTPUT);
irrecv.enableIRIn();
}
void loop()
{
if (digitalRead(12)==LOW)
{
digitalWrite (2, LOW);
digitalWrite (3, LOW);
digitalWrite (4, LOW);
digitalWrite (5, LOW);
digitalWrite (6, LOW);
digitalWrite (7, LOW);
digitalWrite (8, LOW);
digitalWrite (9, LOW);
digitalWrite (10, LOW);
digitalWrite (11, LOW);
digitalWrite (A0, LOW);
digitalWrite (A1, LOW);
digitalWrite (A2, LOW);
digitalWrite (A3, LOW);
digitalWrite (A4, LOW);
digitalWrite (A5, LOW);
}
if (irrecv.decode(&results))
{
//Beginn Setup
Pin
Pin
Pin
Pin
Pin
Pin
LED
LED
LED
LED
LED
LED
A0
A1
A2
A3
A4
A5
angeschlossen.
angeschlossen.
angeschlossen.
angeschlossen.
angeschlossen.
angeschlossen.
//wenn Eingang 12 (Taste gedrueckt ist low dann ...
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
//
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
Ausgang
2 low
3 low
4 low
5 low
6 low
7 low
8 low
9 low
10 low
11 low
A0 low
A1 low
A2 low
A3 low
A4 low
A5 low
// wenn die IR Bibliothek ein decodiertes Signal liefert ...
9
Serial.println(results.value, DEC); // ... dann soll dieses auf der Ser. Schnittstelle ausgegeben
werden
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
(results.value==3772784863)
(results.value==3772817503)
(results.value==3772801183)
(results.value==3772780783)
(results.value==3772813423)
(results.value==3772797103)
(results.value==3772788943)
(results.value==3772821583)
(results.value==3772805263)
(results.value==3772811383)
(results.value==3772795063)
(results.value==3772778743)
(results.value==3772829743)
(results.value==3772833823)
(results.value==3772793023)
(results.value==3772837903)
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
Serial.println
if (digitalRead(12)==HIGH)
Serial.println ("Taste gedrueckt");
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
if
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
(results.value
==
==
==
==
==
==
==
==
==
==
==
==
==
==
==
==
3772784863)
3772817503)
3772801183)
3772780783)
3772813423)
3772797103)
3772788943)
3772821583)
3772805263)
3772811383)
3772795063)
3772778743)
3772829743)
3772833823)
3772793023)
3772837903)
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
("Taste
//Eingang 12,
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
{digitalWrite
1");
2");
3");
4");
5");
6");
7");
8");
9");
0");
auf");
ab");
links");
rechts");
ein/aus");
LS");
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
//Print
Print "Taste gedrueckt"
(11, HIGH);}
(10, HIGH);}
(9, HIGH);}
(8, HIGH);}
(7, HIGH);}
(6, HIGH);}
(5, HIGH);}
(4, HIGH);}
(3, HIGH);}
(2, HIGH);}
(A0, HIGH);}
(A1, HIGH);}
(A2, HIGH);}
(A3, HIGH);}
(A4, HIGH);}
(A5, HIGH);}
irrecv.resume();
}
}
/*
Fernbedienung
Taste
0
1
2
3
4
5
6
7
8
9
nach oben
nach unten
nach links
nach rechts
ein/aus
Lautspr.
*/
"Taste1"
"Taste2"
"Taste3"
"Taste4"
"Taste5"
"Taste6"
"Taste7"
"Taste8"
"Taste9"
"Taste0"
"Taste auf"
"Taste ab"
"Taste links"
"Taste rechts"
"Taste ein/aus"
"Taste LS"
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
//Taste
1,
LED11 High
2,
LED10 High
3,
LED9 High
4,
LED8 High
5,
LED7 High
6,
LED6 High
7,
LED5 High
8,
LED4 High
9,
LED3 High
0,
LED2 HIGH
auf,
LED A0 HIGH
ab,
LED A1 HIGH
links, LED A2 HIGH
rechts,LED A3 HIGH
ein/aus,LED A4 HIGH
LS,
LED A5 HIGH
// Receive the next value
Philips SRP1 101/10, digi code 1660
Code (dezimal)
3772811383
3772784863
3772817503
3772801183
3772780783
3772813423
3772797103
3772788943
3772821583
3772805263
3772795063
3772778743
3772829743
3772833823
3772793023
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