Con una Raspberry se pueden hacer infinidad de cosas, pero lo malo quizás es que no se pueden plantear un objetivo definido si tampoco sabemos las posibilidades que ofrece. Vamos a controlar los Raspberry GPIO de nuestra placa para poder extender nuestros proyectos.

Si ya sabemos crear algún proyecto con Arduino con circuitos sencillos como puede ser encender y apagar un LED y programar distintas formas de control, basados en GPIOs, no nos resultará complicado comprender cómo funciona con una Raspberry; lo único que hasta que no nos pongamos a ello, no sabremos ni por dónde empezar.

Los GPIOs es el diminutivo de General Purpuse Input Output, que se traduce en Entradas y salidas de propósito general. Aunque parezca un nombre un poco raro, la diferencia reside en cómo la placa puede comunicarse con un dispositivo externo a traves de estos pines.

La Raspberry normal dispone de 27 GPIOs, mientras que la nueva Raspberry Pi 2 dispone de 40 GPIOs. Todos estos pines pueden ser dedicados o utilizarse de varias maneras, tal y como aparecen en las siguiente imágenes.

GPIO_Pi1GPIO_Pi2


Como se pueden ver, los pines rojos son los pines de voltaje, los negros son las tierras y el resto son GPIOs de los cuales, algunos sirven para otros propósitos como son la comunicación por I2C, SPI o UART. Estos pines son los que aparecen como:

  • MOSI
  • MISO
  • SCLK
  • CE
  • RX
  • TX
  • SDA
  • SCL
  • GCLK

Aunque parezcan estar reservados si no se les dice lo contrario, se pueden seguir utilizando estos pines como GPIOs normales.

La Raspberry con cualquiera de sus sistemas Debian pueden manejar estos GPIOs programándolos con Python. Para ello se hace uso de una librería que viene integrada llamada GPIO y que nos ofrece las siguientes posibilidades, así como disponíamos de unas funciones definidas en Arduino.

GPIO Library

import Rpi.GPIO as GPIO → Con esta linea se importa la libreria para controlar los GPIOs y se le asocia una forma más corta para referirse a ella. A partir de este momento si quisieramos ejecutar una función deberemos escribir GPIO.____ y la función que requiramos.

La placa tiene dos numeraciones para referirse a sus pines

  • GPIO.BOARD → Numeración que aparece en la imagen por orden PIN#. Cuidado que entre ellos se cuentan los voltajes y tierras y estos no se pueden definir como Inputs y Outputs
  • GPIO.BCM → la segunda forma es con la referencia del SoC System On Chip, que son los que aparecen desordenados y solo se cuentan los GPIOs integramente. Pueden cambiar con diferentes versiones de la raspberry

Para establecer el modo con el que se va a referir a estos pines se utiliza la función de la librería setmode(GPIO.BOARD | GPIO.BCM)

GPIO.setmode(GPIO.BOARD)

Para definir uno de los pines como entrada o salida se utiliza la función setup() que es muy parecida a la función pinMode de Arduino.

GPIO.setup(13,GPIO.OUT)

GPIO.setup(13,GPIO.IN)

Una vez definido el comportamiento de un pin concreto, es hora de establecerlo con un estado de alto voltaje o a cero mediante la función output(pin, True|False);

GPIO.output(13,True) → Escribe alto o bajo en el pin

En caso de leer un valor de una entrada como puede ser un botón u otro elemento se utiliza la función input()

value = GPIO.input(13) → Lee alto o bajo del pin.

IMPORTANTE: Solo puede leer digitalmente, no existe un analog equivalente como en Arduino. No existe un conversor analógico – digital para la Raspberry.

Una vez conocidos estos comandos básicos, vamos a realizar unos ejercicios para programar el comportamiento del circuito con Python.

Para ello utilizaremos:

  • Un LED
  • Una resistencia de 220 ohmnios
  • Un interruptor, en mi caso he escogido un sensor digital TTP223B, que viene a ser lo mismo.

TTP223B

Para empezar el siguiente código es un Blink o parpadeo que enciende y apaga el LED alternativamente.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

GPIO.setup(3,GPIO.OUT)

while True:
    GPIO.output(3,True)
    time.sleep(1)
    GPIO.output(3,False)
    time.sleep(1)

Como se puede ver, se importa también la librería time, para establecer los tiempos que realizan el delay.

Una vez que tengamos escrito y guardado el código, lo único que deberemos hacer es dirigirnos al directorio desde el terminal donde está contenido el fichero y ejecutar.

sudo python ejercicioLED.py

En el siguiente ejercicio utilizamos el botón para encender el LED cuando éste es presionado y apagarse cuando deja de pulsarse.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)

GPIO.setup(3,GPIO.OUT)
GPIO.setup(5,GPIO.IN)
"""
RuntimeWarning: A physical pull up resistor is fitted on this channel!
"""
while True:
    button = GPIO.input(5)
    if button:
        GPIO.output(3,True)
    else:
        GPIO.output(3,False)
    

En el momento de ejecutar este código saltará un aviso sobre la resistencia pull-up como advertencia de esta conexión a la placa. No hay por qué preocuparse, funciona perfectamente sin peligro a morir.

Por último, éste ejercicio es una mezcla de los dos anteriores y que parpadea cuando se deja de pulsar el botón y se mantiene encendido cuando se presiona.

import RPi.GPIO as GPIO
import time

GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)

GPIO.setup(3,GPIO.OUT)
GPIO.setup(5,GPIO.IN)
"""
RuntimeWarning: A physical pull up resistor is fitted on this channel!
"""
while True:
    button = GPIO.input(5)
    if button:
        GPIO.output(3,True)
    else:
        GPIO.output(3,True)
        time.sleep(0.5)
        GPIO.output(3,False)
        time.sleep(0.5)
    

En el siguiente video se puede ver de forma demostrativa el comportamiento de este último ejercicio y como está montado el circuito.