rilevamento impulsi sensore effetto hall

Salve Ragazzi,

sto provando a creare un tachimetro più o meno preciso per una auto d'epoca, la mia idea è quella di mettere un magnete nel cerchio della ruota ed un sensore ad effetto hall (normalmente chiuso) sulla parte fissa dell'auto.

Ho già sviluppato la parte di codice interessata:

while (ok != 42 || m==0)
               {                                                              
                char key = customKeypad.getKey(); 
                ok=key;

                if ((digitalRead(sens)==0) && f1==0 && i>=0 )   //RILEVAMENTO IMPULSI
                  { 
                    i++; f1=1;
                    GLCD.CursorTo(15, 2);  GLCD.print(i,0);
                  }   
                   if ((digitalRead(sens)==1)&& f1==1 && i>=1 ) {f1=0;}
                     

                if (key != NO_KEY && ok != 42)
                  { 
                   m=m*10+key-'0';                                                           
                   GLCD.SelectFont(System5x7); GLCD.CursorTo(17, 6);  GLCD.print(m,0);
                  }
                if (key != NO_KEY && ok == 67)
                  {
                    m=0;
                    GLCD.CursorTo(17, 6);  GLCD.print("   ");
                  }

                /*if (key != NO_KEY && ok == 35)
                  {
                    GLCD.ClearArea(); goto menu;
                  }  */
                }  // FINE WHILE

Il conteggio degli impulsi funziona bene fino a quando la ruota non supera una certa velocità di rotazione (provato ad auto ferma su dei cavalletti). Oltre questa velocità il programma non rileva alcuni impulsi

Il collegamento l'ho effettuato mettendo solo la resistenza (da 10k) citata nel block diagram (3 wire) e non il condensatore (potrebbe essere questo il problema?).

In ogni caso, come faccio a stabilire quali devono essere i valori di C ed R che dovrei collegare, considerando che uso un ingresso digitale di arduino nano?

Di seguito vi allego il datasheet del sensore ed il link del magnete:

Grazie a tutti

9243.pdf (236 KB)

Non c'entra nulla il programma ma devi vedere la velocità di acquisizione dato dall'ingresso che, oltre un certo limite, si perde la transizione da 1 a 0.
Ma nessun problema, fai come ho fatto io, di vai a studiare l'interrupt di Arduino e vedrai che è più semplice di quello che pensi.

Ciao, considera che il tuo problema potrebbe avere una soluzione piu "meccanica" che elettronica ... i sensori ad effetto di hall di solito sono abbastanza veloci, pero' se tu hai messo il magnete sul bordo esterno della ruota ed il sensore sulla carrozzeria, prima di tutto saranno ad una certa distanza (ed il campo magnetico decresce con il quadrato della distanza, non linearmente, quindi anche poca distanza in piu fa parecchio campo in meno), e secondo, il magnete sul bordo esterno della ruota ha una velocita', a parita' di giri, molto superiore a quella che avrebbe verso il mozzo (non e' questione di numero di giri o di velocita' angolare, ma di velocita' periferica, prendi ad esempio un disco con circonferenza di un metro che gira ad un giro al secondo, e disegnaci sopra due punti, uno sul bordo (dove la circonferenza e' appunto di 1 metro) ed uno verso il centro, in un punto in cui percorra una circonferenza di 10cm, il punto sul bordo ha una velocita' di 1 metro al secondo, il punto verso il centro di 10cm al secondo ... se sui due punti avessi due magneti, uno passerebbe davanti al sensore 10 volte piu veloce dell'altro, rimanendoci quindi per un decimo del tempo ...

Dovresti provare a spostare sia il magnete che il sensore il piu possibile verso il mozzo, vedrai che il risultato ti cambia, e piu riesci a spostarlo verso il mozzo, piu velocita' potrai leggere ...:wink:

Si, però tieni sempre a mente che oltre una certa velocità, senza INTERRUPT, non leggi...

Ti fai una variabile così:

volatile int ctlCount = 0;

Lo inizializzi così nel setup ():

attachInterrupt(0, conta, FALLING); // creazione ingresso veloce su D2

Poi fai un void a parte che non viene influenzato dal programma:

void conta () {
ctlCount++;
}

... dove ci metti le IF che vuoi tu.

Si si, su questo sono daccordo pure io ... il mio suggerimento era generico, per "ridurre" il problema al minimo possibile (anche perche' se la velocita' diventa talmente elevata da non far piu scattare correttamente il sensore, hai voglia a mettere interrupt ... ;))

Ragazzi grazie per le risposte,

@ Etemenanki:

pero' se tu hai messo il magnete sul bordo esterno della ruota ed il sensore sulla carrozzeria, prima di tutto saranno ad una certa distanza

Hai ragionissima, infatti ho considerato questo aspetto mettendo il sensore piu vicino possibile al mozzo, considera inoltre che nel punto "di contatto" tra magnete e sensore ho una distanza di circa 5-6mm.

@ steve-cr:

Si, però tieni sempre a mente che oltre una certa velocità, senza INTERRUPT, non leggi..

bhe non so quanto veloce dovrei andare per dovere necessariamente usare interrupt, inizio ad avere errori a circa 1 impulso/secondo (considera che ho fatto girare la ruota dell'auto a mano).
Se è questo il problema corro subito a studiare gli interrupt.....

Non se ne parla!
Arduino legge centinaia di impulsi al secondo, quindi devi ricercare il problema nel circuito e per adesso dimentica l'interrupt.
Dimentica anche qualsiasi condensatore (che rallenta, appunto, l'acquisizione). Intanto prova "a mano" con il magnete e il sensore effetto Hall. Il data sheet recita 10Khz, quindi fino a 10mila commutazioni al secondo.
Se anche così non riesci a leggere più di un impulso al secondo, prova a mano cortocircuitando due semplici fili (positivo e ingresso) eliminando il sensore (non si sa mai che abbia qualche problema).

grazie steve,

questa è una prova che effettivamente ho fatto in attesa di ricevere il sensore, e tutto funzionava benissimo.
Anche il sensore a banco funzionava bene, una volta montato in auto cominciarono i problemi, forse per l'elevata "velocita di passaggio" del magnete sul sensore...
Per questo pensavo ad un problema di connessione piuttosto che al software....

piccolo aggiornamento: ho pensato che il problema potesse essere la resistenza del cavo (sensore-arduino) lungo circa 4m, quindi ho fatto la prova con cavo piu corto....non ho risolto....ho provato pure a ridurre la R di collegamento del segnale del sensore da 10K a 1K ma niente....non so piu che fare.....forse non mi resta che tentare l'interrupt....

domix1684:
Anche il sensore a banco funzionava bene, una volta montato in auto cominciarono i problemi, forse per l'elevata "velocita di passaggio" del magnete sul sensore...

... o magari perché in auto i disturbi elettrici sono un'infinità e ... un conto è provare le cose a banco, un altra è la realtà!!!

Guglielmo

... o magari perché in auto i disturbi elettrici sono un'infinità e ... un conto è provare le cose a banco, un altra è la realtà!!!

La prova in auto l'ho fatta a motore spento su dei cavalletti, facendo girare la ruota con le mani......

domix1684:
La prova in auto l'ho fatta a motore spento su dei cavalletti, facendo girare la ruota con le mani......

... e allora NON è possibile ! Se ti funziona a banco DEVE funzionare anche in quelle condizioni, anche perché, a mano, dubito sei arrivato a far fare alla ruota centinaia di giri al minuto :smiley:

In ogni caso ... NON sottovalutare quanti ti ho scritto ... i problemi potrebbero ancora dover cominciare ... in auto è un gran casino se non si filtra bene tutto !

Guglielmo

mi porto un dubbio: il sensore in questione ha dei limiti (immagino di si, ma quali?) in termini di durata dell'impulso di eccitazione che provoca il cambio di stato dell'uscita?

è pur vero che se cosi fosse non dovrei visualizzare nessun impulso dopo una certa velocita di rotazione, invece alcuni li predo altri no...

Controlla bene i cablaggi

domix1684:
è pur vero che se cosi fosse non dovrei visualizzare nessun impulso dopo una certa velocita di rotazione, invece alcuni li predo altri no...

... forse troppe masse metalliche che influenzano il campo magnetico. ::slight_smile:

Ma quale sensore stai usando esattamente? Ne hai preso uno specifico per "automotive" ?

Guglielmo

Ma quale sensore stai usando esattamente? Ne hai preso uno specifico per "automotive" ?

Se vai nel mio primo post ho allegato il datasheet....

Visto ... NON mi sembra per uso "automotive" (cerca con Google "hall sensor automotive" e vedi cosa intendo), comunque, se non leggo male ... viene dato con capacità di rilevare 10K passaggi al secondo, quindi ... dubito che non sia in grado di stare dietro ai giri di una ruota :smiley:

Guglielmo

sono d'accordissimo con te Guglielmo, bhe se il problema non è il codice, proverò a stabilizzare ancora di più i collegamenti....oppure posso cambiare sensore per vedere il nuovo comportamento a parità di condizioni....

@Guglielmo puoi indirizzarmi verso un prodotto specifico?

A me era venuto anche il dubbio che qualcosa distorcesse o schermasse il campo magnetico ... ma si fa presto a controllare, mettendo 2 o 3 magneti uno sull'altro invece che uno, dovrebbe migliorare parecchio ...

Altra cosa che mi ero dimenticato di chiederti prima, hai orientato correttamente il magnete ? ... perche' i sensori hall in genere hanno un "senso" di rilevazione, una faccia rileva il polo nord, l'altra il polo sud (o piu precisamente, i campi in direzione N>S e S>N) , per cui se fosse montato al contrario, quasi sicuramente creerebbe problemi ...

A me era venuto anche il dubbio che qualcosa distorcesse o schermasse il campo magnetico ... ma si fa presto a controllare, mettendo 2 o 3 magneti uno sull'altro invece che uno, dovrebbe migliorare parecchio ...

Altra cosa che mi ero dimenticato di chiederti prima, hai orientato correttamente il magnete ? ... perche' i sensori hall in genere hanno un "senso" di rilevazione, una faccia rileva il polo nord, l'altra il polo sud (o piu precisamente, i campi in direzione N>S e S>N) , per cui se fosse montato al contrario, quasi sicuramente creerebbe problemi ...

Grazie Ete,

si ho anche provato ad accostare un secondo magnete a quello gia incollato sul cerchio dell'auto, ed il verso di orientamento del magnete è quello corretto...adesso ho ordinato altri sensori effetto hall "semplici" per capire se magari è un difetto del sensore....

p.s. a proposito di colla, ho usato una colla bicomponente per fissare sia il sensore che il magnete, non è che per qualche strana ragione possa influenzare il rilevamento???