Infrarot-Fernbedienung

Inhalt

Infrarotes Licht und Fernbedienungen

Mit Hilfe eines Infrarotempfängers kann ein Arduinoboard die Befehle einer Infrarotfernbedienung empfangen und auswerten. Die Daten werden dabei in Form von Infrarotlicht von der Fernbedienung zum Empfänger gesendet. Da unser Auge dieses Licht nicht wahrnehmen kann, können wir dieses Licht nicht sehen. Mit einem kleinen Trick kann man jedoch testen, ob bspw. eine Fernbedienung ein Infrarotsignal sendet. Dazu nimmt man eine Digitalkamera (etwa die vom Smartphone) und betrachtet über das Display die Infrarotdiode. Wenn die Fernbedienung betätigt wird, kann man die Infrarotdiode leuchten sehen. Das liegt daran, dass die Sensoren von Digitalkameras das Infrarotlicht wahrnehmen und darstellen können. Das Licht flackert leicht, da die Infrarotdiode sehr schnell an- und ausgeht. Dahinter verbirgt sich ein ganz bestimmter Rhythmus, anhand dessen der Infrarotempfänger später auswerten kann, welche Taste an der Fernbedienung gedrückt wurde.

Beispiele für die Verwendung von Infrarot-Fernbedienungen

Infrarotempfänger und Fernbedienung

Der Schaltplan für den Infrarot-Empfänger

Pinbelegung des Empfängers VS1838B

Auswertung der Zahlencodes des Infrarot-Empfängers VS1838B

Das infrarote Licht wird vom Empfänger erkannt. Der Empfänger enthält eine Fotodiode, das aufgefangene Licht wird in einen Zahlencode umgewandelt.

Dieser Zahlencode wird abgefragt und kann dann anschließend eine Aktion auslösen.

Das Programm

Das Programm für die Abfrage der Tastencodes

#include <IRremote.h> // Das Programm greift an dieser Stelle auf eine „Library“ zurück. Das erleichtert einem viel Arbeit. Denn das Infrarotlicht wird mit einem Code verschlüsselt gesendet. Um diesen Code selber auszulesen und in passende Werte umzuwandeln, wären sehr viele Zeilen Code erforderlich.

int EmpfaengerPin = 11; // der Pin, an dem der Infrarot-Empfänger angeschlossen ist

void setup()

{

Serial.begin(9600); // Seriellen Monitor starten

IrReceiver.begin(EmpfaengerPin); // Infrarot-Empfänger starten

}

void loop()

{

 if (IrReceiver.decode()) // decode() -> Prüfen, ob Daten vorhanden sind.

 {

   delay(200); // kurzes delay, damit nur ein Tastendruck gelesen wird

   IrReceiver.resume(); // resume -> Nächsten Wert lesen

  /*

   Der Empfänger empfängt zwischendurch Signale, die nicht ausgewertet werden können.

   Es sollen deshalb nur die korrekt erkannten Tasten ausgewertet werden.

   Die Dezimalwerte der korrekt erkannten Tasten liegen zwischen 0 und 95.

   Nun wird abgefragt, ob das empfangene Kommando „decodedIRData.command“

 zwischen 0 und (&&) 95 liegt

 */

 if (IrReceiver.decodedIRData.command > 0 && IrReceiver.decodedIRData.command < 95)

 {

  Serial.print("Dezimalwert: "); // Der Text „Dezimalwert: „ wird am Seriellen Monitor ausgegeben. Danach erfolgt die Erweiterung dieser Ausgabe um den entsprechenden Wert.

  Serial.print(IrReceiver.decodedIRData.command); // IrReceiver.decodedIRData.command = Wert der gedrückten Taste. Der Dezimalwert des eingelesenen Codes erscheint nun im Seriellen Monitor.

  Serial.print(" -> "); // Zusätzlich erscheint nun dieser Pfeil, der die Zuordnung der entsprechenden Taste auf der Fernbedienung darstellen soll.

  if (IrReceiver.decodedIRData.command == 69) Serial.println("A"); // Die Dezimalzahl 69 entspricht am Beispiel unserer Fernbedienung der Taste „A“ usw…

  if (IrReceiver.decodedIRData.command == 70) Serial.println("Pfeil oben");

  if (IrReceiver.decodedIRData.command == 71) Serial.println("B");

  if (IrReceiver.decodedIRData.command == 68) Serial.println("Pfeil links");

  if (IrReceiver.decodedIRData.command == 64) Serial.println("X");

  if (IrReceiver.decodedIRData.command == 67) Serial.println("Pfeil rechts");

  if (IrReceiver.decodedIRData.command == 7) Serial.println("0");

  if (IrReceiver.decodedIRData.command == 21) Serial.println("Pfeil unten");

  if (IrReceiver.decodedIRData.command == 9) Serial.println("C");

  if (IrReceiver.decodedIRData.command == 22) Serial.println("1");

  if (IrReceiver.decodedIRData.command == 25) Serial.println("2");

  if (IrReceiver.decodedIRData.command == 13) Serial.println("3");

  if (IrReceiver.decodedIRData.command == 12) Serial.println("4");

  if (IrReceiver.decodedIRData.command == 24) Serial.println("5");

  if (IrReceiver.decodedIRData.command == 94) Serial.println("6");

  if (IrReceiver.decodedIRData.command == 8) Serial.println("7");

  if (IrReceiver.decodedIRData.command == 28) Serial.println("8");

  if (IrReceiver.decodedIRData.command == 90) Serial.println("9");

  }

 }

}

Ein Druck auf die Taste „A“ der Infrarotfernbedienung bewirkt, dass am Seriellen Monitor Folgendes erscheint: „Dezimalwert: 69 -> A“.

Erweiterung des Programms

Beim Drücken der Taste“1“ soll eine LED angehen und beim Drücken der Taste“2“ soll die LED ausgehen. In diesem Beispiel verwenden wir die Onboard-LED an Pin13, um keine neue Verkabelung vornehmen zu müssen.

#include <IRremote.h>

int EmpfaengerPin = 11;

int LED = 13; // Pin der LED

void setup()

{

 IrReceiver.begin(EmpfaengerPin);

 pinMode(LED, OUTPUT); // Pin13 wird als Ausgang definiert.

}

void loop()

{

 if (IrReceiver.decode()) // Prüfen ob Daten vorhanden sind

 {

  IrReceiver.resume(); // nächsten Wert lesen

   if (IrReceiver.decodedIRData.address == 0)

   {

   if (IrReceiver.decodedIRData.command == 22) digitalWrite(LED, HIGH); // Taste 1 -> gelesener Deizimalwert 22 -> LED einschalten

   if (IrReceiver.decodedIRData.command == 25) digitalWrite(LED, LOW); // Taste 2 -> gelesener Deizimalwert 25 -> LED ausschalten

   }

 }

}

Funduino - Dein Onlineshop für Mikroelektronik

  • Dauerhaft bis zu 10 % Rabatt für Schüler, Studenten und Lehrkräfte
  • Mehr als 4.000 Artikel sofort verfügbar!
  • Mehr als 10 Jahre Erfahrung mit Arduino, 3D-Druck und co.
SALE

Anleitungen für Fortgeschrittene

Benötigst du Unterstützung bei deinem Projekt?

Alle Modelle der hier gezeigten Modelle sind hier zum Download  in einer kompakten Zip Datei verfügbar.