← Zurück zu den Projekten
  • elektronik
  • funk
  • esp32
  • öpnv

R09 Telegramm-Decoder

Empfang und Dekodierung von R09-Funktelegrammen mit ESP32-S3 und FFSK Modem, inklusive Logging.

Angelegt: 30. Juli 2026

Bild: R09 Telegramm-Decoder

Nahverkehrsfahrzeuge melden sich per Funk an Ampeln an, um Vorrang zu bekommen: die sogenannte R09-Anmeldung. Dieses Projekt empfängt diese Telegramme, dekodiert sie und zeigt Meldepunkt, Linie und Kurs live auf einem Display an.

Funktionsweise

Ein R09-Telegramm ist ein analoges FFSK-Signal (Fast Frequency Shift Keying):

  • 1200 Hz = Bit 1, 2400 Hz = Bit 0
  • 1200 Baud, ein komplettes Telegramm dauert nur ~95 ms
  • Aufbau: Präambel → Synchronisation → 11 Bytes (9 Daten + 2 CRC)

Der Empfänger liefert das NF-Signal an ein CMX469A FFSK-Modem, das die Töne in saubere Bits demoduliert. Der ESP32-S3 misst die Pulsbreiten der Bits per Interrupt und setzt sie zu Telegrammen zusammen. Eine CRC-Prüfung (Generator 0x16F63) sortiert Empfangsfehler aus.

Erste Versuche am Testaufbau
Erste Versuche am Testaufbau
Waveform am Oscilloscope
Waveform am Oscilloscope
Pulseview mit einem Logic Analyzer
Pulseview mit einem Logic Analyzer

Interessant ist die Byte-Struktur: Die Nutzfelder sind nicht byteweise, sondern nibble-genau gepackt, und Linie/Kurs/Ziel sind BCD-kodiert, jede Hex-Ziffer steht für eine Dezimalziffer. Ein Telegramm enthält u. a. Meldepunktnummer, Priorität, Liniennummer, Kursnummer, Fahrwegnummer, Fahrzeuglänge und die Fahrplanabweichung.

Verwendete Bauteile

  • ESP32-S3 (16 MB Flash): Steuerung, Dekodierung, Anzeige, Logging
  • CMX469AD3: FFSK-Modem, wandelt die Töne in Bits
  • Si5351A: Taktgenerator, liefert dem CMX469A seine 1,008-MHz-Referenz
  • VHF-Empfänger (WZ LSA): Empfang auf der R09-Frequenz
  • ST7789 TFT (240×320): Anzeige mit blätterbarer Historie
  • KY-040 Drehencoder: Bedienung (Blättern, Recovery, Log löschen)
  • Passiver Piezo: akustische Rückmeldung
  • Akkupack: selbst gebaut aus 18650-Zellen (3S) mit passendem 3S-Laderegler, für den mobilen Einsatz

Der Aufbau

Die ersten Versuche liefen auf einem Breadboard. Für das fertige Gerät habe ich ein Gehäuse entworfen und mit meinem eigenen 3D-Drucker gedruckt, die Schaltung auf einer Lochrasterplatine gelötet und alles zusammen ins Gehäuse eingebaut.

Breadboard-Aufbau
Breadboard-Aufbau
Lochrasterplatine
Lochrasterplatine
Im Gehäuse eingebaut
Im Gehäuse eingebaut

Funktionen

  • Live-Anzeige von Meldepunkt, Linie, Kurs und Fahrplanabweichung
  • Historie der letzten 30 Telegramme, mit dem Encoder durchblätterbar
  • Logging in den internen Flash (12 MB als Dateisystem)
  • USB-Massenspeicher: Zum Auslesen meldet sich das Gerät am PC als Wechseldatenträger, die Logdatei liegt dort wie auf einem USB-Stick
  • Akustische Rückmeldung: Bei jedem Telegramm wird der originale FFSK-Klang aus den dekodierten Bits nachgebildet, das typische „Modem-Zwitschern”

Herausforderungen

Die größte Hürde war die Bit-Dauer. Zunächst rechnete der Decoder mit 833 µs pro Bit, es kam nichts Verwertbares heraus. Erst die Analyse mit einem Logic Analyzer zeigte: Das CMX469A gibt im 2400-Baud-Modus 417 µs pro Bit aus. Mit dem korrigierten Wert stimmten die Telegramme sofort.

Weitere Stolpersteine:

  • Eine kalte Lötstelle am Datenausgang des Modems sorgte lange für scheinbar zufällige Aussetzer.
  • Die BCD-Dekodierung der Felder: Eine byteweise Auslese passt nur zufällig für einstellige Werte, Linie „10” wurde erst als „16” angezeigt.
  • Das Display blieb beim ersten Kaltstart manchmal schwarz, weil die Initialisierung schneller war als der Spannungsaufbau. Gelöst mit einer kurzen Wartezeit, einem sauberen Hardware-Reset und doppeltem Init.
  • Stromversorgung des VHF-Empfängers. Der WZ LSA braucht 12 V. Der erste Versuch, die aus 5 V per Step-up-Wandler zu erzeugen, brachte extreme EMV-Störungen: Die Schaltflanken des Wandlers strahlten direkt in den empfindlichen Empfänger ein. Mit dem selbst gebauten 3S-Akkupack entfiel der Wandler komplett, und die Störungen waren weg.

Status

Funktionsfähiger Prototyp. Empfang, Dekodierung und Logging laufen stabil; Fahrzeuge werden Meldepunkt für Meldepunkt korrekt mitgeschnitten.