Objetivos
Material requerido.
Raspberry Pi 3 o equivalente | |
10 x LED o un bar led integrado. | |
Una resistencia de 1K | |
Unos cables Dupont Macho-Hembra protegidos |
For y múltiples LED
Una vez que ya hemos aprendido a gobernar un único LED ha llegado el momento de intentarlo con un grupo de ellos, digamos 8 o 10 y hacer efectos con las luces.
De nuevo, el interés consiste en seguir jugando un poco con la instrucción for de Python que tiene más miga y aplicaciones de las que en principio puede parecer, especialmente para los que vengáis de C++, y pronto veréis que acepta una serie de cosas poco habituales y en muchas ocasiones sorprendentes.
Para empezar podemos ilustrar estas ideas conectando varios diodos LED a nuestra Raspberry Pi y generando secuencias de luces. Podemos usar 10 LED conectados a nuestra Raspi, que es lo que os recomiendo si no disponéis de un LED bar, que es lo que yo voy a usar por pura vagancia para hacer los efectos.
Estos displays usan 10 LED normales y corrientes encapsulados en un único chip y con forma de pequeños rectángulos lo que les hace ideales para para este tipo de ejercicios, aunque están pensador para ser indicadores gráficos de nivel por ejemplo en una mesa de mezclas de audio, o indicadores de potencia de una señal.
En este capítulo esperamos usar un poco más la instrucción for de Python 3, de modo que nos vayamos habituando a su sintaxis y posibilidades antes de ir presentando más instrucciones.
Esquema del montaje
Vale, vamos a conectar 10 LED por ejemplo (Aunque puedes conectar 8 y no hay grandes diferencias) y lo primero que nos ocurre es que no disponemos de 10 pines numerados consecutivamente si usamos la nomenclatura del conector exterior:
Fíjate que hay diferentes pines con GND en medio de otros pines de uso general por lo que es un momento difícil para usar este modo de referenciar los pines.
Nos interesa que los números de pin sean consecutivos para poder establecer un ciclo con un for, que vaya recorriendo los números de pin que queremos iluminar, pero viendo el diagrama de pines no va a ser posible con la numeración exterior.
En cambio es bastante fácil usar la numeración interna del chip Broadcom y podemos olvidarnos de este problema. Por ejemplo si conectamos desde el pin GPIO 16 al 25 tenemos 10 referencias consecutivas que podemos usar para hacer secuencias de iluminación con los LED sin problemas.
Esta es una de esas ocasiones en que numerar desde el punto de vista del chip es más practico que hacerlo desde el punto de vista del conector (Increíble ¿Verdad?)
Vamos con el esquema de protoboard.
No os asustéis. Yo he usado 10 led porque voy a montarlo con uno de estos chips integrados que los incluyen, si vosotros usáis diodos LED discreto basta con por ejemplo 8 (Es que me lié a conectar cables y ya se sabe que es algo que engancha)
El programa es de lo más sencillo: blink2.rar
import RPi.GPIO as gpio import time gpio.setmode(gpio.BCM) for x in range ( 16, 26): gpio.setup(x, gpio.OUT) for x in range ( 16, 26): gpio.output(x, True) time.sleep(0.15) gpio.output(x, False) time.sleep(0.15)
No hay nada nuevo en este programa, con excepción de que hemos usado el for para recorrer los pines del 16 al 25. Es decir, que la instrucción for en Python nos permite asignar valores específicos de inicio y de fin a la variable que iteramos.
Si lanzas este programa obtendrás algo como esto:
Ya que estamos, si lanzas varias veces la ejecución de este programa en seguida veras que recibes un advertencia (Warning)
Warning (from warnings module): File "/home/pi/blink2.py", line 10 gpio.setup(x, gpio.OUT) RuntimeWarning: This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warnings.
Aunque sea en rojo no es un error, sino que te avisa de que intentas redefinir como salidas pines que ya estaban definidos previamente y te informa que puedes desactivar etas advertencias con el comando:
gpio.setwarnings(False)
Aunque esta orden funciona, no me acaba de gustar acallar sus quejas (Es como si dejas de escuchar a tu chico /chica cuando se queja. Al final la cosa va a explotar por algún sitio), pero aún me gusta menos que me saque un mensaje en rojo cada vez que ejecuto el programa. Por eso te puede convenir que al final del programa liberes los pines que has usado con una instrucción del tipo:
gpio.cleanup()
Que lo que hace es liberar todos los pines que hayas usado y poner a False su estado eléctrico.
¿Y si quiero saltar de 2 en 2? Python no tiene problemas, le puedes indicar el salto de una posición a la siguiente:
import RPi.GPIO as gpio import time gpio.setmode(gpio.BCM) for x in range ( 16, 26, 2): gpio.setup(x, gpio.OUT) for x in range ( 16, 26, 2): gpio.output(x, True) time.sleep(0.15) gpio.output(x, False) time.sleep(0.15)
En este caso hemos definido un numero de inicio y uno de fin con un step o salto de 2 en la secuencia
¿Ya, y si quiero que sea una cuenta descendente en lugar de ascendente? Para no ponerme pesado con pequeños vídeos podemos hacerlo imprimiendo sin más:
>> for x in range(27, 3, -3): print(x) 27 24 21 18 15 12 9 6
For, es una instrucción muy potente en Python que nos permite recorrer casi cualquier cosa que sea iterable por su propia naturaleza, como por ejemplo Arrays, Listas y Strings entre otras cosas, que ya iremos viendo poco a poco (Porque aun es un poco pronto)
Pero a modo de aperitivo, podemos comentar que range genera una colección de elementos de acuerdo a las reglas que le damos y podemos convertirlo en una lista (O no) para poder usarlo como nos apetezca.
Por ejemplo podéis probar en el intérprete con:
>>>list (range(3,12))
O este otro
>>>list (range(-10, 10, 2))
Es aun algo pronto para entrar con Arrays y Srings en Python y trataremos de ir poco a poco, pero podemos apuntar que puedes usar el for para recorrer cada uno de los elementos de un array o cada una de los caracteres de un String.
Ejecutando Python desde el Shell
Hemos visto que una vez que escribimos (Y depuramos) un programa Python 3 podemos cargarlo y ejecutarlo desde el IDLE. Y está muy bien, pero para eso necesitamos tenemos tener arrancado el entorno gráfico Xwindows en nuestra Raspberry Pi, y a veces por diferentes razones, podemos no tenerlo, especialmente en instalaciones remotas en las que quizás tengamos poco interés en consumir recursos preciosos para otras tareas.
Por eso este es un buen momento para intentar meteros un par de ideas en la cabeza. La primera que Python es un lenguaje casi universal y corre en casi cualquier procesador digno de mención, incluyendo Windows, Linux, OSX y Android.
¿Y sabes lo mejor? tus programas correrán casi sin modificación en todos esos entornos. Naturalmente no puedes esperar que el programa de arriba corra en un PC con Windows o en Linux, porque invoca librerías propias GPIO que solo existen en la propia Raspberry Pi. Pero mientras te limites a todo lo que es común, y hay cientos de librerías disponibles, tus programas correrán con facilidad cambiando de plataforma.
La segunda idea es que estas plataformas Python incluyen algunas cosas sorprendentes como el propio Shell de Linux, Bash, desde donde tus programas corren en tu Raspberry como la seda sin más que invocarlos.
Arranca un Shell en tu Raspi y ejecuta el comando
ls
Este comando lista los ficheros disponibles en el directorio en el que te encuentras, que por pura casualidad es tu directorio de trabajo donde se guardan tus documentos propios, incluyendo los programas que hayas escrito en Python si no le has ordenado otra cosa.
Puedes ver que yo he salvado un par de programas blink.py, blink2.py, blink3.py .Si quieres ejecutar por ejemplo el programa blink3.py basta con que escribas:
pthon3 blink2.py
Veras que se ejecuta el programa desde el Shell exactamente igual que antes y los LED seguirán la secuencia programada, porque seguimos teniendo Python disponible.
Es más, puedes entrar en Python desde aquí, simplemente escribiendo:
python3
¿Te resulta familiar el prompt >>>? Todo lo que haces desde el IDLE lo puedes hacer desde aquí (Aunque el editor es diferente)
No tengo intención de entrar a editar programas Python desde aquí con el Nano o editores similares. A mí me gustan las ventanas y el modo gráfico como al que mas y me parece mucho mas sencillo todo. Pero no olvides que cuando los hombres eran hombres y los jamones sabían a jamón, Todo se hacía desde aquí, y aun hoy es posible hacerlo (Si eres un hombre de pelo en pecho. Y esto si que impresiona a tus colegas)
Eso incluye editar tus programas Python y ejecutarlos e incluso entrar en el intérprete tranquilamente como hemos hecho más arriba. Así que ya sabes. Si lo necesitas está disponible.
Resumen de la sesión