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 :         

VS1838B    

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 :


ATmega-IR-Relais



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