bclose

Iteraciones for en Python 3

Manejando multiples led

Secuencias de LED con Raspberry

 

 

    • Vamos a complicar un poco el blinking led en  Raspberry Pi.
    • Usaremos un grupo de LED para hacer una secuencia.
    • Veremos la instruccion for y sus primeras posibilidades.
    • MOstraremos como lanzar tus programas desde el shell de Linux. 
 
  •  Material requerido.

    Vista mayorRaspberry Pi 3 o equivalente
    componente

    Chip con 10 leds integrados

    10 x LED o un bar led integrado.
    Resistencia de 1/4 watUna resistencia de 1K
    cables M-FUnos 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.

    10 Led integrados en un chip

    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:

    detalle y posicion

    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.

     
    • Recordad que en esta ocasión las referencias del chip, es decir la numeración de colores del diagrama de arriba y no la numeración de los pines.
    • Lo sé es un follón, pero basta con que tengáis claro el concepto. Id conectando LED a partir del pin GPIO 16 en adelante hasta el 25 si tenéis un bar led con 10 diodos, o hasta el 23, si usáis 8 diodos LED
    Raspberry y 10 leds

    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
     
    • Fíjate, que siguiendo la costumbre en Python 3, el ultimo valor del rango no llega a alcanzarse, o si lo prefieres, cuando se alcanza, se cumple la condición de fin y el bucle termina sin hacer el ultimo valor. Por eso, el último número que este programa imprime es el 6, y no el 3 como podrían suponer algunos novicios despistados

    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))
    [3, 4, 5, 6, 7, 8, 9, 10, 11]

    O este otro

    >>>list (range(-10, 10, 2))
    [-10, -8, -6, -4, -2, 0, 2, 4, 6, 8]

    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.

    Comando ls

    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
    ejecutando un programa Python desde el shell

    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
    invocando python desde bash

    ¿Te resulta familiar el prompt >>>? Todo lo que haces desde el IDLE lo puedes hacer desde aquí (Aunque el editor es diferente)

    probando el interprete de python 3

    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.

     
    • Por cierto que se me ha olvidado deciros, que entrar en Python 3 es muy fácil, Pero salir es ligeramente más complicado.
    • Tienes que pulsar [CTRL]+ D, es decir mantienes pulsada la tecla Control y sin soltarla pulsas “d”

     

    Resumen de la sesión

     

     

      • Hemos conectado múltiples LED a las salidas de Raspberry Pi y mostrado como seleccionarlas.
      • Presentamos un pequeño programa que las recorría de diferentes formas.
      • Vimos como usar la instrucción for de Python 3.
      • Mostramos como ejecutar tus programas Python desde el shell de Raspbian..