Installare iniezione elettronica indiretta con l'aiuto di Arduino

Ciao ragazzi, questa discussione è molto interessante visto che anche io sto usando arduino per fare qualcosa che è vagamente simile a quello che volete fare voi.
Io sto facendo un apparecchietto che mi servirà per fare la diagnostica della carburazione e devo leggere rpm, lambda ed egt.
Magari potrebbe tornare utile a tutti interagire per trovare alcune soluzioni che possono essere comuni ai nostri progetti. Qui trovate la mia discussione: http://arduino.cc/forum/index.php/topic,138546.0.html

Ieri sera ho cominciato a buttare giù uno schizzo del circuito, anche se purtroppo sono abbastanza ignorante in elettronica, quindi ci metto il triplo per inventarmi i circuiti e calcolar tutto.

La mia idea per gli rpm è di prelevare l'onda quadra a 12v che comanda la bobina, dove ogni impulso corrisponde ad una scintilla delle candele, d'altra parte se funziona per il contagiri...

Al momento ho già scritto buona parte del programma, voi dovreste implementare solo la parte di gestione dell'iniettore in funzione dei dati rilevati, io invece voglio mostrare i dati a display e salvarli su una sd card.
Stavo pensando che per le mappe, potreste salvarle in una sd in un file csv e all'accensione di arduino caricare i dati dal csv ad una matrice, in questo modo potreste fare le mappe inserendo semplicemente la sd nel pc.

Tanto per conoscerci, io ho una fiat 500 vecchia con la quale mi diletto a fare qualche puntatina in pista e nei kartodromi, questo è il mio ultimo bambino:

Ciao, no, non avevo dimenticato che stiamo parlando di un 2T, ma effettivamente, hai ragione, un 2T sporcherebbe e renderebbe inutilizzabile una wideband (lambda a banda larga), forse ad eccezione di quei motori 2T ad inniezione diretta come gli envinrude E-TEC o i motori rotax E-TEC (stessa tecnologia licenziata da ROTAX) che vengono montati sui prodotti Sky-Doo (motoslitte da neve), infatti questi motori dichiarano una pulizia allo scarico pari al 4T quindi su questi è possibile montare le sonda lambda, ma avevo dimenticato che il tuo progetto è di inniezione indiretta, scusa.

In realtà se la ECU ha la mappa inniezione ben calibrata, e tutte le tabelle di correzione in funzione Temp. aria, temp. motore, press. barometrica, e arricchimento derivata farfalla, a meno che non succeda qualcosa di inatteso come la perdita di pressione benzina ecc difficile che vi siano condizioni di pericolo per il motore, ovviamente, forse per questo progetto, l'uso di termocoppia allo scarico sarebbe un MUST HAVE, ovviamente richiederebbe un circuito amplificatore visto il segnale molto debole delle termocoppie (si usa un chip ->AD595A).

Aggiornamento: Ho visto che con la programmazione ARDUINO di questi MCU non si possono superare certe prestazioni, programmando direttamente in C sfruttando i registri del micro si potrà andare molto più veloce. Esempio, se creiamo una semplice routine che accende e spegne un led con delay in microsecondi invece di ms, ed usando digitalWrite(), misurando con oscilloscopio otterremo una frequenza di 97-117KHz in funzione del pin usato (quelli con opzione PWM sono più lenti) ma se facessimo la stessa cosa con i registri, si otterrebbe una frequenza di 2,6MHz ovvero 20 volte di più! Quindi ci tocca studiare anche questo!! sarà per più avanti, per ora mi basta imparare l'arduino semplice!

per Nick85:

Ciao, interessante il tuo progetto, fai attenzione al segnale del negativo bobina, vedi che se questo non è filtrato ta un circuito, in realtà ti troveresti con dei picchi velocissimi di tensione alta fino a 400V (chiamata flyback e si produce ogni qualvolta si scarica la bobina). Di solito i contagiri hanno circuiti protetti contro queste veloci sovratensioni, quindi devi fare molta attenzione a questo. Ho qualche chema di circuito appositamente per "sensare" questo tipo di segnale, appena lo trovo te lo mando, ma grossolanamente, consiste di un diodo skotty, alcune resistenze ed un fotoaccoppiatore MOC205 se non ricordo male, in sostanza, taglia le sovratensioni e per maggiore sicurezza viene isolato dalla MCU con il fotoaccoppiatore al quale poi gli arriva un segnale entro i 0-5V.

L'idea di base è che il programma o firmware dell'ipotetica ECU Arduino sia in flash, ma le mappe in EEPROM, sarebbero meno della memoria max disponibile, quindi anche più veloce della SD da caricare (una SD mi sembra ha un tempo di lettura di 200ms vs 10ms dell' EEPROM interna se non ricordo male). Quindi, all'avviamento, in setup() legge i dati dall'EEPROM e le salva in delle array adeguatamente create in modo di avere tutti i dati necessari in RAM, ma è daverificare quante risorse disponibili restano, potrebbe bloccarsi il micro se andiamo ad intaccare tutta la RAM disponibile. Calcola che le mappe da avere come minimo sono:

mappa_inniezione[8][8]; //matrice da 8x8 breakpoints (carico/giri)
mappa_cranking[8]; //serve per la partenza a freddo.
mappa_correzione_Barometrica[8]; //correzione barometrica.
mappa_correzione_Temp_Aria[8]; //correzione in funz. temp. aria.
mappa_correzione_Temp_Mot[8]; //correzione in funz. temp. motore.
breakpoint_carico[8]; //tutti i valori carico selezionati (utile solo se si vogliono manipolare da pc)
breakpoint_giri[8]; //tutti i valori giri in mappa ovviamente saranno in base 8 bit per ovvi motivi di spazio EEPROM. idem che sopra.
Linearizzazione_sensore_TPS[2]; //valore ADC farfalla chiusa (o%), e valore ADC farfalla tutta aperta (100%)
Linearizzazione_sensore_MAP[4};//valore ADC min, ADC max, kpa min e kpa max.
Linearizzazione_sensore_Temp_Mot[8]; // valori ADC a temp. conosciute.
Linearizzazione_sensore_Temp_Air[8]; // valore ADC a temp. conosciute.
Linearizzazione_sensore_Temp_EGT[4]; // valore ADC min, ADC max, Temp. min e Temp. max.

ecc...

Da studiare bene l'organizzazione dei dati in eeprom visto che devono essere ad 8 bit, quindi tutti i dati che superano 255 devono essere espressi in EEPROM come una frazione, ovvero, se per es. i giri mettiamo: 10,20,25,255 possiamo semplicemente moltiplicare per 100 ed otteniamo: 1000, 2000, 2500, 25000 rpm. ma altre forme sono valide (es. x 50 ed otteniamo un max di 12xxx rpm) mmm, cè tanto tanto da lavorare!!

Ciao, bravo, vedo che sei molto preparato in materia, mentre io sono molto più allenato con roba old style vedi carburatori.
Adesso mi studio quello che mi hai detto, ma non son troppo sicuro delle correnti di flyback, ti spiego nella'altra discussione il perché.
Grazie e ciao

Nick85:
Ciao ragazzi, questa discussione è molto interessante visto che anche io sto usando arduino per fare qualcosa che è vagamente simile a quello che volete fare voi.
Io sto facendo un apparecchietto che mi servirà per fare la diagnostica della carburazione e devo leggere rpm, lambda ed egt.
Magari potrebbe tornare utile a tutti interagire per trovare alcune soluzioni che possono essere comuni ai nostri progetti. Qui trovate la mia discussione: http://arduino.cc/forum/index.php/topic,138546.0.html

Ieri sera ho cominciato a buttare giù uno schizzo del circuito, anche se purtroppo sono abbastanza ignorante in elettronica, quindi ci metto il triplo per inventarmi i circuiti e calcolar tutto.

La mia idea per gli rpm è di prelevare l'onda quadra a 12v che comanda la bobina, dove ogni impulso corrisponde ad una scintilla delle candele, d'altra parte se funziona per il contagiri...

Al momento ho già scritto buona parte del programma, voi dovreste implementare solo la parte di gestione dell'iniettore in funzione dei dati rilevati, io invece voglio mostrare i dati a display e salvarli su una sd card.
Stavo pensando che per le mappe, potreste salvarle in una sd in un file csv e all'accensione di arduino caricare i dati dal csv ad una matrice, in questo modo potreste fare le mappe inserendo semplicemente la sd nel pc.

Tanto per conoscerci, io ho una fiat 500 vecchia con la quale mi diletto a fare qualche puntatina in pista e nei kartodromi, questo è il mio ultimo bambino:

Nick, il tuo bambino è.... MERAVIGLIOSO!

Sono positivamente colpito dalla vostra preparazione, io in materia di iniezione non so ancora nulla. Sono old style come Nick (si dice: "Old But Gold...").

Hiperformance, ti prego di spiegarmi tutte le funzioni minime da avere come sensori, da avere a livello di programma, da avere a livello di output.

Ti chiedo questo per entrare un po' più nel dettaglio, per vedere quanto sono preparato leggendo queste tue righe e quanto ancora mi manca, che sicuramente è tanto. Almeno posso prepararmi con qualcuno che mi guida un po', visto che queste cose non saprei dove impararle altrimenti.

Sperando di non annoiarti e di non annoiare gli altri

Grazie mille.
Beh di sicuro wmatte toglimi una curiosita, ma vuoi gestire anche l'accensione?
Io dovendo cominciare avrei provato prima a gestire quest' ultima e poi in un secondo momento l'iniezione che magari è più complessa. O sbaglio?

Nick85:
Grazie mille.
Beh di sicuro wmatte toglimi una curiosita, ma vuoi gestire anche l'accensione?
Io dovendo cominciare avrei provato prima a gestire quest' ultima e poi in un secondo momento l'iniezione che magari è più complessa. O sbaglio?

Il mio interesse non sta nel gestire l'accensione, la questione sta li!

Io vorrei tentare di costruire un sistema di iniezione che sia chiuso, cioè che sia capace di autoregolare la carburazione a seconda delle condizioni esterne. Questo per due motivi:

1 Sbattimenti nel carburare, soprattutto quando il tempo cambia spesso (mezze stagioni)

2 motori carburati sempre a puntino, in particolare quelli più spinti che risentono molto di più dei normali anche lievi cambiamenti di carburazione.

L'accensione servirebbe solo come dato in input per registrare la mappa e controllarla. (se non erro!)

ho capito, beh è interessante come cosa.
Allora per quanto riguarda la parte che legge il segnale del nr di giri, penso tu possa copiare il mio schema (che è ripreso dall'accensione magasquirt su suggerimento di amici del forum di arduino)
qui trovi gli schemi originali:


e qui quello che ho partorito io con le modifiche indicate nelle istruzioni della megasquirt:

Ciao ragazzi,

Per gestire un impianto di iniezione elettronica basilare si richiederà dei seguenti sensori:

-sensore giri - input su pin digitale, con circuito come suggerito da Nick85 (e a sua volta da me ;))
-sensore TPS - angolo farfalla, input su pin analogico.
-sensore MAP/Barometrico - pressione assoluta collettori o barometrico, input su pin analogico.
-sensore Temp. Motore - Temperatura motore, input su pin analogico.
-sensore Temp. Aria - Temperatura aria, input su pin analogico.

fin qui, questi sono i sensori minimo indispensabili per creare un sistema decentemente funzionante, ma ad esso vi si potranno aggiungere altri, per perfezionare, come:

-Sensore Lambda wideband, input su pin analogico.
-sensore temp. olio, utile su motori come questo raffreddato ad aria per inpostare eventuali limitatori giri o di protezione.
-Temp. EGT, input su pin analogico, non indispensabile ma molto utile se si dispone di datalogging per uso racing, stradale sarebbe solo una complicazione in più che farebbe solo rallentare il sistema e come diceva un vecchio ingegnere, "quel che non c'è, non si rompe!"

A differenza di quel che si potrebbe pensare, è la gestione dell'anticipo la parte più delicata di un sistema di gestione motore, più che altro perchè richiede una maggiore precisione di gestione degli eventi, il tutto deve avvenire entro brevi lassi di tempo. Anche se dal punto di vista delle strategie di correzione e gestione, l'anticipo è molto più facile rispetto a gestire l'iniezione.

anche se i concetti di cosa dovrebbe fare la nostra "ECU_ino" sono abbastanza chiari per me, non lo è il resto, ovvero il grosso del lavoro di programmazione!! io personalmente ho tanto da imparare, dopo tutto, con arduino ed il C ci sto "giocando" solo da natale! e purtroppo le previe esperienze con altri MCU programmabili in Basic (Basicx bx24, picaxe) aiuta poco, troppo diversi tra loro, e complessivamente poco potenti per giustificare il solo pensiero di farci qualcosa di minimamente simile ad una ECU, con Arduino è differente, certamente vi sono MCU più potenti, ma con buona volontà, semplificazione massima, rinunciando a qualche cosa non indispensabile e realizzando il tutto a gradi, credo che la piattaforma Arduino se la potrebbe cavare, ma per certe funzioni, richiederà di usare C per accedere direttamente ai registri, altrimenti non si potrebbe gestire certe cose in modo veloce.

Per questo progetto, ci vorrà l'aiuto di tanti esperti di Arduino e di C, ma anche esperti di programmazione su pc, perché poi ci servirà un programma con cui modificare i parametri in tempo reale! (ah, dimenticavo! anche qualcuno bravo in Assembler!! ).

Ciao!!

Ottimo, io sono qui nell'ombra, ultimamente mi sono arrivati tutti i componenti per il mio progetto, che però procede a rilento, troppe cose da fare...
Son curioso di vedere che cosa farà il nostro amico.