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.
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:
- HALJIA Digital 38 kHz Infrarot-I *R-Empfänger Sensor-Modul
- Arduino Nano (Clone)
☛Sender und Empfänger haben eine rote LED, die anzeigt, ob ein Signal gesendet bzw. empfangen wurde. Dies ist für das Debuggen hilfreich.
Die von uns verwendeten Sender haben leider nur eine geringe Reichweite. Berücksichtigen Sie dies beim Testen.
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
Signaldarstellung am Oszilloskop
TODO
Quellcode (engl. Sourcecode)
TODO
Quellen
- Verwendung der neuen Version: https://github.com/Arduino-IRremote/Arduino-IRremote?tab=readme-ov-file#converting-your-2x-program-to-the-4x-version
- Analyse der Signale https://wolles-elektronikkiste.de/ir-fernbedienungen
- Analyse der Signale https://devxplained.eu/de/blog/infrarot-empfaenger