Infrarotfernbedienung und -sensor

Erstellt von Niklas von Moers
Benötigtes Material
  • LED
  • Arduino Uno
  • USB-Kabel für den Arduino
  • Infrarotsensor
  • Infrarotfernbedienung
  • 2 male-female Kabel (oder male-male, je nach Modell des Infrarotsensors)
Benötigte Software
  • Bibliothek IRremote
Als PDF
PDF-Download
Arbeitsblatt
PDF-Download Lehrer
Lehrerblatt

Beschreibung

Der Infrarotsensor zusammen mit einer Infrarotfernbedienung dient dazu, den Arduino aus einigen Metern Entfernung zu steuern. Die eingesetzte infrarote Strahlung liegt dabei knapp außerhalb des für Menschen sichtbaren Spektrums.

Unterschiedliche Fernbedienungs-Modelle senden dabei unterschiedliche Signale aus. Die nicht gerade leichte Entschlüsselung dieser Signale wird glücklicherweise von der Arduino-Bibliothek “IRremote” übernommen, sodass die Nutzung eines Infrarotsensors sehr einfach ist. Diese Bibliothek ist bei der Standard-Installation der Arduino IDE nicht enthalten und muss daher über Werkzeuge -> Bibliotheken verwalten installiert werden.

Verwaltung der Bibliotheken

Verwaltung der Bibliotheken

Bibliothek IRsensor

Bibliothek IRsensor

Alternativ kann diese aus dem Internet (http://z3t0.github.io/Arduino-IRremote/) heruntergeladen werden.

Code/Beispiel

Da jede Fernbedienung andere Knöpfe hat und unterschiedliche Signale sendet, müssen wir zwei Sketches nutzen: Einen zum Konfigurieren der Fernbedienung und einen für das eigentliche Programm, welches wir ausführen möchten.

Das erste Programm sieht wie folgt aus:

// Skript zum Testen der Infrarot-Fernbedienung und des Infrarot-Sensors.

// Binde die Bibliothek "IRremote" ein.
#include <IRremote.h>

// Empfange das Signal in Pin 9.
int pin = 9;
// Erstelle ein Objekt namens infrarot_empfaenger von Typ IRrecv für den Pin
// namens irPin.
IRrecv infrarot_empfaenger(pin);
// Erstelle ein Objekt vom Typ decode_results zum Speichern der empfangenen
// Signale.
decode_results signale;

void setup() {
  // Initialisiere den seriellen Monitor (mit 9600 Bits pro Sekunde).
  Serial.begin(9600);
  // Erlaube es, dass Infrarot-Signale empfangen werden können.
  infrarot_empfaenger.enableIRIn();
}

void loop() {
  // Die Methode decode() gibt TRUE zurück, falls der Funktionsaufruf korrekt
  // ausgeführt wurde, also das Signal dekodiert werden konnte. &signale ist die
  // Adresse des Objektes signale im physischen Speicher des Arduinos.
  if (infrarot_empfaenger.decode(&signale)) {
    // signale.value greift auf den Wert value des Objektes signale zu.
    // Dieser Wert wird mithilfe von Serial.println() auf den seriellen Monitor
    // geschrieben. DEC spezifiziert, dass das Format eine Dezimalzahl ist.
    Serial.println(signale.value, DEC);
    // Erlaube es, dass weitere Infrarot-Signale empfangen werden können.
    infrarot_empfaenger.resume();
  }
}

Der Arduino wird wie unten beschrieben aufgebaut und dann wird dieses Programm hochgeladen. Dann wird der serielle Monitor mit der Lupe Lupe geöffnet. Drückt man nun Knöpfe auf der Infrarotfernbedienung, so sollte die im Infrarotsensor eingebaute LED aufleuchten und zehnstellige Zahlen auf dem seriellen Monitor erscheinen.

Drückt man denselben Knopf auf der Fernbedienung, so sollte auch dieselbe Zahl auf dem seriellen Monitor erscheinen.

Achtung!

Es kann sein, dass zwei verschiedene Zahlen beim mehrfachen Drücken desselben Knopfes erscheinen, etwa wenn man den Knopf mal länger und mal kürzer drückt. Man sollte dann die Zahl nehmen, die am häufigsten auftaucht.

Nun sollte man sich die Zahlen notieren, welche zu den Knöpfen gehören, mit welchen man den Arduino später steuern möchte. Diese kann man auch mit der Tastenkombination STRG+C kopieren, nachdem man die Zahl mit der Maus markiert hat. Mit STRG+V fügt man diese an anderer Stelle ein. In diesem Beispiel nutzen wir die Zahlen für die Variablen INFRAROT_SIGNAL_AN und INFRAROT_SIGNAL_AUS im folgenden Programm:

// Skript zum Steuern einer LED mithilfe des Infrarot-Sensors.

// Binde die Bibliothek "IRremote" ein.
#include <IRremote.h>

int irPin  = 9;
int ledPin = 13;

// Erstelle ein Objekt vom Typ IRrecv für den Pin namens irPin.
IRrecv infrarot_empfaenger(irPin);
// Erstelle ein Objekt vom Typ decode_results zum Speichern der empfangenen
// Signale.
decode_results signale;

// Ersetze diese Zahlen mit denen des seriellen Monitors.
long INFRAROT_SIGNAL_AN  = 3772784863;
long INFRAROT_SIGNAL_AUS = 3772817503;

void setup() {
  // Erlaube es, dass Infrarot-Signale empfangen werden können.
  infrarot_empfaenger.enableIRIn();
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  // Die Methode decode() gibt TRUE zurück, falls der Funktionsaufruf korrekt
  // ausgeführt wurde, also das Signal dekodiert werden konnte. &signale ist die
  // Adresse des Objektes signale im physischen Speicher des Arduinos.
  if (infrarot_empfaenger.decode(&signale)) {
    Serial.println(signale.value, DEC);
    // Entspricht das empfangene Signal dem an-Knopf?
    if (signale.value == INFRAROT_SIGNAL_AN) {
      // Schalte die LED ein.
      digitalWrite(ledPin, HIGH);
      // Entspricht das empfangene Signal dem aus-Knopf?
    } else if (signale.value == INFRAROT_SIGNAL_AUS) {
      // Schalte die LED aus.
      digitalWrite(ledPin, LOW);
    }
    // Erlaube es, dass weitere Infrarot-Signale empfangen werden können.
    infrarot_empfaenger.resume();
  }
}

Dieses Programm empfängt durch den Infrarotsensor Signale. Entsprechen die Signale dem Drücken der jeweiligen Knöpfe auf der Infrarotfernbedienung, so wird die LED an- oder ausgeschaltet.

Für den Einsatz eines Infrarotsensor sind der Phantasie keine Grenzen gesetzt. Beispielsweise lassen sich hiermit mit einer Fernbedienung für den Fernseher gleichzeitig die Lautstärke und die Helligkeit einer LED regeln, wenn man mithilfe eines Potentiometers den Widerstand des Stromkreises steuert.

Verkabelung/Aufbau

Schaltplan

Schaltplan

Aufgaben

Überlege dir, was man mit einem Arduino und einem Infrarotsensor steuern könnte!

Versuche herauszufinden, aus welcher Entfernung du den Arduino mit deiner Fernbedienung steuern kannst.

Versuche herauszufinden, in welchem Winkel die Fernbedienung maximal zum Sensor gehalten werden darf, damit dieser noch die Signale emfängt.

Versuche herauszufinden, durch welche Materialien das infrarote Licht geblockt wird (z.B. Glas, durchsichtige Folien in verschiedenen Farben, Papier, Pappe, Metal usw.).

Stelle ein Hindernis zwischen dem Sensor und der Fernbedienung auf und versuche den Arduino mit Hilfe eines Spiegels zu steuern. Funktioniert das?

Wie könnte man das Programm abändern, sodass man mit nur einem Knopf die LED an- und ausschalten kann?

Man könnte sich mithilfe einer Variablen merken, ob die LED bereits an ist, und je nachdem sie ein- oder ausschalten.

// Skript zum Steuern einer LED mithilfe des Infrarot-Sensors.

// Binde die Bibliothek "IRremote" ein.
#include <IRremote.h>
int irPin  = 9;
int ledPin = 13;

// Erstelle ein Objekt vom Typ IRrecv für den Pin namens irPin.
IRrecv infrarot_empfaenger(irPin);
// Erstelle ein Objekt vom Typ decode_results zum Speichern der empfangenen
// Signale.
decode_results signale;

// Ersetze diese Zahl mit der des seriellen Monitors.
long INFRAROT_SIGNAL = 3772784863;

// Zum Abspeichern, ob die LED an oder aus ist.
bool ledIsOn = False;

void setup() {
  // Erlaube es, dass Infrarot-Signale empfangen werden können.
  infrarot_empfaenger.enableIRIn();
  pinMode(ledPin, OUTPUT);
  // Initialisiere den seriellen Monitor (mit 9600 Bits pro Sekunde).
  Serial.begin(9600);
}

void loop() {
  // Die Methode decode() gibt TRUE zurück, falls der Funktionsaufruf korrekt
  // ausgeführt wurde, also das Signal dekodiert werden konnte. &signale ist die
  // Adresse des Objektes signale im physischen Speicher des Arduinos.
  if (infrarot_empfaenger.decode(&signale)) {
    Serial.println(signale.value, DEC);
    // Entspricht das empfangene Signal dem an-Knopf?
    if (signale.value == INFRAROT_SIGNAL) {
      // Ist die LED bereits an?
      if (ledIsOn) {
        // Falls ja, schalte sie aus.
        digitalWrite(ledPin, LOW);
      } else {
        // Falls nein, schalte sie an.
        digitalWrite(ledPin, HIGH);
      }
      // Setze den Wert auf das Gegenteil (True -> False oder False -> True).
      ledIsOn = !ledIsOn;
    }
    // Erlaube es, dass weitere Infrarot-Signale empfangen werden können.
    infrarot_empfaenger.resume();
  }
}

Schließe mehrere, verschiedenfarbige LEDs an den Arduino an und programmiere die Fernbedienung so, dass du jede einzeln an- und ausschalten kannst. Programmiere dann eine Taste, mit der du alle an- oder ausschalten kannst.

Programmiere eine Taste deiner Fernbedienung so, dass die LED drei mal blinkt. Dann programmiere zwei weiter Tasten so, dass du mit diesen einstellen kannst, wie schnell die LED beim Drücken der ersten Taste blinkt (schneller oder langsamer).

Häufige Fragen und Probleme

Warum funktioniert mein Infrarotsensor nicht?

  • Falls die eingebaute LED des Infrarotsensors nicht leuchtet, ist dieser vermutlich beschädigt (Achtung: Es könnte Modelle ohne interne LED geben). Da diese Sensoren günstig sind, ist es sinnvoll, mehrere zu bestellen.
  • Sind in der Fernbedienung geladene Batterien?
  • Ist die Verkabelung richtig?
  • Kommen die richtigen Signale an? Mithilfe des seriellen Monitors lässt sich dies überprüfen.

Muss die Fernbedienung direkten “Sichtkontakt” mit dem Infrarotsensor haben?

Nein, denn die meisten Flächen reflektieren die infrarote Strehlung, sodass man den Arduino theoretisch auch um die Ecke steuern kann.

Kann man infrarotes Licht sehen?

Infrarot hat eine Wellenlänge von 780 nm bis 1 mm. Das menschliche Auge kann Wellenlängen von etwa 380 nm bis 780 nm wahrnehmen. Daher ist infrarotes Licht im Allgemeinen unsichtbar für den Menschen. Auch für die meisten Haustiere ist infrarotes Licht unsichtbar. Einige Schlangen, Fische und Insekten hingegen können infrarotes Licht wahrnehmen.

Das Material und dessen Inhalte sind - sofern nicht anders angegeben - lizenziert unter der Creative Commons Lizenz CC BY-NC-SA 4.0 (für den vollständigen Lizenztext siehe https://creativecommons.org/licenses/by-sa/4.0/legalcode )