Sommario:

Adattatore da tasti al volante all'autoradio (CAN Bus -> Key1): 6 passaggi
Adattatore da tasti al volante all'autoradio (CAN Bus -> Key1): 6 passaggi

Video: Adattatore da tasti al volante all'autoradio (CAN Bus -> Key1): 6 passaggi

Video: Adattatore da tasti al volante all'autoradio (CAN Bus -> Key1): 6 passaggi
Video: Esempio pratico ai collegamenti di alimentazione di una Radio 1-2 DIN nella propria Auto 2024, Dicembre
Anonim
Sniffing del bus CAN
Sniffing del bus CAN
Invio di comandi allo stereo
Invio di comandi allo stereo

Pochi giorni dopo aver acquistato un'auto usata, ho scoperto che non riesco a riprodurre la musica dal mio telefono attraverso l'autoradio. Ancora più frustrante era che l'auto aveva il bluetooth, ma consentiva solo chiamate vocali, non musica. Aveva anche una porta USB per Windows Phone, ma non funzionava con un iPhone senza un dongle da 60$.

Dopo aver sostituito gli stereo delle mie auto precedenti, senza troppi pensieri o ricerche, ho ordinato uno stereo sostitutivo da 40 $ da un noto sito web "economico". Lo stereo era dotato di telecamera per la retromarcia, Car Play e un sacco di funzioni extra, che sembravano un valore molto migliore rispetto al dongle più costoso che fa solo una cosa.

Dopo aver acquistato e dipinto un nuovo frontalino, la stampa 3D di una montatura e un sacco di lavoro extra (che potrebbe essere un'istruzione da solo), sono arrivato a una spiacevole scoperta. I comandi da tastiera al volante venivano inviati tramite bus CAN, ma lo stereo aveva solo un ingresso Key1. Non essendo uno che si arrende a metà, ho ordinato un adattatore da 60£, che si è rivelato non funzionare. A questo punto ho deciso di fare un adattatore da solo.

Non sono un ingegnere elettrico, ho solo una conoscenza rudimentale dell'elettronica e questo è stato per me un progetto di apprendimento ed esplorazione. Il mio consiglio sarebbe di controllare prima le specifiche del tuo veicolo e ordinare una radio compatibile, ma se sei già bloccato (come lo ero io) segui le istruzioni a tuo rischio.

Forniture

L'adattatore (circa 15$)

  • Arduino Pro Mini 5V (o una scheda compatibile)
  • MCP2515 Modulo CAN bus
  • Tavola perforata 60x80mm
  • Potenziometro digitale X9C104 100K Ohm (dipende dal tuo stereo)
  • Regolatore step down DC-DC LM2596S 3-40V 3A
  • Portafusibile cavo + fusibile (100-200 Ohm)
  • Scatola del progetto o stampante 3D per stamparlo
  • Prese per autoradio (maschio + femmina)
  • Forniture per saldatura, fili, ecc.

Supporti di test (non strettamente necessari ma renderanno il test molto più semplice)

  • Arduino (qualsiasi scheda 5V andrà bene)
  • MCP2515 Modulo CAN bus
  • Tagliere + maglioni

Passaggio 1: sniffing del bus CAN

Invece di avere un mucchio di cavi che corrono all'interno della tua auto collegando un sacco di sistemi, alcuni veicoli moderni hanno coppie di cavi che corrono verso ciascun componente. Le informazioni vengono inviate come pacchetti di dati digitali attraverso questi cavi e tutti i sistemi possono leggere tutti i messaggi. Questa è la rete del bus CAN (possono esserci più reti nella tua auto, quindi tutte le informazioni potrebbero non essere visibili).

Quello che vogliamo fare, è connetterci alla rete CAN bus e "sniffare" il traffico dati. In questo modo possiamo "vedere" quando viene premuto un tasto del volante. Ogni pacchetto ha un ID, che rappresenta il sottosistema del veicolo che ha inviato il pacchetto, ei dati che rappresentano lo stato del sistema. In questo caso stiamo cercando di trovare l'ID del sottosistema che invia i messaggi dei tasti del volante e la rappresentazione dei dati di ogni tasto.

Se sei fortunato potresti trovare i valori per la tua auto da qualche parte online e saltare questo passaggio.

Questo processo è un po' complicato ed è già stato spiegato in altri posti, quindi lo riassumerò semplicemente:

  • Trova i valori corretti per la comunicazione bus CAN sul tuo veicolo. Per la mia auto (una Fiat Idea del 2009) era una velocità di trasmissione di 50 KBPS e una velocità di clock di 8 MHz.
  • Collegarsi alla rete CAN bus utilizzando il modulo CAN bus e un Arduino in configurazione "sniffer".
  • Leggi i valori del bus CAN sul tuo laptop utilizzando uno strumento come https://github.com/alexandreblin/python-can-monito…. Sarà molto difficile farlo senza di essa, poiché vengono inviati molti messaggi anche quando l'auto non sta facendo nulla.
  • Premere il pulsante al volante e notare le modifiche del valore. Questo può essere un po' complicato in quanto vengono inviati molti messaggi e potrebbe essere difficile capire quale sia quale.

Ecco due ottimi articoli che spiegano in modo approfondito il processo:

  • https://medium.com/@alexandreblin/can-bus-reverse-…
  • https://www.instructables.com/id/CAN-Bus-Sniffing-…

Alla fine dovresti avere l'ID del sottosistema che useremo per ascoltare solo i messaggi del bus CAN al volante e un elenco di valori esadecimali per i comandi dei tasti. Nel mio caso i dati erano così:

ID | ID esadecimale | Byte 0 | Byte 1 | Pulsante

--------------------------------------------- 964 | 3C4 | 00 | 00 | Nessun pulsante 964 | 3C4 | 04 | 00 | SRC 964 | 3C4 | 10 | 00 | >> 964 | 3C4 | 08 | 00 | << 964 | 3C4 | 00 | 80 | Telefono 964 | 3C4 | 00 | 08 | ESC 964 | 3C4 | 80 | 00 | + 964 | 3C4 | 40 | 00 | - 964 | 3C4 | 00 | 40 | Vinci 964 | 3C4 | 00 | 02 | Su 964 | 3C4 | 00 | 01 | Giù 964 | 3C4 | 00 | 04 | ok

L'ID del sottosistema è 3C4 (in questo caso), che è un numero esadecimale, quindi dovremmo scriverlo come 0x3C4 negli sketch di Arduino. Siamo interessati anche ai byte 0 e 1 (nel tuo caso potrebbero esserci più byte). Anche questi sono valori esadecimali, quindi dovrebbero essere scritti anche con uno 0x iniziale.

Se converti i valori in binario, noterai che i bit non si sovrappongono (ad esempio + 0b10000000 e - 0b010000000) questo è così che possono essere premuti più tasti contemporaneamente.

Suggerisco di costruire lo sniffer con i materiali elencati nella sezione "test helper", in modo da poterlo riutilizzare in seguito per simulare la tua auto. Ciò ti eviterà di dover stare seduto in macchina tutto il tempo mentre stai costruendo e testando l'adattatore. È possibile utilizzare lo schizzo fornito per fungere da simulatore. Modifica "subsystemId", "data0" e "data1" con i valori che hai annusato.

Passaggio 2: invio di comandi allo stereo

Invio di comandi allo stereo
Invio di comandi allo stereo

Prima di iniziare a costruire l'adattatore, è meglio testare prima se lo stereo può ricevere comandi.

Avevo una batteria di riserva per auto, quindi ho collegato lo stereo direttamente ad essa. Se hai un alimentatore da banco a 12V, ancora meglio. Sfortunatamente non sono riuscito a trovare molte informazioni online sull'ingresso Key1 della mia unità, quindi ho fatto ricorso alla sperimentazione. Non ero eccessivamente preoccupato di bruciare lo stereo a questo punto, dal momento che è relativamente economico, e questo è stato il mio ultimo tentativo disperato di farlo funzionare con la mia auto.

Lo stereo dispone di una schermata di apprendimento dei comandi, dove è possibile selezionare uno dei due valori di resistenza (1K e 3.3K) e visualizzare il valore di "tensione" (0-255). "Voltage" è citato perché è fuorviante. Ho passato molto tempo ad applicare tensioni diverse a Key1 senza fortuna. Ho anche provato a usare resistori diversi per applicare la tensione senza fortuna.

La svolta è arrivata quando ho provato a toccare il filo Key1 con la massa della batteria, il che ha provocato la caduta della "tensione" a 0. Questo in combinazione con diversi resistori produrrebbe valori di "tensione" coerenti sulla schermata di apprendimento.

Ora che sapevo come inviare gli input allo stereo, avevo bisogno di un modo per inviarli da un Arduino. A questo punto non ho sentito parlare di multiplexer, che insieme ad alcuni resistori, avrebbero potuto essere una soluzione più veloce e affidabile (non sono ancora sicuro che sia fattibile), quindi ho usato un potenziometro digitale. All'inizio ho avuto problemi a far funzionare il potenziometro digitale, finché non ho capito che dovevo collegarlo come un reostato per agire come un resistore variabile invece di un partitore di tensione. Fondamentalmente ho dovuto collegare i terminali RH e RW.

Oltre alla resistenza, il tempismo era cruciale. Se la caduta di resistenza è troppo breve, il comando non verrà registrato. Se è troppo lungo, potrebbe essere registrato più volte. Un calo di 240 ms, seguito da un ritardo di 240 ms fino al comando successivo ha funzionato in modo abbastanza affidabile per il mio stereo. Anche se sembra pochissimo tempo, significa che possiamo inviare un massimo di 2 comandi al secondo, il che è evidente se stai cercando di aumentare o diminuire rapidamente il volume. Ho provato a giocare con tempi e schemi diversi, il che ha aumentato la velocità ma non era molto affidabile. Se hai idee su come migliorarlo, lasciale nei commenti.

Prima di procedere oltre, suggerisco di costruire un prototipo per verificare se il tuo stereo accetta lo stesso tipo di input. Anche se accetta voltaggi diversi, l'adattatore dovrebbe funzionare con leggere modifiche al cablaggio e allo sketch Arduino.

Passaggio 3: costruzione dell'adattatore

Costruire l'adattatore
Costruire l'adattatore
Costruire l'adattatore
Costruire l'adattatore
Costruire l'adattatore
Costruire l'adattatore

Dopo aver testato tutti i componenti separatamente e averli provati insieme su una breadboard, era giunto il momento di dare loro una casa più permanente. Ciò ha richiesto alcune ore di disposizione dei componenti e saldatura.

In alto a sinistra c'è il regolatore step down, che trasforma i 12V della batteria dell'auto, in 5V che possono essere utilizzati dagli altri componenti.

In basso a sinistra c'è il modulo CAN bus, che legge i valori dalla rete CAN bus dell'auto e li inoltra ad Arduino.

In alto a destra c'è il potenziometro digitale (cablato come un reostato) che funge da resistore variabile tra la massa e l'ingresso Key1 dello stereo.

In basso a destra c'è l'Arduino, che funge da cervello dell'adattatore, trasformando i messaggi del bus CAN in resistenze che vengono lette dallo stereo.

Sull'ingresso a 12V c'è un fusibile da 150mA, che molto probabilmente non proteggerà il circuito, ma serve per prevenire un incendio in caso di cortocircuito.

Passaggio 4: il software

Il software
Il software

Dopo il download, metti tutti e tre i file.ino in un'unica cartella. In questo modo faranno tutti parte dello stesso schizzo e verranno schierati insieme all'Arudino.

È inoltre necessario aggiungere le librerie richieste all'IDE di Arduino. Per fare ciò, scarica i seguenti file:

github.com/autowp/arduino-mcp2515/archive/…

github.com/philbowles/Arduino-X9C/archive/…

quindi aggiungili entrambi andando su Schizzo> Includi libreria> Aggiungi libreria. Zip …

CanBusStereoAdapter.ino

L'impostazione di base viene eseguita in questo file.

I valori del bus CAN dei comandi chiave sono definiti in alto. A meno che tu non abbia la mia stessa macchina, molto probabilmente dovrai inserire i tuoi valori. Puoi usare i valori esadecimali dallo sniffer, io ho usato il binario quindi è più facile vedere che non ci sono sovrapposizioni accidentali nei bit.

Non tutte le auto hanno gli stessi comandi al volante, quindi sentiti libero di rimuovere, aggiungere o modificare i valori definiti.

Non dimenticare di sostituire l'ID del sottosistema in "STEERING_ID".

CanBus.ino

Questo file imposta il listener del bus CAN, interpreta i pacchetti e inserisce i valori di resistenza in un buffer circolare.

Regola la configurazione del bus CAN nella funzione "setupCanBus" per adattarla alla tua auto.

Usiamo un buffer circolare perché, come accennato in precedenza, l'ingresso dei comandi al volante è molto più veloce dell'ingresso stereo. In questo modo non ci perdiamo nessun comando mentre il potenziometro digitale fa il suo dovere. Se inseriamo troppi comandi, i più vecchi verranno scartati per primi, poiché sono i meno importanti. Questo ci consente anche di gestire il caso in cui vengono premuti più pulsanti, poiché l'ingresso stereo accetta solo un singolo valore alla volta.

Se hai modificato una delle definizioni dei comandi in "CanBusStereoAdapter.ino" dovrai aggiornarle anche nella funzione "handleMessageData". "handleMessageData" controlla se i frame di dati del bus CAN forniti contengono uno dei comandi noti utilizzando un'operazione AND bit per bit.

Ad esempio, se ho premuto >> e + contemporaneamente, il che ci darà un frame di dati con un valore di 0b10010000. >> (per la mia auto) è 0b00010000 in binario e + è 0b10000000.

--------------- >> -------------- + ------------- << --- -- data0 | 0b10010000 | 0b10010000 | 0b10010000 comando | AND 0b00010000 | AND 0b10000000 | AND 0b00001000 risultato | = 0b00010000 | = 0b10000000 | = 0b00000000

Qui possiamo vedere che il risultato dell'operazione AND sarà maggiore di 0 se il comando è presente nel frame di dati. Quindi tutto ciò che dobbiamo fare è controllare {frame dati} e {valore comando} > 0, per ogni comando che abbiamo definito.

Tieni presente che ogni frame di dati contiene comandi diversi, quindi va bene se i valori dei comandi sono gli stessi, poiché li stiamo controllando rispetto ai propri frame. Nel mio esempio sia << che ESC hanno entrambi lo stesso valore 0b00001000 (0x08), ma << è in data0 ed ESC in data1.

Dopo aver determinato che un comando è presente in un frame, aggiungiamo un valore di pot digitale al buffer circolare. I valori vanno da 0 a 99, ma ho notato che la "tensione" letta dallo stereo non è lineare, quindi prova tu stesso i valori.

DigitalPot.ino

Questo file estrae i valori dal buffer circolare e li invia al pot digitale per l'esecuzione. Nel mio caso "pot.setPotMin(false);" aumenterà la resistenza al massimo, che lo stereo leggerà come "tensione" massima. Il tuo stereo potrebbe richiedere di impostare il potenziometro digitale al minimo, quindi provalo.

Passaggio 5: la recinzione del progetto

La recinzione del progetto
La recinzione del progetto

Ho una stampante 3D, quindi ho deciso di stampare un involucro in due parti per il mio adattatore. Ho incluso un file Fusion 360 che puoi modificare e file gcode che si adatteranno a una perfboard da 60x80 mm.

Se non hai accesso a una stampante 3D, puoi utilizzare un contenitore di progetto già pronto o un contenitore robusto.

Passaggio 6: considerazioni finali

Inizialmente avevo pianificato che l'adattatore fosse collegato a un'alimentazione costante e si attivasse su determinati messaggi del bus CAN, poiché la mia auto non ha un cavo di accensione nel vano stereo. In seguito ho deciso di non farlo perché non volevo rischiare di scaricare la batteria e preoccuparmi dell'adattatore mentre ero lontano dall'auto. Ho usato uno sdoppiatore della scatola dei fusibili per auto per eseguire un cavo di accensione e non dover complicare ulteriormente l'adattatore.

Dai miei test il consumo di energia è di 20-30 mA. L'ho ridotto a 10 mA in modalità di sospensione e potrei andare ancora più in basso rimuovendo i LED dai componenti, ma ho deciso di non preoccuparmene poiché funzionerà solo mentre l'auto è in funzione.

Sono abbastanza soddisfatto del risultato finale. Il tempo di risposta è ragionevole e raramente mancano i comandi.

Anche se il mio investimento di tempo è stato di gran lunga superiore al costo dell'adattatore disponibile in commercio (che non ha funzionato), la conoscenza che ho acquisito è inestimabile.

Consigliato: