Zum Inhalt springen
SONOYA.com
Raspberry Pi & Linux

Anleitung: USB-IR-Sender für Raspberry Pi selbst bauen

Alter Kenwood-Receiver ohne Netzwerk, aber mit Raspberry Pi und HiFiBerry daneben? Mit einem selbstgelöteten USB-Infrarotsender für rund 15 Euro schaltest Du den KRV-6030 per Kommandozeile ein und aus und regelst die Lautstärke …

Von Sonoya Redaktion 9 Min. Lesezeit
Anleitung: USB-IR-Sender für Raspberry Pi selbst bauen

Dein alter Kenwood KRV-6030 spielt noch immer prima, hat aber keine Netzwerkbuchse und keine Schnittstelle, über die ein Computer ihn steuern könnte. Er reagiert nur auf die Infrarot-Fernbedienung. Wenn daneben ein Raspberry Pi mit HiFiBerry die Musik liefert, möchtest Du den Receiver meist trotzdem per Befehl einschalten und die Lautstärke ändern können. Genau das baust Du hier: einen kleinen Infrarotsender, der in einen USB-Port des Pi gesteckt wird, sein Signal direkt aus dem USB-Anschluss bezieht und auf einen Befehl wie kenwood POWER hin die passenden Fernbedienungssignale an den Receiver schickt.

Der KRV-6030 ist dabei nur das Beispiel. Dasselbe Prinzip funktioniert mit jedem älteren Gerät, das nur eine Infrarot-Fernbedienung hat, und am Ende des Artikels zeige ich Dir, was Du dafür anpassen musst.

Warum ein USB-Sender und nicht der GPIO-Header?

Ein HiFiBerry sitzt als Aufsteckplatine auf dem Header des Pi und belegt dort die I2S-Pins für die Audioausgabe. Ein Infrarotsender direkt am GPIO müsste sich mit dem Aufbau, den Device-Tree-Overlays und der Verkabelung rund um das HAT vertragen. Die USB-Variante umgeht das komplett: Der Sender hängt außen am Pi, braucht keine Konfiguration im Betriebssystem und lässt sich jederzeit abziehen. Außerdem erzeugt ein Mikrocontroller das 38-kHz-Signal der Fernbedienung zeitlich exakt, während der Pi nur eine Textzeile über USB schickt.

So ist der Sender aufgebaut

Die Schaltung besteht aus nur drei Teilen. Ein Arduino Pro Micro mit dem Chip ATmega32U4 ist die Steuerlogik und zugleich die Platine mit USB-Anschluss: Er meldet sich am Pi als serielle Schnittstelle /dev/ttyACM0 an und wird vollständig über USB mit Strom versorgt. Ein NPN-Transistor schaltet den Strom für die Infrarot-LED, denn ein Pin des Mikrocontrollers soll nicht selbst den LED-Strom liefern. Die LED sitzt am Ende eines kurzen Kabels und wird später vor das Infrarotfenster des Receivers geklebt.

Es gibt auch Mini-Platinen mit fest angebautem USB-A-Stecker, etwa den Digispark mit ATtiny85. Sie bringen aber keine zuverlässige serielle Schnittstelle für Linux mit und lassen sich auf der Kommandozeile deutlich umständlicher ansprechen. Den Pro Micro verbindest Du stattdessen mit einem kurzen USB-Kabel, sodass die Strecke vom Pi zum Sender trotzdem nur wenige Zentimeter lang bleibt.

Einkaufsliste

Alles zusammen kostet je nach Händler ungefähr 15 Euro. Achte beim Bestellen auf diese genauen Bezeichnungen:

Dazu brauchst Du einen Lötkolben mit Lötzinn, einen Seitenschneider und etwas Fixierknete, mit der Du die LED später ohne Kleberückstände vor dem Receiver befestigst. Ein Multimeter ist praktisch, aber nicht zwingend.

Schaltplan und Bauteilwerte

So werden die Teile verbunden. Der Pin 3 und der Pin VCC sind auf dem Pro Micro so beschriftet:

Code
Pro Micro Pin 3 ---- 1 kOhm ---- Basis (B)       BC337
Pro Micro GND ------------------ Emitter (E)     BC337
                                 Kollektor (C)   BC337 ---- Kathode (-) der IR-LED
Pro Micro VCC ---- 100 Ohm ----------------------------- Anode (+) der IR-LED

Beim BC337 liest Du die Anschlüsse so ab: Halte den Transistor mit den Beinchen nach unten und der flachen Seite zu Dir, dann sind die Beinchen von links nach rechts Kollektor, Basis, Emitter. Bei der LED ist das längere Beinchen die Anode (Plus), das kürzere mit der abgeflachten Gehäuseseite die Kathode.

Die Widerstände ergeben sich aus einer kurzen Rechnung. Die TSAL6200 hat bei Stromfluss eine Flussspannung von rund 1,3 Volt, der durchgeschaltete Transistor verbraucht etwa 0,2 Volt. Mit 5 Volt Versorgung bleiben 3,5 Volt für den Vorwiderstand. Bei 100 Ohm fließen damit etwa 35 Milliampere durch die LED. Das ist für einen Abstand von wenigen Zentimetern zum Receiver mehr als genug und für die LED im getakteten Betrieb völlig unkritisch. Der 1-Kiloohm-Widerstand an der Basis begrenzt den Strom aus dem Pin auf rund 4 Milliampere und sättigt den Transistor sicher.

Schritt 1: Schaltung auf der Platine löten

Falls Dein Pro Micro ohne eingelötete Stiftleisten geliefert wurde, lötest Du sie zuerst an. Setze den Pro Micro dann so auf die Lochrasterplatine, dass der USB-Anschluss über die Platinenkante hinausragt, und verlöte alle Pins.

Danach arbeitest Du diese Verbindungen der Reihe nach ab:

  1. Setze den BC337 in die Nähe des Pins 3 und verlöte den 1-Kiloohm-Widerstand zwischen Pin 3 und der Basis des Transistors.
  2. Verbinde den Emitter des Transistors mit einem GND-Pin des Pro Micro.
  3. Lege den 100-Ohm-Widerstand an den Pin VCC und führe sein freies Ende auf eine Lötinsel an der Platinenkante, an der später die Anodenader des LED-Kabels hängt.
  4. Führe den Kollektor des Transistors auf eine zweite Lötinsel direkt daneben, an der die Kathodenader hängt.

Prüfe danach mit Blick auf die Unterseite, dass kein Lötzinn zwei benachbarte Bahnen verbindet.

Schritt 2: LED an das Kabel löten

Schneide ein Stück des zweiadrigen Kabels auf die Länge zwischen Pi und Receiver zu, halte es aber so kurz wie möglich. Schiebe auf jede Ader ein kleines Stück Schrumpfschlauch und verlöte die beiden LED-Beinchen mit den Adern: Das lange Beinchen (Anode) gehört an die Ader, die Du mit einem Filzstift markierst, das kurze Beinchen (Kathode) an die andere. Schiebe den Schrumpfschlauch über die Lötstellen und erwärme ihn, damit sich die Beinchen nicht berühren können.

Das andere Kabelende lötest Du an die Platine: die markierte Ader an die Lötinsel mit dem 100-Ohm-Widerstand, die unmarkierte Ader an die Insel mit dem Kollektor.

Schritt 3: Firmware auf den Pro Micro laden

Die Firmware spielst Du einmalig von einem Mac oder PC aus auf den Pro Micro. Installiere dafür die Arduino IDE und öffne dort Werkzeuge > Bibliotheksverwalter. Suche nach IRremote und installiere die Bibliothek von Armin Joachimsmeyer in der Version 4.x. Den Quellcode und die Dokumentation findest Du im offiziellen Repository der IRremote-Bibliothek.

Verbinde den Pro Micro mit Deinem Rechner, wähle unter Werkzeuge > Board den Eintrag Arduino Leonardo und unter Werkzeuge > Port den neuen USB-Port. Füge dann diesen Sketch ein und klicke auf Hochladen:

Code
#include <IRremote.hpp>

const uint8_t SENDE_PIN = 3;
const uint8_t KENWOOD_ADRESSE = 0xB8;

struct Befehl {
  const char *name;
  uint8_t code;
};

const Befehl BEFEHLE[] = {
  {"POWER", 0x9D},
  {"VOL+", 0x9B},
  {"VOL-", 0x9A},
  {"MUTE", 0x9C},
  {"PHONO", 0x90},
  {"TUNER", 0x91},
  {"CD", 0x92},
  {"VIDEO2", 0x93},
  {"TAPE1", 0x94},
  {"TAPE2", 0x95},
  {"VIDEO1", 0x96},
  {"PRESET+", 0x99},
  {"PRESET-", 0x8C},
  {"BAND", 0x8F}
};
const uint8_t ANZAHL_BEFEHLE = sizeof(BEFEHLE) / sizeof(BEFEHLE[0]);

void setup() {
  Serial.begin(9600);
  IrSender.begin(SENDE_PIN);
}

void loop() {
  if (!Serial.available()) {
    return;
  }
  String zeile = Serial.readStringUntil('\n');
  zeile.trim();
  zeile.toUpperCase();

  String name = zeile;
  int wiederholungen = 1;
  int leerzeichen = zeile.indexOf(' ');
  if (leerzeichen > 0) {
    name = zeile.substring(0, leerzeichen);
    wiederholungen = zeile.substring(leerzeichen + 1).toInt();
    if (wiederholungen < 1) {
      wiederholungen = 1;
    }
  }

  for (uint8_t i = 0; i < ANZAHL_BEFEHLE; i++) {
    if (name == BEFEHLE[i].name) {
      for (int n = 0; n < wiederholungen; n++) {
        IrSender.sendNEC(KENWOOD_ADRESSE, BEFEHLE[i].code, 0);
        delay(150);
      }
      return;
    }
  }
}

Der Sketch wartet auf eine Textzeile über USB, sucht den Namen in der Befehlstabelle und sendet den zugehörigen Code im NEC-Protokoll an den Pin 3. Optional kannst Du hinter dem Namen eine Zahl angeben, dann wird der Befehl so oft hintereinander gesendet, was für mehrere Lautstärkeschritte praktisch ist. Schlägt der Upload fehl, brücke zweimal kurz hintereinander die Pins RST und GND, um den Bootloader zu starten, und lade den Sketch noch einmal hoch.

Schritt 4: Den Befehl auf dem Raspberry Pi einrichten

Stecke den Pro Micro jetzt mit dem kurzen Kabel in einen USB-Port des Pi und prüfe, ob er als serielle Schnittstelle erkannt wurde:

Code
ls /dev/ttyACM*

Erscheint dort /dev/ttyACM0, ist alles in Ordnung. Dein Benutzer muss außerdem Mitglied der Gruppe dialout sein, was beim ersten Benutzer von Raspberry Pi OS standardmäßig der Fall ist. Das kontrollierst Du mit groups. Legst Du neben dem Sender noch andere serielle USB-Geräte an, kann sich die Nummer ändern, dann findest Du mit ls /dev/serial/by-id/ einen festen Namen, den Du im Skript einträgst.

Lege nun das Hilfsskript an, das aus dem Befehl einen Textzeilen-Aufruf macht:

Code
sudo nano /usr/local/bin/kenwood

Füge diesen Inhalt ein, speichere mit Strg + O, bestätige mit Enter und schließe den Editor mit Strg + X:

Code
#!/bin/bash
PORT=/dev/ttyACM0
if [ -z "$1" ]; then
  echo "Aufruf: kenwood BEFEHL [ANZAHL], zum Beispiel: kenwood VOL+ 5"
  exit 1
fi
stty -F "$PORT" 9600 raw -echo
echo "$*" > "$PORT"

Das Skript stellt die serielle Schnittstelle auf 9600 Baud und schreibt Deinen Befehl als Zeile hinein. Mache es jetzt ausführbar:

Code
sudo chmod +x /usr/local/bin/kenwood

Schritt 5: Die LED ausrichten und testen

Teste zuerst, ob die LED überhaupt sendet. Das Infrarotlicht siehst Du mit bloßem Auge nicht, eine Handykamera zeigt es aber als schwaches violettes Blitzen. Richte die Kamera auf die LED und gib diesen Befehl ein:

Code
kenwood VOL+ 5

Die LED sollte fünfmal kurz aufleuchten. Bei manchen Handys filtert die Hauptkamera das Infrarotlicht heraus, dann hilft die Frontkamera.

Klebe die LED danach mit etwas Fixierknete direkt vor das Infrarotfenster des Receivers, also die dunkle Scheibe an der Front, hinter der der Fernbedienungssensor sitzt. Die LED soll mittig und im Abstand von etwa einem Zentimeter davor sitzen. Schalte den Receiver ein und teste:

Code
kenwood MUTE

Der Receiver sollte stummschalten. Mit kenwood POWER schaltest Du ihn aus, und derselbe Befehl schaltet ihn auch wieder ein, denn Kenwood verwendet für Ein und Aus dasselbe Signal.

Die Befehle im Überblick

Diese Codes stammen aus der IRDB, der offenen Datenbank für Infrarotcodes, und zwar aus dem Bestand der Kenwood-Receiver mit der NEC-Adresse 184 (hexadezimal 0xB8). Welche Eingänge Dein Gerät tatsächlich hat, siehst Du an den Tasten Deiner Fernbedienung.

BefehlFunktionCode
POWEREin und Aus0x9D
VOL+ und VOL-Lauter und leiser0x9B und 0x9A
MUTEStummschalten0x9C
PHONO, TUNER, CDEingang wählen0x90, 0x91, 0x92
TAPE1, TAPE2, VIDEO1, VIDEO2Weitere Eingänge0x94, 0x95, 0x96, 0x93
PRESET+ und PRESET-Senderspeicher weiter und zurück0x99 und 0x8C
BANDWellenbereich wechseln0x8F

Wenn der Receiver nicht reagiert

Ich konnte die Codetabelle nicht gezielt für den KRV-6030 bestätigen, sondern habe sie aus dem Kenwood-Bestand der IRDB übernommen. Reagiert der Receiver auf nichts, obwohl die Handykamera die LED blitzen sieht, liegt es meist an einer dieser Stellen.

Ist die LED zu weit weg oder schief ausgerichtet, rücke sie näher an das Fenster. Ist die LED falsch herum angeschlossen, blitzt sie auf der Handykamera nicht. Tausche dann die beiden Adern. Misst Du zwischen VCC und GND keine 5 Volt, hast Du eine 3,3-Volt-Version des Pro Micro erwischt, und die LED bekommt zu wenig Strom.

Bleibt der Receiver trotz sichtbarem Blitzen stumm, nutzt Dein Modell vermutlich die erweiterte Variante derselben Kenwood-Adresse (in der IRDB als 184,0 geführt). Ersetze dann in der Sendeschleife des Sketches diese Zeile:

Code
IrSender.sendNEC(KENWOOD_ADRESSE, BEFEHLE[i].code, 0);

durch diese:

Code
IrSender.sendOnkyo(KENWOOD_ADRESSE, ((uint8_t)~BEFEHLE[i].code << 8) | BEFEHLE[i].code, 0);

Lade den Sketch danach erneut hoch. Die Codes bleiben dieselben, nur der Aufbau des Signals ändert sich.

Fazit: Eine Methode für alle alten Geräte

Mit einem Pro Micro, einer LED und einem Transistor hast Du jetzt eine USB-Fernbedienung, die der Pi per Textbefehl bedient und die weder GPIO-Pins noch eine Betriebssystem-Konfiguration braucht. Weil kenwood ein normaler Shell-Befehl ist, kannst Du ihn aus Skripten, Cronjobs und Automationen aufrufen, zum Beispiel auch aus Home Assistant, wie in der Anleitung Schalter zum Herunterfahren für HifiBerry in Home Assistant anlegen gezeigt.

Für ein anderes Gerät änderst Du nur die Befehlstabelle im Sketch: Suche in der IRDB das Gerät Deiner Marke, übernimm Adresse und Codes in BEFEHLE und passe bei einem anderen Protokoll als NEC die Sendefunktion an, die die IRremote-Bibliothek dafür mitbringt. Die Hardware bleibt gleich.

Weiterlesen.