Diferencia entre revisiones de «Rebote»

De ArduWiki
Saltar a: navegación, buscar
(Solucion 4)
(Solución 5)
Línea 113: Línea 113:
 
   rebote.update();                  //Actualizar instancia de clase
 
   rebote.update();                  //Actualizar instancia de clase
 
   digitalWrite(LED, rebote.read());  //Obtener pulso
 
   digitalWrite(LED, rebote.read());  //Obtener pulso
 +
}
 +
</syntaxhighlight>
 +
 +
== Solución 6 ==
 +
Eliminación del rebote mediante [http://playground.arduino.cc/code/debounce libreria Debounce]
 +
 +
<syntaxhighlight lang="c++">
 +
#include <Bounce2.h>
 +
 +
#define pulsador 2
 +
#define LED 13
 +
 +
// Instantiate a Bounce object
 +
Bounce rebote = Bounce();
 +
 +
void setup() {
 +
  pinMode(LED, OUTPUT);
 +
  pinMode(pulsador, INPUT_PULLUP);
 +
  rebote.attach(pulsador);
 +
  rebote.interval(5);      //Intervalo en ms
 +
}
 +
 +
void loop() {
 +
  rebote.update();            //Actualiza instancia de clase
 +
  bool value = rebote.read();  //Lee pulsador
 +
 +
  if (value) {
 +
      digitalWrite(LED, LOW);  //Apaga LED
 +
  }else{
 +
      digitalWrite(LED, HIGH);  //Prende LED
 +
  }
 
}
 
}
 
</syntaxhighlight>
 
</syntaxhighlight>

Revisión del 23:41 25 feb 2019

El rebote es un efecto muy comun en los contactos electricos del tipo pulsadores, interruptores, contactos de rele, etc. Debido a problemas fisicos y mecanicos se produce un chisporroteo, que al ser leido por Arduino se convierte en muchos pulsos de un corto periodo, de forma que el pulsar el boton una sola vez puede causar resultados impredesibles.

Solucion 1

La mejor solucion es por hardware poniendo un condensador de 1 uF en paralelo con el pulsador.

Solucion 2

La solución por software mas simple consiste en aplicar un pequeño retardo luego de cada vez que se detecta la transicion del pulsador. Eso elimina el ruido.

const byte boton = 2;    //Pulsador
const byte led = 13;     //LED

void setup() {
   pinMode(boton, INPUT);
   pinMode(led, OUTPUT);
   digitalWrite(led, LOW);
}

void loop() {
   //Lee la entrada
   if (digitalRead(boton)){
      digitalWhite(led, !digitalRead(lead));
      delay(50);   //Retardo que elimina ruido
   }
}

Solucion 3

Quizas los puristas que desean desterrar la funcion delay() prefieran usar esta solucion:

const byte boton = 2;    //Pulsador
const byte led = 13;     //LED
unsigned long tiempo = 0

void setup() {
   pinMode(boton, INPUT);
   pinMode(led, OUTPUT);
   digitalWrite(led, LOW);
}

void loop() {
   //Lee la entrada
   if (digitalRead(boton)){
      if (millis() > tiempo + 50){
         digitalWhite(led, !digitalRead(lead));
         tiempo = millis();
      }
   }
}

Solución 4

El siguiente boceto se basa en la versión de rebote de Limor Fried. En este ejemplo, el pulsador retorna HIGH cuando se presiona y LOW cuando no se presiona.

Cada vez que el pin de entrada pasa de LOW a HIGH (se pulso el botón), el pin de salida cambia de LOW a HIGH y HIGH a LOW varias veces. Para ignorar este ruino se introduce un retraso mínimo entre las conmutaciones.

const byte boton = 2;    //Pulsador
const byte led = 13;     //LED

bool ledState = HIGH;         //El estado actual del pin de salida (LED).
bool buttonState;             //El estado actual del pin de entrada (Pulsador).
bool lastButtonState = LOW;   //El estado anterior del pin de entrada (Pulsador).

unsigned long tiempo = 0;    //Ultima vez que cambio la entrada (pulsador)
unsigned long retardo = 50;  //Tiempo de retardo. Aumentar si salida parpadea

void setup() {
   pinMode(boton, INPUT);
   pinMode(led, OUTPUT);
   digitalWrite(led, ledState);
}

void loop() {
   //Lee la entrada
   bool reading = digitalRead(boton);

   //Comprueba si acaba de pulsar (LOW a HIGH)
   if (reading != lastButtonState) {
      //Reinicia temporizador
      tiempo = millis();
   }

   if ((millis() - tiempo) > retardo) {
      if (reading != buttonState) {
         buttonState = reading;

         //Solo cambia LED si es pulsado 
         if (buttonState) {
            ledState = !ledState;
         }
      }
   }
   digitalWrite(led, ledState);
   lastButtonState = reading;
}

Solución 5

Eliminación del rebote mediante libreria Debounce

#include <Debounce.h>
#define pulsador 5
#define LED 13
Debounce rebote = Debounce(20, pulsador);   //Asigna 20 ms de retardo en pulsador

void setup() {
   pinMode(pulsador, INPUT);
   pinMode(LED, OUTPUT);
}

void loop() {
   rebote.update();                   //Actualizar instancia de clase
   digitalWrite(LED, rebote.read());  //Obtener pulso
}

Solución 6

Eliminación del rebote mediante libreria Debounce

#include <Bounce2.h>

#define pulsador 2
#define LED 13

// Instantiate a Bounce object
Bounce rebote = Bounce(); 

void setup() {
   pinMode(LED, OUTPUT);
   pinMode(pulsador, INPUT_PULLUP);
   rebote.attach(pulsador);
   rebote.interval(5);      //Intervalo en ms
}

void loop() {
   rebote.update();             //Actualiza instancia de clase
   bool value = rebote.read();  //Lee pulsador

   if (value) {
      digitalWrite(LED, LOW);   //Apaga LED
   }else{
      digitalWrite(LED, HIGH);  //Prende LED
   }
}

Vea también

Referencias