Ciao ragazzi, probabilmente molti mi diranno che è un argomento trattato varie volte, ma cercando nei vari thread non sono riuscito a trovare delle risposte alle mie domande.
Ho intenzione di creare un contagiri abbastanza preciso (da montare su una moto).Su questa moto non ho un sistema d'accensione cdi, bensi TCI.
Questo sistema prevede che il primario della bobina d'accensione sia alimentato da un +12v sotto quadro e da un GND comandato dalla centralina; nei miei progetti c'era quello di contare la frequenza con il quale questo GND viene comandato.
La mia domanda è la seguente: un partitore di tensione isolato da arduino con uscita +5 volt collegata ad un pin digitale (il quale viene letto con un pulseIn) può funzionare?
Attendo ogni tipo di vostro suggerimento, Grazie a tutti!
... un partitore anche si, ma che pilota un'opto, non direttamente arduino ... cosi rimane tutto isolato ...
Sai indicarmi che vantaggi avrei con un opto? Io pensavo di isolare il tutto con uno Zener da 4,7
Un'opto isola galvanicamente il tutto ... puoi anche avere le masse in comune (ma volendo anche no, se l'alimentazione e' indipendente), ma la cosa importante e' che elimina anche i "ritorni" in AF ed i disturbi elettrostatici ... inoltre non rischi il pin di ingresso di arduino, dato che l'uscita dell'opto e' "alimentata" dalla stessa VCC del micro ... lo zener non isola, si limita a proteggere dalle sovratensioni ...
Ok, sei stato abbastanza chiaro, Grazie! Ora devo solo studiarmi un attimo un circuito che preveda un opto, perché sinceramente non so da dove iniziare
Su Google con "arduino ingressi optoisolati" viene fuori un po' di materiale.
In particolare questo.
Ciao,
P.
Grazie, link molto utile!
Nel caso in cui invece stravolgessi tutto e utilizzassi un lm2907 per convertire la frequenza con cui il gnd della bobina viene “cambiato” in volt semplicherei sicuramente il programma, cosa ne pensate?
Ehm ... credo tu non abbia le idee troppo chiare sul "come" funziona un'accensione ... indifferentemente dal fatto che sia a puntine, a sensore di hall, CDI, TCI, eccetera, hai comunque un circuito che scarica "brutalmente" un condensatore su una bobina (che in pratica e' un trasformatore elevatore), per cui collegare quei circuiti direttamente a logiche o a componenti "sensibili" non e' esattamente il massimo ...
La cosa "relativamente sicura" che puoi fare, e' prendere una parte del segnale, con un partitore di tensione di valore abbastanza elevato da non friggere il circuito, ed allo stesso tempo da non pregiudicare il funzionamento dell'accensione, ovviamente, ed usarlo per accendere il led dell'opto (oppure se la corrente non fosse sufficente, usarlo per pilotarci un transistor, alimentato lato motore, che accenda il led dell'opto) ... a quel punto dal transistor dell'opto puoi prelevare il segnale con livelli ed isolamenti adeguati a collegarci la logica ...
Come alternativa, ma dipende dalla tua bobina, si potrebbe provare ad incollare sotto la stessa, dal lato piatto opposto a dove ci sono i cavi, un sensore di hall, e vedere se il campo magnetico che "filtra" dalla custodia e' sufficente ad attivare il sensore, ma ripeto, e' da provare perche' dipende dalla schermatura magnetica della bobina ... comunque se funziona anche questo garantisce l'isolamento dei segnali ...
Oppure c'e' il vecchio sistema di avvolgere qualche giro di filo attorno al cavo della candela ed usare il "disturbo" captato capacitivamente dal cavo per trasformarlo in impulsi con un transistor o simile ...
Ma a meno che la centralina non abbia uno specifico pin di uscita per il contagiri, sarebbe sempre meglio evitare le connessioni dirette alla circuiteria della bobina ...
Mi sembra strano che non hai trovato post che affrontino il progetto di un contagiri x moto, comunque vedo di darti qualche dritta in merito.
Io ti consiglio di collegarti direttamente al polo della bobina pilotato dalla centralina, interponendo ovviamente un partitore di tensione per adattare il livello di tensione in uscita dalla bobina all'ingresso di arduino.
E' una soluzione consolidata che risulta semplice ed affidabile e se ben realizzata non mette a rischio i circuiti connessi.
Calcola che in uscita dalla bobina hai tensioni dell'ordine 250-350V e pertanto dovrai realizzare un partitore con un rapporto pari a circa 60 (300V/5V) di cui ti allego schema.
- R1-4 sono il partitore
- Il condensatore smorza gli inevitabili disturbi e probabile sarà necessario ritoccare il valore.0
- Il zener protegge l'ingresso di arduino da eventuali sovratensioni
- La res. da 10k insieme ai diodi presenti sui pin all'interno di arduino offrono una ulteriore protezione
R1 sarebbe consigliato installarla in prossimità della bobina in modo tale che se il filo che raggiunge il circuito va a massa non crea problemi alla centralina della moto.
R2 e R3 si potrebbe sostituirle con una equivalente, ma viste le tensioni in gioco è preferibile suddividere i salti di tensione.
Buongiorno a tutti! Ma se la bobina è alimentata da un +12 su un polo (positivo collegato all interruttore run/off della moto) e un negativo comandato dalla centralina, sul primario della bobina della bobina avrò una tensione di 12 Vcc giusto?
Nel momento in cui la centralina "decide" di far scoccare la scintilla interrompe la continuità sul negativo per fare scaricare la bobina; avrei quindi, analizzando i due poli con un tester, un 12Vcc nel momento in cui la bobina non fa scintilla (e si carica) e 0Vcc nel momento in cui fa scintilla.
Ora, mi sembra una situazione diversa da quella in cui la bobina sia "caricata" dal condesatore della centralina (classico sistema CDI) in cui le tensione in gioco sono ben più alte.
Probabilmente, da inesperto, mi sto dimenticando qualcosa e chiedo a voi perché parlate di tensioni elevate sui poli di una bobina alimentata a bassa tensione (forse nel momento in cui la bobina si scarica ho un ritorno sul primario di alta tensione?). Spero di riuscire a chiarire questi dubbi. Grazie a tutti!
Tutte le bobine, anche quella di una moto, di fatto sono un'induttanza.
Per semplificare il loro comportamento, un'induttanza si carica al passaggio della CORRENTE e al momento che vuoi interromperla si genera una tensione ai capi della bobina, tanto più alta quanto più rapida sarà l'interruzione della corrente.
Lo stesso fenomeno viene utilizzato per far scoccare la scintilla nelle candele connesse al secondario della bobina della moto.
Non è un caso che su molte bobine dei relè (induttanze) , pilotate da semiconduttori, vengono posti diodi per scaricare tali tensioni.
Perfetto, sei stato chiarissimo e molto d’ aiuto. Ora che ho avuto tutte le risposte che mi mancavano inizierò a buttare giù qualcosa; ho due idee in testa: un convertitore frequenza/volt con un lm2907 o seguire l idea che mi hai dato tu magari interponendo un bel opto! Grazie!
Se realizzi il partitore con le indicazioni che ti ho fornito l'inserimento dell'opto non serve.
Piuttosto se parli di inserire il 2907 devi avere ben chiaro cosa vuoi fare.
Ora il segnale in arrivo dalla bobina dovrai connetterlo all'ingresso del 2907 e pertanto la sua uscita sarà collegata ad un ingresso analogico di arduino.
Metodo più semplice in quanto arduino avrà solo il compito di leggere il valore di tensione e convertirlo in numero di giri.
Altra strada e quella già indicata, sviluppare per arduino un software che simuli un frequenzimetro, in quanto un contagiri altro non è che un banale frequenzimetro.
In questo modo fai una conversione completamente digitale ed elimini il 2907 che introduce sempre un certo grado di precisione.
Sisi, adesso devo raccogliere un attimo le idee e capire cosa scegliere, l idea del frequenzimetro è la “migliore”!
Domanda, se dovessi usare un opto come l h11l1m (già usato in qualche progetto americano), per considerare e dimensionare la resistenza sull’ emettitore (datasheet 30mA) devo tenere in considerazione i 12v o anche la tensione generata nel momento della scintilla, i famosi 300v ?
Buongiorno a tutti! E' passato un po di tempo, ma non ho mollato il progetto; mi sono documentato un pò, guardato un pò in giro e iniziato a studiare l'onda in uscita dal polo negativo di una macchina. Dopo aver provato vari filtri hardware (scopiazzati un po in rete), ho iniziato a buttare giù due righe di programma per individuare gli RPM. Non tutto è andato liscio, anche qui grazie a qualche sketch reperito in rete (americana) ho iniziato a vedere qualche numero sul monitor seriale muoversi.
Ora ho l'ultimo grosso ostacolo da superare: se all' entrata del filtro (dove dovrebbe attaccarsi l'input della bobina) fornisco un onda quadrata creata con un altro Arduino con un banalissimo programma basato su Tone ottengo una lettura dei giri perfetta, cosa che invece non succede leggendo il segnale direttamente dalla bobina.
Per curiosità ho costruito un banalissimo oscilloscopio (sempre con Arduino) con il quale ho "letto" sia l'onda in uscita dal "filtro" che il segnale presente sul negativo della bobina (con un partitore 1:100) deducendo che probabilmente il Problema non è nel filtro autocostruito.
Allego sketch, circuito del filtro e screen delle due onde analizzate e chiedo anche a voi di capire con me dove è il problema, Grazie a tutti!
Contagiri.ino (547 Bytes)
Il calcolo degli RPM deve essere fatto nel ciclo loop, non nella routine di interrupt che dovrebbe semplicemente limitarsi a incrementare un contatore.
Ciao,
P.
Grazie, Provato questa sera, nella seriale escono dei numeri negativi (-144444, ecc)..riprovo a buttare giù due sketch.
Nello scorso millennio feci un contagiri per la 500 a componenti discreti (tutto TTL a 5V). Prendeva l'impulso attraverso un filo attorcigliato attorno al cavo AT della bobina. Funzionicchiava.
Non so se oggi si può usare lo stesso algoritmo. Se si può fare, questo codice potrebbe funzionare
volatile unsigned long start;
//volatile unsigned long elapsed; NON SERVE PIÙ
volatile unsigned long RPM;
volatile unsigned long pulse;
int numOfCyl = 4;
int pin = 2;
void setup()
{
Serial.begin (115200);
pinMode (pin, INPUT);
attachInterrupt (digitalPinToInterrupt (pin), speedCalc, RISING);
pulse = 0;
start = millis();
}
void speedCalc () {
pulse++;
}
void loop()
{
if (millis() - start >= 200) { //200 millisecondi = 5 letture al secondo
RPM = //Qui hai il numero di impulsi ogni 200 millisecondi da cui puoi derivare i giri/minuto.
Serial.print ("Rpm => ");
Serial.println (RPM);
pulse = 0;
start = millis();
}
}
Prevede 5 visualizzazioni al secondo. Meno visualizzazioni fai, più preciso diventa. Io ne facevo tre.
A te completarlo con il calcolo degli RPM.
Ciao,
P.
Grazie Pgiagno, anche stavo pensando e scrivendo uno sketch simile al tuo, ottimo spunto! Sicuramente lo proverò! Grazie ancora!
I motori moderni sia 2 o 4 tempi generano un impulso ad ogni giro di albero motore.
Definiamo quindi che un motore a 6000rpm genera una frequenza sulla bobina e sull'ingresso di arduino di 100 impulsi al secondo.
Diversamente da quanto proposto da "pgiagno" propongo di modificare l'intervallo di campionamento da 200ms a 600ms.
E' vero che riduciamo il n. di letture, ma accumulando più impulsi otteniamo una lettura precisa e diretta, del tipo RPM = pulse * 100.
Inutile velocizzare il n. di campionamneti, a livello di display rischi che la visualizzazione venga confusa dal continuo pendolare del dato.