Filtro passa basso su sensore hall - [RISOLTO]

Salve

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.

Ciao ciao

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.

Purtroppo non è sempre 10 varia tra 7 e 12 in modo suppongo casuale.

Adesso mi studio questa libreria....

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.

folagana:
Purtroppo non è sempre 10 varia tra 7 e 12 in modo suppongo casuale.

Adesso mi studio questa libreria....

ma se è casuale il conteggio aritmetico degli impulsi, allora non potrebbe essere casuale anche la lettura della frequenza?

x Michele Menniti: analogamente a quanto da te suggerito, potrebbe andar bene anche la PulseIn()?

Nicola

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

Non sarebbe male anche vedere il tuo codice di come leggi l'interrupt :wink:

Questo è quello he ho usato:

int PinSpeed = 2;      // Pin dove si legge la velocità della ruota
double wheelTime, wheelSpeed;
volatile int wheelCount;


void setup() {
 
  pinMode(PinSpeed, INPUT);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), Speed, FALLING);
  
   digitalWrite(2, HIGH);
  wheelSpeed=0;
  wheelTime=0;

}

 
void loop() { 

   if(wheelCount>15) {
      wheelSpeed=((59.8*3.14159*10/5)*wheelCount/(millis()-wheelTime))*3.6;
      wheelTime=millis();
      wheelCount=0;
      Serial.print("Speed: ");
      Serial.println(wheelSpeed);
   }




} // END del ciclo loop


void Speed() {
    wheelCount +=1;
}

E questo è quello che proverò....
mettendo un intervallo per prendere solo un "salto"

int PinSpeed = 2;      // Pin dove si legge la velocità della ruota
double wheelTime, wheelSpeed, Time;
volatile int wheelCount;


void setup() {
  pinMode(PinSpeed, INPUT);
  Serial.begin(9600);
  attachInterrupt(digitalPinToInterrupt(2), Speed, FALLING);
  
   digitalWrite(2, HIGH);
  wheelSpeed=0;
  wheelTime=0;
  Time=0;
}

 
void loop() { 
   if(wheelCount>15) {
      wheelSpeed=((59.8*3.14159*10/5)*wheelCount/(millis()-wheelTime))*3.6;
      wheelTime=millis();
      wheelCount=0;
      Serial.print("Speed: ");
      Serial.println(wheelSpeed);
   }
} // END del ciclo loop


void Speed() {
  if(millis()-Time>8) {
    wheelCount +=1;
    Time=millis();
  }
}

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.

Chiedo perdono, forse mi è sfuggito qualcosa involontariamente?

il disegno è puramente indicativo.....

Ma lì vedo un segnale di 12V, come lo attenui, con un partitore resistivo?

si, l'ho usato per dare il corretto voltaggio al pin di arduino.

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?

Quasi al 100% la frequenza deve aumentare all'aumentare della velocità

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 :grin:

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.

Perché?.. C’è qualcosa che devo sapere?

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.

goldx:
ho molti dubbi :confused:
il magnetino c’è?

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.

continuo il trasloco

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.