Go Down

Topic: Problema di bouncing con pushbutton (Read 593 times) previous topic - next topic

Turbodede

Salve a tutti!

Mi presento sono David un neocadetto dell accademia di Arduino. Mi presento quì perche sono nuovo del mondo dei forum e non ho ben capito dove avrei dovuto farlo spero che non sia fastidioso quello che faccio.

Detto ciò inizio subito a scocciarvi con il primo dei miei problemi. Sto imparando Arduino dal libro di massimo banzi (in inglese pubblicato dalla rivista Make se non erro). Il mio problema è eliminare il bouncing del push botton ma non ho ben capito in cosa consiste il problema e di conseguenza non riesco a sviluppare una strategia efficace con cui risolverlo. Ho progettato il programma che dovrebbe risolverlo ma funziona solo molto raramente e nella normalita si comporta che quando il pulsante è premuto il led si accende. In fondo posterò la mia soluzione al problema.

Quello che vi chiedo quindi è se sapete spiegarmi qual'è nella fattispecie il problema relativo al bouncing in modo che io possa cercare di risolverlo da solo...(si...lo sò...la soluzione è sul libro ma non l ho capita a pieno proprio perchè non ho capito qual'è il problema che genera il bouncing).

spero di non avervi tediato troppo e spero che il problema sia esposto in maniera chiara. Ecco il mio codice:


Code: [Select]
const int ledPin=13;
const int button=7;

int valore=0;
int valoreDopo=0;
int clik=0;
int stato=0;

void setup()
{
  pinMode(ledPin,OUTPUT);
  pinMode(button,INPUT);
}

void loop()
{
  valore=digitalRead(button);
  delay (5);
  valoreDopo=digitalRead(button);
 
  if(valore!=valoreDopo)
  {
    clik=1;
}
  else
  {
    clik=0;
  }
 
 
  if(clik==1)
  {stato=1-stato;
  }
 
  if(clik==1 && stato==1)
  {
    digitalWrite(ledPin, HIGH);
   
  }
  if(clik==1 && stato==0)
  {
    digitalWrite(ledPin,LOW);
   
  }
  clik=0;
}


se vi interessa posso spiegarvi la logica anche con cui l ho costruito... in modo che capite anche qual'è il mio livello di preparazione in C per i prossimi posts...:D

grazie mille in anticipo.

saluti

David



gpb01


...
Quello che vi chiedo quindi è se sapete spiegarmi qual'è nella fattispecie il problema relativo al bouncing in modo che io possa cercare di risolverlo da solo...(si...lo sò...la soluzione è sul libro ma non l ho capita a pieno proprio perchè non ho capito qual'è il problema che genera il bouncing).
...


Molto semplicemente il problema è che un interruttore REALE (... e non teorico sulla carta) ha un comportamento imperfetto ...

... quando lo apri o chiudi in realtà non apre o chiude subito perfettamente, ma per imperfezioni meccaniche ed altro, ha una serie di "rimbalzi" (sequenze molto rapide di apertura/chiusura), rimbazi che, se pur molto veloci, vengono comunque intercettati da Arduino come una serie di passaggi LOW/HIGH/LOW ... del pin a cui è collegato ;)

Se non vuoi quindi usare librerie già pronte, ma vuoi capire TU il problema, devi considerare questa cosa e considerare valida una "condizione" solo se essa è stabile dopo un certo lasso di tempo ...

... e, per ora, non dico altro ... per lasciarti il gusto di trovare la soluzione ;)

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

Turbodede

grazie mille guglielmo per la tua disponibilità.

Le cose che mi hai detto sono molto simili a quello che avevo letto sul libro di massimo banzi.

La mia idea per evitare ciò era quella di fare due prelievi della variabile in grado di rilevare la pressione del bottone ad istanti diversi (variabile e variabileDopo) e vedere se sono uguali. Nel caso lo fossero allora il click vi è stato davvero.

Se possibile controlla il mio codice e dimmi se il problema è altrove. Perchè non sono sicuro che quello che ho scritto sia corretto.

grazie comunque della disponibilità!

fammi sapere!

David

gpb01

Dandogli un'occhiata veloce mi vengono le seguenti domande ...

1. Sicuro che bastano 5 mSec perché la situazone si stabilizzi ? Hai fatto un po' di prove ?

2. perché tutte le variabili "int" ??? Per sprecare spazio ? XD ... ti bastano tutte "byte" ;)

3. Una volta che hai visto che effettivamente c'è stata una vera pressione del pulsante, perché tutta quella logica complessa quando, per commutare OFF/ON/OFF/ON/ecc. ti basta fare "stato = !stato;" per ottenere ogni volta l'inversione dello stato e poi accendere o spegnere il led di conseguenza con "digitalWrite(ledPin, stato);" ?

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

Turbodede

Grazie ancora!

Allora credo innanzi tutto di aver beccato l errore nella logica (anche se il pulsante non viene premuto il programma vede un click).

Per darti una risposta:

1)no non ne sono affatto sicuro ma non ho fatto prove perchè il circuito in se non funzionava con questo programma.
2)grazie del consiglio! ancora non so cosa faccio bene!
3)idem come sopra vedrò cosa posso fare entro stasera produrrò un nuovo release e con calma te lo sottoporrò se non funziona!


Grazie mille ancora una volta per la disponibilità!


david

Turbodede

Grazie dell help il problema è risolto!

Alla prossima !

grazie ancora

David

gpb01

Bene! Cortesemente, coreggi il titolo della discussione ed aggiungi un [RISOLTO] davanti ;)

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

Testato

turbodede, quando risolvi un problema, specialmente se sei stato aiutato, e' giusto dire come.
credo il tuo errore era qui
Code: [Select]
if(valore!=valoreDopo)
  {
    clik=1;
}


ad 1 devi settarlo quando sono uguali, non quando sono diversi,

fermo restando che i 5ms sono davvero pochi come ha detto Guglielmo
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Go Up