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.

irfernbedienung
IR Fernbedienung.
ir_led
IR LED

Technische Daten

  • Betriebsspannung 3.3V bis 5V

Schaltplan

Der Anschluss des IR Receiver (die Labels sind selbstsprechend gewählt)

  • +5V an +5V des Arduino Nano
  • GND an Ground (GND)
  • Signal an einen digitalen Eingang (zbsp. D10)
Anschluss der IR LED.
Anschluss der IR LED.
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

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ß vieleicht werden die noch benötigt).
Nach dieser Prozedur hat das 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 drauf zeigen würde wäre diese wiederum mit der Leistung der LED überfordert.

Download

8 Gedanken zu „Arduino Lektion 20: IR Fernbedienung auslesen

  • Mai 23, 2017 um 23:01
    Permalink

    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.

    Antwort
  • Januar 1, 2018 um 18:09
    Permalink

    Oh sry my little boy…
    Thank you for the Tutorial…
    i have searched for this one

    Antwort
  • Januar 17, 2018 um 22:37
    Permalink

    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/

    Antwort
    • Januar 18, 2018 um 09:06
      Permalink

      Hi,

      danke für das Feedback.
      Habe ich gleichmal geändert.

      Gruß,

      Stefan

      Antwort
  • Juli 29, 2018 um 07:16
    Permalink

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

    Antwort
    • Juli 29, 2018 um 10:04
      Permalink

      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

      Antwort
      • Juli 31, 2018 um 20:30
        Permalink

        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

        Antwort
        • Juli 31, 2018 um 21:29
          Permalink

          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

          Antwort

Schreibe einen Kommentar

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