Salve a tutti!!
sto cercando di leggere i giri delle due ruote di una moto con due sensori hall fissi in prossimità dei mozzi delle ruote e 4 calamite per ruota e scriverli su una scheda sd.
il programma funziona se non fosse che rilevo dati che non hanno ne capo ne coda.
ho provato ad usare le interrupt in tutte le loro funzioni (FALLING,RISING,CHANGE)
con le relative ISR che si limitano ad incrementare una variabile senza alcun risultato. Non capisco cosa sbaglio... scrivo qui dove vari tentativi nella speranza di ricevere qualche consiglio utile per leggere i due sensori.
i sensori sono in PULL_UP e quando la calamita passa davanti vanno a GND
In mattinata metterò L output così come lo salva intanto posso anticipare che con le due interrupt con FALLING ho quasi sempre 0.00 o 1.00 in un sensore e valori verosimili nell altro..
sta mattina proverò a leggere i sensori uno per volta in modo da escludere un problema “hardware”…
I sensori li ho presi su Amazon e c’è scritto 49E unipolari.
Credo ci sia un errore di calcolo ho corretto il codice dividendo i tick per il numero di calamite (4) poste sulla ruota..anziché moltiplicarli per 0.25.. dovrei provare se così avrò dei valori più realistici.
I sensori sono collegati a 5v-Gnd e sul pin 2/3 dichiarati PULL_UP
Testando il sensore appena arrivato ho provato a collegarlo ad un pin analogico rendendomi conto appunto che ritornasse un valore analogico,ma provando al pc con la configurazione che sto usando sembra funzionare correttamente.
A che pro? Dividere per 4 o moltiplicare per 0.25 è la stessa cosa (1/4=0.25)... E poi nel codice vedo che moltiplichi per 4....
Non fare tentativi "a caso", o cerchi di capire e fare modifiche che abbiano un senso o rischi di fare confusione in mente (nel migliore dei casi) o di incasinare il codice (nel peggiore).
Quindi provo a riassumerti:
Se hai collegato i sensori verso GND tu dovresti usare sempre FALLING (ossia quando passa da HIGH a LOW), non ha grosso senso usare CHANGE e RISING è equivalente.
Oltre a postare sempre il codice, includere sempre uno schema dei collegamenti (anche disegnato a mano e fotografato può essere sufficiente) e magari anche qualche altra informazione (es. lunghezza dei cavi verso i sensori, tipo di cavo, alimentazione...).
Indenta sempre il codice in modo più coerente (premi Ctrl-T nell'IDE e te lo fa lui, fallo sempre quantomeno prima di postare qui il codice)
Anche per lo stile di programmazione ci sono cose inutili o da sistemare, ad esempio la prima cosa è levare di mezzo le "String" come già ti ha consigliato anche Standardoil perché sono fonte di potenziali problemi su Arduino; e magari anche cose non propriamente problematiche ma da considerare, o più che altro inutili come ad esempo se "giri_a" e "giri_p" sono variabili globali, non serve a nulla passarli anche a parametro alla "logdata()"; i valori costanti poi, come convenzione, vanno indicati con lettere tutte maiuscole (es. "SCAN_RATE_MS" e non "scan_rate_ms") per distinguerli immediatamente dalle variabili; e l'underscore "" prima del nome, sempre per convenzione, si usa per variabili locali ad una funzione o modulo.
Per finire, nei progetti va sempre considerata la configurazione in rapposto a ciò che vuoi fare o ottenere. Tu tramite ISR incrementi una variabile per "contare" il numero di "tick" ci sono nell'intervallo di tempo che prendi in considerazione, attualmente 1 secondo, ci siamo?
Se tu hai un impulso per ogni magnete, ossia 4 per giro, devi decidere esattamente cosa vuoi rilevare e quindi cosa calcolare.
Se ciò che ti serve è come immagino il numero di giri della ruota (ottenuto dal numero di "tick" in un secondo), se di magneti ne metti 4 avrai 4 impulsi per giro della ruota.
Il che significa, facendo quindi esempi "banali", che se la ruota facesse un giro al secondo avresti "tick_a == 4"; da questo per calcolare il numero di giri al secondo dovresti dividere i tick per 4 quindi non "giri_a = n_sens * tick_a;" ma "giri_a = tick_a / n_sens;"; occhio che questa sarebbe una divisione tra due valori interi che poi metti in una variabile float (lascio a te come esercizio capire perché devi fare attenzione...)
Sinceramente però per calcolare la rotazione io prenderei il tempo "t" in millisecondi (quantomeno) tra un "tick" ed il successivo, per cui se ho 4 magneti basta moltiplicare il tempo per 4 per avere il tempo, in millisecondi, per un giro e quindi per calcolare i giri al secondo ne farò il reciproco ("giri = 1000 / (4*t);" oppure se metti un solo magnete, basta fare "giri = 1000 / t;").
No, dai, perché? Resta, ognuno dà un contributo che magari all'altro è sfuggito, non ci sono "esclusive" Ad esempio il LED in parallelo per verifica visiva (a basse rotazioni) non è male come idea.
Ok.
Ma, per completare il quadro (ossia i "requisiti utente"...), quanti giri al secondo massimi prevedi per la ruota, e quale precisione vuoi avere? Perché questo può influire non solo sul numero di magneti, ma anche sul tipo di sensori e loro collegamento ad Arduino...
I giri massimi per ruota potrebbero essere 25 al secondo.. quindi 100 impulsi al secondo con 4 calamite.. per quanto riguarda la precisione punterei al più preciso possibile… con 4 calamite potrei riuscire ad avere una precisione al quarto di giro..
Non so quali sensori tu abbia, come siano posizionati i sensori ed i magneti, e come sono/saranno connessi, ma è difficile darti consigli diretti, credo che tu debba comunque continuare a fare test "sul campo" per verificare meglio precisione e consistenza delle misurazioni.
Se parliamo ad esempio di uno scooter abbiamo circa 1 metro percorso per giro, quindi 25 giri al secondo significano 25 metri al secondo, che sono equivalenti a 90 kmh. Non so sinceramente se 100 impulsi al secondo possano essere un problema per la sensibilità/precisione di generici sensori Hall (dipende, come dicevo, dal tipo di sensore, dalle relative specifiche elettriche, dai magneti e loro posizionamento, dalla connessione ad Arduino...), ma non credo proprio che mettere 4 magneti possa dare una precisione tanto maggiore di uno solo, se non per potenzialmente arrivare a calcolare la velocità anche 100 volte al secondo ma sarebbe un livello di precisione non necessario.
E confermo che, come dicevo, al posto tuo mi limiterei ad un solo magnete ed a contare quindi i millisecondi tra un impulso ed il successivo, molto più semplice sia da gestire sia da calcolare.