Informatica

Programmazione, CoderDojo, configurazioni ecc

Elettronica

Arduino, Raspberry, stampanti 3D ecc

Fisica

Fisiclab, esperimenti, laboratori

Astronomia

Planetario, museo del cielo e della terra

Cucina

Ricette, esperimenti culinari, paciughi

Coding a Granarolo


Simone Bacciglieri lezione di programmazione con Scratch

Con un po' di ritardo inizio a scrivere questo post riassuntivo sulle ultime attività che io, Serena ed Emiliano abbiamo svolto all'interno della scuola primaria di Granarolo.
Come dicevo in questo post abbiamo preso un impegno notevole: fare almeno una lezione introduttiva di programmazione a tutti i bambini e ragazzi dell'istituto comprensivo di Granarolo, che hanno manifestato interesse in questa attività.
In tutto ne abbiamo visti 314.
In due mesi abbiamo fatto 14 lezioni più una riservata ai docenti dove ne abbiamo incontrati 26.
Non mi dilungherò molto sui numeri perchè è già tutto scritto sul sito dell'istituto comprensivo. Vorrei invece raccontare quello che io (ma anche Serena ed Emiliano) ho cercato di fare durante queste giornate: insegnare ai bambini il valore della condivisione e l'importanza di ragionare sui problemi.

Le mie lezioni anche se sono basate su Scratch non sono "lezioni di Scratch": sono introduzioni al software libero e lezioni di logica. Solitamente faccio una breve introduzione dove spiego cos'è un programma, cosa vuol dire dare istruzioni ad una macchina e cerco di far capire l'importanza di testare i programmi; spiego la differenza tra open source e closed source (ovviamente tutto tarato sulla loro età) e racconto perchè io preferisco l'open source.
Quando partiamo con l'attività vera e propria faccio vedere il programma che vorrei fare e insieme a loro, poi cerco di scomporlo in tante attività da svolgere per poterlo replicare e, per ognuna di queste, proviamo insieme ad identificare i problemi principali da risolvere. Queste lezioni sono sempre molto collaborative: io non do mai la risposta immediatamente ma cerco, tramite Scratch appunto, di farli arrivare alla soluzione ragionandoci. Il bello di Scratch è che permette di creare del codice agganciando i mattoncini delle istruzioni, degli operatori e delle variabili in modo discorsivo. Sfruttando questa caratteristica si riesce a creare un programma semplicemente parlandone e cercando di capire insieme cosa si vuole che faccia.

In questi due mesi come dicevo abbiamo visto più di trecento bambini e ragazzi e molti si sono distinti per le loro capacità logiche. Ho notato con piacere che la percentuale di ragazze era molto alta e che quasi sempre erano più propense al ragionamento. Si impegnavano molto, cercavano di capire e di proporre soluzioni. Speriamo che crescendo non cadano nel solito stereotipo dei mestieri da maschi e da femmine.

Ovviamente non diventeranno certo tutti dei programmatori ma l'importante per me è che abbiano capito come si affrontano e si scompongono i problemi e come si risolvono ragionandoci sopra.

Raspberry PI access point


Eccomi di nuovo a parlare del Raspberry PI e di come configurarlo per trasformarlo in un access point.
Ripartiamo dal punto in cui ci siamo fermati nell'ultimo articolo: l'intento è quello di trasformare un Raspberry PI in un access point e un server web e portarlo alle mie lezioni di programmazione. In questo modo posso far scaricare ai ragazzi il programma di installazione di Scratch attraverso un sito interno che tutti possono vedere tramite la rete wireless.

Premetto subito che non scriverò una guida ma mi limiterò a dare link a guide già fatte e aggiungere le mie considerazioni. Questo per due motivi: il primo è che non ho tempo di fare delle guide fatte bene. In questo periodo capita spesso di non avere neanche il tempo di dormire quindi rischierei di fare una guida fatta male e molto stringata; il secondo è che mi sembra inutile: cercando in rete se ne trovano tantissime quindi mi sembra ridondante produrre l'ennesima guida per fare questo progettino. Trovo utile invece riassumere tutto in queste pagine visto che vengono toccati molti temi e le persone potenzialmente interessate possono in questo modo avere tutto condensato in un unico sito.

Detto questo iniziamo.

Occorrente per questo progetto:
  • Raspberry PI 3. Si può trovare online su molti siti che vendono materiale elettronico o anche su Amazon, basta fare una semplice ricerca. Il costo è circa 40 euro.
  • Scheda microSD da almeno 4Gb (consiglio di prenderne una veloce, Class 10 da 8Gb)
  • Alimentatore da almeno 1A a 5V. Il Raspberry ha un consumo variabile a seconda del carico di lavoro e anche di quali periferiche sono connesse (mouse, tastiera, hard disk esterni, chiavette). Il connettore è micro usb quindi un caricabatterie da cellulare o tablet va bene (a patto che abbia almeno le caratteristiche che ho appena scritto). Esiste in vendita anche l'alimentatore ufficiale per il Raspberry che eroga 2.5A.
  • Inizialmente una tastiera, un mouse, un cavo hdmi per connetterlo ad un monitor. Dico inizialmente perchè per quello che devo fare io potrà successivamente essere utilizzato connettendo semplicemente l'alimentatore e il cavo di rete, e a volte anche quest'ultimo sarà opzionale.
  • Non indispensabile: case per il Raspberry. Il Raspberry viene venduto "nudo", cioè la scheda è senza scatolina ma se avete già fatto la ricerca per comprarlo avrete già visto sicuramente che gli accessori non mancano. Io non ho comprato un case perchè me lo sono stampato con la stampante 3d, ma questo punto lo riprenderò nel prossimo articolo.
Il primo link che voglio mettere è la documentazione ufficiale del Raspberry. La trovo veramente ben fatta e molto semplice. Questo è il punto di partenza per chi si trova in mano per la prima volta questa schedina elettronica.

Al primo punto della mia check list ho scritto che voglio installare Raspbian. Il download si può fare da questa pagina e sempre da lì si può leggere la documentazione su come mettere il file scaricato sulla microSD.

Al secondo punto ho scritto che voglio configurarlo come access point.
In questa guida presa dal sito Adafruit possiamo capire come fare. Questo sito vale la pena girarlo un po' perchè oltre a vendere componenti elettronici ha anche una sezione enorme con guide fatte molto bene e una marea di progetti interessanti anche per scopi didattici.

Al terzo punto abbiamo il web server: io ho installato Apache. In questo articolo preso dal sito Raspbian trovate un mini howto e questo è il sito ufficiale dove trovare la documentazione completa.

Se siete arrivati fino qui e avete completato tutti i passi adesso avete in mano un mini computer che può funzionare sia da PC normale che da dispositivo di rete per dare connettività Wi-Fi ad altri dispositivi. Può essere utilizzato per imparare i vari linguaggi di programmazione per il web (avete un web server adesso, usatelo!); può essere usato per imparare le basi dell'elettronica e il linguaggio di programmazione Python utilizzando le librerie già fatte per la GPIO (serie di pin presenti sulla scheda ai quali si possono connettere componenti elettronici) e può essere usato anche come router Wi-Fi come sto facendo io. Volendo si potrebbe anche inserire una chiavetta internet usb e trasformarlo in un router mobile, così si può usare come router anche dove non c'è la connessione ADSL. Insomma, si può trasformare in quello che volete. L'importante è giocarci ed imparare un sacco di cose :)

Nel prossimo articolo vedremo altri aspetti: come creare un pulsante di spegnimento, la stampa 3D del case e i tool di monitoraggio dei servizi.


Raspberry PI multifunzione

Come dicevo in questo post nelle prossime settimane io, Serena ed Emiliano saremo abbastanza impegnati: dovremo fare 7 lezioni di programmazione con Scratch a più di 300 bambini e ragazzi a Granarolo.

Saremo all'interno della scuola primaria e faremo ad ogni incontro due sessioni parallele, una nell'aula computer e l'altra in un'aula normale, quindi i bambini che non saranno in aula computer dovranno portare il proprio pc.
Prima di iniziare la lezione dovremo assicurarci che tutti abbiano installato Scratch e nel caso installarlo. A questo punto però si apre un tema legato alla sicurezza: potremmo mettere a disposizione di tutti delle chiavette, ma così facendo corriamo il rischio di far circolare dei virus se anche solo uno dei pc è infetto.

La soluzione che ho trovato a mio parere è molto carina, assolutamente sovradimensionata rispetto al problema, ma poi mi servirà anche per altre cose quindi ho approfittato per implementarla: un Raspberry PI configurato per fare da access point e da server web.
Lo so, sarebbe bastato fare dei cd o delle chiavette in sola lettura ma se mi fossi accontentato non avrei potuto documentare il fatto che "si può fare" :) e soprattutto che si può fare con software open source.

Ma procediamo con ordine.

Domanda 1: cos'è un Raspberry PI? è un computer molto piccolo e a basso costo, tutto condensato in un'unica schedina elettronica grande come un pacchetto di sfazzoletti, ma con prestazioni decenti. Ha un processore quad core da 1,2Ghz, 1Gb di RAM e un alloggiamento per metterci una microSD. Ha integrati Wi-Fi, Bluetooth e ethernet.

Raspberry PI 3 di Simone Bacciglieri
Non sto a dilungarmi troppo su dettagli tecnici, questo è il link al sito ufficiale per i curiosi.
Ci sono vari sistemi operativi che possono essere installati sul Raspberry, io ovviamente installo Raspbian, una derivata di Debian (una versione di Linux) fatta apposta per quella tipologia di computer.
Un'altra caratteristica molto importante è il fatto di poter aggiungere componenti elettronici (come led, sensori, motorini ecc) direttamente sulla scheda e programmarli a piacere. Cercando in giro per la rete si trovano un sacco di progetti didattici legati al Raspberry e molti negozi online vendono anche kit con dentro tutto il necessario per iniziare ad usarlo e fare esperimenti di elettronica. Consiglio vivamente di fare qualche ricerca, partendo proprio dal sito ufficiale.

Domanda 2: cos'è un access point? Un access point è un apparato che consente ad altri dispositivi di connettersi ad una rete tramite Wi-Fi.
Ormai tutti i router che vengono consegnati dai vari fornitori di connettività internet fanno anche da access point. In questo modo tutti i dispositivi di casa (telefoni, tablet, computer ecc..) possono connettersi ad internet tramite Wi-Fi.

Domanda 3: cos'è un web server? Contro domanda: avete mai visitato un sito web? Se state leggendo queste righe sicuramente sì. Un sito web è un insieme di pagine che non sono altro che files di testo salvati su un computer connesso in rete.
Un web server è un programma installato su questo computer che aspetta di essere contattato da altri dispositivi sulla rete. In quel momento fornisce loro le pagine del sito richieste. In pratica quando andate su un sito il browser del vostro pc chiede al server web che lo contiene di passargli la pagina che avete chiesto e poi ve la mostra.
In realtà il discorso è molto più complesso e articolato di così ma a me interessa spiegare a grandi linee a chi non è addetto ai lavori come funzionano queste cose, poi fornire link per approfondimenti ai più curiosi.

A questo punto il discorso si fa un po' più chiaro:

  • installo Raspbian sul mio Raspberry
  • lo configuro in modo da farlo diventare un access point
  • installo un server web
  • scarico dal sito di Scratch tutti i files necessari per installarlo sui pc
  • creo una paginetta con i link per fare in modo che tutti prendano i files dal Raspberry
Nel prossimo post vedremo come fare tutto questo.

Lezioni di programmazione con scratch a Granarolo



E passato più di un anno da dalla mia ultima lezione di programmazione ma non sono stato con le mani in mano: ho fatto una macchinina programmabile con Arduino e mi sono finalmente buttato sulla stampa 3d, ma questo discorso merita uno (o più) post a parte.
Serena invece si è data da fare parecchio sia al Fisiclab che al Centec, ma anche questo sarà argomento di post successivi.

Ma torniamo al presente.
Qualche tempo fa sono stato contattato di nuovo da Giuliana Bertagnoni, assessore alla cultura di Granarolo dell'Emilia, e da Lucia Mastroiacovo.
Con loro ho fatto due lezioni di programmazione con Scratch nella biblioteca di Granarolo.

L'idea iniziale era di non fare una lezione sola in biblioteca ma di fare qualcosa di più strutturato in modo da dare la possibilità a più ragazzi possibile di partecipare.

Dopo esserci confrontati abbiamo deciso di tentare un progetto ambizioso: fare una lezione di programmazione a tutti i bambini e ragazzi delle scuole primarie (dalla terza in su) e secondarie di Granarolo. In più chiedere al Liceo Copernico e al liceo Sabin qualche studente per affiancarci.

Abbiamo mandato la comunicazione a tutti i genitori degli alunni dell'istituto comprensivo per capire quanti erano interessati a questo progetto e la risposta è stata impressionante: 307 iscrizioni tra primaria e secondaria.

Alcuni studenti del Sabin e del Copernico parteciperanno e le loro ore saranno inserite all'interno del progetto scuola lavoro.

Adesso comincia la parte operativa: da sabato prossimo 4 febbraio io, Serena ed Emiliano faremo sette incontri con due lezioni parallele ognuno.

Come sempre i lavori che faremo verranno inseriti nella sezione documenti di questo sito in modo da dare la possibilità di scaricarlo sia a chi non è riuscito a terminarlo sia a tutti quelli che capitano qui e vogliono vedere, provare e modificare il nostro lavoro.

Come si dice di solito: hai voluto la bicicletta...

Internet of things


Oggi, 9 giugno, sono stato a SMAU Bologna.
Alle 10:00 è iniziato un talk su Internet of things e ovviamente mi sono seduto ad ascoltare. Il relatore ha iniziato facendoci immaginare l'inizio di una giornata tipo in un mondo pervaso da oggetti che dialogano fra di loro: la sveglia suona con la mia musica preferita scelta in base alle mie preferenze sul cloud; quando la spengo avvisa il tostapane e la caffettiera che sono vivo e che devono iniziare a scaldarsi; mentre faccio la doccia la mia app per cellulare in base al meteo sceglie per me i vestiti dall'armadio e il frigo ordina il latte visto che sta finendo.

Da qui ha iniziato a spiegare le varie tecnologie e come possono parlare fra di loro gli oggetti descrivendoci un mondo meraviglioso dove i lavori da "mamma" o "moglie" (???) da ora in poi li faranno direttamente i nostri elettrodomestici. Ha infine spiegato che la nostra carta di credito può essere virtualizzata nel nostro cellulare e che già ora possiamo aprire le porte dell'ufficio o della casa via bluetooth.

Tutto bellissimo. Cinquanta minuti di orgasmi tecnologici. Finito di parlare chiede se ci sono domande e io mi alzo chiedendo: "In tutto questo come siamo messi a sicurezza informatica?". Lui dà risposte un filino evasive come: "Ecco, lo sapevo che l'unico con i capelli lunghi in sala avrebbe fatto una domanda del genere." e poi: "La sicurezza è compito di chi sviluppa le app". Io replico dicendo: "Sì ma siccome il centro di tutto è il cellulare e tutti sappiamo che è lo strumento più bucabile e bucato come facciamo ad evitare casini?". Lui risponde: "Ok, allora diciamo che al giorno d'oggi questo tipo di tecnologie è fatto soprattutto per cellulari aziendali, che hanno un livello di sicurezza più alto".

La mia sensazione è che si stia trascurando totalmente questo aspetto.
Questa persona secondo me non c'era o non si ricorda più quando Telecom e amici distribuivano a tutti dei router wireless senza nessun tipo di protezione. A tutti, privati e aziende. Non si ricorda più i casini che sono venuti fuori da queste leggerezze: allora bastava girare per strada e, connettendosi alla rete wireless di chiunque, si poteva fare qualunque cosa con la sicurezza di non essere beccati, tanto la linea era intestata al malcapitato di turno.

Il problema grosso è questo: finchè si continuerà a spendere il 90% a rendere un prodotto figo e il 10% (forse) a renderlo sicuro le cose non faranno che peggiorare finchè non ci ritroveremo di nuovo a vedere un'ondata di denunce da parte di persone che, ignare di quello che stanno facendo i dispositivi si troveranno la polizia in casa e i conti svuotati.

La sicurezza informatica non è un optional e anche le persone non addette ai lavori devono essere informate dei rischi che corrono. Io non ne posso più di sentire persone che dicono "eh possono anche entrarmi nel cellulare tanto io non ho niente da nascondere" e soprattutto non ne posso più di sentire addetti ai lavori che trascurano completamente questo aspetto.

Io mi immagino una giornata tipo fra qualche anno: la sveglia suona ad un orario sbagliato suonando la tromba da stadio; lo sfortunato cerca di spegnerla ma non ci riesce; il tostapane sta prendendo fuoco ma fortunatamente viene spento dagli schizzi di acqua in ebollizione della caffettiera; il frigo è spento e ha ordinato 2000 euro di cose a caso; l'app "armadio" è in crash e lo scopettino del cesso avverte che non c'è più un soldo in banca; in casa non c'è più niente perchè le porte sono state aperte tutta la notte: le ha aperte via internet un ragazzino che abita a 3000km da lì. Lo sfortunato urlando si chiede: "Perchè è successo questo? Io ho un telefono aziendale!".

Appuntamento a SMAU 2017 per chiederlo a quel relatore!

Una macchina programmabile - prime prove

Eccoci al quarto post relativo al mio progetto con Arduino: una macchina programmabile.
Questi sono i link del primo, secondo e terzo post

Il telaio è pronto, la pulsantiera anche. Tutti i componenti sono montati.
Questo è il risultato finale:

Macchina programmabile finita Simone Bacciglieri
Si può vedere anche il dettaglio della posizione della batteria da 9V.
In questa foto invece si vede come il led si incastri perfettamente all'interno del buco del Lego.
Led Lego Brick

Ho fatto anche uno schema con Fritzing per far capire meglio come ho collegato il tutto. A questo però bisogna aggiungere lo schema della pulsantiera che ho inserito nel terzo post.

schema macchina programmabile Simone Bacciglieri

Questo è il programma che ho scritto:

/* Software per la macchina programmabile */
/* Simone Bacciglieri */

#include <Servo.h>

Servo servoleft;
Servo servoright;

//Array contenente tutte le istruzioni da eseguire.
//Nessuna istruzione = 0
//AVANTI = 1
//INDIETRO = 2
//DESTRA = 3
//SINISTRA = 4
int instructions[100];

int sLeft = 9;
int sRight = 8;

//Front left led
int flLed = 10;
//Front right led
int frLed = 11;
//Rear left led
int rlLed = 12;
//Rear right led
int rrLed = 13;

//Push button panel led
int bPanelLed = 7;

//Flag per sapere se sono in modalità inserimento comandi
int insertMode = 0;
//Posizione dell'ultima istruzione nell'array
int currentPosition = 0;

void setup() {
  Serial.begin(9600);

  pinMode(sLeft, OUTPUT);
  pinMode(sRight, OUTPUT);

  // Nei servo normali l'argomento del metodo write è la posizione angolare.
  // In quelli a rotazione continua invece
  // 0 vuol dire ruota avanti alla massima velocità
  // 180 vuol dire ruota indietro alla massima velocità
  // 90 vuol dire fermo
  servoleft.attach(sLeft);
  servoleft.write(90);
  servoright.attach(sRight);
  servoright.write(90);
 
  pinMode(flLed, OUTPUT);
  pinMode(frLed, OUTPUT);
  pinMode(rlLed, OUTPUT);
  pinMode(rrLed, OUTPUT);

  pinMode(bPanelLed, OUTPUT);

  //Abilito la resistenza interna di pullup sul pin A0
  pinMode(A0, INPUT_PULLUP);
  //Tutti i led spenti
  digitalWrite(flLed, LOW);
  digitalWrite(frLed, LOW);
  digitalWrite(rlLed, LOW); 
  digitalWrite(rrLed, LOW);

  digitalWrite(bPanelLed, LOW);
 
  Serial.println("Inizio");
}

void loop() {
  // Leggo il valore che mi arriva dalla pulsantiera
  int buttonsPanel = analogRead(A0);
  // Un po' di debug
  Serial.println(buttonsPanel);
  // Se il flag insertMode è a 0 eseguo immediatamente l'istruzione relativa al tasto premuto
  // Altrimenti la inserisco nell'array delle istruzioni
  switch (buttonsPanel) {
    case 15 ... 30:
      Serial.println("Bottone AVANTI premuto");
      delay(500);
      insertMode ? carSet(1) : fw();
      break;

    case 122 ... 142:
      Serial.println("Bottone INDIETRO spremuto");
      delay(500);
      insertMode ? carSet(2) : back();
      break;

    case 166 ... 175:
      Serial.println("Bottone SX spremuto");
      delay(500);
      insertMode ? carSet(4) : left();
      break;

    case 72 ... 82:
      Serial.println("Bottone DX spremuto");
      delay(500);
      insertMode ? carSet(3) : right();
      break;

    case 277 ... 284:
      Serial.println("Bottone STOP spremuto");
      delay(500);
      carStop();
      insertMode = 0;
      break;

    case 243 ... 251:
      //Hanno premuto SET quindi devo iniziare ad immagazzinare le istruzioni
      Serial.println("Bottone SET spremuto");
      delay(500);
      //Azzero l'array
      for (int i = 0; i < 100; i++) {
        instructions[i] = 0;
      }
      insertMode = 1;
      currentPosition = 0;
      break;

    case 207 ... 214:
      //Hanno premuto GO quindi devo eseguire tutte le istruzioni dell'array
      Serial.println("Bottone GO spremuto");
      delay(500);
      carGo();
      insertMode = 0;
      break;

    default:
      Serial.println("Nessun tasto spremuto");
      break;
  }
}

void ledBlink() {
  digitalWrite(bPanelLed,HIGH);
  delay(150);
  digitalWrite(bPanelLed,LOW);
  delay(150);
}

void fw() {
  Serial.println("Avanti");
  //Accendo i led anteriori e spengo quelli posteriori
  digitalWrite(flLed, HIGH);
  digitalWrite(frLed, HIGH);
  digitalWrite(rlLed, LOW);
  digitalWrite(rrLed, LOW);
  //I servo devono girare  in direzioni opposte per andare nello stesso verso
  //Sono montati in direzioni opposte
  servoleft.write(0);
  servoright.write(116);

  for(int i=0;i<8;i++) {

    ledBlink();
  }
  carStop();
}

void back() {
  Serial.println("Indietro");
 
  digitalWrite(flLed, LOW);
  digitalWrite(frLed, LOW);
  digitalWrite(rlLed, HIGH);
  digitalWrite(rrLed, HIGH);

  servoleft.write(180);
  servoright.write(60);

  for(int i=0;i<8;i++) {
    ledBlink();
  }
  carStop();
}

void left() {
  Serial.println("Sinistra");
 
  digitalWrite(flLed, HIGH);
  digitalWrite(frLed, LOW);
  digitalWrite(rlLed, HIGH);
  digitalWrite(rrLed, LOW);
  // Il servo sinistro è fermo mentre quello destro gira
  servoleft.write(90);
  servoright.write(180);

  for(int i=0;i<3;i++) {
    ledBlink();
  }
  carStop();
}

void right() {
  Serial.println("Destra");
  // Il servo sinistro gira mentre quello destro è fermo
  digitalWrite(flLed, LOW);
  digitalWrite(frLed, HIGH);
  digitalWrite(rlLed, LOW);
  digitalWrite(rrLed, HIGH);

  servoleft.write(0);
  servoright.write(90);

  for(int i=0;i<3;i++) {
    ledBlink();
  }
  carStop();
}

void carStop() {
  //Fermo la macchina e spengo tutto
  Serial.println("Ferma");
 
  digitalWrite(flLed, LOW);
  digitalWrite(frLed, LOW);
  digitalWrite(rlLed, LOW);
  digitalWrite(rrLed, LOW);

  servoleft.write(90);
  servoright.write(90);
}

void carGo() {
  Serial.println("Via");
  //Quando incontro il valore 0 vuol dire che sono finite le istruzioni
  for (int i = 0; i < 100; i++) {
   
    switch (instructions[i]) {
      case 0:
        //Fine istruzioni
        carStop();   
        break;
      case 1:
        //Avanti
        fw();
        break;
      case 2:
        //Indietro
        back();
        break;
      case 3:
        //Destra
        right();
        break;
      case 4:
        //Sinistra
        left();
        break;
    }
  }
}

void carSet(int instruction) {
  Serial.println("Set");
  // Inserisco nell'array l'istruzione relativa al pulsante premuto.
  // Se arrivo all'ultima istruzione segnalo facendo blinkare il led.
  if (currentPosition > 98) {
    Serial.println("Raggiunto il limite massimo di istruzioni");
    for(int i=0;i<14;i++) {
      ledBlink();
    }
  }
  instructions[currentPosition] = instruction;
  currentPosition++;
}



Ho iniziato a fare un po' di prove e ho notato subito un problema: i due servo motori non vanno alla stessa velocità. Ho provato a variare il parametro che passo alla funzione write ma, anche se la situazione è migliorata, non sono riuscito a farla andare perfettamente dritta.
Una volta risolto questo problema posso dire di aver raggiunto l'obiettivo che mi sono dato nel primo post e posso iniziare ad estendere il progetto: per prima cosa voglio mettere il sensore ad ultrasuoni perchè ho visto che i miei figli quando la usano la fanno sbattere da tutte le parti, quindi è bene che sappia fermarsi in tempo da sola. :)

Una macchina programmabile - la pulsantiera

Questo è il terzo post che dedico al mio progettino: costruire una macchina programmabile utilizzando Arduino e Lego.
Nel primo post ho spiegato a grandi linee cosa volevo fare, mentre nel secondo ho iniziato ad elencare i componenti e ho descritto come voglio realizzare il telaio.

Adesso è ora di parlare della pulsantiera, forse la parte più difficile di questo progetto.
Come dicevo deve avere 7 pulsanti e un led e deve utilizzare meno pin possibile.

Cercando un po' in rete ho visto che si puo' utilizzare un solo pin analogico  dell'Arduino in modalità pull-up, collegando pulsanti e resistenze in modo che diventi un partitore resistivo.

Per maggiore chiarezza ho fatto lo schema con Fritzing, un programma open source per creare schemi elettronici.
Schema pulsanti partitore resistivo progetto macchina programmabile di Simone Bacciglieri

Le resistenze sono collegate tra loro in serie e dopo ogni resitenza c'è il piedino di un pulsante: l'ultima resitenza è collegata a massa.
L'altro piedino di ogni pulsante è collegato al pin analog0 dell'Arduino configurato, come detto prima, in modalità pull-up. In questa configurazione il pin è connesso ai 5V dell'Arduino tramite una resistenza interna detta di pull-up.

Quando nessun pulsante è premuto il circuito è aperto e il pin analog0 segna i 5V a cui è attaccato; quando invece premiamo un pulsante il circuito si chiude ma prima di arrivare alla massa deve passare attraverso le resistenze successive al tasto premuto.
In questo modo abbiamo creato un partitore resistivo tra la resistenza di pull-up e tutte le altre in serie.

I pin analogici in realtà non sono analogici, ma restituiscono un valore tra 0 e 1024 a seconda della tensione in ingresso.

Quando abbiamo controllato i valori con Arduino ci siamo resi conto che non erano stabili quindi per ogni tasto abbiamo dovuto identificare un range di ingresso.
Questo è il codice utilizzato:

  int buttonsPanel = analogRead(A0);
  Serial.println(buttonsPanel);

  switch (buttonsPanel) {
    case 15 ... 30:
      Serial.println("Bottone AVANTI premuto");
      delay(500);

      break;

    case 122 ... 142:
      Serial.println("Bottone INDIETRO premuto");
      delay(500);
      break;

    case 166 ... 175:
      Serial.println("Bottone SX premuto");
      delay(500);
      break;

    case 72 ... 82:
      Serial.println("Bottone DX premuto");
      delay(500);
      break;

    case 277 ... 284:
      Serial.println("Bottone STOP premuto");
      delay(500);
      break;

    case 243 ... 251:
      Serial.println("Bottone SET premuto");
      delay(500);

      break;

    case 207 ... 214:
      Serial.println("Bottone GO premuto");
      delay(500);

      break;


Questo è il lavoro finito:

Pulsantiera partitore resistivo di Simone Bacciglieri

Il led al centro condivide solo la massa con il resto del circuito. L'altro piedino va direttamente ad un altro pin dell' Arduino e viene usato come di consueto.

Il telaio ha subito una modifica: non ha più due ruote davanti ma una sola girevole.

Macchina programmabile di Simone Bacciglieri


Per oggi è tutto, vediamo se riuscirò a farla funzionare :)

Progetto per bambini con Arduino

Sono parecchi mesi che non scrivo più nulla su questo blog, soprattutto non scrivo più nulla sulle lezioni di programmazione per bambini. Questo perchè alcune cose sono cambiate e io e Serena stiamo cercando di capire come dare seguito a questa attività.

Durante questo periodo di "pausa", se così lo possiamo chiamare, mi sto cimentando in un progetto con Arduino.
arduino uno

Nulla di nuovo, ho visto in rete che varie persone hanno già fatto la stessa cosa, però volevo provare lo stesso.



Sto facendo una macchinina
programmabile, cioè una macchinina che prende in input una sequenza di comandi e poi li esegue una volta dato il via.
Il gioco da fare con i bambini a questo punto è creare un percorso e programmare la macchinina in modo che riesca a seguirlo tutto da sola.
A loro sembra un gioco ma in realtà questo serve per dargli le prime informazioni su come creare un programma, cos'è un'istruzione e cosa succede se si eseguono istruzioni sbagliate.
Inoltre imparano a pianificare le azioni che la macchina dovrà eseguire e prevederne gli errori.

Se viene bene può essere una bella idea utilizzarla anche durante le lezioni di programmazione.

Finita la premessa passiamo ai requisiti che mi sono dato:
  • Deve essere il più possibile autocostruita. Non voglio comprare uno di quei kit completi che si trovano nei siti di elettronica.
  • Deve essere indipendente (cioè deve andare a batterie, non voglio cavi di collegamento al pc)
  • Non deve essere telecomandata: tutto risiede nella macchina e quando si avvia non deve esserci possibilità di cambiare i comandi
  • Deve andare nelle quattro direzioni: avanti, indietro, destra e sinistra
  • Deve accettare input sulle direzioni attraverso una pulsantiera
  • Deve essere espandibile. Visto che sicuramente  mi verrà voglia di aggiungerci di tutto dovrò usare i pin dell' Arduino e la breadboard con parsimonia.
  • Deve essere bella!
In questi post cercherò di documentare tutto quello che sto facendo, in modo da condividere con tutti la mia esperienza ma anche di dare la possibilità a chi ne sa più di me di dirmi cosa ho sbagliato o cosa posso migliorare.
Spero che questi ultimi commentino le mie pagine così anche gli altri potranno leggere quali sono stati i miei errori e non replicarli :)

Una macchina programmabile


Una macchina programmabile

Come dicevo in questo post ho iniziato a costruire una macchina programmabile con Arduino.
I componenti che mi servono per realizzarla sono:
  • un Arduino uno
  • due led ad alta luminosità rossi
  • due led ad alta luminosità blu
  • un led verde
  • cinque resistenze da 220 Ohm
  • sei resistenze da 2200 Ohm
  • due servomotori a rotazione continua
  • una batteria da 9V
  • una breadboard
  • sette pulsanti
  • cavi di collegamento per la breadboard
Il telaio ho pensato di costruirlo con i Lego Technics, visto che ne ho già in abbondanza.
Nella foto si può vedere la prima prova. I due servomotori sono già posizionati e hanno già le ruote fissate; sulla parte blu voglio metterci l'Arduino, sopra i servomotori metterò la breadboard e sulla parte anteriore metterò la pulsantiera.

telaio macchina programmabile creato con lego technics


I quattro led ad alta luminosità mi servono per i fari mentre quello verde mi serve per la pulsantiera. Darà un minimo di feedback durante l'immissione dei comandi.
I led dei fari si illumineranno a seconda della direzione.

La pulsantiera merita un discorso a parte: devo prevedere 4 pulsanti direzione più il pulsante per iniziare l'immissione dati (set), quello per far partire la macchina e il pulsante stop. Vorrei creare qualcosa di definitivo in modo da poterla riutilizzare anche in futuro senza ricominciare sempre tutto da capo.
In più vorrei che utilizzasse meno pin possibile, visto che voglio sette pulsanti non vorrei dover occupare sette pin dell'Arduino.

Se riesco a fare tutto vorrei aggiungere un sensore di prossimità ad ultrasuoni in modo che si fermi da sola se arriva troppo vicino ad un ostacolo.

Weekend da registi

Stop motion backstge

In casa siamo tutti amanti dei film in stopmotion, adoriamo Shaun the sheep, Timmy e amici. Dico adoriamo perchè anche gli "adulti" di Casa Bacciglieri sono in prima fila quando c'è a guardare quel genere di film.

Tempo fa feci un mini video con un paio di Lego utilizzando questa tecnica per far ridere i miei ragazzi ma dopo l'entusiasmo iniziale non hanno più fatto domande.
Ieri pomeriggio invece Matteo (7 anni) mi ha detto che gli sarebbe piaciuto fare un video con i Lego. Ho subito specificato che non è una cosa che si fa in 10 minuti, ma lui è rimasto della stessa idea: facciamo un film tutti insieme.
Non me lo sono fatto ripetere due volte. Ho preso il mio pc e una vecchia videocamera che ormai funziona solo se attaccata al computer (rovina tutti i nastri che le vengono inseriti e non ha più batteria); Matteo e Martina hanno creato la scenografia mettendo sul tavolo un tappeto con le strade disegnate e riempiendolo di Lego. Abbiamo aggiunto un po' di luci e ci siamo messi subito all'opera.
Siccome in casa Bacciglieri si usa quasi solo software libero nel mio pc è installato Linux come sistema operativo e per catturare le foto abbiamo usato stopmotion.

Abbiamo diviso il film in 3 parti: la prima parte dove io facevo il "tecnico" e loro pensavano a muovere i personaggi; la seconda ambientata nel castello dove Matteo ha fatto tutto da solo e la terza curata esclusivamente da Martina con le sue Lego Friends.
Alla fine dopo circa 3 ore di lavoro è venuto fuori un filmatino muto di un minuto e 30 secondi. Entrambi sono rimasti sbalorditi di quanto tempo ci voglia per creare un film del genere e, per capire meglio, abbiamo guardato un po' di backstage del film di Shawn the Sheep.

Il lavoro non è finito, adesso devono capire cosa vuol dire fare il montaggio, aggiungere l'audio e i titoli, ma sembrano motivati ad andare fino in fondo.
Per il montaggio useremo kdenlive, visto che Martina lo ha già utilizzato per un lavoro che ha dovuto fare per la scuola, mentre per l'audio registreremo le nostre voci con audacity (non oso pensare cosa ne uscirà :) ).

Qualsiasi cosa verrà fuori da questo esperimento per me è già stato un successone: i ragazzi hanno capito bene quanto lavoro si debba fare per far muovere i loro personaggi preferiti e, nondimeno, nel farlo si sono divertiti un sacco! Sono certo che da oggi apprezzeranno ancor di più i cartoni animati e di certo li guarderanno con occhi diversi.