Arduino - Botón

El botón es un componente básico y ampliamente utilizado en muchos proyectos de Arduino. No es tan simple como parece (debido a sus características mecánicas y físicas). Los principiantes pueden tener muchos problemas con él. Este tutorial facilita las cosas para los principiantes. ¡Empecemos!

※ Nota:

Antes de hablar sobre el botón, nos gustaría señalar que hay dos errores comunes que los principiantes suelen encontrar:

  1. El problema de la entrada flotante:
    • Síntoma: Al conectar un botón al pin de entrada de Arduino, el estado del pin de entrada es aleatorio y no coincide con el estado de pulsación del botón.
    • Causa: Al pin del botón NO se utiliza una resistencia pull-down o una resistencia pull-up.
    • Solución: ⇒ Utilice una resistencia pull-down o una resistencia pull-up en el pin de entrada. El detalle se describirá más adelante en este tutorial.
  • El fenómeno de rebote
    • Síntoma: El código en Arduino lee el estado del botón e identifica el evento de pulsación detectando el cambio de estado (HIGH a LOW, o LOW a HIGH). Cuando el botón se pulsa realmente solo una vez, el código de Arduino detecta múltiples pulsaciones en lugar de una.
    • Causa: Debido a las características mecánicas y físicas, cuando haces una única pulsación de un botón, el estado del pin de entrada cambia rápidamente entre LOW y HIGH varias veces en lugar de una pulsación.
    • Solución: ⇒ Antirrebote. El detalle se describirá en Arduino - Botón - Debounce tutorial.

    El fenómeno de rebote provoca malfuncionamiento solo en ciertos tipos de aplicaciones que necesitan detectar exactamente el número de pulsaciones. En algunas aplicaciones, es inofensivo.

    Acerca del Botón

    El pulsador, también conocido como pushbutton, botón táctil o interruptor momentáneo, es un tipo de interruptor que se cierra cuando se presiona y se mantiene presionado, y se abre cuando se suelta. Existen varios tipos de pulsadores, clasificados en dos grandes grupos:

    • PCB-mount push buttons (breadboard-mountable)
    • Panel-mount push buttons
    Botón pulsador de Arduino

    Diagrama de pines

    Los botones para montaje en PCB suelen tener cuatro pines.

    Pinout de botones

    Sin embargo, estos pines están conectados internamente en pares. Por lo tanto, solo necesitamos usar dos de los cuatro pines, que no están conectados entre sí internamente.

    Hay cuatro formas (en realidad dos debido a la simetría) de conectar al botón (ver imagen).

    Cómo usar el botón

    Podemos usar solo dos pines de un botón; ¿Por qué tiene cuatro pines?

    ⇒ Para que se sostenga firmemente en la placa de circuito impreso (PCB) para resistir la fuerza de presión.

    Los botones de montaje en panel suelen tener dos pines.

    Pinout de pulsador de dos pines
    image source: diyables.io

    El módulo de pulsador incluye una resistencia pull-down integrada, que garantiza que la salida permanezca en nivel bajo cuando el botón no está presionado. Tiene tres pines:

    • GND: Conecte este pin a la masa.
    • VCC: Conecte este pin a una fuente de alimentación de 5 V o 3.3 V.
    • OUT: Conecte este pin a una entrada digital en su Arduino.

    Con esta configuración, el módulo genera una señal baja cuando el botón no está presionado y una señal alta cuando el botón está presionado.

    Cómo funciona

    • Cuando el botón no está presionado, el pin A no está conectado al pin B
    • Cuando se presiona el botón, el pin A está conectado al pin B
    Cómo funciona el botón

    Arduino - Botón

    El pin de un botón está conectado a VCC o GND. El otro pin está conectado a un pin de Arduino.

    Al leer el estado del pin de Arduino (configurado como pin de entrada), podemos detectar si el botón está presionado o no.

    Estado del botón y estado de pulsación

    La relación entre el estado del botón y el estado de la pulsación depende de cómo conectamos el botón a Arduino y de la configuración del pin de Arduino.

    Hay dos formas de usar un botón con Arduino:

    1. Un pin de un botón está conectado a VCC, el otro está conectado al pin de un Arduino con una resistencia de pull-down
      • Si se presiona el botón, el estado del pin del Arduino es ALTO. Si no, el estado del pin del Arduino es BAJO
      • Debemos usar una resistencia externa.
  • Un pin de un botón está conectado a GND, el otro está conectado al pin de un Arduino con una resistencia de pull-up
    • Si se presiona el botón, el estado del pin del Arduino es BAJO. Si no, el estado del pin del Arduino es ALTO
    • Podemos usar una resistencia interna o externa. La resistencia interna está integrada en el Arduino; solo necesitamos configurarla mediante código de Arduino.

    ※ Nota:

    Si NO usamos ni una resistencia pull-down ni pull-up, el estado del pin de entrada es “flotante” cuando el botón NO está presionado. Esto significa que el estado puede ser HIGH o LOW (inestable, no fijado), lo que resulta en una detección incorrecta.

    • La peor práctica: inicializa el pin del Arduino como entrada (usando pinMode(BUTTON_PIN, INPUT)) y NO usa ninguna resistencia externa pull-down/pull-up.
    • La mejor práctica: inicializa el pin del Arduino como entrada con pull-up interna (usando pinMode(BUTTON_PIN, INPUT_PULLUP)). No es necesario usar ninguna resistencia externa pull-down/pull-up.

    Para facilitar a los principiantes, este tutorial utiliza el método más sencillo: inicializa el pin de Arduino como una entrada con pull-up interna sin utilizar la resistencia externa. Los principiantes NO necesitan preocuparse por cómo conectar la resistencia de pull-up o pull-down. Los principiantes solo necesitan usar el código de Arduino.

    Diagrama de Cableado

    • Diagrama de cableado entre Arduino y un botón montado en la placa de circuito impreso
    Diagrama de cableado del botón de Arduino

    This image is created using Fritzing. Click to enlarge image

    • Diagrama de cableado entre Arduino y el botón montado en el panel
    Diagrama de cableado de un pulsador de dos pines para Arduino

    This image is created using Fritzing. Click to enlarge image

    Diagrama de cableado de Arduino para un botón de dos pines

    Cómo programar para un botón

    • Inicializa el pin de Arduino como una entrada con pull-up interno utilizando la función pinMode(). Por ejemplo, el pin 7:
    pinMode(7, INPUT_PULLUP);
    • Lee el estado del pin de Arduino utilizando la función digitalRead().
    int buttonState = digitalRead(BUTTON_PIN);

    ※ Nota:

    Hay dos casos de uso muy utilizados:

    • El primero: Si el estado de la entrada es alto, haz algo. Si el estado de la entrada es bajo, haz otra cosa en sentido contrario.
    • El segundo: Si el estado de la entrada cambia de bajo a alto (o de alto a bajo), haz algo.

    Dependiendo de la aplicación, elegimos uno de ellos. Por ejemplo, en el caso de usar un botón para controlar un LED:

    • Si queremos que el LED esté encendido cuando se presione el botón y apagado cuando el botón no esté presionado, debemos usar el primer caso de uso.
    • Si queremos que el LED alterne entre encendido y apagado cada vez que se presione el botón, debemos usar el segundo caso de uso.

    Cómo detectar el cambio de estado de bajo a alto

    // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = HIGH; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == LOW && currentState == HIGH) Serial.println("The state changed from LOW to HIGH"); // save the last state lastState = currentState; }

    Código de Arduino

    Pasos R\u00e1pidos

    • Conecta Arduino a la PC mediante un cable USB
    • Abre el IDE de Arduino, selecciona la placa y el puerto correctos
    • Copia el código a continuación y ábrelo con Arduino IDE
    // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: int buttonState = digitalRead(BUTTON_PIN); // print out the button's state Serial.println(buttonState); }
    • Haz clic en el botón Subir en el IDE de Arduino para cargar el código en Arduino
    Arduino IDE - Cómo Subir Código
    • Abrir Monitor Serial
    • Presiona y suelta el botón varias veces
    • Ver el resultado en Monitor Serial:
    COM6
    Send
    1 1 1 0 0 0 0 0 0 1 1 1
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    1 es ALTO, 0 es BAJO.

    Explicación del código

    Puede encontrar la explicación en la línea de comentarios del código Arduino anterior.

    Modificando el código de Arduino

    Modifiquemos el código para detectar los eventos de pulsación y liberación.

    Pasos R\u00e1pidos

    • Modifica el código como se indica a continuación
    /* * Este código de Arduino fue desarrollado por es.newbiely.com * Este código de Arduino se proporciona al público sin ninguna restricción. * Para tutoriales completos y diagramas de cableado, visite: * https://es.newbiely.com/tutorials/arduino/arduino-button */ // constants won't change. They're used here to set pin numbers: const int BUTTON_PIN = 7; // the number of the pushbutton pin // Variables will change: int lastState = LOW; // the previous state from the input pin int currentState; // the current reading from the input pin void setup() { // initialize serial communication at 9600 bits per second: Serial.begin(9600); // initialize the pushbutton pin as an pull-up input // the pull-up input pin will be HIGH when the switch is open and LOW when the switch is closed. pinMode(BUTTON_PIN, INPUT_PULLUP); } void loop() { // read the state of the switch/button: currentState = digitalRead(BUTTON_PIN); if(lastState == HIGH && currentState == LOW) Serial.println("The button is pressed"); else if(lastState == LOW && currentState == HIGH) Serial.println("The button is released"); // save the the last state lastState = currentState; }
    • Haz clic en el botón Subir en el IDE de Arduino para subir el código al Arduino
    Subir código al IDE de Arduino
    • Abre el Monitor Serial
    • Presiona el botón y luego suéltalo
    • Mira el resultado en el Monitor Serial
    COM6
    Send
    The button is pressed The button is released
    Autoscroll Show timestamp
    Clear output
    9600 baud  
    Newline  

    ※ Nota:

    • Aunque hayas presionado y soltado el botón solo una vez, la salida en el Monitor Serial puede mostrar varios eventos de presión y liberación. Este es el comportamiento normal del botón. Este comportamiento se llama el “fenómeno de rebote”. Puedes aprender más en Arduino - Tutorial de debounce del botón.
    • Para hacerlo mucho más fácil para los principiantes, especialmente cuando se usan múltiples botones, creamos una biblioteca llamada ezButton. Puedes informarte sobre la biblioteca ezButton aquí.
    • Usa pinMode(BUTTON_PIN, INPUT) para el módulo de botón. Emite LOW cuando no está presionado y HIGH cuando está presionado.

    Video Tutorial

    Estamos considerando crear tutoriales en video. Si considera que los tutoriales en video son importantes, suscríbase a nuestro canal de YouTube para motivarnos a crear los videos.

    Desafíate a ti mismo

    • Enciende el LED cuando se presione el botón y apaga el LED cuando el botón no esté presionado.
    • Alterna el LED entre ENCENDIDO y APAGADO cada vez que se presione el botón.

    Conocimientos Adicionales

    ¿Cuándo deberíamos usar una resistencia pull-down o pull-up para un pin de entrada y cuándo no deberíamos usarla?

    • Si el sensor tiene estados cerrados (conectados a VCC o GND) o abiertos (NO conectados a nada), necesitas una resistencia de pull-up o pull-down para hacer que estos estados se conviertan en dos estados: BAJO y ALTO. Por ejemplo, pulsador, interruptor, interruptor de contacto magnético (sensor de puerta)...
    • Si el sensor tiene dos niveles de voltaje definidos (BAJO y ALTO), no necesitas una resistencia de pull-up o pull-down. Por ejemplo, sensor de movimiento, sensor táctil ...

    ※ NUESTROS MENSAJES

    • No dude en compartir el enlace de este tutorial. Sin embargo, por favor no use nuestro contenido en otros sitios web. Hemos invertido mucho esfuerzo y tiempo en crear el contenido, ¡por favor respete nuestro trabajo!