Antirimbalzo hardware

Ciao a tutti
leggendo sui vari post ho letto che l’antirimbalzo hardware si fa connettendo un condensatore da 100 nF tra
il pin di ingresso e massa, in parallelo alla resistenza di pull_down.
Ma nel caso di una resistenza di pull-up o, con la resistenza di pull-up interna, il condensatore va nello stesso posto?
Franco

Non conosco il metodo che stai citando, anche perché non spieghi come sarebbe collegato il pulsante; a mio modesto parere una R in parallelo al C non serve a nulla. Ti allego alcuni schemi, l’ultimo a destra è quello che ho adottato io con successo su un integrato TTL, come vedi la R è di pull-up ed il C va verso massa, il rapporto tra R e C dà il tempo di debounce, che puoi calcolare con la formula: T(msec)=R(kohm)*C(µF)*0,9

ci son diverse techniche di atirimbalzo hardware, quella suggerita dal Menniti è forse la migliore e più sicura in assoluto, nella fattispecie quella con il flip-flop (le prime due nei disegni)

la più semplice è quella di mettre appunto un circuito RC (con c di solito 1...10uF) ma è una tecnica abbastanza spartana e non sempre efficiente al 100% ha il vantaggio però di essere molto semplice.

per qaunto riguarda il posto dove mettere C guarda sempre nel immagine postata da Menniti l'utimo disegno... dove la R o la metti tu esterna o metti quella interna (è la stessa cosa) ed il condensatore va poi messo sempre nella stessa posizione

Ciao, vorrei provare la prima e l'ultima soluzione. Per il flip-flop, che integrato mi consigli? Franco

nello schema proposto si usano delle porte NAND quindi un qualsiasi 74XX03 va piu che bene!

Il problema del ricorso alla R di pull-up interna del micro è che non ha un valore ben definito quindi bisogna trovare il valore del C esterno a tentativi, ma tale valore non può essere considerato uno standard nemmeno sullo stesso micro, figuriamoci su un altro chip. Riguardo i primi due schemi: a) qui serve un deviatore con ritorno automatico, forse non di facile reperibilità b) in questo secondo caso si usa un normale pulsante in quanto il ritorno è garantito da un clock automatico; il principio sembra complesso ma non lo è; il multivibratore astabile non è altro che un comune oscillatore a bassissima frequenza, può essere un NE555 o un 74ls121 (o similari); quando premi il pulsante dai il SET e istantaneamente parte anche l'oscillatore che dà l'impulso di RESET solo dopo il tempo da te stabilito (100-200ms), fino a quel momento tutti i rimbalzi del pulsante sono ignorati. E' un po' complesso ma estremamente efficace, tant'è che è più o meno il principio sul quale si basano i moderni integrati di debounce (ne esistono a 1-2-4-6-8 vie) come p.es. quelli della Maxim (MAX6816-7-8 rispettivamente 1-2-8 switch) o l'esa-switch MC14490 della Motorola. Il flip-flop lo puoi realizzare in modo "artigianale" con due comunissime porte NAND (p.es. 74hc00), come nelle figure, personalmente ti consiglio il 74HC74 che è un FF nativo e sicuramente si comporta meglio. Ciò detto però, se devi usarlo con un micro penso che la soluzione del debounce software sia insuperabile, poche righe di software e poi devi solo tarare la tempistica del debounce in base al tipo di pulsante che usi.

la cosa piú semplice é usare un integrato dedicato: il MC14490. Ha 6 circuiti antirinbalzo e serve solo un condensatore.

it.rs-online.com/web/p/eliminatori-di-bounce/0463739/ e datasheet: http://docs-europe.electrocomponents.com/webdocs/05fd/0900766b805fd214.pdf

Ciao Uwe

Eh caro Uwe, che fai, pure tu ti metti a copiare gli interventi degli altri? oppure semplicemente non leggi cosa scriviamo? male in ogni caso.....:D

Ciao Michele,
la soluzione software è la prima che ho provato, dal libro di Margolis

const int Start=10;  //  telecomando e chiave in apertura
const int debounceDelay = 10; //  millisecondi da aspettare fino alla stabilità
volatile int fase;
boolean debounce(int pin)
{
boolean state;
boolean previousState;
previousState = digitalRead(pin); //salva lo StatoStato dell'interruttore
for(int counter= 0; counter < debounceDelay; counter++)
{
  delay(1); // aspetta 1millisecondo
  state = digitalRead(pin); // legge il pin
  if( state != previousState)
  {
    counter = 0; //azzera il contatore quando cambia lo Stato
    previousState = state; // e salva lo stato corrente
  }
 }
  
// qui quando lo stato dell'interruttore è stabile da un intervallo di tempo
// maggiore di quello di debounce
return state;
}
void setup()
{
  pinMode(Start, INPUT);
  fase=0;
    Serial.begin(9600);
  Serial.println("Setup");
  
 }
 
 void loop()
 {
   
 if(debounce(Start))  {   // premuto pulsante Start
   if(fase==0) {
      fase=1;
   }
    else
    {
    fase=4;
    }
   }
 }

Se viene premuto il pulsante e fase = 0 fase diventa 1 e il cancello si apre
se successivamente si preme il pulsante e fase > 0 il cancello si blocca
Invece alla pressione del pulsante passa in fase 1 e poi al ciclo succesivo passa in fase 4

Ho provato la libreria Bounce2

#include <Bounce2.h>
Bounce  bouncer  = Bounce();
const int Start=10;  //  telecomando e chiave in apertura
volatile int fase;
void setup()
{
  pinMode(Start, INPUT);
  fase=0;
  bouncer.attach(Start);
  bouncer.interval(5);
    Serial.begin(9600);
  Serial.println("Setup");
  
 }
 void loop()
 {
  bouncer.update();
  int stato = bouncer.read();
 
   if(stato==HIGH){
     if(fase==0) {
      fase=1;
      }
      else
      {
        fase=4;
      }
   }
 }

Il comportamento del programma è identico al precedente

Vi sono soluzion?
Franco

Franco,
ma il vecchio buon sistema (… che posso assicurare funziona sempre XD ) …

    //check if the button has been pressed
    if (digitalRead(BUTTON_PIN) == LOW) { //button pressed
        delay(40); //wait a while, to avoid bounce noise
        if (digitalRead(BUTTON_PIN) == LOW) { //button is pressed
           //
           // here the button as been pressed ! <<<<<<<<<<<<<<<<<<<<<<
           //
        }
    }

… non ti va bene ???

Tieni il bottone normalmente in HIGH con la pull-up interna e il bottone chiude a massa. :slight_smile:

Guglielmo

[quote author=Michele Menniti link=topic=257185.msg1818717#msg1818717 date=1406362845] Eh caro Uwe, che fai, pure tu ti metti a copiare gli interventi degli altri? oppure semplicemente non leggi cosa scriviamo? male in ogni caso.....:D [/quote]

Ups hai ragione; non l' avevo letto bene.

Ciao Uwe