Bei meinem ersten Kit war nicht nur ein Sainsmart Mega 2560 R3 und diverse Sensoren, sondern auch eine IR Fernbedienung dabei. In diesem Tutorial möchte ich nun beschreiben, wie diese am Arduino Nano betrieben werden kann.
Bezug der einzelnen Komponenten für diesen Beitrag
Wenn du das nachfolgende Beispiel nachbauen möchtest, dann benötigst du:
- einen Arduino UNO*,
- einen Transistor, 2N222*,
- eine Infrarot Diode*,
- diverse Breadboardkabel*,
- ein 400 Pin Breadboard*, oder
- ein 170 Pin Breadboard*
Hinweis von mir: Die mit einem Sternchen (*) markierten Links sind Affiliate-Links. Wenn du über diese Links einkaufst, erhalte ich eine kleine Provision, die dazu beiträgt, diesen Blog zu unterstützen. Der Preis für dich bleibt dabei unverändert. Vielen Dank für deine Unterstützung!
Technische Daten
- Betriebsspannung 3.3V bis 5V
Schaltplan
Der Anschluss des IR Receiver (die Labels sind selbst sprechend gewählt)
- +5V an +5V des Arduino Nano
- GND an Ground (GND)
- Signal an einen digitalen Eingang (Bsp. D10)
Die hier dargestellte Schaltung habe ich dir bereits im Beitrag Daten per Infrarot versenden und Empfangen am Arduino vorgestellt.
Quellcode
#include <IRremote.h> int irPin = 10; //Pin am Arduino Nano für den IR Receiver int ledPin = 5; //Pin am Arduino Nano für die LED als Signalbestätigung int led1Pin = 4; //Pin am Arduino Nano für LED 1 int led2Pin = 3; //Pin am Arduino Nano für LED 2 boolean led1Status = false; boolean led2Status = false; IRrecv irrecv(irPin); //Objekt initialisieren für die IR Übertragung decode_results results; void setup() { pinMode(ledPin, OUTPUT); //Den LED Pin als Ausgang deklarieren. pinMode(irPin, INPUT); //Den IR Pin als Eingang deklarieren. irrecv.enableIRIn(); //Den IR Pin aktivieren Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen. } void loop(){ if (irrecv.decode(&results)) { //Wenn etwas gelesen wurde dann... //Ausgabe des Wertes auf die Serielle Schnittstelle. int value = results.value; switch (value){ case 16724175 : //Taste 1 led1Status = !led1Status; //umkehren des Status für die LED 1 if(led1Status == true){ digitalWrite (led1Pin, HIGH); //LED anschalten } else { digitalWrite (led1Pin, LOW); //LED ausschalten } break; case 16718055 : //Taste 2 led2Status = !led2Status; //umkehren des Status für die LED 2 if(led2Status == true){ digitalWrite (led2Pin, HIGH); //LED anschalten } else { digitalWrite (led2Pin, LOW); //LED ausschalten } break; } Serial.println(value, DEC); digitalWrite (ledPin, HIGH); //Status LED anschalten irrecv.resume(); // auf den nächsten Wert warten delay(250); // kurze Pause von 250ms damit die LED aufleuchten kann. digitalWrite (ledPin, LOW); //Status LED ausschalten } }
Tabelle mit den decodierten Werten für die Tasten
Taste | Wert |
---|---|
0 | 16738455 |
1 | 16724175 |
2 | 16718055 |
3 | 16743045 |
4 | 16716015 |
5 | 16726215 |
6 | 16734885 |
7 | 16728765 |
8 | 16730805 |
9 | 16732845 |
An / Aus | 16753245 |
Mode | 16736925 |
Mute | 16769565 |
Play / Pause | 16720605 |
Preview | 16712445 |
Forward | 16761405 |
EQ | 16769055 |
Minus | 16754775 |
Plus | 16748655 |
Repeat / Shuffle | 16750695 |
U / SD | 16756815 |
Fehlermeldung aus der Arduino IDE
Wenn man die neueste Arduino IDE verwendet, kann es zu folgender Fehlermeldung kommen, wenn der Sketch kompiliert / überprüft wird.
“IRremoteTools.cpp:5: error: ‘TKD2’ was not declared in this scope”
Es wird dabei empfohlen, auf eine frühere Version zu wechseln. Oder aber 2 Dateien aus dem Bibliothektsordner zu löschen, da diese wohl doppelt vorhanden sind.
Ich habe unter “C:\Program Files (x86)\Arduino\libraries\RobotIRremote” die Dateien
- IRremoteTools.cpp
- IRremoteTools.h
in einen Unterordner verschoben (wer weiß, vielleicht werden die noch benötigt).
Nach dieser Prozedur hat der Sketch nun kompiliert und konnte erfolgreich übertragen werden.
Video
Da die rote & blaue LED einen geringeren Abstrahlwinkel haben, leuchten diese von der Seite nicht ganz so stark, jedoch wenn die Kamera genau darauf zeigen würde, wäre diese wiederum mit der Leistung der LED überfordert.
Danke für das lehrreiche Tutorial.
Ich konnte das Beispiel problemlos auf meine Hardware umstellen.
Da meine Fernbedienung längere Codes sendet, musste ich value als long definieren damit es funktioniert.
Außerdem war es noch nötig, die beiden PINs led1Pin und led2Pin im setup auf OUTPUT zu setzen.
Nun funktioniert alles und der Weg für größere Projekte ist frei.
Oh sry my little boy…
Thank you for the Tutorial…
i have searched for this one
Hi, schönes Projekt, genau danach habe ich gesucht. Aber Dir ist wohl ein kleiner Fehler unterlaufen. Der Infrarotempfänger VS1838B, den Du scheinbar benutzt, ist keine IR-LED, sondern ein IR-Receiver- (Empfänger-)Bauteil mit einem Phototransistor. Eine LED (Light Emitting Diode), sendet Licht. Die Fernbedienung bespielsweise benutzt eine IR-LED.
http://www.1pico.com/vs1838b-datenblatt-pdf/
Hi,
danke für das Feedback.
Habe ich gleichmal geändert.
Gruß,
Stefan
Hallo Stefan,
sehr schöner Beitrag. Hat mir auch weitergeholfen. Nun beisse ich mir seit 1 Tag die Zähne an folgendem Problem aus:
Ich steuere mit den Remote Befehlen 2 Motoren eines Roboters an. Ich nutze eine Arduino UNO.
Das kuriose ist,
Wenn ich die remote Befehle nutze, dann steuert mir der Arduino nur noch einen Motor der H Brücke an. der 2. bleibt still!!
Wenn ich die remote Befehle im Code deaktiviere und die Motoren “von Hand” starte, dann laufen beide.
Das Problem liegt definitive an der Remote Funktion, die sich mit der H-Brücke in die Quere kommt.
Ich habe den PIN der remote getauscht und digita analoge und A3 verwendet: keine Besserung:
Ich habe die Detlayzeiten geändert: keine Besserung
Hast du eine Idee?
Gruss Jan-Peter
Anbei der Code:
#include
/*
* IRremote: IRrecvDemo – demonstrates receiving IR codes with IRrecv
* An IR detector/demodulator must be connected to the input RECV_PIN.
*/
int RECV_PIN = 12;
int command = 4;
IRrecv irrecv(RECV_PIN); //Objekt initialisieren für die IR Übertragung
decode_results results;
void setup()
{
//———————————————————————–
//———- remote control ————————-
//———————————————————————–
irrecv.enableIRIn(); // Start the receiver
Serial.begin(9600); //Serielle kommunikation mit 9600 Baud beginnen.
//———————————————————————–
//———- output für die Motoren des Antriebs————————-
//———————————————————————–
pinMode(7, OUTPUT);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(2, OUTPUT);
pinMode(4, OUTPUT);
pinMode(3, OUTPUT);
pinMode(RECV_PIN, INPUT);
}
void loop() {
if (irrecv.decode(&results)) {
//Serial.println(results.value, HEX);
//Serial.println(results.value, DEC);
switch (results.value){
case 16718055 : //vorwärts fahren
command = 0;
break;
case 16730805 : //rückwärts fahren
command = 1;
break;
case 16734885 : //rechts fahren
command = 2;
break;
case 16716015 : //links fahren
command = 3;
break;
case 16726215 : //stop!!!
command = 4;
break;
}
irrecv.resume(); // Receive the next value
}
if (command == 0)//vorwärts fahren
{
//Serial.println(“vorwärts fahren”);
// rechte Kette
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
analogWrite(9, 80);
// linke Kette
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
analogWrite(3, 80);
}
//_____________________________________________________________________
if (command == 1)//rückwärts fahren
{
//Serial.println(“rückwärts fahren”);
// rechte Kette
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(9, 80);
// linke Kette
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
analogWrite(3, 80);
}
//_____________________________________________________________________
if (command == 2)//rechts fahren
{
//Serial.println(“rechts fahren”);
// rechte Kette
digitalWrite(7, LOW);
digitalWrite(8, HIGH);
analogWrite(9, 80);
// linke Kette
digitalWrite(2, LOW);
digitalWrite(4, HIGH);
analogWrite(3, 80);
}
//_____________________________________________________________________
if (command == 3)//links fahren
{
//rechte Kette
digitalWrite(7, HIGH);
digitalWrite(8, LOW);
analogWrite(9, 80);
// linke Kette
digitalWrite(2, HIGH);
digitalWrite(4, LOW);
analogWrite(3, 80);
//Serial.println(“links fahren”);
}
//_____________________________________________________________________
if (command == 4)//stop
{
//Serial.println(“stop!!!”);
analogWrite(3, 0);
analogWrite(9, 0);
}
delay(250);
}
Hallo Jan-Peter,
hast du mal die Codes der Fernbedienung ausgelesen? Diese sind von Fernbedienung zu Fernbedienung unterschiedlich.
Das delay würde ich weglassen. Denn das würde eigentlich kein Sinn ergeben.
Des Weiteren habe ich mir mal deinen Code vorgenommen und etwas vereinfacht, unter folgendem Link https://pastebin.com/viw7QBgR kannst du dir diesen herunterladen.
Gruß,
Stefan Draeger
Hallo Stefan,
vielen Dank für deine Mühe und Hilfe.
Den Code habe ich ausprobiert. Sieht deutlich professioneller als meiner aus.
Zeile 73 ist falsch, da sie den Motor immer gleich wieder anhält.
Leider habe ich genau das gleiche Problem wieder.
Wenn ich die Remote im setup aktiviere, dann läuft nur noch der rechte Motor. Wenn ich die Remote im setup nicht einschalte, dann laufen beide Motoren wie geplant. Irgendetwas macht der remotebefehl auf dem Prozessor, was ihn “dauerbeschäftigt”. Auffällig ist auch, dass der rechte Motor deutlich müder dreht, wenn die remote aktiviert ist. Wenn ich beide Motoren laufen lasse (ohne remote) dann drehen sie beide schneller.
Kann man den code irgendwie bei der Abarbeitung “überwachen”.
Ich habe mal eine andere remote bestellt. Aber glauben tue ich daran eigentlich nicht.
Was würdest du als nächstes versuchen?
Jan-Peter
Hi,
leider gibt es keine Breakpoints aber man kann sich mit Serial.println Ausgaben erzeugen so das man von diesen einen Status ablesen kann. Der Fehler tut mir leid da ich den Bausatz nicht (noch nicht) habe und den Code validieren könnte.
Ich würde das wiefolgt lösen: erstmal die Fernbedienung auslesen um die Codes zu erhalten. Dann Schritt für Schritt erst einen Motor ansteuern und dann den zweiten und dann beide.
Mehr kann ich dir sagen wenn das Paket aus China angekommen ist.
Gruß,
Stefan Draeger
Hallo Stefan,
ich suche eine Schaltung zum Auslesen der Fernbedienung von meiner Klimaanlage, um sie per Arduino oder ESP8266 ein- bzw. auszuschalten. Leider erhalte ich folgenden Fehler:
The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData. .
-1
Hast DU eine Idee?
VG
Martin
Hallo Martin,
die Lösung dazu habe ich im englischen Beitrag https://draeger-it.blog/en/arduino-lesson-4-programming-ir-remote-control/ veröffentlicht (Abschnitt “Prevent message “The function decode(&results)) is deprecated and may not work as expected! Just use decode() without a parameter and IrReceiver.decodedIRData.””)
Gruß
Stefan