Omet navegació

MD7.5 Mission Zero. Dibuix a la matriu LED

 

Ara sí, començarem amb la resolució del repte Mission Zero, on el codi ha de ser capaç de reproduir una imatge personalitzada (o una combinació d'imatges) a la matriu Sense-HAT i que els astronautes puguin gaudir d'aquests missatges.

Per començar aquest apartat amb l'alumnat et recomanam que creis i imprimeixis una matriu 8x8 i tinguis a mà la paleta de colors que us hem facilitat al punt MD6.3 Començam amb el repte. També pots fer servir aquest recurs que trobaràs a la pàgina oficial del repte, i que tens aquí enllaçat:

Astro Pi. Mission Zero. Raspberry Pi Foundation. Plantilla matriu Sense-HAT (CC BY-NC-SA)

Recorda que pots emprar la paleta de colors que es mostra a la plantilla anterior, per fomentar la compartició de dissenys i codi, però també pots editar-los segons les teves necessitats. Això sí, no modifiquis els noms de les variables dels colors, ara sabràs per què.

Fixa't en la imatge anterior. Com veus, el dibuix (que sembla un dinosaure) a més de tenir les quadrícules pintades també té escrites unes lletres, que fan referència al codi de variables definit a la missió Astro Pi. És necessari que tu segueixes també aquest sistema de disseny i codificació. Aquí tens un altre exemple de disseny (recorda que en tens altres al web del desafiament):

Astro Pi. Mission Zero. Raspberry Pi Foundation. Disseny de cactus amb píxels (CC BY-NC-SA)

Per poder imprimir aquest disseny a la matriu LED del mòdul Sense-HAT de la unitat Astro Pi, el primer que hauràs de fer és definir, en el teu codi de programa, les variables dels colors (a, c, n, q, t), i establir la variable que representarà la matriu. Com veus al següent exemple, la variable de la imatge (la matriu) s'ha de definir afegint tota la seqüència de colors segons la seva posició en la matriu. Si el nom de les variables és massa llarg, ens serà més complicat escriure el codi i tardarem més.

# Importar les llibreries

from sense_hat import SenseHat
from time import sleep

# Configurar el Sense HAT

sense = SenseHat()
sense.set_rotation(270)


# Afegir variables de color

a = [255, 255, 255] # Blanc
c = [0, 0, 0] # Negre
n = [154, 205, 50] # Groc verdós
q = [255, 255, 0] # Groc
t = [255, 140, 0] # Taronja

# Afegir variable imatge (matriu)

cactus = [
q, q, c, n, c, c, a, c,
q, c, c, n, c, a, a, a,
c, n, c, n, c, c, c, c,
c, n, n, n, c, n, c, c,
c, a, n, n, n, n, c, c,
a, a, a, n, c, a, a, a,
c, c, c, n, a, a, a, c,
t, t, t, t, t, t, t, t]

sense.set_pixels(imatge)

Com hem vist anteriorment, és fonamental conèixer la sintaxi específica de la llibreria Sense-HAT per poder imprimir correctament a la matriu LED de la unitat Astro Pi. Ja coneixem la funció sense.show_message() per imprimir text a la matriu, ara, és l'hora d'aprendre la funció sense.set_pixels().

L'objectiu d'aquesta funció és el mateix, imprimir en pantalla el que s'ha emmagatzemat en la variable imatge. Per emprar-la no té cap misteri, afegirem la funció en finalitzar el codi, fixa't en l'exemple anterior:

# Importar les llibreries

from sense_hat import SenseHat
from time import sleep

# Configurar el Sense HAT

sense = SenseHat()
sense.set_rotation(270)


# Afegir variables de color

a = [255, 255, 255] # Blanc
c = [0, 0, 0] # Negre
n = [154, 205, 50] # Groc verdós
q = [255, 255, 0] # Groc
t = [255, 140, 0] # Taronja

# Afegir variable imatge (matriu)

cactus = [
q, q, c, n, c, c, a, c,
q, c, c, n, c, a, a, a,
c, n, c, n, c, c, c, c,
c, n, n, n, c, n, c, c,
c, a, n, n, n, n, c, c,
a, a, a, n, c, a, a, a,
c, c, c, n, a, a, a, c,
t, t, t, t, t, t, t, t]

# Mostrar la imatge a la matriu LED

sense.set_pixels(cactus)
🔴 Ara et toca a tu...

Prova d'escriure unes línies de codi que permetin imprimir en pantalla una imatge. Si no tens idea per on començar, prova de fer una recerca en xarxa, i a veure què aconsegueixes!

💡Vols saber-ne més?

1️⃣ Usam el sensor de color

Ara que ja saps com funciona la sintaxi del mòdul Sense-HAT i has aconseguit projectar una imatge a la matriu LED de la unitat Astro Pi, et mostrarem com pots emprar el sensor de color. Un dels objectius d'aquest sensor serà, en el moment d'execució del codi, agafar un color del seu entorn més pròxim, i emprar-lo en una de les variables prèviament definides.

L'emprarem de la següent forma: definirem la variable rgb perquè agafi els valors de vermell, verd i blau que hi ha en l'ambient i així modificar el color prèviament definit. Veurem com afectaria a l'exemple anterior:

# Importar les llibreries

from sense_hat import SenseHat
from time import sleep

# Configurar el Sense HAT

sense = SenseHat()
sense.set_rotation(270)


# Afegir variables de color

a = [255, 255, 255] # Blanc
c = [0, 0, 0] # Negre
q = [255, 255, 0] # Groc
t = [255, 140, 0] # Taronja

# Cridar al sensor de color

rgb = sense.color

# Atorgar una variable al sensor

n = [rgb.red, rgb.green, rgb.blue]

# Afegir variable imatge (matriu)

cactus = [
q, q, c, n, c, c, a, c,
q, c, c, n, c, a, a, a,
c, n, c, n, c, c, c, c,
c, n, n, n, c, n, c, c,
c, a, n, n, n, n, c, c,
a, a, a, n, c, a, a, a,
c, c, c, n, a, a, a, c,
t, t, t, t, t, t, t, t]

# Mostrar la imatge a la matriu LED

sense.set_pixels(cactus)

Si executes aquest codi, veuràs que ara el color del cactus ha canviat i sortirà de color rosa. A l'emulador de l'Astro Pi hi ha un apartat on pots modificar les dades que estan rebent els sensors, també del sensor de color.

Astro Pi. Mission Zero. Raspberry Pi Foundation. Edició de paràmetre a l'emulador (CC BY-NC-SA)

...

2️⃣ Fem una animació

T'agradaria fer una animació? En realitat, això no és tan complicat. Una animació no és més que una successió ràpida de diverses imatges amb petites modificacions que donen la sensació de moviment, és a dir, creen una il·lusió òptica.

Astro Pi. Mission Zero. Raspberry Pi Foundation. Exemple d'imatges animades d'altres edicions del desafiament (CC BY-NC-SA)

Ara us deixarem un exemple perquè pugueu fer proves. Anam a fer una animació d'un cor bategant. Per això necessitarem definir dues imatges.

IBSTEAM. Imatges per crear una petita animació a la matiu LED (CC BY-NC-SA)

Com hem fet anteriorment, definirem les variables dels dos colors gris i vermell (b i v respectivament) i crearem les variables cor_gran i cor_petit amb la representació de la seva matriu corresponent.

# Afegir les variables de color

b = [105, 105, 105]
v = [255, 0, 0]

# Afegir les variables de les imatges

cor_gran = [
b, b, v, b, b, v, b, b,
b, v, v, v, v, v, v, b,
v, v, v, v, v, v, v, v,
v, v, v, v, v, v, v, v,
v, v, v, v, v, v, v, v,
b, v, v, v, v, v, v, b,
b, b, v, v, v, v, b, b,
b, b, b, v, v, b, b, b]

cor_petit = [
b, b, b, b, b, b, b, b,
b, b, v, b, b, v, b, b,
b, v, v, v, v, v, v, b,
b, v, v, v, v, v, v, b,
b, v, v, v, v, v, v, b,
b, b, v, v, v, v, b, b,
b, b, b, v, v, b, b, b,
b, b, b, b, b, b, b, b]

I ara ve la part interessant, per imprimir una imatge i després una altra, serà necessari atorgar un temps determinat de durada. És per això que ara haurem d'emprar la funció sleep() de la llibreria sense_hat. Aquesta funció només es podrà fer servir amb nombres enters o de coma flotant (int o float).

Les animacions d'imatge es mesuren segons la quantitat d'imatges per segon que es necessiten per fer-ne una. Aquesta velocitat va entre les 24 i 60 imatges per segon (frame per second). Com a recomanació, i si fem la divisió per saber quants segons s'ha de mantenir una imatge projectada (24 imatges / 60 segons), descobrirem que, com a màxim, podem deixar una diferència de 0,4 - 0,5 segons entre una imatge i una altra.

Una vegada tenim definides les variables, és el moment d'enviar-les a la matriu i projectar-les. Per això emprarem la funció anterior sense.set_pixels(), i després, la funció sleep() per indicar el temps que ha de permanèixer la imatge a la matriu.

Fixa't com quedarà l'últim fragment del codi anterior:

# Mostrar l'animació a la matriu LED durant 0.5 segons

sense.set_pixels(cor_gran)
sleep(0.5)

sense.set_pixels(cor_petit)
sleep(0.5)

Ara, aquesta projecció només durarà un total d'un segons. Si volem que aquesta animació estigui permanent en temps durant els 30 segons que determina el repte tenim dues opcions. Per una banda, copiar i aferrar el codi tantes vegades com les que necessitem per completar els 30 segons. O per una altra, definir un bucle amb aquesta instrucció.

Com que els bucles els deixarem per una altra formació, de moment, ens quedarem amb la primera de les opcions. Còpia i aferra 30 vegades el fragment de codi anterior per completar la teva animació i prova el resultat a l'emulador Astro Pi.

IBSTEAM. GIF Animació del cor (CC BY-NC-SA)

...

Creado con eXeLearning (Ventana nueva)