Micropython de microbit
Página extraída de Federico Coca Guia de Trabajo de Microbit CC-BY-SA
API: El módulo microbit
Todo lo necesario para interactuar con el hardware de la micro:bit está en el módulo microbit y se recomienda su uso escribiendo al principio del programa:
from microbit import *
Las funciones disponibles directamente son:
sleep(ms) #1
running_time() #2
temperature() #3
scale(valor_a_convertir, from_=(min, max), to=(min, max)) #4
panic(error_code) #5
reset() #6
set_volume(valor) #7 (V2)
'''
1 Esperar el número de milisegundos indicado
2 Devuelve el tiempo en ms desde la última vez que se encendió la micro:bit
3 Devuelve la temperatura en Celcius
4 Convierte un número de una escala de valores a otra
5 La micro:bit entra en modo pánico por falta de memoria y se dibuja una
cara triste en la pantalla. El valor de error_code puede ser cualquier entero.
6 Resetea la micro:bit
7 Estable el volumen de salida con un *valor* entre 0 y 255
'''
API: Display
Control de la matriz de 5x5 LEDs que en micro:bit se conoce como pantalla. Los métodos de la clase son:
display.get_pixel(x, y) #1
display.set_pixel(x, y, val) #2
display.clear() #3
display.show(image, delay=0, wait=True, loop=False, clear=False) #4
display.scroll(string, delay=400) #5
'''
1 Obtiene el brillo [0 (apagado) a 9 (máx))] del pixel (x,y)
2 Establece el brillo [0 (apagado) a 9 (máx))] del pixel (x,y)
3 Borra (apaga) la pantalla
4 Muestra la imagen
5 Desplaza una cadena por la pantalla a la velocidad en ms del *delay*
'''
En ambos casos de la API existen otras muchas opciones no incluidas. La funcionalidad de autocompletar nos ayudará para no tener que recordar la sintaxis y conocer las que no aparece aquí. En la animación siguiente vemos un ejemplo de ambos casos.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Estructuras de datos en Python
Las listas (list)
Se trata de un tipo de dato que permite almacenar series de datos de cualquier tipo bajo su estructura. Se suelen asociar a las matrices o arrays de otros lenguajes de programación.
En Python las listas son muy versatiles permitiendo almacenar un conjunto arbitrario de datos. Es decir, podemos guardar en ellas lo que sea.
Una lista se crea con []
y sus elementos se separan por comas. Una gran ventaja es que pueden tener datos de diferentes tipos.
lista = [1, "Hola", 3.141592, [1 , 2, 3], Image.HAPPY]
Las de principales propiedades de las listas:
- Son ordenadas, mantienen el orden en el que han sido definidas
- Pueden ser formadas por tipos arbitrarios de datos
- Pueden ser indexadas con [i]
- Se pueden anidar, es decir, meter una lista dentro de otra
- Son mutables, ya que sus elementos pueden ser modificados
- Son dinámicas, ya que se pueden añadir o eliminar elementos
Hay dos métodos aplicables:
append
. Permite agregar elementos a la lista.remove
. Elimina elementos de la lista.insert(pos,elem)
. Inserta el elementoelem
en la posiciónpos
indicada.
En el ejemplo vemos el funcionamiento.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Con estos conocimientos tendremos suficiente para hacer lo que pretendemos, que no es otra cosa que animar imágenes.
Las tuplas (tuple)
Son muy similares a las listas con una diferencia principal con las mismas y es que las tuplas no pueden ser modificadas directamente, lo que implica que no dispone de los métodos vistos para listas. Una tupla permite tener agrupados un número inmutable de elementos.
Una tupla se crea con ()
y sus elementos se separan por comas.
tupla = (1, 2, 3)
Principales propiedades:
- Se pueden declarar sin usar los paréntesis, pero no se recomienda. No usarlos puede llevarnos a ambigüedades del tipo print(1, 2, 3) y print((1, 2, 3)).
- Si la tupla tiene un solo elemento esta debe finalizar con coma.
- Se pueden anidar tuplas, por ejemplo
tupla2 = tupla1, 4, 5, 6, 7
. - Se pueden declarar tuplas vacias, por ejemplo
tupla3 = ()
. - Las tuplas son iterables por lo que sus elementos pueden ser accesados mediante la notación de índice del elemento entre corchetes. Si se quiere acceder a un rango de indices se separan por ":" ambos índices.
- Es posible convertir listas en tuplas simplemente poniendo la lista dentro de los paréntesis de la tupla, por ejemplo,
tupla_lista = ([1, "Hola", 3.141592, [1 , 2, 3], Image.HAPPY])
A continuación vemos un ejemplo.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Diccionarios (dict)
Estas estructuras contienen la colección de elementos con la forma clave:valor
separados por comas y encerrados entre {}
. Las claves son objetos inmutables y los valores pueden ser de cualquier tipo. Sus principales características son:
- En lugar de por índice como en listas y tuplas, en diccionarios se acceder al valor por su clave.
- Permiten eliminar cualquier entrada.
- Al igual que las listas, el diccionario permite modificar los valores.
- El método
dicc.get()
accede a un valor por la clave del mismo. - El método
dicc.items()
devuelve una lista de tuplasclave:valor
. - El método
dicc.keys()
devuelve una lista de las claves. - El método
dicc.values()
devuelve una lista de los valores. - El método
dicc.update()
añade elementoclave:valor
al diccionario. - El método
del dicc
borra el parclave:valor
. - El método
dicc.pop()
borra el parclave:valor
.
A continuación vemos un ejemplo
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
Bucles
Los Bucles son un tipo de estructura de control muy útil cuando queremos repetir un bloque de código varias veces. En Python existen dos tipos de bloques, el bucle for para contar la cantidad de veces que se ejecuta un bloque de código, y el bucle while que realiza la acción hasta que la condición especificada no sea cierta.
While
La sintaxis de while es la siguiente:
while condicion:
bloque de codigo
donde "condicion", que se evalúa en cada iteración, puede ser cualquier expresión realizado con operadores condicionales que devuelva como resultado un valor True o False. Mientra que "bloque de codigo" es el conjunto de instrucciones que se estarán ejecutando mientras la condición sea verdadera (True o '1'). Es lo mismo poner while true:
que poner while 1:
.
Para recorrer los bucles se utilizan variables que forman parte de la condición, estableciendose en esta lo que deben cumplir.
Un ejemplo sencillo podría ser el siguiente, controlar el riego de una planta en función del valor de la humedad de la tierra en la que está.
from microbit import *
while (humedad() < 45):
display.scroll(Image.SAD)
sleep(1000)
display.show(Image.HAPPY)
que hará que si la humedad baja por debajo de 45 se muestre una carita triste indicando que hay que regar y si es mayor mostrará una carita feliz. Evidentemente hay que resolver el tema de como obtener la humedad, pero esa es una historia que veremos mas adelante.
El bucle while
puede tener de manera opcional un bloque else
cuyas sentencias se ejecutan cuando se han realizado todas las iteraciones del bucle. Un ejemplo lo vemos a continuación:
cuenta = 0
while cuenta < 5:
print("Iteración del bucle")
cuenta = cuenta + 1
else:
print("bucle finalizado")
for
Son también bucles pero su acción está dirigida a contar el número de veces que ocurre algo o realizar una acción un determinado número de veces. Es especialmente útil para recorrer los datos de una lista, tupla o diccionario.
La sintaxis de este tipo de bucles en Python es:
for variable in secuencia:
declaracion
Siendo "variable" la variable que se va a recorrer en el bucle de forma que cuando se alcance el valor establecido se sale del bucle.
La variable puede ser una cadena, un rango de valores que se expresa con range(n)
, siendo n el número de valores del rango que se inicia en 0 y que pueden ser iterados con una variable. Mas ampliamente, la sintaxis de range()
es range(start, stop, step)
siendo start
y stop
opcionales.
Veamos un primer ejemplo en el que vamos a utilizar un bucle para encender uno a uno por filas los LEDs de la primera y última columna.
from microbit import *
for var in range(5): # var puede tomar 5 valores, del 0 al 4
display.set_pixel(0, var, 9) # Se ilumina el LED de la fila 0 y el valor de var para columna
sleep(300)
display.set_pixel(4, var, 9) # Se ilumina el LED de la fila 4 y el valor de var para columna
sleep(300)
Los bucles se pueden anidar, es decir se puede crear un bucle dentro de otro del mismo o diferente tipo, de forma que por cada iteración del bucle mas externo se tienen que producir todas las iteraciones del bucle mas interno. Veamos como ejemplo el de encender todos los LEDs de uno en uno, de izquierda a derecha, utilizando el valor de sus coordenadas x,y. El programa sería:
from microbit import *
display.clear()
for y in range(0, 5): # Valor de columna
for x in range(0, 5): # Valor de fila
display.set_pixel(x, y, 9) # Encender LED x,y
sleep(100)
En la animación siguiente vemos el programa en funcionamiento.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
El bucle for
puede tener de manera opcional un bloque else
cuyas sentencias se ejecutan cuando se han realizado todas las iteraciones del bucle. Un ejemplo lo vemos a continuación:
for var in range(5):
print(var)
else:
print("bucle finalizado")
Bucle for decontando
Se trata del mismo bucle for
pero ahora la cuenta la realizamos hacia atrás. Hay dos formas sencillas de hacerlo:
- Utilizando la función
range()
. Si queremos darle un enfoque Pythonic simplemente configuramos los argumentos de la función de manera que se indique el principio, el final y el incremento, que será logicamente negativo.
for i in range(20, 0, -2): #imprimere 20, 18, 16, ... 0
- Utilizando la función
reversed()
. Es una función incorporada en la que hay que indicar como primer argumento el final de la cuenta, como segundo el principio, teniendo en cuenta que se omite, y como tercero el decremento si es ditintos de 1, pero se especifica en módulo. Se utiliza así:
for i in reversed(range(0,21,2)): #imprimere 20, 18, 16, ... 0
Sentencias break
y continue
La sentencia break
se utiliza para terminar un bucle de forma inmediata al ser encontrada. En la imagen vemos la sintaxis de la sentencia break
y su funcionamiento.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
La sentencia continue
se utiliza para saltar la iteración actual del bucle y el flujo de control del programa pasa a la siguiente iteración. En la imagen vemos la sintaxis de la sentencia continue
y su funcionamiento.
Federico Coca Guia de Trabajo de Microbit CC-BY-SA
En la figura siguiente vemos dos ejemplos de esta sentencia
Federico Coca Guia de Trabajo de Microbit CC-BY-SA