Infrarot Fernbedienung - Sender
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;
}
}