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