Panda 4x4 OBD
Con questo progetto ho intenzione di comunicare con la centralina della Panda 4X4 per ottenere maggiori informazioni sui parametri motore in tempo reale. Quindi andro' ad acquisire le letture dei sensori e le visualizzero' su un display LCD 20x4 (l'automobile e' quasi tutta analogica, si tratta di una delle prime centraline motore, per questo essendo sprovvista di display sul quadro strumenti non posso neanche provare ad integrare il progetto al massimo).
Tutto nasce dalla mia ossessione nel tenere sotto controllo la temperatura del motore; ogni 2 minuti l’occhio mi cadeva sul quadro
strumenti e un giorno mi domandai tra me e me se era possible collegarsi in un qualche modo alla centralina, poi scopro la presenza della porta apposita nel cofano dedicata alla diagnostica. Compro un cavo che converte la porta 3pin al classico connettore obd2 e un cavo vag com kkl, mi collego con successo mediante l’utilizzo di un computer portatile. Allora iniziai a pensare a come creare una specie di computer di bordo, il portatile era troppo scomodo in quanto avrei dovuto accenderlo ogni volta ed aspettare che caricasse il Sistema operativo con il relativo software. Mi venne in mente di comprare un raspberry pi ma anche quest’ultimo avrebbe impiegato troppo tempo ad accendersi senza contare il fatto che il software utilizzato
su windows non era disponibile per linux e i driver non erano compatibili. Ed infine la soluzione: Arduino, accensione istantanea e versatilita’ di utilizzo con l’elettronica.
Questo strumento una volta collegato alla porta di diagnostica ci permettera' quindi di visualizzare i parametri motore su un display lcd. E' compatibile solo con vetture che utilizzano il protocollo ISO9141. Viene alimentato direttamente dalla batteria dell'auto a 12V (grazie al 7805 la corrente viene stabilizzata). Fortunatamente online era disponibile il datasheet della centralina (IAW16F) che mi ha semplificato le cose.
Funzionalita':
Tutto nasce dalla mia ossessione nel tenere sotto controllo la temperatura del motore; ogni 2 minuti l’occhio mi cadeva sul quadro
strumenti e un giorno mi domandai tra me e me se era possible collegarsi in un qualche modo alla centralina, poi scopro la presenza della porta apposita nel cofano dedicata alla diagnostica. Compro un cavo che converte la porta 3pin al classico connettore obd2 e un cavo vag com kkl, mi collego con successo mediante l’utilizzo di un computer portatile. Allora iniziai a pensare a come creare una specie di computer di bordo, il portatile era troppo scomodo in quanto avrei dovuto accenderlo ogni volta ed aspettare che caricasse il Sistema operativo con il relativo software. Mi venne in mente di comprare un raspberry pi ma anche quest’ultimo avrebbe impiegato troppo tempo ad accendersi senza contare il fatto che il software utilizzato
su windows non era disponibile per linux e i driver non erano compatibili. Ed infine la soluzione: Arduino, accensione istantanea e versatilita’ di utilizzo con l’elettronica.
Questo strumento una volta collegato alla porta di diagnostica ci permettera' quindi di visualizzare i parametri motore su un display lcd. E' compatibile solo con vetture che utilizzano il protocollo ISO9141. Viene alimentato direttamente dalla batteria dell'auto a 12V (grazie al 7805 la corrente viene stabilizzata). Fortunatamente online era disponibile il datasheet della centralina (IAW16F) che mi ha semplificato le cose.
Funzionalita':
|
|
Hardware
Il cuore del progetto e' Arduino Nano affiancato da una manciata di componenti per realizzare l'interfaccia per il protocollo 9141, che utilizza due linee dati, la K-Line e la L-Line.
Partiamo illustrando il connettore alla quale ci collegheremo con Arduino. Il connettore e’ un tipico Fiat 3 PIN composto da:
Sulle altre automobili viene utilizzata la K Line in modo bidirezionale (Per invio e ricezione) la panda invece le utilizza entrambe in modo unidirezionale divise una per ricezione ed una per trasmissione. Passiamo ora allo schema elettrico: |
Prima di saldare il circuito che ho progettato l'ho prima testato su una breadboard per assicurarmi che il tutto funzionasse. Mi sono collegato con successo alla centralina e ricevuto correttamente i valori delle temperature acqua motore e la tensione della batteria in accordo al programma caricato su arduino che illustrero' successivamente.
|
In alto a sinistra abbiamo il 7805 che stabilizza la tensione da 12v della batteria a 5v per il nostro Arduino, I 2 condensatori da 10uf servono per filtrare la tensione in entrata e in uscita. Il regolatore interno ad Arduino supporta la 12v ma quando la macchina e’ in funzione la batteria puo ’ arrivare anche a 15v, meglio non rischiare, potrebbe cuocersi. Sotto al 7805 abbiamo la linea TX che useremo per inviare da Arduino le richieste sulla L Line. I due transistor formano un level shifter, il compito di T1 e’ di convertire I 5v di Arduino in 12v perche ’ la centralina lavora con 0 12v, Arduino invece lavora con 0 5v), ma facendo questo T1 inverte anche il segnale, il compito di T2 e’ di invertire nuovamente il segnale. Il resistore da 510ohm e' di pull up. Piu’ sotto ancora abbiamo la linea RX che servira’ a ricevere le risposte inviate dalla centralina tramite la K Line. Essa e’ formata da un partitore di tensione che abbassa I segnali di 12v a 5v per essere letti da Arduino. A destra c’e ’ il circuito relativo al display lcd con il relativo modulo i2c, che ci permette di utilizzare il display tramite due soli pin invece di 6. I due condensatori ceramici da 1nF servono a filtrare i disturbi. La sezione alto centrale e' necessaria per acquisire il livello di luce e regolare di conseguenza tramite la tecnica PWM la retroilluminazione del pannello LCD.
|
Software
Iniziamo ora a parlare della parte software. Non mi mettero' a spiegare come programmare arduino da zero, quindi salto la parte relativa all'inizio del programma (variabili, definizioni, librerie, ecc.), se siete curiosi di leggere quella parte basta che aprite lo sketch e troverete i commenti di descrizione. La centralina in questione e' una IAW16F della Magneti Marelli. Essendo la centralina di tipo FREE RUNNING, ogni volta che giriamo la chiave ed accendiamo il quadro la centralina invia il codice ISO senza bisogno di inizializzarla (codice identificativo dell'automobile). Perche' il codice ISO venga inviato il power latch deve essere terminato. Il power latch è il tempo che intercorre tra lo spegnimento del quadro vettura e la reale disalimentazione della centralina motore. In questo periodo di tempo la centralina salva tutto quello che ha in memoria ram sulla eeprom. Ci vogliono un paio di minuti per far terminare il power latch e far si che al prossimo avvio il codice ISO venga inviato di nuovo.
Il codice ISO viene inviato sulla K-Line a 1200 Baud ed e' composto da 6 bytes:
Il Codice ISO dovrebbe essere 55 D0 85 8A 94 C8 (Panda 4x4 SPI 1100). In caso contrario la connessione non e' andata a buon fine.
LASCIARE IL QUADRO ACCESO!
Dopo aver ricevuto il codice ISO bisogna attendere almeno 500ms per poter inviare sulla L-Line 3 Bytes di valore 0F AA CC Hex con Baud Rate 1200 per richiedere la connessione a 7812 baud. Dopo aver ricevuto questa richiesta, la centralina entra in modalita' comunic azione a 7812,5 Baud. Una volta instaurata la comunicazione a 7812 Baud sara' possibile inviare sull L Line le richieste per i parametri del motore le cui risposte verranno inviate dalla centralina sulla K Line. IL TUTTO DEVE AVVENIRE CON IL QUADRO ACCESO! Non e' obbligatorio leggere il codice ISO, e' solo uno step per essere sicuri che il tutto sta funzionando correttamente ma puo' essere ignorato. L'importante e' inviare i 3 bytes 0F AA CC. Quindi sul programma di Arduino:
//############# INIZIALIZZAZIONE COMUNICAZIONE 7812 BAUD #################
delay(500); //Aspettare almeno 500 millisecondi dalla ricezione del codice ISO prima di inviare la richiesta di comunicazionea 7812 Baud
softSerial.write(0x0F); //Primo byte di inizializzazione
delay(110); //Delay 110ms + 10ms
softSerial.write(0xAA); //Secondo byte di inizializzazione
delay(110); //Delay 110ms + 10ms
softSerial.write(0xCC); //Terzo byte di inizializzazione
delay(150); //Delay 110ms + 10ms
softSerial.begin(7812); //Inizializza seriale software a 7812 baud per lettura parametri dalla ECU
Una volta che la centralina entra in modalita' di comunicazione a 7812 Baud possiamo iniziare ad inviare a piacere dei codici (Domande) alla quale la centralina rispondera' con dei valori grezzi. Per esempio, vogliamo leggere la temperatura dell'acqua, per conoscere il codice della richiesta bisogna far riferimento al manuale della centralina. Una volta che conosciamo il codice di richiesta del parametro non ci resta che inviarlo con Arduino e prepararci a riceverlo e visualizzarlo sul display:
//####################### TEMPERATURA ACQUA #################################
softSerial.write(0x08); //Richiesta parametro temperatura acqua
delay(110); //Ritardo di 110ms
Serial.print("Temperatura Acqua: "); //Scrivi sul Display
TW=softSerial.read()-40; //Il valore della temperatura (non grezzo) secondo il manuale e' uguale al valore letto 40.
Serial.print(TW, DEC); //Visualizza sul monitor seriale il dato acquisito
Serial.println(" C");
delay(1000);
Librerie utilizzate:
#include <AltSoftSerial.h> //Libreria necessaria per instaurare una connessione seriale software su pin non rx/tx e con baud rate non standard
#include <Wire.h> //Libreria per comunicazione i2c
#include <OneWire.h> //Libreria per comunicazione OneWire proprietaria della Dallas Semiconductor per sensore DS18B20
#include <LiquidCrystal_I2C.h> //Libreria display cristalli liquidi
#include <NeoSWSerial.h> //Libreria per seriale software bluetooth
#include <OneButton.h> //Libreria per gesture pulsante
#include <DS3231.h> //Libreria Real Time Clock Orologio
#include <EEPROM.h> //Libreria impostazioni EEPROM
#include <DallasTemperature.h> //Libreria Sensore Temperatura DS18B20
NOTA BENE! Dato che la memoria di Arduino Nano non mi bastava, ho cambiato il bootloader utilizzando l'optiboot per liberare un po' di memoria, quindi se provate a caricare lo Sketch su Arduino, vi uscira' un errore per via della memoria che non basta. A quel punto sara' necessario cambiare il bootloader.
Il codice ISO viene inviato sulla K-Line a 1200 Baud ed e' composto da 6 bytes:
- Il Byte 55 Hex di autosincronismo
- 4 Bytes di campo informativo (Keyword)
- 1 Byte di controllo Checksum
Il Codice ISO dovrebbe essere 55 D0 85 8A 94 C8 (Panda 4x4 SPI 1100). In caso contrario la connessione non e' andata a buon fine.
LASCIARE IL QUADRO ACCESO!
Dopo aver ricevuto il codice ISO bisogna attendere almeno 500ms per poter inviare sulla L-Line 3 Bytes di valore 0F AA CC Hex con Baud Rate 1200 per richiedere la connessione a 7812 baud. Dopo aver ricevuto questa richiesta, la centralina entra in modalita' comunic azione a 7812,5 Baud. Una volta instaurata la comunicazione a 7812 Baud sara' possibile inviare sull L Line le richieste per i parametri del motore le cui risposte verranno inviate dalla centralina sulla K Line. IL TUTTO DEVE AVVENIRE CON IL QUADRO ACCESO! Non e' obbligatorio leggere il codice ISO, e' solo uno step per essere sicuri che il tutto sta funzionando correttamente ma puo' essere ignorato. L'importante e' inviare i 3 bytes 0F AA CC. Quindi sul programma di Arduino:
//############# INIZIALIZZAZIONE COMUNICAZIONE 7812 BAUD #################
delay(500); //Aspettare almeno 500 millisecondi dalla ricezione del codice ISO prima di inviare la richiesta di comunicazionea 7812 Baud
softSerial.write(0x0F); //Primo byte di inizializzazione
delay(110); //Delay 110ms + 10ms
softSerial.write(0xAA); //Secondo byte di inizializzazione
delay(110); //Delay 110ms + 10ms
softSerial.write(0xCC); //Terzo byte di inizializzazione
delay(150); //Delay 110ms + 10ms
softSerial.begin(7812); //Inizializza seriale software a 7812 baud per lettura parametri dalla ECU
Una volta che la centralina entra in modalita' di comunicazione a 7812 Baud possiamo iniziare ad inviare a piacere dei codici (Domande) alla quale la centralina rispondera' con dei valori grezzi. Per esempio, vogliamo leggere la temperatura dell'acqua, per conoscere il codice della richiesta bisogna far riferimento al manuale della centralina. Una volta che conosciamo il codice di richiesta del parametro non ci resta che inviarlo con Arduino e prepararci a riceverlo e visualizzarlo sul display:
//####################### TEMPERATURA ACQUA #################################
softSerial.write(0x08); //Richiesta parametro temperatura acqua
delay(110); //Ritardo di 110ms
Serial.print("Temperatura Acqua: "); //Scrivi sul Display
TW=softSerial.read()-40; //Il valore della temperatura (non grezzo) secondo il manuale e' uguale al valore letto 40.
Serial.print(TW, DEC); //Visualizza sul monitor seriale il dato acquisito
Serial.println(" C");
delay(1000);
Librerie utilizzate:
#include <AltSoftSerial.h> //Libreria necessaria per instaurare una connessione seriale software su pin non rx/tx e con baud rate non standard
#include <Wire.h> //Libreria per comunicazione i2c
#include <OneWire.h> //Libreria per comunicazione OneWire proprietaria della Dallas Semiconductor per sensore DS18B20
#include <LiquidCrystal_I2C.h> //Libreria display cristalli liquidi
#include <NeoSWSerial.h> //Libreria per seriale software bluetooth
#include <OneButton.h> //Libreria per gesture pulsante
#include <DS3231.h> //Libreria Real Time Clock Orologio
#include <EEPROM.h> //Libreria impostazioni EEPROM
#include <DallasTemperature.h> //Libreria Sensore Temperatura DS18B20
NOTA BENE! Dato che la memoria di Arduino Nano non mi bastava, ho cambiato il bootloader utilizzando l'optiboot per liberare un po' di memoria, quindi se provate a caricare lo Sketch su Arduino, vi uscira' un errore per via della memoria che non basta. A quel punto sara' necessario cambiare il bootloader.
Compatibilita' e Codici ISO
IAW18F:
{"55318002941C", "Punto 75 1.2 Fire 8V ECE F2"}, {"5531808A1323", "Punto 75 1.2 Fire 8V ECE ECOL"}, {"5531800E97AB", "Palio 1.2 Fire 8V ECE F2"}, {"5531800794A1", "Delta/Dedra Bn/Sw 1.8 ECE F2"}, {"55318083949D", "Alfa 145/146 1.3 Boxer ECE F2"}, {"55318085941F", "Delta 1.8 90 CV ECE F2"}, {"553180869420", "Tipo/Tempra Bn/Sw 1.8 ECE F2"} IAW04: {"55BC83019429", "Alfa 155 2.0 16V 4x4"}, {"55CE850894C4", "Dedra 2.0 16V"}, {"55CE85079443", "Dedra 2.0 16V 4x4"}, {"553883029426", "Tempra 2.0 8V 4x4"}, {"553883019425", "Tempra 2.0 8V M/T"}, {"5538830194A8", "Tempra 2.0 8V A/T"}, {"55CB8202943B", "Dedra 2.0 8V A/T"}, {"55CE8504943B", "Nuova Delta 2.0 T/C"}, {"55CE85049440", "Nuova Delta 2.0"}, {"55CB850194BA", "Coupe S 2.0 T/C"}, {"55CE858394BF", "Coupe S 2.0"}, {"55CD852613E0", "Delta Evoluzione 2000 16V 4x4"}, {"55CB859B13D3", "Coupe ESSE 2.0 16V T/C"}, {"55CB8592134A", "Nuova Delta 2.0 16V T/C 4x2"}, {"55CE8501943D", "Nuova Delta 2.0 16V"}, {"55D00292914A", "TIPO 2000 16V"}, {"55CD850813C2", "Delta Evoluzione 2.0 16V ECO"} |
IAW16F:
{"55D085859443", "Cinquecento 899 SPI ECE F2"}, {"55D0858694C4", "Cinquecento 1108 SPI ECE F2"}, {"55D0850194BF", "Punto 1.1 SPI Em.04 Est Europa"}, {"55D085029440", "Punto 55 1.1 SPI 5M/6M ECE F2"}, {"55D0850494C2", "Punto 60 1.2 SPI CM ECE F2 T.i.T."}, {"55D085079445", "Punto Selecta 1.2 SPI ECE F2"}, {"554C851092C8", "Panda 1000 SPI ECOL"}, {"55D085089446", "Panda 1000 SPI ECE F2"}, {"55D0850B9449", "Panda 1108 SPI CA ECE F2"}, {"55D0850E15CD", "Tipo/Tempra 1.6 SPI USA'83 (TOFAS)"}, {"55D08510154F", "Lancia Y 1.2 SPI CA ECE F2"}, {"55D0858994C7", "Panda 899 SPI ECE F2"}, {"55D0858A94C8", "Panda 1108 4x4/4x4 ECE F2"}, {"55D0858C15CB", "Tipo/Tempra 1.6 SPI Em.04 (TOFAS)"}, {"55D0858F15CE", "Lancia Y 1.2 SPI CM ECE F2"}, {"55D085911651", "Tipo 1372 SPI ECE 04 (TOFAS)"}, {"55D085921652", "131 Bn/Sw 1.6 SPI USA'83 (TOFAS)"}, {"55D085139754", "Seicento 0.9 CM SPI F2"} IAW8F: {"55B683079126", "ALFA 33 1360 MPI CM"}}; IAW18FD: {"5531800D1629", "Punto 1242 FIRE 16V CEE F2"}, {"5531808C16A8", "Siena 1.4 8V (IAW 1G7SP)"}, {"553180081523", "Palio 1.0 8V (IAW 1G7SD)"} |
Lo strumento funziona sicuramente con le auto che montano la IAW16F. Per quanto riguarda le altre centraline, vanno ancora testate ma probabilmente
funziona in quanto la modalita' di inizializzazione e le linee dati utilizzate dovrebbero essere le stesse.
funziona in quanto la modalita' di inizializzazione e le linee dati utilizzate dovrebbero essere le stesse.
|
|
|
|
|
|
|
|