Raspberry Pi Pico: Samsung-Fernseher mit IR-Transmitter steuern (einschalten und ausschalten)

Mit einem Raspberry Pi Pico lässt sich eine Fernbedienung für einen Fernseher realisieren. Als Beispiel steuern wir einen Samsung-Fernseher über Infrarot und verwenden dazu ein IR-Transmitter-Modul mit einer Infrarot-LED mit einer Wellenlänge von 940 nm, über die die Steuersignale an den Fernseher gesendet werden.

Damit der Fernseher die Signale korrekt erkennt, müssen diese mit der passenden Trägerfrequenz und dem richtigen Timing übertragen werden. Das IR-Transmitter-Modul allein erzeugt die dafür notwendige Modulation nicht. Deshalb übernimmt der Raspberry Pi Pico diese Aufgabe. Samsung-Fernseher verwenden typischerweise eine Infrarot-Trägerfrequenz von 38 kHz. Der Pico kann diese Frequenz mithilfe seiner PWM-Funktion (Pulsweitenmodulation) erzeugen und die Infrarot-LEDs entsprechend ansteuern.

Als Beispiel implementieren wir die Power-Funktion, mit der sich der Fernseher ein- und ausschalten lässt. Dazu erzeugt der Raspberry Pi Pico aus einem Hexcode das passenden Infrarot-Signal und sendet es über das Transmitter-Modul. Der Fernseher empfängt und interpretiert das Signal wie den Befehl einer herkömmlichen Samsung-Fernbedienung. Auf diese Weise verhält sich der Pico wie eine einfache Infrarot-Fernbedienung, die sich später um weitere Funktionen wie Lautstärkeregelung oder Programmwechsel erweitern lässt.

Aufbau und Bauteile

Raspberry Pi Pico: Samsung-Fernseher mit IR-Transmitter steuern (einschalten und ausschalten)

Raspberry Pi Pico IR-Transmitter
Pin 21 GPIO 16 DAT (IN)
Pin 38 GND GND
Pin 37 3V3 VCC

Programmcode

Der Programmcode steuert einen Infrarot-Transmitter mit einem Raspberry Pi Pico, um einen Samsung-Fernseher per Tastendruck zu bedienen. Beispielhaft wird hier das Power-Kommando (Hexcode) zum Einschalten und Ausschalten verwendet.

Die auskommentierten IR-Codes können durch Aktivieren der entsprechenden Zeile für weitere Funktionen wie Lautstärke, Kanalwechsel oder Navigation verwendet werden. Diese IR-Codes sind aber nicht alle geprüft.

  • Initialisierung der GPIOs für den Taster, den IR-Transmitter und die Onboard-LED.
  • Per PWM-Signal wird ein 38-kHz-Trägersignal zur Übertragung der Kommandos per Infrarot erzeugt.
  • Das Kommando, in Form eines 32-Bit-Hexcodes, wird per Infrarot 2 mal übertragen. 
  • Mit dem Taster wird das Senden des IR-Codes ausgelöst.
  • Das Hauptprogramm mit der Endlosschleife überwacht den Taster. Nach dem Loslassen wird eine kurze Pause eingelegt, um Mehrfachauslösungen zu vermeiden.
# Bibliotheken laden
import machine
import time

# Konfiguration: GPIO-Pins
GPIO_BUTTON     = 15
GPIO_IR_DAT     = 16
GPIO_LED_ONBARD = 25

# Taster initialisieren
remote_button = machine.Pin(GPIO_BUTTON, machine.Pin.IN, machine.Pin.PULL_UP)

# Onboard-LED initialisieren
led = machine.Pin(GPIO_LED_ONBARD, machine.Pin.OUT, value=0)

# PWM für IR-Transmitter initialisieren
pwm = machine.PWM(GPIO_IR_DAT)
pwm.freq(38000)  # 38 kHz (NEC/Samsung)
pwm.duty_u16(0)

# IR-Codes für Samsung-Fernseher (unvollständig und ungeprüft)
IR_CODE = 0xE0E040BF  # Power
#IR_CODE = 0xE0E0E01F  # VolumeUp
#IR_CODE = 0xE0E0D02F  # VolumeDown
#IR_CODE = 0xE0E0F00F  # Mute
#IR_CODE = 0xE0E0807F  # Source
#IR_CODE = 0xE0E048B7  # ChannelUp
#IR_CODE = 0xE0E008F7  # ChannelDown
#IR_CODE = 0xE0E006F9  # Up
#IR_CODE = 0xE0E08679  # Down
#IR_CODE = 0xE0E0A659  # Left
#IR_CODE = 0xE0E046B9  # Right
#IR_CODE = 0xE0E016E9  # Enter
#IR_CODE = 0xE0E01AE5  # Return
#IR_CODE = 0xE0E058A7  # Menu
#IR_CODE = 0xE0E0F20D  # Guide
#IR_CODE = 0xE0E0F807  # Info
#IR_CODE = 0xE0E0B44B  # Exit
#IR_CODE = 0xE0E036C9  # Red
#IR_CODE = 0xE0E028D7  # Green
#IR_CODE = 0xE0E0A857  # Yellow
#IR_CODE = 0xE0E06897  # Blue
#IR_CODE = 0xE0E0E21D  # Play
#IR_CODE = 0xE0E052AD  # Pause
#IR_CODE = 0xE0E0629D  # Stop
#IR_CODE = 0xE0E012ED  # FastForward
#IR_CODE = 0xE0E0A25D  # Rewind

# IR-Funktion: 38-kHz-IR-Träger einschalten
def mark(duration_us):
    pwm.duty_u16(32768)
    time.sleep_us(duration_us)

# IR-Funktion: IR-Träger ausschalten
def space(duration_us):
    pwm.duty_u16(0)
    time.sleep_us(duration_us)

# IR-Funktion: 32-Bit IR-Code senden
def send_code(code):
    # Startsignal
    mark(4500)
    space(4500)
    # 32 Bit, MSB zuerst
    for i in range(31, -1, -1):
        mark(560)
        if code & (1 << i):
            space(1690)
        else:
            space(560)
    # Stop
    mark(560)
    pwm.duty_u16(0)

# Funktion: Taster verarbeiten
def send_command(code, name):
    print(name)
    # LED einschalten
    led.value(1)
    # IR-Befehl 2 mal senden
    send_code(code)
    time.sleep_ms(40)
    send_code(code)
    # kurze Entprellzeit
    time.sleep_ms(100)
    # LED ausschalten
    led.value(0)

# Hauptprogramm
print("Fernbedienung bereit")

while True:
    # Taster wird gerück
    if remote_button.value() == 0:
        send_command(IR_CODE, "POWER")
        # Warten bis Taster losgelassen wird
        while remote_button.value() == 0: time.sleep_ms(10)
        time.sleep_ms(200)
    # Verzögerung
    time.sleep_ms(10)

Weitere verwandte Themen:

Elektronik-Sets für das Hardware-nahe Programmieren

Der Elektronik-Kompendium Club ist ein Online-Treffpunkt für Hobby-Elektroniker und Maker.

Wir wollen:

  • Anregungen und Lösungen von echten Menschen bekommen
  • Menschen zusammenbringen und gemeinsam wachsen
  • Erfahrungen machen und teilen

Jetzt mehr erfahren und Mitglied werden

Elektronik-Kompendium Club Meeting

Elektronik-Sets für das Hardware-nahe Programmieren

Frag Elektronik-Kompendium.de