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.

FM / DAB+→Si4684→ I²S →ADAU1701 DSP→ I²S →BT1035→aptX

La scheda v1

La scheda DigiRadio v1 montata

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 firmware, una versione alla volta

Il firmware gira sull'ESP32-S3, è scritto con ESP-IDF in C++23 ed è cresciuto per versioni:

Una storia che racconta bene il lavoro: una mattina la radio si è riavviata esattamente all'ora della sveglia. La causa era un buffer da 4 KB creato sullo stack a ogni comando inviato al sintonizzatore. Dall'app funzionava, perché quel task ha uno stack grande, mentre il task della sveglia ne aveva solo 6 KB. Con un buffer da 64 byte e più stack per la sveglia il problema è sparito, e il giorno dopo la sveglia ha suonato senza riavvii.

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:

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 4Report 6Report 7Report 12
Bloccanti0000
Da rivedere17222110
Informativi125106—88
Copertura49 %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.

Alla fine la v2 è arrivata a 0 bloccanti, DRC con 0 errori e schema e PCB allineati: pronta per i Gerber.

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