Cómo conectar un Push Button a Raspberry Pi

En este pequeño tutorial veremos cómo conectar un push button o botón pulsador a una tarjeta Raspberry Pi, también encontrarás códigos de programación para tus primeras pruebas.

Un push button es un componente eléctrico compuesto, en su mayoría, por 2 terminales o pines, estas terminales pueden estar o no en contacto eléctrico dependiendo de si el botón esta siendo presionado o no, en este sentido los push button pueden clasificarse en:

  • Normalmente abierto: Sus terminales no están en contacto eléctrico cuando el botón no es presionado y entran en contacto eléctrico cuando el botón es presionado.
  • Normalmente cerrado: Sus terminales están en contacto eléctrico cuando el botón no es presionado y dejan de tener contacto eléctrico cuando el botón es presionado.

En este ejemplo utilizaremos un push button normalmente abierto.

Para conectar un push button a una tarjeta de desarrollo es necesario una resistencia auxiliar para conseguir un arreglo en pull-up o pull-down. En este caso utilizaremos la resistencia en un arreglo de pull-up, es decir, uno de los pines del botón estará conectado a tierra y el segundo pin que será el pin de la señal tendrá conectado el pin de una resistencia de 10 kohms mientras que el segundo pin de dicha resistencia estará conectado a 3.3V. De esta manera cuando el botón no este siendo presionado el pin de la señal tendrá un valor de 3.3V y cuando esté siendo presionado tendrá un valor de 0V.

Un push button es un sensor digital de entrada, es decir, su funcionamiento consiste en entregar la información correspondiente si es presionado o no a través del voltaje en su pin de señal, la tarjeta Raspberry Pi a su vez recibe la señal y la lee con uno de sus pines digitales de entrada.

Componentes necesarios

  • Push button
  • Protoboard chica
  • LED 5mm
  • Resistor de 330 ohms
  • Resistor de 10 kohms
  • Raspberry Pi
  • Cables de conexiones M-M

Diagrama de conexiones

Arduino Uno – LED – Push button con resistencia de pull-up

Código de Python3 – Lectura digital

Copiamos el siguiente código a un script de Python y lo ejecutamos con Python3. Oprimimos el botón para observar como el LED se enciende/apaga al mismo tiempo que observamos el mensaje correspondiente en la terminal.


import RPi.GPIO as GPIO #Importamos el paquete RPi.GPIO y en el código nos refiriremos a el como GPIO
import time #Importamos el paquete time

pin_led = 17  #Variable que contiene el pin(GPIO.BCM) al cual conectamos la señal del LED
pin_btn = 10  #Variable que contiene el pin(GPIO.BCM) al cual conectamos la señal del botón

GPIO.setmode( GPIO.BCM )        #Establecemos el modo según el cual nos refiriremos a los GPIO de nuestra RPi
GPIO.setup( pin_btn , GPIO.IN , pull_up_down=GPIO.PUD_UP ) #Configuramos el pin del botón como Entrada y habilitamos una resistencia de pull_up interna, por lo que podríamos presindir de la resistencia de pull_up física ennuestro circuito
GPIO.setup( pin_led , GPIO.OUT) #Configuramos el pin del led como una salida
estado_led = False              #Variable que guardará el estado del led

#Contenemos el código principal en un aestructura try para limpiar los GPIO al terminar o presentarse un error
try:
    while 1: #Implementamos un loop infinito
        if GPIO.input( pin_btn ) == GPIO.LOW:   #Si la lectura al pin del botón resulta 0/GPIO.LOW ejecutamos el código del if
            estado_led = not estado_led         #Invertimos el estado actual del led
            GPIO.output( pin_led , estado_led ) #Escribimos el estado del led en el pin del led
            print("Boton presionado")           #Hacemos una impresión en consola 
            print("Estado " + str(estado_led) + "\n")
            time.sleep(0.3)                     #Nos mantenemos en esta línea por 0.3 segundos para dar tiempo a que el botón se libere y el estado del led no cambie varias veces en un solo botonazo  

except KeyboardInterrupt:
    # CTRL+C
    print("\nInterrupcion por teclado")
except:
    print("Otra interrupcion")
finally:
    GPIO.cleanup()
    print("GPIO.cleanup() ejecutado")

Código de Python3 – Interrupción externa

Copiamos el siguiente código a un script de Python y lo ejecutamos con Python3. Oprimimos el botón para observar como el LED se enciende/apaga al mismo tiempo que observamos el mensaje correspondiente en la terminal.



import RPi.GPIO as GPIO  #Importamos el paquete RPi.GPIO y en el código nos refiriremos a el como GPIO
import time              #Importamos el paquete time



pin_led = 17  #Variable que contiene el pin(GPIO.BCM) al cual conectamos la señal del LED
pin_btn = 10  #Variable que contiene el pin(GPIO.BCM) al cual conectamos la señal del botón
estado_led = False              #Variable que guardará el estado del led

#Creamos la función que se ejecutará cuando se presente lainterrupciónexterna
def button_callback(channel):
    global estado_led                         #declaramos la variable global que modificaremos dentro de la función
    estado_led = not estado_led               #Invertimos el estado actual del led
    GPIO.output( pin_led , estado_led )       #Escribimos el estado del led en el pin del led 
    print("Boton presionado")                 #Hacemos una impresión en consola 
    print("Estado " + str(estado_led) + "\n")

GPIO.setmode( GPIO.BCM )                                   #Establecemos el modo según el cual nos refiriremos a los GPIO de nuestra RPi            
GPIO.setup( pin_btn , GPIO.IN , pull_up_down=GPIO.PUD_UP ) #Configuramos el pin del botón como Entrada y habilitamos una resistencia de pull_up interna, por lo que podríamos presindir de la resistencia de pull_up física ennuestro circuito
GPIO.add_event_detect( pin_btn , GPIO.FALLING, callback=button_callback, bouncetime = 300) #Agregamos una interrupción externa de tipo Falling en el pin del botón
GPIO.setup( pin_led , GPIO.OUT)                            #Configuramos el pin del led como una salida

 
#Contenemos el código principal en un aestructura try para limpiar los GPIO al terminar o presentarse un error
try:
    while 1:   #Implementamos un loop infinito
        time.sleep(1)   #Toda la funcionalidad se realiza en el código de la función que atiende la interrupción
except KeyboardInterrupt:
    # CTRL+C
    print("\nInterrupcion por teclado")
except:
    print("Otra interrupcion")
finally:
    GPIO.cleanup()
    print("GPIO.cleanup() ejecutado")


    

¡Sigue explorando!