R09 Telegramm-Decoder
Empfang und Dekodierung von R09-Funktelegrammen mit ESP32-S3 und FFSK Modem, inklusive Logging.
Angelegt: 30. Juli 2026
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.
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.
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.