Lo sviluppo di DigiRadio
Come è nata la radio, dalla prima scheda al firmware 0.13, e come la seconda versione è stata revisionata con BoardLab prima di andare in produzione.
Da dove sono partito
Volevo una radio DAB+ e FM che mandasse l'audio alla mia cassa Bluetooth senza passare dal telefono e senza perdere qualità. Non l'ho trovata, quindi l'ho progettata.
L'idea di base non è mai cambiata: un percorso audio tutto digitale, I²S a 48 kHz e 24 bit, dal sintonizzatore al Bluetooth. In mezzo c'è un DSP che fa equalizzazione, mixer delle sorgenti e preset. A comandare tutto c'è un ESP32-S3, che si parla con un'app per iPhone.
La scheda v1
La prima scheda è un 6 strati da 50 × 90 mm con quattro chip principali: il sintonizzatore Si4684 di Silicon Labs, il DSP ADAU1701 di Analog Devices, il modulo Bluetooth FSC-BT1035 con aptX Adaptive e l'ESP32-S3.
Un sintonizzatore QFN, un DSP LQFP, due moduli a 2,4 GHz e un USB-C su 6 strati a impedenza controllata non si montano a mano. La scheda l'ha prodotta e montata PCBWay, che ha sponsorizzato parte del costo. L'unico componente che non avevano era il BT1035, e l'ho saldato io.
Le prime settimane sono state di "messa in voce". Due esempi:
- Il formato I²S del Bluetooth. Il DSP manda frame da 32 bit per canale, e il BT1035 andava configurato per riceverli così. Un'impostazione sbagliata si sente subito come rumore o silenzio.
- Il quarzo del Si4684. Il quarzo da 19,2 MHz girava qualche ppm sotto. Invece di cambiare componenti, il firmware lo calibra: misura lo scostamento sulle stazioni FM, corregge e salva il valore in EEPROM. Oggi l'errore residuo è di circa 3 ppm.
Il firmware, una versione alla volta
Il firmware gira sull'ESP32-S3, è scritto con ESP-IDF in C++23 ed è cresciuto per versioni:
- 0.9: FM con RDS e frequenze alternative, DAB, accensione e standby dall'app.
- 0.10: webradio, audio del telefono via Wi-Fi, aggiornamenti OTA. Se la nuova versione non conferma entro 60 secondi, la radio torna da sola a quella precedente.
- 0.11: sveglie, timer di spegnimento, orologio NTP. Da qui le release si pubblicano in automatico su GitHub e l'app le installa con "Cerca aggiornamenti".
- 0.12: DAB DL+, scansione della banda, slideshow MOT, correzioni a memoria e stream.
- 0.13: il nuovo programma del DSP, i preset audio salvati sulla radio e il cambio di sorgente senza click.
L'app igiRadio
L'app per iPhone e iPad è il telecomando della radio: stazioni, preset, equalizzatore, sveglie, aggiornamenti. Parla con la radio via Wi-Fi attraverso un'API REST, e la trova da sola con mDNS. I preset audio stanno sulla radio, non sul telefono, quindi restano anche cambiando dispositivo.
Presto l'app sarà sull'App Store per iOS, e la versione per Android si potrà scaricare dal sito. Nel frattempo, chi vuole provarla può aprire una issue su GitHub e riceverà la versione di test.
Il suono: il DSP
Il programma dell'ADAU1701 è fatto in SigmaStudio. L'ESP32 lo ricarica a ogni accensione, quindi si aggiorna via Wi-Fi senza riprogrammare niente.
Con la versione 2 del programma ho rivisto la catena: un compressore più leggero che non taglia più le parti piano, più margine prima dei bassi, sei preset di fabbrica (Neutro, Voce, Musica, Bassi, Classica, Notte) e fino a dieci preset personali. Le modifiche a SigmaStudio le abbiamo fatte anche via script, per avere un progetto ripetibile.
La scheda v2
La v1 funziona e la uso tutti i giorni, ma ha dei limiti chiari. Lo stream https delle webradio è al limite della memoria, il DSP è pieno e la radio va solo a corrente. La v2 nasce per risolverli:
- ADAU1452 al posto dell'ADAU1701. Molta più potenza di calcolo, più porte I²S, convertitori di frequenza (ASRC) e avvio autonomo da EEPROM.
- ESP32-S31 con PSRAM, per webradio https stabili.
- Caricabatterie BQ25896, per farla funzionare a batteria e renderla portatile. La batteria è una Li-ion piatta da 3000 mAh.
- Modulo Bluetooth FSC-BT1058, sempre con aptX Adaptive.
- Lo stesso stack-up a 6 strati: 50 Ω per la RF, 90 Ω differenziali per l'USB.
L'ADAU1452 non è un cambio da un componente all'altro. Ha bisogno di un'alimentazione a 1,2 V che arrivi a quasi 700 mA, quindi ho aggiunto un buck dedicato. Ha un footprint LFCSP-72 con pad termico, un'altra gestione dei clock e un'altra mappa di pin. Ogni pin è stato verificato contro il datasheet.
Per non affidarmi solo alla memoria, ho confrontato la v2 con la scheda di valutazione di Analog Devices per l'ADAU1452. Da lì sono arrivate alcune correzioni: i condensatori del quarzo in NP0, un 1 µF in più sulla 1,2 V, una protezione ESD sull'antenna e il footprint giusto per la EEPROM.
BoardLab: la revisione prima dei Gerber
Il layout della v2 l'ho fatto revisionare a BoardLab, un software di analisi dei PCB che sviluppo io.
Cos'è
Il DRC di KiCad controlla le regole geometriche: distanze, larghezze, collegamenti. Non sa niente di cosa fanno i chip. Una scheda può passare il DRC con zero errori e non accendersi.
BoardLab parte da lì. Legge lo schema e il PCB, legge i datasheet dei componenti e li confronta con il progetto, come farebbe un collega esperto in una revisione:
Collegamenti e alimentazioni
Controlla che ogni chip sia alimentato, che i pin obbligatori siano collegati e che i domini di alimentazione non si alimentino l'uno con l'altro.
Regole dei datasheet
Condensatori di disaccoppiamento vicino ai pin giusti, anelli di potenza corti, via di massa dove servono. Ogni segnalazione cita la pagina del datasheet.
Piste e correnti
Verifica che le piste di potenza siano abbastanza larghe per la corrente che portano.
Antenne e disturbi
Stima quanto i moduli a 2,4 GHz disturbano le piste vicine, scenario per scenario.
Piani di massa
Segnala interruzioni dei piani sotto le coppie differenziali e sotto i nodi di commutazione.
Ogni punto è classificato come bloccante, da rivedere o informativo, con l'indicazione di quanta parte della scheda è stata coperta dall'analisi.
Gli errori subdoli che ha evitato
Gli errori pericolosi non sono quelli che il DRC vede. Sono quelli che passano tutti i controlli di KiCad, lasciano accendere la scheda e si fanno vedere solo dopo: con l'audio spento, o quando il Wi-Fi trasmette. BoardLab ne ha trovati diversi sulla v2, prima di ordinare.
Chip alimentati dai pin
Due pull-up del bus SPI erano sulla 3,3 V digitale, sempre accesa, mentre i chip che servivano stanno sulla 3,3 V audio, che il firmware spegne. Con l'audio spento quei chip sarebbero rimasti mezzi accesi attraverso i diodi di protezione dei loro pin: un problema difficile da capire al banco.
At every power-up and whenever firmware clears ENABLE_ANALOG, U13's CS and SPI/I2S inputs sit at 3.3 V while its IOVDD is 0 V, forward-biasing the input ESD diodes and phantom-powering the 3V3_AUDIO rail through the 10 kΩ pull-upsBoardLab, report 2 · PCB-U2-005
Il reset vicino all'antenna
La pista di reset del DSP passava vicino all'antenna dell'ESP32. Con il Wi-Fi in trasmissione il DSP avrebbe potuto riavviarsi ogni tanto, senza un motivo apparente. Il tipo di guasto più difficile da capire al banco.
U2 radio tx radiates into U13 logic in near (60.9, 111.0) mm: about 150 mV induced against 120 mV (-2 dB margin).BoardLab, report 1 · PCB-U13-003
Un buck al limite
L'abilitazione del regolatore a 1,2 V del DSP stava a 1,34 V contro una soglia di 1,2 V. Funziona, ma con soli 0,14 V di margine. Cambiando una resistenza è salita a 1,65 V.
Increase the EN divider margin: change R28 from 68 kΩ to 100 kΩ (EN = 3.3 V × 100/200 = 1.65 V, margin 0.45 V over VIH max)BoardLab, report 3 · U4-070
Il condensatore che manca
Sulla 1,2 V del DSP mancava il condensatore da 1 µF che il datasheet chiede a pagina 193. Lo stesso punto è emerso dal confronto con la scheda di valutazione.
1V2 (U13 DVDD pins 20/35/53/71) carries four 100 nF (C44, C49, C50, C64), four 10 nF (C67–C70), two 10 µF (C61, C80) and ferrite FB4; there is no 1 µF capacitor on the rail.BoardLab, report 7 · PCB-U13-007
Nelle prime revisioni ha trovato anche errori grossi nascosti nello schema gerarchico: il modulo Bluetooth BT1058 senza alimentazione, il caricabatterie BQ25896 scollegato dall'USB e dal resto della scheda, l'interrupt del caricabatterie che non arrivava all'ESP32. Sono errori che KiCad non segnala, perché ogni foglio, preso da solo, è corretto.
Il resto sono rifiniture di layout: piste di potenza da 0,127 mm negli anelli degli induttori, condensatori e via di massa da avvicinare ai pin, una zona di rame dimenticata su un segnale I²S.
Da un report all'altro
| Report 4 | Report 6 | Report 7 | Report 12 | |
|---|---|---|---|---|
| Bloccanti | 0 | 0 | 0 | 0 |
| Da rivedere | 17 | 22 | 21 | 10 |
| Informativi | 125 | 106 | — | 88 |
| Copertura | 49 % | 62 % | — | 55 % |
Tra il report 4 e il report 6 i punti "da rivedere" sono saliti, ma non perché la scheda fosse peggiorata. Il report 6 controllava una parte in più e applicava le regole di layout dei datasheet del modulo Bluetooth, del caricabatterie e del regolatore. La copertura è passata dal 49 al 62 %.
Il report 7 ha chiuso tutti i consigli del report 6 e ne ha aggiunto uno nuovo: un condensatore da 1 µF sulla 1,2 V del DSP, come chiede il datasheet a pagina 193. È lo stesso punto che è emerso dal confronto con la scheda di valutazione.
Come lo uso
BoardLab non decide al posto mio. Ogni segnalazione la verifico sul netlist e sul datasheet, e poi scelgo. Alcune le ho accettate così come sono: 18 via sotto il pad termico del DSP invece di 49 bastano per mezzo watt. Altre erano falsi positivi, per esempio una tabella pin del Si4684 estratta male.
La cosa che conta è che la revisione avviene prima di ordinare, quando correggere costa un clic e non una scheda nuova. Il risultato sulla scheda definitiva è nel report commentato.
Produzione e community
La PCB v1 è stata prodotta e assemblata da PCBWay (tranne il modulo BT), che ha sponsorizzato parte del costo, e si può ordinare dalla pagina del progetto: sempre gentili, cortesi e molto professionali. La v2 la monto io: da PCBWay ordino solo le PCB, i componenti li saldo da solo.
Il progetto è raccontato anche su Hackaday.io, su Hackster.io e su r/esp32.
Tutto aperto
Schema, PCB, distinta componenti e firmware sono su GitHub: l'hardware con licenza CERN-OHL-S v2, il firmware con Apache 2.0.
Cosa viene dopo
- Montare e collaudare la v2.
- Ricalibrare il quarzo del Si4684 sulla nuova scheda.
- Portare il firmware sull'ADAU1452 e sulla PSRAM.
- L'app sull'App Store e la versione Android.