bclose

Raspberry Pi y blinking LED

Nuestro primer programa

Raspberry y GPIO

 

 

    • Juntando. todo para el blinking LED con Raspberry Pi.
    • Viendo como escribir nuestro primer programa y como ejecutarlo.
    • Repitiendo las cosas: Los bucles FOR.
    • Los bloques en Python y su indentado. 
 

 

 Material requerido.

Vista mayorRaspberry Pi 3 o equivalente
componenteUn LED
Resistencia de 1/4 watUna resistencia de 1K
cables M-FUnos cables Dupont Macho-Hembra protegidos

Empezamos con Python

 

Lo sé. Nunca ganaremos un premio de programación con un blinking LED. Tampoco impresionarás a los frikis de tus colegas con esto (Y no digamos a tus amigas).

Pero el objetivo de este sencillo ejercicio no es marcar territorio, sino ilustrar un par de ideas básicas de programación, que nos vienen al pelo para que si alguno vais a empezar aprendiendo a programar con Python, vayamos de una forma más o menos organizada (Aprovechad , que esto no nos pasa a menudo)

Siguiendo nuestra costumbre, no hemos hecho una típica introducción a Python presentando las instrucciones y sus particularidades para al final, después de 30 o 40 horas de mortal aburrimiento, empecemos a jugar con los GPIO y las cosas chulas.

Muy al contrario, hemos elegido hablar directamente de los import de Python y en concreto de los necesarios para manejar los GPIO con Raspberry Pi, para que ahora podamos hacer ejemplos de programación a partir de esto y poder probar nuestros primeros programas con cositas externas que resulta mucho más visual y divertido que rollos teóricos calculando números y cosas así.

Llegaremos también a ello, porque Python es el lenguaje de la ciencia y el cálculo, pero trataremos en la mediada de lo posible hacer de este pequeña introducción a Python en la Raspberry algo divertido y a ser posible, que los que nos habéis seguido con Arduino, podáis sacar partido a los esfuerzos ya hechos en C++

Pero por favor, no te asustes si acabas de llegar y Python es tu primer lenguaje. Procuraremos que lo puedas seguir sin problemas y que lo hagas de un modo entretenido. Nunca he entendido porque a un porcentaje de la gente le desagrada aprender cosas nuevas, porque dice que es aburrido.

¿Aburrido? Aprender puede ser una de las cosas más divertidas que puedes hacer si se te presenta las cosas de un modo adecuado y con aplicaciones prácticas en las que vayas viendo su utilidad.

Así que bienvenidos a nuestro club y adelante, porque nuestro objetivo es doble: Que aprendáis Python los que ya sabéis programar un poco, o que empeceís a programar los que aterrizáis en esto de nuevos, pero también conseguir que sea divertido de paso. No queremos menos.

 

Blinking LED en Raspberry Pi

 

El blinking LED es una sencilla secuencia de comandos con nuestro lenguaje al uso, que a partir de aquí será Python, en el que buscamos hacer una secuencia de encendido y apagado de un simple LED. La idea es conseguir un led intermitente con una cadencia dada.

En el capítulo anterior vimos cómo hacer esto desde comando directos y ahora queremos hacer un programa que nos permita repetir esto, sin tener que escribirlo a mano cada vez todo eso. Es decir, que un programa consiste en registrar unas instrucciones, para poderlas repetir en el futuro tantas veces como necesitemos.

También es importante para los nuevos, entender que en un programa es como una receta precisa de pasos consecutivos que se van ejecutando uno después de otro,  y en el orden que lo especificamos (Mientras no digamos otra cosa)

Por eso el blinking LED nos sirve para entender que para conseguir una luz intermitente, basta con hacer una secuencia en la que:

 
  • Encendemos el led.
  • Esperamos un tiempo dado.
  • Apagamos el led
  • Esperamos un tiempo dado.
  • Vuelta a empezar. 

En la sesión anterior vimos cómo hacer esto a mano y hoy vamos a pasar a ver cómo hacemos más menos lo mismo con un sencillo programa que podamos guardar para su uso posterior en el futuro.

Vamos a usar el mismo montaje hardware que usamos en la sesión anterior:

Blinking led

Empecemos abriendo el IDLE de Python 3 en nuestra Raspberry Pi. Ahora, vamos a escribir nuestro primer programa.  Haz File\ New File en el menú del IDLE. Te saldrá un documento en blanco donde puedes editar tus programas. Ahora podemos escribir aquí nuestras instrucciones, guardarlo y ejecutarlo en el futuro.

Para poder pasar a instrucciónes el algoritmo que marcamos un poco más arriba, tenemos empezar importando la librerías GPIO para poder dar las ordenes de encendido y apagado, algo que ya tenéis dominado.

import RPi.GPIO as gpio

Después usaremos las mismas instrucciones que en la sesión anterior para encender y apagar el LED pero antes necesitamos poder usar una función que nos permita hacer la temporización. ¿Y adivinas qué? Hay una librería que podemos importar para eso:

import time

Esta librería dispone de instrucciones que nos permitan gestionar plazos e indicar a Python que espere un tiempo antes de encender o apagar el LED. Enseguida veremos cómo.

Ahora tenemos que declarar en Python que sistema de referenciar pines vamos a usar, y que queremos definir el pin 12 como salida, tal y como vimos en la sesión anterior:

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

Y ahora nos falta escribir propiamente las instrucciones que encienden el LED, y esperan medio segundo antes de apagarlo:

gpio.output(12, True)
time.sleep(0.5)

Y ahora cuando queremos apagar:

gpio.output(12, False)
time.sleep(0.5)

La instrucción time.sleep, hace las mismas funciones que el delay en Arduino, pero se le pasa el valor en segundos para la espera que queremos. Así 0.5 supone medio segundo.

Si vamos escribiendo todo esto en nuestro primer programa, tendremos algo así:

blinking led en raspberry

Fijaros que en esta ocasión al no escribirlo en el intérprete, Python no ha ejecutado nada de lo que escribimos, sino que simplemente, vamos creando un fichero de texto con nuestro programa que correremos un poco más tarde.

Salvemos ahora el programa con \\File\ Save as y llama blink a tu programa. Python le añadirá la extensión. py

salando tu programa

Hemos guardado nuestro primer programa.¡ Enhorabuena!, falta ejecutarlo ahora. Para ello podemos usar el menú \Run\runModule, o bien pulsar F5 para lanzar su ejecución.

Python irá interpretando y ejecutando todas las instrucciones en secuencia y si encuentra algún error os devolverá un divertido mensaje de error de los que hacen las delicias de los novatos. Algo así como:

Mensajes de error

Cuando os ocurra esto (Uy sí. Os va a pasar y mucho) tenéis que leer lo que os dice y procurar interpretar el mensaje para corregir el error. En mi caso está claro que le he pedido importar Rpi.GPIO en lugar de RPi.GPIO, recordad que las mayúsculas cuentan.

Así que tenéis que corregir el error, salvar de nuevo el programa y darle de nuevo a F5 para que lo ejecutéis (Tantas veces como sea necesario hasta que no haya errores. Os va a encantar). Y estad atentos porque lo único que va a hacer es encender y apagar el LED una única vez, así que no lo perdáis de vista.

 
  • Recibireis un agradable mensaje de error explicándoos que ese pin esta en uso (De las ejecuciones anteriores y que puedes deshabilitar las advertencias con la instrucción gpio.setwarnings(False), pero no te preocupes de eso ahora y fíjate que efectivamente, el LED se ilumina y apaga una sola vez

Caramba toda esa pila de líneas para hacer un blinking LED y… ¿Solo conseguimos que se encienda y apague una miserable vez?

Pues me temo que es lo que le habéis dicho en vuestro programa… y nada más. Para los novatos conviene recordar que el ordenador tiene la desagradable costumbre de hacer exactamente lo que le dices y no lo que querías decirle.

Las personas tenemos la costumbre de interpretar lo que nos dicen, tratando de contentar a quien nos habla y por eso algunas veces hacemos lo que creemos que nos quieren pedir y no lo que nos han pedido.

Pero esto eta muy fuera del alcance de los ordenadores hoy por hoy, y por eso tenemos que aprender a programar con un lenguaje formal como Python. Para asegurarnos de que lo que decimos no admite interpretación posible: Solo se puede entender de una manera.

Lo primero que llamará la atención a los que vienen de C++ o Java, es que no hay punto y como al final de la línea, solo intro. Python entiende que el intro es suficiente indicio de fin de instrucción (me encanta lo vago que era quien lo diseño así)

 

Iterando instrucciones

 

Por tanto, nuestra primera versión del programa justo enciende y apaga una vez el LED. En Arduino el loop se ejecutaba sin pausa, pero Raspberry es un entorno un poco más tradicional en esto y no existe el loop (Pero ya veremos que podemos montarlo nosotros mismos).

Pero podemos cambiar nuestro programa y hacer que se encienda y apague, digamos 10 veces seguidas. ¿Cómo haríamos algo así?

La primera idea es copiar 10 veces seguidas las 4 instrucciones que encienden y apagan el LED. Esto es humano, pero nos hemos metido a programadores, porque somos vagos y no queremos trabajar y me canso solo de pensar en copiar algo 10 veces. Y porque si queremos hacerlo 256 veces ya me contarás.

Como en todos los lenguajes, la instrucción for repite un bucle un numero de veces dado, y su estructura en Python es muy sencilla, empecemos con un pequeño ejemplo.

Suponte que quiero escribir los números del 1 al 10, Crea un nuevo programa en Python que podemos llamar ciclo y ejecútalo con estas instrucciones:

for x in range ( 1, 10):
     print(x)

El resultado inmediato, al ejecutar, será:

iteracones

La instrucción for va dando a la variable x valores comprendidos entre 1 y 10 de uno en uno pero aunque empieza en 1, el ultimo valor que toma es 9 no 10. Mucho ojo con esto, que es una manía de Python.

Cuando hacemos la iteración x va tomando valores consecutivos  que le mandamos imprimir y por eso se imprimen los valores del 1 al 9.

Seguro que os habéis dado cuenta de que no hay punto y coma al final ni tampoco llaves como en C++. Pero hay unos dos puntos (:) al final del for que es mandatorio y vale la pena que hablemos de esto, porque si lo omites es un error de sintaxis.

Cuando en Python vas a usar una instrucción que se aplica a una o más líneas que vienen a continuación, no necesitas llaves o punto y coma, pero si necesitas indicarle que hay un bloque de instrucciones a continuación median el símbolo dos puntos “:”

Además, y esto es importante, el bloque a ejecutar se marca por un indentado común entre las líneas que componen el bloque. Seguramente te habrás dado cuenta de que en cuanto has puesto los dos puntos Python ha saltado directamente a una nueva indentación con el nuevo intro.

En C++ los bloques de instrucciones se delimitaban entre llaves, pero en Python son las indentaciones las que hacen esa función. Esto es una clave de Python porque te obliga a usar la indentacion de un modo sistemático, lo que hace que los programas sean muy fáciles de leer y organizar.

Vamos a insistir un poco con esto. Imagínate este programa:

for x in range ( 1, 10):
     print(x)
     print( 2* x)

La salida en pantalla será esta:

Jugando con el indentado

Todo normal según decimos. Imprime un número en cada línea y su doble en la siguiente. ¿Pero que crees que hara esto?

for x in range ( 1, 10):
     print(x)
print( 2* x)
Cambiendo el indentado

Como puedes ver, a cambiar la indentación, Python entiende que el bloque for solo afecta a la primera línea print(x). Hace la iteración, imprime lo valores del 1 al 9 tranquilamente y al acabar ejecuta la línea print(2 * x) una única vez e imprime el 18.

Así que cuidado. Recuerda que en Python, la indentación juega una función clave delimitando la estructura de tus programas ¿Vale? Es muy intuitivo y te acostumbraras enseguida.

 
  • Así que nada de andar cambiando los espaciados del indentado alegremente, si no te gusta el que viene por defecto a base de espacios en blanco, porque te explotará en la cara.
  • Se puede cambiar desde las opciones del IDLE, pero de momento quédate como estás y empieza a familiarizarte con Python sin cosas raras. 

Volviendo a nuestro LED, ¿Cómo hacemos para que se encienda y apague 10 veces? Pues con un bucle for en el que le demos el conjunto de instrucciones que veíamos antes:

import RPi.GPIO as gpio
import time

gpio.setmode(gpio.BOARD)
gpio.setup(12, gpio.OUT)

for  x in range ( 0, 10):
    gpio.output(12, True)
    time.sleep(0.5)

    gpio.output(12, False)
    time.sleep(0.5)

¿Qué te parece? Es bastante fácil, aunque al principio cuesta. Puedes usar líneas en blanco, no hay problema siempre y cuando, la indentación sea la misma. Si corres este programa, tu LED se iluminará y apagará 10 veces (Si he dicho 10, que es lo que va el 0 al  10)

Vamos a dejarlo aquí por hoy que ya tenéis suficiente tema.

 

Resumen de la sesión

 

 

    • Vimos como crear nuevos programas en Python y salvarlos, asi como lanzarlos con F5.
    • Creamos algunos programas muy sencillos.
    • Vimos la instrucción for, pasra repetir o iterar grupos de instrucciones.
    • Presentamos el concepto de bloque en Python y como delimitarlo con los indentados.
    • Hicimos una primera versión del Blinking LED.