www.kappmeier.net
Elektronik-Basteleien
10. Juni 2025
IR-Signale verarbeiten
Eine sinnvolle Tätigkeit des Mikrocontrollers ist das
Auswerten des Infrarotsignales einer Fernbedienung. Im Falle
des DEALER wollen wir u.a. die Eingänge umschalten und die
Lautstärke einstellen.
Das Infrarotsignal eines Sender ist eigentlich nur die
serielle Abfolge von Nullen und Einsen. Um diese dem µC
zuzuführen benötigen wir ein elektronisches Bauteil welches
aus den Ultravioletten Lichtsignalen ein elektrisches Signal
formt.
Dazu verwenden wir ein Bauteil vom Typ VS1838 B
:
Zum 1838 sei gleich darauf hingewiesen das dieser
elektrisch sehr empfindlich reagiert, z.b. auf Verpolung,
Kontaktprobleme usw.. Bei mir sind ein paar im
Halbleiterhimmel gelandet.
Das Format der von einer IR-Fernbedienung gesendeten Daten
hängt von den Herstellern ab. Einige haben ein eigenes Format,
andere halten sich an Standards wie z.b. RC5. Da wir im
Arduino Umfeld nicht immer gleich das Rad neu erfinden müssen
gibt es für den IR Bereich eine wunderbare Library, mehr dazu
weiter unten.
Die Schaltung sieht dann wie folgt aus :
Neben dem IR Empfänger sind gleich noch ein paar Transistoren
und Relais hinzu gekommen. Die Ein- bzw. Ausgänge sind
wie folgt definiert :
Pin 4 (D2) = IR Eingang
Pin 11 (D5 )= Relais Mute
Pin 12 (D6) = Relais Eingang 1
Pin 13 (D7) = Relais Eingang 2
Pin 14 (D8) = Relais Eingang 3
Hier eine erste Form des Programms zum lesen der IR-Signale :
Beispielprogramm
1
Im Code sind ein paar weitere Neuerungen zu sehen. Dies wären
z.b. Array-Variablen. Geblieben aus dem vorherigen Beispiel
ist die Blink-Routine. Hier sieht man nun schön wie es ohne
Delay() besser läuft. Während der "Wartezeit" zwischen dem
LED-Wechsel kann das Programm alles andere durchführen. Erst
wenn die Differenz zum Timers zu groß geworden ist werden die
LEDs umgeschaltet.
Das Programm bindet die IR Library ein, initialisiert die
Variablen, setzt die Pins für das IR Signal und Relais
Ausgänge.
Da wir noch keine Fernbedienung festgelegt haben müssen wir
dessen Codes erst einmal ermitteln. Dazu gibt das Programm
erkannte IR-Signale über die serielle Schnittstelle als Werte
aus. Diese bestehen aus drei Dezimal-Werten :
Protokoll, Adresse und Kommando.
Das Protokoll entspricht dem Hersteller, bspw. Panasonic.
Einige Hersteller benutzen das NEC Prototkoll und werden auch
so angezeigt. Die Adresse ist dabei der Fernbedienung zu
zordnen. Interessant sind dann die Kommandos. Die
entsprechen den Tasten.
Hier mal eine kleine Übersicht einiger Fernbedienungen :
protocol
address
vendor
type of component
--------
-------
------
--------------------
4
8
Denon
CD-Player
8
1
muvid
IR715 Internet Radio
8
4
AOpen
XCcube PC
8
31879
NAD
CD-Player 512, Amp C316BEE
8
60688
Noname
DVD-Player
11
11
Panasonic
DVD-Recorder
11
9
Panasonic
S-VHS Recorder NV-FS100
20
7
Samsung
TV
17
0
Hauppage
WinTV Card
Wir müssen also zunächst auf dem gewünschten Sender die Tasten
der Reihe nach betätigen und deren Werte aus dem seriellen
Monitor ablesen. Dem aufmerksamen Beobachter ist ev.
aufgefallen das der Adress Wert für den NoName DVD-Player bei
60.688 liegt. Somit ist bei der Variablen Definition darauf zu
achten das ein einfaches int nicht reicht, sondern ein
uint16_t verwendet werden muss.
Wie man feststellten kann ist sowohl das Protokoll als auch
die Adresse eines Senders immer gleich. Trotzdem ist es
sinnvoll die Adresse nicht nur in einer Variablen für alle,
sondern mit einem Array für jede Taste einzeln zu speichern.
Im Falle des DEALER habe ich die Möglichkeit geschaffen eine
zweite Fernbedienung für die gleiche Funktion, z.b.
Lautstärke, zu verwenden. Durch separates Verwenden der
Adresse kann ein Sender eines anderen Herstellers verwendet
werden.
Nun können wir das Programm dahingehend erweitern das es auf
diese Werte reagiert :
Beispielprogramm 2
(Code folgt...)
Hier werden Variablen für die IR Commands und Adressen
definiert, welche wir mit den ermittelten Werten anpassen
müssen :
byte relayCMD[] = {251, 252, 253}; // IR command for relay 1, 2, 3
byte relayMuteCMD = 254; // IR command for relay 1, 2, 3
byte relayADR[] = {99, 99, 99}; // IR address for relay 1, 2, 3
byte relayMuteADR = 99;
mit relayCMD[0] haben wir den IR Wert des ersten Relays, mit
relayCMD[1] den des zweiten Relais und schlussendlich mit
relayCMD[3] den Wert des Dritten verfügbar.
Analog geht es mit der Adresse welche mit relayADR[0] usw.
gespeichert ist.
Im weiteren Verlauf des Programms hinzugekommen ist dann die
Abfrage der Codes um die Relais zu schalten.
Damit ist der erste Schritt getan und wir können mit
der Fernbedienung die Eingänge umschalten.
Das Ganze ist aktuell in Arbeit, Fortsetzung folgt...
zurück -
Startseite -
Impressum