Finalmente un po’ di tranquillit lavorativa, in queste feste natalizie incomincio a pensare ad alcune attivit ludico/creative/didattiche ecc… da proporre sia ai figlie, ma anche come strumento didattico da utilizzare per aggiungere una componente sperimentale da inserire nella lezione, ma anche per implementare percorsi creativi con studenti che hanno necessit di giungere al sapere per altre vie.
Faccio seguito ai miei precedenti due post sul MaKey MaKey:
e riapro la scatola di questa divertente scheda elettronica ed incomincio a diventar bambino anch’io… 🙂
Partiamo!
Premessa.
Questi passi sono ovviamente tratti dal tutorial ufficiale che trovate sulle pagine ufficiali a cui ho aggiunto io qualcosina.
Passo 1
Collegate il cavo USB tra MaKey MaKey e computer.
Passo 2
Appena collegate la scheda tutti i led disposti sul MaKey MaKeysi illumineranno dopo di che l’unico led a rimanere acceso sar quello power al di sotto del connettore USB. All’atto del collegamento del dispositivo il vostro computer potrebbe far aprire delle finestre popup in cui vi verr richiesto di installare dei driver, chiudetele, con MaKey MaKey non necessario installare nulla, questo vale per qualsiasi sistema operativo (MacOSX, Linux e Windows).
Procediamo nell’installazione di tutte le componenti necessarie per poter utilizzare il software di gestione dell’eZ430-Chronos su Ubuntu.
Il software eZ430-Chronos per Linux necessita delle TCL/Tk e se la vostra distribuzione Linux non la include installatela utilizzando i comandi apt-get:
[wpspoiler name=”Fasi di installazione tcl8.5 e tk8.5″]
[/wpspoiler]
Per generare gli eventi della tastiera e i click del mouse tramite i pulsanti dell’orologio è richiesta l’installazione di xdotool. Installate con il comando apt-get:
sudo apt-get install xdotool
[wpspoiler name=”Fasi di installazione di xdotool”]
[/wpspoiler]
Ora sul vostro computer avete creato l’infrastruttura necessaria per per poter procedere con l’installazione eZ430-Chronos Setup.
Inseriamo il CD-ROM e andate nella cartella:
software -> linux -> ez430-chronos installer
doppio click su chronos-setup:
[wpspoiler name=”Dove si trova chronos-setup?”]
[/wpspoiler]
[wpspoiler name=”Fasi di installazione di eZ430-Chronos”]
[/wpspoiler]
Conclusa l’installazione troverete nella vostra home directory la cartella: Texas Instruments dove sono allocati i file necessari per la gestione del vostro microcontrollore
[wpspoiler name=”Dove si trova il software installato?”]
[/wpspoiler]
Continuiamo con l’installazione…
inserite su una presa USB del PC l’access point RF dell’orologio:
Verificate nella directory /dev la presenza di /dev/ttyACMx, dove x specifica il numero della porta.
Se l’access point RF non viene montato in /dev/ttyACMx, impostate la variabile COM nel file eZ430-Chronos_CC_1_1.tcl e eZ430-Chronos_Datalogger_1_1.tcl in /dev/ttyACM0
Rendere eseguibili i due script: eZ430-Chronos_CC_1_1.tcl e eZ430-Chronos_Datalogger_1_1.tcl mediante il comando da terminale:
a questo punto potete avviare i due script da terminale:
./eZ430-Chronos_CC_1_1.tcl
e
./eZ430-Chronos_Datalogger_1_1.tcl
oppure facendo doppio click sul file e poi premendo su esegui.
Nel Control Center attivate la comunicazione tra computer e orologio facendo click su “Start Access Point” e sull’orologio selezionate con il pulsante # la funzionalità ACC o PPT e avviate la trasmissione premendo sul pulsante “freccia in basso”.
Il filmato che segue mostra il funzionamento dell’accellerometro a 3 assi, i grafici X, Y, Z in funzione del tempo mostrano i movimenti dell’orologio lungo i tre assi:
Con l’eZ430-Chronos potete pilotare il puntatore del mouse, ad esempio per il controllo di una presentazione PowerPoint su computer, dal Control Center attivate l’access point, selezionate la funzionalità ACC o PPT sull’orologio (pulsante #) e attivate la comunicazione con il pulsante “freccia in basso”, poi fate click sul pulsante “Mouse On (M)” (oppure premete il tasto M della tastiera) a questo punto potete pilotare il puntatore.
Di seguito il filmato che mostra il controllo del mouse:
La settimana scorsa ho acquistato un kit di sviluppo ez430 chronos basato sul microcontrollore 16 bit della Texas Instruments CC430F6137, dispositivo a bassissimo consumo destinato alla realizzazione di dispositivi portatili.
Il kit di sviluppo è un orologio sportivo water resistant fino a 30 metri con software e hardware open e quindi potete variarne ogni cosa, sul CD-ROM in dotazione trovate anche i PCB!
ez430 chronos è fornito con una chiavetta usb che permette di collegare direttamente al computer il microcontrollore ed una chiavetta RF.
Il display LCD a 96 segmenti è retroilluminato, è dotato di un accelerometro a 3 assi, termometro, altimetro e barometro, sensore voltaggio batteria, rilevatore di battito cardiaco che può ricevere da diversi sensori in commercio, pedometro, velocità bici e possibilità di controllare il PC mediante l’orologio come se fosse un mouse.
Potete programmare e aggiornare il software direttamente anche via radio.
Il costo del kit di sviluppo è di $49.00 (a cui andranno successivamente aggiunti 15 Euro di Dogana) dal sito della Texas Instruments ed è composto da:
Orologio wireless eZ430-Chronos con software già installato
chiavetta USB per programmazione e debugging
CC1111 USB RF access point
Cacciavite Phillips
viti di ricambio
CD contenente la documentazione e il software di sviluppo
Esistono 3 versioni che differiscono per la frequenza di funzionamento:
eZ430-Chronos-433 – 433 MHz
eZ430-Chronos-868 – 868 MHz
eZ430-Chronos-915 – 915 MHz
Io ho acquistato la versione a 915 MHz è mi è stata consegnata in 48 ore! Inoltre l’assistenza clienti di TI è ottima.
L’orologio viene fornito già programmato e lo potete usare subito come orologio sportivo, sul CD-ROM disponete del software necessario per usarlo anche come datalogger.
Si programma in C e sul CD-ROM avete alcuni esempi, in questi giorni di vacanza sto facendo alcuni esperimenti e se riuscirò realizzerò alcuni tutorial.
Gli ambienti di sviluppo funzionano su Windows e Linux, io per ora sto programmando su Ubuntu.
In ogni caso se volete approfondire l’argomento questi i due link di partenza:
Wiki EZ430-Chronos (su cui trovate tutto ciò che vi serve per capire come funziona e come si programma)
Nella precedente lezione abbiamo visto come progettare un controllo presenza in due stanze adiacenti in cui abbiamo utilizzato due pulsanti per simulare due sensori PIR (uno per ogni stanza) e due led per simulare l’accensione delle lampade nelle due stanze.
L’ultimo sketch consentiva di silmulare la seguente situazione per entrambe le stanze:
entro nella stanza
PIR avverte la mia presenza
si accende la luce
ritardo lo spegnimento della luce per darmi il tempo di uscire dalla stanza
In questa e nella successiva lezione vorrei giungere alla realizzazione di un comportamento più vicino alla realtà:
entro nella stanza
PIR avverte la mia presenza
si accende in fade la luce
esco dalla stanza
il PIR non rileva più la mia presenza
si spegne in fade la luce
Suddivido la soluzione del problema in due sottoproblemi che risolverò in questa e nella successiva lezione:
funzione fade
funzione controllo presenza
Realizziamo la funzione fade
Se ricordate nella lezione 2 abbiamo realizzato il famoso “blink” lo sketch che accendeva e spegneva in modo continuativo un LED.
Realizziamo nuovamente il circuito ed eseguite lo sketch allegato:
// Esempio 01: fare lampeggiare un LED
#define LED 13 // LED collegato al pin digitale 13
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
digitalWrite(LED, HIGH); // accende il LED
delay(1000); // aspetta 1 secondo
digitalWrite(LED, LOW); // spegne il LED
delay(1000); // aspetta 1 secondo
}
Provate a ridurre drasticamente il ritardo di accensione e spegnimento, arrivate a 10 millisecondi, quasi non dovreste più pecepire lampeggiare il LED e inoltre dovreste aver notato che la luminosità del LED è diminuita.
// Esempio 02: modulazione di larghezza di impulso (PWM)
#define LED 13 // LED collegato al pin digitale 13
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
digitalWrite(LED, HIGH); // accende il LED
delay(10); // aspetta 10 millisecondi
digitalWrite(LED, LOW); // spegne il LED
delay(10); // aspetta 10 millisecondi
}
Il motivo per cui si vede illuminare di meno il diodo LED è dovuta alla modulazione di larghezza di impulso in inglese Pulse Width Modulation – PWM, che detta in modo meno tecnico vuol dire che se facciamo lampeggiare un diodo LED ad una frequenza sufficientemente elevata e se cambiamo il rapporto tra il tempo in cui sta acceso ed il tempo in cui sta spento, il nostro occhio non percepirà il lampeggiare del LED ed inoltre a secondo del rapporto del tempo di accensione e spegnimento potremo regolare la luminosità del LED.
Possiamo dire che il PWM è una tecnica per ottenere risultati analogici con mezzi digitali.
Un po’ di teoria: il Duty cycle
Il duty cycle di un onda quadra/rettangolare e il rapporto tra la durata (in secondi) del segnale quando è “alto” ed il periodo totale del segnale. In altre parole è un numero che esprime quant’è la parte di periodo in cui il segnale è alto.
Facendo riferimento al disegno la formula che esprime il duty cycle è:
τ/T
dove T è il periodo e τ la parte di periodo in cui il segnale è alto.
Dalla formula potete subito notare che τ può variare da un valore minimo di 0 a un valore massimo pari a T, ciò implica che il valore del duty cycle varia da 0 a 1:
in entrambi i casi siamo in presenza di segnali continui.
Dalla formula possiamo comprendere quindi che il duty cycle è sempre un valore che varia tra 0 e 1.
Il duty cycle è spesso rappresentato in percentuale, D% e per ottenere la percentuale è sufficiente moltiplicare per 100 il rapporto τ/T, dire quindi che il D%=30% vuol dire che per il 30% del periodo totale il segnale si trova a livello alto, come conseguenza possiamo subito dire che il segnale sarà a livello basso per il restante 70% del periodo.
Dire quindi che il duty cycle è del 50% vuol dire che nel periodo T il segnale si mantiene alto per T/2 e per il restante T/2 a livello basso in questo caso siamo quindi in presenza di un’onda quadra.
Passiamo ora alla pratica
Poniamoci nelle seguenti 3 condizioni:
50% LED acceso e 50% LED spento
luminosità al 50%
25% LED acceso e 75% LED spento
luminosità al 25%
75% LED acceso e 25% LED spento
luminosità al 75%
Per realizzare le tre condizioni impostate scegliamo un periodo sufficientemente breve tale da non percepire il lampeggiare del LED:
Poniamo un periodo T = 20ms
10ms acceso e 10ms spento
5 ms acceso e 15ms spento
75 ms acceso e 5ms spento
// Esempio 03: modulazione di larghezza di impulso (PWM) - on: 10ms - off: 10ms
#define LED 13 // LED collegato al pin digitale 13
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
digitalWrite(LED, HIGH); // accende il LED
delay(10); // aspetta 10 millisecondi
digitalWrite(LED, LOW); // spegne il LED
delay(10); // aspetta 10 millisecondi
}
// Esempio 04: modulazione di larghezza di impulso (PWM) - on: 5ms - off: 15ms
#define LED 13 // LED collegato al pin digitale 13
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
digitalWrite(LED, HIGH); // accende il LED
delay(5); // aspetta 5 millisecondi
digitalWrite(LED, LOW); // spegne il LED
delay(15); // aspetta 15 millisecondi
}
// Esempio 05: modulazione di larghezza di impulso (PWM) - on: 15ms - off: 5ms
#define LED 13 // LED collegato al pin digitale 13
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
digitalWrite(LED, HIGH); // accende il LED
delay(15); // aspetta 15 millisecondi
digitalWrite(LED, LOW); // spegne il LED
delay(5); // aspetta 5 millisecondi
}
Dal filmato potete notare la variazione di luminosità nelle tre condizioni:
Con un po’ di esperimenti noterete che la tecnica di variazione della luminosità, utilizzando il ritardo “delay()”, non è il metodo migliore in quanto, non appena inseite altri sensori ad Arduino, oppure inviate dei dati alla seriale, il LED tremolerà nell’attesa che termini la lettura del sensore o la scrittura sulla seriale.
Come evitare questo problema?
Arduino UNO offre la possibilità di usare i pin 3, 5, 6, 9, 10, 11 l’istruzione: analogWrite(), istruzione che consente appunto di far lampeggiare il LED o governare un motore elettrico mentre lo sketch esegue altre istruzioni.
Sintassi:
analogWrite(pin, valore)
dove:
pin: è il piedino su cui inviamo il segnale, per Arduino UNO i pin 3, 5, 6, 9, 10, 11
valore: è il duty cycle compreso tra 0 (sempre off) a 255 (sempre on)
La funzione non restituisce nessun valore.
Quindi se utilizziamo la funzione analogWrite() per il controllo della luminosità del LED e scriviamo:
analogWrite(11, 0)
il LED collegato al pin 11 avrà una luminosità dello 0% (duty cycle 0%)
// Esempio 06: utilizzo della funzione analgoWrite() - LED spento - (duty cycle 0%)
#define LED 11 // LED collegato al pin digitale 11
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
analogWrite(LED, 0); // accende il LED
}
analogWrite(11, 64)
il LED collegato al pin 11 avrà una luminosità del 25% (duty cycle 25%)
// Esempio 07: utilizzo della funzione analgoWrite() - LED spento - (duty cycle 25%)
#define LED 11 // LED collegato al pin digitale 11
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
analogWrite(LED, 64); // accende il LED
}
analogWrite(11, 128)
il LED collegato al pin 11 avrà una luminosità del 50% (duty cycle 50%)
// Esempio 08: utilizzo della funzione analgoWrite() - LED spento - (duty cycle 50%)
#define LED 11 // LED collegato al pin digitale 11
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
analogWrite(LED, 128); // accende il LED
}
analogWrite(11, 191)
il LED collegato al pin 11 avrà una luminosità del 75% (duty cycle 75%)
// Esempio 09: utilizzo della funzione analgoWrite() - LED spento - (duty cycle 75%)
#define LED 11 // LED collegato al pin digitale 11
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
analogWrite(LED, 191); // accende il LED
}
analogWrite(11, 255)
il LED collegato al pin 11 avrà una luminosità del 100% (duty cycle 100%)
// Esempio 10: utilizzo della funzione analgoWrite() - LED spento - (duty cycle 100%)
#define LED 11 // LED collegato al pin digitale 11
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
analogWrite(LED, 255); // accende il LED
}
Nel filmato allegato potete notare la differenza di luminosità nelle 5 condizioni sopra illustrate.
Imparato come variare la luminosità del LED usando la funzione analogWrite(), vediamo come realizzare il fade del LED ovvero l’accensione e lo spegnimento graduale, attenzione che questo modo di procedere sarà utile anche quando dovremo imparare a variare la velocità di un motorino elettrico.
Lo schetch che vi allego è già presente negli esempi disponibili dal menù: File -> Examples -> 3.Analog -> Fading ne ho variato alcune parti:
// Esempio 11: Fading
#define LED 11 // LED collegato al pin digitale 11
int valoreFade = 0; // variabile usata per contare in avanti e indietro
void setup() {
pinMode(LED, OUTPUT); // imposta il pin digitale come output
}
void loop() {
// procede ciclicamente da 0 a 254 (fade in -> aumento luminosità)
for (valoreFade = 0 ; valoreFade < 255; valoreFade++) { analogWrite(LED, valoreFade); //impostiamo la luminosità del LED delay(10); // aspettiamo 10ms per percepire la viariazione di luminosità, //perché analogWrite è istantaneo } // procede ciclicamente da 255 a 1 (fade out -> diminuzione della luminosità)
for(valoreFade = 255 ; valoreFade > 0; valoreFade--) {
analogWrite(LED, valoreFade); //impostiamo la luminosità del LED
delay(10);
// aspettiamo 10ms per percepire la viariazione di luminosità,
//perché analogWrite è istantaneo
}
}
Analizzaimo il codice.
Prendiamo in analisi la prima parte del loop(). All’interno troviamo un primo ciclo for:
...
// procede ciclicamente da 0 a 254 (fade in -> aumento luminosità)
for (valoreFade = 0 ; valoreFade < 255; valoreFade++) {
analogWrite(LED, valoreFade); //impostiamo la luminosità del LED
delay(10);
// aspettiamo 10ms per percepire la viariazione di luminosità,
//perché analogWrite è istantaneo
}
...
Ad ogni ciclo incrementiamo la variabile valoreFade di 1 (valoreFade++) partendo da 0 fino a 254. valoreFade viene utilizzata in analogWrite(LED, valoreFade) per variare il valore del duty cycle ed incrementare la luminosità del LED. Poichè l’azione di analogWrite(LED, valoreFade) è immediata per percepire visivamente la variazione di luminosità introduciamo un piccolo ritardo di 10ms con delay(10). Il ciclo terminerà non appena la condizione valoreFade < 255 non è più vera, cioè valoreFade non più minore di 255.
Il secondo ciclo for consente di diminuire la luminosità:
...
// procede ciclicamente da 255 a 1 (fade out -> diminuzione della luminosità)
for(valoreFade = 255 ; valoreFade > 0; valoreFade--) {
analogWrite(LED, valoreFade); //impostiamo la luminosità del LED
delay(10);
// aspettiamo 10ms per percepire la viariazione di luminosità,
//perché analogWrite è istantaneo
}
...
Ad ogni ciclo la variabie valoreFade viene decrementata di 1 (valoreFade–) facendo decrescere valoreFade da 255 a 1 e di conseguenza la luminosità del LED. Il ciclo terminerà quando la condizione valoreFade > 0 non è più vera.
Usciti da questo secondo ciclo si ripartirà con il primo ciclo for che permetterà nuovamente l’aumento della luminosità del LED.
Nella prossima lezione vedreme come interagire mediante pulsanti sull’intensità luminosità del LED.
In questa lezione vi mostrerò come utilizzare il sensore luminoso: LilyPad Light Sensor acquistato presso SparkFun.
Passo 1
Come per le lezioni precedenti utilizziamo un cartocino di forma circolare per proteggere il circuito e per aumentare la presa dei morsetti a coccodrillo.
Passo 2
Collegate come rappresentato nell’immagine il + del sensore luminoso a al + di LilyPad, il – del sensore luminoso al – di LilyPad e il piedino S del sensore al piedino A0 di LilyPad:
Passo 3
Avviate l’IDE Arduino
Passo 4
Copiate il codice allegato all’interno di una nuova finestra dell’IDE.
/* Arduino LilyPad: lezione 05: sensore di luce
* Uso del modulo LilyPad Light Sensor
* Michele Maffucci
* https://www.maffucci.it/
* Progetto originale:
* http://web.media.mit.edu/~leah/LilyPad/08_sensors.html
*/
int ledPin = 13; // il LED e' collegato al pin digitale 13
int sensorPin = 0; // il sensore di luce e connesso al piedino analogico 0
int sensorValue; // variabile per memorizzare il valore rilevato dal sensore
void setup()
{
pinMode(ledPin, OUTPUT); // imposta ledPin come pin di output
Serial.begin(9600); //inizializza la porta seriale
digitalWrite(ledPin, HIGH); // accende il LED
}
void loop()
{
sensorValue = analogRead(sensorPin); // legge il valore dal sensore
Serial.println(sensorValue); // invia il valore al computer
delay(100); // ritardo di 1/10 di secondo
}
Passo 5
Chiarimenti sul codice.
Vi ricordo che con l’istruzione:
Serial.begin(9600);
apriamo la porta seriale USB e la inizializziamo a 9600 bps.
delay() è un’istruzione molto semplice che non fa altro che interrompere per un determinato tempo l’esecuzione del programma.
L’istruzione ha un solo argomento numerico che indica il numero di millisecondi di attesa.
Quindi “delay(100)” vuol dire 100 millisecondi,
cioè 100/1000 secondi
ovvero 1/10 di secondo.
Passo 6
Compilate il codice ed effettuate l’upload su LilyPad, aprite la console di uscita:
Non appena il LED si accende su LilyPad, si vedranno i valori del sensore comparire nella console di uscita e l’intervallo di valori oscillerà tra 0 (buio assoluto) a 1024 (luce piena):