Vuelve la electrónica: recibir información a través del GPIO de la Raspberry Pi

Ha llegado el momento de retomar la electrónica en PItando: hoy vamos a ver cómo se pueden usar pulsadores para introducir información en la Raspberry Pi, a través de los terminales GPIO.

Para eso, en este artículo he ampliado el prototipo que nos viene acompañando en los últimos artículos de electrónica para demostrar conceptos, de la siguiente forma:

Prototipo con pulsador. <strong>Pincha en la imagen</strong> para ampliarla. Pincha, por favor. En serio: pincha.
Prototipo con pulsador. Pincha en la imagen para ampliarla. Pincha, por favor. En serio: pincha.

Como ves, he movido el prototipo conocido a la parte derecha de la placa, y en la izquierda he montado el pulsador. Necesitarás:

  • Una Raspberry Pi
  • Un kit de prototipado (placa de expansión, placa de prototipado o breadboard y el cable de conexión plano)
  • Un diodo emisor de luz, o LED
  • Una resistencia de 330 Ω y otra de 10 kΩ
  • Tres cables de prototipado, cortos
  • Un pulsador

Si tienes un kit como el que uso en PItando, lo tendrás todo.

A continuación viene un vídeo en el que explicaré el montaje y lo podremos ver en acción, tanto mediante Python como mediante ScratchGPIO. En el resto del artículo está toda la información de interés y, como casi siempre, ejercicios al final 🙂

GPIO como entrada

Los terminales (o pines) GPIO se pueden configurar como entrada, de ahí la I en GPIO: input. Cuando se configura un pin GPIO como entrada, la Raspberry Pi será capaz de distinguir dos niveles de tensión en dicho puerto: 3,3 V ó 0 V. Así pues, si queremos actuar sobre el microprocesador podemos escoger entre dos opciones:

  • Que lo significativo sea que en el pin se ponga el nivel de tensión alto (3,3 V)
  • Que lo significativo sea que en el pin se ponga el nivel bajo (0V)

Una par de cosas muy importantes: los terminales GPIO usan los voltajes de referencia de la Raspberry Pi como señales de entrada, es decir: 3,3 V y 0 V. Usar un nivel de 5 V a la entrada GPIO de la Raspberry Pi estropearía el microprocesador.

El prototipo

En el montaje de hoy quiero hacer que la Raspberry Pi detecte una señal externa, de tal forma que cuando apriete el pulsador, un pin GPIO se ponga a 0 V. Por lo tanto, en reposo, el puerto debe estar a 3,3 V. Esto lo conseguiré conectando el puerto GPIO que escogeré a la línea de alimentación de 3,3 V de la placa de protipado, pero no directamente, sino a través de una resistencia de 10 kΩ.

Si observáis el pulsador veréis que tiene cuatro patas, dos en una cara y otras dos en otra cara opuesta. Las patas de cada una de las caras son las que se conectan entre sí al pulsar el botón, y las patas opuestas de cara una de las caras están conectadas permanentemente.

Colocaré el pulsador conectado directamente entre el terminal GPIO de entrada y la línea de tierra de la placa de prototipado, de tal forma que cuando pulse el botón, habrá una conexión directa entre la línea de 0 V y el pin GPIO. En reposo (sin pulsarlo) y no habiendo conexión a 0 V, el pin estará a 3,3 V. Como discutía antes, para que funcione debo usar una pareja de patas ubicadas en una misma cara, que son las que hacen la función de pulsador.

Esquema del montaje con el pulsador. La fuente de alimentación de 3,3 V representa la línea de alimentación de la placa de prototipado.
Esquema del montaje con el pulsador. La flecha con valor de tensión de 3,3 V representa la línea de alimentación de la placa de prototipado.

En el otro lado de la placa voy a repetir el montaje que sirve para encender un LED a través de otro pin GPIO configurado como salida. Es el mismo prototipo que venimos usando en otros artículos, pero en el otro lado de la placa.

Lo que viene a continuación son los programas de control que, ante pulsaciones en el botón, enciendan durante un tiempo un LED.

Programas de control

Los vimos por partida doble y en acción en la segunda parte del vídeo; en esta sección resumo los detalles del código.

Python

Aquí tenéis el código en Python, en el que aprovecho para aplicar parte del artículo de manejo de excepciones y control de errores.

#!/usr/bin/python3

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setwarnings(False)
GPIO.setup(12, GPIO.OUT)
GPIO.setup(6, GPIO.IN)

try:
    while True:
        if (not GPIO.input(6)):
            print ("LED encendido")
            GPIO.output(12,GPIO.HIGH)
            time.sleep(1)
            print ("LED apagado")
            GPIO.output(12, GPIO.LOW)
finally:
    GPIO.output(12, GPIO.LOW) # por seguridad
    print ("Haciendo limpieza")
    GPIO.cleanup()
    print ("Hasta luego")

Vamos a verlo en detalle:

  • En primer lugar hay que importar las librerías que nos harán falta para programar el comportamiento deseado: RPi.GPIO  bajo el alias GPIO, y time .
  • Se configura la numeración de la placa en modo BCM (Broadcom).
  • Se elimina la salida por consola de los avisos con GPIO.setwarnings(False)
  • Configuro el pin GPIO 12 como salida, y el GPIO 6 como entrada. Este punto es crucial, no nos podemos confundir ya que si usásemos el terminal del pulsador como salida en lugar de como entrada, podríamos dañar el microprocesador si éste sacase un nivel alto de tensión y usásemos el pulsador: en ese caso lo estaríamos poniendo a masa con una intensidad de corriente muy alta.
  • El funcionamiento del programa se lleva a cabo en un bucle infinito que comprueba el valor del pin GPIO 6:
    • GPIO.input(6) devuelve True si el nivel de tensión es alto, cercano a 3,3 V, en el puerto número 6; y False si es bajo, cercano a 0 V.
    • Por lo tanto, la sentencia if (not GPIO.input(6) ) valdrá True cuando accionemos el pulsador, poniendo un valor bajo, cercano a 0 V en la entrada número 6 en numeración BCM.
    • Si esto ocurre, encendemos el LED durante 1 segundo para después apagarlo.
  • El bucle infinito está controlado por un bloque de control de excepciones, cuya intención es capturar la señal de interrupción que el sistema operativo envía cuando pulsamos CTRL + C. En el bloque finally  apagamos el LED (por si estuviera encendido), liberamos los recursos del sistema de control de GPIO y terminamos.

Scratch

Y aquí tenéis el código Scratch.

Programa en Scratch para encender el LED durante 1 segundo usando el pulsador.
Programa en Scratch para encender el LED durante 1 segundo usando el pulsador.

Como veis, los pasos son los mismos, salvo por el hecho de que podemos omitir la configuración de los puertos, que corre a cargo de ScratchGPIO, y además podemos parar el programa con el botón con forma de stop, como os enseñaba en el vídeo.

Lo único malo es que ScratchGPIO no usa la notación BCM para los terminales GPIO, por lo que tendremos que usar la numeración secuencial con ayuda de esta imagen (“la chuleta”):

Conexiones GPIO de la Raspberry Pi 2, modelo B, con esquema BCM. La imagen es de www.raspberrypi-spy.co.uk
Conexiones GPIO de la Raspberry Pi 2, modelo B, con esquema BCM. La imagen es de www.raspberrypi-spy.co.uk

Ejercicios

Tomando como base los programas de este artículo, consigue variar su funcionamiento de tal forma que pulsar el botón cambie su estado. Es decir, una pulsación lo enciende, otra lo apaga; si dejamos el dedo oprimiendo el pulsador, el LED parpadea cambiando de estado cada segundo. Como en este vídeo:

Consideraciones para Python: puedes usar un bucle infinito en Python (while True:), y terminar el programa usando la combinación de teclas CTRL + C (pulsar a la vez las teclas Control y C).

Lo mejor, en cualquier caso, sería que usases un bloque try: ... finally: ... como los que vimos en el artículo de excepciones, para hacer cosas como liberar recursos y apagar el LED antes de finalizar el programa.


Espero que haya sido interesante. Podéis dejarme cualquier comentario en esta misma entrada, o enviándome cualquier comentario a tavés del formulario de contacto y la dirección de correo que allí os indico. Recordad también que PItando está tanto en twitter, como en Facebook, y en Google+ también podéis seguir mis publicaciones, incluyendo las del podcast (iTunesiVooxRSS).

6 comentarios en “Vuelve la electrónica: recibir información a través del GPIO de la Raspberry Pi

    1. Hola, Aitor. La respuesta corta es que no vale, porque si pones una resistencia de 330 Ohm, la corriente que entra por el GPIO cuando el pulsador está “sin pulsar” es demasiado alta y puede dañar el SoC de la Raspberry Pi. La explicación completa de las leyes que sirven para calcular corrientes, este circuito en concreto y los límites que soporta el GPIO están cubiertas en el artículo “Análisis básico de circuitos eléctricos“. Te recomiendo que le dediques una tarde de lectura y práctica para ganar independencia a la hora de diseñar tus propios circuitos.

  1. Hola amigo, estoy trabajando en algo similar, tengo un sensor de presion alimentado a 12V, cuando se activa da como salida un voltaje igual al de entrada, para poder leerlo a una entrada GPIO lo paso a un regulador 78r33 con el cual obtengo una salida de 3.3V. Con esto busco encender un led cada vez que esté en alto la entrada, mi problema radica en que no me esta leyendo el voltaje correctamente, a pesar de que esta en alto a veces me apaga el led o a veces lo enciende. Tendría que hacer tierras comunes entre el regulador y la RPi? o alguna idea?

    1. Siempre es buena idea que el nivel de tierra sea común, pero no tengo a mano nada para reproducir el problema. Me he mudado a Australia dejando todo mi equipo atrás… suerte!

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *