Come ho costruito il mio sostituto del Blue&Me: guida passo passo
Ho sostituito il modulo Magneti Marelli Blue&Me guasto (50521871) con un Raspberry Pi Zero W. Risponde al Body Computer, legge i tasti al volante, riproduce la musica Bluetooth e permette di telefonare con l'autoradio originale e il microfono dell'auto.
- Linea a 3.3 V
- Linea a 5 V
- Massa
- Pericolo
01 Prima di cominciare
Nell'articolo precedente ho spiegato cos'è questo progetto e perché l'ho costruito. In questa guida racconto come l'ho fatto, in quindici passi dai primi controlli alla musica e alle chiamate in auto.
Le misure sono del mio hardware e della mia auto. Su un'altra i risultati possono cambiare. Per questo ho cominciato con misure e registrazioni, prima di trasmettere messaggi o fare altri collegamenti.
Il software è su GitHub: github.com/crimeofheart/giulietta-blue-me.
Prima, solo ascolto
Non ho trovato informazioni pubblicate sul CAN della Giulietta 940. Sono partito da fmntf/fiatcan per il Fiat Doblò 263 e karolkrupa/alfa-blue-me per l'Alfa 159. Ma descrivono altre auto e differiscono su molti identificatori. Ho confrontato i messaggi con le registrazioni della mia auto. Ogni messaggio nelle tabelle del software riporta la sua registrazione, e il controllo di trasmissione consente soltanto quelli confermati.
Alla prima installazione la trasmissione è bloccata in due punti: il controller CAN è in modalità di solo ascolto e l'elenco dei messaggi consentiti nell'applicazione è vuoto. Il sistema riceve e decodifica il traffico dell'auto, ma non può trasmettere. Ho abilitato la trasmissione al passo 12 con un comando che permette anche di disabilitarla.
Ricostruire il protocollo senza un modulo funzionante
All'inizio non avevo un modulo funzionante da registrare e l'auto era configurata senza Blue&Me. Ho quindi registrato l'auto due volte: prima com'era, poi dopo aver detto al Body Computer di aspettarsi un modulo Blue&Me. Il confronto con blueandme-diff ha mostrato cosa cercava l'auto (passo 10). In seguito ho ricavato altri identificatori dai messaggi che il modulo guasto inviava ancora, come racconto nell'articolo.
Il valore PROXI viene dall'auto su cui si fa il montaggio, non dal mio progetto. Sono i sei byte che i moduli inviano quando il Body Computer li interroga. Ho lasciato il mio fuori dal codice pubblicato, che lo legge da un'impostazione. Al passo 10 spiego come leggerlo da una registrazione; al passo 12, dove va nella configurazione del Pi.
Dove si svolgono le prove: banco indica il lavoro fuori dall'auto; auto, il lavoro collegato al bus del veicolo. I passi 1–6 si fanno al banco. Al passo 7 ho collegato il Pi all'auto per la prima volta, solo per ascoltare. Non ho trasmesso fino al passo 12.
Componenti necessari
Ho messo prima i componenti necessari, poi quelli facoltativi. Gli attrezzi che ho usato sono in fondo all'elenco.
| Componente | Q.tà | Note |
|---|---|---|
| Indispensabili | ||
| Raspberry Pi Zero W, con il suo header a 40 pin | 1 | Bluetooth e Wi-Fi integrati, un core, circa 1 W di consumo. Per questo montaggio lo Zero senza W non è adatto. |
| Scheda microSD, 16 GB o più | 1 | Per Raspberry Pi OS Lite a 32 bit (passo 3). 16 GB è il minimo che Raspberry Pi consiglia per l'immagine Lite. La mia è una SanDisk da 64 GB. |
| Modulo CAN MCP2515 + TJA1050 | 1 | La comune scheda blu. Il quarzo può essere da 8 o da 16 MHz: bisogna leggere la scritta. Prima di usarla ho fatto due modifiche (passi 1–2). Con una scheda basata su SN65HVD230 non servono. |
| Scheda audio USB con uscita audio e ingresso microfono | 1 | Dovrebbe funzionare qualsiasi scheda riconosciuta da Linux come dispositivo audio USB, anche senza chip C-Media. Ho usato un adattatore Ugreen USB-A con C-Media HS-100B, uscita stereo e ingresso microfono mono. Con un'altra scheda controllerei che il contatto esterno del jack cuffie sia davvero a massa e quale nome compare in aplay -l (passo 13). Per la sola musica non serve l'ingresso microfono. |
| Cavo stereo da 3.5 mm | 1 | Dall'uscita cuffie della scheda ai pin audio dell'autoradio (passo 14). |
| Convertitore buck da 12 V a 5 V, uscita USB | 1 | Ho usato un modulo TECNOIOT con ingresso da 6–24 V e uscita USB a 5 V. Il Pi assorbe fino a circa 0.3 A. Il punto decisivo è che il convertitore continui ad alimentarlo durante l'avviamento del motore. Prima di montarlo va provato con un alimentatore regolabile (passo 15). |
| Pin header, passo 2.54 mm, quadri da 0.64 mm | 32 | Quattro strip da otto. Entrano direttamente nel connettore dell'auto. |
| Striscia di millefori, 2 × 16 fori con una cornice di 5 mm | 1 | Ritagliata da un pezzo di millefori. Tiene i 32 pin e fa da connettore verso la spina dell'auto (passo 15). |
| Filo per cablaggi, guaina termorestringente, colla | Filo sottile per la modifica dei 5 V del passo 2. | |
| Consigliati | ||
| Condensatore elettrolitico, 2200 µF, 35 V o più | 1 | Sostegno dell'alimentazione durante l'avviamento, in parallelo all'ingresso del buck (passo 15). |
| Diodo, 1N5822 o 1N4007 | 1 | Sostegno dell'alimentazione durante l'avviamento, tra il pin 16 e il condensatore. |
| Transistor PN2222 | 1 | Accensione sotto chiave: la chiave riavvia il Pi dopo una sosta di più di tre giorni. Senza, bisogna togliere e rimettere il fusibile F36. |
| Diodo, 1N4007 | 1 | Accensione sotto chiave, tra base ed emettitore. |
| Resistenza, 100 kΩ | 2 | Accensione sotto chiave. |
| Millefori, 3 × 7 cm | 1 | 10 × 24 fori, passo 2.54 mm. Ospita i circuiti di sostegno dell'alimentazione e accensione sotto chiave. |
| La scatola originale del Blue&Me | 1 | La custodia del modulo guasto. Si monta sulla staffa originale e la plastica lascia passare il segnale Bluetooth. |
| Supporto stampato: telaio e base di montaggio | 1 | PETG o ASA. Il PLA si ammorbidisce in un'auto parcheggiata. |
| Viti e distanziali M3, fascette | Distanziali da 4 mm sotto il modulo CAN, da 5 mm sotto il Pi. Le fascette tengono il buck e la scheda audio. | |
| Facoltativi: chiamate in vivavoce | ||
| Cavo da 3.5 mm | 1 | Dal circuito del microfono all'ingresso microfono della scheda. |
| Resistenza, 2 kΩ | 1 | Alimentazione del microfono. |
| Resistenza, 1 kΩ | 2 | Una in parallelo alla resistenza da 2 kΩ dell'alimentazione, l'altra nel partitore. |
| Resistenza, 10 kΩ | 1 | Partitore del microfono. |
| Condensatore elettrolitico, 10 µF, 10 V o più | 1 | Impedisce alla tensione continua del microfono di arrivare alla scheda audio. |
| Componenti facoltativi per facilitare il montaggio | ||
| Adattatore micro-USB OTG | 1 | Per il banco. Nella scatola la scheda è saldata al Pi (passo 15). |
| Condensatore ceramico, 100 nF | 1 | Solo se il transceiver CAN non ne ha uno sull'alimentazione (passo 2). |
| Attrezzi | ||
| Multimetro, saldatore, bisturi | Indispensabile. Quello che conta davvero è il multimetro. | |
| Un telefono | 1 | Indispensabile. Quello che suonerà la musica. |
| Power bank USB | 1 | Indispensabile. Alimenta il Pi in tutti i lavori in auto fino al passo 15. |
| Adattatore OBD e MultiEcuScan su un tablet Windows | 1 | Indispensabile per l'allineamento del passo 10. |
| Alimentatore da banco regolabile | 1 | Consigliato. Permette di variare la tensione d'ingresso del convertitore e verificare quando smette di funzionare, prima di montarlo in auto. |
| Stampante 3D | 1 | Facoltativa. Per stampare il supporto e le sagome di prova. |
02 Montaggio al banco passi 1–6
Passo 1 — Identificare il modulo MCP2515
Due cose che ho chiarito prima di collegare qualsiasi filo.
a) Frequenza del quarzo
Ho cominciato dalla scritta sul quarzo della scheda CAN: 8.000 significa 8 MHz, 16.000 significa 16 MHz. Una foto ravvicinata ben illuminata aiuta se la scritta si legge male. Nell'installer il valore deve essere corretto, altrimenti più avanti il bus sembrerà silenzioso anche con i collegamenti giusti.
b) Resistenza di terminazione
Senza niente collegato, ho misurato con il multimetro la resistenza tra i morsetti a vite CAN-H e CAN-L.
- ~120 Ω → sulla scheda c'è una terminazione. Sulla mia c'era, e l'ho tolta. Sulla classica schedina blu MCP2515+TJA1050 sta proprio tra i due morsetti, con serigrafia
120Re sigla121. Va bene dissaldarla o sollevarne un lato. - Decine di kΩ → nessuna terminazione. È il risultato giusto, e non è un circuito aperto: la resistenza d'ingresso differenziale del TJA1050 resta sempre tra i pin, più o meno 20–100 kΩ. Con il transceiver montato non si legge mai infinito, quindi non ha senso cercare una resistenza che non c'è.
Il B-CAN dell'auto è già terminato ai due capi. Una terza terminazione abbassa l'impedenza differenziale e può bloccare il bus per tutti i moduli collegati, non solo per quello che si aggiunge. Due persone prima di me ci sono cascate in pieno: karolkrupa sull'Alfa 159 e un utente di fiatcan sul Doblò. Colpisce la differenza con fmntf, che un ponticello da 120 Ω l'ha aggiunto: lui stava interrogando una singola centralina isolata sul banco, dove nient'altro termina il bus. Qui banco e auto vogliono cose opposte.
Risultato dei controlli
| Valore | Conseguenza | |
|---|---|---|
| Quarzo | 8 MHz | install.sh --oscillator 8000000 |
| Terminazione (121, 120 Ω) | dissaldata | CAN-H↔CAN-L dopo legge 45 kΩ — solo il transceiver, terminazione sparita |
La frequenza del quarzo è chiara, e tra CAN-H↔CAN-L si legge molto più di 120 Ω: decine di kΩ è giusto, un vero circuito aperto non c'è da aspettarselo.
Passo 2 — Risolvere il problema dei 5 V
La scheda ha un solo pin VCC che alimenta tutti e due i chip. Il problema è tutto qui.
Il transceiver TJA1050 ha bisogno di 5 V per pilotare un bus CAN: è specificato per 4.75–5.25 V e non ha una modalità a 3.3 V. Quindi la scheda va alimentata a 5 V, anche il controller MCP2515 lavora a 5 V, e un chip che lavora a 5 V porta le sue uscite a 5 V. Una di quelle uscite è MISO, e MISO entra dritta nel GPIO9 del Pi, che non tollera i 5 V e non ha diodi di clamp.
MISO. Il cablaggio SPI, i 5 V del transceiver e il lato CAN restano com'erano.Una tensione eccessiva su un GPIO può danneggiarlo senza effetti subito visibili. La corrente che passa nelle strutture di protezione può deteriorare il pin nel tempo. Un'ora di funzionamento non dimostra che il collegamento sia sicuro. Ho quindi fatto la modifica prima di alimentare la scheda.
Tre possibilità
Separare le alimentazioni
Ho tagliato la pista di rame tra il pin VCC della scheda e il TJA1050, poi ho saldato un filo per portare i 5 V al transceiver per conto suo.
Un taglio, un filo, nessun componente in più.
Traslatore di livello su MISO
La scheda resta a 5 V e si mette un traslatore 3.3 V/5 V solo sulla linea MISO, l'unica che pilota verso il Pi.
Nessun intervento sulla scheda, ma un componente in più e altre tre saldature nel percorso SPI.
Comprare una scheda a 3.3 V
Un modulo basato su SN65HVD230 lavora nativamente a 3.3 V, controller e transceiver insieme.
Non c'è proprio niente da modificare. Costa poco. Per chi non vuole tagliare la scheda è la scelta giusta.
A rigore conta solo MISO. MOSI, SCK e CS sono uscite del Pi e ingressi dell'MCP2515: il Pi manda 3.3 V in un chip a 5 V, che li legge senza problemi come livello alto. MISO e INT sono le due linee che vanno nell'altro verso, e INT è open-drain. Ecco perché l'opzione B funziona con la sola MISO. Separando le alimentazioni le sistemi tutte in un colpo.
Cosa vuol dire davvero "tagliare la pista"
Una pista è una striscia di rame stampata sulla superficie del circuito. Fa il lavoro di un filo: è piatta, larga una frazione di millimetro, incollata alla scheda e coperta dalla vernice verde che si vede (il solder mask). Ogni collegamento del modulo è una di queste.
Tagliarla vuol dire interrompere fisicamente quel rame con una lama affilata, in modo che la corrente non possa più passarci: ho raschiato una piccola fessura attraverso la pista, fino alla vetronite nuda che c'è sotto. La scheda non si taglia, e non si piega né si toglie niente. Quello che ho fatto è un'interruzione voluta in un solo collegamento, larga circa un millimetro, in una pista più sottile di un tratto di matita.
Una volta interrotta, i due capi sono elettricamente separati. A quel punto ho saldato un filo a uno dei due e l'ho alimentato da un'altra parte. La modifica è tutta qui: interrompere un collegamento, e poi rialimentarne un lato.
Trovare la pista giusta senza tirare a indovinare
Ho individuato la pista con il multimetro anziché affidarmi al disegno di una scheda. Lo stesso controllo funziona anche con un modulo disposto diversamente dal mio. Con il multimetro sulla continuità, la sequenza è questa:
- Ho appoggiato un puntale sul pin
VCCdell'header della scheda e l'ho lasciato lì. - Con l'altro puntale ho toccato ogni pin del TJA1050 (il piccolo chip a 8 pin più vicino ai morsetti a vite del CAN) finché non ha suonato. È il pin di alimentazione: il pin 3 nel datasheet del TJA1050.
- Ho fatto lo stesso sull'MCP2515 (il chip più grande) per trovare il suo pin di alimentazione. Me li sono segnati tutti e due.
- Il rame che corre tra il pin
VCCe il pin di alimentazione del TJA1050 è quello da tagliare. L'ho seguito a occhio: di solito è corto.
Così sapevo quali due pin dovevano risultare separati e potevo verificarlo con il multimetro dopo il taglio.
Il taglio dal lato del transceiver, non da quello del controller
In tutti e due i casi si ottengono le alimentazioni separate. Ma se il pin dell'header resta collegato all'MCP2515, il pin in cui si infila il ponticello è quello dei 3.3 V: più difficile da sbagliare in seguito, ed è così in tutte le guide pubblicate.
Di solito c'è un piccolo condensatore sull'alimentazione del TJA1050. Deve restare con il transceiver, sul lato a 5 V del taglio. Se la scheda lì non ne ha, a lavoro finito va saldato un 100 nF tra il pin di alimentazione del transceiver e la massa.
Cosa serve
- Saldatore a punta fine e stagno sottile
- Bisturi o cutter da modellismo per il taglio
- Multimetro con cicalino di continuità quello importante
- Filo isolato sottile 28–30 AWG, ~60 mm
- Condensatore ceramico da 100 nF solo se non c'è già
- Lente o fotocamera del telefono per trovare la pista e controllare il taglio
Prima di tutto, una foto della scheda
Ho fotografato la scheda da vicino e con buona luce prima di modificarla. La foto serve da riferimento se durante il taglio non è più chiaro dove vanno i due lati della pista.
Incidere la pista di rame
Ho grattato via la vernice verde attraverso la pista, poi ho tagliato il rame che c'è sotto. Sono bastate due o tre passate leggere con la lama di traverso alla pista, non lungo la pista. Ho lasciato una fessura larga circa un millimetro, fino al supporto della scheda.
Meglio più passate leggere che una pesante che scava la scheda o scivola in una pista vicina.
Verificare il taglio con il multimetro
Dal pin
VCCdell'header al pin di alimentazione del TJA1050: adesso deve leggere aperto, nessun suono. Dal pinVCCdell'header al pin di alimentazione dell'MCP2515: deve suonare ancora. Se una delle due è al contrario, bisogna fermarsi e riguardare la scheda.Saldare il filo dei 5 V
Ho stagnato il rame scoperto dal lato TJA1050 della fessura e ci ho saldato il filo. L'ho tenuto corto e l'ho fermato (va bene colla a caldo o nastro): un filo che in auto si allenta si porta via la piazzola.
Controllare che non ci siano corti prima di dare tensione
I due pin di alimentazione adesso devono essere indipendenti l'uno dall'altro, e nessuno dei due deve essere in corto verso massa. Solo dopo averlo controllato ho collegato qualcosa al Pi.
121 è quello che ho dissaldato al passo 1.MISO non può presentare al Pi più di 3.3 V. Con il modulo alimentato e il Pi scollegato, sul pin di alimentazione dell'MCP2515 si misurano 3.3 V e su quello del TJA1050 5 V.
Passo 3 — Scrivere la scheda SD
Ho usato Raspberry Pi Imager sul mio computer.
- Sistema operativo: Raspberry Pi OS Lite (32-bit). Non la versione desktop. Il 32 bit è obbligatorio: lo Zero W è un ARMv6.
- In "Edit Settings" ho impostato: hostname
blueandme; SSH abilitato (chiave o password); nome utente e password; SSID, password e paese del Wi-Fi.
Ho avviato il Pi alimentandolo via USB senza nient'altro collegato, ho aspettato circa due minuti e poi sono entrato con ssh <user>@blueandme.local.
Riesco a collegarmi al Pi via SSH.
Passo 4 — Installare
# on your dev machine
git clone https://github.com/crimeofheart/giulietta-blue-me
cd giulietta-blue-me
rsync -a --exclude .git --exclude .venv ./ <user>@blueandme.local:~/giulietta-blue-me/
# on the Pi
cd ~/giulietta-blue-me
sudo ./install.sh --dry-run --oscillator 8000000 # read what it will do
sudo ./install.sh --oscillator 8000000 # 8 MHz, confirmed in step 1
sudo rebootLa prima installazione richiede un po' di tempo sullo Zero W: la parte più lunga è scaricare e installare i pacchetti con apt. Se in packages/ non c'è un pacchetto pronto per quella versione del sistema, viene compilato anche bluez-alsa per le chiamate a banda larga. Servono circa dieci minuti in più (passo 13). L'installazione riduce anche il tempo di avvio disabilitando ciò che non serve su un dispositivo senza schermo: initramfs, driver di display e fotocamera, servizi per modem, dischi e tastiera. I driver CAN e Bluetooth vengono caricati all'inizio (tempi al passo 15). Con i pacchetti già presenti, ripetere l'installazione richiede circa due minuti: apt viene saltato e si reinstalla solo l'applicazione.
install.sh finisce con "configuration is valid".
Passo 5 — Collegare l'MCP2515 al Pi
Prima ho spento il Pi (sudo poweroff, e ho aspettato che il LED si fermasse).
Il pin 1, prima di contare qualsiasi cosa
Tutti i numeri qui sotto sono posizioni fisiche dei pin, e hanno senso solo quando si sa da che parte dell'header sta il pin 1. Tre modi per trovarlo, dal più affidabile al meno:
- La piazzola quadrata. Il pin 1 è l'unica piazzola quadrata della scheda; le altre trentanove sono tonde. Se l'header è già saldato, si gira la scheda e si guardano le saldature da sotto.
- Il contorno serigrafato
J8. Il pin 1 è l'angolo al suo interno più vicino allo slot della microSD. - Lo slot della scheda. Il pin 1 è a quell'estremità dell'header, mai all'estremità opposta, dove ci sono le piazzole
RUNe il secondo foro di fissaggio.
Da lì la numerazione avanza a coppie lungo l'header, allontanandosi dallo slot: 1 e 2 nell'angolo, poi 3 e 4, poi 5 e 6. I dispari restano nella fila più vicina allo slot; i pari nella fila più vicina al bordo esterno della scheda.
J8. Tutte le altre piazzole sono tonde. Se l'header è già saldato, basta girare la scheda: la piazzola quadrata si vede da sotto.| Modulo | Segnale del Pi | Pin fisico | Note |
|---|---|---|---|
| VCC (MCP2515, dopo il taglio) | 3.3 V | 1 | Alimenta solo il controller |
| Alimentazione TJA1050 — il filo che ho aggiunto | 5 V | 4 | Il pin 2 è equivalente |
| GND | GND | 39 | Una massa basta; va bene qualsiasi pin di massa. In questa costruzione il pin 6 porta la massa dell'auto (passo 7) |
| CS | GPIO8 / CE0 | 24 | Corrisponde a spi0-0 nell'overlay |
| MOSI | GPIO10 | 19 | Il Pi pilota, il modulo ascolta |
| MISO | GPIO9 | 21 | La linea che richiede di separare le alimentazioni |
| SCK | GPIO11 | 23 | Clock |
| INT | GPIO25 | 22 | Deve coincidere con interrupt=25 nell'overlay |
MOSI e MISO scambiati. Non fa danni, produce solo un bus che non si inizializza mai, ed è identico a un valore del quarzo sbagliato. È più facile controllare due volte in quel momento che fare debug dopo.
Ho dato tensione e ho controllato:
blueandme-statusSi deve vedere interface present ok, link state UP, bitrate 50000, bus errors 0, spidev present ok. Se can0 non esiste:
dmesg | grep -i -E "mcp251|spi" # driver probe failures show here
ls /dev/spidev* # SPI enabled?
grep -E "spi|mcp2515" /boot/firmware/config.txtmcp251x spi0.0: MCP2515 successfully initialized è quello che volevo leggere. Cannot initialize MCP2515 vuol dire quasi sempre cablaggio, oppure il valore dell'oscillatore sbagliato.
blueandme-status mostra can0 attiva a 50000 con zero errori.
Passo 6 — Dimostrare che il software funziona, senza auto
Tutto si può provare su un'interfaccia CAN virtuale prima di tirare in ballo l'auto.
sudo modprobe vcan
sudo ip link add dev vcan0 type vcan && sudo ip link set up vcan0
tests/fixtures/fetch.sh # once: the Doblò recordings some tests read
python3 -m pytest # the vcan0 tests now run too
blueandme-protocol-map # the profile tables, generated from codeTutti i test devono riuscire. La mappa del protocollo deve mostrare i messaggi del profilo Giulietta.
03 In auto passi 7–10
Per tutto il lavoro di cattura ho alimentato il Pi con un power bank USB. I 12 V dell'auto non vanno al Pi. L'USB del Pi non va all'auto. Anche il tablet da cui lo comandavo è rimasto sulla sua batteria: un tablet in carica dall'auto mentre è collegato al Pi crea proprio il percorso di massa che il power bank serve a evitare.
Passo 7 — Primo contatto: solo ascolto
Ho usato due connettori diversi, uno per il Pi e uno per il tablet. Hanno funzioni distinte.

Cosa bisogna cercare
La spina lato cablaggio è la metà che rimane sull'auto: corpo blu, leva nera di bloccaggio, cablaggio che entra da dietro e due file di piccole cavità quadrate sulla faccia di accoppiamento. Nella mia auto penzola libera, perché il modulo originale non c'è più. Mi sono collegato lì, e così ho potuto accedere ai segnali senza tagliare il cablaggio originale.
Le foto identificano i due connettori e i numeri stampati sul loro corpo. NON dicono che cosa porta ciascun pin: quello è nella mappa qui sotto. Nelle due foto i connettori non hanno lo stesso orientamento: vanno confrontati i numeri stampati, non le posizioni.


| Passo | Pin | Etichetta | Collegare a |
|---|---|---|---|
| 1 | 8 | MIC TIP (mic +) | Giunzione A del circuito del microfono: 2 kΩ ‖ 1 kΩ (circa 670 Ω, lasciati così in auto) dal pin 2 del Pi (5 V), e il reoforo + del 10 µF. Il segnale esce dalla giunzione B verso la punta dello spinotto del microfono |
| 1 | 24 | MIC GND (mic −) | Giunzione G, quella delle masse |
| 2 | 5 | AUD L | Punta dello spinotto audio |
| 2 | 22 | AUD R | Anello dello spinotto audio (centrale) |
| 2 | 21 | AUD GND | Manicotto dello spinotto audio. Lo spinotto va nell'uscita cuffie della scheda audio |
| 3 | 30 | CAN-H | Morsetto a vite H dell'MCP2515 |
| 3 | 14 | CAN-L | Morsetto a vite L dell'MCP2515 |
| 3 | 15 | GND | Giunzione G, che porta anche la massa del Pi (pin 6). Il passo 5 aggiunge qui un secondo filo, verso il K1 della basetta (sostegno dell'alimentazione durante l'avviamento, poi IN− del buck) |
| 4 | 32 | IGNITION | Circuito di accensione sotto chiave: resistenza da 100 kΩ verso la base del PN2222. Su MAR ci sono 12 V; mai collegarli direttamente a un pin del Pi |
| 5 | 16 | +12V PERM | L'I10 della basetta: diodo e 2200 µF (sostegno dell'alimentazione durante l'avviamento), poi IN+ del buck. F36 tolto mentre lo si collega |
| – | 4 | GND | Niente: è di scorta. È la massa della presa USB del cassetto portaoggetti e non è dimostrato che arrivi alla carrozzeria, quindi tutti i ritorni restano sul 15 |
La mappa dei pin
Confermata da due fonti indipendenti: una discussione tedesca su Alfa 159/Brera che documenta il connettore del modulo M162, e una discussione italiana su ClubAlfa che parla proprio del montaggio del Blue&Me su una Giulietta. Vanno d'accordo tra loro e con i numeri che questo progetto usava già.
| Pin | Funzione | Serve per |
|---|---|---|
| 30 / 14 | CAN-H / CAN-L — "CAN alta" / "CAN bassa" | Passo 7, la presa |
| 15 | Massa | Passo 7, la presa |
| 16 / 32 | 12 V permanenti / 12 V sotto chiave | Solo al passo 15. Fino ad allora non si toccano. |
| 5 / 22 / 21 | Audio sinistro / destro / massa | Passo 14 |
| 7 / 23 / 25 | Audio+ / Audio− / MUTE, verso l'autoradio | Forse al passo 14 |
| 8 / 24 | Microfono, dalla plafoniera. Amplificato; vuole una sua alimentazione a 5–8 V | Passo 14, chiamate |
| 3 / 19 / 20 / 4 / 31 | USB D+ / D− / VCC / massa / schermo, verso la presa USB dell'auto | Non usati. Il VCC lo dava il modulo, quindi senza di lui la presa è probabilmente morta (non verificato) |
Perché mi fido della disposizione anche se la foto è presa di sbieco. Il corpo del connettore risulta essere un TE/AMP 968265-1, che TE dà come 32 posizioni su due file a passo 2.54 mm. Nella foto la faccia di accoppiamento mostra due file. E le funzioni si accoppiano esattamente come ci si aspetta da due file da sedici: 3/19 è la coppia differenziale USB, 4/20 la sua coppia di alimentazione, 8/24 la coppia del microfono, 14/30 la coppia CAN, 16/32 le due alimentazioni a 12 V. Ogni coppia cade in una colonna. Tre indizi indipendenti che vanno d'accordo: ecco perché questo è un disegno e non un'ipotesi.
Per collegarsi senza infilare puntali nella spina, i componenti corrispondenti sono il corpo 929053-2 e i contatti 144969-1.
La colonna 16 porta tutte e due le alimentazioni a 12 V e sta proprio accanto alla massa che si cerca, in colonna 15. Una cavità più in là è la differenza tra una presa che funziona e un cortocircuito su un positivo permanente di batteria.
Quindi ho individuato il 16 e il 32 prima di andare a cercare il 30, il 14 e il 15. Ho misurato verso la carrozzeria con la chiave su MAR: quei due sono a tensione di batteria e nient'altro su questo connettore dovrebbe esserlo. Una volta trovati, ho contato partendo da lì.
Dove collegare i fili
| Lato auto | Pin del Blue&Me | Va a |
|---|---|---|
| CAN-H | 30 | Morsetto a vite H del modulo MCP2515 |
| CAN-L | 14 | Morsetto a vite L del modulo MCP2515 |
| GND | 15 | Non alla morsettiera: è a 2 vie, solo H e L. Dritto a un pin di massa libero sull'header del Pi: il 6 in questa costruzione (oppure 9, 14, 20, 25, 30, 34, 39: sono tutti lo stesso nodo) |
Il collegamento di massa è necessario. Con il powerbank la massa del Pi è separata da quella dell'auto. Il CAN è differenziale, ma le tensioni agli ingressi del transceiver devono restare entro un intervallo riferito alla massa dell'auto. Ho quindi collegato le due masse. Senza questo collegamento i messaggi possono essere letti male o non essere letti.
Va bene qualsiasi pin di massa libero: sono tutti lo stesso nodo. In questa costruzione la massa dell'auto è sul pin 6, e la massa del modulo sul pin 39.
30 / 14 / 15 vengono da quello che fmntf ha scritto sul Doblò 263. Su quest'auto sono giusti: ogni cattura dal 2026-09-13 in poi è stata fatta lì, con zero errori di bus, e sul connettore passa tutto il B-CAN, diagnosi (18DA…) compresa. Sulla presa OBD passa solo il traffico della carrozzeria, senza alcuna diagnosi, quindi le catture fatte dai due punti non si confrontano mai.
Se si scambiano CAN-H e CAN-L in questo collegamento di solo ascolto, il controller non trasmette e candump non mostra niente. L'inversione non danneggia i componenti. Quello che non è innocuo è toccare i pin 16 e 32, che portano 12 V. Vanno individuati prima e tenuti lontani dai collegamenti di segnale.
Con l'auto che dorme e un multimetro, una coppia CAN legge circa 60 Ω tra le due linee (due terminazioni da 120 Ω in parallelo) e ogni linea legge aperto verso la carrozzeria. Quando si trova è una conferma utile, ma il B-CAN è un bus a bassa velocità e può essere terminato in modo diverso, quindi una lettura diversa da 60 Ω non dimostra che i pin sono sbagliati.
Poi ascoltare
candump -e can0,#FFFFFFFF # errors and data, everythingHo girato la chiave su MAR. Devono comparire dei frame.
Il passo 10 fa la differenza tra la cattura H e la cattura E, e due catture fatte in punti diversi del bus non sono confrontabili: la differenza mescolerebbe "frame che adesso il Body Computer si aspetta" con "frame che si vedono da un'altra parte".
La presa OBD2, e perché di norma il Pi non la usa
Il B-CAN della carrozzeria è sui pin 1 (CAN-H) e 9 (CAN-L) dell'OBD2, con la massa dal pin 4 o 5. L'ho misurato su quest'auto il 2026-09-21 a 122 frame/s, con gli ID di sempre (cattura M), e la piedinatura è stata confermata sull'auto. In una versione precedente di questa guida avevo ipotizzato i pin 3 / 11, ed era sbagliato. Come punto di presa per il traffico della carrozzeria va bene, ma la diagnosi da lì non si sente. La cattura N non contiene nemmeno un frame 18DA… lungo un allineamento PROXI, una lettura degli errori e una cancellazione degli errori. Quindi per qualsiasi lavoro di allineamento il Pi deve stare sul connettore del Blue&Me, e se l'adattatore del tablet deve condividere la presa gli serve uno sdoppiatore a Y per OBD2. Le catture M e N sono le uniche che ho fatto da qui; non le confronto con quelle fatte dal connettore.
Se non si vede niente
- L'auto è sveglia? La chiave deve essere su MAR, oppure una portiera aperta.
- Scambiare CAN-H e CAN-L. Provare non fa danni, ed è un errore comunissimo.
- Il filo di massa è collegato? Senza, il bus non si legge.
ip -details -statistics link show can0: se il contatorebus-errorsale, è sbagliato il bitrate o l'oscillatore; se resta a zero e non arrivano frame, manca il collegamento elettrico.- Ricontrollare la scritta sul quarzo rispetto a quello che è stato passato a
install.sh.
candump mostra un flusso di frame quando la chiave è su MAR.
Passo 8 — Cattura A: 11 bit o 29 bit?
Il comando più importante di tutto il progetto. Ho fatto partire la registrazione con la chiave sfilata, poi ho girato su MAR e ho aspettato 60 secondi.
Ho aspettato che lo strumento annunciasse la registrazione prima di girare la chiave. Sullo Zero W impiega circa quattro secondi ad avviarsi, e la richiesta PROXI arriva nei primi secondi dopo il risveglio della rete. Girare la chiave subito dopo Invio può far perdere proprio il messaggio che la cattura A deve registrare. Il tempo conta anche per le registrazioni qui sotto.
mkdir -p ~/captures
TAP="Blue&Me connector 30/14/15" # the same tap point for every capture
blueandme-capture --scenario A --out ~/captures/A-ignition-on.log \
--tap-point "$TAP" --duration 90Ho guardato le ultime righe dell'output:
ID widths seen: {'29-bit': 4127} <- the answerControllare la larghezza dell'identificatore. Il valore previsto è 29 bit. L'autore di alfa-blue-me lo aveva indicato per la Giulietta e l'ho confermato sulla mia. Una registrazione a 11 bit riguarda un bus diverso: i messaggi di questa guida non sono applicabili. Prima di proseguire va chiarita la differenza.
blueandme-decode ~/captures/A-ignition-on.log --profile doblo263 --summaryIl profilo del Doblò è il mio modello per la struttura. Mi aspettavo che qualche ID coincidesse per caso e che la maggior parte no. Quello che conta è se regge la forma topic<<16|node: gli ID si raggruppano in un piccolo insieme di metà basse 0x40xx?
La larghezza degli identificatori e l'elenco dei nodi sono chiari.
Sulla mia auto (2026-09-13): 29 bit.
Cattura A: 4157 frame su 4157 a 29 bit, zero errori di bus. Gli ID sono topic<<16 | node, come sul Doblò. Nodi: 4000 Body Computer, 4003 quadro strumenti, 4005 autoradio, e 4001 4002 4006 400A 4018 401A; il Blue&Me è il 4021.
Passo 9 — Il resto delle catture
Ho fatto un'acquisizione per ciascuno scenario, senza fretta. I confronti successivi dipendono dalla qualità di queste registrazioni.
# B — key MAR -> OFF, start recording first
blueandme-capture --scenario B --out ~/captures/B-ignition-off.log \
--tap-point "$TAP" --duration 90
# E — baseline: key in MAR, engine off, touch nothing at all
blueandme-capture --scenario E --out ~/captures/E-baseline.log \
--tap-point "$TAP" --duration 180
# C — one button at a time, 3 presses each, 2 seconds between
blueandme-capture --scenario C --out ~/captures/C-buttons.log \
--tap-point "$TAP" --duration 180 \
--label "vol+ x3, vol- x3, next x3, prev x3, src x3, mute x3, menu x3"
# F — radio: change source, volume up/down, mute
blueandme-capture --scenario F --out ~/captures/F-radio.log \
--tap-point "$TAP" --duration 120 \
--label "FM, volume, mute, source cycling"Poi ho cercato il frame dei tasti:
blueandme-diff ~/captures/E-baseline.log ~/captures/C-buttons.log --by bitsHo cercato un ID il cui payload torna tutto a zero tra una pressione e l'altra e i cui bit variabili formano una maschera pulita. L'ho confrontato con le maschere che le due piattaforme di riferimento hanno in comune: 0x8000 vol+, 0x4000 vol−, 0x2000 muto, 0x0400 sorgente, 0x0080 menu, 0x0040 windows.
Quattro catture su disco più un candidato per il frame dei tasti.
Sulla mia auto (2026-09-13).
Le catture A, B, E, C e F sono su disco. Il frame del volante è 06354000, dal Body Computer: lo stesso ID del Doblò, con le stesse maschere, più successivo 1000 e precedente 0800. Si ripete a 2 Hz, con un frame in più a ogni cambiamento. La cattura C contiene solo pressioni brevi.
Passo 10 — Cattura H: riallineare il PROXI con il Blue&Me
È reversibile: riallineando senza Blue&Me il lampeggio smette.
Con l'adattatore OBD2 e il software per le centraline ho lanciato l'allineamento PROXI con il Blue&Me presente nella configurazione del Body Computer. Il modulo fisicamente non c'era ancora, quindi il Body Computer ha cercato un nodo che non risponde mai.
Ho collegato il Pi alla spina del Blue&Me, lasciando la presa OBD2 al tablet. Potevo così usare entrambi contemporaneamente. Prima ho avviato l'acquisizione, poi ho eseguito l'allineamento mentre il Pi continuava a registrare.
blueandme-capture --scenario H --out ~/captures/H-proxi-with-bm.log \
--tap-point "$TAP" --duration 180
blueandme-diff ~/captures/E-baseline.log ~/captures/H-proxi-with-bm.logSe $TAP è diverso tra E e H, il confronto non è valido. Prima di usarlo ho verificato che i due file .meta.json indicassero lo stesso punto di collegamento.
Il confronto H − E ha mostrato i messaggi che il Body Computer si aspetta dal Blue&Me: la richiesta PROXI, le ripetizioni e le richieste di stato al nodo assente. Ho usato questo confronto al posto di una registrazione del modulo originale funzionante; il mio modulo guasto non poteva fornire quell'esempio.
Già che ero nel software per le centraline, ho controllato anche:
- se l'autoradio richiede una propria impostazione per attivare Blue&Me / la sorgente multimediale; in quel caso, trasmettere i messaggi CAN non basterebbe
- se il valore PROXI memorizzato nel nodo Blue&Me si può leggere (il ripiego, nel caso i nodi non condividessero un solo valore)
Il confronto H − E deve mostrare differenze. Va controllato anche cosa indica il software di diagnosi per l'autoradio.
Sulla mia auto (2026-09-21): il PROXI è risolto.
Circa un secondo dopo il risveglio della rete, il Body Computer manda 1E114000#. I nodi 400A 4003 401A rispondono in millisecondi con lo stesso valore di sei byte: il valore è condiviso. A un nodo che resta zitto vengono dati tre tentativi, e una mancata corrispondenza è quello che fa lampeggiare il contachilometri.
Mi sono segnato i sei byte con cui rispondono i nodi della mia auto. In una cattura sono i frame 1E11400A, 1E114003 e 1E11401A subito dopo 1E114000#. Quello è il valore PROXI di un'auto; va nella configurazione del Pi al passo 12.
Il lampeggio l'ho risolto nel Body Computer stesso. Il suo record PROXI 2023 deve avere il gruppo 6F 04 00 05 a 02, "telematica presente"; l'ha scritto experiments/node61/write_bc_record.py, tenendo un file di ripristino. Quello script cambia la configurazione dell'auto: prima di usarlo va letto experiments/README.md nel repository, e prima ancora va letto il record e messo da parte. Durante l'allineamento il Pi ha risposto anche alla diagnosi come unità telematica, 61, come fa il quadro strumenti con 60. Da allora l'auto si aspetta un nodo Blue&Me, quindi il lampeggio torna ogni volta che il Pi manca. All'autoradio non serve niente di suo (passo 12).
04 Profilo e prima trasmissione passi 11–12
Passo 11 — Confrontare il profilo con le catture banco
I frame che il Pi si aspetta e che manda stanno in blueandme/protocol/profiles/giulietta940.py, ognuno con la registrazione della mia auto in cui è stato visto: la larghezza a 29 bit, il frame del volante con le sue maschere, e tutti i frame che il nodo Blue&Me scambia con l'auto. Ricevuti: l'interrogazione di stato e la domanda PROXI del Body Computer, e la richiesta multimediale dell'autoradio. Trasmessi: lo stato, la risposta PROXI, il watchdog, il tempo del brano, il canale audio e il testo del brano.
Ho confrontato il profilo con le mie registrazioni prima di consentire qualsiasi trasmissione. I comandi qui sotto mostrano il profilo e decodificano le catture. Il confronto va ripetuto per l'auto su cui si fa il montaggio:
blueandme-protocol-map --profile giulietta940
blueandme-decode ~/captures/A-ignition-on.log --summary
blueandme-decode ~/captures/C-buttons.log --summaryNelle registrazioni devono esserci la richiesta di stato 0E094000, la richiesta PROXI 1E114000 e il frame del volante 06354000. I bit del volante devono anche corrispondere ai tasti premuti nella cattura C. Se una verifica fallisce, l'auto è diversa dalla mia: qui ci si ferma, con la trasmissione ancora disabilitata.
Le catture mostrano i frame indicati dal profilo, e blueandme-giulietta --check passa.
Quanto è veloce il Pi a rispondere. Riproducendo il traffico della mia auto verso l'applicazione su un bus virtuale (experiments/node4021/app_replay.sh): PROXI con risposta in 3.3 ms, la richiesta dell'autoradio in 3.1 ms (la sua finestra è di circa 100 ms), tutte le 62 interrogazioni di stato con una mediana di 3.5 ms. L'applicazione legge solo i frame del profilo; gli altri li filtra il kernel, altrimenti lo Zero W risponde all'autoradio troppo tardi.
Passo 12 — Prima trasmissione, un frame alla volta
Se succede qualcosa di inatteso — spie accese, un modulo che sparisce, l'autoradio che si comporta in modo strano — torno subito in solo ascolto e scrivo quello che ho visto.
Due controlli prima di trasmettere. Il modulo originale deve essere scollegato: due nodi con lo stesso indirizzo entrano in conflitto. Il valore PROXI del passo 10 va in /etc/blueandme/config.yaml, sotto can:, come 12 cifre esadecimali tra virgolette. Se il valore è vuoto, il Pi non risponde al PROXI. Sul mio Pi il valore è incluso nella copia che esegue. Questa impostazione esiste solo nel codice pubblicato: è coperta dai test, ma non l'ho ancora provata in auto.
can:
proxi_value: "............" # your car's six bytes, 12 hex digits, in quotesblueandme-giulietta --config /etc/blueandme/config.yaml --checkPoi un solo comando toglie il controller dal solo ascolto e lascia che l'applicazione mandi i frame indicati, tutti e sei se non si dice altro; off annulla tutte e due le cose:
sudo ~/giulietta-blue-me/tx.sh on # all six node frames
sudo ~/giulietta-blue-me/tx.sh on bm_status_response # or one at a time
sudo ~/giulietta-blue-me/tx.sh status
journalctl -fu blueandme-giulietta # every transmitted frame is logged
sudo ~/giulietta-blue-me/tx.sh off # back to listen-onlyLa mia auto li ha accettati tutti e sei, quindi on con tutti è il caso normale. Se qualcosa non torna, si va uno alla volta, in quest'ordine:
| # | Frame | Domanda a cui risponde |
|---|---|---|
| 1 | bm_status_response | Il Body Computer smette di considerare il nodo assente? |
| 2 | bm_proxi_response | Il contachilometri smette di lampeggiare? |
| 3 | bm_watchdog | Cambia qualcosa? |
| 4 | bm_audio_channel | Adesso l'autoradio propone, e accetta, la sorgente Blue&Me? |
| 5 | bm_track_time, bm_text_message | Compare del testo sui display? |
Al punto 2 avevo un sostituto accettato dall'auto. Il punto 4 ha aperto l'ingresso audio dell'autoradio. Solo allora aveva senso collegare la scheda audio all'auto.
Come si mettono d'accordo autoradio e Pi sulla sorgente. L'autoradio chiede con 06314005#0C…, il Pi risponde 06314021#…84 entro 3–5 ms, il frame del display 0A114005 passa a E2, e l'autoradio conferma con 04…10. L'uscita è 24, con risposta …80. Il Pi risponde solo se interrogato: un …84 mandato senza richiesta è stato ignorato. Ogni tanto l'autoradio salta il suo 0C; basta premere di nuovo MEDIA.
Lo script delle prime prove. Prima di integrare l'applicazione ho trasmesso con experiments/node4021/node4021_full.py, avviato a mano. È ancora disponibile per le prove non incluse nell'applicazione. L'ho copiato insieme a car_tx.sh nella home del Pi. Durante la prova, car_tx.sh abilita la trasmissione su can0 e alla fine ripristina la modalità precedente. Se sul bus non passa traffico, non parte. Si usa così: sudo ~/car_tx.sh 1800 --value <your PROXI value> --text.
Da quando l'auto si aspetta il modulo, il Pi resta in tx.sh on, anche dopo riavvii e reinstallazioni: senza la sua risposta PROXI il contachilometri lampeggia. Il solo ascolto (tx.sh off) serve soltanto quando i fili CAN sono appena stati collegati, finché ip -s -d link show can0 non mostra frame in arrivo e nessun errore. preflight.sh controlla che controller e applicazione siano d'accordo, e sia lui sia car_tx.sh rimettono la modalità che hanno trovato (car_tx.sh ferma l'applicazione per la durata della prova se è lei a trasmettere, e dopo la fa ripartire). tx.sh status mostra il controller e l'applicazione.
Arresto di emergenza
sudo ~/giulietta-blue-me/tx.sh off
# or, if that script is not there:
sudo sed -i 's/^ mode:.*/ mode: listen-only/' /etc/blueandme/config.yaml
sudo systemctl restart blueandme-giuliettaFisicamente: si staccano CAN-H e CAN-L.
05 Audio e installazione definitiva passi 13–15
Passo 13 — Scheda audio banco
Ho preparato l'audio a casa mentre lavoravo sul CAN. Il Pi Zero W non ha ingressi né uscite audio analogiche. L'autoradio riceve il suono sui pin 5 / 22 / 21 del connettore Blue&Me, mentre il microfono arriva sui pin 8 / 24. Ho usato una scheda audio USB per entrambi. L'audio non può passare sul CAN: il B-CAN lavora a 50 kbit/s, contro gli 1.4 Mbit/s necessari per l'audio stereo in qualità CD.
La scheda è un adattatore Ugreen USB-A basato su un C-Media HS-100B. Si collega alla porta micro-USB dati dello Zero W, quella con scritto USB e non PWR, con un adattatore OTG.
- Scheda audio USB Ugreen C-Media HS-100B
- Adattatore micro-USB OTG da spina micro-B a presa USB-A
- Cuffie per la prova dell'uscita
- Cuffie con microfono per la prova di registrazione
- Multimetro per il controllo del contatto esterno del jack
| HS-100B | |
|---|---|
| USB ID | 0d8c:0014 (C-Media), USB 1.1 full speed, 100 mA |
| Nome ALSA | Device, quindi plughw:CARD=Device |
| Uscita | stereo, uscita cuffie. Volume Speaker da −37 a 0 dB |
| Ingresso | ingresso microfono mono. Mic Capture da −12 a +23 dB; Auto Gain Control attivo di fabbrica; install.sh lo spegne, perché alle chiamate serve un guadagno del microfono fisso |
| Frequenze di campionamento | Solo 48 e 44.1 kHz. Le chiamate arrivano a 8 o 16 kHz, quindi il Pi le ricampiona |
Mic Playback deve restare spento. Rimanda l'ingresso del microfono dritto all'uscita. Di fabbrica è spento, ma in auto manderebbe il microfono dell'abitacolo nell'autoradio. blueandme-status avvisa se è acceso.
Il contatto esterno del jack dell'uscita cuffie è una vera massa. L'HS-100B può lavorare con un'uscita "cap-less", in cui il contatto esterno del jack sta a una tensione di polarizzazione invece che a massa. Questa scheda no: quando è alimentata, il contatto esterno del jack legge 0 V rispetto al guscio metallico della sua spina USB. Va ricontrollato se mai si cambia scheda, perché un contatto esterno del jack polarizzato non deve mai toccare il pin 21.
L'ingresso microfono ha circa 3 V di polarizzazione, a circuito aperto, per i microfoni electret semplici. È troppo poco per il microfono amplificato dell'auto, che non va mai collegato lì direttamente.
Prima su un PC
lsusbelenca la scheda con ID produttore0d8c. Poi ho misurato il contatto esterno del jack dell'uscita cuffie rispetto al guscio della spina USB: 0 V.Sul Pi: trovare la scheda
L'ho collegata con l'adattatore OTG.
aplay -learecord -ldevono elencarla tutti e due, comecard N: Device [USB Audio Device].Riprodurre e registrare
Ho mandato un tono in cuffia, poi ho registrato cinque secondi dal microfono delle cuffie e li ho riascoltati.
speaker-test -D plughw:CARD=Device -c 2 -t sine -f 440 -l 1
arecord -D plughw:CARD=Device -f S16_LE -r 48000 -c 1 -d 5 /tmp/mic.wav
aplay -D plughw:CARD=Device /tmp/mic.wavinstall.sh fa della scheda il dispositivo audio predefinito del Pi, con il suo nome Device. E configura il Bluetooth sia per la musica sia per le chiamate:
| Servizio | Cosa fa |
|---|---|
bluealsa | ricevitore della musica e lato vivavoce delle chiamate (-p a2dp-sink -p hfp-hf), in bluez-alsa 4.3.1 compilato con mSBC per le chiamate in banda larga |
bluealsa-aplay | manda la musica alla scheda |
blueandme-sco-route | all'avvio dice al chip Bluetooth dello Zero W di portare l'audio delle chiamate su HCI; senza, le chiamate sono mute |
blueandme-sco-aplay | manda alla scheda la voce di chi chiama, con un buffer di 150 ms |
blueandme-sco-uplink | manda il microfono della scheda al telefono. Tiene aperto il canale di chiamata finché il telefono è collegato, e non lascia mai che l'audio vecchio del microfono si accumuli in ritardo |
blueandme-bt-reconnect | dopo l'avvio tenta di collegarsi al telefono associato. Il mio telefono si ricollegava da solo quando accendevo il suo Bluetooth; se il Pi partiva dopo, doveva iniziare lui il collegamento |
Le chiamate sono in banda larga. Il bluez-alsa di Debian (4.0) porta le chiamate solo a 8 kHz. install.sh mette in /usr/local bluez-alsa 4.3.1 compilato con mSBC, dal pacchetto già pronto in packages/ oppure compilandolo, e con dpkg-divert lo sostituisce ai file di Debian. Il telefono allora sceglie mSBC, 16 kHz, sul chip Bluetooth dello Zero W stesso: sul banco sono arrivate parole dette piano che a 8 kHz si perdevano, e i pochi pacchetti danneggiati (circa tre in 75 s) sono stati mascherati. sudo ./install.sh --no-wideband rimette i file di Debian.
Il telefono si associa una volta. Finché l'applicazione è in solo ascolto nessuno risponde alle richieste di associazione, quindi blueandme-pair apre l'associazione per un po', si fida del telefono che si associa e la richiude. Ho associato dopo aver lanciato install.sh, così il telefono vede il profilo vivavoce; un telefono associato prima mostra solo "Media audio" e va dimenticato e associato di nuovo.
sudo blueandme-pair --seconds 120
# on the phone: pair with "blueandme", then check Phone calls and Media audio are onHo provato prima la musica, poi una chiamata, con le cuffie sulla scheda audio e un microfono nel suo ingresso. Entrambe le direzioni devono funzionare prima di portare i collegamenti audio in auto. Durante una chiamata, journalctl -u blueandme-sco-uplink mostra quanto audio del microfono è stato inviato.
Il Pi gestisce le chiamate con comandi AT sul collegamento vivavoce: blueandme-call answer per rispondere, blueandme-call hangup per riagganciare e blueandme-call calls per elencarle. Ogni comando mostra la risposta del telefono e ha esito positivo se riceve OK. Dopo un riavvio, blueandme-bt-reconnect ricollega il telefono automaticamente.
Tempi dell’audio delle chiamate
Il servizio che inoltra la voce al telefono scarta l'audio rimasto in attesa per più di 120 ms. Quando ho provato arecord | aplay, si accumulavano quattro secondi di audio tra le chiamate. Ho anche separato i riproduttori per musica e telefonate: con uno solo, la musica non ripartiva dopo aver riagganciato. Controllare il Bluetooth ogni tre secondi e dare più priorità al servizio del microfono ha evitato di sovraccaricare l'unico core.
Il volante
L'applicazione installata trasforma i tasti del volante in azioni sul telefono, come le descrive il manuale Blue&Me della Giulietta (604_38_194, p. 9): l'azione parte quando si rilascia il tasto, e una pressione tenuta più di un secondo è una pressione lunga. A ogni pressione chiede al telefono quali chiamate ci sono (AT+CLCC), così non perde mai il passo. Sul CAN non manda niente, quindi funziona anche in solo ascolto. Sul banco, con i tasti iniettati attraverso il loopback del controller (sudo ~/press.sh phone 1.5), ognuna di queste cose ha funzionato con un telefono vero e una chiamata vera (2026-09-26). In seguito, in auto e con i tasti veri del volante, ho verificato la risposta a una chiamata normale, il riaggancio, il rifiuto di una chiamata, il mute del microfono, il passaggio di una chiamata al telefono e ritorno, e l'assistente attraverso il microfono della plafoniera.
| Tasto | Cosa fa |
|---|---|
| ☎ telefono | Pressione: risponde a una chiamata che squilla, o prende quella in attesa. Tenuto premuto: rifiuta una chiamata che squilla (chi chiama sente occupato), o chiude la chiamata. |
| muto / ESC | In chiamata silenzia e riattiva il microfono. Fuori dalle chiamate mette in pausa e fa ripartire la musica. Chiude anche l'assistente. |
| voce ("Windows") | Apre l'assistente del telefono (AT+BVRA=1), che mi sente dal microfono dell'auto e risponde dagli altoparlanti. Il telefono chiude da solo la sessione dopo aver risposto; la sua pagina resta sullo schermo del telefono. |
| ▲ ▼ | Brano successivo e precedente. Sul mio telefono, la prima pressione di Precedente riporta all'inizio del brano. |
| SRC / OK | Durante una chiamata passa l'audio al telefono; premendo di nuovo lo riporta in auto. Fuori dalle chiamate, l'autoradio usa questo tasto per cambiare sorgente. |
| + / − | Sul Pi niente: il volume lo regola l'autoradio. |
Per passare la chiamata al telefono, il Pi interrompe il collegamento audio Bluetooth (hcitool, HCI Disconnect). Il telefono sposta quindi l'audio sulla propria capsula auricolare. Per riportarlo in auto uso AT+BCC, che chiede al telefono di ristabilire il collegamento. Con bluez-alsa 4.3.1 fermare i riproduttori non basta: la connessione rimane attiva, ma nessuna delle due persone sente più l'altra.
La scheda è elencata per riproduzione e registrazione, il contatto esterno del jack legge 0 V, e sia il tono sia la voce registrata si sentono in cuffia. Poi, con il telefono associato, la musica suona, e una chiamata resta sul Bluetooth, con i due lati che si sentono e senza ritardo percepibile.
Passo 14 — Portare audio e microfono all'auto
L'uscita cuffie della scheda va ai pin audio del connettore del Blue&Me.
| Segnale | Pin del Blue&Me |
|---|---|
| Sinistro | 5 |
| Destro | 22 |
| Massa audio | 21 |
Il contatto esterno del jack è una vera massa (passo 13), quindi lo spinotto si collega pari pari: la punta è il sinistro, al pin 5; l'anello è il destro, al pin 22; il contatto esterno del jack al pin 21.
Sono partito con il volume della scheda basso, ho selezionato Blue&Me e confrontato a orecchio il livello con la radio FM. La regolazione si fa sul Pi con il controllo della scheda. Poi va verificato se c'è ronzio dell'alternatore con il motore acceso. Se c'è, un trasformatore di isolamento audio 1:1 fra la scheda e l'auto interrompe l'anello di massa.
Il microfono. I pin 8 (MIC+) e 24 (MIC−) portano il microfono della plafoniera, che è amplificato. Vuole una sua alimentazione a 5–8 V sul filo di segnale, e un partitore prima dell'ingresso della scheda, perché la scheda non può alimentarlo e il suo segnale è vicino al livello di linea. Il circuito qui sotto fa tutte e due le cose. Su altre auto del gruppo la capsula è un Telicom MIC-98, che secondo il datasheet lavora a 5–8 V attraverso 680 Ω; nessuno ha confermato che la 940 monti lo stesso, quindi il circuito l'ho fatto in modo da poterlo misurare prima di fidarmi. Durante una chiamata l'applicazione dice anche all'autoradio, via CAN, che c'è una chiamata in corso, con il valore usato dal modulo del Doblò.
La basetta di prova del microfono
Ho montato prima il circuito su breadboard. Alimenta il microfono della plafoniera come faceva il modulo originale, ma con meno corrente. Il condensatore blocca la tensione continua e le due resistenze riducono il segnale di circa dodici volte prima dell'ingresso della scheda audio. Con questo circuito ho registrato, misurato il livello, riascoltato e fatto una telefonata. Il circuito di accensione sotto chiave del passo 15 occupa le righe 20–27 della stessa breadboard.
| Componente | Dove | Controllo |
|---|---|---|
| 2 kΩ | da 1c a 5c | multimetro in Ω, con la resistenza appoggiata sul tavolo (con le dita sui due reofori legge di meno): circa 2.0 k |
| 1 kΩ | da 1b a 5b, accanto a quella da 2 kΩ | circa 1.0 k; con tutte e due montate, dalla riga 1 alla riga 5 si leggono circa 670 Ω. Aggiunta in auto (2026-09-27): a quel punto il microfono stava a 2.37 V invece di 2.16 V |
| 10 µF | + in 5d, − in 8d | il reoforo lungo è il +, la banda segna il −; da 10 V o più |
| 10 kΩ | da 8c a 12c | circa 10 k |
| 1 kΩ | da 12d alla striscia − | circa 1.0 k |
| Cavo del microfono | punta in 12e, contatto esterno del jack nella striscia − | un vecchio cavo da 3.5 mm, tagliato; il filo centrale nastrato, non collegato; spinotto nell'ingresso MIC della scheda |
| Fili verso l'auto | 5e (pin 8), striscia − (pin 24 e 15) | cavetti jumper dupont |
| Ponticello di massa | dalla striscia − al pin 6 del Pi | resta collegato |
| Ponticello dei 5 V | da 1a al pin 2 del Pi | solo in auto: il pin 2 è nella fila esterna, il primo pin dal lato della microSD |
Prova a casa, il 2026-09-27. Ho tolto il ponticello dei 5 V, collegato la punta del cavo audio alla riga 5 e il contatto di massa alla striscia −. Ho riprodotto dalla scheda un tono a 200 Hz: misuravo 520 mV sulla riga 5 e 41.6 mV sulla riga 12. Il segnale si riduceva di dodici volte e mezza. La registrazione era pulita: −37.5 dBFS a 0 dB di guadagno, senza clipping. Con quel guadagno l'ingresso regge circa 2 V prima di saturare, quindi in auto ho iniziato con il guadagno massimo. Se la voce fosse risultata bassa, una resistenza più grande al posto di quella da 1 kΩ avrebbe ridotto l'attenuazione.
Misure sulla mia auto
| Misura | Valore |
|---|---|
| Dal pin 8 al pin 24, modulo scollegato | 6.5 kΩ nei due versi, aperto verso la carrozzeria |
| Alimentato da 5 V attraverso 2 kΩ | 2.16 V, 1.4 mA |
| Alimentato attraverso 2 kΩ ‖ 1 kΩ (670 Ω, tenuto così) | 2.37 V, 4.0 mA |
| Partitore, 10 kΩ su 1 kΩ | ÷ 12.5 (520 mV in ingresso, 41.6 mV in uscita) |
| Silenzio, guadagno mic della scheda a +23 dB | −60 dBFS |
| Parlato normale | da −41 a −55 dBFS, picchi intorno a −25 |
| Fischio forte | picchi a −0.8 dBFS, nessun clipping |
Per provare il microfono della plafoniera ho registrato la mia voce e qualche fischio, poi ho fatto una telefonata. Ho impostato un guadagno di 15 dB prima di inviare l'audio al telefono (--gain-db 15 in /etc/blueandme/sco-uplink.env). Dall'altra parte mi hanno detto che la voce arrivava molto bene. Era la conferma pratica delle misure.
In auto, in ordine
Ho riunito le prove audio e di alimentazione per il lavoro in auto: il passo 14 e la parte in auto del passo 15. L'ordine qui sotto lascia il Pi sul power bank fino al collegamento finale del convertitore.
A casa, prima di uscire
- Ho tolto dalla breadboard i fili del cavo audio (la punta dalla sua riga, il contatto esterno del jack dalla striscia −): da lì in poi quel cavo va ai pin audio 5, 22, 21 dell'auto.
- Ho tolto dalla riga 26 il ponticello provvisorio dei 5 V (serviva per la prova al banco del accensione sotto chiave).
- Per il viaggio sono rimasti scollegati il ponticello dei 5 V del microfono (riga 1) e i quattro fili verso l'auto (pin 8, 24, 15, 32). Il filo del pin 5 del Pi e la massa sul pin 6 del Pi sono rimasti collegati.
- Buck: ho saldato un filo rosso su IN+ e uno nero su IN−, ho messo guaina termorestringente sulle piazzole e pin dupont alle estremità.
- Cosa ho portato: il Pi con MCP2515 e scheda audio, la breadboard, il power bank, il buck con un cavo USB per la porta PWR del Pi, il cavo audio, cavetti dupont, una resistenza da 1 kΩ di scorta, multimetro, telefono, tablet, una pinzetta estrai-fusibili.
sudo ~/giulietta-blue-me/preflight.shfinisce conPREFLIGHT PASS, poisudo ~/giulietta-blue-me/tx.sh off: il Pi resta in solo ascolto mentre si collegano i fili CAN. In auto bisogna poter raggiungere il Pi; io ho usato l'hotspot del telefono.
In auto, prima misurare (Pi sul power bank)
- Modulo Blue&Me scollegato,
can0ancora in solo ascolto da casa (tx.sh status) mentre si collegano i fili CAN. - Volt in continua, puntale nero su metallo nudo: pin 16 circa 12 V sia a chiave spenta sia su MAR (permanente); pin 32 0 V a chiave spenta, circa 12 V su MAR (sotto chiave).
- Togliendo l'F36 (la scatola fusibili qui sotto) il pin 16 deve scendere a 0 V. Poi si rimette.
- CAN: il 30 su H, il 14 su L, e il filo della striscia − al pin 15.
- Quando
ip -s -d link show can0ha mostrato frame in arrivo e nessun errore:tx.sh on. Da lì in poi è il Pi a rispondere all'auto. Ho spento e riacceso il quadro: il contachilometri non ha lampeggiato.
Poi il microfono
- Solo multimetro, con la basetta ancora staccata dai pin 8 e 24: Ω dal pin 8 al 24, nei due versi; pin 8 e pin 24 verso metallo nudo (OL).
- Ho messo i fili della basetta sui pin 8 e 24, il ponticello della riga 1 sul pin 2 del Pi e lo spinotto del microfono nell'ingresso MIC della scheda.
- Con il multimetro in tensione continua, ho messo il puntale nero sulla striscia − e il rosso sulla riga 5. Una lettura nettamente inferiore a 5 V indica che il microfono assorbe corrente; circa 3–4 V è un buon riferimento iniziale. Meno di circa 2.5 V, oppure distorsione sui fischi forti, può indicare che la resistenza da 2 kΩ limita troppo la corrente. Si può sostituirla con una da 1 kΩ o aggiungerne una da 1 kΩ in parallelo, tra le righe 1 e 5. Ho scelto la seconda soluzione: circa 670 Ω, vicini ai 680 Ω del datasheet.
- Ho registrato sul Pi mentre fischiavo e parlavo verso la plafoniera, e ho riascoltato. Suonava pulito, quindi ho fatto una chiamata di prova con il microfono dell'auto.
Poi l'audio e l'applicazione
- Ho collegato il cavo audio ai pin 5 (punta), 22 (anello) e 21 (contatto esterno), e lo spinotto all'uscita cuffie. Selezionando Blue&Me, il telefono riproduce musica se l'app è stata usata di recente, e la radio mostra il brano. Ho regolato il volume e ascoltato a motore acceso per cercare eventuali ronzii. Con il Pi ancora sul power bank, la prova andava ripetuta dopo il passaggio all'alimentazione definitiva.
- Il volante: salto traccia, pausa, l'assistente, rispondere e rifiutare una chiamata.
Poi il sotto chiave (passo 15)
- Chiave spenta. Ho messo il filo della riga 26 sul pin 32.
- Ho impostato il Pi perché legga il sotto chiave su GPIO3. Mentre la chiave va su MAR e torna indietro, quell'ingresso deve risultare basso su MAR e alto da spenta.
Per ultimo, il buck (passo 15)
Mai alla breadboard e mai a un pin del Pi. Prima di toccare il pin 16 tolgo l'F36.
- Chiave sfilata. Ho tolto l'F36.
- IN+ del buck (rosso) sul pin 16; IN− del buck (nero) in un foro libero della striscia −, che arriva al pin 15 con il suo filo (circa 0.1 A; nell'installazione definitiva il buck ha un filo di massa tutto suo).
- Ho spento il Pi (halt). Quando il suo LED si è spento, ho spostato il cavo PWR del Pi dal power bank alla presa USB del buck.
- Ho rimesso l'F36: il Pi si è avviato dall'auto. La tensione di alimentazione va misurata sul Pi, perché lo Zero W non ha un rilevatore di sottotensione.
- Ho avviato il motore: il Pi doveva restare acceso. Il mio si è resettato finché non ho cambiato il convertitore; il diodo, il condensatore e i risultati delle prove sono al passo 15.
- Per lasciarlo ci sono due possibilità: o resta lì, alimentato dall'auto con
tx.sh on, oppure torna a casa con me. In quel caso lo spengo (halt), poi tolgo l'F36 prima di scollegare qualsiasi cosa.
La musica deve sentirsi dagli altoparlanti con volume sufficiente e senza rumore dell'alternatore.
Comandi e display della radio
Ho regolato a orecchio il livello Speaker della scheda per pareggiare il volume della radio FM. A −20 dB la musica era troppo bassa; sono arrivato a 0 dB, il massimo della scheda, e l'ho salvato con alsactl store. Poi ho ascoltato con il motore acceso. Non c'era ronzio, quindi non ho avuto bisogno di un isolatore di massa. Quel primo controllo era con il power bank. Anche con l'unità alimentata dall'auto e il motore acceso non c'è ronzio.
Alcuni tasti sono gestiti direttamente dalla radio. Fuori da una chiamata comunica sul CAN se è in mute, e il Pi mette in pausa il telefono finché l'audio non viene riattivato. Ho letto da questi messaggi anche le frecce della radio. Sinistra e destra cambiano brano; su e giù regolano il volume Bluetooth.
Il testo del brano usa il formato del modulo del Doblò, con il suo set di caratteri a 6 bit, come decodificato in fiatcan, e l'autoradio della Giulietta lo accetta. La riga in alto mostra i primi dodici caratteri di un campo di testo, quindi il Pi ci fa scorrere "artista - titolo" ogni quarto di secondo. La riga in basso mostra un altro campo, che porta il tempo come M:SS. Quattro codici di quel set su questa radio non mostrano niente e nessuno è una parentesi, quindi le parentesi in un titolo diventano *.
Comportamenti che dipendono dal telefono. La prima pressione di Precedente fa ripartire il brano corrente. Se l'app musicale è rimasta inattiva, il telefono ignora Riproduci finché non la apro. YouTube Music non esegue i comandi di avanzamento o riavvolgimento rapido. Per ora una chiamata WhatsApp non si può accettare dal volante: il tasto telefono risponde a una chiamata normale, ma il mio telefono riporta la chiamata WhatsApp in arrivo in uno stato che l'applicazione non considera una chiamata in arrivo.
Passo 15 — Installazione definitiva
Dopo aver verificato l'audio al passo 14, ho collegato l'alimentazione permanente. Il Pi riceve i 12 V permanenti dell'auto attraverso il fusibile F36. Rimane in standby fino a 72 ore, pronto a rispondere al PROXI quando l'auto si risveglia. Poi si spegne. Ho aggiunto altri componenti quando le prove ne hanno mostrato la necessità.
Perché il Pi resta acceso in parcheggio
L'auto chiede il PROXI circa un secondo dopo essersi svegliata, cioè quando la si apre, prima di girare la chiave. Chiede tre volte nel giro di pochi secondi. Un Pi che deve avviarsi in quel momento arriva troppo tardi, e di molto: in un avvio a freddo il 2026-09-27 il firmware ci ha messo circa 3.8 s, il kernel 5.6 s, e l'applicazione era sul bus circa 53 s dopo l'accensione.
Un Pi già acceso risponde subito: 3.3 ms riproducendo sul banco il traffico dell'auto (passo 11), 8 ms dallo script sorvegliato nella cattura ZB. In tutte le prove fatte finora il Pi era acceso quando l'auto si è svegliata, quindi al PROXI è sempre arrivata risposta e il contachilometri non ha mai lampeggiato. Cosa fa l'auto quando un Pi parte solo dopo il suo risveglio, come succederebbe dopo una sosta più lunga dell'attesa, non l'ho provato.
/sbin/init. Per riuscirci serve un kernel che si avvii in circa due secondi; nella mia installazione ne impiega cinque e mezzo. Per questo tengo il Pi in standby.Il consumo che ho misurato in standby
Misurato sul banco con un misuratore di potenza USB sull'ingresso a 5 V del Pi (experiments/standby/). Lo standby spegne Bluetooth e Wi-Fi, mette la CPU alla velocità minima e spegne il LED; l'interfaccia CAN resta attiva, nella modalità impostata da tx.sh, per accorgersi che l'auto si sveglia (in auto: in trasmissione, così al PROXI si risponde subito).
| Stato | Al Pi | Dalla batteria |
|---|---|---|
| In funzione: telefono collegato, musica o una chiamata | 1.0–1.07 W | motore acceso |
| Parcheggiata, standby | 0.63 W | circa 65 mA, 1.6 Ah al giorno |
| 72 ore di standby | circa 4.7 Ah, più o meno il 7 % di una batteria da 70 Ah | |
| Spento, dopo lo standby | 0.22 W | circa 25 mA, 0.6 Ah al giorno, finché non si toglie e si rimette l'F36 (o fino al circuito di accensione sotto chiave, se è montato) |
Per il calcolo ho assunto 12.4 V e un convertitore buck con efficienza dell'80 %. La capacità reale della batteria va letta sull'etichetta. Il Pi spento assorbe ancora circa un terzo della corrente di funzionamento. Tre settimane di parcheggio consumano circa 4.7 + 11 Ah, intorno al 22 %. Per assenze più lunghe tolgo F36 e interrompo l'alimentazione.
Blue&Me non è disponibile quando il Pi è spento. La radio non può usare la sorgente e il PROXI resta senza risposta. Togliendo e rimettendo F36 il Pi riparte ed è pronto in circa un minuto. Se le soste lunghe sono frequenti si può aggiungere il circuito di risveglio dal quadro descritto sotto; basta poi girare la chiave.
Risveglio dallo standby. blueandme-standby entra in standby dopo un minuto senza traffico, a quadro spento. Si risveglia con un messaggio CAN quando si sblocca l'auto, oppure dalla linea del quadro se collegata. Nella mia prova al banco con un messaggio, la musica era pronta in 3.3 s e le chiamate in 3.7 s. Da spento servono 33.5 e 34.2 s. Il servizio si attiva solo dopo aver visto traffico dell'auto: sul banco, con bus sempre silenzioso, non entra in standby.
L'installazione
| Aspetto | Come |
|---|---|
| Alimentazione | Buck da 12 V→5 V, di tipo automotive, con basso assorbimento a vuoto, dal pin 16 del Blue&Me (12 V permanenti) e dal pin 15 (massa), sempre acceso. Alla fine dell'attesa il Pi si spegne (circa 25 mA dalla batteria) finché non si toglie e si rimette l'F36 o, con il circuito di accensione sotto chiave montato, finché non si accende il quadro. Il modulo USB originale da 6–32 V l'ho sostituito, dopo una prova di dropout a vuoto, con un modulo step-down USB TECNOIOT da 6–24 V a 5 V; il sostituto ha risolto i reset all'avviamento (2026-10-01). Il convertitore è montato dentro la scatola, a pochi centimetri dal connettore, così il fusibile dell'auto per l'alimentazione del Blue&Me protegge il tratto corto di filo come proteggeva il cablaggio del modulo originale; un fusibile in linea da 2 A solo se i fili dovessero uscire dalla scatola. Sul banco, da un alimentatore a 12 V, ha tenuto il Pi a 4.90–4.92 V dall'avvio fino alla musica (0.12–0.32 A), con un assorbimento a vuoto trascurabile (convertitore originale, 2026-09-25); quella prova a 12 V non ha dimostrato il funzionamento a tensione d'ingresso bassa. Per le assenze lunghe stacco tutto togliendo il fusibile dell'auto, l'F36. A un pin GPIO i 12 V non devono arrivare mai. |
| PROXI | Ci risponde il Pi acceso, perché è in standby e non spento (3.3 ms sul banco). Dopo una sosta più lunga dell'attesa il Pi è spento finché non lo riavvii; cosa fa l'auto con una risposta in ritardo non l'ho provato. |
| Microfono | Ho saldato il circuito del microfono del passo 14 usando i valori misurati in auto. Adatta il microfono all'ingresso della scheda audio. |
| Rilevamento del sotto chiave | Il traffico CAN sveglia un Pi in standby, senza nessun filo. Solo un Pi spento, dopo una sosta più lunga dell'attesa, ha bisogno del sotto chiave: si aggiunge solo se soste del genere si rivelano frequenti; fino ad allora basta togliere e rimettere il fusibile. Il circuito è un transistor NPN e due resistenze (un PN2222 da uno starter kit): pin 32 → 100 kΩ → base, 100 kΩ tra base e massa, collettore a GPIO3 (pin 5 dell'header), emettitore a massa; un 1N4007 tra base ed emettitore (catodo sulla base) tiene i picchi negativi lontani dalla base (power.ignition_gpio: 3, ignition_active_low: true). GPIO3 è l'unico pin che fa partire un Pi spento quando viene tirato basso, e ha la sua pull-up da 1.8 kΩ. Non ho messo un optoisolatore: la massa del Pi è comunque la massa dell'auto. |
Non ho ancora reso il filesystem radice di sola lettura. La scheda ha superato finora le interruzioni di corrente, ma questo non dimostra che sia al sicuro dai danni.
Accensione sotto chiave
Facoltativo: permette al quadro di riavviare un Pi che si è spento dopo una sosta di più di 72 ore; senza, si toglie l'F36 e lo si rimette. Tre componenti del kit sulle righe 20–27 della breadboard del microfono, con la sua stessa striscia −. Quando la chiave è su MAR, il transistor tira a massa il pin 5 del Pi (GPIO3), e un Pi spento parte.
| Componente | Dove | Controllo |
|---|---|---|
| PN2222 | E in 21c, B in 22c, C in 23c | multimetro in prova diodi (→|): rosso su un piedino, nero su ciascuno degli altri; il piedino che legge circa 0.6–0.7 V verso tutti e due è la base (il piedino centrale nel PN2222). Con il rosso sulla base, il piedino che legge leggermente di più è l'emettitore. Nero sulla base: tutti e due OL (un NPN). |
| 1N4007 | banda in 22b, l'altro capo in 21b | la banda va sulla riga della base |
| 100 kΩ | da 22a alla striscia − | circa 100 k, misurata fuori dalla basetta |
| 100 kΩ | da 22d a 26d | circa 100 k |
| Ponticello | da 21a alla striscia − | la massa dell'emettitore |
| Filo | da 23e al pin 5 del Pi | pin 5: la fila interna, il terzo pin dal lato della microSD |
| Filo | da 26e al pin 32 dell'auto | la linea del sotto chiave, come misurata in auto |
Provato al banco il 2026-09-27. I 5 V del Pi stesso (pin 2) sulla riga 26, al posto del sotto chiave, hanno portato GPIO3 a 0; senza, 1. Un Pi spento è partito nel momento in cui li ho collegati (spento alle 14:38:48, di nuovo in rete alle 14:39:56). Quel ponticello provvisorio dopo l'ho tolto, altrimenti il Pi riparte ogni volta che si spegne. In auto servono solo il filo del pin 32 e due righe di configurazione (ignition_gpio: 3, ignition_active_low: true).
Da 12 V a 5 V
Il convertitore non va sulla breadboard: ha le proprie piazzole di saldatura e l'uscita USB. Così tengo i 12 V separati dalla breadboard e dai pin del Pi.
| Da | A | Nota |
|---|---|---|
| Pin 16 dell'auto (12 V permanenti) | IN+ del buck | a valle del fusibile F36 dell'auto. In via definitiva, attraverso il sostegno dell'alimentazione durante l'avviamento: pin 16 → I10 della basetta, L10 della basetta → IN+ del buck |
| Massa dell'auto | IN− del buck | la striscia − per la prova in auto. In via definitiva: pin 15 → K1 della basetta, L1 della basetta → IN− del buck |
| Presa USB del buck | Porta PWR del Pi | un cavo USB; l'altra porta del Pi resta alla scheda audio |
Saldato, senza breadboard
Per l'installazione definitiva il circuito del microfono è saldato, con ogni giunzione coperta dalla guaina termorestringente: in auto una breadboard con le vibrazioni si allenta. Il circuito di accensione sotto chiave va sulla millefori della parte successiva. Valori come sono rimasti in auto (2026-09-27): con una da 1 kΩ accanto alla 2 kΩ il microfono stava a 2.37 V (2.16 V con la sola 2 kΩ) e registrava pulito a guadagno massimo, fischi forti compresi.
- Ho tagliato i fili a misura. Prima di saldare ho infilato un pezzo di guaina su ogni filo che finisce in A, B o G, e uno su ogni componente da unire.
- La 2 kΩ e una da 1 kΩ affiancate, con i reofori attorcigliati insieme ai due capi (circa 670 Ω); un capo al filo del pin 2 del Pi.
- A: l'altro capo della coppia, il reoforo + del condensatore e il filo del pin 8 dell'auto, attorcigliati e saldati. Il reoforo − del condensatore a un capo della 10 kΩ.
- B: l'altro capo della 10 kΩ, la seconda da 1 kΩ e il filo della punta dello spinotto del microfono.
- G: l'altro capo di quella da 1 kΩ, i pin 24 e 15 dell'auto, il contatto esterno del jack dello spinotto del microfono e il filo di massa del Pi.
- Ho fatto scorrere ogni guaina sulla sua giunzione o sul suo componente e l'ho ristretta (con una pistola ad aria calda, oppure con un accendino tenuto sotto, non dentro la fiamma).
- Multimetro in Ω prima di andare in auto: dal filo del pin 2 del Pi al filo del pin 8 dell'auto circa 670 Ω; dalla punta del microfono a massa circa 1 k; dal pin 8 dell'auto a massa aperto.
Con l'unità montata nella sua scatola, la persona che ho chiamato sentiva un rumore basso, come di motore, e non la mia voce. Tornato al banco (2026-10-11), il rumore di fondo dell'ingresso microfono era −34 dBFS con +23 dB di guadagno e niente sul pin 8 dell'auto. In auto, il 2026-09-27, con il microfono della plafoniera collegato e l'abitacolo in silenzio, era stato circa −60. Al banco era uguale con il power bank e con il pin 8 dell'auto collegato al pin 24, ed è sparito (−82) togliendo lo spinotto del microfono dalla scheda. Quindi entrava dallo spinotto del microfono, e le due cause erano masse.
Avevo portato il contatto esterno del jack del microfono solo al pin 24 dell'auto e non alla giunzione G. Una volta collegato, il rumore di fondo è sceso a −40. Inoltre la massa della scheda audio stava sopra quella del Pi, 60–80 mV con lo spinotto del microfono staccato e 30–38 mV con lo spinotto inserito: circa 2 Ω nella massa del suo cavo USB, che avevo accorciato e saldato al Pi per farlo entrare nella scatola. Un filo corto saldato dalla massa della scheda alla giunzione G ha portato quella differenza a 4.5 mV con lo spinotto del microfono inserito e il rumore di fondo a −59 dBFS con il pin 8 collegato al pin 24. È vicino al −60 del 2026-09-27, ma non è la stessa prova: lì il microfono era collegato, qui non c'era microfono e i due pin erano uniti.
Due letture, con l'alimentazione accesa, trovano entrambe le cose. Con lo spinotto del microfono staccato: dalla punta dello spinotto al pin 24 dell'auto, circa 1 kΩ. Con lo spinotto inserito: millivolt in continua tra il pin 21 dell'auto (la massa della scheda, attraverso il cavo audio) e il pin 24 dell'auto, pochi millivolt e stabili. Decine di millivolt che oscillano sono il rumore stesso.
Dopo le due correzioni le chiamate funzionano di nuovo: l'ho provato in auto con l'unità montata del tutto (2026-10-11). La persona che chiamo dice di sentire una leggera eco. Non l'ho misurata e me ne occuperò più avanti.
Accensione sotto chiave e sostegno dell'alimentazione durante l'avviamento su un'unica millefori
I due circuiti che toccano i 12 V dell'auto, su un solo pezzo della millefori del kit (fori metallizzati, nessuno collegato): 10 colonne × 24 righe, la misura della basetta da 3 × 7 cm (su un'altra basetta i fori vanno contati). Il circuito di accensione sotto chiave prende le righe A–G; la riga H resta vuota; il sostegno dell'alimentazione durante l'avviamento prende le righe I–X, quasi tutte occupate dal condensatore sdraiato. I componenti stanno sopra, i collegamenti si fanno sotto con i reofori piegati e ponti di stagno. Con il condensatore sdraiato la basetta è alta circa 21 mm.
Sostegno dell'alimentazione durante l'avviamento e rimedio per il convertitore (2026-10-01). Il Pi installato si resettava durante l'avviamento nonostante un condensatore da 2200 µF che avevo aggiunto. Il convertitore originale, venduto per 6–32 V, dava 0 V con un alimentatore da banco a 10 V, anche con il Pi scollegato e l'alimentatore in tensione costante. L'uscita tornava verso gli 11 V; a 12 V di alimentazione il multimetro misurava 5.09 V in uscita. Cambiando il convertitore i reset sono spariti. Il sostituto, un modulo step-down USB TECNOIOT da 6–24 V a 5 V, ha tenuto acceso il Pi fino a 5 V sull'alimentatore da banco; la tensione sul Pi con quell'ingresso non l'ho registrata. Inoltre l'IN− del buck è risultato scollegato e l'ho ricollegato prima di queste prove; gli serve un ritorno tutto suo al pin 15. Il pin 16 arriva al buck attraverso un diodo, con il condensatore da 2200 µF montato in parallelo a IN+/IN− subito dopo. Serve un condensatore da almeno 35 V; la banda del diodo guarda verso il condensatore. Questo rimedio non ha richiesto di aumentare la capacità. La forma d'onda dell'avviamento dell'auto non l'ho ancora misurata; nel calcolare il tempo di tenuta non va dato per buono un limite d'ingresso dichiarato di 6 V.
| Componente | Fori | Controllo |
|---|---|---|
| PN2222 | E in B3, B in B5, C in B7; faccia piatta verso la riga C | E, B, C trovati prima con il multimetro, come nella tabella della breadboard qui sopra |
| 100 kΩ | da D1 a D5 (base verso massa) | circa 100 k, misurata fuori dalla basetta |
| 100 kΩ | da E5 a E9 (dal pin 32) | circa 100 k |
| 1N4007 | da F1 a F5, banda in F5 | la banda va sulla colonna della base |
| Diodo | da J10 a J6, banda in J6 | 1N5822 o 1N4007; la banda verso il condensatore |
| 2200 µF 35 V | + in L6, − in L3; corpo sdraiato sopra le righe M–X | il reoforo lungo è il +, la banda sul corpo segna il −. Montato al contrario può scoppiare |
| Fili | Pin 5 del Pi B9, massa del Pi G1, pin 32 dell'auto G9; pin 16 dell'auto I10, pin 15 dell'auto K1, IN+ del buck L10, IN− del buck L1 | entrano da sopra, saldati sotto |
| Piste | B3–B1–G1, B5–F5, B7–B9, E9–G9; I10–J10, J6–K6–L6–L10, K1–L1–L3 | sotto; nessun altro foro collegato |
- Ho iniziato dal transistor: ho allargato E e C per inserire i piedini in B3, B5 e B7, con la faccia piatta verso la riga C. Ho saldato sotto, senza unire i tre punti di saldatura.
- Le due resistenze e l'1N4007, sdraiati sulla basetta, banda in F5; il diodo dell'avviamento in J10–J6, banda in J6. Ho saldato, lasciando i reofori lunghi finché le piste non erano fatte.
- Ho piegato i due reofori del condensatore a 90°, a circa 3 mm dal corpo: + in L6 e − in L3. Ho disposto il corpo in orizzontale verso la riga X, saldato e fissato con colla. Si può anche usare una fascetta attraverso due fori liberi.
- Le piste sotto: ho steso ogni reoforo lungo sulla sua pista e l'ho saldato nei fori successivi; il resto l'ho fatto con ponti di stagno o con uno spezzone di filo nudo. Sotto chiave: B3–B1–G1, B5–F5, B7–B9, E9–G9. Avviamento: I10–J10, J6–K6–L6–L10, K1–L1–L3. La riga H e tutto il resto restano separati.
- I sette fili entrano da sopra e si saldano sotto.
- Multimetro in Ω, niente collegato: da C a E aperto nei due versi; dal filo del pin 5 del Pi al filo di massa del Pi aperto; dal filo del pin 32 dell'auto a B5 circa 100 k. Lato avviamento: dal filo del pin 16 dell'auto al filo IN− del buck non deve leggere vicino a 0 (il condensatore si carica dal multimetro, quindi la lettura sale); tra IN+ e IN− del buck lo stesso; in prova diodi, da I10 a L10 circa 0.3–0.7 V in un verso, niente nell'altro. Poi una goccia di colla sulle saldature dei fili.
- In auto, con l'F36 tolto, ho collegato i fili e ho rimesso l'F36. Resta da leggere GPIO3 mentre la chiave va su MAR e torna (0 su MAR, 1 da spenta), e da vedere che il Pi resti acceso durante un avviamento; lo Zero W non ha un rilevatore di bassa tensione, quindi
get_throttled=0x0non prova che l'alimentazione sia stabile. Se si resetta, vanno misurati con un oscilloscopio l'ingresso del buck e i 5 V del Pi.
L'avviamento abbassa l'alimentazione anche mentre il Pi è acceso in standby. Sul banco il buck originale perdeva l'uscita intorno ai 10 V di alimentazione; sostituirlo ha risolto i reset di cui ho parlato. Ho lasciato montati il diodo e il condensatore da 2200 µF, e mi sono assicurato che l'IN− del buck sia collegato al pin 15. Se i reset tornano, registrerò l'ingresso del buck e i 5 V del Pi durante l'avviamento. Lo Zero W non può segnalare una sottotensione con vcgencmd get_throttled: Raspberry Pi documenta l'esclusione della gamma Zero.
Lo Zero W non ha un orologio in tempo reale. Finché NTP non imposta l'ora, il valore started_at di ogni registrazione è la data di compilazione dell'immagine. L'hotspot del telefono permette di correggere l'orologio, ma le registrazioni precedenti conservano la data sbagliata. Un DS3231 da circa 2 € risolverebbe il problema; non l'ho ancora montato. Con il risveglio dal quadro serve un bus I2C separato (dtoverlay=i2c-gpio), perché quel circuito usa i pin 3 e 5.
- Non ho ancora completato la prova di parcheggio prolungato. Occorre controllare la batteria dopo una notte e poi dopo quattro giorni. Il Pi deve spegnersi dopo 72 ore;
blueandme-standbydeve registrare lo spegnimento e il Wi-Fi smettere di rispondere. Rimettendo F36, oppure girando la chiave con il circuito di risveglio installato, il Pi deve ripartire. Il funzionamento quotidiano non dimostra che non scarichi la batteria durante una sosta più lunga.
Montaggio di custodia e connettore
La custodia originale misura 150 × 175 × 40 mm e ha quattro supporti per viti M3. La plastica PP-TD40 lascia passare il Bluetooth. Per stampare telaio e base di montaggio servono PETG o ASA; il PLA può ammorbidirsi in un'auto parcheggiata. Oltre a controllare il modello, bisogna provare gli ingombri dei cavi e degli spinotti reali e fissare tutto prima di chiudere.








Per eliminare l'adattatore USB ho accorciato il cavo della scheda audio e l'ho saldato alle piazzole di test sotto il Pi. PP1 corrisponde a 5 V, PP6 a massa, PP22 a D+ e PP23 a D−. L'uscita a 5 V del convertitore va ai pin 4 e 6 del Pi.

Il connettore usa 32 pin quadrati da 0.64 mm, a passo 2.54 mm, su millefori tagliata a 2 × 16 fori con un bordo di circa 5 mm. Sono cablati solo i pin necessari. Prima di collegarlo, segnare i pin 1 e 17 e verificarli con i numeri "1" e "17" stampati sulla spina.

Fissare e isolare i fili sui pad USB. Se la scheda scompare con device descriptor read/64, error -71, controllare i cavi dati e le saldature. Non azzerare il controller USB dello Zero W tramite unbind: nella mia prova ha causato un crash del kernel e l’USB è tornato solo togliendo alimentazione.
Wi-Fi durante l’audio
Sullo Zero W, Bluetooth e Wi-Fi condividono lo stesso chip radio. Ho misurato queste perdite di pacchetti con il Pi collegato all'hotspot del telefono. Spegnendo il Wi-Fi, le interruzioni della musica sono sparite.
| Wi-Fi | Pacchetti audio persi al minuto |
|---|---|
| Wi-Fi acceso, collegato all'hotspot, senza trasferimenti | 150–320 |
| Acceso, con traffico SSH | 500–1200 |
| Spento | 0 |
Ho aggiunto un piccolo servizio perché lo facesse al posto mio. Controlla i flussi audio Bluetooth ogni tre secondi e spegne il Wi-Fi durante la musica o una chiamata. Trenta secondi dopo la fine dell'audio lo riaccende. Lo ripristina soltanto se l'aveva spento lui, quindi non interferisce con lo standby.
In auto il Wi-Fi si spegne due secondi dopo l'inizio della musica. Quando voglio collegarmi al Pi via SSH, metto in pausa e aspetto circa 40 secondi.