====== DAB+ Modul ======
===== Motivation =====
Im Zeitalter des 'Musik Streamen' erscheint terrestrisches Radiohören antiquiert. Bei fehlendem WLAN oder Mobilfunk kann es aber eine Alternative darstellen mit der Welt zumindest konsumierend in Verbindung zu bleiben. Die FM (UKW) Übertragung wurde in Deutschland vor fast 100 Jahren (1925) erstmals ausprobiert. Und eigentlich sollte FM schon 2012 eingestellt werden was aber nur im Kabelnetz Wirklichkeit wurde. Zur Freude der Autofahrer mit herkömmlichen analogen Radios. Der aktuelle digitale Nachfolger DAB+ (das vorherige, inkompatible und wenig erfolgreiche DAB wurde eingestellt) ist zumindest im Markt sichtbar und es gibt eine Zahl von preiswerten DAB+ Empfängern unter 30,-€. Mein Entschluss zum Ausprobieren fiel auf ein TechniSat TECHNIRADIO RDR:
{{ :de:tech:techniradio_rdr.png?nolink&300 |}}
Das Radio hat alle wichtigen Funktionen zum digitalen Empfang in einem handlichen Gehäuse.
Wie wäre es aber wenn man ein kleines, programmierbares FM/DAB+ Modul hätte um es beliebig in eigene Projekte einfliessen zu lassen? Ein neues Projekt ist geboren...
===== Erste Versuche =====
Die ersten DIY Versuche mit DAB+ hatte ich übrigens in 2014 mit einem Module (T2-L4A-8650C) der taiwanesischen Firma [[http://www.keystonesemi.com/products.php|KeyStone Semiconductor]]. Hier der zugehörige Thread in [[https://www.mikrocontroller.net/topic/315982|microcontroller.net]].
Im Hobbybereich ist die Auswahl allerdings immer noch sehr begrenzt. Im Pandemiejahr 2020 konnte ich nur zwei Module finden:
* [[https://www.ebay.de/itm/302516551661|DAB/DAB+/FM Radio Shield for Arduino]] für ca. £60,-
* [[https://ugreen.eu/product/ugreen-dab-board/|uGreen DAB Board]] für ca. 45,-€
Allen diesen Empfängern ist gemeinsam, dass sie auf dem IC SI4684-A10 von der US Firma [[https://www.skyworksinc.com|Skyworks Solutions Inc. (früher Silicon Labs.)]] beruhen der für ca. 15,-€ vereinzelt bei US Distributoren (z.B. [[https://www.mouser.de/ProductDetail/Skyworks-Solutions-Inc/SI4684-A10-GM?qs=p9T7GgSe1IFl%2FK1mJ61MOg%3D%3D&gclid=EAIaIQobChMI1__CnMqw-gIVRIKGCh0yTgV1EAAYASAAEgJJq_D_BwE|Mouser]]) verfügbar ist. Der SI4684 ist ein Single-Chip FM/DAB/DAB+ Radio Receiver ([[https://www.skyworksinc.com/-/media/SkyWorks/SL/documents/public/data-shorts/Si4684-short.pdf|Datasheet]]). \\
Um das IC für eigene Projekte einzusetzen bräuchte man das Evaluierungsboard was auch die nötige Firmware CD beinhaltet. Der Preis von über 500,-€ läßt den Maker aber etwas rat- und daher rastlos zurück. Die Firmware alleine ist leider auch nicht (mehr) online verfügbar. Eine gute Infoquelle dazu ist übrigens auch das [[https://www.rundfunkforum.de/viewtopic.php?f=11&t=56042&sid=25a9f57b42f83cd0691d988ebd6ca5f3&start=165|Rundfunkforum]]. \\
Ein Blick in die Empfänger H/W zeigt, dass die Firmware in einem externen Serial FLASH Memory (typ. 25L16) residiert. Je nachdem ob FM oder DAB+ Betrieb wird ein anderer Teil daraus in den SI4684 geladen.
===== Lösung =====
Damit liegt eine Lösung auf der Hand. Einfach das FLASH auslesen und für den eigenen Gebrauch kopieren.
Das passende Tool ist im Fernen Osten für unter 10,-€ zu beschaffen.
{{ :tech:serial_flash_progammer.png?nolink&300 |Serial Flash Programmer}}
Das Auslesen ist einfach, aber schwieriger wird es herauszufinden wo was steht. Nach detailliertem Studium der Datensheets, Application Notes und der Auswertung des SPI Traffic zwischen MCU und SI4684 im TechniSat Radio ergibt sich folgende Verteilung:
Start End Size Module
=============================================
0x002000 - 0x0036A1 (0x016A1) Patch016
0x004000 - 0x0056A1 (0x016A1) Patch016
0x086000 - 0x0FEE69 (0x78E69) DAB F/W V6.0.5
0x106000 - 0x187721 (0x81721) FM F/W V5.1.0
Diese Information wird später gebraucht wenn die entsprechende Firmware geladen werden soll. Doch erst brauchen wir mal eine Hardware.
===== Hardware =====
Mein Ziel war es ein möglichst kleines Modul zu entwickeln, das dann überall Platz finden kann ähnlich der KeyStone Lösung.
Die Application Note [[https://www.skyworksinc.com/-/media/Skyworks/SL/documents/public/application-notes/AN851.pdf|AN851]] des Chipherstellers gibt einen Beispielschaltplan sowie einige PCB Designregeln vor. Daran haben sich auch alle Designer bei den mir vorliegenden Boards gehalten. Das hemmt Experimentierfreudigkeit:
{{ :tech:dab_module_sch.png?direct&400 |DAB+ module}}
Das Module enthält alles für den entspannten FM/DAB+ Empfang und hat folgende Konnektivität zu bieten:
* ''3.3V/GND'' - Versorgungsspannung
* ''RESB'' - Reset des SI4684
* ''INTB'' - Interrupt Ausgang des SI4684
* ''ROUT/LOUT/GND'' - Analoger Audio Ausgang mit GND (hier kommt die Musik raus)
* ''SSB/SCLK/MOSI/MISO'' - SPI Schnittstelle zur steuernden MCU
* ''SMA'' - Antennenanschluss über SMA Buchse oder einfacher Draht
Die Anschlüsse sind im 2.54mm Raster und können so auch mit Stiftleisten verlötet werden. Damit alles klein bleibt sind die passiven Komponenten in SMD 0402 ausgelegt. Eine tolle Herausforderung für das manuelle Bestücken aber mit ruhiger Hand geht es (meistens).
Das PCB sieht nach dem Entflechten immer harmloser aus als während des Designvorgangs. Zur besseren Darstellung im folgenden Bild ohne ausgefüllte Masseflächen:
{{ :tech:dab_module_brd.png?direct&400 |DAB+ module PCB}}
Damit die gewählte SMA Buchse passt sollte das PCB nur 1.0mm dick produziert werden. Mit 29x18mm wirkt das Module schon recht handlich. Bei [[https://jlcpcb.com|JLCPCB]] hergestellt kostet es etwas mehr als üblich da ich ja //Castellated Holes// also halbe Löcher für die Modulanschlüsse genommen hatte. Ich empfehle auf jeden Fall ein Stencil mitzubestellen sonst wird es beim Bestücken noch spassiger. Hier das 'Paste' Ergebnis mit Stencil:
{{ :tech:dab_module_paste.jpeg?direct&400 | DAB+ module paste example}}
Übrigens ein Mikroskop ist beim Bestücken auch sehr hilfreich. Und nicht vergessen den FLASH Baustein besser vorher zu programmieren. Eventuell muss man mit etwas Entlötlitze nach dem Reflowlöten (mit T962) Kurzschlüsse an den Pins des SI4684 beseitigen. Die lassen sich bei einem Pin Pitch von 0.5mm nicht vermeiden.
{{ :tech:dab_mdule_pcb.png?direct&400 | DAB+ module soldered}}
Jetzt steht das Module für einem ersten Einsatz zur Verfügung. Damit es löttechnisch jungfräulich bleibt, habe ich mir einen Pogo-Adapter :
{{ :de:tech:dab_module_adapter.png?direct&400 |DAB+ module adapter}}
zum Test auf Arduino Uno Basis mit einen Standard Experimentierboard erstellt. Man kann natürlich jedes andere Evaluierungsboard nehmen was eine programmierbare SPI Schnittstelle bietet. Bitte nicht die Levelshifter vergessen da ja das DAB+ Modul mit 3.3V Signalen arbeitet. Wenn man gleich auch noch einen Verstärker (hier ein PAM8302A) mit anschliesst dann kann man den Erfolg bald auch hören.
{{ :tech:dab_module_test_board.png?direct&400 | Test Board on top of an Arduino Uno}}
===== Software =====
Wie schon erwähnt wird das DAB+ Module über eine SPI Schnittstelle gesteuert. Das übernimmt der Arduino und stellt gleichzeitig ein UART Terminal (115.200 Bd) zur Verfügung mit dem man einzelne Funktionen über die serielle Schnittstelle aufrufen kann:
COMMANDS:
reset -> Reset Si4684
test
Nicht vergessen eine Antenne anzuschliessen sonst bleibt es ruhig. Über den SMA Connector geht eine handelsübliche DAB+ Antenne aus dem Elektromarkt oder auch nur ein Draht in der Länge Lambda/4 (FM = ca. 80cm und DAB+ ca. 37cm).
Die Test-S/W auf dem Arduino besteht aus sechs S/W Modulen:
- ''DAB_modtest'' Hauptprogramm
- ''DAB_func'' Enthält alle DAB Funktionen
- ''FM_func'' Enthält alle FM Funktionen
- ''si4684.h'' Alle SI4684 Definitionen
- ''si4684_func'' Alle implementierten SI4684 Funktionen
- ''si4684patch.h'' Patch0016 Daten
Ein guter Anfang ist der ''test fm'' der das Module vollständig initialisiert und einen FM Sender der Wahl (im Beispielcode 88MHz) auswählt. Man sollte nach erfolgreicher Ausführung das Senderprogramm aus den Lautsprechern hören. Wenn nicht dann kann der Fehlerstatus Aufschluss über das Problem geben und die H/W Fehlersuche beginnt. \\
**Was passiert beim ''test fm''?** \\
Beim ''test FM'' wie aber auch bei jedem Start muss die folgende Sequenz an Funktionen abgearbeitet werden:
- ''si468x_reset()'' Hard reset of SI4684
- ''si468x_load_init()'' Prepares the bootloader to receive a new image
- ''si468x_host_load()'' Loads an image from HOST over command interface
- ''si468x_load_init()'' Prepares the bootloader to receive a new image
- ''si468x_flash_set_property(0x0001, 5000)'' Sets the value of a FLASH property (SPI Clock to 10MHz)
- ''si468x_flash_load(FLASH_START_ADDR_FM)'' Loads an image from external FLASH over secondary SPI bus
- ''si468x_boot(&value)'' Boots the image currently loaded in RAM
- ''si468x_set_property(0x0000, 0x0004)'' INT_CTL_ENABLE RDS_INT
- ''si468x_set_property(0x0001, 0x0004)'' INT_CTL_REPEAT RDS_INT
- ''si468x_set_property(0x3900, 0x0001)'' FM_AUDIO_DE_EMPHASIS
- ''si468x_set_property(0x3C00, 0x0001)'' FM_RDS_INTERRUPT_SOURCE
- ''si468x_set_property(0x3C01, 0x0010)'' FM_RDS_INTERRUPT_FIFO_COUNT
- ''si468x_set_property(0x3C02, 0x0001)'' FM_RDS_CONFIG
- ''si468x_fm_tune_freq(freq)'' tune to FM frequency freq
Nach erfolgreichem ''test FM'' kann man sich an einzelne Menupunkte im FM mode heranwagen oder auch den ''test DAB'' starten. Die jetzige Software hat noch einige Lücken aber mit etwas Zeit und Muse sind RDS oder DAB+ Daten Service Funktionen auch zu implementieren. \\
Falls jemand Funktionen erweitern will, das SPI Protokoll ist in [[https://www.skyworksinc.com/-/media/Skyworks/SL/documents/public/application-notes/an649.pdf|AN649]] vom Hersteller des Chips verfügbar.\\
===== Fazit =====
Auch wenn noch nicht alle Software Funktionen implementiert sind, ermöglicht das Modul konstruktionsbedingt die vergleichbare Performance wie ein DAB+ Seriengerät. Damit steht einer Integration in eigene Projekte nichts mehr weg.
Da die Test Software in Bangkok (während der Quarantäne) fertiggestellt wurde hier nur ein FM und DAB+ Scan als Beispiel aus dieser Stadt:
FM
Freq= 88.0MHz: RSSI=26, SNR=27
00.00.0000 00:00 PI=-1 PTY=18 ps= sd=Radio Thailand F.M. 88.00 MHz. www.prd.go.th
00.00.0000 00:00 PI=-1 PTY=18 ps=NBT 88 sd=Radio Thailand F.M. 88.00 MHz. www.prd.go.th
Freq= 88.5MHz: RSSI=20, SNR=20
00.00.0000 00:00 PI=0 PTY=0 ps=GOODTIME sd=
Freq= 89.0MHz: RSSI=30, SNR=32
Freq= 90.5MHz: RSSI=21, SNR=19
Freq= 91.5MHz: RSSI=22, SNR=24
Freq= 92.5MHz: RSSI=17, SNR=19
Freq= 93.0MHz: RSSI=18, SNR=20
00.00.0000 00:00 PI=9483 PTY=12 ps= COOL sd=
00.00.0000 00:00 PI=9483 PTY=12 ps= COOL sd=COOLfahrenheit
Freq= 93.5MHz: RSSI=21, SNR=22
Freq= 94.0MHz: RSSI=22, SNR=24
00.00.0000 00:00 PI=9485 PTY=10 ps= sd=COOLfahrenheit
00.00.0000 00:00 PI=9485 PTY=10 ps= EFM94 sd=COOLfahrenheit
00.00.0000 00:00 PI=9485 PTY=10 ps= EFM94 sd= www.efm.fm
Freq= 98.0MHz: RSSI=38, SNR=27
Freq=101.5MHz: RSSI=26, SNR=28
Freq=103.5MHz: RSSI=28, SNR=26
00.00.0000 00:00 PI=0 PTY=0 ps= sd=103.5 FM ONE
00.00.0000 00:00 PI=0 PTY=0 ps= FM ONE sd=103.5 FM ONE
Freq=104.5MHz: RSSI=16, SNR=17
00.00.0000 00:00 PI=11368 PTY=10 ps= FLEX sd=
00.00.0000 00:00 PI=11368 PTY=10 ps= FLEX sd=
Freq=105.5MHz: RSSI=21, SNR=21
Freq=106.5MHz: RSSI=24, SNR=21
00.00.0000 00:00 PI=-24219 PTY=12 ps= sd=
00.00.0000 00:00 PI=-24219 PTY=12 ps= WAVE sd=GOOD MUSIC GOOD FEELING
00.00.0000 00:00 PI=-24219 PTY=12 ps= GREEN sd=GOOD MUSIC GOOD FEELING
00.00.0000 00:00 PI=-24219 PTY=12 ps= WAVE sd=GOOD MUSIC GOOD FEELING
00.00.0000 00:00 PI=-24219 PTY=12 ps= GREEN sd=GOOD MUSIC GOOD FEELING
DAB+
Ensemble Freq 06 185.360 MHz
Bangkok DAB+
Services:
ID Name
0: JS.100
1: COOLfahrenheit
2: RROne FM 101
3: Thai PBS Digital
4: 103.5 dab+ RADIO
5: Looktung Network
6: FM 94(TV5)
7: KU RADIO
8: MET 107
9: RadioThailand
10: NBTCtest
11: HITZ 955
12: GreenWave 106.5
13: LTM FM 95
ALL:
AM=2 BR=64 SR=48000 SM=4 (Stereo 64Kbps 48000Hz DAB+)
===== Downloads =====
* {{:tech:dab_module_sch.pdf| Schaltplan (,pdf)}}
* {{:tech:dab_module_bom.csv.zip| Bestückungsliste (BOM) als .csv}}
* {{:tech:dab_module.brd.zip| PCB Eagle File (.brd)}}
* {{:tech:dab_module_adapter.zip | Module Adapter Base und Clamp (.stl)}}
* {{:tech:dab_modtest.zip| Test Software (.ino)}}
===== Spenden =====
Wenn ihr meine Arbeit unterstützen wollt, so könnt ihr mir gerne einen Cappuccino oder so spenden: .