Control de circuitos eléctricos con Raspberry Pi – II : Python

En una entrada anterior hemos visto cómo un programa escrito en Python puede controlar dispositivos conectados a la GPIO de la Raspberry Pi (OUT) como era un  LED, pero que se puede generalizar a otros dispositivos de bajo voltaje como un motor de un juguete o de mayor voltaje mediante un relé. Ahora vamos a ver cómo un dispositivo conectado a la GIO de la Raspberry Pi, como es un pulsador, puede controlar un programa Python (IN).

La entrada es flotante, es decir se detecta una variación relativa del  voltaje de entrada por el conector definido como entrada.

Generación de señal de entrada (Diagrama de eLinux)

En nuestro ejemplo hemos usado como entrada el conector 24 (pin 18) y los +3,3V lo tomamos del pin 1

# led_balancin_2.py 
#
# Cuando se pulsa parpadean las luces hasta que se
# vuelve a pulsar
try:
 import RPi.GPIO as GPIO
 print("GPIO.RPI_INFO = " + str(GPIO.RPI_INFO))
 print("GPIO.VERSION = " + str(GPIO.VERSION))
except RuntimeError:
 print("Error importando RPi.GPIO")
 
try: 
 import time
except RuntimeError:
 print("Error importando RPi.GPIO")
 
# GPIO: Ajuste de los nombres de GPIO: BOARD ó BCM
GPIO.setmode(GPIO.BCM)
# GPIO: Ajuste mensajes de warning a OFF
# (avisos de otros programas trabajando con GPIO)
GPIO.setwarnings(False)

# GPIO: Definicion de canales de IN y OUT
Lista_canales_out = [18,23] 
Lista_canales_in = [24] 
GPIO.setup(Lista_canales_out,GPIO.OUT)
GPIO.setup(Lista_canales_in,GPIO.IN)
GPIO.output(Lista_canales_out,(GPIO.LOW,GPIO.LOW))
pulso = 0 
while pulso < 2:
 if (GPIO.input(24)):
 print("Boton!")
 pulso += 1
 else:
 time.sleep(1)
 if pulso == 1:
 print ("Ni")
 GPIO.output(Lista_canales_out,(GPIO.HIGH,GPIO.LOW))
 time.sleep(1)
 print ("No")
 GPIO.output(Lista_canales_out,(GPIO.LOW,GPIO.HIGH))
 time.sleep(1)
 else:
 time.sleep(1)
GPIO.cleanup()

El siguiente reto, la siguiente entrada, cómo usar un dispositivo con BLE (Bluetooth de baja energia) para controlar un programa Python

Autorun en una Raspberry Pi

En esta entrada vamos a configurar Raspbian para que cuando arranque ejecute directamente un programa sin necesitad de ninguna  intervención manual (teclado, ratón pantalla),  en otras palabras vamos a crear un  autorun. Esta configuración de raspbian es necesaria si usamos Raspberry Pi para controlar remotamente un vehículo o robot, un sistema domótico, etc.

Lo primero que debemos comprobar es que el programa se ejecuta correctamente desde el terminal del sistema:

  • Hacer una copia de seguridad de su tarjeta SD
  • Comprobar los permisos del fichero. En LINUX, los permisos se clasifican en tres bloques que muestra con la siguiente secuencia: los del usuario propietario, los de los usuarios de su grupo y los del resto de usaurios. Cada uno de ellos puede: -No tener permiso, R-lectura, W-escritura y X-ejecución.
pi@raspberrypi:~ $ ls -l /home/pi/proyectos/Python/led_balancin.py
-rw-r--r-- 1 pi pi 1041 ene 27 15:49 /home/pi/proyectos/Python/led_balancin.py
  • Dar permisos de ejecución. Así no necesitaremos que lo ejecute el superusuario sudo o el creador del mismo.
pi@raspberrypi:~ $ sudo chmod +x /home/pi/proyectos/Python/led_balancin.py
pi@raspberrypi:~ $ ls -l /home/pi/proyectos/Python/led_balancin.py
-rwxr-xr-x 1 pi pi 1041 ene 27 15:49 /home/pi/proyectos/Python/led_balancin.py
  • Ejecutar el programa por terminal
pi@raspberrypi:~ $ python3 /home/pi/proyectos/Python/led_balancin.py
  • Hacer una copia de seguridad del archivo que vamos a modificar /etc/rc.local 
pi@raspberrypi:/etc $ sudo cp rc.local rc.bak
  • Modificar el archivo añadiendo el comando a ejecutar con & para que no influya en el arranque normal en caso de ser un bucle infinito y posibilitar el acceso a la Raspberry Pi. Puede comprobar el contenido con el comando cat rc.local
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.

python3 /home/pi/proyectos/Python/led_balancin.py &

exit 0
  • Cruzar los dedos y  rearrancar la Raspberry pi

Raspberry PI 3 model B y Raspbian: evaluando los lenguajes

Es un buen momento para recapitular el estado en el que nos encontramos.

El sistema con el que contamos lo componen:

  • La Raspberry Pi  cuyo modelo podemos comprobar con el comando de terminal cat /proc/cpuinfo y después buscar el modelo concreto en  esta lista de modelos y fabricantes. (Por ejemplo Hardware : BCM2835 corresponde a la  Pi 3 Model B 1GB a02082 Sony, UK).
  • El Sistema Operativo Raspbian iy para saber la versión con la que contamos podemos usar el comando de terminal uname -a  (Por ejemplo Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l GNU/Linux) o el comando cat /etc/os-release (Por ejemplo PRETTY_NAME=”Raspbian GNU/Linux 9 (stretch)” )

Los lenguajes de programación que hasta el momento hemos probado su correcto funcionamiento con el clásico programa “Hola mundo” y después su trabajo con el módulo GPIO para controlar un sencillo LED son los siguientes:

Software Version IDE Version Ejecución GPIO
Java 1.8.0_65 Bluej 3.1.7b Terminal Completo
Python 3.5.3 Integrado 3.5.3 Integrada Completo
Scratch 2 Integrado 2 Integrada Limitado
LUA 5.1.5 No Terminal Incompleta

Para futuros ejemplos en Raspberry Pi  usaré Python y para enseñar y disfrutar con los más pequeños Scratch.

Esquemas eléctricos y diagramas de flujos

Desde dibujar un circuito eléctrico o un diagrama de flujo de un programa  a mano alzada, o con la ayuda de una regla de símbolos, pasando por el sufrido Power Point, hasta las aplicaciones en web y programas disponibles para esta tarea fundamental en la documentación de un proyecto.

Un programa muy  sencillo y de código abierto para dibujar cirtuitos eléctricos y electrónicos es Fritzing , un ejemplo visual del circuito de 2 LEDS controlado por python.

Un programa en web para dibujar diagramas de flujos para programas es draw.io (Scratch es como dibujar un diagrama de flujo ejecutable)