Inhaltsverzeichnis

Infrarot senden und empfangen von Infrarot-Signalen.

Infrarot-Signale werden häufig für die drahtlose Kommunikation zwischen Geräten verwendet, etwa bei Fernbedienungen. In diesem Artikel wird gezeigt, wie man mit einem Arduino-Nano Infrarot-Signale senden und empfangen kann. Dabei kommt das NEC-Protokoll zum Einsatz, ein weit verbreitetes Standardprotokoll für IR-Übertragungen. Grundlagen zur Signalstruktur werden am Oszilloskop untersucht. Praktische Beispiele helfen, die Funktionsweise zu verstehen und eigene Projekte umzusetzen. Zudem wird der grundsätzliche Umgang mit der Arduino-Bibliothek IRremote erklärt. Für ein vertieftes Verständnis wird außerdem gezeigt, wie Signale ohne Bibliothek empfangen werden können.

Voraussetzungen

Für die Signalübertragung per Infrarot wird hier das NEC-Protokoll verwendet. Insbesondere das Beispiel mit dem Oszilloskop setzt Kenntnisse über das Protokoll voraus.

Informieren Sie sich im Internet, wie das NEC-Protokoll aufgebaut ist und wie die Signalübertragung mit Infrarot grundsätzlich funktioniert.

Das NEC-Protokoll überträgt insgesamt 4 Byte (32 Bit). Wie diese Daten in binärer, dezimaler oder hexadezimaler Form dargestellt werden können, muss ebenfalls bekannt sein, um die Inhalte dieser Abschnitte zu verstehen.

Hardware

Es gibt zahlreiche Empfänger- und Sender-Module, die verwendet werden können. Hier wird folgende Hardware genutzt:

Die von uns verwendeten Sender haben leider nur eine geringe Reichweite. Berücksichtigen Sie dies beim Testen.

☛Sender und Empfänger haben eine rote LED, die anzeigt, ob ein Signal gesendet bzw. empfangen wurde. Dies ist für das Debuggen hilfreich.

Infrarot mit Arduino-Bibliothek

Empfangen von Infrarot-Signalen

Dieser Arduino-Code empfängt Infrarot-Signale über Pin 7 und nutzt die `IRremote`-Bibliothek (IRremote - Joachimsmeyer 4.4.1). Die empfangenen Signale, beispielsweise von einer Infrarot-Fernbedienung, werden auf der seriellen Schnittstelle ausgegeben.

Quellcode (engl. Sourcecode)

Listing 1:receiver.ino

#include <IRremote.hpp>

int IR_RECEIVE_PIN=7;
void setup(){
  Serial.begin(9600);
  IrReceiver.begin(IR_RECEIVE_PIN, ENABLE_LED_FEEDBACK); 
}

void loop() {
  if (IrReceiver.decode()) {
    Serial.println("=== RECEIVING DATA ===");
    // Print "old" raw data   
    Serial.print("RawData: ");
    Serial.println(IrReceiver.decodedIRData.decodedRawData, HEX);
    // Print command  
    uint16_t cmd = IrReceiver.decodedIRData.command;
    uint16_t add = IrReceiver.decodedIRData.address;
    Serial.print("command: ");
    Serial.println(cmd,HEX);
     Serial.print("address: ");
    Serial.println(add,HEX);
    //decode_type_t p = IrReceiver.decodedIRData.protocol;
    Serial.println("Info...");
    // Print complete received data in one line
    IrReceiver.printIRResultShort(&Serial); 
    Serial.println("more Info...");
    IrReceiver.printIRSendUsage(&Serial);      
    IrReceiver.resume(); // Enable receiving of the next value
  }
}
Beispiel: Makeblock Fernbedienung

Der obige Code erzeugt die folgende Ausgabe, wenn ‚A‘ mit der Makeblock-Fernbedienung gesendet wird. Diese wird von einem Arduino Nano über die serielle Schnittstelle ausgegeben.

=== RECEIVING DATA ===
RawData: BA45FF00
command: 45
address: 0
Info...
Protocol=NEC Address=0x0 Command=0x45 Raw-Data=0xBA45FF00 32 bits LSB first
more Info...
Send with: IrSender.sendNEC(0x0, 0x45, <numberOfRepeats>);

Senden von Infrarot-Signalen

Dieser Arduino-Code sendet Infrarot-Signale über Pin 7 und nutzt die IRremote-Bibliothek (IRremote - Joachimsmeyer 4.4.1). Die gesendeten Signale, hier das Signal 'A' von einer Makeblock-Fernbedienung, werden zur Demonstration auf zwei verschiedene Arten übertragen.

Lässt man diesen Code auf einem Arduino Nano laufen und den weiter oben stehenden Code (receiver.ino) auf einem anderen Arduino, kann man beim Empfänger über die serielle Schnittstelle die Ausgabe betrachten.

Listing 1:sender.ino

#include <IRremote.hpp>

int IR_SEND_PIN = 7;
IRsend irsend(IR_SEND_PIN);
uint16_t address = 0;
uint8_t cmd = 0x45; // Makeblock Code Button_A!
uint32_t rawData = 0xBA45FF00; // Makeblock Signal 'A'!

void setup() {
  Serial.begin(9600);
}

void loop() {
  Serial.print("Sending NEC signal with rawData: ");
  Serial.print(rawData, HEX);
  irsend.sendNECRaw(rawData, 1);
  delay(5000);

  Serial.print("Sending NEC signal with command: ");
  irsend.sendNEC(address, cmd, 1);
  delay(5000);
}

Infrarot-Signale ohne Bibliothek empfangen

TODO

Quellcode (engl. Sourcecode)

TODO

Signaldarstellung am Oszilloskop

TODO

Quellen