a tutti, sto tentando di leggere un sensore hall a tre fili con arduino e calcolare la velocità. Ho letto un pò di threads ed ho usato un codice molto semplice che funziona piuttosto bene con gli interrupts.
Veniamo alla descrizione del sistema. Il sensore è recuperato da uno scooterone. Ha tre fili, +12V, GND e signal. Il segnale è 12V quando non c'è alcun metallo di fronte e 0V quando c'è metallo.
Poiché non avevo modo di installarlo in luogo od in vicinanza della ruota fonica, l'ho installato in modo da "leggere" il passaggio dei montanti del disco freno che sono 5, quindi ogni giro dovrebbe fare 5 letture.
Il codice che conta le letture viene attivato con FALLING
Ora il problema è il seguente: leggendo con arduino nano sul pin 2 (dove sono attivati gli interrupt) ogni passaggio del montante di fronte al sensore l'arduino legge random tra 7 e 11 attivazioni della funziona interrupts in luogo di uno solo.
Ora penso che sia semplicemente un problema di filtro del segnale. Non ho un oscilloscopio per leggere esattamente cosa accade. Ma vorrei un consiglio sulla frequenza da tagliare.
In teoria, con il diametro di ruota (59.8 cm) e 5 count per giro dovrei avere una frequenza che oscilla tra 10 Hz e 150Hz con velocità tra 15 km/h e 200 km/h.
Poiché i circa 10 count avvengono ad ogni passaggio, in luogo di uno, ho calcolato la frequenza dei 10 count per ogni passaggio.
Esempio a 15km/h la frequenza teorica è 11 count/secondo ma arduino ne registra circa 110 (10 volte in più) e questo lo fa solo quando il metallo passa davanti il sensore che accade solo per il 20% del tempo. Per il restante tempo il sensore vede vuoto. Quindi ho calcolato che la frequenza è
110 count/secondo 1/0.20=550 Hz......
Poiché a 200 km/h la frequenza teorica è 150 Hz circa. La mia domanda è: se metto un filtro passa basso con taglio a 400 risolvo? O devo lavorare sul codice?
Sono alle prese anch'io con la costruzione di un circuito analogo al tuo. Sto procedendo a rilento perchè adesso nel garage fa molto freddo, ma ho ottenuto a banco dei risultati incoraggianti.
Usando l'interrupt ma con il parametro rising e un contatto reed che connetto al pin 2 attraverso un circuito di debouncing ( 2 Resistenze ed un condensatore) non ho problemi di sorta. Ma ripeto questo è ciò che accade a banco.
Nel tuo caso, usando un sensore di hall non penso serva un circuito di debouncig, il filtro di cui parli serve per limitare i rimbalzi che un contatto meccanico introduce in fase di chiusura. Appunto un reed o un pusante ecc ecc.
Forse dovresti provare ad usare un sensore di hall sciolto e non quello dello scooter. Questi sensori hanno bisogno solo di una R tra il pin data e il +Vcc.
Se il numero di count registrati è stabilmente e proporzionalmente 10 volte quelli che ti servono, perché non considerare che a 15km/h hai 110 count invece di 11?
A mio modesto parere un filtro ti taglia tutto non solo quelli che non ti servono, infatti come fa a discernerei primi 11 da tutti quelli seguenti.
Un'idea potrebbe essere quella di sfruttare la libreria frequencyCounter per misurare direttamente la frequenza degli impulsi e così vai sul sicuro.
Allora quella libreria è l'unica soluzione, il conteggio aritmetico degli impulsi è improponibile, la lib invece ti calcola la frequenza a prescindere dal numero degli impulsi e quando essi finiscono, tratti il valore misurato in frequenza come vuoi.
Io credo che il problema siano degli spikes a più alta frequenza, ho fatto un disegno....
purtroppo non ho un oscilloscopio per verificarlo, vedrò di trovare un amico che mi fa un favore.
Tuttavia con il tester io vedo andare a 0 il voltaggio probabilmente ci va con degli spikes ed arduino
sopra i 3.0V (credo) interpreta come attivazioni logiche HIGH.
Per questo motivo penso che un filtro passa basso elimina il problema. Solo che ho qualche dubbio sulla frequenza a cui tagliare
Se la situazione è effettivamente quella del disegno allora ti basta conoscere la frequenza massima degli impulsi principali e tagliare subito sopra. L'unica cosa che non capisco è come mai aumentando la velocità della ruota la frequenza diminuisca.
Comunque un filtro passa-basso lo fai in un istante: per circa 500 Hz devi mettere una R da 3k3 in serie al segnale ed a seguire un C poliestere o ceramico da 100nF verso massa. Fai una prova, vedi che succede, ad affinare la frequenza poi ci mettiamo poco.
Ma lì vedo un segnale di 12V, come lo attenui, con un partitore resistivo?
@droidprova: si, alla fine il principio è quello, ma se è come dice lui se la cava davvero con un filtro passa-basso.
Oltre i filtro se metti caso leggesse comunque più impulsi, anche una flag lo aiuterebbe. In poche parole metti a uno una variabile dentro l'interrupt che poi leggi fuori nel loop incrementando di uno il wheelCount
folagana:
Chiedo perdono, forse mi è sfuggito qualcosa involontariamente?
il disegno è puramente indicativo.....
no, sono io che non ho le idee chiare; lasciando stare il disegno il sensore va su LOW per tutto il tempo che passa davanti ad un punto ben preciso, se p.es. a 1km/h mantiene il LOW per 1 secondo, a 10km/h il tempo dovrebbe scendere a 1/10 di secondo, poiché la frequenza è l'inverso del periodo, io sarei portato a pensare che aumentando la velocità aumenti la frequenza, ma magari sto ragionando a pippa
si, l'ho usato per dare il corretto voltaggio al pin di arduino.
ok, però questo sicuramente influenzerà il calcolo del filtro. Se decidi di fare la prova fammi sapere come hai costruito il partitore
As_Needed:
Oltre i filtro se metti caso leggesse comunque più impulsi, anche una flag lo aiuterebbe. In poche parole metti a uno una variabile dentro l'interrupt che poi leggi fuori nel loop incrementando di uno il wheelCount
Questa tua cosa è interessante, se lui considera il solo picco iniziale ad ogni giro di ruota, gli basta misurare il tempo intercorrente tra i due per calcolare la velocità, anche se ovviamente deve tener conto che qui c'è un movimento angolare e non lineare, ma cred che questo lo abbia già considerato nella formula che vedo nel suo codice.
No in effetti non è così. Il sensore è fermo e di fronte a lui c'è la ruota o meglio il disco dei freni. Il disco ha 5 montanti e quindi ogni giro il sensore va a 0 teoricamente 5 volte. Purtroppo invece di farlo una sola volta per passaggio lo fa 7-12 volte random.
ok, però questo sicuramente influenzerà il calcolo del filtro. Se decidi di fare la prova fammi sapere come hai costruito il partitore
Come dovrebbe influenzare è messo a valle? Più tardi verifico il valore delle resistenze, adesso non lo ricordo.
non sara' per caso un sensore induttivo?
quelli che si usano normalmente per rilevare i "vuoti e i pieni" (termini usati volutamente non tecnici, così ci capiamo) sulle ruote foniche.
metti foto, (se vuoi) così dipaniamo tutti i dubbi.
l'ho riportato nel primo post.
Comunque questa è la foto. Ha tre fili e quindi lavora in tensione e si è un sensore induttivo che lavora sui "vuoti" e "pieni"
folagana:
Perché?... C'è qualcosa che devo sapere?
se fosse un sensore di hall' (l'hai detto tu nel primo post )per quel poco che ne so dovrebbe avere anchè un magnete dall'altra parte del disco . (rileva il campo magnetico)
secondo me, visto che è stato prelevato da una ruota fonica probabilmente è un sensore induttivo, alimentato e dal terzo filo esce un segnale digitale.
conta moltissimo la distanza dal disco, si viaggia nell'ordine dei mm,
troppo vicino o troppo lontano fa la differenza sia come ampiezza che come pulizia del segnale.
inoltre bisogna considerare anche l'alimentazione, se è sporca lei, ti ritrovi sporco anche il segnale.
folagana:
No in effetti non è così. Il sensore è fermo e di fronte a lui c'è la ruota o meglio il disco dei freni. Il disco ha 5 montanti e quindi ogni giro il sensore va a 0 teoricamente 5 volte. Purtroppo invece di farlo una sola volta per passaggio lo fa 7-12 volte random.
ok ma la sostanza non cambia....
Come dovrebbe influenzare è messo a valle? Più tardi verifico il valore delle resistenze, adesso non lo ricordo.
Se il partitore è messo a valle del filtro, l'influenza dovrebbe essere minore, specialmente se il partitore è costituito con due R di valore elevato.