Archivi tag: coding

Corso in presenza: Coding a scuola con BBC micro:bit

Ancora un altro corso sull’uso di BBC micro:bit questa volta in presenza a Torino presso il Laboratorio di Informatica dell’IIS Gobetti Marchesini Casale Arduino Via Figlie dei Militari, 25 Torino.

Gli argomenti svolti saranno i medesimi di quelli offerti per il corso in Webinar di Tecnica della Scuola, però con sperimentazioni pratiche “costruisci e programma”, tanta didattica della robotica, uso di micro:bit per effettuare sperimentazioni scientifiche ed utilizzo di micro:bit con altri linguaggi di programmazione.

Saranno ammessi uno/due docenti per Istituzione Scolastica fino ad esaurimento dei 15 posti disponibili.

L’elenco degli ammessi sarà pubblicato il 9/11/2018 sul sito http://www.necessitaeducativespeciali.it

Calendario degli incontri: 15/11, 22/11, 26/11, 28/11 dalle ore 15.00 alle 17.30

Il corso è gratuito.
Per le modalità di iscrizione seguire il link.

MicroPython – Python per microcontrollori – usarlo su BBC micro:bit – lezione 3

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 🙂

Fare coding a scuola con BBC micro:bit – seconda edizione


Parte domani la seconda edizione del corso sull’uso di BBC micro:bit a scuola che svolgerò per Tecnica della Scuola. Molte le novità introdotte in questa edizione, analizzeremo la nuova interfaccia di programmazione introdotta ufficialmente la  scorsa settimana, mostrerò le possibilità di programmazione del micro:bit offerte anche da altri ambienti di sviluppo che supportano micro:bit tra cui Scratch 3. Verranno dati suggerimenti per lo sviluppo di attività pratiche utilizzando anche altri dispositivi collegabili al micro:bit vedremo come, con semplici materiali di recupero è possibile implementare un semplice percorso di didattica della robotica.

Durante l’attività di formazione utilizzerò una nuova collezione di schede di lavoro, che si aggiungono a quelle proposte nel precedente corso, schede immediatamente spendibile in classe, utilizzabili per un percorso di Coding che potrete in piena libertà modificare ed espandere in funzione delle vostre esigenze.

Saranno svolti 4 incontri in webinar di 2 ore ciascuno per un totale di 8 ore di formazione:

  • Lunedì 5 novembre 2018 – Ore 17.00/19.00
  • Venerdì 9 novembre 2018 – Ore 17.00/19.00
  • Lunedì 12 novembre 2018 – Ore 17.00/19.00
  • Venerdì 16 novembre 2018 – Ore 17.00/19.00

Nel caso foste interessati è possibile ancora iscriversi, per maggiori informazioni sui contenuti e sulla modalità di iscrizione seguite il link sul sito di Tecnica della Scuola.

Arduino – Concatenare la stampa di stringhe e variabili

In un recente post ho approfondito l’uso di Serial.write() e Serial.print(), proseguo riprendendo gli appunti che di volta in volta aggiungo a quanto sviluppato durante i corsi. Come sapete per inviare sulla seriale un testo molto lungo è necessario scrivere molte linee di codice, una sequenza di Serial.print() che hanno come argomento il testo che si vuole visualizzare, questo un esempio:

Serial.print("Nel mezzo ");
Serial.print("del cammin ");
Serial.print("di nostra vita ");
Serial.print("mi ritrovai ");
Serial.print("per una selva oscura ");
Serial.print("ché la diritta via ");
Serial.print("era smarrita. ");

Tutte queste righe potrebbero essere scritte in una forma più compatta, accodando tutte le Serial.print() :

Serial.print("Nel mezzo ");Serial.print("del cammin ");
Serial.print("di nostra vita ");Serial.print("mi ritrovai ");
Serial.print("per una selva oscura ");
Serial.print("ché la diritta via ");Serial.print("era smarrita. ");

Sarebbe interessante poter avere la possibilità di concatenare il testo da stampare così come è possibile fare con altri linguaggi di programmazione: Java / VB / C # / C ++, ecc…

Questa funzionalità è stata implementata qualche tempo fa da Mikal Hart che ha realizzato la libreria Streaming (file zip). I vantaggi di utilizzo risiedono nella compattezza del codice prodotto e nella velocità di scrittura.

Con l’uso della libreria Streaming il codice precedente che stampa una serie di stringhe utilizzando la Serial.print(), diventa:

Serial << "Nel mezzo " << "del cammin " << "di nostra vita " << "mi ritrovai " << "per una selva oscura " << "ché la diritta via " << "era smarrita."<< endl;

Nel caso si volesse suddividere l’invio sulla seriale su più linee::

Serial << "Nel mezzo " << "del cammin " << "di nostra vita " << endl;
Serial << "mi ritrovai " << "per una selva oscura " << endl;
Serial << "ché la diritta via " << "era smarrita. " << endl;

Prendendo spunto dall’esempio che trovate nella libreria:

#include <Streaming.h>

void setup()
{
  Serial.begin(9600);
  int lettera = 'M';
  int mese = 7, giorno = 6, anno = 1967;
  
  Serial << "Questo è un esempio dell'uso della libreria Streaming," << endl;
  Serial << "che ti permette di stampare variabili" << endl;
  Serial << "senza dover digitare ad ogni riga" << endl;
  Serial << "Serial.print().  Esempio: " << endl;
  
  Serial << "M è " << lettera << "." << endl;
  Serial << "La mia data di nascita è " << giorno << "-" << mese << "-" << anno << "." << endl;
  
  Serial << "Puoi anche usare i modificatori, per esempio:" << endl;
  Serial << _BYTE(lettera) << " e " << _HEX(lettera) << " in esadecimale. " << endl;
}

void loop()
{}

Realizzimo uno sketch che conta il numero di pressioni del pulsante e visualizziamo sulla Serial Monitor una stringa che ne da indicazione, il circuito è costituito da:

  • Arduino UNO R3
  • Resitore da 1KOhm
  • 1 pulsante

Lo sketch di esempio è il seguente:

#include <Streaming.h>

#define PULSANTE 11 // pin di input a cui è collegato il pulsante

// Variabili
int ContatorePulsantePremuto = 1; // conta il numero di volte che il pulsante è premuto buttonPushCounter 
int StatoPulsante = 0;            // stato corrente del pulsante
int StatoPulsantePrecedente = 0;  // stato precedente del pulsante

void setup() {
  pinMode(PULSANTE, INPUT); // imposta il pin digitale come output
  Serial.begin(9600);       // inizzializza la seriale a a 9600 bps
}

void loop() {
  StatoPulsante = digitalRead(PULSANTE);
  // legge il valore dell'input e lo conserva

  if (StatoPulsante != StatoPulsantePrecedente) {   // compara lo stato del pulsante attuale con il precedente
    if (StatoPulsante == HIGH) {                    // se lo stato è cambiato incrementa il contatore
      // se lo stato corrente è alto, il pulsante è passato da off a on
      
      // Stampa sulla seriale il numero di pressioni del pulsante
        Serial << "Il pulsante è stato premuto " << ContatorePulsantePremuto << " volte" << endl;
      
      ContatorePulsantePremuto++;
    }
  }

  // salva lo stato corrente nella variabile che indica lo stato precedente per il loop successivo 
  StatoPulsantePrecedente = StatoPulsante;
}

Ad ogni pressione del pulsante sulla seriale compariranno le stringhe:

Esercizio

L’invio dello dello stream del testo può avvenire non solo sulla seriale ma anche su qualsiasi classe derivata da Print, ad esempio su display.

Sapreste ottenere la stessa cosa con un display a 16 colonne e 2 righe?

Suggerimento:

lcd << "Il pulsante è stato premuto " << contatore << " volte" << endl;

Buon Coding a tutti 🙂

DotBot:Smart – un robot didattico veloce da costruire

Durante alcuni corsi di Coding e robotica per colleghi di scuola media mi è stato manifestato il desiderio di poter avere a disposizione un kit robotico estremamente semplice da realizzare poco costoso e che occupasse poco spazio, che potesse adattarsi, come sempre, a microcontrollori di ogni tipo, soprattutto Arduino e micro:bit.

Esplorando per altri scopi il sito youmagine ho scoperto i moltissimi lavori realizzati da RCCM anche lui come me insegnante (vi consiglio di guardare i suoi lavori) ed ho notato il progetto Micro Servo Chassis, per cui sulla stessa idea ho realizzato una struttura simile ed inserito gli elementi di aggancio per i servomotori che avevo realizzato per il DotBot:bit.

Per ridurre la quantità di materiale ho eliminato, rispetto alle strutture precedentemente realizzate la caster ball, la biglia di supporto, che ho sostituito con una piccola bacchetta costituita da un punto di appoggio al terreno ricurvo, il tutto vincolato alla struttura portante dei motori.

Nel caso si debba aggiungere parecchia elettronica, per aumentare ancor di più la stabilità ho sviluppato una doppio supporto strisciante così come potete notare nelle immagini allegate.

Su questo piccolo chassis robotico potrete, secondo necessità ed in funzione di ciò che disponete, predisporre una base di appoggio come ad esempio: cartone, compensato o plexiglas fissata con viti o fascette di plastica.

Ecco giustificato il nome DotBot:Smart perché veloce da costruire, due elementi da stampare e poi Coding a volontà 🙂

Questo nuovo kit didattico si aggiunge alla famiglia DotBot.

Nel caso desiderate effettuare la stampa questo il link diretto di DotBot:Smart su Thingiverse.

Come sempre se durante le sperimentazioni con i vostri allievi si evidenziano correzioni o miglioramenti da fare, non esitate a contattarmi.

Di seguito le foto che mostrano come costruire il robot.

Materiali occorrenti

  • qualsiasi tipo di microcontrollore: micro:bit, Arduino, oppure Raspberry Pi (qualsiasi modello)
  • n. 2 bulloni M3 – viti da 10 mm
  • n. 2 FS90R servo a rotazione continua
  • n. 2 due ruote per FS90R 60mm x 8mm

La barra centrale deve avere un orientamento, rispetto ai servomotori, identico a quello indicato nell’immagine (notate l’albero di rotazione del servo). I servomotori sono fissati con piccole viti in dotazione quando acquistate i servo:

Le viti di blocco della barra centrale sono sotto il livello di appoggio della base in modo da non creare un rialzamento:

Scegliete il materiale di cui disponete, (nell’immagine cartone) e con del nastro biadesivo fissate breadboard ed elettronica:

Il fissaggio può avvenire mediante fascette di plastica:

Nel caso abbiate necessità di maggior superficie di appoggio e maggior stabilità potete utilizzare la barra centrale con doppio appoggio:

Buon Coding a tutti.