Tutorial de Arduino en Español – Parte 4 – Manejo de INPUT digital con anti-rebote

En este capítulo vamos a controlar un LED con un Botón. Para ello vamos a necesitar simplemente una placa Arduino, en mi caso usaré una Arduino Mega 2560 Rev3 pero podéis usar la que queráis, un LED del color que queráis, en mi caso un led Azul de alto brillo, un botón (o pulsador) y una resistencia de 10K Ohms.

Esquema de conexionado

Como podemos ver en el esquema de conexionado, tenemos 2 elementos independientes, el botón o pulsador, que puede tener 4 patillas o 2, es lo mismo ya que en el caso de las 4 patillas cada lado va unido como se puede apreciar en forma de línea de color verde en la imagen del esquema. En el lado derecho tenemos el cable verde que va al Arduino y el cable negro que va a negativo. En el lado izquierdo tenemos el cable rojo que es +5V.

Cuando pulsamos, ambos lados se conecta de tal manera que TODAS las patillas del botón están conectadas entre si. El divisor de tensión hace que los +5V se repartan entre el negativo y el Arduino, pero como el valor de éste es menor a la resistencia de 10K Ohms en el negativo, el Arduino recibirá la mayor parte de la tensión. Gracias a este efecto seremos capaces de leer una señal HIGH sabiendo que el botón se ha pulsado.

Sketch – Manejo de INPUT digital con anti-rebote

int led = 4; //Declaramos el pin del LED
int boton = 5; //Declaramos el pin del BOTON
int estado = LOW; //Declaramos el estado del boton en LOW
int salida = 0; //Almacenamos el estado de la salida del LED
int estadoAnterior = LOW; //Almacenamos el estado del boton anteriormente
void setup() {
  // put your setup code here, to run once:
  pinMode(led, OUTPUT);
  pinMode(boton, OUTPUT);
}

void loop() {
  // put your main code here, to run repeatedly:

  estado = digitalRead(boton);

  if((estado == HIGH) && (estadoAnterior == LOW))
  {
    salida = 1 - salida;
    delay(20); //Anti-rebote
  }

  estadoAnterior = estado;

  if(salida == 1)
  {
    digitalWrite(led, HIGH);
  }
  else
    digitalWrite(led, LOW);
}

El funcionamiento es simple, como hemos comentado en el párrafo anterior, cuando pulsamos el botón se unen todos los pines y tenemos una señal HIGH en el pin de Arduino, en mi caso el pin 5. Pero hay un problema propio de los botones, son mecanismo mecánicos que consiste en 2 chapas de metal que al pulsar, las presionamos y se tocan dando continuidad en sus pines, pero la pulsación hace que, durante un breve periodo de tiempo, estas vibren, haciendo que tengamos señal HIGH/LOW cambiante, por eso necesitamos meter un mecanismo llamado “Anti-Rebote” que, en este caso, consiste en parar el Arduino con un delay de 20 milésimas de segundo cuando detectamos un HIGH para dar tiempo a que este mecanismo se estabilice y, la siguiente lectura sea fiable. Y ya con un if comprobamos si salida es 1 y mandamos HIGH al led para que se encienda.

La variable salida cambia solo cuanto el botón se acaba de presionar, si el botón es HIGH pero en el loop anterior era HIGH es por que estamos manteniéndolo pulsado. Esto es gracias a if((estado == HIGH) && (estadoAnterior == LOW)), por eso necesitamos guardar siempre el estado del botón del loop anterior para poder comparar

Ejemplo Controlar un LED con un Potenciómetro: https://www.mediafire.com/file/ofm7yw9ni7io4ba/Electrimatica_Arduino_04.zip/file

Deja un comentario