====== 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: * **2x** Arduino Nano (Clone) *** HALJIA Digital 38 kHz Infrarot-I *R-Empfänger Sensor-Modul** * Anschluss des IR-Sendemoduls/IR-Empfängermoduls * **VCC** → an **5V** des Arduino * **GND** → an **GND** des Arduino * **Signal (S oder IN)** → hier an **Pin 7** des Arduino Die von uns verwendeten Sender haben leider nur eine **geringe Reichweite**. Berücksichtigen Sie dies beim Testen. {{ :inf:msr:infrarot_sr.png?400 |}} ☛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) === #include 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, ); ===== 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. #include 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 ====== * 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