Arduino Lektion 20: IR Fernbedienung auslesen

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.

Arduino Lektion 20: IR Fernbedienung auslesen
Arduino Lektion 20: IR Fernbedienung auslesen

Bezug der einzelnen Komponenten für diesen Beitrag

Wenn du das nachfolgende Beispiel nachbauen möchtest, dann benötigst du:

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)
Anschluss der IR LED.
Anschluss der IR LED.

Die hier dargestellte Schaltung habe ich dir bereits im Beitrag Daten per Infrarot versenden und Empfangen am Arduino vorgestellt.

Aufbau einer kleinen Schaltung für die IR-Fernbedienung.
Aufbau einer kleinen Schaltung für die IR-Fernbedienung.

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

TasteWert
016738455
116724175
216718055
316743045
416716015
516726215
616734885
716728765
816730805
916732845
An / Aus16753245
Mode16736925
Mute16769565
Play / Pause16720605
Preview16712445
Forward16761405
EQ16769055
Minus16754775
Plus16748655
Repeat / Shuffle16750695
U / SD16756815

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

Infrarot Fernbedienung

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.

Download

15 Kommentare

  1. 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.

  2. 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/

  3. 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);
    }

    1. 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

      1. 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

        1. 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

  4. 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

Kommentar hinterlassen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert