Disegnare immagini statiche è divertente, ma ancora più divertente è farle muovere e fare questo con MicroPython è molto semplice, è sufficiente indicare un elenco di immagini, in questa lezione vedremo come fare.
Per capire come animare una serie di immagini abbiamo necessità di utilizzare le liste.
Lista della spesa:
Uova
Prosciutto
Pomodori
Questo è il modo per rappresentare una lista in Python:
spesa = ["Uova", "Prosciutto", "Pomodori" ]
Abbiamo creato un elenco chiamato spesa che contiene tre elementi. Python sa che è un elenco perché è racchiuso tra parentesi quadre ([ e ] ). Gli elementi nella lista sono separati da una virgola (, ) e in questo caso gli elementi sono tre stringhe di caratteri: “Uova”, “Prosciutto” e “Pomodori”. Sappiamo che sono stringhe di caratteri perché sono racchiusi tra virgolette “.
Nota
I numeri non hanno bisogno di essere inseriti all’interno delle doppie virgolette, in quanto rappresentano un valore (piuttosto che una stringa di caratteri).
Quindi 2 senza virgolette rappresenta il valore numerico 2 mentre 2 tra virgolette “2” rappresenta il carattere/cifra che rappresenta il numero 2.
È possibile memorizzare elementi di diverso tipo all’interno della stessa lista:
lista_mista = [“ciao!”, 1.234, Image.HAPPY]
Notate che l’ultimo elemento è un’immagine!
E’ possibile dire a MicroPython di animare un elenco di immagini. Fortunatamente sono disponibili un paio di elenchi di immagini già integrate, si chiamano Image.ALL_CLOCKS e Image.ALL_ARROWS :
from microbit import *
display.show(Image.ALL_CLOCKS, loop=True, delay=100)
Verrà visualizzata una lancetta che girerà in senso orario, l’intervallo di accensione dei tre LED è di 100 millisecondi.
Come abbiamo visto per la visualizzazione di una sola immagine usiamo display.show per mostrarlo sul display del micro:bit. Quando diciamo a MicroPython di usare Image.ALL_CLOCKS ci verranno mostrate in sequenza tutte le immagini della lista, inoltre nell’istruzione con il parametro loop=True indichiamo che la lista delle immagini deve scorrere per sempre e con l’argomento delay=100 indichiamo che ogni immagine deve essere visualizzata per 100 millisecondi (1/10 di secondo).
- Avete capito come animare la lista Image.ALL_ARROWS ?
- Come si evita il loop infinito?
(suggerimento: l’opposto di True è False sebbene il valore predefinito per loop sia False )
- Potete cambiare la velocità dell’animazione?
Vediamo come creare un’animazione di un’esplosione di luci, una sequenza che parte con l’accensione del LED centrale per espandersi verso il perimetro con differenti intensità luminose dei LED
from microbit import *
luce1 = Image("00000:"
"00000:"
"00900:"
"00000:"
"00000")
luce2 = Image("00000:"
"09990:"
"09590:"
"09990:"
"00000")
luce3 = Image("00000:"
"05550:"
"05350:"
"05550:"
"00000")
luce4 = Image("09590:"
"93339:"
"93039:"
"93339:"
"09590")
luce5 = Image("03330:"
"30003:"
"30003:"
"30003:"
"03330")
luce6 = Image("00000:"
"00000:"
"00000:"
"00000:"
"00000")
luci = [luce1, luce2, luce3, luce4, luce5, luce6]
display.show(luci, delay=200)
Questo è il modo con cui funziona il programma:
- creiamo sei immagini luce nello stesso modo descritto sopra.
- Poi le inseriamo tutte in una lista chiamata luci .
- Infine chiedo a display.show di animare la lista con un ritardo di 200 millisecondi.
- Poiché non abbiamo impostato loop=True vedremo l’animazione una sola volta.
Proviamo ora a creare una sequenza che si ripete ciclicamente, in questo caso sarà sufficiente inserire il codice all’interno di un blocco while
from microbit import *
ritardo=100
luce1 = Image("00000:"
"00000:"
"00900:"
"00000:"
"00000")
luce2 = Image("00000:"
"09990:"
"09590:"
"09990:"
"00000")
luce3 = Image("00000:"
"05550:"
"05350:"
"05550:"
"00000")
luce4 = Image("09590:"
"93339:"
"93039:"
"93339:"
"09590")
luce5 = Image("03330:"
"30003:"
"30003:"
"30003:"
"03330")
luce6 = Image("00000:"
"00000:"
"00000:"
"00000:"
"00000")
luci = [luce1, luce2, luce3, luce4, luce5, luce6]
while True:
display.show(luci, delay=ritardo)
Come si nota è stato inserito all’interno di un loop infinito: while True l’istruzione display.show(luci, delay=ritardo) . Rispetto alla versione precedente è stata anche parametrizzato il valore del delay , inserito come parametro ritardo all’inizio del codice, ciò permetterà di variare ad inizio programma la velocità con cui apparirà la sequenza delle sei immagini.
L’esempio riportato sopra ripeterà ad ogni ciclo la sequenza delle immagini da luce1 a luce6 , nel caso in cui si voglia dare un’effetto di ribalzo sarà sufficiente creare due collezioni luciA e luciB i cui la sequenza delle immagini è invertita:
from microbit import *
ritardo=100
luce1 = Image("00000:"
"00000:"
"00900:"
"00000:"
"00000")
luce2 = Image("00000:"
"09990:"
"09590:"
"09990:"
"00000")
luce3 = Image("00000:"
"05550:"
"05350:"
"05550:"
"00000")
luce4 = Image("09590:"
"93339:"
"93039:"
"93339:"
"09590")
luce5 = Image("03330:"
"30003:"
"30003:"
"30003:"
"03330")
luce6 = Image("00000:"
"00000:"
"00000:"
"00000:"
"00000")
luciA = [luce1, luce2, luce3, luce4, luce5, luce6]
luciB = [luce6, luce5, luce4, luce3, luce2, luce1]
while True:
display.show(luciA, delay=ritardo)
display.show(luciB, delay=ritardo)
Per avere una struttura compatta del codice, così come mostrato in precedenza, il codice può essere scritto in questo modo:
from microbit import *
ritardo=100
luce1 = Image("00000:00000:00900:00000:00000")
luce2 = Image("00000:09990:09590:09990:00000")
luce3 = Image("00000:05550:05350:05550:00000")
luce4 = Image("09590:93339:93039:93339:09590")
luce5 = Image("03330:30003:30003:30003:03330")
luce6 = Image("00000:00000:00000:00000:00000")
luciA = [luce1, luce2, luce3, luce4, luce5, luce6]
luciB = [luce6, luce5, luce4, luce3, luce2, luce1]
while True:
display.show(luciA, delay=ritardo)
display.show(luciB, delay=ritardo)
Buon Coding a tutti 🙂