En los primeros ejemplos, conocimos los pines GPIO como salidas que pusimos en ALTO para que se encendiera un LED. Pero GPIO significa Entrada/Salida de Propósito General. Así que también puedes programar los pines como entradas. Entonces se puede determinar si hay tensión en la entrada (HIGH) o no (LOW). La Raspberry Pi sólo tiene entradas digitales (más adelante conoceremos una solución para medir tensiones analógicas), pero la tensión aplicada no tiene que ser exactamente 3,3V para ser reconocida como ALTA y no 0V para ser reconocida como BAJA. Hasta aproximadamente 1,4 V se reconoce como BAJA, todo lo que esté por encima de 1,9 V se reconoce sin duda como ALTA. Sólo el pequeño rango alrededor de ½ de 3,3V y un pin libre sin nada conectado son problemáticos.
Vamos a conocer varios sensores digitales que deben activar una alarma o una acción determinada en nuestro programa (por ejemplo, un detector de movimiento). El más sencillo de estos sensores es el botón, un interruptor con resorte que cierra un circuito cuando se pulsa el botón y lo vuelve a abrir cuando se suelta.
Si conectamos un contacto del botón a un pin GPIO y el otro a 3,3 V, se detecta claramente la señal ALTA cuando se pulsa el botón. El problema comienza después de soltar el botón. ¿Qué estado tiene entonces el GPIO? ¡Uno indefinido! No puedes programar con esto. Por tanto, en el estado desconectado, el GPIO debería estar permanentemente a potencial GND. Sin embargo, esto provocaría un cortocircuito al pulsar el botón. El remedio es una resistencia que debe ser lo suficientemente grande como para que sólo fluya una pequeña corriente. Son habituales las resistencias de 4,7 k (=4700 Ohm) o 10 kΩ (=10.000 Ohm). Estas resistencias se denominan resistencias pull-down.
Sin embargo, también puedes programar el GPIO para que normalmente indique ALTO y reconozca la pulsación de la tecla contra GND como un cambio a BAJO. Entonces la resistencia se llama resistencia pull-up. Y para hacerlo aún más confuso para los principiantes, los GPIO de la Raspberry Pi tienen una resistencia pull-up o pull-down interna que se puede activar o desactivar en el programa. Afortunadamente, esto hace que los circuitos iniciales sean muy sencillos.
El esquema del circuito: Pulsador de la Raspberry Pi
El código del programa: Pulsador en la Raspberry Pi
from gpiozero import LED, Botón
from señal import pausa
led = LED(12)
botón = Botón(16)
botón.al_presionar = led.encendido
botón.al_soltar = led.apagado
pausa()
Desde el módulo gpiozero, se importan las clases LED y botón, separadas por comas, y luego se instancian los objetos led y botón con los respectivos números GPIO.
En lugar de la función dormir()-Del módulo tiempo del módulo pausa del módulo señal sleep() significaría la paralización completa, no se notaría la pulsación de la tecla durante ese tiempo. Sin pause(), el programa terminaría y no pasaría nada.
La instanciación del botón fue muy sencilla porque sólo especificamos el número de GPIO y, por lo demás, utilizamos la configuración por defecto (ver definición de la clase en la línea siguiente). Si quieres desviarte de esto, tienes que introducir más parámetros como argumentos de palabra clave.
class gpiozero.Button(pin, *, pull_up=True, active_state=None, bounce_time=None,
hold_time=1, hold_repeat=False, pin_factory=None)
Puedes encontrar más detalles sobre gpiozero aquí.
Ampliación de la configuración experimental: Se va a iniciar un ciclo de semáforo con una Raspberry Pi cuando se pulse un botón.
El montaje experimental se basa en el primer ejemplo. En lugar de un LED, se utiliza el semáforo LED. Éste lleva incorporadas resistencias en serie. Instanciamos tres objetos LED y definimos una función semáforo, a la que se llama cuando se pulsa un botón.
El código del programa: Ciclo del semáforo en la Raspberry Pi
from gpiozero import LED, Botón
from señal import pausa
from tiempo import dormir
redled = LED(16)
amarilloled = LED(20)
verdeled = LED(21)
botón = Botón(12)
def semáforo():
redled.on()
dormir(1)
amarilloled.on()
dormir(1)
verdeled.encendido()
redled.apagado()
amarilloled.apagado()
dormir(1)
amarilloled.encendido()
greenled.apagado()
dormir(1)
redled.encendido()
amarilloled.apagado()
dormir(1)
redled.apagado()
button.when_pressed = semáforo
pausa()
Extensión: Juego de reacción con dos botones en la Raspberry Pi
Necesitas dos botones, un zumbador y un LED rojo y otro amarillo. Al iniciar el Juego de Reacción, se enciende primero el LED amarillo. Con tiempo = uniforme(5, 10) el LED rojo se enciende después de un tiempo aleatorio entre cinco y diez segundos. A continuación, dos jugadores pueden pulsar cada uno su botón lo más rápido posible. Si pulsan demasiado pronto, les pillarán haciendo trampas y el zumbador sonará durante medio segundo.
El código del programa: Sonda de reacción con dos botones en la Raspberry Pi
/usr/bin/python3
# Juego de Reacción - pulsa el botón, cuando se encienda el LED rojo
# basado en la documentación de gpiozero, Recetas Básicas
# mejorado para reconocer trampas por Bernd Albrecht
# El LED rojo se enciende 5 - 10 seg. después del LED amarillo
from gpiozero import Botón, LED, Zumbador
from tiempo import dormir
from random import uniforme
from sys import salida
led_rojo = LED(16)
led_amarillo = LED(20)
zumbador = Zumbador(12)
jugador_1 = Botón(23)
jugador_2 = Botón(18)
led_amarillo.on()
tiempo = uniforme(5, 10)
sleep(tiempo)
si jugador_1.es_presionado
print("¡El jugador 1 está haciendo trampas!")
zumbador.on()
dormir(0.5)
zumbador.apagado()
led_amarillo.apagado()
salir()
si jugador_2.es_presionado
print("¡El jugador 2 está haciendo trampas!")
zumbador.on()
dormir(0.5)
zumbador.apagado()
led_amarillo.apagado()
salir()
led_rojo.encendido()
led_amarillo.apagado()
mientras sea True
if jugador_1.es_presionado
print("¡El jugador 1 gana!")
rompe
si jugador_2.está_presionado
print("¡Gana el jugador 2!")
interrupción
led_rojo.apagado()