Go Down

Topic: Antirimalzo - debounce solo SOFTWARE (Read 198 times) previous topic - next topic

adm91

Buongiorno a tutti,

come da titolo vorrei sapere come risolvere il probelma del rimbalzo del segnale provocato da un tasto meccanico normalmente aperto quando viene premuto (le cosiddette alee).

So che la soluzione migliore consiste in una solizione hardware con un filtro passa basso ma avrei bisogno di sapere una soluzione che non utilizzi il delay al termine del fronte di discesa.

Vi chiedo questo perchè tutta la documentazione che ho trovato utilizza tale ritardo, ma io vorrei evitare di usarlo.


ringrazio tutti quelli che vorranno aiutarmi e/o contribuire in maniera costruttiva a questa discussione.


adm91

gpb01

#1
Nov 08, 2018, 03:22 pm Last Edit: Nov 08, 2018, 03:22 pm by gpb01
Vi chiedo questo perchè tutta la documentazione che ho trovato utilizza tale ritardo, ma io vorrei evitare di usarlo.
Davvero?  Strano, perché la documentazione ufficiale, che trovi con una semplice ricerca su Google per "arduino debouncing" NON lo usa ed usa invece una tecnica non bloccante con millis() ... ::)

Guglielmo
Search is Your friend ... or I am Your enemy !

Patrick_M

basta caricare l'esempio incluso nell'ide esempi -> digital -> debounce :)
per inserire (lo sketch) il programma, dall'IDE clicca modifica, clicca copia per il forum poi vieni qui e incolla nel tuo post (ctrl+v) ;)

adm91

Davvero?  Strano, perché la documentazione ufficiale, che trovi con una semplice ricerca su Google per "arduino debouncing" NON lo usa ed usa invece una tecnica non bloccante con millis() ... ::)

Guglielmo
grazie Guglielmo, non sono a conosenza di questa funzione millis() e da ignaro ho creduto che fosse un tempo di ritardo piazzato per attendere il "piallamento" delle alee.

gpb01

... presto scopriari che la funzione millis() è .... fondamentale !!! :D

Se vuoi avvantaggiarti puoi studiare prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

Claudio_FF

#5
Nov 08, 2018, 08:25 pm Last Edit: Nov 09, 2018, 07:06 am by Claudio_FF
Quote from: adm91
So che la soluzione migliore consiste in una solizione hardware con un filtro passa basso ma avrei bisogno di sapere una soluzione che non utilizzi il delay al termine del fronte di discesa.
Un anti rimbalzo può essere effettuato sull'attacco (e non filtra i rimbalzi al rilascio), sul rilascio (e non filtra quelli all'attacco), o sia sull'attacco che sul rilascio (classico passa basso). Il modo non bloccante più conciso usando millis è il primo di questa lista, dove 'tIn' è il segnale da filtrare e 'tOut' è il segnale filtrato.
* * * *    if non è un ciclo   * * * *
* * * Una domanda ben posta è già mezza risposta. * * *

adm91

... presto scopriari che la funzione millis() è .... fondamentale !!! :D

Se vuoi avvantaggiarti puoi studiare prima QUI, poi QUI e QUI e QUI e tutti gli articoli che sono in QUESTA pagina ... ;)

Guglielmo
Grazie, è proprio ciò di cui avevo bisogno! ;)

Sulimarco

#7
Nov 09, 2018, 05:12 pm Last Edit: Nov 09, 2018, 05:23 pm by Sulimarco
Scusa Guglielmo ma Questa pagina riguardo a millis() e' terribile, a cominciare dal titolo.

E' chiaro che i poveri makers dopo aver letto questa roba crollano a terra tramortiti e non si riprendono piu'.


--------------------------------------------------------------------------------------------------------------

Per sapere, usando millis(), quanto tempo e' trascorso tra due eventi basta fare due letture ed una sottrazione:


Code: [Select]
evento_1 = millis();                     // primo evento        

......
...

...

evento_2 = millis();                     // secondo evento

TempoTascorso = evento_2 - evento_1;     // TempoTrascorso contiene il numero di millisecondi
                                         // trascorsi tra il primo evento ed il secondo evento

[/code]
   

L'unica cosa da ricordarsi e' che le variabili evento_1, evento_2  e TempoTrascorso devono essere unsigned long

Non esiste nessun "problema dell'overflow" : e' un mito !


Quanto sopra vale anche per micros() solo che il risultato sara' espresso in microsecondi.


Ciao
Marco










gpb01

#8
Nov 09, 2018, 05:30 pm Last Edit: Nov 09, 2018, 05:31 pm by gpb01
L'unica cosa da ricordarsi e' che le variabili evento_1, evento_2  e TempoTrascorso devono essere unsigned long

Non esiste nessun "problema dell'overflow" : e' un mito !
... certo, e quella pagina spiega abbastanza bene il perché in reltà l'overflow NON è un problema  :)

Ovvio che un po' di "algebra binaria" bisogna masticarla ...

Guglielmo
Search is Your friend ... or I am Your enemy !

Go Up