lunes, 5 de diciembre de 2016

Controlar parpadeo de un LED con Python (Parte 2)

En este post os voy a mostrar como usar los puertos GPIO y un pequeño programa en Python para hacer parpadear un led.

Para ello voy a usar una placa protoboard, cables de conexión, un led , una resistencia y mi RaspberryPi. Si sois nuevos en esto os aconsejo leer los anteriores posts (del uso de los GPIO en el apartado Programación/GPIO).


1. Organización del circuito

En primer lugar vamos a ver como nos debe quedar nuestro circuito para poder encender y apagar un led (si habéis hecho el anterior ejercicio es el mismo circuito). Aquí os dejo una imagen para que veáis la distribución que he usado



si no habéis leído el post anterior os recomiendo hacerlo, ya que en el detallo las conexiones y hay un apartado al final sobre el uso de las resistencias, aquí está el link.



2. Código Python


Hoy vamos a crear un pequeño programa en python que al ejecutarlo haga parpadear el led. Si no sabéis como crear un archivo con un programa en python os recomiendo leer los post sobre programación python del apartado Programación/GPIO del blog.

2.1 Crear un programa en python

En primer lugar abrimos el IDLE de Python en nuestra RaspberryPi (yo uso Python3), una vez abierto creamos un nuevo fichero (en el menú File-New File) y introducimos el siguiente código

# importamos la libreria GPIO
import RPi.GPIO as GPIO
# importamos la libreria time
import time
# indicamos el uso de la identificacion BCM para los GPIO
GPIO.setmode(GPIO.BCM)
# indicamos que el GPIO18 es de salida de corriente
GPIO.setup(18,GPIO.OUT)
# bucle que se repetira hasta finalizar el programa
while(True):
    # damos salida de corriente al pin GPIO18
    GPIO.output(18,True)
    # esperamos medio segundo
    time.sleep(0.5)
    # finalizamos la salida de corriente del pin GPIO18
    GPIO.output(18,False)
    # esperamos medio segundo
    time.sleep(0.5)

guardamos el archivo en una ubicación conocida (en el menú File-Save As), si es necesario apuntad la ruta porque luego la vamos a usar. 


2.2 Ejecutar un programa de python

Podemos ejecutar directamente este pequeño programa presionando la tecla F5 (también se puede ejecutar des de el menú Run-Run Module)

Si todo es correcto se abre una nueva ventana de IDLE de python y empieza la ejecución, el led parpadeará a intervalos de medio segundo. Una vez comprobado el funcionamiento cerrad la pantalla de ejecución (es posible que el led quede encendido o apagado pero ya no parpadeará). 

Otra forma de ejecutar el programa es a través de la pantalla de la línea de comandos. Abrimos una pantalla de terminal y ejecutamos el programa pyhton que acabamos de guardar con la siguiente orden (python + ruta del fichero python)

pyhton /home/pi/Desktop/control_led.py



si disponéis de una versión no actualizada de Raspbian es posible que la pantalla os devuelva un error y no se ejecute el programa (el led no parpadeará), en ese caso usad la orden (sudo + python + ruta del fichero python)

sudo pyhton /home/pi/Desktop/control_led.py

si ahora funciona es porque en la versión de Raspbian que tenéis instalada es necesario tener permisos de superusuario para poder controlar los puertos GPIO. En las versiones más actuales no es necesario poner sudo delante de la orden que ejecuta el programa. (Os recomiendo actualizar a la última versión de Raspbian, para solucionar bugs y otros problemas). Para finalizar la ejecución del programa desde la pantalla de línea de comandos usad la combinación de teclas Ctrl+C en vuestro teclado. Esto finaliza la ejecución, el led puede quedar encendido o apagado, pero ya no parpadea.

Si habéis ejecutado el programa varias veces es posible que tanto la patanlla de IDLE de python como la pantalla de línea de comandos os arroje un error del tipo

Warning (from warnings module):
    File "/home/pi/Desktop/control_led.py", line 5
        GPIO.setup(18,GPIO.OUT)
RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.set
warnings(False) to disable warnings

este error solo nos indica que el puerto GPIO18 ya está siendo usado (des de la primera vez que hemos ejecutado el programa), para evitar este error podemos usar la línea

GPIO.setwarnings(False)

esto desactiva los mensajes de aviso de errores. El código final seria este

# importamos la libreria GPIO
import RPi.GPIO as GPIO
# importamos la libreria time
import time
# desactivamos mensajes de error
GPIO.setwarnings(False)
# indicamos el uso de la identificacion BCM para los GPIO
GPIO.setmode(GPIO.BCM)
# indicamos que el GPIO18 es de salida de corriente
GPIO.setup(18,GPIO.OUT)
# bucle que se repetira hasta finalizar el programa
while(True):
    # damos salida de corriente al pin GPIO18
    GPIO.output(18,True)
    # esperamos medio segundo
    time.sleep(0.5)
    # finalizamos la salida de corriente del pin GPIO18
    GPIO.output(18,False)
    # esperamos medio segundo
    time.sleep(0.5)


este código evita los mensajes de error al ejecutar de nuevo el programa python.