Arduino Mikrocontroller Tutorials - Module

Infrarot Fernbedienung - Sender

IR Sendediode Schaltplan IR Sendediode mit Transistoransteuerung

Die hier verwendete IR LED hat ein Stromverbrauch von rund 50mA bei 1,5V Spannungsversorgung. Damit der µC Ausgang nicht überlastet, wird die LED über einen Transistor angesteuert. Die Berechnung LED Vorwiderstandes ergibt einen Wert von RL = 3,5V/0,050A ~ 100 Ohm und die Berechnung des Transistor Basiswiderstandes einen Wert von RT = 4,3 V/ 0,0005A ~ 10K Ohm.

Würde man die IR Diode nun bestromen würde sie dauerhaft "leuchten". Damit der Fernbedienungsempfänger aber auf das Signal reagiert muss die IR LED mit der Geschwindigkeit von 38 KHz an- und ausgeschaltet werden.

Um diese Trägerfrequenz zu erzeugen schreiben wir eine Funktion. Dieser Funktion übergeben wir die Zeit in µs wie lange das 38KHz Signal ausgestrahlt werden soll. PORTD |= (1<<PD2) und PORTD &= ~(1<<PD2) sind spezielle Registerschreibweisen die vom µC wesentlich schneller ausgeführt werden als digitalWrite(2, HIGH) und digitalWrite(2, LOW). Die Verwendung der Portregister wird im Kapitel Software / Portregister beschrieben. Die Zeitdauer der HIGH und LOW Pegel ergibt sich mit Periode = 1000000µs / 38000Hz = 26,3µs. Also 13µs an und 13µs aus.

void burst(long ms) { while (ms > 0) { PORTD |= (1<<PD2); delayMicroseconds(13); PORTD &= ~(1<<PD2); delayMicroseconds(13); // nach jeder Periode wird die Laufzeit um 26µs verkürzt ms -= 26; }

Mit dem Programm im vorhergegangen Kapitel Module / Fernbedienung - Empfänger wurde ein spezifischer Tastencode (Power ON/OFF) aufgenommen. Nun wird mit dem folgenden Sendesketch dieser 32 Bit Code mit dem NEC Protokoll gesendet. Die Details zum NEC-Protokoll sind im Kapitel über den Infrarotempfänger beschrieben.

NEC Protokoll: Startsignal - Wartezeit - 32 Bit Daten - Endsignal

Programmcode

bool sendeDaten[] = {1,1,1,1,1,1,1,1, // PWR ON-OFF 0,0,0,0,0,0,0,0, 1,1,1,1,1,1,0,1, 0,0,0,0,0,0,1,0}; // Parameter für NEC Protokoll in µs const int bits = 32; const int startT = 9000; const int waitT = 4450; const int burstT = 560; const int H_waitT = 560; const int L_waitT = 1690; void setup() { pinMode(2, OUTPUT); } void loop() { burst(startT); // Startsignal delayMicroseconds(waitT); // Wartezeit for (int i = 0; i < bits; i++) { burst(burstT); if (sendeDaten[i] == 1) delayMicroseconds(H_waitT); else delayMicroseconds(L_waitT); } burst(burstT); // Endsignal // Sendung wird alle 10 Sekunden wiederholt delay(10000); }
Funktion: ergebnisAusgeben() void burst(long ms) { while (ms > 0) { // 38 kHz sind 13 µs HIGH und 13 µs LOW PORTD |= (1<<PD2); delayMicroseconds(13); PORTD &= ~(1<<PD2); delayMicroseconds(13); // nach jeder Periode wird die Laufzeit um 26µs verkürzt ms -= 26; } }