Vous êtes sur la page 1sur 223

3 Just another Getting Started 102 Analizzatore MIDI con Arduino

with Arduino
112 Progetto serra domotica open
13 Come scrivere una libreria per source
Arduino
121 Inverter ad onda sinusoidale
17 Sviluppo Software per Arduino Open Source con scheda
con Atmel Studio Infineon Arduino motor shield
125 Camera slider DIY low cost con
26 Programmare Arduino UNO con Arduino [Progetto completo]
Atmel Studio
135 Arduino Micro e BMP180 Bosch
34 Un encoder per Arduino per realizzare una Weather
Station
43 SMAs: gestiamo questi
materiali intelligenti con 150 Progetto Giardiniere: Gestire
Arduino una serra domestica con
Arduino
51 Realizzazione di un rilevatore
SONAR con Arduino 156 Un telecomando TV per
comandare un robot cingolato
64 Pi sprint alla tua auto con
Arduino e Processing 172 G.F.A.rduino (Generatore
di Funzioni Arbitrarie con
72 La regolazione di temperatura Arduino)
con Arduino 178 Arduino abbassa il volume degli
spot TV! [Fai-Da-Te]
80 MEMS, dalla teoria alla pratica:
usiamo un Accelerometro con 185 Stazione Meteo Online con
Arduino Arduino
87 Temperature & pressure 195 Crepuscolare fai-da-te con
monitoring con Arduino Arduino
95 Pilotare motori passo-passo 198 Realizziamo una Smart Sveglia
con Arduino Bluetooth con Arduino
98 Controllare I/O multipli con 214 Costruiamo un Voice Shield per
pochi pin di Arduino far parlare Arduino [Progetto
Completo Open Source]
{3

Speciale Arduino
TUTORIAL

Just another Getting Started


with Arduino di Luigi Francesco Cerfeda

C
ome gi saprete, il web pullula di pagine ticoli denominati Arduino DUE Tutorial.
dedicate ad Arduino. Facendo una breve Fatte queste considerazioni, mi sono chiesto
ricerca, infatti, si trovano uninfinit di tuto- quale contributo avrei potuto dare alla commu-
rial step-by-step e getting started che prepa- nity nello scrivere lennesimo articolo che riguar-
rano il novizio maker allutilizzo della scheda. dasse la mitica scheda made in Italy. Cos ho
Esistono anche moltissimi articoli che parlano deciso di descrivere semplicemente quali sono
della storia, ormai diventata leggenda, di Ar- state le mie impressioni, le difficolt che ho af-
duino e della filosofia che c dietro la scelta di frontato e come le ho superate nel mio primo
realizzare un progetto open source. Anche su approccio con la scheda, che in realt coincide
EOS, ovviamente, si parlato a fondo di questi anche con la mia prima esperienza con lelet-
argomenti. In particolare Piero Boccadoro si sta tronica pratica. E qui entra in gioco il nostro
occupando, in modo impeccabile ed esaustiva, Sheldon, il tizio, raffigurato nellimmagine di
della scheda Arduino DUE nella sua serie di ar- apertura, che guarda con sospetto e un po di
4} Speciale Arduino - TUTORIAL

timore la gente entusiasta che si appresta ad Cos Arduino?


entrare nellArduino Park. Cominciamo dal principio. Arduino da Dadone,
Per chi non lo sapesse, Sheldon Lee Cooper, o Arduino da Pombia, conosciuto come Ardui-
star della sit-com Big Bang Theory, un geniale no dIvrea, fu re dItalia dal 1004 al 1014..... No,
scienziato e fisico teorico, completamente av- scherzo, non da cos indietro !
verso allingegneria pratica, come a qualsiasi Il nome Arduino, del resto, con buona pace del
altra attivit umana che implichi uno sforzo fi- vecchio monarca, diventato famoso in tutto il
sico, a parte quella di premere ripetutamente i mondo solo mille anni dopo, grazie allintuizio-
pulsanti di un joystick o giocare alla Wii. ne di un team di tecnici ed ingegneri capitanati
Come ogni altro tutorial, anche il mio avr come da Massimo Banzi, professore allInteraction
destinatari i principianti dellingegneria pratica, Design Institute, un istituto di formazione post-
ma la cosa nella quale si distinguer da altri laurea con sede a Ivrea, luogo fondamenta-
che stato scritto da un principiante dellin- le per linformatica italiana dove gi la Olivetti
gegneria pratica e non da un professionista e/o aveva un tempo il suo nucleo.
smanettone navigato. User quindi un approc- Dal sito ufficiale:
cio newbie2newbie, se mi passate il termine.
Newbie, ahim, non per scelta, come nel caso di
Sheldon, ma per un motivo che credo sia abba-
stanza comune a tutti gli studenti di ingegneria
Arduino una piattaforma
di prototipazione elettronica
open-source che si basa su
in Italia, e cio, la cronica e patologica mancan- hardware e software flessibili
za di laboratori nelle universit. e facili da usare. stata creata
Prima di iniziare a descrivere la mia esperien- per artisti, designer, hobbisti e
za con la scheda, credo sia giusto dedicare due chiunque sia interessato a create
righe alla storia di Arduino, cercando di fare oggetti o ambienti interattivi.
il punto della situazione e delinearne lo stato telecomunicazioni e le industrie
dellarte dopo pi di 8 anni dalla sua nascita. mediche di utilizzo finale.
Per affrontare questo argomento si ormai cre-
ato uno standard, il quale prevede larticolazio- Arduino, dunque, un framework open source
ne del discorso sulla base di una pseudo-inter- che permette la prototipazione rapida e lappren-
vista con domande-risposte pensate ad hoc per dimento veloce dei principi fondamentali delle-
spiegare, in un modo pi user-friendly ed accat-
lettronica e della programmazione. composto
tivante, i vari aspetti del progetto Arduino e dello
da una piattaforma hardware alla quale viene af-
scenario hardware open source. Anchio far lo
stesso. fiancato un ambiente di sviluppo integrato (IDE)
Le domande di rito sono: Cos Arduino? A cosa multipiattaforma (per Linux, Apple Macintosh
serve? Chi lo pu utilizzare? Perch ha avuto un e Windows), scritto in Java e derivato dallIDE
cos grande successo? Si pu guadagnare con creato per il linguaggio di programmazione Pro-
lOpen Source?
cessing e per il progetto Wiring.
Bene, andiamo con ordine:
Speciale Arduino - TUTORIAL {5

A cosa serve? Chi lo pu utilizzare? anche semplicemente ci mette mani!), questo


Arduino progettato per risultare volutamente sistema pu sembrare una pazzia. E in effetti,
semplice, essendo destinato ad introdurre alla come disse lo stesso Banzi, c una sottile linea
programmazione ed allelettronica artisti, desi- di confine tra lopen source e la stupidit.
gner e costruttori di gadget fai-da-te. Il proget- In realt si visto che, sulla scia del software
to, infatti, prese avvio nel 2005 con lo scopo di open source, anche lhardware open source
rendere disponibile agli studenti dellInteraction funziona.
Design Institute un dispositivo per il controllo dei Una cosa fondamentale da capire per tentare di
loro progetti che fosse pi economico rispetto ai motivare questo successo che la forza di Ar-
sistemi di prototipazione allora disponibili. duino non la scheda, ma la sua Comunit.
Andando pi a fondo nello studio dellelettronica Banzi e il suo team, fondamentalmente, hanno
di Arduino, si pu notare che si tratta di una tec- capito che quando la gente ha accesso ai sor-
nologia abbastanza semplice, o meglio si trat- genti dei progetti, suggerisce modifiche. E non
ta di un progetto che mette insieme una serie solo.
di tecnologie standard, gi ampiamente usate Gli stessi utenti/clienti, a differenza che in pas-
e testate da community di ingegneri o semplici sato, sanno gi quello che vogliono e dunque
makers di tutto il mondo. Non si tratta dunque di risulta pi efficiente farlo progettare a loro. Per
hi-tech, o di elettronica di ultima generazione. avere successo in futuro, i produttori di har-
In un intervista, lo stesso Banzi afferma, addi- dware, infatti, dovranno cambiare radicalmente
rittura, che lelettronica di Arduino sia facilmen- mentalit. Il loro lavoro non pi soltanto quello
te replicabile da un diplomato ITIS. Proprio per di avere idee, ma altrettanto importante cer-
questa sua apparente semplicit, il progetto ha care e trovare innovazioni dagli utenti, i quali,
subto nel tempo numerose critiche; sempre nel- in sostanza, costituiscono anche il loro servizio
la stessa intervista Banzi ne cita una per tutte: tecnico, a disposizione 24 ore al giorno, 7 giorni
Arduino uno strumento per donne, pittori e alla settimana, senza alcuna spesa, sfruttando
artisti (che poi dove starebbe la critica non lho al massimo le potenzialit di internet e del Web
capito, vabb). 2.0. Questo sistema inoltre garantisce molta
pi pubblicit (gratuita) di quanta ne avrebbe
Ma allora, perch ha avuto un cos grande potuto ottenere un pezzo di hardware chiuso e
successo? proprietario.
Come gi detto in precedenza, Arduino un pro- Lunico elemento di propriet intellettuale che
getto completamente open source, quindi chiun- il gruppo si riservato stato il nome, che di-
que lo desidera pu legalmente e gratuitamente ventato il suo marchio di fabbrica, in modo che
scaricare lo schema elettrico e lelenco dei com- il brand sia ampiamente riconoscibile e che non
ponenti elettronici necessari e auto-costruirsi la venga danneggiato da copie di scarsa qualit.
scheda nella versione originale o derivarne una tutto questo che permette ad un progetto nato
versione modificata e, addirittura, rivenderla. in Italia, da un azienda con relativamente po-
Per chi abituato al sistema closed source, che risorse, di poter essere competitivo a livel-
dove tutto brevettato e guai a chi copia (o lo globale, e, addirittura, capace di indirizzare
6} Speciale Arduino - TUTORIAL

il mercato dellelettronica a basso costo verso branding giusto, si riesce a vincere nel mondo
la creazione di prodotti open source Arduino e che non ci vuole il permesso di nessuno per
compatibili, sia dal lato hardware che da quello rendere le cose eccezionali.
software.
OK, BASTA CHIACCHIERE, PASSIA-
Ma, in sostanza, possibile guadagnare MO A QUALCOSA DI PI PRATICO,
in un mondo di hardware open source? APPUNTO
Riflettendo sulle considerazioni fatte prima sul Come scrissi nel commento che poi mi ha fatto
perch Arduino ha avuto questo grande succes- vincere la scheda, Arduino DUE mi servirebbe
so, si pu facilmente rispondere anche a questa per controllare un motor driver che a sua volta
domanda. pilota i motori di un robot-rover 2WD in grado
Proprio grazie alla comunit che che si crea in- di muoversi in modalit CW, CCW, short-brake,
torno ad un progetto open source, in pratica, la-
e stop. Tale robot-rover, poi, dovrebbe essere
zienda produttrice pu usufruire di un notevole
usato come applicazione per una Brain Compu-
taglio ai costi di ricerca e sviluppo. Si crea,
ter Interface, e, nello specifico, funzionare come
cos, un circolo virtuoso in cui i clienti fanno
una sorta di pre-prototipo di una carrozzina
risparmiare lazienda produttrice che a sua volta
elettrica per disabili controllata grazie allela-
pu investire nella qualit del proprio prodotto e
borazione e traduzione del segnale EEG (il tutto
della documentazione offerta allutente, che, in
usando hardware e software open source). Un
fin dei conti, vede abbondantemente ripagato il
suo sforzo iniziale. progetto ambizioso, certo, ma lentusiasmo non

Insomma sembra proprio sia un sistema pi manca.


equo, pi democratico e, soprattutto, pi so- Non tutti quelli che, come me, sono alle prime
stenibile rispetto al vecchio sistema closed. armi, per, hanno la fortuna di avere gi ben in
Nel caso di Arduino, poi, si avuto questo gran- mente cosa realizzare con la propria scheda e,
de successo, e parliamo di un successo vera- paradossalmente, la scelta del progetto inizia-
mente enorme (basta vedere il numero di risul- le potrebbe essere gi un ostacolo difficile da
tati se si fa una ricerca su google), perch, come superare. In effetti, come detto prima, esistono
disse Emanuele in questo articolo, un progetto uninfinit di getting started e per il novizio ma-
molto cool, ormai un must-have per ogni nerd o ker questa abbondanza pu essere a volte pi
smanettone che si rispetti. Per inciso, Arduino frustrante che utile. Di solito, chi alle prime
deriva dal nome germanico Hardwin che, com- armi non possiede n attrezzatura n compo-
posto dalle radici hard (forte, valoroso) e win
nentistica elettronica e deve cominciare ad al-
(amico), significa amico valoroso ... insom-
lestire il proprio laboratorio da zero. Si va quindi
ma, GENIALE !
alla ricerca di un progetto che sia economico,
Ad ogni modo, riprendendo ancora le parole di
ben documentato, facile da realizzare ma che
Banzi, Arduino un grande esempio di come
allo stesso tempo dia delle soddisfazioni nella
combinando gli elementi del design, di cui lI-
realizzazione ed eventualmente nel suo utilizzo.
talia maestra, con la tecnologia e creando il
Speciale Arduino - TUTORIAL {7

Cercare un progetto che soddisfi queste caratte-


ristiche richiede tanto tempo e una buona dose
di pazienza, cosa che non tutti possiedono, so-
prattutto se si allinizio e si commette lerrore di
voler anticipare i tempi. C poi da considerare
che una soluzione perfetta non esiste e ogni vol-
ta che arriva a casa il materiale che si ordinato
si ha sempre qualche dubbio sulla bont della
scelta di un componente invece di un altro.
In questo articolo cercher di indirizzarvi su
cosa comprare e in che modo procedere per re-
un cavo USB con connettore micro-USB
alizzare un progetto economico che dia gi una
di tipo B, per il collegamento del proprio
discreta soddisfazione, partendo dalle basi
computer con Arduino attraverso la Pro-
dellelettronica e dellinformatica, in pratica dagli
gramming port, la porta di default per il
esempi gi presenti nelle librerie di Arduino. caricamento degli sketch; nel mio caso
Nello specifico, il progetto che propongo di rea- ho usato un connettore mini-USB con
lizzare un dispositivo interattivo che permet- adattatore da mini a micro;
te di accendere e spegnere un LED in base al
rilevamento della presenza di un ostacolo entro
una certa distanza limite. La scelta di proporvi
questo tipo di progetto deriva dalle considera-
zioni fatte precedentemente e dal fatto che un
sistema del genere sar implementato nel mio
progetto riguardo il robot-rover prototipo della
carrozzina per disabili. Come facilmente com-
prensibile, infatti, indispensabile che un dispo-
sitivo mobile che trasporta una persona disabile
un sensore di prossimit; nel mio caso lo
abbia autonomamente la capacit di individuare
Sharp GP2YOA21YK Infra Red Proximity
la presenza di ostacoli e fermarsi o effettuare
Sensor (economico, facilmente reperibile
prontamente una manovra in modo da evitare
e di cui esiste una ampia documentazio-
lo scontro.
ne). Il sensore ha un connettore Japanese
Solderless Terminal (JST). Si consiglia,
Cosa serve per realizzare il progetto?
quindi, lacquisto del relativo pigtail, il qua-
Solo pochi componenti:
le viene fornito completamente assembla-
il vostro Arduino, nel mio caso un Arduino
to e si collega direttamente a molti sensori
DUE, gentilmente offerto da Elettronica
Sharp.
Open Source;
8} Speciale Arduino - TUTORIAL

Se si usa Linux, come nel mio caso, non


necessario installare nessun driver. In
caso si usassero altri sistemi operativi,
seguite le istruzioni presenti sul sito uffi-
ciale di Arduino. Connettendo il cavo USB
al computer si accender il led ON della
scheda ed il led L lampegger.
Effettuate il download dellIDE per Ardui-
un computer su cui far girare il software
no per il vostro sistema operativo. Ricordo
Arduino IDE 1.5 BETA e per alimentare la
che, in caso si possieda Arduino DUE, si
scheda.
deve necessariamente installare la ver-
Come dispositivo di output useremo diretta-
sione 1.5 (ancora in fase Beta). Se si usa
mente il LED connesso al pin digitale 13 della
Linux, una volta scaricato il pacchetto lo si
scheda. Il suo funzionamento molto semplice:
deve estrarre in una directory qualsiasi e
quando il pin HIGH il LED accesso, quando
fare doppio click sul file arduino per aprire
LOW il LED spento. anche possibile ef-
lIDE.
fettuare il dimming del LED, dato che il pin 13
Una volta avviato il programma seleziona-
anche un output PWM. Un semplice sketch
te: Strumenti > Porta seriale e scegliete
sullutilizzo del LED 13 Blink, incluso tra gli
la porta seriale.
esempi dellArduino IDE.
Successivamente selezionate: Strumenti
Se per voi proprio la primissima volta con Ar-
> Board > Arduino Due (Programming
duino, sappiate che, per poter caricare gli sketch
Port)
allinterno del microcontrollore, bisogna esegui-
Ora siete pronti per caricare gli sketch su
re prima queste semplici istruzioni:
Arduino DUE.
Proviamo subito lo sketch desempio Blink, per
Collegate Arduino al computer attraverso
il quale, come gi detto, non necessario nes-
il cavo USB.
sun altro dispositivo o circuiteria esterna oltre
che al nostro Arduino:
Da File > Esempi > 0.1Basics selezionia-
mo Blink. Si aprir una schermata conte-
nente il seguente codice
/*
Blink
Turns on an LED on for one second, then off for
one second, repeatedly.

This example code is in the public domain.


*/

// Pin 13 has an LED connected on most Arduino


boards.
Speciale Arduino - TUTORIAL {9

invece, potremo vedere il LED 13 lampeg-


// give it a name: giare.
int led = 13;
Congratulazioni, Avete caricato corretta-
// the setup routine runs once when you press reset: mente il vostro primo sketch!!
void setup() { Come abbiamo detto prima, per, non ci limite-
// initialize the digital pin as an output.
remo a far lampeggiare un LED ma cercheremo
pinMode(led, OUTPUT);
} di fargli cambiare stato in risposta allelabora-
zione di informazioni che provengono da un di-
// the loop routine runs over and over again forever:
spositivo di input esterno, nel nostro caso da un
void loop() {
digitalWrite(led, HIGH); // turn the LED on sensore di prossimit.
(HIGH is the voltage level) Guardando il datasheet del sensore Sharp
delay(1000); // wait for a second GP2Y0A21YK possiamo notare che ha unusci-
digitalWrite(led, LOW); // turn the LED off by
making the voltage LOW ta analogica e va, quindi, interfacciato ad uno
delay(1000); // wait for a second dei 12 analog inputs presenti sulla scheda. Da
notare che nonostante Arduino DUE abbia un
}
ADC a 12 bit (quindi con la capacit di avere
4096 differenti valori), per default la risoluzione
Verifichiamo il codice cliccando sul tasto impostata a 10 bit in modo da garantire la com-
in alto a sinistra Verifica (ovviamente patibilit con le altre schede Arduino che lavo-
questa operazione superflua in questo rano, appunto, a 10 bit. E comunque possibile
caso!). cambiare la risoluzione dellADC con il comando
In caso non ci siano errori andiamo a cari- analogReadResolution().
care il codice premendo sul tasto Carica. Prima di collegare fisicamente il dispositivo cer-
Attendiamo qualche secondo e dovrebbe chiamo di ragionare sul codice da utilizzare per
presentarsi una schermata come quella ri- la lettura di un input analogico. Anche in questo
portata di seguito. Guardando la scheda, caso ci vengono incon-
tro gli esempi presenti
di default nellIDE. In
particolare, useremo
lo sketch ReadAna-
logVoltage, anchesso
selezionabile da File >
Esempi > 0.1Basics.

Il codice in questo
caso :
10} Speciale Arduino - TUTORIAL

/*
ReadAnalogVoltage
Reads an analog input on pin 0, converts it to voltage, and prints the result to the serial monitor.
Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

This example code is in the public domain.


*/
// the setup routine runs once when you press reset:
void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);
}
// the loop routine runs over and over again forever:
void loop() {
// read the input on analog pin 0:
int sensorValue = analogRead(A0);
// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 5V):
float voltage = sensorValue * (5.0 / 1023.0);
// print out the value you read:
Serial.println(voltage);
}

Ora che sappiamo come far brillare un LED e come leggere un segnale analogico, possiamo unire
i due sketch per ottenere quello che ci serve per il nostro progetto. Ed ecco qua:

/*

Semplice Sketch sullutilizzo interattivo di un dispositvo di input (GP2YOA21YK Infra Red Proximity Sen-
sor) con uno di output (LED sul Pin 13 di Arduino), adattando il codice degli Sketch di esempio ReadA-
nalogVoltage e Blink e aggiungendo la struttura di controllo if else

*/

int sensorPin = 5; //analog pin 5

// Pin 13 has an LED connected on most Arduino boards.


// give it a name:
int led = 13;

// the setup routine runs once when you press reset:


void setup() {
// initialize serial communication at 9600 bits per second:
Serial.begin(9600);

// initialize the digital pin as an output.


pinMode(led, OUTPUT);
}

// the loop routine runs over and over again forever:


Speciale Arduino - TUTORIAL {11

void loop() {
// read the input on analog pin 5:
int sensorValue = analogRead(sensorPin);

// Convert the analog reading (which goes from 0 - 1023) to a voltage (0 - 3.3V):
// Si noti che su Arduino Due la tensione massima che i pin I /O sono in grado di tollerare // di 3.3V e non
5V. Il valore considerato per la conversione quindi 3.3V e non 5V, //come da default nello sketch desem-
pio ReadAnalogVoltage

float voltage = sensorValue * (3.3 / 1023.0);


Serial.println(voltage);
//just to slow down the output - remove if trying to catch an object passing by
delay(100); // delay in between reads for stability

if ( voltage < 1 ) // se lostacolo si trova ad una distanza tale per cui il segnale in uscita //dal sensore
minore di 1 V ( distanza superiore a circa 30 cm) il LED si //spegne,altrimenti si accende
{digitalWrite(led, LOW); // turn the LED off by making the voltage LOW
}else
{
digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level)
}
}

Anche in questo caso lo sketch molto sempli- va non lineare. Per una conversione soddi-
ce. sfacente sarebbe, quindi, opportuno effettuare
Nella sezione globale definiamo le variabili che delle operazioni matematiche per linearizzare la
intendiamo usare e assegniamo dei nomi ai pie- curva ed ottenere una funzione di conversione
dini che useremo per lingresso e per luscita. da aggiungere nello sketch, oppure affidarsi a
Il codice di inizializzazione ( setup ) configura i librerie scritte ad hoc per il sensore che si sta
piedini per le loro rispettive funzioni ed inizializ- utilizzando. Purtroppo questa libreria funziona
za la comunicazione seriale, in modo da essere solo per la vecchia versione di Arduino e non per
in grado di inviare i dati al PC. Il codice eseguito Arduino DUE. Nel caso disponiate di un Arduino
nel ciclo principale ( loop ) legge dallingresso precedente al DUE, potrete utilizzare la libreria
analogico e copia il dato letto nella variabile che seguendo le istruzioni presenti nella pagina gi
abbiamo allocato. Poi fa un semplice test per indicata, dove c anche una breve spiegazione
verificare se il valore letto al di sotto di un va- di come funziona il sensore.
lore soglia, nel qual caso spegne il LED.
Come si pu notare la soglia impostata in base OSSERVAZIONE: una nota assolutamente
al valore di potenziale letto e non in base alla ef- importante che, a differenza di altre schede
fettiva distanza delloggetto. Sarebbe opportuno Arduino, la scheda Arduino DUE funziona a
quindi fare una conversione da V in cm in base 3.3V! La tensione massima che i pin I /O sono in
alla curva caratteristica del sensore. Guardan- grado di tollerare di 3.3V. Fornire tensioni pi
do il datasheet si nota che, purtroppo, tale cur- elevate, come 5V a un pin I /O potrebbe dan-
12} Speciale Arduino - TUTORIAL

neggiare la scheda. cesso delle altre.


Di comune accordo con Emanuele, si deciso
Per poter essere sicuri che la tensione di usci- di non proporre una soluzione e di lasciare il
ta del sensore sia inferiore a 3.3V diamo uno quesito aperto alla Community proprio a partire
sguardo al datasheet. da questo articolo, in modo che se ne possa di-
scutere nei commenti.
MALE, MOLTO MALE!
Dalla tabella Absolute Maximum Ratings si leg- Dunque, a voi la parola!
ge che lOutput terminal Voltage va da -0,3V a
Vcc+0,3V, e considerando che Vcc, cio l Ope-
rating Supply Voltage, 5V, in linea teorica lou-
tput del sensore pu arrivare ben al di sopra di
quel valore massimo, con il rischio concreto dei
friggere la scheda.
Guardando meglio il datasheet, tuttavia, possia-
mo notare dalla figura 4 che il massimo della
curva Analog Output Voltage vs. Distance to
Reflective Object intorno ai 3 V. Quindi, usan-
do un po di accortezza si potrebbe comunque
collegare il sensore stando ben attenti a lasciare
il campo libero da oggetti per una distanza di
almeno 20 cm. In questo modo loutput arriver
al massimo a circa 1,5 V, ben al di sotto dei fati-
dici 3,3 V. Nonostante questo accorgimento sia
ragionevolmente sufficiente per lavorare in tutta
sicurezza, senza la preoccupazione di bruciare
qualcosa, vi esorto a NON collegare il sensore
ad Arduino DUE, a meno che non abbiate abba-
stanza esperienza e/o vi piaccia rischiare.
Per ovviare a questo inconveniente della com-
patibilit dei pin a 3,3V, sono aperti numerosi
topic sul forum ufficiale di Arduino come anche
su vari forum di elettronica in giro su internet. Le
soluzioni proposte sono tante ma sembra che
non si sia ancora arrivati ad una soluzione de-
finitiva o ottimale e che abbia riscosso pi suc-

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/just-another-getting-started-arduino
Speciale Arduino - TUTORIAL {13

Come scrivere una libreria per


Arduino di slovati

C
ome esempio, creeremo una libreria molto libreria pu essere importata dagli utenti,
semplice. Del resto, quello che ci interessa che potranno cos disporre immediata-
maggiormente ora apprendere i passi da mente della nuova versione (con minime
seguire per la creazione di una nuova libreria; o addirittura senza alcuna modifica al pro-
questi passi potranno poi essere applicati anche prio codice)
al caso di librerie per applicazioni maggiormente Supponiamo ora di voler scrivere una libreria
complesse. che permetta di controllare lo stato di un led col-
Quali sono i principali vantaggi che deriva- legato a una uscita di Arduino. Possiamo pen-
no dallutilizzo di una libreria? I vantaggi offerti sare alle seguenti funzioni da includere nella
da una libreria possono essere sintetizzati nel nostra libreria:
modo seguente: initialize: la funzione di inizializzazione,
semplifica lutilizzo e lorganizzazione del quindi verr chiamata una sola volta allo
codice. Infatti, una libreria ben scritta e te- startup del sistema. Riceve come para-
stata, mette a disposizione dellutilizzare metro il numero del segnale (pin) della
delle funzioni pronte per luso: lutente non scheda Arduino che si intende utilizzare
deve preoccuparsi di come una particola- per comandare il led. Il codice di questa
re funzione stata implementata, suffi- procedura provveder automaticamente a
ciente sapere come deve essere utilizzata configurare questo pin come pin di uscita.
migliora la leggibilit del codice: il codice Non previsto alcun valore di ritorno dal-
dellapplicazione si snellisce ed pi sem- la funzione. Il suo prototipo sar perci di
plice da comprendere questo tipo:
decentralizza la logica: lo sketch pu infat-
ti focalizzarsi su uno specifico processing, void initialize (byte pinLed);
trascurando (o meglio nascondendo) gli
aspetti implementativi gestiti allinterno on: forza laccensione del led. Non ri-
della libreria. Si usa spesso dire che una chiesto alcun parametro e non esiste va-
libreria deve specificare cosa, quando, e lore di ritorno. Il suo prototipo sar perci
dove, ma non come il seguente:
permette di mantenere aggiornato il codi-
ce: se una stessa libreria viene utilizzata void on(void);
da pi utenti, quando viene rilasciato un
aggiornamento (in seguito ad esempio a off: forza lo spegnimento del led. Non richie-
del bug-fixing, oppure a seguito dellag- sto alcun parametro e non esiste valore di ri-
giunta di nuove funzionalit), la stessa torno. Il suo prototipo sar perci il seguente:
14} Speciale Arduino - TUTORIAL

void off(void); void blink (unsigned short periodMs)


{
on();
blink: causa il lampeggio del led. Come delay(periodMs/2);
parametro viene passato il periodo desi- off();
delay(periodMs/2);
derato per il lampeggio. Se ad esempio si
}
vuole ottenere un lampeggio alla frequen-
za di 20 Hz, occorrer passer come para-
Abbiamo a questo punto visto una possibile
metro il valore 50 (lunit di misura sono i
implementazione per le funzioni che vogliamo
millisecondi). Per questo parametro sta-
includere nella nostra libreria. Prima di proce-
ta prevista una variabile di tipo unsigned
dere, per utile spendere qualche parola sul-
short in modo tale da poter gestire periodi
la convenzione adottata nel mondo Arduino
anche superiori a 255 millisecondi. Non
per scegliere i nomi delle funzioni e delle
previsto alcun valore di ritorno, per cui il
variabili. Questa convenzione, che seguiremo
prototipo di questa funzione il seguente:
nella scrittura della nostra libreria, prevede che
i nomi della libreria siano in UppercaseUpper-
void blink (unsigned short periodMs);
case (MaiuscoloMaiuscolo), mentre quelli delle
funzioni in lowercaseUppercase (minuscoloMa-
Possiamo a questo punto vedere limplementa-
iuscolo). Ci significa che la nostra libreria dovr
zione completa di queste funzioni; il passo suc-
avere un nome tutto maiuscolo (scegliamo ad
cessivo sar quello di calarle allinterno di una
esempio il nome LEDLIB), mentre i nomi del-
libreria:
le funzioni e delle variabili saranno tutti in mi-
nuscolo, con maiuscolo solo la prima lettera di
void initialize (byte pinLed) ogni parola (eccetto la prima parola, che tut-
{
pinGlob = pinLed; ta in minuscolo). Nel mondo Arduino, le librerie
pinMode(pinGlob, OUTPUT); corrispondono a delle classi (si segue la stes-
} sa sintassi del C++), cio a dei particolari tipi di
strutture. Ogni classe si suddivide poi in due file:
un file header (estensione .h), contenen-
void on(void) te la dichiarazione della classe, oltre alla
{ definizione di eventuali tipi e costanti.
digitalWrite(pinGlob, HIGH);
Nel nostro caso, questo file si chiamer
}
LEDLIB.h
un file con il codice sorgente (estensione
.cpp), contenente limplementazione della
void off(void)
{ classe, cio il codice relativo a tutte le sue
digitalWrite(pinGlob, LOW); funzioni (esportate o locali). Le funzioni
} esportate da una classe corrispondono a
Speciale Arduino - TUTORIAL {15

quelle esportate dalla libreria, e vengono


anche chiamate metodi. Nel nostro caso, /*
il file sorgente della libreria si chiamer LEDLIB.cpp - Libreria di esempio per gestire
LEDLIB.cpp laccensione, lo spegnimento, e il lampeggio
di un LED.
Il listato relativo al file LEDLIB.h sar perci il */
seguente:
#include LEDLIB.h // dichiarazione della classe

#ifndef LEDLIB_H /* funzione di inizializzazione */


#define LEDLIB_H void LEDLIB::initialize (byte pinLed)
{
#include Arduino.h pinGlob = pinLed;
pinMode(pinGlob, OUTPUT);
class LEDLIB }
{
private: /* funzione di accensione del led */
byte pinGlob; // pin utilizzato per pilotare il void LEDLIB::on(void)
LED {
digitalWrite(pinGlob, HIGH);
public: }
void initialize (byte pinLed);
void on(void); /* funzione di spegnimento del led */
void off(void); void LEDLIB::off(void)
void blink (unsigned short periodMs); {
}; digitalWrite(pinGlob, LOW);
}
#endif
/* funzione di lampeggio del led */
void LEDLIB::blink (unsigned short periodMs)
E importante notare come tutte le funzioni della {
libreria siano public, quindi visibili allesterno, e on();
delay(periodMs/2);
quindi richiamabili da unapplicazione. E invece
off();
dichiarata come private la variabile pinGlob in delay(periodMs/2);
quanto questa locale alla classe e non deve }
essere visibile al suo esterno. Questo invece il
codice relativo allimplementazione della classe 2. copiate i file LIBLED.h e LIBLED.cpp nella
(LIBLED.cpp): nuova cartella LEDLIB
Siamo ora a buon punto, dobbiamo ancora ve- 3. lanciate lambiente di sviluppo Arduino e
dere come installare la libreria (non preoccu- selezionate lopzione Sketch->Import Li-
patevi, unoperazione molto semplice), e scri- brary dal menu principale: magia! Se avete
vere un piccolo esempio di utilizzo della stessa. eseguito correttamente i passi precedenti,
I passi da seguire sono i seguenti: sar visibile nellelenco la nuova libreria
1. create un nuova cartella LIBLED nella LEDLIB. Non selezionate comunque lop-
sottocartella libraries del vostro ambien- zione di importazione della libreria, questa
te di sviluppo per Arduino
16} Speciale Arduino - TUTORIAL

serve solo per includere lheader della li- sufficiente creare un file chiamato keywords.
breria stessa nello sketch corrente
Il codice dellesempio il seguente: #######################################
# Syntax Coloring Map For LEDLIB
#######################################
#include <LEDLIB.h>
LEDLIB KEYWORD1
LEDLIB led;
initialize KEYWORD2
void setup()
on KEYWORD2
{
off KEYWORD2
led.initialize(13);
blink KEYWORD2
}

void loop() txt che andr copiato nella stessa cartella in cui
{
led.blink(1000); sono presenti i file della libreria. Nel nostro caso,
} il contenuto del file sar il seguente:
Vengono in pratica elencati i nuovi simboli e il
La creazione di almeno un file di esempio mol- tipo di colorazione da applicare agli stessi (per
to importante per due motivi: separare il nome del simbolo e il tipo di keyword,
1. permette di testare la libreria: questa infat- occorre utilizzare un singolo carattere TAB).
ti non viene compilata fino al momento in Questo lultimo passo necessario alla creazio-
cui inclusa da unapplicazione ne di una libreria. Potete a questo punto distri-
2. la filosofia di Arduino prevede di allegare buire a chi interessato le librerie da voi stessi
sempre, insieme alla libreria, almeno un create: sar sufficiente, per praticit, comprime-
file di esempio. Se provate infatti a guar- re tutti i file della cartella relativa alla libreria e
dare nella cartella libraries della vostra rilasciare il file compresso.
installazione Arduino, potrete trovare la
sottocartella examples in corrisponden-
za di ogni libreria presente (ad esempio
per la libreria EEPROM)
Se avete provato a caricare lesempio di cui
sopra, avrete potuto notare come lambiente
di sviluppo di Arduino non abbia riconosciu-
to nessuno dei nuovi nomi introdotti (la classe
e i suoi metodi). Ci normale, bisogna infatti
istruire Arduino su quali sono questi nuovi sim-
boli, in modo tale che lIDE possa applicare ad
essi lappropriata colorazione. Per fare questo

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/come-scrivere-libreria-arduino
Speciale Arduino - TUTORIAL {17

Sviluppo Software per Arduino


con Atmel Studio di slovati

N
onostante sia bello ottenere immediatamen- (o una versione successiva) per Windows. Per
te dei risultati significativi con i numerosi rendere lambiente di sviluppo compatibile con
sketch di esempio gi disponibili per Ardu- Arduino, occorre inoltre installare ladd-in Visual
ino, quando si comincia a sviluppare unappli- Micro [2], che in sostanza un IDE Arduino per
cazione completa su una board Arduino con Microsoft Visual Studio e per Atmel Studio. Vi-
processore ARM ci si deve inevitabilmente con- sual Micro direttamente disponibile in Atmel
frontare con i seguenti problemi:
Studio dopo la sua installazione.
la compilazione del programma esegui-
Il debugger USB per Arduino disponibile allindi-
ta nellambiente Arduino richiede troppo
rizzo [2] non liberamente scaricabile, ma non
tempo;
tuttavia necessario in quanto il debugging attra-
il caricamento del programma eseguito
verso lICE Atmel sicuramente pi convenien-
dallambiente di sviluppo Arduino troppo
te. Questultimo strumento disponibile presso
lento;
numerosi rivenditori on-line a prezzi che si ag-
non disponibile un debugger hardware.
Per porre rimedio a questi inconvenienti, lauto- girano intorno ai 100 dollari (si veda la presen-

re ha individuato un sistema alternativo che ora tazione apparsa nel numero Elektor di ottobre
descriveremo. 2014 [3]). Vale sicuramente la pena affrontare
Uno dei principali vantaggi derivanti dallutilizzo questo investimento se si utilizzano i microcon-
di un microcontrollore a 32 bit rappresentato trollori Atmel in modo non occasionale.
da un accesso pi rapido alle risorse hardware, Grazie a questo debugger possibile imposta-
soprattutto ai pin di I/O. Ne consegue che un re dei veri breakpoint senza dover ricompilare il
buon sistema per testare le capacit di elabora- programma, osservare le variabili nella finestra
zione di un microcontrollore quello di scrivere Watch, ed esaminare o modificare il contenuto
un programma di esempio (uno sketch Arduino) della memoria. Inoltre, anche possibile ispe-
che genera unonda quadra con la minor am- zionare i numerosi registri di I/O, e modificarne il
piezza possibile, e misura lampiezza dellimpul- contenuto tramite un semplice click del mouse.
so del segnale in uscita. Nel corso dellarticolo
Dopo aver installato Visual Micro, allinterno di
descriveremo come scrivere un simile sketch
Atmel Studio sar disponibile una nuova toolbar.
di test, utilizzando lambiente di sviluppo Atmel
Con essa sar possibile selezionare la versione
Studio 6.2 [1].
corrente di Arduino (1.5.x), il tipo di scheda (Ar-
duino Due), e linterfaccia per la programmazio-
COMPATIBILIT CON ARDUINO
ne (porta di programmazione), come indicato in
La procedura qui descritta assume che abbiate
Figura 1.
installato il sistema di sviluppo Atmel Studio 6.2
18} Speciale Arduino - TUTORIAL

Successivamente occorrer configurare op-


portunamente linterfaccia seriale virtuale, che
potrete trovare nella finestra di Gestione dei Di-
spositivi quando Arduino Due collegata al PC
tramite un cavo USB. Il tasto relativo al monitor
seriale si trova, esattamente come nellIDE Ar-
duino, alla destra di queste impostazioni. Se le
impostazioni non compaiono automaticamente,
ad esempio quando il software di Arduino non si
trova nella cartella di default, occorre seleziona-
re la voce Configuration Manager. Si aprir la
finestra visibile in Figura 2. Qui occorrer inse-
rire manualmente la cartella di destinazione, in Atmel Studio la funzione di autocompleta-

quanto non disponibile alcuna dialog di sele- mento del codice, che ora disponibile anche

zione della stessa. Premendo il punto di doman- per gli sketch Arduino. Per utilizzarla occorre

da sulla barra menu di Figura 1, si aprir la fine- abilitare Visual Assist X tramite il menu VAssi-

stra Micro Explorer (Figura 3), che corrisponde stX->Enable/Disable. Attivando la funzione di

alla finestra Solution Explorer di Atmel Studio. autocompletamento, vengono elencate tutte le

Qui, i riferimenti a Arduino sono rappresenta- possibili opzioni di completamento ogni volta

ti sotto forma di collegamenti sotto il tab Refe- che si inserisce un carattere nella finestra Code.

rence. Cliccando su una di queste voci, si viene Se ad esempio si digita S allinizio di una nuova

rediretti al sito corrispondente. Il tab Examples riga dello sketch, i termini Serial, Server, SPI, e

contiene una lista di esempi (incluse librerie di cos via, vengono proposti per il completamento.

esempio) di Arduino, raggruppate per argomen- E poi possibile selezionare direttamente il termi-

to. ne appropriato, senza correre rischi di introdurre


errori di sintassi. Non solo, dopo aver inserito un

SKETCH IN ATMEL STUDIO punto, per esempio dopo il termine Serial, vie-

Uno dei principali vantaggi offerti dallIDE di ne proposta una lista con tutti i possibili attributi
Speciale Arduino - TUTORIAL {19

e metodi relativi a quella classe (Figura 4). Il fatto che la piattaforma sia mostrata come Ac-
tive AVR nelle propriet del progetto (click del
tasto destro su SpeedTest: Properties->Build)
pu essere un p fuorviante, almeno nella ver-
sione attuale di Atmel Studio (la 6.2). Purtroppo
non esiste alcuna soluzione a questo inconve-
niente. La piattaforma viene anche evidenziata
come AVR sotto Toolchain e Device. Tut-
tavia, ci non comporta alcuna conseguenza a
livello di funzionamento operativo. Seleziona-
nado la board Arduino Due, il progetto viene
compilato esattamente come con la piattaforma
A questo punto, seguendo la consueta procedu- SAM per i microcontrollori Atmel ARM. Come vi-
ra, possibile creare oppure aprire uno sketch sibile in Figura 6, la piattaforma AVR attiva,
nellIDE Arduino e poi importarlo in Atmel Stu- ma la destinazione riferita alla toolchain SAM
dellIDE Arduino.
dio. Tuttavia, esiste anche la possibilit di creare
Come consuetudine in Atmel Studio, premendo
dei nuovi sketch Arduino direttamente in Atmel
il tasto F7 si compila il progetto, e premendo il
Studio. Dopo aver creato e salvato lo sketch
tasto F5 (o in alternativa la freccia di colore ver-
SpeedTest (si veda pi avanti il listato) seguen-
de) si esegue il download del programma sulla
do uno di questi due modi, nella finestra Solu- scheda tramite il bootloader. E sempre meglio
tion Explorer apparir la struttura evidenziata selezionare Clean Solution sul tab Build (Figu-
in Figura 5. Ora possibile aprire e modificare ra 7), in quanto lunico modo che garantisce
lo sketch in Atmel Studio seguendo la modalit che tutti i file siano compilati nello stesso modo
consueta. Da questo punto in poi non pi ne- dellIDE Arduino.

cessario impiegare lIDE di Arduino. Come indicato in precedenza, uno dei principali
vantaggi offerti da Atmel Studio, rispetto allam-
biente di sviluppo tradizionale Arduino, rap-
presentato dalla riduzione del tempo di compila-
zione. Questo aspetto permette di accelerare in
modo significativo il processo iterativo di compi-
lazione, test, e modifica di un programma. Ci
dovuto al fatto che Arduino compila sempre tutti
i file sorgente, mentre Atmel Studio compila solo
i file modificati. Nella maggiorparte dei casi ci
implica che venga compilato soltanto il file .ino,
che contiene il codice intero dello sketch. Sul PC
dellautore, la prima compilazione dello sketch
SpeedTest ha richiesto 3,7 secondi, mentre la
20} Speciale Arduino - TUTORIAL

al connettore JTAG presente sul-


la board stessa.
La versione attuale di Atmel Stu-
dio (6.2) non consente di modi-
ficare gli sketch Arduino su una
piattaforma ARM Atmel, ma esi-
ste un modo per aggirare questo
problema. Per eseguire il debug-
ging con lICE Atmel, sufficien-
te lanciare una seconda istanza
di Atmel Studio; selezionare poi
Open->Open Object File For De-
bugging. I file di compilazione
generati da Atmel Studio sono
collocati sotto windows 7 nella
seguente cartella:

seconda compilazione (dopo aver eseguito una


C:\Users\XXXX\AppData\Local\
modifica del codice) ha richiesto soltanto 0,23 VMicro|Arduino|Builds\SpeedTest\arduino_due_x_
dbg\
secondi.

dove possibile trovare anche il file SpeedTest.


DEBUGGING CON LICE ATMEL elf. Apriamo ora questo file per eseguire il de-
Un vero debugger hardware come lICE di Atmel bug.
permette di semplificare notevolmente lo svilup- Se lo sketch stato compilato e salvato con lI-
DE Arduino, una copia dello stesso file sar an-
po software: sufficiente collegare il cavo for-
che presente nella cartella debug dello sketch.
nito in dotazione tra lICE e la scheda Arduino
E possibile verificare ci nella finestra Solution
Due. La board Arduino Due pu essere alimen- Explorer dellistanza di generazione del codice
tata direttamente dalla porta USB o tramite un di Atmel Studio, sotto Outpurt Files (Figura 8).
adattatore esterno, mentre lICE Atmel ha sol-
tanto bisogno di una porta USB.
Esistono due modalit distinte di collegamento
del cavo di debug. Nel caso della board Arduino
Due, la modalit corretta quella di collegare il
cavo da un lato alla porta SAM, e dallaltro lato
Speciale Arduino - TUTORIAL {21

Utilizzando la funzione di browsing, selezionia- da aprire la finestra Properties. Quando lICE


mo ora il file di output SpeedTest.elf. Dovrebbe Atmel collegato al PC tramite USB, il debug-
comparire una finestra come indicato in Figura ger pu essere selezionato sotto Tool->Selected
9. E inoltre possibile specificare un nome e una debugger/programmer. Qui occorre selezionare
destinazione a scelta per la cartella debug del linterfaccia SWD anzich JTAG.
progetto. Le impostazioni verranno memorizza- LICE Atmel a questo punto pronto. E possi-
te e utilizzate automaticamente quando si aprir bile anche utilizzarlo come programmatore. Per
nuovamente il progetto di debug.
aprire la finestra di programmazione, premere
Ctrl-Shift-P oppure clicca-
re sul simbolo del chip con
<lightning flash>: le fun-
zioni saranno disponibili
dopo aver premuto Apply.
Nel tab Interface Settings
possibile impostare il mas-
simo clock rate SWD (2
MHz), mentre nel tab Me-
Comparir a questo punto una finestra da cui mory possibile scaricare
selezionare la famiglia del dispositivo e il micro- il file SpeedTest.elf direttamente nella memoria
controllore target (Figura 10). Nel caso di Ar- flash del microcontrollore. Il programma parte
duino Due, occorre selezionare SAM3, 32 bit automaticamente non appena viene completata
come famiglia del dispositivo, e ATSAM3X8E la procedura di programmazione.
come tipo di microcontrollore. Il file SpeedTest. Tuttavia, pi efficiente utilizzare i comandi De-
cpp apparir ora nella finestra Solution Explo- bug->Start Debugging and Break oppure Start
rer; si tratta semplicemente dello sketch che ori- Without Debugging per scaricare e debuggare
ginariamente aveva lestensione .ino.
o eseguire, rispettivamente, il programma. Il
download dellintero programma
sul microcontrollore richiede con
lICE Atmel circa 1 secondo, ed
quindi molto rapido.
La struttura del programma Ardu-
ino appena scaricato pu essere
visualizzata nella finestra Solution
Explorer, dove selezionato il file
main.cpp e il cursore si trova posi-
Eseguire ora un click col tasto destro sul nome zionato sulla prima riga della pro-
del progetto SpeedTest_Debug in modo tale cedura (Figura 11).
22} Speciale Arduino - TUTORIAL

Se avete gi lavorato con i microcontrollori AVR


a 8-bit in ambiente Atmel Studio, non avrete al-
cuna difficolt a lavorare con i microcontrollori
ARM a 32-bit, in quanto linterfaccia utente
praticamente la stessa. Si noti inoltre come la
cancellazione e la scrittura della memoria flash
con lICE Atmel non alterano il contenuto del
bootloader , in quanto questultimo risiede nel-
la ROM del microcontrollore e non pu pertanto
essere cancellato o sovrascritto. Analogamen-
te, il download di un programma via interfaccia
USB si comporta nello stesso modo.

SPEEDTEST
Il main loop dello sketch di esempio (si veda il li-
stato SpeedTest) comprende soltanto due istru-
zioni:

Come si pu osservare il file SpeedTest.cpp digitalWrite(TP1,1); //On


rappresenta solo una piccola parte dellinte- digitalWrite(TP1,0); //Off
ro programma, ed questo il motivo per cui la
Tramite un oscilloscopio, possibile visualizza-
compilazione richiede un certo tempo. Il debug-
re unonda quadra generata in corrispondenza
ger consente di accedere a tutte le funzionalit
di questo pin, con unampiezza di 2,35 us e pe-
di Atmel Studio, come ad esempio il single step
(F11), limpostazione dei breakpoint (F9), la de- riodo di 6,6 us (Figura 13), che corrisponde a
finizione di breakpoint condizionali (finestra Bre- una frequenza di circa 150 kHz.
akpoint), e cos via. Se si modifica e ricompila il
file SpeedTest.ino nella prima istanza di Atmel
Studio, il messaggio mostrato nella Figura 12
apparir nella seconda istanza (lambiente di
debug). Premendo il tasto Reload possibile
chiudere il messaggio di debug e caricare il pro-
gramma modificato sul microcontrollore. Il cur-
sore ora nuovamente posizionato sulla prima
linea di codice del programma, e il programma
pu essere eseguito nuovamente.
Questa non molto elevata, e potrebbe sem-
brare inutile utilizzare un microcontrollore ARM
con clock di 84 MHz, quando un comune AVR a
8-bit potrebbe fare lo stesso o meglio.
Speciale Arduino - TUTORIAL {23

Il motivo di queste performance piuttosto scarse


che listruzione Arduino digitalWrite si tradu-
ce in una moltitudine di chiamate a funzioni C,
come pu essere verificato eseguendo il pro-
gramma in modalit single-step con il debugger
(F11). Per ottenere delle frequenze pi elevate,
occorre aggirare questo inconvenieten. Fortuna-
tamente, il linguaggio utilizzato da Arduino non
altro che una particolare forma di linguaggio C,
utilizzato con un compilatore GNU configurato
opportunamente per Arduino. Ci significa che
un pin configurato come uscita pu essere in-
dirizzato direttamente settando o resettando un
bit nel registro PIO. Listruzione:

const int TP1 = 7; //Test pin

seleziona il pin 7 di Arduino come pin di test. In


base alla mappatura dei pin utilizzata da Ardu-
ino, questo corrisponde al pin PC23 del micro- #ifdef Direct verr compilato; in caso contrario,
controllore, o al bit 23 del registro parallel input/ verr compilata la versione precedente con li-
output (PIO). Con il programma in stop, possi- struzione lenta digitalWrite. Ovviamente, questa
bile andare nella finestra I/O View del debugger modifica funzionaer anche nellambiente di svi-
(Figura 14) e cliccare il bit 23 del registro PIO_ luppo normale di Arduino.
ODSR per impostare alto il pin. Per resettare
Listato 1. Speed-Test.
il pin, sufficiente cliccare sullo stesso bit del
registro PIO_CODR. Nel main loop possibile
utilizzare listruzione //*******************************
//Speed-Test with Arduino Due
//*******************************
PIOC->PIO_SODR = 1<<23;

per settare il pin. const int TP1 = 7; //Testpin

Per eseguire i test, e nello stesso tempo per ve-


void setup()
rificare se la compilazione condizionale si com- {
porta correttamente, lautore ha generato una /* add setup code here */
nuova versione dello sketch (si veda il listato // set the digital pin as output:
pinMode(TP1, OUTPUT);
SpeedTest 2.0). Se lespressione Direct sta- }
ta definita, il segmento di codice successivo a
24} Speciale Arduino - TUTORIAL

void loop() { while(1){ //Only for testpurposes, don't exit this


// put your main code here, to run repeatedly: loop
PIOC->PIO_SODR = x;
PIOC->PIO_CODR = x;
digitalWrite(TP1,1); //On }
digitalWrite(TP1,0); //Aus
}
#else
digitalWrite(TP1,1);
Listato 2. Speed-Test 2.0. digitalWrite(TP1,0);

//********************************* #endif
//Speed-Test 2.0 with Arduino Due }
//********************************* Il risultato di questa ottimizzazione del codice,
#include "arduno.h"
// come visibile in Figura 15, impressionante:
// la forma donda ha ora unampiezza di soli 23,2
const int LED1 = 13; ns, e un periodo di 83,3 ns. Ci equivale a una
int LED2 = 12;
frequenza di 12 MHz - circa 80 volte maggio-
int LED3 = 11;
int TP1 = 7; //Testpin re rispetto alla versione precedente. Possiamo
quindi concludere che lutilizzo di un microcon-
trollore ARM non stata una cattiva idea.
#define Direct

void setup()
{
/* add setup code here */
// set the digital pin as output:
pinMode(LED1, OUTPUT);
pinMode(LED2, OUTPUT);
pinMode(LED3, OUTPUT);
pinMode(TP1, OUTPUT);
// set output low
digitalWrite(LED1,0);
digitalWrite(LED2,0);
digitalWrite(LED3,0); ADATTATORE PER SAM ICE
digitalWrite(TP1,0);
} Questo adattatore necessario per utilizzare il
debugger/programmatore SAM ICE con Arduino
Due. In pratica viene realizzato un collegamento
void loop() { tra il connettore JTAG a 10 pin della board Ardu-
// put your main code here, to run repeatedly:
ino Due con il connettore a 20 pin presente sul
#ifdef Direct
//x= state of PIO_SODR with bit 23 = 1 dispositivo SAM ICE.
int x = PIOC->PIO_SODR | 1<<23;
Speciale Arduino - TUTORIAL {25

degli sviluppatori software di professione, linve-


stimento si ripagher velocemente, anche se il
dispositivo pu essere utilizzato soltanto con la
famiglia di microcontrollori AT91xx.

LINK
[1] Atmel Studio 6.2:
www.atmel.com/microsite/atmel_studio6
[2] Arduino IDE for Visual Studio:
www.visualmicro.com
[3] Atmel ICE:
www.atmel.com/tools/atatmel-ice.aspx
Review: www.elektor-magazine.com/140275
SOMMARIO [4] SAM ICE:
Lutilizzo di Atmel Studio accelera notevolmente www.atmel.com/tools/atmelsam-ice.aspx
lo sviluppo di uno sketch per Arduino, grazie a
tempi di compilazione molto ridotti (solo il codi-
ce effettivamente modificato viene ricompilato).
Atmel Studio, insieme ai tool che lo accompa-
gnano (come il debugger e programmatore
Atmel ICE), sono molto utili quando si lavora
con i microcontrollori Atmel, in quanto offrono
delle funzionalit di debugging professionali e
velocizzano i tempi di download del programma
sulla memoria del microcontrollore.
Inoltre, per lo sviluppo di progetti ARM, pos-
sibile utilizzare il SAM ICE di Atmel al posto
dellAtmel ICE. Con il programmatore e debug-
ger hardware SAM ICE, la velocit di program-
mazione del microcontrollore pu essere velo-
cizzata fino a quattro volte, in quanto esso pu
operare alla frequenza di 8 Mhz anzich 2 MHz.
Per sfruttare questa opzione, occorre utilizzare
ladattatore descritto in precedenza. Se siete

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/sviluppo-software-per-arduino-con-atmel-studio
26} Speciale Arduino - TUTORIAL

Programmare Arduino UNO con


Atmel Studio di Ernesto Sorrentino

A
tmel Studio 6 una piattaforma di sviluppo Atmel Studio disponibile sul sito del produtto-
integrato (IDP) per lo sviluppo e il debug di re, con licenza freeware (versione attuale 6.2).
microcontroller (MCU) AVR di Atmel. Que- Questambiente di sviluppo non leggero come
sto software fornisce un ambiente unico e facile quello di Arduino, linstallazione occupa oltre
da utilizzare per scrivere, costruire ed eseguire 1Gb di spazio su disco; perch si porta dietro
il debug delle applicazioni scritte in C / C ++ o un framework per lo sviluppo di applicazioni
codice Assembly. Al contrario dellIDE di Ardui- alquanto corposo, oltre alla toolchain di AVR-
no, basato sul linguaggio Wiring (un progetto di GCC e vari datasheet.
Hernando Barragn), che facilita il programma-
tore offrendo un modo semplice per accedere PROGRAMMAZIONE IN ASSEMBLY
alle periferiche di input/output della piattaforma Nellesempio seguente vedremo come far lam-
hardware, in Atmel Studio si costretti a pro- peggiare il led posto sulla board di Arduino UNO
grammare i dispositivi a livello di registri, il che con uno sketch scritto in Assembly.
implica una buona conoscenza dellarchitettura Il linguaggio Assembly, detto anche assem-
del microcontrollore che si vuole utilizzare; in blativo, il pi vicino a quellamacchina vera
pratica bisogna scrivere il programma nella stes- e proprio. Per motivi hardware non esiste un
sa modalit in cui Wiring svolge la compilazione unico linguaggio Assembly ma comunque molti
di uno sketch a nostra insaputa. Questo metodo meccanismi sono analoghi o del tutto identici tra
pu risultare macchinoso e poco interpretabile loro. Spesso il passaggio, tra marchi diversi, si
ma si ha il vantaggio di avere il pieno control- limita allapprendimento di nuovi codici mnemo-
lo del micro sfruttando tutta la sua potenzialit. nici, nuove modalit dindirizzamento e altre va-
In alternativa, per chi ritiene difficile questo tipo rie peculiarit dovute alla architettura hardware
di programmazione ma vor-
rebbe utilizzare ugualmente
questo tool di sviluppo per
usufruire delle funzioni come
il debugger, il sistema di au-
tocompletamento, lintegra-
zione di plugin di terze parti
e altro ancora, potr confi-
gurare la piattaforma per in-
tegrare le librerie dellIDE di
Arduino e programmare in
Wiring.
Speciale Arduino - TUTORIAL {27

* Name: Blink.c
* Created: 02/04/2015
* Author: Sorrentino Ernesto
*/

#define F_CPU 16000000L

#include <util/delay.h>
#include <avr/io.h>

int main(void){
DDRB=0x20;

while(1){
del micro. PORTB=0x20;
_delay_ms(500);
Avviata lapplicazione, creiamo un nuovo pro-
PORTB=0;
getto andando per file/nuovo progetto. _delay_ms(500);
Nella videata successiva bisogna scegliere il }
tipo di progetto da realizzare, impostare la de- }

stinazione di salvataggio dei file e il nome da


assegnare. Il progetto da scegliere GCC C La struttura base di un script assembly com-
executable project e come nome ho scelto posto principalmente da tre parti:
Blink; confermiamo con OK. 1) configurazione del micro e importazioni libre-
Di seguito bisogna selezionare il modello di mi- rie:
crocontrollore in utilizzo, per la board Arduino
#define F_CPU 16000000L
UNO lAtmega328P. Da notare, sulla destra #include <util/delay.h>;
della finestra, il supporto tecnico ai Tool e il da- #include <avr/io.h>;
tasheet del micro in esame; ottimi strumenti per
aiutare lutente nello sviluppo del progetto. #define F_CPU 16000000L definisce il clock
Ora possiamo scrivere il nostro programma, lo del micro di 16Mhz;
#include <util/delay.h> include nello script la
libreria per la funzione delay;
#include <avr/io.h> include la libreria per la
gestione delle periferiche In/Out.

2) Settaggio dei registri di configurazione dispo-


sitivo; quello che nellIDE di Arduino corrisponde
al void setup().
Devono essere inseriti sotto la funzione main()

int main(void){
script che useremo il seguente:
DDRB=0x20;
28} Speciale Arduino - TUTORIAL

Le porte del micro sono gestite tramite tre regi-


while(1){
stri: DDRx, PORTx e PINx (dove x corrisponde PORTB=0x20;
al gruppo di port B, C , D, ecc) _delay_ms(500);
PORTB=0;
_delay_ms(500);
DDR: Registro per configurare il pin del micro }
come ingresso o come uscita (1 = output, 0 = }
input);
PORT: Registro per settare lo stato del pin im- Come visto in precedenza il registro PORTB
postato come uscita (1 = alto, 0 = basso); utilizzato per assegnare lo stato di uscita della
PIN: Registro per la lettura di stato della porta. porta B. Inserendo il valore 0x20 (binario cor-
risponde a 00100000) si porta al
livello alto solo la porta B5 (cor-
rispondente al pin 19 del micro
e al D13 di Arduino) accendendo
cos il led.

Listruzione _delay_ms (500)


effettua una chiamata alla libre-
ria util/delay.h che a sua volta
genera un ritardo di mezzo secondo. Poi sar
In questo caso impostiamo la PORTB 5 come
spento il led portando al livello basso tutte le
uscita e le altre come ingresso settando il regi-
porte B con il comando PORTB = 0; di nuovo
stro DDRB col valore 0x20 (in binario corrispon-
unattesa di mezzo secondo e ricomincia il ciclo.
de a 00100000)
Una volta scritto il programma bisogna compi-
lare, o meglio assemblare, le
istruzioni col comando BU-
ILD SOLUTION dal menu
Bulid\Bulid Solution o pre-
mendo il pulsante F7 della
tastiera.
Dopo la compilazione, il tool
produrr una serie di file nel-
la cartella Debug del vostro
3) Ciclo del programma, da scrivere sotto la fun- progetto, tra questi troviamo:
zione while(1) (1 = condizione sempre vera). Blink.eep: un file EEPROM Data, contiene
Questa corrisponde alla funzione loop() dellI- informazioni da scrivere su EEPROM in for-

DE di Arduino. mato hex e nel nostro caso sostanzialmen-


te vuoto;
Blink.elf: Executable and Linkable Format
Speciale Arduino - TUTORIAL {29

(Formato eseguibile e collegabile), contiene Mettere la spunta su Use Output win-


informazioni per il debug; dow;
Blink.hex: il nostro file di codice in forma- In Title inserire il nome da assegnare
to hex che utilizziamo per flashare il con- allapplicazione, tipo AVRISP mkII;
troller; In Command inserire il percorso completo
Blink.lss: file disassembly del nostro pro- ad avrdude.exe. Nel mio caso la stringa
gramma intercalato con le linee C del pro- C:\ProgramFiles\arduino\hardware\tools\
getto; avr\bin\avrdude.exe;
Blink.map: mappa relativa alla posizione e In Arguments inserire gli argomen-
grandezza delle sezioni di codice e dati del ti di avrdude -CC:\Program Files\ar-
programma. duino\hardware\tools\avr\etc\avrdude.
conf -patmega328p -cardu-
ino -P\\.\COM20 -b115200
-Uflash:w:$(ProjectDir)
Debug\$(ItemFileName).hex:i

Nota: Il parametro -P\\.\


COM20 deve riflettere la porta
Per caricare il programma su Arduino possiamo COM utilizzata dallArduino e per tanto potrebbe
utilizzare Xloader, una applicazione gratuita. cambiare. Se il percorso alle directory contiene
spazi (come in Program Files (x86)), potreb-
be essere necessario inserire lintero percorso
tra virgolette; ad esempio : -C C:\Program Files
(x86)\Arduino\hardware\tools\avr\etc\avrdude.
conf.

Per dispositivi diversi dalla board UNO ap-


portare le seguenti modifiche:
Il settaggio semplice, basta selezionare il file Arduino Pro Mini: patmega328p - cardui-
.hex dalla cartella Debug, il tipo di dispositivo, no - P.COM20 -b57600
la porta di comunicazione e cliccare su Uplo- Arduino Duemilanove: patmega328p -
ad e vedere lampeggiare il led sulla board. In carduino - P.COM20 -b57600
alternativa possibile caricare il programma Arduino Mega2560: patmega2560 - cwi-
tramite Atmel Studio utilizzando avrdude, ring - P.COM3 - b115200
impostandolo come strumento esterno. Per
questa configurazione necessario che lIDE di Riferimenti:
Arduino sia installata sul PC in uso. p: Nome del microcontrollore;
Aprire il menu di settaggio da Tools/ c: Nome della board;
External Tools; b: Baudrate di programmazione.
30} Speciale Arduino - TUTORIAL

della board in esame.


Ultimo file da aggiungere alla directo-
ry il linker core nominato core.a.
Core.a un archivio generato dallI-
DE di Arduino, in fase di compilazio-
ne, che riunisce tutte le librerie per
il funzionamento e la programmazio-
ne del micro. Ogni qualvolta che si
ricompila lo sketch viene rigenerato
ugualmente, il valore di questarchi-
vio cambia solo se si modificano al-
cuni parametri, come la frequenza di
Ultimato il settaggio confermare col pulsante
clock o la tipologia di microcontrollore. Per tanto
OK per salvare. Ora dal men Tools sar
si pu definire che core.a associabile ad un
presente lapplicativo appena creato, cliccare
solo tipo di board.
per caricare il programma su Arduino.
Aprire lIDE di Arduino e caricare un qua-
lunque esempio; anche il blink va
PROGRAMMAZIONE IN C CON LE LI-
bene;
BRERIE DI ARDUINO
In File/Impostazioni mettere la spunta
Con unopportuna configurazione possibile in-
su compilazione per output dettagliato,
tegrare allambiente di sviluppo Atmel le librerie
chiudere con OK;
di Arduino e programmare in modo Wiring.
Per ottenere questa modalit necessario im-
portare le librerie di Arduino in Atmel Studio con
i seguenti passi:
Creare una directory, nominandola Ar-
duinoCore in C:\Users\xxx\Documents\
Atmel Studio
Copiare, in questa cartella, tutti file pre-
senti in C:\Program Files (x86)\Arduino\
hardware\arduino\cores\arduino

La libreria cores un insieme di file necessa-


rie alla creazione di uno sketch. In essa sono
Compilare lo sketch e nella finestra di ou-
contenuti il file main.cpp (che include la funzio-
tput localizzare il percorso del file core.a;
ne setup(), loop() e init() per inizializzare il mi-
Copiare il file nella cartella ArduinoCo-
cro) e tutte le librerie di wiring come la classe
base print.cpp per le funzioni print() e il pins_ re e rinominarlo in libcore.a, ricordare

arduino.c per le informazioni hardware dei pin che questo file utilizzabile solo per la
Speciale Arduino - TUTORIAL {31

board Arduino UNO. -fdata-sections;


Mettere la spunta su Prepare functions
for grabage collections (-ffunction-sec-
tions)

Le due opzioni precedenti lavorano as-


sociate allopzione gc-sections del
linker. In pratica, in fase di compilazione,
ogni funzione viene posta in sezioni sepa-
rate di memoria interna. In fase di linking
le sezioni (dati o funzioni) che non sono
mai referenziate vengono scaricate dalla
memoria.
In AVR/GNU Linker selezionare Libra-
ries;
Ora resta la preparazione dellambiente di svi- aggiungere in Libraries(-wl, -l) il nome
luppo Atmel per ospitare i progetti Arduino. associato al linker core di Arduino, in que-
Avviare Atmel Studio; sto caso libcore;
Creare un nuovo progetto AVRGCC C++ In Library search path (-wl, -L) inseri-
Executable Project. In Name inserire re il percorso a ArduinoCore e togliere la
il nome del progetto (Arduino_Uno) e in spunta a relative Path;
location la destinazione di salvataggio; In Miscellaneous inserire -Wl,-lcore in
Al passaggio successivo bisogna selezio- Other Linker Flags.
nare il microcontrollore in uso, quello della Salvare il tutto e ritornare alla finestra Ar-
board UNO lAtmega328P, e conferma- duino_UNO.ccp;
re con OK; Sostituire tutto il contenuto con i seguenti co-
Premere ALT+F7 per aprire le propriet
mandi:
e selezionare il tab Toolchain;
In AVR/GNU C++ Compiler selezionare
#define F_CPU 16000000L
Directories; #define ARDUINO 160
In Include Paths (-l) inserire il percorso
a ArduinoCore e togliere la spunta a re- #include Arduino.h
lative Path;
void setup();
Selezionare Optimization e in Optimi- void loop();
zation Level scegliere la voce Optimize
for size (-Os). -Os ottimizza per la mino- void setup() {
re occupazione di memoria. Il compilatore
}
non si cura a ottimizzare le prestazioni di
esecuzione del codice generato. E limpo- void loop() {
stazione predefinita dellIDE di Arduino;
}
Inserire in Other optimization flags
32} Speciale Arduino - TUTORIAL

Premere F7 per
compilare lo sketch
e Tools/AVRISP
mkII per program-
mare la board. Ora
il led dovrebbe lam-
peggiare in modo
differente dalla pro-
grammazione prece-
dente.

EXTENSION MA-
NAGER
Questa la configurazione di default per scrive Una funzione particolare dellAtmel Studio lin-
un programma, dove: tegrazione dei Tools di terze parti. Uno in par-
#define F_CPU 16000000L specifica la fre-
ticolare il Terminal for Atmel Studio; una
quenza di clock del micro (16Mhz);
sorte di monitor seriale come quella di Ardui-
#define ARDUINO 160 specifica luso della
no. Per aggiungere questa applicazione selezio-
libreria riferita allIDE di Arduino versione 1.6;
#include Arduino.h include la libreria Ardu- nare Tools/Extension Manager e cliccare su
ino; Terminal for Atmel Studio.
void setup() richiamo della funzione setup();
void loop() richiamo della funzione loop();

le righe successive sono da strutturare come


nellIDE di Arduino per creare gli sketch.
Proviamo ora a scrivere il programma del blink:

#define F_CPU 16000000L


#define ARDUINO 160

#include Arduino.h

void setup();
void loop();
Terminata linstallazione riavviare Atmel Studio
void setup() {
pinMode(13, OUTPUT); e caricare il file Arduino_Uno.cpp salvato in
} precedenza. Ora modificheremo lo sketch ag-
void loop() { giungendo il comando Serial.
digitalWrite(13, HIGH); In setup() aggiungere la riga:
delay(100);
digitalWrite(13, LOW); Serial.begin(9600);
delay(500); e in loop() la riga:
}
Serial.println(Hello World!);
Speciale Arduino - TUTORIAL {33

Premere F7 per compilare lo sketch e Tools/


AVRISP mkII per programmare la board.
Per avviare il monitor selezionare View/Termi-
nal Window; settare la porta di comunicazione,
il baudrate e cliccare su connect. Il risultato
sar il seguente:

CONCLUSIONE
Non basta un articolo per descrivere tutte le po-
tenzialit di questo magnifico ambiente di svi-
luppo. C molto da approfondire sulla funzione
debug I/O View che monitorizza lo stato del
processore, memoria e tutte le interfacce di co-
municazione del microcontrollore; e molto altro
ancora, che probabilmente vedremo in un pros-
simo articolo.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/programmare-arduino-uno-con-atmel-studio
34} Speciale Arduino - TUTORIAL

Un encoder per Arduino di Giovanni Carrera

D
opo aver illustrato i risultati di alcune prove sa dilatazione termica ed elevata precisione
di laboratorio, si passano in rassegna le va- meccanica. In genere realizzato in metallo o in
rie tecniche hardware/software per lelimina- vetro mediante tecniche di fotoincisione. Esso
zione dei disturbi creati dal rimbalzo dei contatti suddiviso in un numero di corone che dipende
e si studia lo schema di un efficace circuito anti- dalla risoluzione angolare desiderata, in figura
rimbalzo. Come possibile esempio di imposta- 1a mostrato il disco di un encoder assoluto a
zione numerica, presentato un programma 10 bit. Si divide il disco in tante zone concentri-
con Arduino Uno che fa uso di due interrupt. Le che quanti sono i bit di cui composto il numero,
applicazioni di questo sensore sono molte- alternando le zone opache a quelle trasparenti
plici, esempi sono alimentatori con controllo secondo un particolare codice binario, chiamato
digitale, generatori di segnali, radio, orolo- codice Gray. Questo particolare codice, passan-
gi, etc. Mi ricordo che gi una ventina danni fa do da un numero a quello attiguo, permette la
usavo un ottimo generatore di funzioni HP che variazione di un solo bit alla volta, evitando pos-
aveva un encoder per impostare la frequenza. sibili errori nella digitalizzazione della posizione.
Molti apparati Hi-fi, radio e TV, oscilloscopi, sono Con il codice binario naturale si ha un cambia-
ormai dotati di encoder per selezionare la fre- mento di tutti i bit quando il prossimo numero
quenza o per variare il volume o altri parametri. una potenza di due, cos come avviene nel
nostro codice decimale in corrispondenza di una
GLI ENCODER ROTATIVI potenza di 10.
Gli encoder sono dei dispositivi digitali in gra- Un pettine di fotocellule, disposte in senso ra-
do di fornire informazioni sulla posizione o sulla diale, permette di leggere il codice e inviarlo in
velocit angolare o lineare. Data la loro natura uscita. Essi sono molto complessi perch richie-
digitale e la grande precisione, essi trovano lar- dono un numero di fotocellule pari al numero di
ga applicazione nelle macchine a controllo nu- bit in uscita e una lavorazione meccanica a bas-
merico e in tutti i casi in cui occorra misurare se tolleranze, quindi molto costoso.
spostamenti con grande precisione. Nella maggior parte dei casi si preferisce invece
Gli encoder possono essere di due tipi: lencoder incrementale, pi semplice perch ha
Encoder assoluti. una o due fotocellule al massimo. Questo tipo di
Encoder incrementali. trasduttore non ha un riferimento assoluto ma
Gli encoder assoluti danno in uscita un numero relativo, per cui non pu fornire da solo linfor-
binario corrispondente alla posizione assoluta mazione di una posizione, ma richiede ununit
dellasse (nel caso di encoder angolari) o della- di conteggio (conta impulsi) in grado di registra-
sta per quelli lineari. re gli incrementi di posizione dati dallencoder.
La parte pi importante dellencoder angolare Per una certa posizione, che costituisce il riferi-
ottico un disco realizzato con materiali a bas- mento iniziale, si azzera il conta impulsi, quindi
Speciale Arduino - TUTORIAL {35

si contano gli incrementi dati dal movimento del- tici, magnetici, elettromeccanici, capacitivi.
la rotella dellencoder.
Questo tipo di trasduttore trova vaste applica-
zioni in tutti i dispositivi elettromeccanici control-
lati da microprocessori quale elemento di retroa-
zione dellasservimento di posizione. Per la loro
maggiore semplicit costruttiva sono pi usati
gli encoder angolari rispetto a quelli lineari.

Figura 1: Disco di un encoder assoluto a 10 bit (a) ,


Disco di un encoder incrementale (b)

Questa suddivisa in tanti settori chiaro/scuro


quanti sono gli incrementi/giro richiesti, come
mostrato dalla figura 1b. Per esempio, con 360
finestrelle si ottiene un impulso per grado. Una
sola fotocellula va bene solo per moti unidire-
zionali, per avere anche il senso occorrono due
fotocellule (encoder a due uscite) disposte in
modo che gli impulsi siano sfasati di circa 90 Figura 2: Impulsi per senso orario e antiorario
tra loro, come mostra la figura 2. Osservando
che, in corrispondenza del fronte di salita di A, Gli encoder ottici, non avendo contatti striscianti,
B=0 se il verso orario mentre B=1, se il verso hanno una coppia minima e sono particolarmen-
antiorario, si pu determinare il verso del mo- te robusti e relativamente semplici. Nei vecchi
vimento con limpiego di un semplice circuito ba- mouse a pallina, la rotazione della sferetta gom-
sato su porte logiche e flip-flop. Il contatore deve mosa era trasferita, nelle componenti verticali
essere del tipo avanti/indietro per conteggiare e orizzontali, a due encoder incrementali ottici.
gli incrementi o i decrementi dalla posizione di Quelli con la rotellina avevano un terzo encoder
riferimento. Questa logica pu essere facilmen- collegato a essa, come hanno anche i moderni
te realizzata da un microcontrollore. mouse a sensore ottico.
Gli encoder incrementali sono usati anche per Oggi essi trovano applicazioni anche nelle ap-
rilevare velocit angolari con elevata precisione. parecchiature elettroniche digitali, per imposta-
Esistono anche encoder lineari, con caratteristi- zioni rapide o per sostituire i classici potenzio-
che del tutto simili a quanto visto per quelli ango- metri analogici. Sono sul mercato a prezzi molto
lari. Molte stampanti hanno un encoder lineare, convenienti encoder meccanici, dove il disco
realizzato con una sottile pellicola e una fotocel- metallico e le fotocellule sono sostituite da con-
lula, per rilevare la posizione della testina. tatti striscianti. Naturalmente hanno un limitato
numero di finestrelle, tipicamente 12. La figura
Gli encoder incrementali possono essere ot- 3 mostra un tipico esemplare di encoder incre-
36} Speciale Arduino - TUTORIAL

mentale, anche munito di pulsante assiale. Da A questo punto stato abbastanza facile scri-
un lato ci sono tre pin: quello centrale la mas- vere un programma su Arduino per riconoscere
sa comune e gli altri sono i segnali A e B dellen- il verso e incrementare o decrementare una va-
coder. Sul lato opposto ci sono altri due pin che riabile. Ma il funzionamento stato molto incer-
sono collegati al pulsante che si chiude quando to: gli incrementi erano irregolari e spesso non
si preme la manopola. concordi.
Aumentando la frequenza di campionamento
delloscilloscopio, si sono potuti notare i disturbi
causati dallo strisciamento delle spazzole, pre-
senti anche nella figura 4, ma non visibili data la
bassa frequenza di campionamento. Nella figu-
ra 5 si vedono chiaramente questi disturbi,
per cui il programma non riusciva a funzio-
Figura 3: Encoder meccanico incrementale nare correttamente. Negli encoder ottici questi
inconvenienti sono praticamente assenti.
LE PRIME PROVE
Dopo avere alimentato a 5V e inseriti due resi- TECHNICHE DI DEBOUNCE PER ELI-
stori di pull-up da 10k sui due segnali dellenco- MINARE I DISTURBI
der, sono state fatte numerose misure con un I contatti striscianti, come abbiamo visto nelle
oscilloscopio digitale USB collegato ai due ca- prove pratiche, portano a rumore con conse-
nali. I risultati sono mostrati nelle figure 4 e 5. guenti errori provocati dai falsi impulsi creati
dal rimbalzo (bounce) dei
contatti. Per evitare questo
notevole disturbo si usano
tecniche di debounce sia a
livello hardware, con circuiti
RC o con appositi circuiti in-
tegrati come il MC14490, sia
intervenendo sul programma
Figura 4: prime prove e segnali di test con ritardi.
La cosa migliore quella di ridurre il distur-
In figura 4a si vede che sul fronte di salita di A, il bo gi a livello del segnale, lo schema di fi-
segnale B alto, mentre in senso orario B bas- gura 6 mostra una semplice soluzione circu-
so. Gli impulsi non sono di eguale durata perch itale di tipo RC. Inserendo un filtraggio RC sulle
la velocit con cui ruotavo a mano il perno non uscite dellencoder, i fronti di salita e di discesa
era costante e forse anche perch la larghezza sono notevolmente meno ripidi, quindi occorre
della parte conduttrice delle finestrelle minore
utilizzare uno schmitt trigger in uscita, per otte-
della parte isolante. Non si voluto sacrificare
nere fronti ripidi e puliti.
lencoder per una verifica diretta.
Speciale Arduino - TUTORIAL {37

di un condensatore con un re-


sistore in serie.
Per un maggior effetto di filtrag-
gio meglio lavorare sui fronti
di salita, ossia sulla carica del
condensatore. Naturalmente,
mantenendo linversione della
porta logica, il software dovr
Figura 5: prime prove con visualizzazione dei disturbi
generare linterrupt sui fronti di discesa, se usia-
dovuti allo strisciamento delle spazzole
mo due porte invertenti in cascata si dovr ope-
rare sul fronte di salita.
Questi valori sono adatti per gli encoder
elettromeccanici mossi a mano, come nel
nostro caso. Per applicazioni pi veloci
meglio ridurre la capacit. Con 2,5 ms di
ritardo, aumentando la velocit, diminui-
sce il periodo dei segnali. Se il semiperio-
do uguale o superiore ad esso, il segna-
le non ritorna a zero per cui lencoder non

Figura 6: soluzione circuitale debounce di tipo RC


leggibile. Per calcolare la velocit limite,
considerando 12 posizioni, si ottiene il periodo
Come risulta dalla figura 6, gli impulsi di rimbalzo corrispondente ad un giro: T = 24*2,5 = 60 ms.
sono abbastanza sottili, hanno una durata molto La velocit pari a 1000/60 = 16,7 giri/secondo,
inferiore al millisecondo. Questo ci permette di molto pi alta di quella manuale. Va comunque
calcolare un filtraggio opportuno. Come si vede detto che questo dispositivo non adatto per
dallo schema, in fase di carica del condensatore movimenti continui e veloci, per cui sono pi in-
C (contatto aperto) R=R1+R2= 20 k, mentre dicati gli encoder ottici o magnetici.
in scarica R= 10 k. Usando per C un conden- Come vedremo, la soluzione di inserire que-
satore da 0,1 uF si ha una costante di tempo di sto circuito quasi dobbligo nel caso si la-
carica tc = 2*10^410^-7 = 2 ms mentre quella vori con interrupt. Con questo accorgimento,
di scarica ts = 1 ms. Sapendo che i valori delle il programma ha funzionato perfettamente.
soglie Vt del trigger CD40106, alimentato a Vcc=
5V, sono di circa Vtd = 1,4V per la discesa e Vts= IL CIRCUITO ANTI-RIMBALZO
3,6V per la salita, si possono calcolare i ritardi: DELLENCODER
La soluzione adottata stata quella
di realizzare una piccola scheda da
montare direttamente sullencoder
con tre circuiti anti-rimbalzo, due
Queste formule sono quelle di carica e scarica per lencoder e uno per il pulsante incorpora-
38} Speciale Arduino - TUTORIAL

to. Sfruttando tutte le porte dellintegrato U1, le ALGORITMI DI ELABORAZIONE DE-


uscite non sono invertite, quindi occorre che gli GLI ENCODER INCREMENTALI
interrupt dellencoder siano sul fronte di salita e Se il numero di finestre elevato, solitamente si
non di discesa, questo per avere ritardi maggio- lavora solo su un fronte degli impulsi di uno dei
ri. segnali, per quanto detto in precedenza, il fronte
La figura 7 mostra lo schema completo della di salita del segnale A. Come evidenziato in figu-
scheda di interfaccia. Al posto del CD40106, ra 2, a ogni fronte di salita di A si va a leggere
possono essere usati anche un 74HC14 o un il valore che ha il segnale B, se esso basso si
74C14. incrementa un contatore in quanto si identifica
Molti pi rimbalzi sono stati rilevati sul pulsan- un senso orario, se esso alto, si decrementa
te rispetto ai segnali A e B, se si rilevasse un il contatore. Levento pu essere rilevato via in-
funzionamento incerto causato da questi distur- terrupt, soluzione migliore, oppure continuando
bi, basterebbe aumentare la capacit di C4 a a leggere il segnale A.
220nF. Comunque non sono stati rilevati questi Utilizzando linterrupt risulta difficile effettuare
problemi sul prototipo. un filtraggio del segnale perch non si pu usa-
Elenco componenti: re la funzione delay(), che pi facile inserire
R1-R6 Resistore 10 k 1/4W in un programma che esegue un continuo pol-
C1-C4 Condensatore 0,1 MF 25V cera- ling sul segnale, come fanno molti programmi
mico che si trovano in rete. Essi aspettano il cambia-
Encoder Vedere testo mento di stato e quindi effettuano un filtraggio
U1 CMOS Hex schmitt trigger
digitale inserendo degli opportuni ritardi. Questa
CD40106, 74HC14
J1 Pettine 5 poli passo 0,1 tecnica fa perdere molto tempo alla CPU che
non pu fare altre operazioni. Linterrupt pi
In figura 8 si vede la realizzazione del proto-
vantaggioso in quanto lascia libera la CPU per
tipo su scheda millefori. Per avere una bassa
altri impieghi e questo un motivo molto valido
altezza dei componenti si usato un 74AC14
per giustificare la scelta, per cui si utilizzato
con case smd. La soluzione ottimale sarebbe
quella di usare una millefori a doppia faccia il circuito anti-rimbalzo visto precedentemente.
o realizzare un piccolo circuito stampato con Luso dellinterrupt permette anche di lavorare
componenti smd. In figura stata rimossa la su encoder pi veloci come quelli ottici, montati
manopola per vedere meglio il layout dei com- sullasse di un motore.
ponenti. Volendo raddoppiare la risoluzione si lavora sia
sul fronte di salita, sia su quello di discesa di
un segnale (interrupt sul cambiamento di stato,
modo CHANGE) oppure sui fronti di discesa (o
salita) di entrambi i segnali, ma si preferito la-
vorare con una risoluzione inferiore e utilizzare
il pulsante incorporato per avere la possibilit
Figura 8: prototipo su scheda millefori di incrementi maggiori. Per questo motivo si
dotato di circuiti anti-rimbalzo anche questo pul-
Speciale Arduino - TUTORIAL {39

Figura 7: scheda di interfaccia

sante, in modo da generare un interrupt anche sentato solo un esempio, possibile usare il
per questa funzione. programma per impostare lora e la data su un
orologio RTC o per numerose altre applicazioni.
PROGRAMMA ARDUINO Queste operazioni risultano pi agevoli con un
Per provare il programma si usato un Arduino display LCD dove si fanno lampeggiare le cifre
Uno collegato con la scheda encoder con cin- interessate oppure usando appositi led.
que fili, secondo la tabella seguente: Il programma usa due semplici ISR (Interrupt Servi-
ce Routine) che si preferito renderle pi leg-
Encoder pin: A B pulsante +Vcc Gnd
gere possibili, come bisogna sempre fare. La
Arduino pin 2 4 3 5V Gnd
gestione del contatore fatta dal programma
Le uscite del programma sono visibili sul termi- principale, che deve controllare, per quanto riguar-
nale seriale della IDE di Arduino. da lencoder, solo se il flag delta diverso da zero.
Come gi descritto, il programma utilizza i due La routine encint() in corrispondenza del fronte di
soli bit disponibili per linterrupt di Arduino Uno, salita di A legge il segnale B e pone delta=1 se B=0
per il fronte di salita del segnale A e per il pul- (verso orario), oppure delta = -1 se B = 1. La varia-
sante incorporato nellencoder. Ad esempio: bile delta funge anche da flag di interrupt, se non
premendo la manopola lincremento passa da avviene niente, questa rimane zero. Essa azze-
uno a dieci, premendo nuovamente passa a rata dal programma loop, dopo aver elaborato lin-
100, poi a 1000, quindi ritorna a 1 con un ul- cremento.
teriore schiacciamento del pulsante. Con poche Se, per qualsiasi motivo, girando la manopola in
modifiche del programma si potrebbe iniziare senso orario il contatore decrementa invece di in-
ad impostare le cifre pi significative, come si fa crementare il conteggio, basta invertire i segni di
quando si scrive un numero. Il programma pre- delta.
40} Speciale Arduino - TUTORIAL

/* test program encoder.ino

read a rotary encoder with push button and debounce circuit

uses interrpts on A and button

write the counts to serial monitor

Giovanni Carrera, rev. 16/10/2015

*/

#define encoder_A 2

#define encoder_B 4

#define encoder_pb 3

volatile signed int count = 5000; // initialize encoder counter

volatile signed int delta = 0; // increment

volatile unsigned int multi = 0; // multiplier index

const int multiplier[4] = {1,10,100,1000}; //increment multiplier

void setup() {

pinMode(encoder_A, INPUT);

pinMode(encoder_B, INPUT);

pinMode(encoder_pb, INPUT);

attachInterrupt(digitalPinToInterrupt(encoder_A), encint, RISING); // interrupt on _- A

attachInterrupt(digitalPinToInterrupt(encoder_pb), buttint, RISING); // interrupt on button pressing

Serial.begin (9600);

Serial.println(Encoder test);

void loop(){

if (delta !=0){ //an encoder interrupt occurred


Speciale Arduino - TUTORIAL {41

count= count+delta*multiplier[multi];// increment or decrement counter

delta= 0;// resets the flag

if (count > 10000 || count < 0) count=0;// reset on overrange

Serial.println(count);

void encint() {

/* encoder interrupt, see the status of B signal

in order to decide the sense

*/

if (digitalRead(encoder_B) == 0) delta=1;

else delta= -1;

void buttint() {

// button interrupt, change multiplier

multi++;

if (multi==4) multi=0;// back to top

La routine buttint() richiamata ogni volta che count con lincremento delta*multiplier[multi],
premuto il pulsante, essa incrementa lindi- quindi, azzera delta, come interrupt flag.
ce multi della tavola multiplier dei moltiplicatori La variabile count pu essere inizializzata, nel
dellincremento. Se lindice supera il numero di programma posta a 5000, e il suo valore
elementi della tavola, esso azzerato. Una logi- pure controllato e azzerato nel caso siano supe-
ca opposta va applicata nel caso si voglia inizia- rati i limiti imposti.
re dalle cifre pi significative. Questo sketch vuole essere solo un esempio di
Il programma principale (loop), appena trova utilizzazione, ovviamente il programma princi-
delta diversa da zero incrementa la variabile pale pu essere completato dalla parte che uti-
42} Speciale Arduino - TUTORIAL

lizzer il numero impostato.


Per rendere il programma leggibile a tutti, i com-
menti sono stati scritti in inglese.

Bibliografia
Dispense di Automazione navale ,Capi-
tolo 7, Carrera.
Encoders Signal Conditioning Technical
Note, Bourns, 2010

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/un-encoder-per-arduino
Speciale Arduino - TUTORIAL {43

SMAs: gestiamo questi materia-


li intelligenti con Arduino di Vincenzo Motta

LA STORIA un materiale infatti dipendono fortemente dalla

G
li SMAs sono delle leghe formate dallunio- struttura cristallina, pertanto una sua seppur lie-
ne di Nichel+Titanio, vengono solitamente ve modificazione pu portare a materiali anche
chiamati Nitinol , Ni per Nickel, ti per molto diversi tra loro.
Titanium e nol da Naval Ordnance Laborato- Un esempio familiare quello del Carbonio: un
ry. La capacit di memoria di forma degli SMAs cristallo di Carbonio con la struttura tetraedrica
fu scoperta nel 1961 da William J. Buehler, (ogni atomo al centro di un tetraedro ai cui ver-
un ricercatore del Naval Ordnance Laboratory tici siedono altri atomi) costituisce il diamante.
in White Oak, Maryland. La scoperta avvenne Ma il Carbonio pu ugualmente presentarsi nel-
per caso. Durante una riunione di laboratorio, la forma cristallina della grafite, in cui gli atomi si
fu presentata una striscia di Nitinol che aveva dispongono su strati debolmente legati tra loro.
subito diverse variazioni della sua forma, uno Grafite e diamante hanno la stessa composizio-
dei presenti, il Dr. David S. Muzzey, riscaldan- ne chimica essendo fatti di soli atomi di carbo-
dola con la sua pipa si accorse che la striscia di nio. La loro struttura cristallina per profonda-
Nitinol ritorn alla sua forma originale. Da quel mente diversa.
momento fino ai giorni nostri, gli SMAs hanno Ogni struttura stabile in un determinato inter-
avuto un notevole successo e un largo spettro vallo di pressione e temperatura. Tuttavia, in ge-
di applicazioni in ambito scientifico e non solo. nere una volta che il cristallo si formato con
una specifica forma cristallina (per esempio, il
STRUTTURA CRISTALLINA diamante si forma solo a pressioni molto eleva-
La maggior parte dei solidi ha ununica struttu- te) molto difficile fargli cambiare forma modifi-
ra cristallina, ma il NiTi ne ha due! Il passaggio cando semplicemente pressione e temperatura.
dalluna allaltra costituisce una vera e propria Nel caso del Nitinol, invece, si pu indurre il pas-
transizione di fase allo stato solido, analoga saggio tra le due strutture variando la tempera-
in molti aspetti alla transizione solido-liquido. tura in un intervallo facilmente realizzabile in
Come in questultimo caso, infatti, il passaggio laboratorio. Le forme cristalline del Nitinol sono
tra due stati della materia indotto dalla varia- due:
zione di temperatura, dalla forza applicata, o da Austenite: la fase stabile ad alta tem-
una combinazione dei due fattori. peratura. caratterizzata da un reticolo a
La caratteristica distintiva di una transizione di simmetria cubica a corpo centrato (BCC),
fase il brusco cambiamento di una o pi pro- in cui gli atomi cio occupano i vertici di
priet fisiche. Le propriet macroscopiche di due reticoli cubici compenetrati. Il mate-
44} Speciale Arduino - TUTORIAL

riale in questa fase duro e difficilmente versa e riprende la forma regolare e rigida della
deformabile. Austenite, indipendentemente dalla deformazio-
ne eventualmente subita nella fase Martensite.
Si manifesta cio leffetto di memoria di forma
SME (Shape Memory Effect).

Martensite: la fase stabile a bassa tem-


peratura. Ha una struttura cristallina mo-
noclina distorta, molto meno simmetrica
del tipo BCC. caratterizzata da grande
flessibilit e dalla capacit di essere facil-
mente deformata senza che tuttavia tale
deformazione sia permanente, infatti, que-
sta fase si forma e si accomoda in forma
twinned, ovvero speculare rispetto ad un SUPERELASTICIT
piano ideale tra due celle, non creando di- Oltre allimportante propriet di memoria dei fili
fetti irreversibili nel reticolo cristallino. Que- di Nitinol, un altra importante caratteristica che li
sta struttura a twins pertanto facilmente ha resi importanti dal punto di vista commerciale
deformabile, aprendosi nella forma detwin- sicuramente la superelasticit.
ned come il mantice di una fisarmonica Tale propriet si sviluppa quando la lega vie-
e, non avendo creato difetti di slittamento ne deformata, applicando unappropriata forza,
dei piani reticolari, reversibile. Nella fase sopra la sua temperatura di trasformazione. Si
martensitica, perci, il materiale sottopo- genera in tal modo una Martensite indotta da
sto a uno sforzo meccanico in grado di sforzo (SIM) che si trova a temperatura maggio-
sopportare un alto grado di deformazione re del suo campo di esistenza: non appena lo
senza tuttavia rompere i legami chimici. sforzo viene rimosso essa si riconverte in Auste-
nite indeformata. Questo fenomeno conferisce
al materiale unottima elasticit.
Il fenomeno della superelasticit non altro che
un effetto di memoria meccanica del materia-
le: esso, sotto lazione di uno stato di sollecita-
zione, assume una configurazione deformata,
ben oltre il limite elastico, che pu essere ripri-
Poich la trasformazione tra Austenite e Marten- stinata togliendo lo stato di sollecitazione.
site reversibile, alzando la temperatura il ma- La superelasticit viene sfruttata per realizza-
teriale esegue la trasformazione cristallina in- zione di particolari montature per occhiali, come
Speciale Arduino - TUTORIAL {45

quelli mostrati qui di seguito: essere addestrati a memorizzarne una nuova.


Per settare la forma che pi preferiamo, dobbia-
mo tenere il materiale nella fase Austenite ad
alte temperature. Possiamo creare uno stam-
po utilizzando delle viti per tenere fermo il filo su
una superficie, ad una data forma. Il passo suc-
cessivo quello di riscaldare il tutto allinterno
di un forno o con una fiamma continua. Ad alte
temperature, il filo entra nella fase di Austenite,
memorizzando la forma che abbiamo deciso di
imprimergli. Quando lo raffreddiamo, immergen-
dolo in acqua fredda, il filo entra nella fase Mar-
tensite ma esso lo fa senza cambiare la forma,
poich ancora vincolato al nostro stampo.
Una volta rimosso il filo di Nitinol dallo stampo,
possiamo deformarlo come preferiamo. Questo
provoca un cambiamento di forma permanen-
te. Se successivamente riscaldiamo il filo, esso
passa dalla fase Martensite alla Austenite, ritor-
nando indietro, alla forma originale. Cos facen-
do, osserviamo la sua capacit di memoria. Una
volta fissata la forma, possiamo ripetere per
quante volte vogliamo gli step di deformazione
e successivo riscaldamento del filo .

MOTORI TERMICI CON I FILI DI NITINOL:


IL THERMOBILE
Il Thermobile un modello di motore termico
che usa un di filo di Nitinol per generare poten-
in questo modo e possibile realizzare montature za. Il filo di Nitinol posto su due ruote libere
per occhiali con eccezionali caratteristiche di re- rotanti. Una di queste due ruote viene tenuta a
sistenza alla deformazione e che, nel contempo, diretto contatto con lacqua calda (lato caldo)
risultano particolarmente confortevoli da indos- mentre laltra a diretto contatto con laria fred-
sare. da (lato freddo). Il filo di nitinol, prima di essere
montato sulla struttura, ha subito un trattamento
COME SETTARE LA MEMORIA DI FOR- di impressione della forma. Per ogni giro, ogni
MA IN UN FILO DI NITINOL? volta che il filo passa all interno del recipiente
Non solo i metalli intelligenti possono ricorda- con acqua calda superando la sua temperatura
re la forma originaria, ma addirittura possono di transizione, si ricorda della sua forma origi-
46} Speciale Arduino - TUTORIAL

nale e tenta di raddrizzarsi. In alcuni casi necessario fornire un avviamen-


Se osserviamo la figura seguente, possiamo to alla ruota applicando noi stessi una forza
dire che nella posizione 1 il filo freddo, quan- esterna.
do passa dalla posizione 1 alla 2, piegato at- Nel 1982 Innovative Technologies International
torno alla rotella di ottone ed entra nellacqua (ITI) costru un motore che usava fili da 0.558
calda. Quando il filo passa dalla posizione 2 alla mm di diametro. Il motore fu testato usando ac-
3 viene superata la temperatura di transizione
qua calda a 55C e aria a 25C. Il motore riusc
e questo tenta di raddrizzarsi. Dalla posizione 3
a raggiungere un avelocit di 270 rpm (giri per
alla 4 il filo si raddrizzato e ha permesso alla
minuto) e continu a funzionare per un anno e
ruota di ruotare Quando passa dalla posizione 4
mezzo.
alla 1, attraversando la ruota pi grande, il filo,
ha il tempo sufficiente per raffreddarsi scenden-
ESPERIMENTO 1
do al di sotto della sua temperatura di transizio-
Il filo di Nitinol genera una forza per riacquisire
ne, pronto per un altro giro.
Modello reale del Thermobile
la forma di 22.000 psi (pound per square inch
o libbre per pollice quadrato). Considereremo fili
da 0.006 pollici di diametro e da 0.015 pollici di
diametro. Il primo ha una forza di contrazione
maggiore, rispetto al secondo e pu contrarsi
fino all 8%/10% della sua lunghezza.
Contrazione e rilassamento dipendono esclusi-
vamente dalla temperatura del filo di Nitinol. Per
riscaldare e raffreddare il filo pu essere utilizza-
to qualsiasi metodo. Un modo solitamente usato
per riscaldare il filo di Nitinol quello di farlo at-
traversare da corrente elettrica. Il filo di Nitinol
rappresenta una resistenza di circa 1.25 ohm
per pollice per il filo da 0.006 pollici di diame-
tro. La resistenza del filo alla corrente elettrica
Riassumendo, la differenza di temperatura pro-
genera calore sufficiente (riscaldamento ohmi-
voca la contrazione del filo nel lato della ruota
co detto anche effetto Joule) da portarlo alla
posta in acqua calda. Il filo si rilassa quando si
sua temperatura di transizione in un tempo che
trova a contatto con laria fredda. Ci provoca
funzione della resistenza e della corrente.
una forza meccanica che garantisce la rotazione
Potremmo applicare al filo una controforza nella
continua delle ruote. Lo stesso risultato pu es-
direzione opposta alla sua contrazione. La con-
sere ottenuto utilizzando, al posto del recipiente
troforza distende il filo alla sua forma originale
con acqua calda, un raggio di sole focalizzato
durante la fase di bassa temperatura. Questa
da una lente in un punto del filo di Nitinol.
controforza chiamata forza di bias.
Speciale Arduino - TUTORIAL {47

Se il filo di Nitinol portato alla sua tempera- spezzarsi.

RISCALDAMENTO ATTRAVERSO
CORRENTE ELETTRICA DIRETTA
Il filo di Nitinol pu essere attivato (cio por-
tato alla sua temperatura di transizione) con
una bassa tensione di alimentazione in DC (6-
12Volt). Possiamo costruire un semplice circui-
to utilizzando una batteria, un interruttore e un
pezzo di filo di Nitinol, come mostrato di seguito:
Quando si porta il filo nel suo stato di attivazio-

tura di transizione senza forza di bias esso si


contrarr, ma, quando si raffredda, esso non ri-
torner alla sua lunghezza originale proprio per-
ch non ha un contro peso che gli consenta di
distendersi. Di conseguenza, senza una forza di
bias, quando il filo viene ricaldato nuovamente
non avr luogo nessuna ulteriore contrazione.
La figura di sopra mostra due metodi per appli-
care una forza di bias: nel primo caso una molla, ne utilizzando corrente continua importante
nel secondo caso un peso statico. non surriscaldarlo, altrimenti si correrebbe il ri-
La velocit e la forza di contrazione del filo schio di apportare dei danni permanenti alle sue
dipendono da quanto alta e da quanto velo- propriet fondamentali. importante osservare
cemente viene incrementata la temperatura che una corrente continua non riesce a surri-
del filo. Ad esempio, 400mA di corrente elettrica scaldare il filo di Nitinol in maniera uniforme.
attraverso il filo di nitinol di 0.006 pollici di dia- Il metodo migliore riscaldare il filo con un
metro produrr un sollevamento massimo di 11 segnale PWM. Usando un segnale PWM pos-
grammi raggiungendo la completa contrazione siamo cambiare il duty cycle proporzionalmente
in 1 secondo. Il tempo di reazione pu essere alla quantit di contrazione che vogliamo otte-
pi veloce, dellordine del millisecondo. nere. Questo tipo di controllo ci permette di atti-
Per raggiungere queste alte correnti sono usati vare il filo di Nitinol per lunghi periodi di tempo
impulsi di breve durata. Nel fare questo bisogna senza causare danni causati dal sovrariscalda-
considerare la massa e la velocit del materiale mento della struttura cristallina del Nitinol.
da spostare. Possiamo realizzare un circuito per generare un
Quanto pi velocemente vogliamo muovere segnale PWM.
una data massa, tanto maggiore sar linerzia Il circuito sar costituito da un timer 555. Utiliz-
che dovr essere superata. Se linerzia diventa zando due transistor Q1 e Q2 e un potenziome-
maggiore di quelle sostenibili dal filo, esso potr tro con il timer 555 possiamo creare un uscita
48} Speciale Arduino - TUTORIAL

con una relativa frequenza costante con un duty


cycle variabile. Ecco mostrato di seguito il cir-
proviamo a immaginare che
cuito:
deformando la carrozzeria di un auto
Per capire come funziona nel dettaglio un timer
dopo un incidente, sia possibile far
ritornare la carrozzeria nella sua forma
originale semplicemente riscaldando la
superficie danneggiata.

Si pensa che, quanto sopra detto, sar una tec-


nologia alla portata di tutti tra circa un decennio.
Altre applicazioni in campo automotive sono
previste per sistemi di raffreddamento del moto-
555 rimando allarticolo scritto da Marven.
re, controlli di lubrificazione e per ridurre il flusso
daria attraverso il radiatore allavvio quando il
APPLICAZIONI FUTURE
motore freddo e quindi a ridurre il consumo di
Oggi, le propriet di memoria di forma hanno
carburante e le emissioni.
reso il Nitinol un materiale ideale in ambiti molto
diversi tra loro, dalle missioni spaziali alle deco-
ESPERIMENTO CON ARDUINO
razioni floreali (farfalle e libellule animate ), da-
Materiale occorrente:
gli stent vascolari utilizzati per garantire il flusso
Arduino Uno
sanguigno nelle arterie otturate, agli attuatori
(tendini artificiali) per microrobot operanti trami- Potenziometro 10k

te effetto Joule. Lestrema flessibilit del nitinol Tip 120

trova impiego anche nelle antenne dei cellulari, breadboard

negli apparecchi ortodontici, nelle montature di jumpers


occhiali, nelle placche per saldare fratture os- connettori a coccodrillo
see, come attuatori nelle protesi biomedicali. batteria 9V
Per quanto riguarda il futuro, la ricerca si sta im- Led
pegnando sull includere motori, nelle macchine, Diodo
negli aerei e nei generatori elettrici, che utilizza- filo di Nitinol (acquistabile su KRL)
no lenergia meccanica derivante dalle trasfor- Di seguito vedremo due diversi esperimenti re-
mazioni di forma. gi in corso lo studio per alizzati con Arduino e semplicemente riproduci-
lapplicaizione dei fili di Nitinol nelle carrozzerie bili. Questi esperimenti ci permettono di capire
delle auto:
meglio il comportamento degli SMAs
Speciale Arduino - TUTORIAL {49

SCHEMA 1
}

void loop() {
int sensorValue = analogRead(A0);
int outputValue = map(sensorValue, 0, 1023, 0,
255);
analogWrite(transistorPin, outputValue);
}

Schema 1 Per quanto riguarda il codice riferito allo schema


1, stato utilizzato l esempio del Blink Led di
Il codice da caricare il seguente: Ardino con un delay di 8 secondi, utile a permet-
tere il raffreddamento del filo di Nitinol permet-
int transistorPin = 9;
tendone la successiva contrazione. Ogni 8 se-
void setup() { condi dal pin 9 di Arduino vengono erogati 5V di
pinMode(transistorPin, OUTPUT); tensione che portano in conduzione il TIP120 il
}
quale amplifica la corrente destinata ad attraver-
void loop() { sare il filo di Nitinol. A causa della ridotta corren-
digitalWrite(transistorPin, HIGH); te di uscita dal pin 9 (40mA) stato inserito un
delay(8000);
transistor NPN modello TIP120. Per portare a
digitalWrite(transistorPin, LOW);
delay(8000); buon fine lesperimento necessaria unalimen-
} tazione esterna, nel caso specifico stata utiliz-
zata una batteria da 9V ma il consiglio quello
di utilizzare un alimentatore da laboratorio. Ad
SCHEMA 2 ogni contrazione del filo, pilotata dal pin 9, ven-
gono assorbiti circa 800mA. La corrente assor-
bita proporzionale alla resistivit intrinseca
del filo, infatti, a seconda delle caratteristiche
tecniche del filo di Nitinol, come ad esempio il
diametro, la corrente assorbita che permette l
ingresso in fase Austenite sar diversa.
Per quanto concerne lo Schema 2, stato aggiunto
un potenziometro in modo da regolare il duty cycle
Schema 2 del segnale PWM in uscita dal pin 9. Nel codice re-
lativo al secondo schema il pin 9 non si occupa pi
Il codice da caricare il seguente: di erogare una tensione continua di uscita di 5V ma
int transistorPin = 9; stato programmato per erogare un segnale PWM.
Qui di seguito alcune foto della fase di test in labo-
void setup() { ratorio:
pinMode(transistorPin, OUTPUT);
50} Speciale Arduino - TUTORIAL

Per la realizzazione del struttura ho preso ispira-


zione da un esperimento realizzato da un certo
Anton e pubblicato su youtube che possibile
vedere cliccando sul seguente link.
Durante la realizzazione dellesperimento vi
stato un interessante scambio di informazioni
via e-mail con Anton, dove ci si confrontava sui
limiti e le possibili applicazioni dei fili di Nitinol.
Questa un ulteriore prova di come lopen
source avvicini appassionati con interessi
comuni e ne nasca un grande confronto e
una crescita reciproca.

AVVERTIMENTI E PRECAUZIONI
doveroso consigliare di prestare la massima
attenzione durante l esperimento. I possibili
pericoli possono derivare dalla diminuzione del
delay (nel codice dello schema 1) o dalla dimi-
nuzione drastica del valore del potenziometro
(nello schema 2). Entrambi i casi, infatti, porta-
no il filo di Nitinol a un pesante stress dovuto
alla tensione continua che lo attraversa per un
tempo prolungato provocandone il surriscalda-
mento e la conseguente incandescenza. Pre-
Circuito reale stiamo, inoltre, molta attenzione a non toccare
il circuito durante il funzionamento a causa del-
Per eseguire i test, basandomi sui precedenti le alte correnti in gioco. Il TIP120 raggiunger
schemi, ho realizzato una particolare struttura temperature abbastanza elevate, il consiglio
che mi consentisse di mantenere teso il filo di quello di installare un dissipatore per evitare di
Nitinol. La struttura caratterizzata da una base danneggiare il dispositivo a lungo termine.
in plexiglas forata in cui ho inserito due norma-
lissimi fili con anima rigida a cui ho saldato il filo
di Nitinol. Per garantire la tensione al filo di Ni-
tinol ho utilizzato due elastici ancorati ai fili con
anima rigida.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/smas-gestiamo-questi-materiali-intelligenti-con-arduino
Speciale Arduino - TUTORIAL {51

Realizzazione di un rilevatore
SONAR con Arduino di Giuseppe Silano

LIDEA ALLA BASE DEL PROGETTO ne dati da un processore general purpose, dalle

L
idea alla base del progetto tanto semplice frequenze di clock pi elevate, dunque riducen-
quanto ingegnosa: utilizzare un sensore ad do la possibilit di misure falsate o perdita di in-
ultrasuoni, nello specifico un HC-SR04, per formazione.
rilevare la distanza da un oggetto, con lausi- Allinterno di questo articolo verranno presen-
lio di Arduino, e scansionare larea circostante tate entrambe le soluzioni, allo scopo di fornire
utilizzando un motore in continua, attraverso la uninformazione quanto pi completa possibile,
Motor Shield di Infineon. Lelaborazione avviene lasciando poi al lettore la facolt di decidere qua-
in ambiente Matlab Simulink, lo stesso utilizzato le soluzione adottare nel caso voglia realizzare il
per programmare il microcontrollore, dove ven- progetto, valutando con mano le differenze tra le
gono raccolte le misure temporali, convertite poi due alternative descritte.
in distanza, e visualizzato un grafico che mostra In sintesi, lutilizzo di Matlab potrebbe essere
la sagoma di eventuali oggetti presenti. Ovvia- la soluzione migliore per chi mastica poco i lin-
mente, lambiente Matlab Simulink non lunico guaggi di programmazione, mentre scrivere uno
spendibile sia per la programmazione, sia per sketch per Arduino potrebbe essere la soluzione
lacquisizione e lelaborazione delle informazio- pi adeguata per coordinare motore, sensore,
ni. Soluzione alternativa realizzare uno script acquisizione ed elaborazione.
in Python, che acquisisce le misure di distanza Criticit alla base del progetto sono:
(la conversione tempo-distanza viene gestita Gestione del tempo minimo in cui il sen-
in Arduino, anche se formalmente loperazione sore deve sostare in una specifica posi-
non corretta) e visualizza il grafico aggiornan- zione, affinch la misura avvenga corret-
dolo di volta in volta con le nuove misure. Si trat- tamente e non venga falsata dal ritorno
ta di una valida alternativa, ma che necessita, di altri segnali (sar pi chiaro quando si
al contempo, di spendere maggior tempo nella analizzer il funzionamento del sensore
stesura del codice. ad ultrasuoni, in particolare lHC-SR04);
Parliamo di operazione non corretta perch Calibrazione della velocit del motore in
buona norma deputare al microcontrollore il mi- continua per la rotazione del sensore, ca-
nor numero di operazioni possibili, in modo che pace di scansionare larea con una angolo
lhardware sia quanto pi possibile dedicato alla che spazia tra gli 0 ed i 180, ed inversio-
gestione delle attivit essenziali. Eventuali ela- ne della rotazione;
borazioni, allinterno dello sketch (nome dato al Dimensionamento dellalimentazione
software realizzato per Arduino), potrebbero far necessaria a garantire il funzionamento
perdere tempo al microcontrollore in attivit dellintero sistema, e sua interconnessio-
svolgibili tranquillamente in fase di elaborazio- ne con lapparato sensoristico e di movi-
52} Speciale Arduino - TUTORIAL

mentazione. sonar utilizza onde acustiche e non elettroma-


gnetiche, che meglio si propagano in materiali
RADAR O SONAR: LE DIFFERENZE rigidi come i liquidi, e di meno nellaria, con un
Prima di addentrarci e capire nel dettaglio qua- comportamento del tutto duale rispetto alle onde
li sono stati i passi che hanno portato alla re- elettromagnetiche. Tali caratteristiche fanno del
alizzazione del rilevatore SONAR con Arduino, sonar lo strumento pi indicato in ambienti ma-
bene definire quali sono le differenze tra un rini, o dove in generale bisogna attraversare dei
sistema SONAR ed uno RADAR. Indagare sulle liquidi, mentre il radar utile quando neces-
differenze fondamentale per comprendere il sario misurare distanze nelletere. In generale,
perch della scelta fatta, le limitazioni che essa possiamo affermare che pi rigido il mezzo
comporta ed i possibili problemi realizzativi. meglio le onde sonore si propagano, raggiun-
Il termine RADAR lacronimo di Radio Detec- gendo distanze pi elevate, al contrario di ci
tion And Ranging, e denota i sistemi capaci di che accade con quelle elettromagnetiche.
rilevare e localizzare oggetti a mezzo di onde Le onde, siano esse sonore o elettromagnetiche,
elettromagnetiche. Schematicamente in un si- possono essere inviate come la modulazione di
stema radar un trasmettitore invia nello spazio unonda continua oppure ad impulsi, la seconda
energia elettromagnetica sotto forma di impul- soluzione la pi efficiente da un punto di vista
si a microonde, di frequenza tra le onde radio energetico quando si intende raggiungere gran-
e la radiazione infrarossa; tale energia vie- di distanze.
ne riflessa da eventuali bersagli, catturata da Capite le differenze, per sommi capi, verrebbe
unantenna ed elaborata dal ricevitore al fine di da pensare: perch stato realizzato un si-
determinare la presenza o meno del bersaglio stema SONAR di rivelazione nelletere con
(Detection=rivelazione) e di misurare la distan- Arduino piuttosto che uno RADAR? Il motivo
za dal ricevitore (Ranging=localizzazione in di- semplicissimo: i costi. Il sensore utilizzato allo
stanza). Di norma trasmettitore e ricevitore sono scopo (lo analizzeremo a breve) ha un costo de-
collocati e condividono lo stesso sistema dan- cisamente ridotto rispetto ad unequivalente che
tenna (come nel progetto in esame), si parla di lavora alle microonde. Dunque, questa la ra-
radar monostatico. Al contrario, in applicazioni gione che ne hanno decretato la scelta, ritenen-
belliche si separa il trasmittente dal ricevente, dolo il pi giusto da utilizzare per la realizzazio-
per evitare lindividuazione dellantenna, realiz- ne del progetto.
zando il cosiddetto radar bistatico. Giusto per Ricordiamo, infatti, che lintento non realizzare
completezza, in questi ambienti la rivelazione un sistema vendibile ma progettare e, soprattut-
un problema di classificazione binaria, mentre la to, costruire un dispositivo embedded capace di
localizzazione un problema di stima. chiarire i passi che separano la teoria dalla pra-
Il SONAR, lacronimo di SOund Navigation And tica, capendo quali possono essere i problemi
Ranging, essenzialmente si comporta come un in corsa dopera. Arduino secondo lopinione
sistema radar, ovvero in grado di determinare di chi scrive un ottimo strumento didattico
la presenza o meno di un bersaglio e di misurar- ed utile per le aziende, per tutto quello che il
ne la distanza. Al contrario del sistema radar, il discorso prototipizzazione rapida.
Speciale Arduino - TUTORIAL {53

I COMPONENTI
Definita lidea alla base del progetto, le limita-
zioni e le motivazioni che hanno portato alla
scelta di un sensore ad ultrasuoni, piuttosto che
uno a microonde, per la rivelazione di un ogget-
to nelletere, si pu tranquillamente passare a
quelli che saranno i componenti che verranno
utilizzati, da qui a poco, per la realizzazione del
sistema. Capire lhardware a disposizione un
passaggio chiave per farsi unidea degli even-
tuali problemi che possono sorgere in corsa do-
pera e, soprattutto, come evitarli. Figura 1.3.1: Sistema di controllo, Arduino UNO.

Poche ma essenziali sono le unit utilizzate: fare unanalogia, si tratta della stessa filosofia
1. Arduino Uno: sistema di controllo con il utilizzata dalle distribuzioni Linux. Per di pi, la
quale viene acquisita la distanza rilevata presenza di interfaccia di comunicazione USB
dal sensore ad ultrasuoni, ed inviato il co- (necessaria per lo scambio dati con il PC, uti-
mando per la movimentazione del motore lizzabile anche come alimentazione), di un re-
in continua; golatore di tensione (maggiore flessibilit nella
2. Motor Shield di Infineon: necessaria per scelta del sistema di alimentazione) e pin per
comandare il motore in continua, regolan- linterfacciamento I/O (possibilit di collegare di-
done velocit e direzione. Il tutto pos- spositivi analogici e/o digitali, sia in input che in
sibile grazie alla presenza di un H-Bridge output), lo rendono molto versatile.
(ricevuta grazie al contest); Allhardware viene affiancato un ambiente di svi-
3. Un motore in continua da 9 V: deputato luppo integrato (IDE) multipiattaforma (Macinto-
alla rotazione della base su cui installato sh, Linux e Windows), che richiama la stessa
il sensore; struttura del C e C++ (noti linguaggi di program-
4. Un sensore ad ultrasuoni, lHC-SR04: mazione) e consente, anche a chi di elettronica
attraverso il quale vengono acquisite le ne sa ben poco, di cimentarsi nella realizzazione
misure di distanza. di progetti scrivendo da se gli sketch. Altro punto
Arduino (Figura 1.3.1) una scheda elettroni- a favore di Arduino, la possibilit di interagire
ca di piccole dimensioni con un microcontrollore con i sistemi operativi e con i software ivi instal-
ed una circuiteria di contorno, utilizzata per la lati, ad esempio Adobe Flash.
realizzazione di prototipi, per scopi hobbistici e Tutte queste caratteristiche hanno consentito lo
didattici. sviluppo, da parte di aziende e di privati, di li-
La forza di Arduino risiede nellessere Open brerie che facilitano sempre di pi i neofiti nella
Source: sia lambiente di sviluppo che il softwa- realizzazione di sistemi abbastanza evoluti, ri-
re di corredo, come anche lo stesso schema ducendo i tempi ed i costi di progetto. Inoltre,
hardware, sono liberi ed aperti a tutti. Volendo la possibilit di collegarlo addirittura ad un LCD
54} Speciale Arduino - TUTORIAL

(Liquid Cristal Display, Schermo a Cristalli Li- la chiusura dei MOSFET di potenza allinterno
quidi) lo rende un dispositivo completamente del ponte, modificano la corrente media e dun-
autonomo. Avviato il software, il sistema lavora que la sua velocit.
in maniera del tutto indipendente acquisendo i Volutamente non si voluti entrare nel detta-
dati che si trovano sul campo, elaborandoli ed glio di funzionamento del ponte, n sulla tecni-
intraprendendo azioni sulla base del sistema di ca di modulazione per il comando dei MOSFET
controllo implementato. Si rimanda il lettore ad (PWM o PLL, acronimo di Phased Locked Loop
ulteriori approfondimenti al riguardo. ovvero Anello ad Aggancio di Fase), si riman-
da il lettore pi curioso a successivi approfondi-
menti al riguardo.

Figura 1.3.2: Motor Shield di Infineon. Figura 1.3.3: Sensore ad ultrasuoni HC-SR04.

La Motor Shield (Figura 1.3.2) unit fonda- Il sensore ad ultrasuoni (HC-SR04, Figura
mentale per il controllo di un motore DC (Di- 1.3.3) laspetto che merita un maggiore livello
rectCurrent, Corrente in Continua), senza la di dettaglio, essendo il cuore dellintero sistema.
quale non sarebbe possibile regolarne n la Come gi detto in precedenza, utilizza le onde
velocit, n la direzione. Inoltre, consente di sonore per la rilevazione della distanza da un
alimentare il motore con una sorgente di ten- oggetto. A tale proposito, fondamentale sape-
sione differente da quella che alimenta lunit di re che le onde sonore quando incontrano lin-
controllo, evitando cos possibili danneggiamen- terfaccia di separazione tra due mezzi materiali
ti del microcontrollore, incapace di fornire una danno luogo a fenomeni quali rifrazione e rifles-
corrente sufficiente a pilotarlo. sione.
Componente fondamentale, deputato al pilotag- Si parla di rifrazione (Figura 1.3.4) quando lon-
gio del motore, il Ponte-H (H-Bridge), saldato da incontra la superficie di separazione tra due
sulla scheda, circuito responsabile della modu- mezzi aventi impedenza acustica differente,
lazione della corrente media che scorre ai capi parte dellonda viene riflessa, laltra parte con-
del motore. Senza entrare in inutili tecnicismi, tinua la propagazione allinterno del mezzo con
ripetendo qualcosa di gi noto a molti, la shield un angolo di propagazione differente da quello
utilizza il segnale proveniente dal pin PWM (Pul- di incidenza. Il fenomeno causa una perdita di
se Width Modulation, Modulazione ad Ampiezza energia, dunque riduce la distanza di propaga-
di Impulsi) di Arduino per modulare lapertura e zione dellonda acustica. Si tratta di un fenome-
Speciale Arduino - TUTORIAL {55

no da evitare, perch non consente la misura misura di distanza.


della distanza da un oggetto.

Figura 1.3.5: Differenza tra riflessione speculare e scattering.

Un sensore ad ultrasuoni come lHC-SR04 misu-

Figura 1.3.4: Schema riassuntivo del fenomeno della ra il tempo impiegato (ms) dalla onde sonore (Fi-
rifrazione.
gura 1.3.6), emesse da una sorgente, a tornare
indietro, a seguito dello scontro con un ostacolo
La riflessione, al contrario, un fenomeno che
in grado di rifletterle. La limitazione nellutilizzo
ben si presta alle operazioni di misura. A tale
del sensore risiede nellimpossibilit dimpiego
proposito, quando si parla di riflessione im-
con oggetti in grado di assorbire le onde acusti-
portante distinguere tra due fenomeni riflessivi
che. Nonostante ci, riesce ad offrire una buona
(Figura 1.3.5):
accuratezza ed una stabile lettura della distanza
Riflessione speculare: londa sonora im-
nellintervallo dai 2 ai 400 cm, tenuto in conside-
patta con linterfaccia di separazione di
razione anche il costo (tra i 2/3 ).
due mezzi materiali e si riflette, dirigendo-
Il fascio di onde sonore (Figura 1.3.7), emesse
si nuovamente verso la sorgente. Le onde
dalla sorgente situata di fianco al ricevitore, ha
riflesse si propagano in ununica direzio-
forma conica, la stessa forma delle onde riflesse
ne;
da un ostacolo. La forma del fascio fa s che il
Scattering o diffusione: fenomeno fun-
sensore riceva molte riflessioni, dai diversi og-
zione del rapporto delle lunghezze don-
getti presenti allinterno dellambiente, ci ren-
da sonore e della dimensione media delle
de il sensore, da solo, incapace di distinguere
particelle. Le onde riflesse si propagano in
un oggetto da un altro o aperture negli oggetti
tutte le direzioni. Se lenergia delle onde ri-
troppo piccole. Per sopperire a tale problema,
flesse non sufficientemente elevata non
il sensore dotato di unapposita circuiteria di
possibile individuare un picco denergia,
controllo.
e quindi non sar possibile effettuare la
56} Speciale Arduino - TUTORIAL

Figura 1.3.6: Schema di funzionamento sensore ad ultrasuoni.

Figura 7: Fascio di onde emesse e ricevute dal sensore


ad ultrasuoni.

Il principio di funzionamento (Figura 1.3.8) ab-


Figura 8: Logica dei segnali dal/al HC-SR04.
bastanza semplice:
1. Si porta al valore logico alto il pin di trigger
del sensore per un tempo di almeno 10 s; Al fine di mantenere livelli di tensione di alimen-
2. Il modulo automaticamente invia unonda tazione stabili, quanto pi possibile, stato uti-
acustica alla frequenza di 40 kHz e si pone lizzato un regolatore di tensione (Figura 1.4.1),
in ascolto di un segnale ad onda quadra di in particolare il L7805CV , capace di ricevere in
ritorno; ingresso una tensione continua fino a 35 V e di
3. Se il segnale torna alla sorgente, in uscita produrre in uscita una tensione continua di 5 V ,
viene restituito il tempo che intercorso
la stessa utilizzata per alimentare il sensore ad
tra linvio e la ricezione del segnale, da qui
ultrasuoni HC-SR04.
si procede al calcolo della distanza utiliz-
Il regolatore di tensione, presente in qualunque
zando la formula:
circuito elettronico, ha lo scopo di fornire le pre-
cise tensioni di alimentazione necessarie per il
funzionamento dei circuiti elettronici analogici e
digitali presenti allinterno di una rete, evitando
LO SCHEMA CIRCUITALE
cos malfunzionamenti e danneggiamenti del si-
Dopo aver capito quali sono i componenti del pro-
stema dovuti a bruschi sbalzi di tensione. Tali
getto, come funzionano, e quali sono i vincoli fisici
sono le ragioni per cui si preferito non collega-
che ne condizionano loperativit, non resta altro da
re il sensore ai pin di alimentazione forniti dal si-
fare che interconnetterli tra loro, alimentandoli se-
stema di controllo (Arduino UNO), ma attraverso
condo quanto specificato allinterno dei datasheet.
Speciale Arduino - TUTORIAL {57

il regolatore di tensione direttamente al package


di batterie garantendo che lHC-SR04 funzioni
sempre con un alimentazioni pari a 5 V.

Figura 1.4.2: Motor Shield di Infineon a seguito delle


modifiche.
Figura 1.4.1: Schema circuitale del rilevatore sonar.

Per prima cosa, stato necessario dissaldare


Inoltre, particolare attenzione stata posta nel il condensatore elettrolitico per poi rimontarlo in
collegare tutti i dispositivi allo stesso riferimento maniera orizzontale, con il fine di ridurre quan-
(ground, massa), con il fine di evitare misura- to pi possibile lingombro consentendo cos il
zioni errate dovute a riferimenti diversi. Come montaggio di altri moduli al sistema di controllo
mostrato in Figura 1.4.1, i riferimenti delle bat- come ad esempio un display LCD.
terie, come quelli del regolatore di tensione, del Successivamente, sono state montate delle
sistema di controllo e della motor shield, sono morsettiere sia sulle piazzole per il pilotaggio
tutti cortocircuitati tra loro. dei motori, sia su quelle per il collegamento del-
Nello schema circuitale (Figura 1.4.1), realizza- la sorgente di alimentazione supplementare, il
to utilizzando il software open source Fritzing, tutto allo scopo di renderne pi agevole lutilizzo
sono evidenziate le interconnessioni tra i dispo- piuttosto che montare le boccole a cui poi colle-
sitivi e lalimentazione: gare le relative banane (Figura 1.4.3).
I pin del sensore ad ultrasuoni, in parti-
colare ECHO e TRIGGER, sono collegati
rispettivamente a pin digitali 2 e 4 di Ardu-
ino;
Il motore in continua collegato alla mor-
settiera montata sulla motor shield.

MOTOR SHIELD DI INFINEON: LE MO-


DIFICHE
Prima di passare allimplementazione del siste-
ma di rivelazione in ambiente Matlab Simulink
verranno illustrate le modifiche apportate alla Figura 1.4.3: Connettori, in gergo banane.
motor shield di Infineon.
58} Speciale Arduino - TUTORIAL

Infine sono stati saldati i connettori fondamen- controllore e lutilizzo di tutti gli strumenti che
tali per il montaggio impilato con il sistema di Matlab mette a disposizione. A tale proposito
controllo. Il circuito ottenuto mostrato in Figura stato sviluppata unapposita libreria, installabile
1.4.2. direttamente dal promt dei comandi digitando
supportPackageInstaller (Figura 1.5.1), per poi
RILEVATORE IN AMBIENTE MATLAB- scegliere il device di interesse (funzione dispo-
SIMULINK nibile dalla 2012b e successive).
Passiamo ora al vivo della trattazione, illustran-
Lausilio del supporto IDE di Arduino per Matlab,
do il software implementato in ambiente Matlab-
e di s-function ad hoc (appositi blocchetti, dispo-
Simulink per la realizzazione del rivelatore so-
nibili nella libreria di default di Simulink, per luti-
nar con Arduino.
lizzo di codice C in Matlab) per linterfacciamen-
Matlab, per chi non lo conoscesse, ambiente
to dei sensori e della motor shield allambiente
di lavoro molto utilizzato in ambito ingegneristi-
di sviluppo, hanno consentito la realizzazione
co, e non solo, per il calcolo numerico e lanalisi
statistica. Consente di manipolare matrici, visua- del software di controllo per il rivelatore sonar

lizzare funzioni e dati, implementare algoritmi, e riportato in Figura 1.5.2. Si tratta di un software
interfacciarsi con altri programmi. Questi sono modulare, composto da un blocco
soltanto alcuni degli innumerevoli vantaggi che SONAR: misura la distanza da un ogget-
il software mette a disposizione dei propri utenti, to;
e che ne hanno decretato la diffusione. MOTOR: gestisce il motore in continua
(velocit e cambio direzione);
XY GRAPH: realizza lo
schermo del rivelatore mostran-
do, in maniera approssimativa
(dovuta alla bassa risoluzione
del sensore), la sagoma dellog-
getto di fronte al rivelatore.

Il blocco SONAR (Figura 1.5.3)


integra la libreria NewPing di
Arduino, utilizzata per la sua
affidabilit ed ottima struttura,
Figura 1.5.1: Support Package Installer di Matlab.
per la misurazione della distanza da un oggetto.

Data la moltitudine di utilizzatori, ed appurate le Inoltre, il blocco saturazione evita che malfun-

potenzialit del sistema di controllo Arduino, gli zionamenti del sensore possano restituire valori
sviluppatori hanno pensato di agevolare il lavo- numerici fisicamente non misurabili, perch al di
ro dei progettisti fornendo un ambiente grafico fuori dellintervallo di misurazione descritto dal
che consentisse la programmazione del micro- datasheet.
Speciale Arduino - TUTORIAL {59

Figura 1.5.2: Software del rivelatore sonar realizzato in Matlab.

Figura 1.5.3: Blocchetto SONAR in Matlab.

Osservando landamento delle misure di distan- per il filtro pari a 10. Questo riceve in ingres-
za, si notata per la presenza di misure falsa- so un array contenente le misure di distanza e
te (fluttuazioni su valori continui) dovute a fault sostituisce a ciascuna misura la media di quelle
del sensore: mancato ritorno dellonda acusti- vicine, in modo da eliminare le fluttuazioni (spi-
ca, causato dallirregolare superficie dellogget- ke) nelle misure.
to, che porta a misure di distanza pari a quella Il blocco MOTOR (Figura 1.5.4), al contrario,
massima misurabile (400 cm). Ragion per cui si responsabile della movimentazione del moto-
optato per la diminuzione del ping intervall (di- re in continua. La velocit, durante lintero pro-
stanza temporale tra limpulso di TRIGGER ed cesso di rilevazione, assume un valore costante
il successivo), fino a raggiungere il minimo pos- pari a 95, scelto sperimentalmente tra il set di
sibile, in modo da acquisire il maggior numero valori ammissibili (0 255). Per quanto concer-
di misure date poi in ingresso ad un filtro FIR a ne, invece, la direzione essa varia secondo la
media mobile. Il numero di coefficienti utilizzati logica riportata in Figura 1.5.5.
60} Speciale Arduino - TUTORIAL

Figura 1.5.4: Blocchetto MOTOR in Matlab.

orario ad antiorario (da destra verso

sinistra) fino al prossimo fronte di sa-

lita.

Infine, il software si compone di un

ultimo blocco che converte le misure

realizzando lo schermo del rilevatore.

La distanza viene scomposta luongo

Figura 1.5.5: Logica cambio direzione del blocco MOTOR.


le componenti x e y, per poi essere in-

viata al blocco XY GRAPH che provvede a rap-

Il motore ruota in senso orario, spostando il sen- presentarle, utilizzando lespressione

sore da sinistra verso destra, fino a che il se- dove

gnale che condiziona la direzione (DIR) assume

valore pari a 2, ovvero fino al fronte di discesa

del segnale PULSE (segnale che si somma al

valore allunit nel software riportato in Figura

1.5.2). Trascorsi 1.35 secondi (met periodo

dellonda quadra, anchesso valore sperimenta- d: la distanza dalloggetto rilevata dal

le) dal fronte di salita di PULSE, il segnale DIR sensore ad ultrasuoni;

assume nuovamente valore pari 1, conseguen- t: la generica variabile tempo;

temente il motore cambia verso di rotazione da TP : il periodo del segnale PULSE.


Speciale Arduino - TUTORIAL {61

RILEVATORE IN PYTHON E SKETCH


y=val*cos((2*pi*time)/2.7)
ARDUINO
plt.plot(x, y, r--, linewidth=2.0)
Seguendo quanto realizzato in ambiente Mat- plt.show()

lab-Simulink stato implementato lo Sketch in except KeyboardInterrupt:


exit()
Arduino (riportato di seguito) per il controllo del

motore in continua, e lacquisizione delle misure serialFromArduino.close()

di distanza dalloggetto. Come nelle s-function

realizzate in Matlab, per il sensore ad ultrasuoni CONCLUSIONI


(HC-SR04) stata utilizzata la libreria NewPing, La realizzazione di un rilevatore SONAR con
mentre per il controllo di velocit e direzione Arduino, progetto di relativa semplicit, ha con-
del motore sono stati utilizzate le funzioni ana- sentito di affrontare concetti chiave come la dif-
logWrite e digitalWrite. Lautore non intende en- ferenza tra un sistema RADAR ed uno SONAR,
trare nei dettagli, commentando riga per riga il il dimensionamento dellalimentazione, per poi
codice prodotto, perch ritiene che il lettore ab- passare ai problemi ed alle relative soluzioni le-
bia una conoscenza minima di tale linguaggio, gate allutilizzo di un sensore ad ultrasuoni low
in caso contrario rimanda il lettore ad ulteriori cost come il HC-SR04. Si tratta di know how che
approfondimenti al riguardo. fanno la differenza tra un progetto funzionante
Di seguito riportato lo script Python per lac- ed uno fatto bene, consentendo allapplica-
quisizione delle misure distanze su seriale e la zione di operare anche in condizioni diverse da
realizzazione del grafico XY. quelle dellesperimento.

Inoltre, limplementazione del software con due


import math strumenti diversi (Matlab-Simulink e Sketch-
import os
import matplotlib.pyplot as plt Python) ha consentito di delineare vantaggi/

serialFromArduino = serial.Serial(/dev/ svantaggi derivanti dai due ambienti di sviluppo,


ttyACM4,115200) aprendo le porte anche a chi di programmazio-
serialFromArduino.flush()
ne sa ben poco con tutti gli annessi e connessi.
plt.figure(1)
plt.xlabel(Graphic) In tema di sviluppi futuri si potrebbe pensare

allintegrazione del sistema allinterno di picco-


while True:
try: li robot, realizzati utilizzando sempre Arduino,
val = ord(serialFromArduino.read())
time=tm_sec(5) combinando cos la parte di sensing con quella
x=val*sin((2*pi*time)/2.7) di controllo.
62} Speciale Arduino - TUTORIAL

#include <NewPing.h>
// Pin assignment for first half-bridge
const int IN_1 = 3; // input (PWM)
const int INH_1 = 12; // inhibit (low = sleep)

// Pin assignment for second half-bridge


const int IN_2 = 11; // input (PWM)
const int INH_2 = 13; // inhibit (low = sleep)

//Variabile to change the motor direction


int timer;
float constant, interval;

#define TRIGGER_PIN 4 // Arduino pin tied to trigger pin on the ultrasonic sensor.
#define ECHO_PIN 2 // Arduino pin tied to echo pin on the ultrasonic sensor.
#define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor
distance is rated at 400 cm.

NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum


distance.

void setup() {

// Set correct input/output state


pinMode(IN_1, OUTPUT);
pinMode(INH_1, OUTPUT);
pinMode(IN_2, OUTPUT);
pinMode(INH_2, OUTPUT);

// Set initial output states


analogWrite(IN_1, 95); // set motor speed to 0
digitalWrite(INH_1, HIGH); // enable OUT1
analogWrite(IN_2, 95); // set motor speed to 0
digitalWrite(INH_2, LOW); // disable OUT2

//Variabile to change direction


constant=2.7; interval=constant;

// initialize serial communication:


Serial.begin(115200);
while (!Serial) {
; // wait for serial port to connect. Needed for Leonardo only
}
}

void loop() {

timer=millis();
delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between
pings.
unsigned int uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
Speciale Arduino - TUTORIAL {63

Serial.println(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 =


outside set distance range)

/* half bridge mode, two unidirectional motors motor 1 connected to OUT1 and GND motor 2 connected
to OUT2 and GND */

//Change motor direction


if(timer>=interval){
digitalWrite(INH_1, LOW); // disable OUT1
digitalWrite(INH_2, HIGH); // enable OUT2
interval=interval+constant;
}
}

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/realizzazione-di-un-rilevatore-sonar-con-arduino
64} Speciale Arduino - TUTORIAL

Pi sprint alla tua auto con


Arduino e Processing di Ernesto Sorrentino

Q
uesto progetto propone un dispositivo per
rilevare spostamenti meccanici di una leva
e attivare un rel a una determinata po-
sizione stabilita. Pu essere utilizzato in molti
settori, come in una catena di montaggio per
determinare leccessiva inclinazione di un piano
o per monitorare spostamenti di una leva. Nel
seguente articolo, invece, vedremo come utiliz-
zarlo per individuare la prima marcia di unauto- https://www.youtube.com/watch?v=C8QnCYx3u_s
vettura in modo tale da disabilitare, tramite rel,
il climatizzatore ottenendo pi potenza a bassi Come gi accennato, il sistema composto di
regimi. In seguito dopo un determinato tempo, due parti; hardware e software.

settato al PC, si potr riattivare il clima. Nella prima parte sar esaminato lo schema
elettrico e la procedura di montaggio. Nella se-
conda illustrer lutilizzo del programma al PC
(per configurare e tarare il circuito) e la realizza-
zione dello stesso con Processing e PGUI (tool
dinterfaccia grafica per Processing).

HARDWARE

Il trasduttore, da porre sulla parte meccanica


in movimento, collegato al circuito tramite un
cavo di prolunga mentre il resto dellelettronica
dovr essere inscatolata in un contenitore in
ABS di piccole dimensioni. Il sistema, collega-
to al PC tramite porta USB, pu essere pro-
grammato per assegnare i tempi e la sensibi-
lit dintervento del rel. Il circuito elettronico costituito da un accelero-
Speciale Arduino - TUTORIAL {65

metro analogico, un sensore di temperatura e alimentarlo a 5 V.


un rel tutti gestiti con Arduino micro. La sem-
plicit dello schema permette una prototipazio-
ne anche su breadbord.

Laccelerometro collegato alle porte analo-


giche di Arduino come segue:
Laccelerometro, il MMA7361 della Freescale Asse X alla porta A0;
Semiconductor, del tipo capacitivo a tre assi Asse Y alla porta A1;
e con uscite analogiche. Asse Z alla porta A2.
Tra le sue caratteristiche troviamo: Il DS18B20 della DALLAS un termometro digi-
consumi ridotti (400 uA, di cui si riducono tale con misurazione della temperatura a 12bit/
ulteriormente a 3uA in mode sleep); centigradi. Aggiunto al circuito per monitorare la
range di tensione basso (da 2.2 V a 3.6 temperatura dambiente e attivare il rel solo per
V); soglie prestabilite tramite tool al PC.
alta sensibilit (800 mV/g a 1.5 g);
possibilit di configurare la sensibilit (1.5
g o 6 g);
rilevamento di caduta libera (0 g);
a norma con i requisiti RoHS;
economico.

Le applicazioni tipiche sono:


rilevamento caduta dei HDD; Tra le sue caratteristiche troviamo:
registrazione eventi per contapassi e ga- range di lettura esteso (da -55 C a 125
ming; C) con unaccuratezza del +/-0. 5 C;
compensatore di tilt nelle bussole elettro- la tensione di operazione pu variare da
niche e altro ancora. 3 V a 5,5 V;
Questo integrato fornito solo con package la comunicazione dei dati col microcon-
LGA-14 pertanto scomodo da stagnare su trollore avviene su un Bus da un solo filo.
PCB. Inoltre per ovviare allinstallazione dei Ogni DS18B20 ha un codice di serie univoco a
componenti aggiuntivi, come i condensatori da 64 bit, che consente a pi sensori di funziona-
3.3 nF nelle uscite analogiche (per eliminare re sullo stesso Bus 1-wire; Questo elemento
eventuali disturbi), ho optato per una versione connesso alla porta D2 dellAtmega.
commerciale gi montata su scheda. In pi Il rel, tipo HFD3, pu essere configurato trami-
presente anche un regolatore di tensione per te tool per simulare un pulsante o come inter-
66} Speciale Arduino - TUTORIAL

ruttore. Configurazioni che possono essere uti- Prima di sigillare i sensori bisogna settare lM-
lizzare per pilotare carichi pesanti o per gestire MA7361 configurando due pin. Lingresso
un comando a bassa potenza, come il pulsante g-select deve essere collegato a massa per
AC del clima. impostare il g-range a 1,5 g (sensibilit a
800mV/g). Invece lingresso sleep al livello
ASSEMBLAGGIO alto (ATTENZIONE per questo integrato il li-
Entrambi i sensori (MMA7361 e DS18B20) de- vello alto inteso a 3,3V e NON 5V) per disa-
vono essere collegati al circuito tramite un cavo bilitare la funzione di stand-by.
di prolunga e impacchettati insiemi con una
guaina termo-restringente, ottenendo cos un
unico involucro da collegare sulla parte mecca-
nica da monitorare.

Il resto del circuito stato montato, per la sua


semplicit, su basetta mille-fori e inscatolato
in un contenitore in ABS.
Il cavo dovr essere composto di 5 fili + calza
(da usare per connettere la massa) si consiglia
di utilizzare quelli per apparecchiature audio
perch sono pi resistenti e flessibili.
A differenza di com riportato dallo schema
laccelerometro, essendo gi assemblato, do-
vr essere alimentato a 5 V direttamente da
Arduino.

PROGRAMMA
Per configurare la parte hardware stato rea-
lizzato un tool con Processing e PGUI (classe
per creare comandi dinterfaccia grafica con
Speciale Arduino - TUTORIAL {67

Processing). Lutilizzo semplice e ci sono po- PULSANTI


chi comandi da regolare. Avviando lo sketch di Il primo comando, pulsante Calibra, ha la fun-
Processing noteremo una finestra con lavviso zione di azzerare i valori degli assi per creare un
di scollegare il dispositivo dallalimentazione punto di riferimento; ottimo per determinare la
esterna e collegarlo a una qualsiasi porta USB posizione di folle del cambio.
del PC.

Cliccando sul pulsante Connetti il programma Per eventuali errori o modifiche, del punto ap-
tenter una connessione con Arduino e dopo pena creato, possibile ripristinare i valori degli
aver stabilito il collegamento cambier videata assi cliccando il pulsante Reset HW. Lultimo
passando a, quella nominata nello sketch, pulsante Memorizza utilizzato per inviare,
window 2. ad Arduino, la posizione scelta per far attivare
il rel. Tale valore rimarr in memoria, anche in
caso di mancata alimentazione al circuito, fino a
quando non verr sostituito con un nuovo dato.
Tutti i dati saranno memorizzati nelleeprom di
Arduino e caricati nei rispettivi vettori (label) a
ogni riavvio del dispositivo.

CURSORI
Questa finestra divisa in tre parti. La prima in Il primo cursore (T) utilizzato per determinare
alto composta da quattro display; quella centra- la soglia di temperatura minima per far attivare
le con i comandi per interagire col dispositivo e in rel. Come valore da impostare fare sempre
riferimento alla temperatura rilevata nellabita-
lultima parte, in basso, per visualizzare le infor-
colo. Il secondo cursore (t) imposta il tempo,
mazioni di stato dellhardware.
espresso in secondi, della durata attivazione
rel dopo che la posizione memorizzata cam-
DISPLAY
biato. Il terzo cursore (S) definisce la tolleranza,
I display sono utilizzati per visualizzare le infor-
espressa in percentuale, dei valori letti dallac-
mazioni ricevute da Arduino. I primi tre visualiz-
celerometro con il punto memorizzato degli assi.
zano i valori degli assi espresso in g mentre
Unopportuna regolazione dei cursori t e S
nel quarto display visualizzata la temperatura
aiuta a evitare un falso intervento del rel in pia-
dellambiente dove situato il sensore.
ni molto inclinati.
68} Speciale Arduino - TUTORIAL

CHECK INSTALLAZIONE
Il rel pu essere configurato in due modalit; I passaggi successivi saranno poco dettagliati
Switch o push. Come interruttore, settando il dato che ogni veicolo ha una procedura din-
check Sw, che si attiva quando il sensore di stallazione a se. Il primo passo, pi semplice,
trova nella posizione memorizzata e si disatti- quello di collegare laccelerometro alla leva
va dopo trascorso il tempo t e fuori dal range del cambio. Basta togliere la cuffia dalla leva (in
memorizzato. Nellaltra modalit, settando il alcuni casi per toglierla bisogna prima svitare il
check Ph, il rel si comporta come un pul- pomello del cambio) e fascettare il sensore pi
sante; ossia ogni volta che il sensore nella po- in lato possibile. In questa posizione avr un
sizione memorizzata il rel si attiva solo per 200 ampio spazio di movimento e di conseguenza
ms. Ripeter la stessa funzione quando il sen- pi tolleranza dintervento.
sore si trover fuori dal range della posizione
memorizzata e dopo trascorso il tempo settato
col cursore t.

LED
Questoggetto grafico segnala lo stato del rel,
luce rossa per disattivato e verde per attivo.

Terminata la configurazione e memorizzato la


posizione del sensore, il programma chiede di
riavviare il dispositivo scollegandolo dalla porta
USB, questo permetter di caricare tutti i dati
memorizzati nelleeprom di Arduino. Il secondo passo consiste nel collegare i contatti
del rel al carico, questoperazione pu essere
svolta in due modi. Il primo consiste nel collega-
re i contatti del rel in serie al fusibile del clima-
tizzatore, tagliando il filo corrispondente dietro
alla scatola fusibile. Per questa scelta bisogna
settare il rel in modalit Sw. Il secondo me-
todo quello di collegare i contattati del rel in
parallelo al pulsante AC del clima per simu-
Speciale Arduino - TUTORIAL {69

larne la pressione. Con questo metodo il rel


void readData(){
deve essere configurato in modalit Ph. In
somma_x = 0;
ultimo bisogna connettere lalimentazione al cir- somma_y = 0;
cuito, consiglio di usare un positivo sotto chiave somma_z = 0;
(15) in modo da non aver assorbimenti, anche for (int i=0;i<10;i++) {
se ridotti, a veicolo spento. Tale segnale pu val_x = analogRead(A0);
somma_x = somma_x + val_x;
essere prelevato dalla scatola fusibile o, di si-
val_y = analogRead(A1);
curo presente, dietro il blocchetto della chiave. somma_y = somma_y + val_y;
Per eventuali dettagli dinstallazione, su ogni val_z = analogRead(A2);
somma_z = somma_z + val_z;}
tipo di veicolo, potete far richiesta inserendo
un commento alla fine dellarticolo. media_x = somma_x / 10;
media_y = somma_y / 10;
media_z = somma_z / 10;
SKETCH
Nello sketch di Arduino, per gestire il senso- x = media_x-cal_x;
y = media_y-cal_y;
re di temperatura, sono state utilizzate due
z = media_z-cal_z;
librerie di Miles Burton; OneWire e Dalla-
sTemperature. La OneWire coordina la tra- XG = abs(x/165.5);
YG = abs(y/165.5);
smissione dati su un solo filo mentre la Dalla- ZG = abs(z/165.5);
sTemperature adoperata per dialogare con i
sensors.requestTemperatures();
sensori di temperatura della famiglia DSxx. Il
t = (sensors.getTempCByIndex(0)-2);
cuore del programma composto di un ciclo di dtostrf(t,0,1,T);
eventi strutturato nel seguente modo: }
Lettura dati dai due sensori, MMA6371 e
DS18B20; Dopo la memorizzazione nelle rispettive label i
Invio dati al PC; dati vengono inviati al PC. La trasmissione av-

Ricezione dati dal PC; viene tramite il comando Serial.print, inviando


pi blocchi di dati separati da uno spazio. Ogni
Analisi dei dati ricevuti;
blocco corrisponde a un valore letto dai sensori
Gestione del rel.
mentre lo spazio di separazione servir a Pro-

void loop() { cessing per splittare i dati ricevuti.


readData(); Dati inviati da Arduino:
sendData();
reciveData(); void sendData(){
command(); Serial.print(stored);
satusData(); Serial.print( );
} Serial.print(active);
Serial.print( );
Serial.print(XG);
Nella prima parte, Arduino, esegue la lettura dei Serial.print( );
dati ricevuti dai sensori Serial.print(YG);
70} Speciale Arduino - TUTORIAL

Arduino, grazie al prefisso, riconosce in quale


Serial.print( ); label memorizzare il dato.
Serial.print(ZG);
Serial.print( );
Serial.println(T); if(Serial.available() > 0){
} if(Serial.peek() == p){
Serial.read();
push = Serial.parseInt();
I dati inviati sono : }
}
Info stato di archiviazione;
Stato del rel;
Asse X, Y e Z (espresso in g); Sono state utilizzate due tecniche di trasmis-
Temperatura. sione dati diverse solo per motivo didattico.
Dati ricevuti da Processing:
Nella quarta parte del programma si analizza-
no i dati ricevuti per gestire le funzioni corri-
if (myPort.available() > 0) { spondenti come: calibrazione, memorizzazio-
val = myPort.readStringUntil(10);
String[] a = split(val, ); ne e restore. Nella quinta e ultima parte dello
stored = int(a[0]); sketch avviene la comparazione dei valori attua-
active = int(a[1]); li dellaccelerometro con quelli memorizzati per
text_d1 = a[2];
text_d2 = a[3]; gestire il rel. Un altro punto fondamentale dello
text_d3 = a[4]; sketch di Arduino la memorizzazione di tut-
text_d4 = a[5]; ti i dati ricevuti nelleeprom; scelta affrontata
myPort.clear(); }
per alimentare il circuito tramite un positivo sotto
chiave (15). A ogni avvio del circuito il program-
Il terzo punto consiste nel controllare la ricezione ma carica tutti dati delleeprom alle label corri-
dei dati e smistare i valori nelle rispettive label. spondenti. La registrazione dei dati strutturata

In questo passaggio ho adottato una tecnica come segue:


Registro 01 e 02 valore di riferimento
diversa da quella precedente. I dati non sono
dellasse X;
inviati, da Processing, tutti contemporaneamen-
Registro 03 e 04 valore di riferimento
te ma solo quelli interessati e per riconoscere
dellasse y;
un determinato valore dagli altri stato aggiunto
Registro 05 e 06 valore di riferimento
un prefisso alfabetico, personalizzato, come
dellasse z;
nellesempio:
Registro 07 valore della temperatura;
a ogni pressione di un pulsante, Processing, in-
Registro 08 valore del tempo;
via il numero corrispondente (label push) ag- Registro 09 stato del rel;
giungendo il prefisso p Registro 10 e 11 valore di calibrazione
dellasse X;
write = p+push;
myPort.write(write); Registro 12 e 13 valore di calibrazione
dellasse Y;
Speciale Arduino - TUTORIAL {71

Registro 14 e 15 valore di calibrazione


dellasse Z.
I segnali letti sugli assi dellaccelerometro sono
tensioni espresse in bit. Ogni singolo asse gene-
ra un valore che pu superare i 255 bit, valore
massimo da inserire in una unica cella delle-
eprom. Pertanto sar diviso in due registri; nel
primo registro saranno inseriti i primi 255 bit e
nel secondo i restanti del valore letto.

Gli sketch originali di Processing e Arduino, in


download a fine articolo, sono completi di com-
mento in ogni loro parte.

ELENCO MATERIALE
1 Arduino micro;
1 sensore temperatura DS18B20;
1 Accelerometro MMA7361;
1 rel da 5V;
1 regolatore di tensione 7805;
1 Transitor BC547;
2 resistenze da 4.7 Kohm 1/4W;
2 condensatori da 100 nF;
1 diodo 1n4148;

CONCLUSIONI
Il progetto pu crescere e migliorare, le idee per
evolverlo sono tante. Ad esempio con una pic-
cola modifica allo sketch di Arduino possibile
utilizzare un accelerometro digitale con interfac-
cia I2C, in questo modo si ridurr il numero dei
fili nel cablaggio tra i sensori e centralina. Unal-
tra idea potrebbe essere, modificando lo sketch
di Processing, aggiungere altri pulsanti per me-
morizzare pi posizioni del cambio.

Download dei file PS1G5

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/piu-sprint-alla-tua-auto-con-arduino-e-processing
72} Speciale Arduino - TUTORIAL

La regolazione di temperatura
con Arduino di Nicola Taraschi

LHARDWARE ramento si ha con i sensori digitali tipo DS18B20

L
architettura dellhardware con ARDUINO il quale produce un segnale digitale e pertanto
schematizzata nella figura 1. Tre potenzio- esente da oscillazioni.
metri permettono lacquisizione dei valori di
setpoint, banda proporzionale o differenziale
nella regolazione on-off, e del tempo integrale,
che sono i parametri che definiscono le tre re-
golazioni considerate. Il punto centrale dei po-
tenziometri va al pin analogico di ingresso corri-
spondente. Nella figura 2 lo schema del circuito
di potenza che alimenta le lampadine da 5 watt
12 V, realizzato con mosfet IRF530, che soppor-
ta senza raffreddamento fino a 25 watt. S= se-
gnale di controllo da ARDUINO. L=lampadina,
VDD= alimentazione a 12 V.Il segnale S prove-
niente da un pin analogico di uscita Arduino con
Figura 1: schema collegamenti
tecnica PWM attiva o meno la conduzione del
Mosfet. Il diodo fast serve per proteggere il mo-
sfet dalle scariche dei carichi induttivi presenti
su un carico ohmico-induttivo e nel caso di cari-
chi puramente ohmici non sarebbe necessario.
Il display GROVE un display seriale che ha bi-
sogno, a parte lalimentazione a 5V DC, di solo
due segnali, e quindi particolarmente comodo
nei collegamenti rispetto a quelli tradizionali che
hanno bisogno di 6 segnali. Uno shield Grove
permette attraverso cavetteria apposita il colle- Figura 2: il circuito di potenza con i Mosfet
gamento rapido ad Arduino. Il sensore di tem-
peratura un NTC il cui collegamento raffigu-
rato nella figura 3. Nel caso di questo sensore
il segnale analogico. La tensione del punto A
acquisita da Arduino varia in funzione della tem-
peratura e lapposita routine software la trasfor-
ma nel valore di temperatura corrispondente. Il
difetto dei sensori analogici nella oscillazione
Figura 3:collegamento dei sensori NTC e DS18B20
dei valori rilevati a causa dei disturbi. Un miglio-
Speciale Arduino - TUTORIAL {73

Figura 6:il display GROVE

Figura 4: lapparecchiatura complessiva. Lalimentatore,


la scheda ARDUINO con uno shield Grove per linserzio-
ne del display, e il circuito di potenza. Figura 7: I due mosfet

IL SOFTWARE
Come noto ogni programma su ARDUINO si
sviluppa su due routine fondamentali: SETUP,
la routine che viene eseguita solo e sempre al
lancio del programma, e LOOP che la routi-
ne che viene eseguita successivamente e sem-
pre finch lhardware alimentato. Tutte le altre
routines sono richiamate o da quella di SETUP
oppure, comunemente da quella di LOOP. Il sof-
tware si sviluppa secondo i seguenti blocchi fun-
zionali:
Inizializzazione
acquisizione del valore della temperatura
acquisizione dei parametri
attesa della richiesta dati dal PC ed esecu-
Figura 5. Le due lampadine e il sensore in un contenitore zione del tipo di regolazione impostato ed
momentaneamente scoperto
invio dati al PC
74} Speciale Arduino - TUTORIAL

Inizializzazione. La routine SETUP inizializza la La routine di lettura dal sensore NTC


porta seriale di comunicazione con il PC,(Serial..)
configura le uscite come OUTPUT, (pinMode) float leggo_temp(int porta)
inizializza il display LCD, (setup_lcd..)setta il tipo
di regolazione secondo due parametri(inizia_ {float beta=3450;
reg..). Il primo true=regolazione diretta,
false=regolazione inversa. Ricordiamo che nel- float tensione;
la regolazione diretta ad un aumento del valore
della variabile corrisponde una diminuzione del- float rx ;
la potenza dellattuatore e viceversa nella rego-
lazione inversa. Il secondo segue la convenzio- float R;
ne 1=on-off, 2=proporzionale e 3=PI.
int letto;
La routine SETUP
letto=analogRead(porta);
void setup()
tensione=letto*0.00489;
{
R=(5000-1000*tensione)/tensione;
Serial.begin(9600);
R=R/10000;
pinMode(uscita,OUTPUT);//setta luscita
rx=log(R)/log(exp(1));
setup_lcd() ; //inizializza il display
rx=rx/beta+0.003355705;
//setta il tipo di regolazione
rx=1/rx-273;
inizia_reg(true,3);
return rx;}
}

Si sottolinea che il software valido qualunque La routine leggi_porta


sia la grandezza fisica da controllare. Basta in-
fatti cambiare, oltre lhardware relativo, i para- float leggi_porta(int quale, float xmin, float xmax)
metri di settaggio della regolazione. Sostituendo
la sola routine leggo_temp con altra relativa a { int aa;
diversa grandezza, lelaborazione ed il program-
ma rimangono invariati. float r;
Speciale Arduino - TUTORIAL {75

aa=analogRead(quale); if (tiporeg>1) {

r=xmin+(xmax-xmin)*aa/1023; y=aztot*255/100;// trasforma lazione di regola-


zione dal valore max di 100, in percentuale nel
return r;} valore massimo delluscita di ARDUINO=255

La lettura dei parametri viene eseguita attraver- analogWrite(uscita,y);// replica la stessa uscita
so la chiamata alla funzione leggi_porta. Nella sui 2 attuatori
parentesi sono definiti i parametri passati alla
routine nella sua chiamata: la porta analogica analogWrite(uscita2,y);}
dalla quale acquisire il valore di tensione, il mi-
nimo ed il massimo valore della grandezza risul- inviadati();
tante. Quindi a zero volt corrisponder il valore
minimo e a 5 volt, che corrisponde al valore di }
1023 riportato da ARDUINO (convertitore a 10
bit), corrisponder il valore massimo. Valori in- Se la regolazione ON-OFF lattuatore non
termedi seguiranno la legge lineare. pi modulante e luscita sulla porta solo digita-
Esecuzione della regolazione.La routine le e non analogica.
LOOP svolge tutta lelaborazione. Se vi sono
dei dati inviati dal PC: if (Serial.available()>0) il Lazione ON-OFF
software acquisisce i dati : leggi_x() , svolge il
tipo di regolazione ed invia i dati al PC. if (rdiretta==true){

La routine LOOP if (xv>setpoint+bandap/2) {digitalWrite(uscita,L


OW);stato=false;};
void loop()
if (xv<setpoint-bandap/2) {digitalWrite(uscita,HI
GH);stato=true;};
{ int y;

}
if (Serial.available()>0)

if (rdiretta==false){
{ leggi_x();

if (xv>setpoint+bandap/2) {digitalWrite(uscita,HI
if (tiporeg==1){azione_onoff();} GH);stato=true;};

if (tiporeg==2){azione_propor();} if (xv<setpoint-bandap/2) {digitalWrite(uscita,LO


W);stato=false;};
if (tiporeg==3){azione_pi();}
}
76} Speciale Arduino - TUTORIAL

Limplementazione dellazione regolante va ap- settaggio dei parametri. Il comando millis resti-
profondita. Le regolazioni On-OFF e P sono re- tuisce il tempo, in millisecondi dallaccensione
golazioni in cui lazione regolante direttamente della scheda. La differenza di lettura fra due
collegata al valore attuale della grandezza fisica campionamenti successivi lintervallo di tempo
cercato. Le parti di programma riportate sono
letta. Non cos per la regolazione PI. Lazio-
le pi significative e comunque in allegato
ne integrale legata allarea complessiva sot-
trovate il software completo. In questa sede
tesa dalla funzione temperatura ed il setpoint, non possibile una descrizione dettagliata del-
nel piano temperatura-tempo(figura 8). Ne con- la sintassi del linguaggio software di ARDUINO,
segue che lazione integrale dipende dai valori una versione di C++, che possibile approfon-
precedenti della grandezza fisica e dal tempo. dire al sito di ARDUINO.
Larea pu essere ricondotta ad una somma di
rettangoli aventi tutti la stessa larghezza, linter- LACQUISIZIONE DEI DATI
I dati vengono acquisiti dal PC che li visualizza
vallo di tempo, e aventi come altezze il valore
a schermo( figura 9) ad intervalli di 2 secondi.
istantaneo della grandezza fisica .
Tramite lapposito bottone i dati fino a qui ac-
quisiti vengono inviati ad un file EXCEL, ed
quindi possibile costruire un grafico( figura 10).
Landamento irregolare della temperatura do-
vuto allerrore introdotto dallacquisizione ADC.
Il sistema comunque si assesta infine al valore
di setpoint. Nella tabella 1 un campione di dati.
Lazione proporzionale legata allo scostamen-
to ed 50% quando la temperatura uguale a
quella di setpoint, zero quando la temperatura
setpoint+banda proporzionale/2, 100 quan-
Figura 8 : significato dellazione integrale
do la temperatura setpoint-banda proporzio-
nale/2. Lazione integrale legata alla somma
Per lintervallo di tempo fra un campionamento e
delle aree sottese moltiplicata per una costante,
laltro della grandezza fisica va fatto un discorso
dipendente dal tempo integrale introdotto come
a parte. Se non vi fosse la comunicazione con il
parametro. La costante negativa nel caso di
PC , ritenendo trascurabile il tempo di elabora-
regolazione diretta e positiva nel caso di rego-
zione, con il comando delay(1000) si potrebbe
lazione inversa. Quando la temperatura mag-
assegnare un ritardo temporale di 1 secondo od
giore del setpoint il contributo allarea totale
altro definibile, fra un campionamento e laltro.
positivo e quindi lazione integrale diminuisce
La comunicazione con il PC si svolge in modo
e viceversa. La figura 11 riporta il grafico del-
asincrono: il PC invia, ad intervalli regolari un
la temperatura al variare del setpoint. La figura
byte sulla porta seriale di ARDUINO che in at-
12 visualizza altro grafico, ma in questo caso la
tesa if (Serial.available>0). Quando ARDUINO
sonda una sonda digitale DS18B20. La sonda
riceve il byte svolge lelaborazione ed invia i dati
digitale comunica ad Arduino il valore di tempe-
al PC. La fase di invio dati quella relativamen-
ratura e non una tensione. Pertanto il segnale
te pi lunga. Non quindi noto a priori la durata
pulito e si nota lassenza del frastagliamento
dellintervallo di tempo, e, daltro canto questo
del grafico della temperatura.
tempo correlato al tempo integrale definito nel
Speciale Arduino - TUTORIAL {77

Figura 9: La videata su DELPHI

Figura 10:Il grafico in EXCEL dei dati acquisiti da DELPHI . In ascissa il tempo in secondi, in ordinata la temperatura

Azione proporzio-
Temperatura Scostamento Azione integrale Azione totale
nale
27,6 -0,3 58 33,1 91,1
27,9 0 51 33,1 84,1
27,6 -0,3 58 33,7 91,7
27,3 -0,6 65 33,9 98,9
27,6 -0,3 58 34 92
27,3 -0,6 65 34,5 99,5
27,9 0 51 34,5 85,5
78} Speciale Arduino - TUTORIAL

27,6 -0,3 58 34,5 92,5


27,9 0 51 34,5 85,5
28,2 0,2 44 34,4 78,4
28 0 51 34,5 85,5
28,2 0,2 44 34,2 78,2
28,5 0,5 37 33,9 70,9
27,9 0 51 33,7 84,7
28,5 0,5 37 33,5 70,5
setpoint=28C
banda proporzionale=4C
tempo integrale=100 sec

Tabella 1: campione di dati

Figura 11: andamento della temperatura con variazioni del setpoint. Il picco in basso corrisponde allapertura del coper-
chio della scatola ed il conseguente brusco raffreddamento. In ascissa il tempo in secondi, in ordinata la temperatura

Figura 12:grafico della temperatura con sonda DS18B20. In ascissa il tempo in secondi, in ordinata la temperatura
Speciale Arduino - TUTORIAL {79

LACQUISIZIONE DEI DATI


Arduino dimostra affidabilit sia in termini di
hardware che di software e non un semplice
giocattolo per hobbisti. Una limitazione hardwa-
re linserimento dei collegamenti, cui si pu
ovviare con schede shield che sostituiscono
i connettori di Arduino con morsettiere. Le ap-
plicazioni possono pertanto essere allargate a
controllo di apparecchiature e sensori di tipo se-
miprofessionale.

ALLEGATO
regolazione

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/la-regolazione-di-temperatura-con-arduino
80} Speciale Arduino - TUTORIAL

MEMS, dalla teoria alla pratica:


usiamo un Accelerometro con
Arduino di Piero Boccadoro

C
ome detto in apertura, questa solo la se- notubi di carbonio. Ed proprio di questo che
conda parte dellintervento e cos come det- abbiamo accennato a Firenze.
to la scorsa volta, lo scopo doveva essere Esistono le cosddette forme allotropiche.
quello di far vedere, applicati, in maniera pratica Di allotropi del carbonio sono conosciuti alcuni
e concreta i concetti che la teoria ha permesso tipi: carbonio amorfo, grafite, diamanti e fullere-
di trasformare in sistemi. Quello che vedremo, ni.
tra un attimo, la prova, il test di un accelero- Quando parliamo della sua forma amorfa, ci ri-
metro che stato configurato ed utilizzato con feriamo essenzialmente alla grafite nella quale
Arduino. rimane inalterata la struttura cristallina.
Prima di proseguire, per, vorrei fare un breve A pressione normale il carbonio prende forma di
grafite; qui ogni atomo legato ad altri tre come
accenno alle nanotecnologie possiamo vedere pi avanti.
Questo argomento certamente molto vasto A pressioni molto alte il carbonio forma un al-
ed impossibile trattarlo in un unico articolo. Ci lotropo chiamato diamante. Qui ogni atomo
vorrebbe un corso dedicato. Per quello che legato ad altri quattro. Tutti sappiamo che la for-
importante sottolineare che esiste ed con- za del legame tra gli atomi allinterno di questa
creta la possibilit di realizzare strutture sub- struttura rappresenta sostanzialmente il pi soli-
micrometriche che lavorino in diversi campi, se- do dei legami possibili e conosciuti.
condo diversi principi e soprattutto inseguendo Pressione e temperatura, quindi, governano le
le caratteristiche pi spinte che riusciamo ad transizioni tra una configurazione dellaltra, por-
immaginare. tando alla formazione di legami pi o meno in-
La tecnologia del silicio in questi casi risulta tensi e alla descrizione di geometrie e strutture
quanto mai inefficace dal momento che le di- cristalline sempre pi complesse.
mensioni sono troppo piccole perch si possa I tipi sono descritti nella seguente immagine:
sempre pensare di utilizzare questo materiale;
esistono processi pi idonei, pi precisi e con
delle rese assolutamente pi interessanti.
Esistono, altres, materiali pi performanti e pi
adatti a questo genere di esigenze ed applica-
zioni.
In questo panorama che si presenta sfaccettato
e complesso si inseriscono perfettamente i na-
Speciale Arduino - TUTORIAL {81

dove: 3 canali per magnetic field e 3 canali per


a) diamante; accelerazione;
b) grafite; fondo scala del campo magnetico (in
c) lonsdaliete; Gauss): da 1.3 a
d) fullerene C60; 8,1;
e) fullerene C540; fondo scala selezionabile dinamicamente
f) fullerene C70; tra: 2g, 4g e
g) amorfo; 8g;
h) nanotubi. profondit di dato: 16-bit;
I nanotubi sono particolari fullereni che di- interfaccia I2C;
mostrano di avere un diametro estrema- 2 generatori indipendenti e programmabi-
mente piccolo ed un rapporto lunghezza/ li per rilevazione
diametro pari a diversi ordini di grandezza. free-fall e motion detection;
La struttura qualitativamente simile alla grafite embedded self-test;
ma invece della configurazione esagonale sono funzine sleep-to-wakeup (accelerometro);
globalmente pentagonale tranne allinizio ed alla rilevazione dellorientazione 6D.
fine. L si hanno strutture a forma di cupola che Il motivo per cui stato scelto questo accelero-
riprendono la struttura del carbonio C60. metro presto detto: si tratta di un componente
Lungi dallessere state completamente analizza- che conosco perch ce lho disponibile, lho stu-
ti, le propriet dei fullereni restano ancora tutte diato e col quale ho lavorato. Inoltre si tratta di
da scoprire. Ci nonostante, diversi esperimenti un dispositivo straordinariamente coerente con
li indicano come collocati direttamente sui GATE largomento di oggi. Inoltre ve ne parlo perch
dei MOSFET di nuova generazione. Tale idea dotato di uninterfaccia di comunicazione molto
non lunica a vederli impiegati perch le nano- comoda, lI2C.
tecnologie, pi in generale, strizzano locchio a Laltra volta parlavamo di campi applicativi quin-
diverse grandezze e possibilit tra cui il compu- di, entrando nello specifico, diciamo che il par-
ter quantistico, le strutture quantum confined ed ticolare modello di accelerometro che abbiamo
i dispositivi basati sulleffetto tunnel risonante. indicato in precedenza, cos come indica la
documentazione ufficiale, molto indicato per:
Vediamone subito uno Compensated compassing, Map rotation,
Per provare ad essere pi pratico possibile, ec- Position detection, Motion-activated fun-
covi un esempio di accelerometro. ctions, Free-fall detection, Intelligent power-
LLSM303 un accelerometro tri-assiale tilt saving for handheld devices, Display orienta-
compensated: tion, Gaming and virtual reality input devices,
Tensione di alimentazione (analogica): Impact recognition and logging, Vibration mo-
2.5 V to 3.3 V nitoring and compensation.
Tensione di alimentazione (digitale) IOs:
1.8 V Un caso pratico
Power-down mode; Come abbiamo detto, specifiche e campi appli-
82} Speciale Arduino - TUTORIAL

cativi vanno di pari passo. Nel recente passato muovendo, conoscere il dispositivo sar la chia-
mi sono occupato delle applicazioni spaziali. Le ve verso il successo. Imparare a comprendere
specifiche che avevo sono riportate per in- le caratteristiche del dispositivo ovviamente,
tero in questo documento di Thales Alenia anche per questo, anche in questo caso, valgo-
Aerospace. no tutte le considerazioni fatte in precedenza.
Stiamo immaginando di utilizzare un accele- Particolare attenzione va posta rispetto alla
rometro che sia anche magnetometro, giro-
precisione: quando diciamo che un dato viene
scopio. E questo perch abbiamo bisogno di un
rappresentato con un certo numero di cifre si-
sistema che sia in grado di darci il maggior nu-
gnificative, specie alluscita di un sensore che
mero di informazioni possibili e diventare il
propone gi unuscita digitale, significa che
cuore pulsante di una Inertial Measurements
quello il numero teorico massimo di bit grazie
Unit (IMU). Bene, possiamo pensare che tra i
ai quali il numero pu essere rappresentato.
campi applicativi di cui abbiamo parlato in pre-
Questa indicazione, per, bisogna ricordarlo
cedenza ci sia una che conosciamo molto bene,
ovvero la funzionalit di orientazione del display, sempre, non da prendere come verbo perch

che su tutti gli smartphone ampiamente imple- quella precisione ha sicuramente dei fattori limi-
mentata. tanti, tra i quali le componenti di offset piuttosto
Come si fa? Che cosa ci serve? Noi vogliamo che i rumori piuttosto che le vibrazioni casuali e
fare in modo da leggere il valore in uscita dal quindi una serie di componenti che vanno a ren-
sensore per rilevare che lo spostamento av- dere meno significative specialmente le ultime
venuto. cifre.
Uno spostamento qualsiasi? Ovviamente no! Ecco per quale motivo quello che abbiamo elen-
Perch se fosse uno spostamento qualsiasi, cato in precedenza non certamente tutto e
la prospettiva potrebbe non essere corretta e solo quello che serve perch c molto di pi.
a quel punto nascerebbero altre domande, per Successivamente col dispositivo ci dobbiamo
esempio: ha senso ruotare lo schermo di 90 ancheparlare e per farlo ci interessa molto sa-
quando losservatore non ha fatto una richiesta
pere come dobbiamo comunicare, Quale inter-
di questo spostamento? Quindi supponiamo di
faccia utilizzare, o quale delle interfacce dispo-
fissare la soglia a 90.
nibili il caso di utilizzare, specie in funzione del
Per fare questo, ben poco delle caratteristiche
resto del sistema. Ma anche il tipo di uscita, se
del dispositivo sar utile: per esempio ci servi-
analogica o digitale, e cos via dicendo.
r sicuramente la tensione operativa, il range
Dopodich ancora non abbiamo finito perch
full-scale nonch la precisione. Bene, andiamo
serve sapere come si effettua il montaggio e per
a vedere che cosa ci dice il datasheet del com-
ponente. questo bisogna partire da quello che riportato
nella documentazione riguardo il package.
Guardiamo il datasheet Onde evitare problematiche di qualunque tipo,
Qualunque sia il componente, a prescindere bisogna tenere a mente che esistono anche al-
dallapplicazione, in qualunque campo vi stiate tre specifiche.
Speciale Arduino - TUTORIAL {83

La board Qui c poco da commentare se non che:


Ma adesso arriviamo al punto in cui questo in- LSM303 --------------- Arduino
tervento diventa pratico. Vin 3.3V
Vi faccio vedere che cosa serve per riuscire ad
GND GND
interfacciarsi con questo tipo di strumenti (pri-
SDA A4
ma) e per utilizzarli (poi) grazie anche a schede
piuttosto semplici. SCL A5

Per fare questa prova ho utilizzato Arduino, in Il display LCD connesso tramite I2C (VCC =
maniera tale da fare tutto velocemente, anche e 5V).
soprattutto per voi, per non appesantirvi.
Per comodit, laccelerometro stato gi confi-
Il codice
gurato allinterno di un sistema cos fatto.
Tutti conoscete certamente lIDE di Arduino e
Avevo unaltra possibilit e cio interfacciarmi
sapete anche come si creano le librerie.
direttamente con un accelerometro montato su
una scheda della ST per magari questo ve lo Questa per deve essere una simulazione snel-
faccio vedere la prossima volta. la per cui pi che creare una libreria ho fatto in
modo da scrivere una breve documentazione
del componente, ovviamente consultando atten-
tamente il datasheet. Ho scritto soltanto quello
che serve nellimmediato per cui non prendetela
come una documentazione completa.
Se la cosa vi interessa, il listato riportato qui e
potete simularlo voi stessi.
84} Speciale Arduino - TUTORIAL

#define SCALE 2 // valore full scale dellaccelera- modalit normale, tutti gli assi attivi
zione (valori possibili: 2, 4 o 8) if ((fs==8)||(fs==4))
/* Definizione indirizzo LSM303 */ LSM303_write((0x00 | (fs-fs/2-1)<<4),
#define LSM303_MAG 0x1E // SA0 grounded CTRL_REG4_A); // imposta full-scale
#define LSM303_ACC 0x18 // SA0 grounded else
#define X 0 LSM303_write(0x00, CTRL_REG4_A);
#define Y 1 LSM303_write(0x14, CRA_REG_M); // 0x14 =
#define Z 2 output rate mag 30Hz
/* Variabili globali */ LSM303_write(0x00, MR_REG_M); // 0x00 =
int accel[3]; // valori grezzi dellaccelerazione continouous conversion mode
int mag[3]; // valori grezzi del magnetometro }
float realAccel[3]; // valori dellaccelerazione calco-
lati void printValues(int * magArray, int * accelArray)
{
/* Definizioni dei registri dellLSM303 */ /* stampa dei valori come sono */
#define CTRL_REG1_A 0x20 Serial.print(accelArray[X], DEC);
#define CTRL_REG2_A 0x21 Serial.print(\t);
#define CTRL_REG3_A 0x22 Serial.print(accelArray[Y], DEC);
#define CTRL_REG4_A 0x23 Serial.print(\t);
#define CTRL_REG5_A 0x24 Serial.print(accelArray[Z], DEC);
#define HP_FILTER_RESET_A 0x25 Serial.print(\t\t);
#define REFERENCE_A 0x26 Serial.print(magArray[X], DEC);
#define STATUS_REG_A 0x27 Serial.print(\t);
#define OUT_X_L_A 0x28 Serial.print(magArray[Y], DEC);
#define OUT_X_H_A 0x29 Serial.print(\t);
#define OUT_Y_L_A 0x2A Serial.print(magArray[Z], DEC);
#define OUT_Y_H_A 0x2B Serial.println();
#define OUT_Z_L_A 0x2C delay(1000);
#define OUT_Z_H_A 0x2D }
#define INT1_CFG_A 0x30
#define INT1_SOURCE_A 0x31 float getHeading(int * magValue) {
#define INT1_THS_A 0x32 // paragrafo 1.2 dellApplication Note AN3192
#define INT1_DURATION_A 0x33 // pitch e roll = 0 => level position
#define CRA_REG_M 0x00 float heading = 180*atan2(magValue[Y],
#define CRB_REG_M 0x01 magValue[X])/PI;
#define MR_REG_M 0x02 if (heading <0)
#define OUT_X_H_M 0x03 heading += 360;
#define OUT_X_L_M 0x04 return heading;
#define OUT_Y_H_M 0x05 }
#define OUT_Y_L_M 0x06
#define OUT_Z_H_M 0x07 float getTiltHeading(int * magValue, float * accel-
#define OUT_Z_L_M 0x08 Value) {
#define SR_REG_M 0x09 // Appendice A dellApplication Note AN3192
#define IRA_REG_M 0x0A float pitch = asin(-accelValue[X]);
#define IRB_REG_M 0x0B float roll = asin(accelValue[Y]/cos(pitch));
#define IRC_REG_M 0x0C float xh = magValue[X] * cos(pitch) +
magValue[Z] * sin(pitch);
/* Definizione delle funzioni */ float yh = magValue[X] * sin(roll) * sin(pitch) +
void initLSM303(int fs) magValue[Y] * cos(roll) -
{ magValue[Z] * sin(roll) * cos(pitch);
LSM303_write(0x27, CTRL_REG1_A); // 0x27 = float zh = -magValue[X] * cos(roll) * sin(pitch) +
Speciale Arduino - TUTORIAL {85

magValue[Y] * sin(roll)
+ magValue[Z] * cos(roll) * cos(pitch);
float heading = 180 * atan2(yh, xh)/PI;
// Scrittura dei dati
if (yh >= 0)
void LSM303_write(byte data, byte address)
return heading;
{
else
if (address >= 0x20)
return (360 + heading);
Wire.beginTransmission(LSM303_ACC);
}
else
Wire.beginTransmission(LSM303_MAG);
void getLSM303_accel(int * rawValues)
Wire.write(address);
{
Wire.write(data);
rawValues[Z] = ((int)LSM303_
Wire.endTransmission();
read(OUT_X_L_A) << 8) | (LSM303_
}
read(OUT_X_H_A));
rawValues[X] = ((int)LSM303_
void setup() {
read(OUT_Y_L_A) << 8) | (LSM303_
Serial.begin(9600);
read(OUT_Y_H_A));
Wire.begin();
rawValues[Y] = ((int)LSM303_
lcd.begin(20,4);
read(OUT_Z_L_A) << 8) | (LSM303_
lcd.setBacklight(HIGH);
read(OUT_Z_H_A));
initLSM303(SCALE);
// assegnamento corretto in funzione degli assi
}
}
void getLSM303_mag(int * rawValues)
void loop() {
{
getLSM303_accel(accel);
Wire.beginTransmission(LSM303_MAG);
while(!(LSM303_read(SR_REG_M) & 0x01));
Wire.write(OUT_X_H_M);
getLSM303_mag(mag); // prelevo i valori e li
Wire.endTransmission();
salvo nellarray mag
Wire.requestFrom(LSM303_MAG, 6);
for (int i=0; i<3; i++) {
for (int i=0; i<3; i++)
realAccel[i] = accel[i] / pow(2, 15) * SCALE; //
rawValues[i] = (Wire.read() << 8) | Wire.read();
calcolo i valori reali, in unit [g]
}
}
/* Stampa del level e dellheading tilt-compensa-
// Lettura del sensore
ted */
byte LSM303_read(byte address)
Serial.print(Heading: );
{
Serial.println(getHeading(mag), 3); // funzione
byte appo; // questa solo una variabile di appog-
solo se il sensore a livello
gio
Serial.print(Heading_compensated: );
if (address >= 0x20)
Serial.println(getTiltHeading(mag, realAccel), 3);
Wire.beginTransmission(LSM303_ACC);
// effetto della compensazione
else
// e poi faccio le stesse cose sullLCD, visto che la
Wire.beginTransmission(LSM303_MAG);
seriale serviva solo di debug
Wire.write(address);
lcd.print(Heading: );
if (address >= 0x20)
lcd.print(getHeading(mag), 3);
Wire.requestFrom(LSM303_ACC, 1);
lcd.setCursor(0,1);
else
lcd.print(Heading_cmp: );
Wire.requestFrom(LSM303_MAG, 1);
lcd.print(getTiltHeading(mag, realAccel), 3);
while(!Wire.available());
delay(500);
appo = Wire.read();
lcd.clear();
Wire.endTransmission();
}
return appo;
}
86} Speciale Arduino - TUTORIAL

Riferimenti:
MEMS
MEMS Book
MEMX
MPCollab
Appunti e dispense del corso di
Sistemi Micro e Nano Elettroni-
ci della prof.ssa Caterina Cimi-
nelli (Politecnico di Bari)
Fonti consultate il: 10/05/2013

Il codice funziona in maniera tale da implemen-


tare soltanto poche funzioni, come dicevo, quel-
le che servono.

Test
E per il ciclo unimmagine vale pi di mille pa-
role:

Chiusura
Bene, con questo abbiamo concluso.
Quello che c da capire e da sapere sui MEMS
certamente non potevo presentarvelo per intero
per spero di avervi dato unidea: lelettronica
analogica e la programmazione rappresentano
un tuttuno abbastanza completo e solidale.
Esistono una serie di dispositivi che possono
essere utilizzati per applicazioni tra le pi dispa-
rate. Dalla robotica fino alla domotica, dalle ap-
plicazioni biomedicali fino alla dosimetria, dalle
applicazioni consumer fino allavionica.
Tutto dipende, ovviamente, dal vostro budget e
da che cosa volete fare, purtroppo esattamente
in questordine.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/mems-dalla-teoria-alla-pratica-usiamo-accelerometro-con-arduino
Speciale Arduino - TUTORIAL {87

Temperature & pressure


monitoring con Arduino di Piero Boccadoro

P
er me sempre stata una sfida interessan- ottima linearit, elevata precisione ma, soprat-
te: misurare la temperatura allinterno di una tutto resistenza alle interferenze elettromagne-
stanza, vedere come vari nel tempo e cer- tiche. Altra caratteristica di grande interesse
care di caratterizzare tutte le stanze di unabita- la stabilit sul lungo periodo. Non viene, infatti,
zione in funzione del fatto che sia effettivamente evidenziata alcuna sostanziale variazione dei
comodo e possibile abitarle durante tutte le sta- parametri funzionali del dispositivo in funzione
gioni. del tempo di utilizzo.
Credo sarebbe molto utile per tutti coloro che Il sensore pu lavorare con tensioni di polarizza-
vogliono capire, per esempio, come migliorare zione comprese tra 1.8 V e 3.6 V.
lefficienza energetica della propria casa, adi- stato progettato per essere connesso diretta-
bendo ciascuna stanza alluso pi opportuno in mente ad un microcontrollore che disponga di
funzione proprio di queste caratteristiche, ma- un ingresso I2C ed , infatti, grazie a questo tipo
gari scoprendo che non nemmeno necessario di connessione che lo utilizzeremo per questo
modificare le proprie abitudini. La distribuzione esperimento.
degli spazi, dei mobili, la vivibilit, pi in gene- La scheda che viene impiegata permette di uti-
rale, potrebbero trasformare la casa di sempre lizzare un pin header da 6. VDDD e VDDA del
in una esperienza abitativa diversa, magari mi- sensore sono connesse insieme e portate ad un
gliore. singolo pin; questa una scelta che, in linea ge-
Questa sfida, in realt, si pu affrontare con un nerale, potrebbe non essere il caso di fare ma
sistema abbastanza pi complesso di quello che, per la nostra applicazione specifica, non
che vedremo oggi ma che, certamente, si pu dovrebbe creare particolari problematiche.
realizzare anche grazie a quello che vi faremo Se il sensore, invece, dovesse essere inserito
vedere, utilizzandolo come base. allinterno di un sistema pi complesso e che la-
vori con segnali misti, sar certamente necessa-
Il sensore rio distinguere lalimentazione digitale da quella
Stiamo parlando di un sensore barometrico, il analogica.
BMP085 della Bosch, che un dispositivo di Concordemente a quanto vedremo, viene utiliz-
grande precisione ed a basso consumo di po- zato un resistore da 4.7 k come semplice rete
tenza. Il range di misura va da 300 fino a 1100 di pull-up.
hPa con una precisione assoluta pari a 0.03 Tornando, brevemente, alle caratteristiche, tra
hPa. Per la massima chiarezza, ricordiamo che le pi interessanti ci sono:
1 hPa = 1 mbar interfaccia I2C;
1 Pa = 1 N m^-2 = 1 kg m^-1 s^-2 ampio range di pressione;
La tecnologia sulla quale basato permette una diverse tensioni di alimentazione;
88} Speciale Arduino - TUTORIAL

basso consumo di potenza (5 uA @ 1 Configuriamolo


sample/s); Abbiamo deciso di lavorare con Arduino, versio-
basso rumore di misura; ne UNO rev.3. Questa scheda la conoscete mol-
dimensioni estremamente contenute (16.5 x to bene (ok, alzi la mano chi non lha mai vista...)
16.5 mm). per cui certamente non vi servono presentazioni
Veniamo adesso alla configurazione; il datashe- (qualcuno non ha alzato la mano?). Tuttavia vale
et dimostra subito il metodo di configurazione la pena di specificare che linterfaccia di comuni-
del sensore ed esso prevede lutilizzo di sempli- cazione I2C possibile che venga utilizzata solo
ce resistori e condensatori per poterlo rendere grazie ai pin A4 e A5.
operativo. Ecco una figura esplicativa: Per farlo, i collegamenti dovranno essere quelli
che vedete in figura (non fatevi impressionare,
lo schield che ho usato NON era necessario ma
lo trovo molto comodo per sperimentare al volo
i prototipi!):

Rp, i resistori di pull-up, possono essere di vario


valore, da 2.2 k fino a 10 k; valore tipico 4.7
k. Ecco, quindi, che, esattamente come ripor-
tato nel datasheet, sulla breakout board in uso, il Possiamo utilizzare, per questo esperimen-
valore della resistenza lo stesso che vediamo to, anche un monitor LCD 20x4. Vedremo che
nello schematico. sar molto utile impiegare il Monitor Seriale con
funzione di debug per verificare il corretto invio
dei dati ma, naturalmente, scopo del progetto
quello di proporre i dati allutente ed il monitor a
cristalli liquidi rappresenta certamente il metodo
pi semplice per farlo.
Dal momento che disponiamo di un LCD
backpack (che vi consiglio caldamente!) che
consente il collegamento del monitor stesso tra-
mite interfaccia I2C, la versione della libreria in
uso sar modificata e permetter allutilizzo del-
le classiche funzioni anche con questo metodo
Speciale Arduino - TUTORIAL {89

di collegamento. Il codice abbondantemente commentato


Vi rimandiamo, per completezza, allindirizzo In- (come avrete sicuramente notato) ma impor-
ternet presso il quale potrete reperire il datashe- tante farvi comprendere come queste funzioni
et del componente e la libreria modificata per le siano, almeno in questo caso, figlie di una docu-
comunicazioni su I2C del display. Qui di seguito, mentazione che dire completa dir poco.
invece, unimmagine riassuntiva del protocollo Volendo, inoltre, espandere le possibilit di que-
di comunicazione utilizzato. sto codice una delle prime cose che si pu cer-
tamente fare quella di implementare
il calcolo dellaltitudine, che pu risul-
tare dalla seguente formula:

Il codice Viene qui, anche, tiportato che una variazione di


Dal momento che si tratta soltanto di una piccola 1 hPa corrisponde ad una variazione di altitudi-
dimostrazione e non gi di un progetto comple- ne di 8.43 m.
to, il codice che vi riportiamo qui di seguito non Come potete vedere dai collegamenti, in prati-
contiene una vera e propria libreria del compo- ca monitor e sensore sono in parallelo, distinti
nente ma soltanto le funzioni fondamentali che solamente dal loro indirizzo cos come si visto
ci servono in questo caso. nel codice.
Ecco come fare a farlo funzionare:
Conclusioni
Lesperimento che vi abbiamo fatto vedere
questoggi molto semplice. Si tratta di confi-
gurare il sensore ed effettuare una lettura pe-
riodica.
A tal proposito, trattandosi di temperatura, il pe-
riodo da impostare ma naturalmente fare la
lettura ogni secondo altamente inutile: la tem-
peratura una variabile che varia molto lenta-
mente nel tempo e che ha escursioni abbastan-
za contenute quindi anche una lettura ogni 6 ore
pi che sufficiente!
La parte pi complicata, evidentemente, la re-
alizzazione e limplementazione delle funzioni
utili per effettuare linterfacciamento.
Per realizzare quel sistema pi complesso del
90} Speciale Arduino - TUTORIAL

#include
#include
#define BMP085_ADDRESS 0x77 // Indirizzo I2C del sensore
#define LCD_ADDRESS 0x20 // Indirizzo I2C del monitor

// Variabili blobali
const unsigned char OSS = 0; // Oversampling

// Valori di calibrazione
int ac1;
int ac2;
int ac3;
unsigned int ac4;
unsigned int ac5;
unsigned int ac6;
int b1;
int b2;
int mb;
int mc;
int md;

long b5;

// variabili da misurare
short temperature;
long pressure;

// Dichiaro lo schermo LCD


LiquidCrystal_I2C lcd(LCD_ADDRESS, 20,4);

// Con questa funzione memorizzo tutti i valori nelle variabili globali


// I valori di calibrazione servono per calcolare temperature e pressioni
// La funzione va richiamata allinizio del programma
void bmp085Calibration()
{
ac1 = bmp085ReadInt(0xAA);
ac2 = bmp085ReadInt(0xAC);
ac3 = bmp085ReadInt(0xAE);
ac4 = bmp085ReadInt(0xB0);
ac5 = bmp085ReadInt(0xB2);
ac6 = bmp085ReadInt(0xB4);
b1 = bmp085ReadInt(0xB6);
b2 = bmp085ReadInt(0xB8);
mb = bmp085ReadInt(0xBA);
mc = bmp085ReadInt(0xBC);
md = bmp085ReadInt(0xBE);
}

// Calcolo della temperatura


// Valori misurati in decimi di C (vedi datasheet)
short bmp085GetTemperature(unsigned int ut)
Speciale Arduino - TUTORIAL {91

{
long x1, x2;

x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;


x2 = ((long)mc << 11)/(x1 + md);
b5 = x1 + x2;

return ((b5 + 8)>>4);


}

// Calcolo della pressione


// Qui vengono utilizzati i valori di calibrazione
// I valori sono misurati in Pa
long bmp085GetPressure(unsigned long up)
{
long x1, x2, x3, b3, b6, p;
unsigned long b4, b7;

b6 = b5 - 4000;
// Calcolo di B3
x1 = (b2 * (b6 * b6)>>12)>>11;
x2 = (ac2 * b6)>>11;
x3 = x1 + x2;
b3 = (((((long)ac1)*4 + x3)<>2;

// Calcolo di B4
x1 = (ac3 * b6)>>13;
x2 = (b1 * ((b6 * b6)>>12))>>16;
x3 = ((x1 + x2) + 2)>>2;
b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;

b7 = ((unsigned long)(up - b3) * (50000>>OSS));


if (b7 < 0x80000000)
p = (b7<<1)/b4;
else
p = (b7/b4)<<1;

x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;

return p;
}

// Lettura di 1 byte del sensore (indirizzo)


char bmp085Read(unsigned char address)
{
unsigned char data;

Wire.beginTransmission(BMP085_ADDRESS);
92} Speciale Arduino - TUTORIAL

Wire.write(address);
Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available());

return Wire.read();
}

// Lettura di 2 bytes del sensore, il primo linidirizzo il secondo indirizzo+1


int bmp085ReadInt(unsigned char address)
{
unsigned char msb, lsb;

Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();

Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2);
msb = Wire.read();
lsb = Wire.read();

return (int) msb<<8 | lsb;


}

// Lettura dei valori di temperatura (non compensati)


unsigned int bmp085ReadUT()
{
unsigned int ut;

// La scrittura di 0x2E nel registro 0xF4 una lettura del dato


Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x2E);
Wire.endTransmission();

delay(5); // pausa di 5 ms a fronte dei 4.5 richiesti

// Lettura da 0xF6 e 0xF7


ut = bmp085ReadInt(0xF6);
return ut;
}

// Lettura dei valori di pressione


unsigned long bmp085ReadUP()
{
unsigned char msb, lsb, xlsb;
unsigned long up = 0;

// Scrivere 0x34+(OSS<<6) nel registro 0xF4 vuol dire leggere la pressione


Speciale Arduino - TUTORIAL {93

// ATTENZIONE al sovracampionamento!
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();

delay(2 + (3<> (8-OSS);

return up;
}

// Inizia il programma
void setup()
{
Serial.begin(9600);
Wire.begin();
lcd.begin();
bmp085Calibration();
}

void loop()
{
temperature = bmp085GetTemperature(bmp085ReadUT())/10;
pressure = bmp085GetPressure(bmp085ReadUP());

//Iniziamo a visualizzare i dati


Serial.print(Temperature: );
Serial.print(temperature, DEC);
Serial.println( C);
Serial.print(Pressure: );
Serial.print(pressure, DEC);
Serial.println( Pa);
Serial.println(\r);
lcd.setBacklight(HIGH);
lcd.print(Temperature: );
lcd.print(temperature, DEC);
lcd.println( C);
lcd.print(Pressure: );
lcd.print(pressure, DEC);
lcd.println( Pa);
cd.println( m);
delay(1000);
lcd.clear();
}
94} Speciale Arduino - TUTORIAL

quale avevamo accennato allinizio saranno ne-


cessari almeno ancora un RTC, in modo tale da
collegare le letture allorario e quindi al periodo
della giornata cos come alla data, e quindi al
periodo dellanno.
Inoltre il sensore potrebbe non essere unico ma
potremmo prelevare dati dallinterno e dalle-
sterno dellappartamento, in maniera tale da
correlare anche la reazione dellambiente alle-
sterno. Ovviamente per le misure esterne avreb-
bero bisogno di sensori pi complessi perch
dovrebbero essere, magari, wireless e quindi
serve anche che siano alimentati e c da risol-
vere la questione del come?. Evidentemente i
sensori potrebbero diventare anche di pi di due
e quindi si potremmo dover gestire contempora-
neamente dati provenienti da n elementi sensi-
bili distinti, identificati tutti univocamente dal loro
indirizzo.
Tutto questo non pu essere completo se non si
analizzano anche i venti cui ledificio esposto,
che dipendono soprattutto dallaltezza dellabi-
tato.
Tutti questi dati, una volta raccolti, potrebbe-
ro essere memorizzati su una memoria loca-
le ed ancora inviati ad un webserver.
Insomma, se si comincia davvero a pensare a
quali possono essere gli sviluppi futuri per que-
sto genere di sistema, arriviamo ad una stazio-
ne metereologica non pi tanto in miniatura.
Un gran bel progetto partendo da cos poco,
vero?

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/temperature-pressure-monitoring-con-arduino
Speciale Arduino - TUTORIAL {95

Pilotare motori passo-passo con


Arduino di Cristian Padovano

U
n motore passo-passo, anche definito step-
per, un tipo di motore sincrono che pu,
a seconda degli avvolgimenti eccitati dalla
corrente continua, dividere i suoi movimenti in
passi (step). Questo tipo di motori non ha spaz-
zole e, rispetto ai normali motori CC, ha il van-
taggio di poter fare movimenti precisi, tenendo
fermo lalbero con poco margine di errore. Ne
esistono di due tipi, riconoscibili in base al nu-
mero di fili che indicano le fasi:
unipolari (5, 6 o 8 fili)
bipolari (4 o 8 fili)
Nel nostro caso andremo ad utilizzare un mo-
tore unipolare del tipo Nema 17 da 200 passi
0,44A. Il motore avr una corrente di 0,44A per-
pin 8 a massa (GND) e il rispettivo (COM) come
ch lintegrato che useremo potr gestire una
comune con il motore e lalimentazione dello
corrente massima di 0.5A.
stesso. Per lalimentazione, possiamo utilizzare
Lintegrato ULN2003A (qui trovate il suo da-
una tensione supportata da entrambi oppure ali-
tasheet) composto da 7 transistor Darlington
mentare separatamente i due componenti, cio
e, come stato detto, pu gestire una corrente
utilizzare 5v per il Darlington ed un alimentatore
massima di 0.5A e tensioni massime in uscita
a parte per il motore.
di 50V. E da sottolineare che per ogni mo-
Per capire meglio i collegamenti generali e co-
tore che vogliamo usare bisogner utilizzare
struire un circuito di test, si pu osservare la se-
un integrato: infatti, ULN2003A pu gestire 1
guente immagine esplicativa
motore stepper oppure 2 motori CC semplici.
In questo caso si pu notare come lalimentazio-
Passiamo ora allo schema elettrico da usare. Lo
ne sia presa esternamente, anche se presente
schema questo proposto di seguito
un collegamento con i 5V di Arduino. La fonte,
Nellimmagine indicato lintegrato 2004 ma
per, come si pu leggere dal datasheet dellin-
il datasheet lo stesso del 2003A quindi sono
tegrato, non deve superare i 30V in entrata.
identici.
Tenendo in considerazione che stiamo usando
Dallo schema elettrico si pu notare che verran-
dei motori che funzionano a 5V 0.44A, si potreb-
no usati gli input 1, 2, 3, 4 per ricevere il segnale
be anche usare la sola alimentazione che arriva
da Arduino e i rispettivi output (13, 14, 15 e 16)
da Arduino per entrambi i dispositivi in quanto il
per collegare le 4 fasi del motore. Useremo poi il
96} Speciale Arduino - TUTORIAL

sivo
le linee 29-34 impostano i pin di Arduino in
modalit OUTPUT
le linee 36 e 57 indicano la funzione di
loop in modo da far compiere un ciclo
continuo allalbero del motore
le linee 37-40 indicano ad Arduino di invare
un segnale HIGH sul pin 8. Questultimo,
collegato con lULN2003A, collegher la
fase corrispondente del motore facendolo
avanzare. Le stesse righe indicano ad Ar-
duino anche di inviare un segnale LOW ai
pin dal 9 a 11, mentre la riga 40 impone di
aspettare 500 ms prima di procedere con
altre istruzioni
le linee 42-56 impostano un segnale HIGH
in successione ai pin 9, 10 e 11 attenden-
do, per ogni passo, un tempo di 500 milli-
secondi

computer riesce a pilotare entrambi senza cau- Come si pu vedere, pilotare un motore step-
sare sovraccarichi della porta USB. per non molto complicato e il codice descritto
Nello schema generale, i pin 8, 9, 10 e 11 di Ar- pu essere ampliato per pilorare pi di un mo-
duino sono collegati con i pin 1, 2, 3 e 4 dellin- tore. Questo tipo di motori molto utile per far
tegrato; i restanti pin dellULN2003A sono colle- muovere, nel caso di una stampante 3D, tutti
gati come precedentemente descritto. i meccanismi, dalle barre filettate alle cinghie
A questo punto, costruito il nostro circuito, pos- allestrusore, per la loro precisione e per la
siamo passare ai test ma prima ancora serve maggiore coppia motrice che hanno rispetto ai
effettuare la stesura del codice di Arduino. Sul normali motori a corrente continua. Inoltre que-
sito ufficiale si possono trovare numerosi tuto- sto tipo di motori non ha spazzole, a differenza
rial e parti di codice utili per qualsiasi evenien- dei normali motori, e quindi ha una maggiore
za. Prendiamo in esame il codice per pilotare un vita. Uno svantaggio di questi per leccessivo
solo motore: costo, ma si pu ovviare a ci cercando su siti
le linee 23-26 indicano la corrispondenza di materiale usato, come ad esempio qui, oppu-
tra la fase del motore e il pin al cui colle- re procedere in sano spirito Open e recuperare
gata ad Arduino alcuni motori da vecchie stampanti Canon (dal-
la linea 27 indica il ritardo di rotazione, in la mia esperienza le Hp hanno sempre semplici
millisecondi, tra uno step e quello succes- motori CC) oppure da scanner.
Speciale Arduino - TUTORIAL {97

BUONA PROGETTAZIONE!

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/pilotare-motori-passo-passo-con-arduino
98} Speciale Arduino - TUTORIAL

Controllare I/O multipli con pochi


pin di Arduino di Luigi DAcunto

L
a scalabilit la capacit di un sistema di gressi, che diventa cos lOutput del dispositivo.
crescere o decrescere (aumentare o dimi- Un Demultiplexer svolge la funzione duale, ov-
nuire di scala) in funzione delle necessit e vero ha N uscite e 1 ingresso. Attraverso un
delle disponibilit. opportuno indirizzamento digitale, il microcon-
A chi lavora o si diletta con i microcontrollori, con
trollore pu selezionare una qualunque delle
Arduino o semplicemente con le porte digita-
uscite.
li, sar sicuramente capitato almeno una volta
di avvertire lesigenza di realizzare un prototipo
che goda di tale propriet. Esempio di un MUX a 1 bit e a 1
La necessit di rendere un sistema scalabile uscita
trova la sua massima espressione nei casi La versione di Multiplexer pi semplice che si
pratici in cui bisogna gestire un numero, in pu considerare utilizza un solo bit di selezione
linea di principio imprecisato (seppur stima- sel con il quale possibile collegare sulla porta
bile), di input e/o output (come ad esempio di uscita una ed una soltanto delle due porte di
sensori ed attuatori).
ingresso Io e I1.
Il buonsenso in questi casi porterebbe il proget-
Sotto limmagine riportata la funzione in logica
tista a cercare di quantificare a priori il nume-
di Boole che descrive quanto enunciato sopra.
ro di ingressi/uscite da gestire ed assegnare a
ciascuno di questi un pin dellunit di
elaborazione che in questo articolo
supporremo essere un PIC, oppure
una Board di Arduino.
Questapproccio tuttavia pone un se-
vero limite al manufatto completo:
Limpossibilit di aggiungere
un nuovo elemento di ingresso
o uscita senza modificare lhardware.
Out = Sel* I0 + Sel I1
I circuiti logici di cui questarticolo si interesser
e che risolvono tale problema sono detti Multi- Osservando le tavole di verit riportate di segui-
plexer (MUX) e Demultiplexer (DEMUX). to, si evince che possibile selezionare lingres-
Un Multiplexer, nella sua versione pi diffusa, so I0 (D0) quando il bit di selezione posto a
una circuito logico a N ingressi e 1 uscita. valore logico ALTO e lingresso I1(D1) quando il
Attraverso un opportuno indirizzamento digitale
bit di selezione posto a valore logico BASSO.
possibile selezionare uno qualsiasi degli N in-
Speciale Arduino - TUTORIAL {99

no essere costruite in diverse tecnologie, come


ad esempio CMOS (la pi diffusa in assoluto) e
JFET (principalmente per applicazioni audio) e
sfruttare diverse logiche booleane.
Nellesempio di sotto si pu osservare come, 2
Bit di selezione (A e B) possano discriminare i
Oltre al pin di selezione, spesso, i MUX in com- 4 ingressi (C0,C1,C2,C3) attraverso una logica
mercio possiedono un BIT di ENABLE, per age- a porte AND la cui uscita inviata a una XOR.
volare la gestione di un Multpilexing sincrono e
minimizzare i consumi di potenza.
Questesempio, seppure autoesplicativo del
funzionamento di un MUX, ben lungi dallevi-
denziarne le potenzialit, poich il risparmio in
termini di PIN di uno soltanto. Si raccoman-
da pertanto, per comprendere maggiormente le
potenzialit del Multiplexing/Demultiplexing, la
lettura del paragrafo: Configurazione dei pin e
collegamento ad ATMEGA328.
Le tipologie di MUX e DEMUX variano fortemen-
te e occorre sceglierli in relazione al tipo di appli-
cazione e possono implementare al loro interno
anche funzioni matematiche semplici come le
Un caso pratico: lHFE4067B
somme e avere pi di unuscita, oppure unusci- come Demultiplexer
ta e il suo complemento. Di seguito possibile osservare lo schema logico
di un interruttore del MUX/DEMUX HEF4067B
Come scegliere un MUX o un DE- prodotto da NXP a 16 canali (4 bit di selezione)
MUX? e disponibile in package DIP24 (molto comodo
Nella scelta di un MUX o DEMUX, la prima scre- per testarlo su breadboard) e SO24. Nellesem-
pio considereremo lutilizzo di tale dispositivo
matura deve essere fatta in base alla tipologia
come Demultiplexer digitale collegato a un mi-
di applicazione, ovvero in base al numero di 2
crocontrollore ATMEL ATMEGA328, lo stesso
di I/O che bisogna gestire (che determina il nu-
di Arduino.
mero N di bit). A questo punto possibile osser-
vare le caratteristiche statiche e dinamiche del
dispositivo e scegliere quello che pi si adatta
allapplicazione, a parit di prezzo, in termini di
velocit di risposta, range di temperatura etc.

Come fatto un MUX?


Un MUX formato da porte logiche che posso-
100} Speciale Arduino - TUTORIAL

Configurazione dei pin e colle-


gamento ad ATMEGA328
Il pinout di questo componente presenta i canali
I/O numerati da Y0 a Y15, i 4 bit di selezione
(A0,A1,A2,A3), un bit di I/O comune Z, i due pin
di alimentazione (Vdd e Vss=GND) e infine un
pin di ENABLE.
Utilizzando questo dispositivo come demulti-
plexer si possono comandare fino a 16 canali
utilizzando soltanto 4 pin del microcontrol-
lore per lindirizzamento, pi un pin di Enable,
per un totale di 5 pin per gestire 16 possibili
uscite.
Attraverso questa configurazione possibile uti-
lizzare lATMEGA328 (il popolare microcontrol-
lore utilizzato da Arduino), con i pin dal 12 al 17
impostati come OUTPUT per attuare le uscite
da Y0 a Y15 del DEMUX.

Dopo aver collegato Vdd alla tensione di ali-


mentazione (tipicamente 5 V) e Vss a GND, oc-
corre implementare una rete di pull-down per le
uscite digitali Y0Y15 del HEF4067B.
Infatti, queste, quando sono in stato di non-se-
lezione, sono flottanti e quindi soggette a spia-
cevoli fenomeni di accoppiamento di tipo elet-
trostatico.
Per ovviare a questo problema sufficiente met-
tere un resistore di valore molto grande (100k-
1M) tra luscita da pilotare e la massa.
A questo punto sufficiente indirizzare tramite
codice le uscite desiderate per fornire un output
digitale alluscita 0 piuttosto che alla 15. Per fare
ci, necessario osservare la tavola di verit
del Demultiplexer riportata in precedenza.
Da notare che lo stato delle uscite rimane inal-
Speciale Arduino - TUTORIAL {101

terato fino a quando il pin di ENABLE non viene


portato a un valore alto.
Pertanto lalgoritmo per fornire tensione a una
ipotetica uscita arbitraria, in questo caso quella
corrispondente al pin numero 11 sar il seguen-
te:

A0 > 1
A1 > 0
A2 > 1
A3 > 1
E > 1
Quando NON usare un MUX/DE-
MUX?
In questo modo possibile ad esempio pilotare
Quando i pin del microcontrollore a disposizione
laccensione e lo spegnimento di 16 LED in ma-
sono maggiori del numero di elementi che bi-
niera indipendente utilizzando soltanto 5 pin del
sogna controllare, oppure si vuole utilizzare un
microcontrollore.
microcontrollore con un numero minore di PIN
Complicando un po la logica di pilotaggio pos-
di proposito.
sibile, inoltre, mettere due o pi MUX/DEMUX in
cascata per estendere ulteriormente il numero
di canali controllabili.

Quando usare un MUX/DEMUX?


Sicuramente quando il controllo in tempo reale
non un vincolo stringente, quando si vogliono
usare al meglio le poche risorse hardware che
si hanno piuttosto che aggiungerne di nuove
(come ad esempio un solo ADC condiviso da pi
ingressi) e sicuramente quando si ha un gran
numero di dispositivi che si comportano in ma-
niera identica da gestire separatamente, siano
essi dei sensori tutti uguali da cui acquisire pe-
riodicamente dati, oppure delle uscite da attuare
a passi alterni.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/controllare-io-multipli-con-pochi-pin-di-arduino
102}

Speciale Arduino
PROGETTI

Analizzatore MIDI con Arduino


di slovati

LINTERFACCIA MIDI rente corrisponde allo stato logico uno. In Figu-

L
interfaccia MIDI, ampiamente utilizzata nel ra 1 mostrata in dettaglio limplementazione
campo della produzione musicale a livello di questa interfaccia. Le interfacce di ingresso e
elettronico, si basa sulla trasmissione seriale uscita (MIDI In e MIDI Out) richiedono due pin
di byte alla frequenza fissa di 31250 baud [1]. A ciascuna, e due dispositivi MIDI richiedono per-
differenza della RS-232, linterfaccia non utilizza tanto due soli fili per il collegamento. Uno dei
soglie di tensione predefinite per i livelli basso e pin di uscita collegato in modo permanente alla
alto associati ai bit dati e ai bit di start e stop. tensione +5 V tramite una resistenza da 220 .
Viceversa, linterfaccia basata su un loop di Per trasmettere lo stato logico zero, il secondo
corrente da 5 mA creato tra luscita (MIDI Out) pin di uscita viene portato a massa, sempre tra-
di un dispositivo e lingresso (MIDI In) di unaltro mite una resistenza da 220 . Ne consegue che
dispositivo. Un flusso di corrente corrisponde una piccola corrente scorre tra i pin del connet-
allo stato logico zero, mentre lassenza di cor-
tore MIDI In dellaltro dispositivo. Per trasmettere
Speciale Arduino - PROGETTI {103

Figura 1: un esempio di interfaccia MIDI

invece lo stato logico uno, il secondo pin di uscita sullutilizzo combinato di una board Arduino Uno
viene portato alla tensione di +5 V, e di conse- e dellExtension Shield di Elektor, alle quali viene
guenza non si genera alcun flusso di corrente. collegata linterfaccia MIDI tramite un connettore
Il funzionamento pertanto, entro certi limiti, ECC (Embedded Communication Connector) [2].
compatibile con quello di uninterfaccia UART Il circuito risultante visualizzato in Figura 2. Sul
che lavora con i livelli logici TTL. Sul lato MIDI lato sinistro visibile la parte relativa al MIDI In-
In dellinterfaccia presente un fotoaccoppiatore put, con un accoppiatore ottico di tipo 6N137. La
dotato di fototransistor. Quando una corrente at- sua uscita collegata al pin 6 del connettore ECC
traversa il cavo MIDI, questo transistor tira lu- (K2), il quale a sua volta collegato al pin RX del
scita verso massa; nello stato di riposo, luscita microcontrollore. Il pin 5 del connettore ECC por-
si porta alla tensione di +5 V. Possiamo perci ta il segnale TX del microcontrollore al modulo
collegare questo segnale direttamente allingres- MIDI, utilizzato per pilotare direttamente la presa
so RX di un microcontrollore. I due collegamenti di uscita MIDI (K3). La scheda a microcontrollore
utilizzati per lingresso e per luscita fanno capo ai fornisce lalimentazione +5 V al circuito tramite il
pin 4 e 5 di una presa DIN a 5 poli. Dal punto di pin 9 del connettore ECC, mentre un apposito led
vista esterno, pertanto, i connettori MIDI In e Out indica la presenza dellalimentazione.
sono identici. Tuttavia, occorre utilizzare delle In Figura 3 mostrato il circuito stampato ap-
prese separate per ogni dispositivo che richieda prontato da Elektor per il progetto; il PCB stato
appositamente perforato in modo tale da poterlo
di essere collegato sia in ingresso che in uscita.
facilmente separare in due parti [3]. La parte de-
LHARDWARE
stra pu essere utilizzata come interfaccia MIDI
Le caratteristiche menzionate in precedenza im-
In, mentre quella a sinistra come interfaccia MIDI
plicano che sia relativamente semplice aggiun-
Out (con i segnali MIDI disponibili sul connettore
gere la funzionalit MIDI, sia in ingresso che in K5), oppure come una scheda flessibile con K4
uscita, a un circuito basato su microcontrollore. come connettore di ingresso.
La soluzione proposta in questo articolo si basa
104} Speciale Arduino - PROGETTI

SEMICONDUTTORI
D1 = 1N4148
LED1 = LED, verde, 3mm
IC1 = 6N137, DIP8

VARIE
K1,K3 = presa DIN per
montaggio su PCB, 180
K2 = boxheader a 10 vie
(2x5), passo 0,1
K4 = pin header a 5vie,
passo 0,1
Figura 2: schema circuitale del modulo MIDI In/Out K5 = connettore a 2 vie, passo 0,2
Figura 3: il circuito stampato pu essere facilmente se- PCB #150169-1 v1.0
IL SOFTWARE
Il modulo MIDI collegato al connet-
tore ECC dellExtension Shield tra-
mite un cavo piatto a 10 fili, men-
tre lExtension Shield a sua volta
installato sulla board Arduino Uno.
Il microcontrollore Atmega328P
parato in due parti presente sullArduino Uno pu ora ricevere
i byte MIDI tramite linterfaccia UART, ma
Il prototipo realizzato da Elektor Labs (visibile in
Figura 4), utilizza un pin header per K4, ma sa-
rebbe molto pi conveniente utilizzare un header
socket, in modo tale da ridurre il rischio di corto
circuiti accidentali. Il PCB disponibile presso
lElektor Store [4], e lassemblaggio del circuito
non dovrebbe presentare grosse difficolt.

ELENCO COMPONENTI
Figura 4: il prototipo sviluppato da Elektor Labs con in
Lelenco completo dei componenti richiesti per evidenza le due prese DIN
la realizzazione del circuito il seguente.

ovviamente avremo anche bisogno di un oppor-


RESISTENZE tuno software [4] per completare il progetto. For-
R1,R2,R3,R4 = 220 tunatamente, il protocollo MIDI non cos com-
R5 = 1k plicato (si veda lapposito capitolo dedicato allo
Speciale Arduino - PROGETTI {105

stesso, pi avanti nellarticolo). La maggiorparte da fare scrivere una piccola libreria MIDI per
dei messaggi MIDI infatti composta da tre soli gestire loperazione numero 3 della lista men-
byte, ed pertanto relativamente semplice ese- zionata in precedenza.
guire la decodifica di ogni messaggio. LA DECODIFICA MIDI
Il software esegue le seguenti operazioni prin- I messaggi MIDI vengono decodificati tramite
cipali: lutilizzo di una piccola libreria contenuta nei file
1. inizializza lUART, impostando la velocit MidiEFL.h/.c. Come tutte le altre liberie di tipo
a 31250 baud; EFL utilizzate nei progetti Elektor (ad esempio
2. memorizza i byte ricevuti in un buffer cir- la libreria ElektorBus), anche questa stata pro-
colare, tramite una gestiore ad interrupt; gettata per funzionare con una moltitudine di ca-
3. controlla periodicamente lo stato del buf- nali fisici di comunicazione differenti, e potrebbe
fer circolare, rilevando la presenza di un persino essere utilizzata anche per decodificare
nuovo messaggio MIDI analizzandone il i messaggi MIDI ricevuti su una connessione
primo byte. Nel caso sia stato ricevuto un TCP/IP. Ci che interessa, che i byte ricevu-
nuovo messaggio, lo decodifica e chiama ti vengano immagazzinati in un buffer circolare,
una funzione specifica per indicare che un la cui posizione viene comunicata alla libreria
nuovo messaggio MIDI stato corretta- durante la fase di inizializzazione nel modo se-
mente ricevuto e decodificato; guente:
4. visualizza su display il contenuto del mes-
saggio ricevuto. Un messaggio rimane vi- MIDI_LibrarySetup(UARTInterface_Send, 0,
sualizzato sul display sino a quando non UARTInterface_GetRingbuffer(0), MIDIIn_Process);

viene ricevuto un nuovo messaggio; in tal


caso, il contenuto del display viene ag- Il primo parametro indica la funzione da chia-
giornato. mare quando si vuole trasmettere un messag-
gio MIDI. Il secondo parametro indica che verr
La soluzione ideale, dal punto di vista software, utilizzata linterfaccia UART sia per trasmettere
sarebbe quella di avere un modulo software se- che per ricevere i dati (su Arduino Uno, in real-
parato che si occupi di ciascuna delle attivit so- t, esiste soltanto una interfaccia UART). Il terzo
pra menzionate, al fine di migliorare la riusabilit parametro specifica il buffer circolare utilizzato
e portabilit del software stesso, e semplificarne per la ricezione, mentre il quarto ed ultimo pa-
la manutenzione. Le dipendenze (incluse quelle rametro un puntatore a una funzione callback
temporali) tra i moduli dovrebbero inoltre essere che andr implementata nel codice. Questa
ridotte al minimo (torneremo su questo aspetto funzione verr chiamata automaticamente dalla
pi avanti, nel corso dellarticolo). LEmbedded libreria MIDI quando un nuovo messaggio ver-
Firmware Library (EFL) [5] rappresenta la r ricevuto e decodificato. Il loop principale del
scelta ideale per un software dimostrativo, programma deve invocare in modo periodico la
dal momento che essa include gi unimplemen- funzione di libreria MidiProtocol_Engine(), che
tazione del buffer circolare e una libreria apposi- si occupa della gestione del punto 3 della lista
ta per la gestione del display. Quello che rimane menzionata in precedenza.
106} Speciale Arduino - PROGETTI

Non appena un messaggio viene ricevuto, esso


viene memorizzato nella struttura ReceivedMidi- SwitchLED (LEDblocknumber, position, ON);
Display_WritePosition (displaynumber, position, ON);
Data di tipo MidiData. Il main del codice pu otte-
nere un puntatore a questa struttura chiamando gio in una specifica posizione del display sono i
la funzione di libreria GetReceivedMidiData(), e seguenti:
accedere cos al contenuto decodificato. Nella
funzione callback menzionata precedentemen- Le coordinate e le dimensioni (in caratteri) dei
te, abbiamo ora accesso a tutti gli elementi del campi possono essere specificate utilizzando la
messaggio MIDI pi recente, e possiamo quindi funzione Display_SetPosition(uint8 DisplayPosi-
visualizzarli sul display. Un esempio di codice tion, uint8 row, uint8 column, uint8 columnmax).
potrebbe essere il seguente: Per semplificare ulteriormente le cose, durante
linizializzazione la libreria del display im-
MidiData* ReceivedMidiData = MIDI_GetReceivedMidiData(); posta due campi su ogni riga del display,
Display_WriteNumber(0, 0, ReceivedMidiData->Channel);
ciascuno con dimensione pari alla met
di ogni riga. Nel nostro caso avremo per-
Il risultato di queste linee di codice quello di vi- tanto 4 campi, tutti della stessa dimensione, nei
sualizzare sulla prima riga del display il numero quali potremo visualizzare i quattro elementi pi
di canale del messaggio ricevuto. Purtroppo, la importanti di ogni messaggio ricevuto (si osservi
libreria EFL per il display contiene funzioni per la Figura 6). Per ridurre al minimo loccupazione
visualizzare stringhe e numeri su una specifi- di memoria, display differenti appartenenti a uno
ca riga del display, ma sempre partendo dalla stesso sistema non possono essere configurati
posizione pi a sinistra della riga stessa. Il di- in modo diverso luno dallaltro, e ogni campo
splay presente sullExtension Shield per Arduino non pu occupare pi di una riga. Ovviamen-
possiede soltanto due righe, e vorremmo poter te, la libreria pu anche essere modificata per
visualizzare quattro differenti tipi di informazio- rimuovere queste restrizioni, qualora fosse ne-
ni su di esso. Per risolvere questo problema, la cessario.
libreria stata estesa in modo tale da
poter specificare dove visualizzare le in-
formazioni in formato testo o numerico,
avendo a disposizione otto possibili cam-
pi di destinazione. Questi campi sono
numerati da 0 a 7 (si osservi la Figura
5), e questo numero viene chiamato po-
sizione del campo. Le posizioni possono
essere anche utilizzate per selezionare
un particolare led o tasto allinterno di un bloc- Figura 5: la libreria per il display estesa consente di
co. I comandi di uscita per controllare lo stato di configurare i campi allinterno dellarea del display, dove
si possono visualizzare stringhe o numeri. In questo
un led (ON=1, OFF=0) allinterno di un blocco di esempio mostrato un display di 3 righe, divise in 6
led, e per visualizzare il corrispondente messag- campi numerati da 0 a 5
Speciale Arduino - PROGETTI {107

anche della scrittura nella StateTable dei nuo-


vi valori degli elementi del messaggio MIDI. Se
un valore differisce da quello precedente, la flag
STATE_UPDATED viene alzata. A questo pun-
to occorre controllare periodicamente quando il
display richiede un aggiornamento oppure no. Si
noti come la frequenza con cui eseguita que-
Figura 6: i vari elementi che compongono un messaggio
sta operazione indipendente dalla frequenza
MIDI vengono visualizzati su Quattro campi del display:
CH=canale, NT=nota (stringa), VE=velocit, CC=numero di arrivo dei messaggi MIDI. La funzione che
del controller, CV=valore del controller
si occupa di questa operazione la Reaction_
Process(), implementata nel nuovo modulo EFL
USCITA FLESSIBILE
InOutEFL.c. La funzione analizza ogni elemento
Poich la scrittura sul display implementata di-
della tabella, e, per ogni elemento che ha la flag
rettamente nella funzione chiamata dalla libreria
settata, esegue la chiamata alla corrisponden-
MIDI quando un nuovo messaggio stato de-
te funzione di output. Le funzioni di output sono
codificato, si volutamente creato un accoppia-
contenute nella tabella OutputTable, che deve
mento stretto tra i due moduli, in particolare dal
essere preventivamente inizializzata. Una terza
punto di vista temporale. Ci non sempre desi-
tabella, chiamata ReactionTable, contiene I col-
derabile. Una soluzione migliore potrebbe esse-
legamenti tra le altre due, garantendo che esista
re quella di non aggiornare il display immediata-
una funzione di output per ogni parametro il cui
mente. E possibile che questa soluzione possa
valore pu cambiare. E altres possibile fornire
essere introdotta in versioni future del software,
un indice in una quarta tabella, chiamata Enco-
includendo anche attivit ad elevata priorit. Ad
derTable.
esempio, si potrebbero loggare i byte ricevuti
Un esempio pu aiutare a comprendere le rela-
sullinterfaccia MIDI, associando loro anche un
zioni esistenti tra queste tabelle, per cui analiz-
timestamp, oppure si potrebbe estendere il pro-
zeremo ora la modalit con cui viene processata
getto realizzando un mini sintetizzatore, in grado
una nuova nota MIDI appena ricevuta. Allinizio
di convertire i byte ricevuti in suoni. La soluzione
del programma vengono impostati alcuni ele-
che permette di realizzare queste estensioni
menti della tabella come indicato nel seguito.
quella di creare un elemento in una tabella spe-
ciale (chiamata State-
Table) per ciascuno dei S_MidiIn_Note = State_Add(0, 0, 127, STATE_MINMAXMODE_OVERFLOW);
O_Write_Pos2 = Output_Add(Display_WritePosition, 0, 2);
differenti elementi MIDI
E_Midi_Note = Encoder_Add(Midi_NoteEncode);
da visualizzare. Oltre al Reaction_AddOutput(S_MidiIn_Note, STATE_UPDATED, O_Write_Pos2, E_Midi_Note);
valore corrente di ogni
elemento, verr mantenuta una flag che indica
Quando viene ricevuto un nuovo valore (che
se il valore cambiato rispetto allultima visua-
deve essere compreso nel range tra 0 e 127),
lizzazione sul display. La funzione chiamata alla
esso viene copiato nella StateTable, e la flag
ricezione di ogni messaggio MIDI, si occuper
STATE_UPDATED viene settata. Ci implemen-
108} Speciale Arduino - PROGETTI

tato nella funzione callback come segue: lizzare le informazioni ricevute sullinterfaccia
MIDI. Oppure, potremmo voler cambiare la po-
MidiData* ReceivedMidiData = Midi_GetReceivedMidiData(); sizione in cui sono visualizzate le varie infor-
State_Update(S_MidiIn_Note, ReceivedMidiData->Note); mazioni, oppure ancora inviare le informazioni
decodificate su una UART differente, anzich
La funzione Reaction_Process() viene chiama- mostrarle sul display. Tutte queste varianti pos-
ta periodicamente nel loop principale, al fine di sono essere implementate tramite semplici mo-
controllare se la flag settata o meno. Se ci difiche al codice di setup, lasciando inalterato il
avviene, viene chiamata la funzione encoder resto del programma.
configurata per gestire il cambio di valore del-
la variabile: in questo caso la funzione encoder IL PROTOCOLLO MIDI
Nonostante quello che molti possano pensare, il
Midi_NoteEncode(), implementata nella li-
protocollo MIDI in realt piuttosto semplice. La
breria EFL MIDI. Questa funzione riceve come
maggior parte dei messaggi MIDI consiste infat-
parametro il valore della nota, compreso tra 0 e
ti di tre soli byte. Il primo byte include il codice del
127, e lo converte in una stringa del tipo C#4.
comando nei quattro bit pi significativi, e il canale
Questa stringa a sua volta passata come pa-
MIDI (da 0 a 15) nei quattro bit meno significativi. Il
rametro alla funzione di output Display_Write-
bit pi significativo di questo byte sempre settato,
Position(), che scrive il testo nella posizione 2
mentre i due byte successivi del messaggio han-
del display 0. Il comportamento del software pu no sempre il bit pi significativo a zero (e possono
essere modificato cambiando il contenuto delle quindi rappresentare valori compresi tra 0 e 127).
tabelle, anche dinamicamente, mentre il softwa- Ci permette di individuare agevolmente linizio di
re gi in esecuzione. un messaggio allinterno di uno stream di byte rice-
vuti. Il software che accompagna il progetto [4] in
INDIPENDENZA
DALLHARDWARE
Questo progetto dimostra come le
applicazioni basate sulle librerie EFL
siano modulari e indipendenti dallhar-
dware utilizzato. Allinizio del program-
ma, nella funzione ApplicationSetup(),
viene anzitutto eseguita linizializza-
zione delle tabelle. Successivamente,
tutto viene gestito in modo automati-
co, e i vari moduli possono funzionare
in modo disaccoppiato luno dallaltro.
Possiamo portare facilmente il codice
su unaltra scheda, dove ad esempio potremmo Figura 7: struttura di alcuni comandi MIDI
utilizzare il display 1 al posto dello 0 per visua-
Speciale Arduino - PROGETTI {109

grado di riconoscere i quattro comandi MIDI pi I_max, mentre i valori di U_setpoint, U_actual, e
importanti. Due di questi (quelli con codice 90 cos via devono poter essere visualizzati sul di-
hex e 80 hex) corrispondono ai messaggi nota splay. Vorremmo inoltre essere in grado di ese-
off e nota on. Il secondo byte contiene lam- guire il codice su board differenti, a scapito di
piezza della nota, espressa in semitoni con un piccole variazioni dello stesso. Ad esempio, una
intero tra 0 e 127; in questo modo dodici valori board potrebbe disporre di un potenziome-
coprono unottava. Il terzo byte (anchesso com- tro per impostare il valore di U_setpoint, mentre
preso tra 0 e 127), contiene il valore di velocit, e unaltra potrebbe disporre di tasti up e down.
indica quanto velocemente sulla tastiera stato Naturalmente il codice richieder qualche picco-
premuto oppure rilasciato il tasto. Il comando B0 la modifica, ma lidea di fondo quella di ren-
hex identifica il messaggio cambio di controllo, dere il porting il pi semplice possibile, isolando
ed seguito dal numero del controller (compre- le parti di programma dipendenti dallhardware
so tra 0 e 127) e dal nuovo valore del controllo nella funzione ApplicationSetup(). Il secondo
(ancora compreso tra 0 e 127). Il numero di con- obiettivo quello di disaccoppiare tra loro, sia
troller viene assegnato ad ogni parametro che dal punto di vista software che da quello tempo-
influenza il suono prodotto da un sintetizzatore, rale, i vari processi coinvolti nelle operazioni di
in modo tale che essi possano essere controllati input, modifica dei valori di stato, e output. Se le
in tempo reale, persino durante una performan- letture di un valore sono acquisite alla frequenza
ce musicale. Ad esempio, il controller numero di mille campioni al secondo, non ha senso ag-
1 riservato per il controllo della modulazione giornare il display ogni volta che arriva un nuovo
sulla maggiorparte delle tastiere. Maggiori det- valore. Il terzo obiettivo consiste nel minimizza-
tagli su questo agomento possono essere tro- re lo sforzo programmativo. I valori di ingresso
vati in [6]. Il comando E0 hex identifica invece utilizzati per impostare dei parametri richiedono
il messaggio pitch bend change. Questa fun- sempre di essere validati rispetto a un valore mi-
zione richiede una risoluzione molto fine, per nimo e massimo, e il framework dovrebbe farsi
cui il range compreso tra 0 e 16383 (14 bit). Il carico automaticamente di questi controlli, solle-
secondo byte del messaggio contiene i sette bit vando dal compito il programmatore.
meno significativi del valore, mentre il terzo byte La nuova common library EFL (InOutEFL.h/.c)
contiene i sette bit pi significativi (figura 7). mantiene aggiornate diverse tabelle, che devo-
no essere inizializzate allingresso nel program-
LA LIBRERIA EFL INOUT ma. Le funzioni State_Add(), Output_Add(), e
Possiamo comprendere i vantaggi che deriva- cos via, sono utilizzate per creare un nuovo ele-
no dallutilizzo di questa libreria considerando mento nella tabella corrispondente; esse resti-
un semplice esempio. Si supponga che si vo- tuiscono lindice dellelemento appena aggiun-
glia progettare un alimentatore, in cui ci sono to, che pu essere successivamente utilizzato
quattro variabili chiamate U_setpoint, U_actual, come parametro quando si aggiunge un nuovo
I_actual, e I_max. Lapparato include dei con- elemento in unaltra tabella. Questo approccio
trolli (tasti, encoder rotativi, potenziometri) che simile alla creazione di un circuito stampato:
permettono di modificare i valori di U_setpoint e aggiungere elementi a una tabella equivale ad
110} Speciale Arduino - PROGETTI

aggiungere delle piste, creando cos delle con-


functionname(uint8 blocknumber, uint8 position, int16
nessioni tra ingressi, variabili di stato, ed uscite.
numericalvalue)
Il cuore dellarchitettura rappresentato dalla
StateTable. Ogni elemento di questa tabella
oppure:
contiene il valore a 16 bit di una variabile dellap-
plicazione, i suoi valori minimo e massimo, e
functionname(uint8 blocknumber, uint8 position, char*
fino ad otto flag. La InputTable collega gli even- textstring)
ti in ingresso (come ad esempio la pressione di
un particolare tasto, specificata dal numero di La EncoderTable contiene invece le funzio-
blocco e dalla posizione del tasto allinterno del ni encoder che convertono i valori numerici in
blocco), con un indice della StateTable. Inoltre, stringhe di testo. Queste possono essere imple-
essa contiene il valore dello step, che misura mentate in uno qualunque dei moduli EFL, pur-
lentit con cui deve essere modificata la va- ch abbiano una signature del tipo:
riabile quando levento si verifica, e la flag che
deve essere settata quando levento avviene. char* functionname(int16 numericalvalue)
Nella InputTable ad esempio possibile spe-
cificare che, quando viene premuto un cer-
to tasto, la variabile U_setpoint (che potrebbe Ogni elemento della tabella ReactionTable col-

rappresentare una tensione in millivolt) debba lega un indice della StateTable (o, in modo equi-
valente, una variabile dellapplicazione), una flag,
essere incrementata di 100. Quando il valore
una funzione di output e, opzionalmente, un en-
viene incrementato, viene eseguito un control-
coder, tutti memorizzati come indici alle rispetive
lo affinch il nuovo valore risulti allinterno dei
tabelle. Per assicurarsi che le funzioni di output
limiti ammissibili. Se il valore supera il limite su-
siano attivate, necessario invocare in modo re-
periore, esso pu essere sia limitato al valore
golare la funzione Reaction_Process(). Questa
massimo, oppure resettato al valore minimo,
funzione analizza gli elementi della ReactionTa-
a seconda della configurazione prescelta. La
ble, e per ciascuno di essi controlla se la flag di
seconda alternativa permette di implementare attivazione associata nella StateTable settata
una modalit di wrap-around, utile in alcune oppure no. In caso affermativo, viene invocata la
applicazioni. Se il valore validato cambiato, funzione di output. Infine, viene resettata la flag
viene impostata una flag particolare, nel nostro nella StateTable. Procedendo con il nostro esem-
caso sceglieremo la flag STATE_UPDATED. La pio, potremmo definire un elemento della Output-
OutputTable la controparte della InputTable. Table in modo tale da visualizzare del testo nella
Essa contiene le funzioni di output, insieme al posizione 0 del display 0. Potremmo anche im-
numero del blocco e alla posizione dellelemen- plementare una funzione encoder che converte
to di output al suo interno. Pu essere utilizzata un valore in millivolt in una stringa di testo con il
a questo scopo qualunque funzione, purch ab- formato x.yyy V. Questa funzione andr aggiun-
bia una signature di questo tipo: ta come nuovo elemento della EncoderTable. Un
Speciale Arduino - PROGETTI {111

nuovo elemento della ReactionTable pu ora es- RIFERIMENTI


sere utilizzato per collegare U_setpoint, la flag [1] http://en.wikipedia.org/wiki/MIDI
STATE_UPDATED, e gli indici degli elementi ap- [2] www.elektor-magazine.com/140182
pena aggiunti a OutputTable e EncoderTable. Se [3] www.elektor-labs.com/project/150169-midi-
ora premiamo il tasto e incrementiamo U_setpoint analyzer-light.14481.html
di 100 mV, verranno chiamate la funzione Reac- [4] www.elektor-magazine.com/150169
tion_Process() e successivamente la funzione [5] www.elektor-magazine.com/120668
encoder, con conseguente visualizzazione del [6] www.midi.org/techspecs/midimessages.php
testo sul display. Modificare il codice in modo tale
da utilizzare il formato punto decimale europeo
(la virgola) al posto del punto pressoch imme-
diato: occorre scrivere una versione leggermente
modificata della funzione encoder, aggiungerla
alla EncoderTable, e successivamente cambia-
re il corrispondente indice nella ReactionTable.
Questa operazione pu essere eseguita anche
mentre il programma in esecuzione, ad esem-
pio quando si vuole cambiare la lingua dellinter-
faccia utente (figura 8).

Figura 8: architettura sw della libreria

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/analizzatore-midi-con-arduino
112} Speciale Arduino - PROGETTI

Progetto serra domotica open


source di Antonio La Mura

1. DISPOSITIVI UTILIZZATI

F
acendo una prima overview del progetto
possibile dividere il tutto in tre parti fonda-
mentali Master, Slave e Web Server, meglio
descritte successivamente. Per quanto riguarda
il Master stato realizzato utilizzando un Ardu-
ino Uno, un modulo di trasmissione wireless
2.4GHz NRF24L01 e una shield wifi CC3000.
Lo Slave invece utilizza lo stesso modulo di tra-
smissione NRF24L01, un sensore di umidit e
temperatura DHT22 e la shield per il controllo di
un motore brushed della Infineon.
Infine il Master comunica tramite wifi con un web
Server dedicato al quale possibile accedere Figura 1 - Arduino UNO

tramite una app realizzata per Android.


1.2 SHIELD PER CONTROLLO MO-
TORE IN DC INFINEON
1.1 ARDUINO UNO Grazie alliniziativa di EMCelettronica ci stato
Attualmente il progetto ancora in fase di pro- possibile utilizzare anche questa comodissima
totipazione, pertanto si deciso di iniziare a shield della Infineon per il controllo di un motore
sviluppare il tutto con il classico Arduino Uno. DC. In questa fase stato utilizzato un motore
recuperato da una vecchia stampante, questul-
Il prossimo step sar di utilizzare per gli Slave
timo ci serve per aprire e chiudere una finestra
degli Arduino Nano o Mini e per il Master un Ar-
della serra quando la temperatura troppo ele-
duino Galileo che abbiamo a disposizione. La
vata.
scelta di utilizzare Galileo dovuta sia al fatto
di poter disporre di una elevata potenza della
scheda, che per gestire pi Slave necessaria,
sia al vantaggio di poter utilizzare Linux. Pertan-
to Il progetto presentato qui un primo step di
controllo domotico di una serra, che poi andr
inevitabilmente potenziato.
Figura 2 - Motor Shield Infineon
Speciale Arduino - PROGETTI {113

1.3 MISURA TEMPERATURA E UMI-


DIT AMBIENTALE
Per il controllo dei parametri ambientali stato
utilizzato un DHT22, che ci permette di avere
una misura sia dellumidit e sia della tempe-
ratura. Parametri che poi saranno trasmessi al
Master che li invier al Web Server. Non stata
effettuata una vera taratura di questa misura, ma
semplicemente un confronto tra i valori ottenuti Figura 4 - NFR24L01
dal sensore e quelli ottenuti da un termometro e
da un igrostato, essendo questi molto simili non
stata effettuata alcuna compensazione.

Figura 3 - DHT22

1.4 NRF24L01
Infine sono stati utilizzati due moduli NRF per
la comunicazione wireless tra Master e Slave,
per trasmettere le informazioni lette dal sensore
(Slave to Master) e per trasmettere le nuove im-
postazioni fornite dallutente (Master to Slave).
stato formulato un semplice protocollo di co-
municazione, per assicurare che i dati trasmessi
fossero consegnati. Quanto detto avviene tra-
mite un controllo effettuato sia dal Master che
dallo Slave, ci permette una elevata efficienza
di comunicazione e comunque un basso costo
computazionale.

2. MASTER
Di seguito riportato il Flow Chart del program-
ma: Figura 5 - Flow Chart Master
114} Speciale Arduino - PROGETTI

Il Master sempre in ascolto, appena ci sono


dati disponibili li acquisisce e li stampa a video. snprintf(name, sizeof(name), %s, command);
Intanto verifica se sono presenti nuovi settaggi break;
delle impostazioni da inviare allo Slave. case 1:
NB: il master invia le nuove impostazioni solo temp = atof(command)/10;
quando lo Slave gli invia le letture del sensore. break;
Infatti, secondo il nostro protocollo sempre lo case 2:
Slave ad avviare la comunicazione. hum = atof(command)/10;
Se sono presenti nuovi settaggi in lista, ne cal- break;
}
cola prima il CRC a 8 bit, poi allega in coda alle
impostazioni anche questultimo, che servir command = strtok(0, ;);
allo Slave per verificare se i dati ricevuti sono count++;
}
corretti o meno.
Fatto ci il Master aspetta unaltra risposta dallo
Slave per confermare la corretta ricezione dei Il while alla prima riga mette il Master in atte-
dati. Se ci non fosse, i dati non vengono can- sa, appena arriva un dato lo sketch prosegue.
cellati ma restano in memoria e saranno inviati Con il Mirf.getData(data) acquisiamo il dato
successivamente al prossimo contatto da parte e lo salviamo in data, che un vettore di tipo
dello Slave. byte. Il dato ricevuto ha la seguente struttura
Infine ritorna nello stato iniziale di ascolto, per nome;temperatura;umidit, lo salviamo in un
ricominciare un nuovo ciclo. puntatore a char e sfruttiamo alcune funzioni
La funzione che calcola il CRC a 8 bit un al- delle stringhe. Quella usata qua stringtokeni-
goritmo basato sulle formule di Dallas Maxim. zer che ci permette di dividere il vettore ricevuto
quando incontriamo appunto un token, nel no-
2.1 COMUNICAZIONE LATO MA- stro caso ;. Il comando atof(x), ascii to float,
STER ci permette di convertire x in un float. Il primo
Vediamo ora un po di codice, in questo paragra- parametro ricevuto il nome dello Slave che sta
fo descriviamo i processi controllati dal Master: trasmettendo, gli altri due sono temperatura e
while(!Mirf.dataReady()){ umidit lette nella serra.
//Aspetto qualche informazione if(Serial.read() == k){
}
Mirf.getData(data); Serial.println(Inserisci umidit max);
while (Serial.available() == 0);
Serial.print(RAW DATA: ); humax = Serial.parseFloat();
Serial.println((char*)data); Serial.flush();
char* command = strtok((char *)data, ;);
int count = 0; Serial.println(Inserisci umidid min);
while (command != 0){ while (Serial.available() == 0);
humin = Serial.parseFloat();
//Divido le informazioni Serial.flush();
switch (count){
case 0: Serial.println(Inserisci la temperatura max);
Speciale Arduino - PROGETTI {115

(int)humin, (int)tumax, (int)tumin, (int)crc) creia-


while (Serial.available() == 0);
tumax = Serial.parseFloat(); mo un vettore da inviare allo Slave, formato da
Serial.flush(); il nome di chi trasmette, le soglie impostate e il
CRC calcolato dal Master. Per comodit tutti pa-
Serial.println(Inserisci la temperatura min);
while (Serial.available() == 0); rametri trasmessi sono trasformati in interi.
tumin = Serial.parseFloat(); Nellultima parte impostato un timeout per
stoppare la trasmissione dopo un certo tempo.
Serial.print(Letto: );
Serial.println(tumin);
Serial.flush(); 2.2 PROCESSI MASTER
} Un controllo che effettua il Master che la tra-
smissione sia andata a buon fine per fare ci
E ancora:
calcola il CRC.
Generalmente per verificare la bont dei dati ri-
Mirf.setTADDR((byte *)name);
cevuti si ricorre alle somme di controllo, quel-
snprintf(threshold, sizeof(toSend), le pi semplici sono quelle algebriche che per
%s;%d;%d;%d;%d;%d, name, (int)humax, (int) hanno alcuni limiti. Pertanto si utilizzano algo-
humin, (int)tumax, (int)tumin, (int)crc); ritmi appositi, conosciuti con lacronimo di CRC
Serial.print(Soglie: );
Serial.println(threshold); (Cyclic Redundancy Check). Questo sfrutta una
Mirf.send((byte *)threshold); rete logica, allinterno della quale vengono intro-
dotti i dati che scorrono in un registro. Durante lo
//Imposto un timeout oltre il quale stoppa la
trasmissione scorrimento, vengono prelevati e combinati fra
while(Mirf.isSending()){ loro dei bit da determinate posizioni del registro:
} il risultato di questa operazione viene combina-
Serial.println(Finished sending);
delay(10); to con il bit in ingresso. In questo caso stato
time = millis(); utilizzato un CRC8, ovvero si ha in uscita una
while(!Mirf.dataReady()){ somma ad 8 bit. Il codice il seguente:
if ( ( millis() - time ) > 1000 ) {
Serial.println(Timeout Setting parametri);
return; //Calcolo il CRC-8, mi creo quindi un array di byte
}
byte bhmax = (byte)humax;
}
byte bhmin = (byte)humin;
byte btmax = (byte)tumax;
Nella prima parte quando viene scritto il carat- byte btmin = (byte)tumin;
tere k sulla seriale, il programma ci chieder
di inserire le nuove soglie minime e massime di byte crc32_str[4] = {
umidit e temperatura che poi saranno inviate bhmax, bhmin, btmax, btmin };
allo Slave.
Mentre nella seconda parte col coman- crc = CRC8(crc32_str);
Serial.println(CRC: );
do snprintf(threshold, sizeof(toSend),
Serial.println(crc);
%s;%d;%d;%d;%d;%d, name, (int)humax,
116} Speciale Arduino - PROGETTI

E ancora: Inizialmente vengono effettuate tutte le inizializ-


zazioni sia per i sensori sia per la comunicazio-
//Calcolo CRC-8 - algoritmo basato sulle formule
di CRC-8 di Dallas/Maxim ne. Inizia quindi, lacquisizione di umidit e tem-
byte CRC8(const byte *data) { peratura del DHT22, ed inizia il timer per linvio
byte crc = 0x00;
dei dati misurati. Non avendo una necessita di
while (*data) { real time inviamo i dati ogni 10 secondi.
byte extract = *data++;
for (byte tempI = 8; tempI; tempI--) { Pertanto verr avviata la conversazione con il
byte sum = (crc ^ extract) & 0x01; Master, una volta inviati i parametri lo Slave si
crc >>= 1;
mette in ascolto per ricevere eventuali imposta-
if (sum) {
crc ^= 0x8C; zioni. Se cos fosse acquisisce questo pacchet-
} to, ne estrae le informazioni di cui ha bisogno e
extract >>= 1;
} si calcola il CRC e verifica se uguale a quello
} ricevuto dal Master. Se cos fosse risponde con
return crc;
} OK, altrimenti da Errore.
Intanto il microcontrollore continua a verificare
3. SLAVE se i parametri letti siano o meno allinterno del-
Di seguito riportato il Flow Chart del program- le soglie massime e minime. Agendo di conse-
ma: guenza sugli attuatori, che in questo caso sono
un motore che apre e chiude una finestra, una
pompa per lirrigazione ed un riscaldatore.

3.1 PROCESSI SLAVE


Vediamo ora un po di codice, in questa paragra-
fo descriviamo i processi controllati dal Master:

//Gestisco lumidificatore, il riscaldatore e la vento-


la in funzione delle soglie e dei valori letti
//Riscaldatore
if(myDHT22.getTemperatureC() >= tmax-1){
digitalWrite(RISCALDATORE, HIGH);
}
if(myDHT22.getTemperatureC() <= tmin+1){
digitalWrite(RISCALDATORE, LOW);
}

//Umidificatore
if((int)myDHT22.getHumidity() >= hmax-1){
digitalWrite(UMIDIFICATORE, HIGH);
}
if((int)myDHT22.getHumidity() <= hmin+1){
digitalWrite(UMIDIFICATORE, LOW);
}

Figura 6 - Flow Chart Slave //Aprire finestra


Speciale Arduino - PROGETTI {117

Ed infine controllo che il CRC ricevuto sia ugua-


if(myDHT22.getTemperatureC() >= tmax+4){ le a quello che mi calcolo ora:
duty_motor = 20;
analogWrite(IN_2, duty_motor); Mirf.getData(data);
delay(TCONST); char* command = strtok((char *)data, ;);
} int count = 0;
if(myDHT22.getTemperatureC() <= while (command != 0){
(tmax+tmin)/2 || finecorsa == LOW){ //Divido le informazioni
reset_ports(); switch (count){
duty_motor = 0; case 0:
analogWrite(IN_2, duty_motor); snprintf(name, sizeof(name), %s, command);
delay(TCONST); break;
}
case 1:
hmax = atof(command)/10; //atof(char* ) mi con-
Controllo i parametri in serra e attivo o disattivo i verte un tipo char* in double
break;
vari attuatori, lultimo if mi attiva il motore con un
duty del 20%. Dato che devo aprire e chiudere case 2:
una finestra non ho bisogno di elevata velocit, hmin = atof(command)/10;
break;
ma di elevata coppia pertanto lavoro a duty fisso
e basso. case 3:
Poi controllo che i dati vengano inviati ogni 10 tmax = atof(command)/10;
break;
secondi:
case 4:
tmin = atof(command)/10;
//Invio i parametri ogni 10 secondi break;
if(currentMillis - previousMillis > interval) {
previousMillis = currentMillis; case 5:
Mirf.setTADDR((byte *)server); crc_ric = atoi(command);
snprintf(toSend, sizeof(toSend), %s;%d;%d, break;
name, (int)humidity, (int)temperature); }
Serial.println(toSend); command = strtok(0, ;);
Mirf.send((byte *)toSend); count++;
}
//Imposto un timeout oltre il quale stoppa la tra- //Calcolo il CRC-8, mi creo quindi un array di byte
smissione /*************************************************
while(Mirf.isSending()){ *******************************/
} byte bhmax = (byte)hmax;
Serial.println(Finished sending); byte bhmin = (byte)hmin;
delay(10); byte btmax = (byte)tmax;
byte btmin = (byte)tmin;
while(!Mirf.dataReady()){
if ( ( millis() - time ) > 1000 ) { byte crc32_str[4] = {bhmax, bhmin, btmax,
return; btmin};
}
} crc = CRC8(crc32_str);
} Serial.println(CRC: );
Serial.println(crc);
118} Speciale Arduino - PROGETTI

/************************************************* return;
*******************************/ }
}
//Controllo i dati ricevuti }
/*************************************************
*******************************/ while(!Mirf.dataReady()){
if((byte)crc_ric == crc){ if ( ( millis() - time ) > 1000 ) {
Serial.println(CONTROLLO DATI OK!); return;
Mirf.setTADDR((byte *)name); }
Mirf.send((byte *)OK); }
}
else {
Serial.println(CONTROLLO DATI ERRORE!);
Lintera comunicazione dello Slave avviene in
Mirf.setTADDR((byte *)name);
Mirf.send((byte *)Errore); questa parte dello sketch.
}
/*************************************************
4. SERVER
*******************************/
La componente Server del nostro progetto si oc-
cupa di ricevere ed immagazzinare le rilevazioni
Utilizzando il CRC si riesce con due sole tra- temporaneamente memorizzate sul dispositivo
smissioni a validare la bont dei dati ricevuti. Master e di comunicare a questultimo eventuali
cambi di configurazione inoltrati dallutente tra-
3.2 COMUNICAZIONE LATO SLAVE mite App Mobile (Cap. 5). Si compone di una
La comunicazione lato Slave molto semplice componente software Java e di un database di
infatti questultimo non fa altro che inviare le let- tipo MySQL.
ture dei dati ogni 10 secondi e aspettare se il Il server viene lanciato su una macchina dedica-
Master ha qualche impostazione da inviare. ta e si predispone a ricevere pacchetti in entrata

//Invio i parametri ogni 10 secondi sia dal Master che da App Mobile. Allarrivo di un
if(currentMillis - previousMillis > interval) { package per prima cosa ne analizza lintegrit
previousMillis = currentMillis; tramite controllo CRC, poi ne analizza il mitten-
Mirf.setTADDR((byte *)server);
te: se proviene da App Utente, quindi si tratta
snprintf(toSend, sizeof(toSend), %s;%d;%d,
name, (int)humidity, (int)temperature); di un set di comandi da inviare al Master, lo ag-
Serial.println(toSend); giunge alla coda dei pacchetti in uscita e il flusso
Mirf.send((byte *)toSend);
continua; se invece si tratta di un pacchetto in
//Imposto un timeout oltre il quale stoppa la tra- arrivo dal Master, viene estratta la parte delle
smissione rilevazioni e viene salvata in due tabelle del DB,
while(Mirf.isSending()){
una contenente i dati in formato ROW per even-
}
Serial.println(Finished sending); tuali analisi e unaltra contenente i dati strutturati
delay(10); tramite un parser dedicato pronti per la visualiz-
zazione. Viene inviata poi una risposta al Master
while(!Mirf.dataReady()){
if ( ( millis() - time ) > 1000 ) { che indica lavvenuta ricezione e che pu quindi
Speciale Arduino - PROGETTI {119

procedere a cancellare i suoi dati temporanei. Al 5. APP MOBILE


termine della memorizzazione viene anche con- Lapp mobile linterfaccia dellutente per con-
trollato se nella coda di pacchetti in uscita pre- sultare i dati memorizzati sul Server ed effettua-
sente un set di comandi da inviare al Master che
re eventuali cambi di configurazione al Master
ha appena comunicato, in tal caso invece del-
(soglie di umidit e temperatura, timeout, ..).
la risposta OK viene inoltrato al Master il set di
Si compone di una app Android scritta in lin-
comandi, aspettando poi un OK da questultimo
per concludere il processo di comunicazione. guaggio Java.
LApp al suo avvio, mostra un men tramite il
4.1 COMUNICAZIONE SERVER quale possibile visualizzare le rilevazioni me-
Il Server riceve e inoltra pacchetti su protocollo morizzate sul Server, indicando un range tem-
TCP/IP istanziando un oggetto ServerSocket, porale o di sensori che si vuole visualizzare. Il
secondo il seguente esempio: risultato appare come grafico e mostra landa-
mento temporale delle rilevazioni.
String clientSentence;
String capitalizedSentence; E inoltre possibile scegliere dal menu di effet-
ServerSocket welcomeSocket = new ServerSo- tuare il cambio dei parametri, in questo caso
cket(6789);
vengono mostrati a video le configurazioni at-
while(true) tuali, al salvataggio viene inoltrato un pacchetto
{
al Server che provveder ad instradarlo al di-
Socket connectionSocket = welcomeSocket.ac-
cept(); spositivo Master.
BufferedReader inFromClient =
new BufferedReader(new InputStreamReader(con
nectionSocket.getInputStream())); 5.1 COMUNICAZIONE APP MOBILE
clientSentence = inFromClient.readLine(); La comunicazione della App Mobile verso il Ser-
System.out.println(Received: + clientSentence);
ver avviene su protocollo TCP/IP, con un mec-
.. canismo analogo a quello del server.
}

CONCLUSIONI
Dopo aver costruito la risposta, viene inoltrata al Manca da sviluppare solo la comunicazione tra
mittente nel seguente modo Master e Server.
Lidea che c dietro a questo progetto quella
DataOutputStream outToClient = new DataOu di riportare lagricoltura alla portata di tutti. Infatti
tputStream(connectionSocket.getOutputStre- disporre di un sistema di questo tipo, significa
am()); poter coltivare a casa tutto quello che si vuole
riducendo di molto il tempo e la fatica da dedi-
outToClient.writeBytes(response); carci.
Questo per ora solo un prototipo semplice
120} Speciale Arduino - PROGETTI

dellidea che vogliamo sviluppare, ma la nostra


intenzione era quella di trasmettere la nostra vi-
sione di agricoltura.
possibile, con un sistema ben sviluppato ri-
sparmiare anche pi del 30% delle risorse natu-
rali, ci consente sia di abbattere i costi e sia di
ridurre limpatto ambientale.

Antonio La Mura & Umberto Festa

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/progetto-serra-domotica-open-source
Speciale Arduino - PROGETTI {121

Inverter ad onda sinusoidale


Open Source con scheda Infineon
Arduino motor shield di vetrucci

Preparazione della scheda In- Ho risolto usando strip maschio leggermente pi


fineon motor Shield lunghe e ponendo nastro isolante sia sul dorso

L
a scheda Infineon Motor Shield arriva sen- della presa USB che sul dado che inevitabilmen-
za piedini saldati per cui, per prima cosa, ho te va a contatto con essa (fig. 2), per la presa
provveduto a saldare le strip maschio desti- dellalimentazione ci sono meno problemi per-
nate ad accoppiarsi con gli I/O di Arduino. Vista ch esternamente presenta materiale isolante.
la grande corrente (30A) in entrata ed in uscita
dai capi di potenza, la scheda non presenta per
questultimi le tipiche piccole piazzole per strip
ma fori pi grandi con ampie zone in rame da
entrambi i lati, io ho optato per avvitarci sopra
quattro boccole1 per terminali a banana in modo
da rendere comodi i collegamenti provvisori ne-
cessari in fase di prototipazione.
Il montaggio di tali boccole, anche tenute il pi
alto possibile (fig. 1), purtroppo, mal si adatta
alla scheda Arduino Uno, visto che i dadi sotto-
Fig. 2 Nastratura (in grigio) per evitare contatti indesi-
stanti tendono comunque ad urtare la porta di derati.
alimentazione e la porta USB dellArduino.

Modalit di controllo dei 2


half bridge
La scheda presenta 2 integrati BTN8982TA che
sono dei mezzi ponti (half bridge), per creare
una tensione sinusoidale si pu agire in due
modi, il primo comandare contemporanea-
mente i due half bridge con segnali sinusoidali
sfasati di 180 gradi, il secondo quello di far
agire una sola met del ponte alla volta tenendo
costante la tensione in uscita dallaltra met del
Fig. 1 boccole montate in modo da creare il minimo
ingombro sotto lo shield. ponte. (fig. 4)
122} Speciale Arduino - PROGETTI

Fig. 3 - Schema elettrico solo due componenti oltre alle schede Arduino Uno e Infineon motor shield

Fig. 4 potenziale dei due terminali OUT e loro differenza, per un valore efficace di 230V il valore massimo superiore ai 300V.

La seconda soluzione migliore perch tenen- gresso e ne produce una alternata in uscita, fin
do fisso uno dei due valori si evitano met delle qui nulla di nuovo, ma che valore presenta la
perdite di commutazione, per cui nella program- tensione alternata? Per saperlo occorre ripassa-
mazione del firmware ho cercato di implementa- re un po di teoria, il valore col quale si indica la
re questa tipo di controllo. tensione alternata, se non specificato altrimen-
ti, il valore efficace ovvero la radice quadrata
della media dei quadrati, indicata in inglese con
Considerazioni sui valori di
la scritta RMS (Root Mean Square), per unonda
tensione e potenza
sinusoidale (e solo per quella) il valore efficace
Linverter assorbe una corrente continua in in-
Speciale Arduino - PROGETTI {123

si pu ottenere facilmente prendendo il valore di verosimilmente almeno 300W erogabili 24h al


picco di una semionda (detto valore massimo) e giorno oppure potenze maggiori per tempi brevi.
dividendolo per radice di 2.
Vediamo di chiarire con un esempio pratico se Programmazione
diamo in ingresso 12V DC ad un ponte ad H in La realizzazione del firmware con lIDE Arduino
uscita possiamo avere al massimo una sinusoi- ha richiesto la soluzione di diversi problemi che
de che va da +12V a -12V il cui valore massimo non avevo preventivato, la difficolt dovuta ai
12V, di conseguenza il valore efficace risulta di 50Hz che, pur sembrando pochi, richiedono di
di 12/1,41 = 8,51V. creare una sinusoide in soli 20ms con istruzioni
Se vogliamo realizzare un inverter in grado di da eseguire in real time.
erogare i 230Vac della rete domestica dovre- Non ho potuto utilizzare la funzione delay() in
mo applicare un trasformatore con adeguato quanto accetta in ingresso solo valori interi di
rapporto di trasformazione che, al contrario di millisecondo e mi avrebbe consentito di appros-
quanto si pu pensare, non 230/8,51, in quan- simare la sinusoide con meno di 20 gradini (ritar-
to la maggior parte dei trasformatori pensata do minimo 1 ms) per cui, dopo varie ricerche, ho
per ridurre la tensione e non per alzarla e pre- trovato il listato della funzione delay() e modifi-
senta un rapporto di trasformazione reale diver- candolo sono riuscito ad ottenere funzioni delay
so da quello di targa per compensare le cadute personalizzate con ritardo di 10 o 100us. Solo
di tensione. successivamente, in fase di revisione dellartico-
Ad esempio il trasformatore che ho utilizzato nel lo ho scoperto lesistenza della funzione delay-
prototipo presenta Sn=100VA e rapporto nomi- Microseconds() che mi avrebbe evitato la fatica.
nale 220/12 e per ottenere 230 V in uscita ho La forma donda in uscita comunque non era
dovuto alimentarlo con 20V in corrente continua. soddisfacente e ho scoperto che ci era dovuto
Da questi ragionamenti ne consegue che per re- alla frequenza delle uscite PWM di Arduino che
alizzare un inverter che dalla tensione di batteria presentano di default un valore molto basso per
auto ci porti a 230V occorre un rapporto di tra- lo scopo (488Hz). In rete ho trovato una funzio-
sformazione di targa di 230/7,2V che non un ne che permette di variare questo parametro ed
valore standard. In conclusione consiglio di uti- ho portato la frequenza del PWM a 3904Hz.
lizzare un rapporto di trasformazione standard Per creare la sinusoide al posto di calcolare la
con valore secondario di poco inferiore a 7,2 e di funzione seno con sin() eseguito n volte al ciclo
regolare la tensione alternata in ingresso tramite ho optato per creare un vettore di 17 elementi
firmware in modo da ottenere sperimentalmente con gi inseriti i valori del seno di angoli da 0
la tensione di uscita desiderata. a 90. Ripercorrendo il vettore avanti e indietro
Per quanto riguarda la potenza massima del una volta comandando una met ponte una vol-
nostro inverter abbiamo il limite di 30A per cui ta laltra met ho ricreato in uscita una sinusoide
se alimentiamo a 12V la potenza massima in approssimata con ben 64 gradini.
ingresso sar di 12x30=360W, anche il trasfor- Come visibile in fig. 5 la forma donda della ten-
matore dovr presentare una potenza nominale sione presenta molti picchi dovuti alla commu-
maggiore o uguale a 360VA ed in uscita avremo tazione PWM per cui ho pensato di filtrarli appli-
124} Speciale Arduino - PROGETTI

Fig. 5 Forma donda delluscita con collegato un carico


Fig. 6 Forma donda delluscita con condensatore da
resistivo da 40W.
0,47uF e carico resistivo da 40W, la forma donda risulta
sensibilmente migliorata.
cando in uscita un condensatore poliestere con
tensione di lavoro 400VAC e 0,47uF ed ecco i
risultati:

Conclusioni
Con questo prototipo ho dimostrato che pos-
sibile utilizzare la scheda Infineon, originaria-
mente pensate per i motori in corrente continua,
anche per realizzare un inverter. Prossimi passi
possibili per sviluppare ulteriormente il progetto
sono quelli di poter variare tensione e frequenza Fig. 7 - Il prototipo funzionante (ancora senza condensatore)

allo scopo di controllare motori asincroni.


1 I terminali di potenza sono cinque, ma per
questo progetto non mi serviva la massa in usci-
ta e quindi non ho installato la relativa boccola.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/inverter-ad-onda-sinusoidale-open-source-con-scheda-infineon-ardui-
no-motor-shield
Speciale Arduino - PROGETTI {125

Camera slider DIY low cost con


Arduino [Progetto completo]
di Vincenzo Motta

L
obbiettivo di questo articolo fondamen- seguente:
talmente quello di mostrarti il mio prototipo
completamente testato e funzionante e ren-
derlo open per chiunque volesse realizzarlo
e migliorarlo.
Esistono varie soluzioni sul mercato, da quelle
professionali e semi-professionali di marchi or-
mai noti a kit assemblabili stile fai da te, ma
Per adattare la mia centralina con motore ad un
sono forse prodotti piuttosto cari per time-lapser
camera slider non motorizzato, come quello so-
e videomaker entry-level. La mission di que-
pra mostrato, ho chiesto supporto ad HackSpa-
sto articolo sicuramente quella di ridurre note-
ce Catania per la realizzazione di alcuni sostegni
volmente i costi, realizzando a casa propria un
stampati in 3D. Nello specifico stato realizzato
camera slider. un supporto in materiale PLA che grazie all in-
serimento di due viti sorreggesse il mio motore
COS UN CAMERA SLIDER? stepper. Il motore stepper stato poi ancorato
Il camera slider (chiamato anche dolly) una a una cinghia agganciata al carrello dello slider.
delle attrezzature pi utilizzate nel cinema, nel Se non hai la possibilit di avere a tua disposi-
film making e soprattutto nella fotografia. Lin- zione una stampante 3D, esistono infiniti modi
venzione del dolly sembra attribuibile al regista per realizzare un carrello, potresti anche adotta-
e tecnico canadese-statunitense Allan Dwan, re la soluzione skate dolly di Stavros Koulis
anche se qualcuno sostiene sia invece un bre- da cui ho preso ispirazione per future evoluzioni
vetto del 1912 dellitaliano Giovanni Pastrone. del progetto e che ti mostro qui di seguito:
Si tratta di un sistema che si possa spostare in
modo liscio e fluido per muovere una macchi-
na da presa per realizzare video in movimento
o per muovere una reflex per realizzare time-
lapse in movimento. Solitamente un sistema del
genere ha ruote che scorrono su binari, ma molti
usano carrelli o sedie a rotelle. Io ho testato la
mia centralina su un sistema dotato di un carrel-
lo che, grazie a dei cuscinetti a sfera, si muove
su dei binari.
Un esempio tipico di slider non motorizzato il
skete dolly non motorizzato
126} Speciale Arduino - PROGETTI

Un filmato time-lapse pu essere ottenuto pro-


cessando una serie di fotografie scattate in se-
quenza e opportunamente montate o attraverso
video che verranno poi accelerati. Filmati di li-
vello professionale, vengono prodotti con lau-
silio di videocamere e fotocamere provviste di
intervallometri ovvero di dispositivi di regolazio-
ne, del frame rate di cattura o della frequenza
degli scatti fotografici, su uno specifico intervallo
temporale; alcuni intervallometri sono connessi
skate dolly motorizzato al sistema di controllo del movimento della te-
lecamera in modo da ottenere effetti di movi-
BENEFICI DELLUTILIZZO DEL CAMERA mento, quali panning e carrellate, coordinati a
SLIDER differenti frame rate. Il time-lapse trova un largo
fare piccoli movimenti di camera in manie- impiego nel campo dei documentari naturalisti-
ra precisa e armoniosa ci. Mediante questa tecnica cinematografica,
giocare con la profondit di campo infatti possibile documentare eventi non visibili
seguire un soggetto in movimento ad occhio nudo o la cui evoluzione nel tempo
rivelare lambientazione che ci circonda poco percettibile dallocchio umano, come il mo-
creare dinamicit alla ripresa vimento apparente del sole e delle stelle sulla
volta celeste, il trascorrere delle stagioni, il mo-
TIME-LAPSE vimento delle nuvole o lo sbocciare di un fiore.
La pi importante applicazione di un siste- La fotografia time-lapse considerata una tecni-
ma camera slider sicuramente la fotografia ca opposta alla fotografia ad alta velocit e non
time-lapse. deve essere confusa con lanimazione a passo
La fotografia time-lapse (dallinglese time: uno. Un esponente di rilievo nel campo del ti-
tempo e lapse: intervallo, quindi fotografia me-lapse il regista e direttore della fotografia
ad intervallo di tempo), o semplicemente time- statunitense Ron Fricke che ha utilizzato que-
lapse, una tecnica cinematografica nella qua- sta tecnica nel cortometraggio IMAX Chronos
le la frequenza di cattura di ogni fotogramma (1985) e nel film Baraka (1992).
molto inferiore a quella di riproduzione. A causa
di questa discrepanza, la proiezione con un fra- LA CENTRALINA ELETTRONICA
me rate standard di 24 fps fa s che il tempo, Di seguito il particolare del jack con i relativi col-
nel filmato, sembri scorrere pi velocemente del legamenti colorati:
normale.
Speciale Arduino - PROGETTI {127

1 Buzzer
Convertitore DC/DC Step-Down da 12V a
5V
Connettore Jack 2.5mm
Fotoaccoppiatore 4N35

IL MOTORE STEPPER
I motori passo passo ( o stepper ) sono classifi-
cati in due tipologie distinte:
unipolari
COMPONENTI UTILIZZATI
bipolari
1 Arduino Uno
i motori unipolari sono pi semplici da pilotare in
1 Motore Stepper Bipolare(4 fili) mod.
quanto la sequenza della rotazione esperessa
Nema 17
dal succedersi delleccitazione delle bobine di
1 Ponte H integrato SN754410NE + zoc-
coletto cui composto; i motori bipolari sono di mag-

1Shift Register 74HC595 + zoccoletto giore complessi in quanto la rotazione avviene


1 Display LCD dim.162 (16 colonne, 3 ri- con un campo magnetico generato dalla corren-
ghe) con retroilluminazione blu te che percorra in entrambi i versi le bobine.
1 Trimmer da 10 kohm Da sottolineare la maggiore forza sviluppabile
4 Switch a pulsante da un motore di tipo bipolare nei confronti dellu-
3 Resistori da 1kohm nipolare in quanto a insistere sulla rotazione
1 Resistore 470kohm(protezione IR led sono 2 avvolgimenti in contemporanea e non
fotoaccoppiatore) uno solo.
128} Speciale Arduino - PROGETTI

ne di movimento ho optato per l utilizzo


del motore passo passo.
In particolare ho optato per un motore
che assorbisse circa 800mA per fase
alimentato con una tensione di 12 V.

PILOTARE IL MOTORE: L SN-


754410NE
Il numero di fili di cui un motore passo-passo L SN754410NE un popolare H-Bridge (ponte-

possono essere 4,5,6 o 8 e sono direttamente H) che pu essere utilizzato per pilotare 2 motori

legati alla caratteristica unipolare (5,6 o 8 con- in corrente continua, 1 motore stepper, solenoi-

duttori) o bipolare (4 o 8 conduttori) del motore di, grandi rele o altri carichi induttivi. Sopporta

stesso. una corrente di picco di 2A e un carico continuo

I motori a 4 fili sono di tipo bipolare, come dedu- di 1.1 Ampere per ogni stadio. Accetta tensioni

cibile dallo schema in figura . di carico da 4.5V a 36V. Internamente equi-

Pilotare questi motori possibile facendo per- paggiato con i diodi e una protezione termica.

correre alla corrente gli avvolgimenti in entrambi Possono essere accoppiati 2 chips (uno sopra

i versi in modo alternato, inducendo la produzio- laltro) per aumentare la corrente. Per smaltire

ne del campo magnerico necessario alla corret- al meglio il calore, dovuto alla gestione di grosse

ta rotazione. correnti in gioco, bisogna prevedere un dissipa-

Ho deciso di utilizzare un motore passo-passo tore. E compatibile pin to pin con lL293D che

anzich un motore in corrente continua per ave- un altro popolare ponte-H.

re una precisione maggiore.


Questo perch il motore in corrente continua
lavora in tempi, mentre il motore passo-pas-
so in distanze (gli step).
Lavorando solo in tempi, i motori in corrente
continua sono meno precisi dei motori passo
passo. La precisione e la ripetibilit del moto-
re in corrente continua dipende dal carico del
motore stesso che deve essere costante (cosa qui di seguito il pinout:

alquanto difficile su una guida da circa 1 metro).


Daltro canto i motori a corrente continua hanno
un movimento pi fluido. I motori passo passo
lavorando a piccoli movimenti (step), hanno un
funzionamento ad impulsi (se si aumenta la ve-
locit diventano per impercettibili). Poich lo
scopo del progetto era quello di avere precisio-
Speciale Arduino - PROGETTI {129

da notare che i piedini 4


e 13 si occupano di dissi-
pare il calore se questo in-
tegrato viene saldato in un
PCB dotato di piste per la
dissipazione del calore.

74HC595 SHIFT RE-


GISTER
Il 74HC595 uno Shift Re-
gister ad 8 bit che ho usato
per pilotare il display LCD
utilizzando soltanto 3 pin del microcontrollore Durante la comunicazione i dati vengono trasfe-
anzich 6. In altre parole, questo componente riti nello shift register (74HC595) attraverso i pin
mi permette di ridurre il numero di pin utilizzati N14 (Serial data in) e 11 (Shift register Clock).
da un dispositivo. Tra Arduino e lo shift register Una volta finito l invio dei dati, basta portare a li-
vi una comunicazione di tipo SPI. Sar infat- vello alto il pin 12 (Storage Clock o Latch Clock)
ti importante nello sketch Arduino andare a in- per trasferire i dati dallo shift register al latch. Il
cludere la libreria per la comunicaizone SPI in pin 13 (Output Enable attivo basso) consen-
modo da garantire il corretto funzionamento dell te il trasferimento dei dati dal latch alle porte

LCD. di uscita quando viene portato a livello basso:


avendo noi collegato tale pin fisso a massa, i
dati li ritroveremo sulle uscite non appena dia-
Per stabilire una corretta comunicazione biso-
mo il colpo di clock sul latch. Il pin 10 il master
gna capire chi da ordini e chi li riceve, bisogna
reset: ponendolo a livello basso resetta il conte-
quindi stabilire chi il Master e chi lo Slave
nuto dello shift register, per cui lo teniamo alto
nella comunicazione.
per sicurezza.
Arduino il Master e lo shift register lo Sla-
Il dato serializzato viene trasferito durante la
ve. A questo scopo abbiamo bisogno che i pin:
transizione del clock da livello alto a livello bas-
Data (MOSI), so. I bit vengono inviati dal pi significativo ver-
Clock (SLCK) so il meno significativo, per cui dobbiamo tenere
Latch (Slave Select) conto di questo nella routine di serializzazione
per fare in modo che i bit si ritrovino sulle uscite
siano collegati. nel giusto ordine.

Il MISO (Master In Slave Out) non necessario Qui di seguito la connessione che ho eseguito
perch non abbiamo intenzione di leggere i dati tra l 74HC595 e Arduino:
dal display LCD. (MOSI): connetti il pin 14 (DS) del
130} Speciale Arduino - PROGETTI

74HC595 al pin 11 di Arduino. Facendo accendere il led (circuito 1) un sensore


(SCK): connetti il pin 11 (SHCP) del (nel circuito 2 separato dal circuito 1) chiuder
74HC595 al pin 12 di Arduino. un interruttore. In questo modo non ci sar nes-
Il Latch: connetti il pin 12 (STCP) del sun contatto elettrico tra Arduino e la nostra fo-
74HC595 al pin 9 di Arduino. tocamera.
Il foto accoppiatore, essendo per lappunto un
CONVERTITORE STEP- DOWN LED non puo essere collegato direttamente ad
Il convertitore Step-Down un importantissimo un pin di Arduino. Bisogna interporre una resi-
componente in questo sistema. Lo step-down stenza, nel progetto ho utilizzato una resistenza
si occupa di convertirmi i 12V di tensione in in- da 470k. Oltre alla resistenza, in serie, puoi in-
gresso in 5V di tensione in uscita. Nel progetto serire un LED in modo tale da avere una segna-
che presento in questo articolo stato neces- lazione visiva del comando di scatto.
sario utilizzare qualcosa che mi disaccoppiasse
lalimentazione tra Arduino e il motore stepper,
poich, a causa del fatto che il motore stepper
un carico induttivo soggetto a spike di corrente
durante l eccitazione delle fasi. Gli spike di cor-
rente negli avvolgimenti del motore provocano
del display LCD uno sfarfallio poco gradevole
per una buona visione dell LCD e garanzia di
una breve durata del dispositivo.

Connessione:
il pin 1 al pin 10 di Arduino che utilizzerai
per pilotare il foto-accoppiatore, passando
da una resistenza di 470Kohm;
il 2 a massa (GND);
il pin 4 ad un estermo del cavo del jack di
scatto remoto della tua macchina fotogra-
COLLEGAMENTO DELLA CENTRALINA fica;
ELETTRONICA ALLA FOTOCAMERA il pin 5 all altro estremo del cavo del jack
Per non rischiare di danneggiare la came- di scatto remoto;
ra, ho interposto un foto-accoppiatore modello Nello schema dell intero sistema avrai nota-
4N35 tra Arduino e la camera. to che 2 pin sono ponticellati assieme, sono
Questo componente permette di separare fisi- i contatti dell auto-focus che deve essere
camente due circuiti elettronici. Il foto accoppia- premuto perch la macchina metta a fuoco
tore non altro che una specie di rel elettroni- e non deve essere aperto durante lo scatto.
co. Allinterno presente un led ed un sensore.
Speciale Arduino - PROGETTI {131

COME FUNZIONA? IL CODICE


Come ormai hai ben capito, un camera slider
#include <SPI.h>
ti permette di eseguire scatti in modalit time #include <LiquidCrystal.h>
lapse, questo possibile grazie alla sincronizza-
zione tra numero passi del motore e scatto della
camera. Attraverso l LCD possibile visualizza- // Input Digitali
re un men con le seguenti voci: int prev = A0;
Configura int next = A1;
int conf = A2;
Check: permette di fare un check delle
impostazioni eseguite in fase di configu- // Stepper
razione int motorPin1 = 5;
int motorPin2 = 4;
Reset Carrello: permette di imposta-
int motorPin3 = 2;
re il punto di start del carrello sul bina- int motorPin4 = 3;
rio. Muovendoti con i pulsanti BACK e int nFase=1;
FORWARD puoi decidere dove posizio-
// Led
nare di preciso il punto di start del carrello. int pinLed = 10;
Avvio: fa partire il carrello e la sequenza
// Menu Level
di scatti impostata
char* menu_principale[4] =
Giunti alla voce Configura si entra nel sotto- {Configura,Check,Reset Carrello,Avvio};
men: char* submenu[3] = {passi x
Passi x scatto: imposta il numero di passi scatto,Intervallo passi,Numero scatti};

del motore stepper tra uno scatto e laltro // Init level


della camera int ngiri=0;
Intervallo passi: imposta il ritardo (in se- float interv=0;
int scatti=0;
condi) tra due passi successivi del motore
stepper int posizione=0;
Numero scatti: imposta il numero di scatti
// initialize the library with the numbers of
che la nostra camera dovr eseguire gra- the interface pins
zie all ausilio dell input mandato da Ardu- LiquidCrystal lcd(9);
ino al fotoaccoppiatore .
void setup() {
possibile muoversi all interno del men grazie lcd.begin(16, 2);
all uso dei pulsanti illustrati nello schematico del lcd.print(Camera Slider);
progetto: lcd.setCursor(0, 1);
lcd.print(Vincenzo Motta);
BACK (<< indietro)
delay( 1000 );
FORWARD (avanti>>) lcd.clear();
SELECT (seleziona) lcd.print( menu_principale[posizione] );
Quando premerai il pulsante SELECT il buzzer
digitalWrite( pinLed, LOW );
emetter un suono per segnalare l avvenuta se-
lezione di una voce del men. pinMode(motorPin1, OUTPUT);
132} Speciale Arduino - PROGETTI

pinMode(motorPin2, OUTPUT); lcd.print( menu_principale[2] );


pinMode(motorPin3, OUTPUT); break;
pinMode(motorPin4, OUTPUT);
case 3:
Go();
pinMode(pinLed, OUTPUT); lcd.clear();
} lcd.print( menu_principale[3] );
break;
void loop() { }
lcd.setCursor(0, 1); }
int pnext = analogRead( next ); }
int pprev = analogRead( prev ); }
int pconf = analogRead( conf );
void Setting()
if ( pnext > 1000 || pprev > 1000 || pconf > {
1000) int i = 0;
{ boolean message = true;
if ( pnext > 1000 ) { posizione++; lcd.cle-
ar(); } while ( i < 3 )
if ( pprev > 1000 ) { posizione--; lcd.cle- {
ar(); } int pnext = analogRead( next );
int pprev = analogRead( prev );
if ( posizione > 3 ) posizione = 0; int pconf = analogRead( conf );
if ( posizione < 0 ) posizione = 3;
if ( message )
lcd.print( menu_principale[posizione] ); {
//lcd.print(millis()/1000); lcd.setCursor(0, 0);
delay(200); lcd.print( submenu[i] );
lcd.setCursor(0, 1);
if ( pconf > 1000 ) { message = false;
lcd.clear(); }
switch ( posizione )
{ if ( pnext > 1000 || pprev > 1000 || pconf >
case 0: 1000)
ngiri=0; {
interv=0; if ( pnext > 1000 )
scatti=0; {
Setting(); if ( i == 0 ) { ngiri++; lcd.setCursor(0,
lcd.clear(); 1); lcd.print( ngiri ); }
lcd.print( menu_principale[0] ); if ( i == 1 ) { interv += 0.5; lcd.setCur-
break; sor(0, 1); lcd.print( interv ); lcd.setCursor(6,
1); lcd.print( sec ); }
case 1: if ( i == 2 ) { scatti++; lcd.setCursor(0,
View(); 1); lcd.print( scatti ); }
lcd.clear(); }
lcd.print( menu_principale[1] ); if ( pprev > 1000 )
break; {
if ( i == 0 ) { ngiri--; lcd.setCursor(0, 1);
case 2: lcd.print( ngiri ); }
ResetCarrello(); if ( i == 1 ) { interv -= 0.5; lcd.setCur-
lcd.clear(); sor(0, 1); lcd.print( interv ); lcd.setCursor(6,
Speciale Arduino - PROGETTI {133

1); lcd.print( sec ); } }


if ( i == 2 ) { scatti--; lcd.setCursor(0, if ( pprev > 1000 )
1); lcd.print( scatti ); } {
} nFase--;
if ( pconf > 1000 ) if ( nFase < 1 ) nFase = 4;
{ gira( nFase );
lcd.clear(); }
i++; if ( pconf > 1000 )
message = true; {
} lcd.clear();
} i++;
delay( 200 ); }
} delay ( 200 );
} }
}
void View()
{ void Go()
for (int i=0; i<3; i++) {
{ lcd.print( Avvio del dolly );
lcd.clear(); lcd.clear();
lcd.print( submenu[i] );
lcd.setCursor(0, 1); for ( int sc=0; sc <= scatti; sc++ )
{
if ( i == 0 ) { lcd.print( ngiri ); } lcd.setCursor(0, 0);
if ( i == 1 ) { lcd.print( interv ); lcd.setCur- lcd.print( scatto: );
sor(6, 1); lcd.print( sec ); } lcd.setCursor(8, 0);
if ( i == 2 ) { lcd.print( scatti ); } lcd.print( sc );

delay( 1000 ); for ( int ng=1; ng <= ngiri; ng++ )


} {
} lcd.setCursor(0, 1);
lcd.print( passo: );
void ResetCarrello() lcd.setCursor(8, 1);
{ lcd.print( ng );
lcd.clear();
lcd.print( +/- sposta carr ); gira( nFase );
lcd.setCursor(0, 1); nFase++;
lcd.print( C esce ); if ( nFase > 4 ) nFase = 1;
int i = 0;
delay( interv * 1000 );
while ( i < 1 ) }
{
int pnext = analogRead( next ); digitalWrite( pinLed, HIGH );
int pprev = analogRead( prev ); delay( 1000 );
int pconf = analogRead( conf ); digitalWrite( pinLed, LOW );

if ( pnext > 1000 ) }


{
nFase++; }
if ( nFase > 4 ) nFase = 1;
gira( nFase ); void gira( int nFase ) {
134} Speciale Arduino - PROGETTI

switch( nFase )
{

case 1:
digitalWrite(motorPin1, HIGH);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
break;

case 2:
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, HIGH);
digitalWrite(motorPin4, LOW);
break;

case 3:
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, HIGH);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, LOW);
break;

case 4:
digitalWrite(motorPin1, LOW);
digitalWrite(motorPin2, LOW);
digitalWrite(motorPin3, LOW);
digitalWrite(motorPin4, HIGH);
break;

}
}

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/camera-slider-diy-low-cost-con-arduino-progetto-completo
Speciale Arduino - PROGETTI {135

Arduino Micro e BMP180 Bosch


per realizzare una Weather
Station di adrirobot

D
i schede di controllo di piccole dimensioni CARATTERISTICHE SALIENTI
ve ne sono molte in commercio, nel caso di
Microcontroller Atmel ATmega32u4
Arduino in un precedente articolo Costru- Velocit di clock 16 MHz
zione del robot LittleBot Scheda di control- Tensione di funzionamen- 5V
to
lo, avevamo visto per esempio Arduino Nano,
Tensione in ingresso 7-12 V (consigliati)
mentre in unaltro articolo si vede un possibile Tensione in ingresso 6-20 V (limiti)
utilizzo di una scheda XMX 2Go prodotta dalla 20 (7 forniscono in uscita
Infineon. segnali PWM e 10 possono
Pin I/O digitale essere usati come input
analogici e 3 solo digitali)
Pin analogici 6
Corrente continua per 40 mA
I/O
Corrente per Pin alimen- 50mA
tati a 3.3V:
32 KB (di cui 4 KB utilizza-
Flash Memory ti dal bootloader)
SRAM 22.5 KB
EEPROM 1 KB
Dimensioni 48 x 18 mm

Confronto di dimensioni tra Arduino Micro, Nano e la


scheda XMC 2Go

Vediamo ora di analizzare in dettaglio le caratte-


ristiche offerte da Arduino Micro

Passiamo quindi ad analizzare le varie sezioni


in cui pu essere suddiviso lo schema elettrico
della scheda: alimentazione, processore, me-
moria, pin dinput e output, connettore ICSP,
led di segnalazione.
136} Speciale Arduino - PROGETTI

La funzione della resi-


stenza R2 da 10k
quella di non far flut-
tuare il segnale di co-
mando del mosfet T1.
Lalimentazione ester-
na (non USB) pu
essere fornita da un
alimentatore DC o tra-
mite una batteria, que-
sti dovranno essere
collegati ai pin Gnd e
SEZIONE ALIMENTAZIONE Vin.
La scheda pu funzionare con una tensione che
Arduino Micro pu essere alimentato tramite
teoricamente pu essere compresa tra i 6 e i 20
due diverse fonti di energia: prelevata tramite
volt.
il connettore dellinterfaccia USB micro o con un In pratica per, se si forniscono meno di 7V, la
alimentatore esterno connesso al Pin Vin. tensione continua generata potrebbe essere in-
La fonte di alimentazione selezionata automa- feriore ai 5V e in questo caso il funzionamento
ticamente, tramite lattivazione del mosfet, T1 della scheda pu essere instabile.
Daltra parte, fornire una tensione maggiore di
tipo FND340P o PMV48XP, usato come switch,
12V, pu portare al surriscaldamento con relati-
che si occupa di connettere o meno i 5V USB
vo danneggiamento del regolatore di tensione.
alla scheda.
Per questo motivo lintervallo raccomandato di
tensione compreso tra i 7 e i 12 volt.
Lalimentazione da USB protetta da un
La parte del circuito di regolazione formata per
POLYFUSE azzerabile F1 tipo MF-MSF050-2
quanto riguarda luscita a +5V, dalintegrato U2
da 500 mA, che protegge la porta USB del com-
tipo NCP1117-5, che un regolatore di tensione
puter da cortocircuiti e sovracorrenti.
fisso a basso dropout con una corrente duscita
Sebbene la maggior parte dei computer abbia
massima di 1 A.
gi una protezione interna, il fusibile fornisce un
La tensione duscita livellata tramite i conden-
ulteriore livello di protezione.
satori C1 e C2 da 100nF e dallelettrolitico C3
In questo caso, se una corrente maggiore di 500
da 22F.
mA prelevata dalla porta USB, il fusibile inter-
Nel caso fosse disponibile la tensione di +5V
romper automaticamente il collegamento fino a
fornita tramite la porta USB, oppure da fonte
quando il sovraccarico non sar rimosso.
esterna tramite lapposito PIN, lattivazione del
La tensione livellata e filtrata tramite il con-
secondo mosfet, T2 tipo FND340P o PMV48XP,
densatore C9 da 100 nF e lelettrolitico C14 da
usato anche in questo caso come switch, si oc-
22uF.
cupa di bypassare lintegrato U2.
Speciale Arduino - PROGETTI {137

Riassumendo i pin di alimentazione presenti


sulla scheda Arduino Micro, sono i seguenti:
VI. La tensione dingresso alla scheda Ar-
duino quando sta utilizzando una sorgen-
te di alimentazione esterna (in contrappo-
sizione a 5 volt dalla connessione USB o
altra fonte di alimentazione regolata).
5V. tensione stabilizzata utilizzata per ali-
mentare il microcontrollore e altri compo-
nenti sulla scheda. Questo pu venire sia
da VIN tramite un regolatore a bordo o es-
sere fornita da USB o da un fonte esterna
con un valore di 5V.
3V. Sono forniti 3.3 volt generati dal rego-
latore di bordo. Assorbimento massimo
Nel caso invece, la tensione da USB non fosse
di 50 mA.
presente, la tensione sarebbe prelevata tramite
GND pin di terra.
lingresso Vin.
La funzione della resistenza R9 da 10k quel-
la di non far fluttuare il segnale di comando del
mosfet.
Arduino Micro anche in grado di fornire in usci-
ta una tensione di +3,3V, questa non diretta-
mente utilizzata dalla scheda ma presente per
utilizzi esterni.
SEZIONE PROCESSORE
La scheda utilizza lo stesso tipo di processore
Per ottenere questa tensione che ottenuta ri-
della Arduino Leonardo e Arduino Esplo-
ducendo la tensione di +5V, presente lintegra-
ra, un microcontrollore prodotto dalla AVR tipo
to U4 tipo LP2985-33DBVR, si tratta di un rego-
ATMEGA32U4 siglato sullo schema U1, che
latore di tensione fissa a basso rumore e basso
opera a una frequenza di 16 MHz: connesso
dropout con possibilit di opzione shutdown, nel
a una porta USB ed in grado di agire come un
nostro caso non utilizzata dato che il pin risul-
dispositivo client USB, come un mouse o una
ta permanentemente connesso alla fonte di ali-
tastiera.
mentazione.
LATMEGA32U4 appare al computer come una
La massima corrente duscita teorica di 150
porta COM virtuale, lo stesso processore fun-
mA, anche se dalle caratteristiche della sche-
ziona anche come dispositivo USB secondo lo
da consigliato un assorbimento massimo di 50
standard 2.0.
mA.
Lintegrato supporta, inoltre, la comunicazione SPI a
La tensione livellata dal condensatore elettro-
cui si pu accedere tramite la libreria SPI.
litico C4 da 1uF.
Nel circuito presente un pulsante di reset (duplicato
138} Speciale Arduino - PROGETTI

anche su due pin della scheda), con cui possi- essere mantenuti quando tolta lalimentazione
bile riavviare la scheda. elettrica (per esempio la configurazione di un di-
spositivo).
Per la lettura/scrittura di questultimo tipo me-
moria possibile utilizzare la libreria EEPROM.

PIN DI INPUT E OUTPUT


Ciascuno dei 20 I/O pin digitali di Arduino Mi-
cro pu essere utilizzato sia come ingresso che
come uscita, per fare questo si utilizzeranno
le funzioni pinMode (), digitalWrite (), e digi-
talRead ().
MEMORIA
I pin operano a 5 volt e ognuno pu fornire o
Il processore ATMEGA32U4 ha 32 KB di me-
moria flash, anche chiamata flash memory, di ricevere un massimo di 40 mA di corrente.

cui 4 KB sono utilizzati per il bootloader. Internamente presente una resistenza di pull-
Sono poi presenti 2,5 KB di SRAM (acronimo di up (sconnessa di default) del valore di 20-50 k.
Static Random Access Memory), che un tipo Alcuni pin hanno funzioni specializzate.
di RAM che non richiede refresh. Serial: 0 (RX) e 1 (TX). La scheda dotata di
E inoltre presente 1 KB di memoria EEPROM due pin per la comunicazione seriale di tipo TTL
(acronimo di Electrically Erasable Programma- a 5V. I pin N.0 e N.1 sono collegati direttamente
ble Read-Only Memory), in cui possibile me- ai corrispondenti pin del processore 32U4 Piedi-
morizzare piccole quantit di dati che devono no 21 TXD1 e 20 RXD1.
Speciale Arduino - PROGETTI {139

Ogni ingresso analogico fornisce 10 bit di risolu-


zione (cio 1024 valori differenti).
Per default la misura ingressi analogici per va-
lori di tensione compresi tra 0 e +5 volt, anche
se possibile cambiare la tensione massima
utilizzando il pin AREF e la funzione analogRe-
TWI: 2 (SDA) e 3 (SCL). La scheda supporta il
ference ().
protocollo hardware TWI detto anche I2C forma-
Oltre ai pin sin qui citati, sono presenti un paio di
to da due linee seriali di comunicazione:
altri pin con funzioni speciali, questi sono:
SDA (Serial DAta line) per i dati;
AREF: Tensione di riferimento per gli ingressi
SCL (Serial Clock Line) per il clock.
analogici. Utilizzato con il comando analogRe-
ference ().
Reset: Portare questa linea LOW per resettare
il microcontrollore. Tipicamente utilizzata per
aggiungere un pulsante di reset, quando quello
presente sulla scheda non raggiungibile.

Per utilizzarla occorre far ricorso alla Liberia


CONNETTORE ICSP
Wire.
A lato del pulsante di reset, presente il con-
Interrupt esterni: 0 (RX), 1 (TX), 2 e 3 Questi
nettore J4 denominato ICSP (acronimo di In
pin possono essere configurati per attivare un
Circuit Serial Programming) per leventuale pro-
interrupt su un valore basso, un fronte di salita o
grammazione senza rimozione dal circuito del
di discesa, o una variazione di valore. Vedere la
processore.
funzione attachInterrupt () per i dettagli.
Pin PWM, i pin 3, 5, 6, 9, 10, 11 e 13 sono uti-
lizzabili come uscite PWM (acronimo di Pulse
Width Modulation) a 8 bit utilizzando la funzione
analogWrite().
Ingressi analogici: A0-A5, A6 A11 (su pin
digitali 4, 6, 8, 9, 10, e 12) Arduino Micro pu
essere configurato per avere sino a 12 ingressi
analogici, i pin da A0 a A5 sono direttamente eti-
I pin del connettore sono inoltre duplicati sulla
chettati sui pin stessi, mentre per gli altri, da A6
scheda e sono etichettati MISO, MOSI e SCK.
a A11, sono disponibili accedendo tramite codi-
ce di programmazione utilizzando le costanti da
LED DI SEGNALAZIONE
A6 ad A11 poich sono condivise rispettivamen-
Sulla scheda sono presenti quattro led:
te sui pin digitali 4, 6, 8, 9, 10, e 12.
due di colore giallo (RX1 eTX1) che segnala-
Tutto ci pu anche essere utilizzato come I /O
no il traffico di dati sulla linea seriale, il led RX1
digitale.
connesso al pin RX_LED / SS, che indica lattivit
140} Speciale Arduino - PROGETTI

Pin del Arduino questa funzione, il che significa che la connes-


Pin J4 Funzione
Micro sione USB al computer rimane connessa indi-
MISO (Master Input Salve
1 MISO pendentemente dallo stato del microcontrollo-
Output)
2 +5V +5V re principale.
Combinando queste due funzioni in un unico
3 SCK SCK (Serial Clock Signal)
processore, la porta seriale finalmente libera
MOSI (Master Output
4 MOSI per il programma utente in qualsiasi momento,
Slave Input)
5 RESET RESET lo stack USB prevede anche la parte HID che
permette quindi ad Arduino Micro di emulare
6 GND GND
un mouse o una tastiera.
Occorre per segnalare che qualche volta, vi
di trasmissione durante la comunicazione USB,
ma pu essere anche utilizzato come slave. potrebbero essere dei problemi di restart quan-

uno di colore verde (L3) collegato al pin digi- do si apre la connessione seriale, per cui si po-
tale 13. Quando il pin HIGH, il LED acceso, trebbe perdere la connessione con la scheda
quando il pin LOW, esso spento. quando si avvia il programma.
uno di colore blu (ON1), situato nella parte
inferiore della scheda, segnala la presenza di RINUMERAZIONE DELLA SERIALE AL
alimentazione RESET
Tutti i led sono di tipo SMD hanno una resi- Dal momento che la scheda non ha un chip dedi-
stenza di limitazione dal valore di 1k. cato per gestire la comunicazione seriale, signi-
fica che la porta seriale virtuale, solamente
DIFFERENZE TRA ARDUINO MICRO E una routine software, sia sul sistema operativo,
ARDUINO UNO che sulla scheda stessa.
Terminata la descrizione di come funziona la
Proprio come il computer crea unistanza del
scheda, passiamo ora ad analizzare alcune dif-
driver della porta seriale quando si collega qual-
ferenze che esistono tra una normale scheda
siasi Arduino, la scheda Arduino Micro creer
Arduino UNO e una scheda Arduino MICRO.
unistanza seriale ogni volta che esegue il suo
In generale, si programma e si utilizza la scheda
bootloader.
Arduino Micro come si farebbe con altre schede
Questo significa che ogni volta che si reimposta
Arduino. Vi sono, tuttavia, alcune differenze im-
la scheda, la connessione seriale USB sar in-
portanti.
Come abbiamo visto, la scheda Arduino Micro terrotta e in seguito ristabilita.

ha un solo processore sia per lesecuzione del La scheda scomparir momentaneamente


programma che per la comunicazione USB con dallelenco delle porte seriali e la lista si rinume-
il computer. rer.
Arduino Uno e altre piattaforme utilizzano inve- Qualsiasi programma che ha una connessione
ce il classico FT232 o un Atmel dedicato, come il seriale aperta con la scheda perder la sua con-
modello ATMEGA8U2 su Arduino UNO R3, per nessione.
Speciale Arduino - PROGETTI {141

Micro.
Come abbiamo visto
lATMEGA32U4 oltre alla
comunicazione seriale,
supporta sia la comunica-
zione I2C (TWI) sia la SPI.

I N S TA L L A Z I O N E
EMULAZIONE DI TASTIERA E MOUSE DEL DRIVER
Un vantaggio di utilizzare un singolo chip per le-
Per installare il driver occorre collegare la sche-
secuzione dei programmi e il collegamento USB
da Arduino Micro al computer, per fare questo
aumentata dalla flessibilit nella comunicazio-
necessario un cavo USB dotato di un connettore
ne con il computer.
di tipo Micro-B.
Mentre la scheda appare come una porta se-
Come abbiamo visto, il cavo USB permette sia
riale virtuale con il sistema operativo (chiamato
la programmazione sia lalimentazione della
anche CDC) per la programmazione e la comu-
scheda.
nicazione (come con Arduino Uno), pu anche
comportarsi come un (HID acronimo di Human
Interface Device) come una tastiera o come un
mouse.

SEPARAZIONE DELLA COMUNICA-


ZIONE SERIALE DALLA PORTA USB
Sulla scheda Arduino Micro la comunicazione
con il PC realizzata con un driver seriale vir-
tuale tramite la porta USB, non vi collegamen-
Le seguenti istruzioni si riferiscono alla versione
to ai pin fisici 0 e 1 come sulla Arduino Uno.
per WINDOWS, sia per la versione XP che le
Per utilizzare la porta seriale hardware UART
successive, con piccole differenze nelle finestre
TTL (5V) (pin 0 e 1, RX e TX), occorre utilizzare
di dialogo.
Serial1.
Una volta collegata la scheda, occorre attende-
Il software Arduino include un monitor seria-
re che Windows avvii il processo dinstallazione
le che consente di inviare e ricevere dati dalla
del driver.
scheda Arduino.
Se linstallazione non si avvia automaticamen-
I LED RX e TX sulla scheda lampeggeranno
te, individuate tramite la Gestione periferiche di
quando vi sar traffico attraverso la connessio-
Windows (Start> Pannello di controllo> Hardwa-
ne USB al computer (ma non per la comunica-
re) nellelenco Arduino Micro, che sar eviden-
zione seriale sui pin 0 e 1).
ziato da un punto esclamativo giallo.
La libreria SoftwareSerial consente la comu-
Fare clic con il tasto destro e scegliere Aggior-
nicazione seriale su altri pin digitali di Arduino
na driver.
142} Speciale Arduino - PROGETTI

Dopo qualche istante, una finestra vi segnaler


che la procedura guidata per installazione del
software per Arduino Micro stata completata.
Premere il pulsante Chiudi.

Nella schermata successiva, scegliere Cerca il


software del driver e fare clic su Avanti.
Fare clic sul pulsante Sfoglia. Unaltra finestra
appare: passare alla cartella con il software Ar-
duino che si appena scaricata.
Selezionare la cartella in cui sono i driver e fare
clic su OK, quindi fare clic su Avanti.

Al primo caricamento di un programma sar ri-


chiesto dinstallare il driver del Bootloader.
La procedura simile a quella appena vista, il
driver posto nella stessa cartella impostata in
precedenza.

Si ricever una notifica che la scheda non ha


superato il test di Windows Logo. Fare clic sul
pulsante Continua.
Speciale Arduino - PROGETTI {143

permette di caricare il nuovo codice senza lu-


tilizzo di un programmatore hardware esterno.
La comunicazione avviene utilizzando il proto-
collo AVR109.
possibile comunque bypassare il bootloader
e programmare il microcontrollore attraverso il
connettore ICSP utilizzando eventualmente un
altro Arduino come programmatore.

TEST DELLA SCHEDA


Per testare la scheda, non caricheremo il solito
programma blink, ma qualcosa di pi comples-
PROGRAMMAZIONE
so: visualizzeremo su un display TFT i dati letti
Arduino Micro pu essere programmata con il
da un sensore di BMP180 che fornisce i valori
software IDE Arduino, ora alla versione 1.0.6,
di: pressione, temperatura e altitudine sul livello
che dovrebbe essere ben conosciuto dai lettori.
del mare.
Per utilizzare la scheda occorrer semplicemen-
Perci oltre alla scheda Arduino Micro sono ne-
te selezionare Arduino Micro dal menu Stru-
cessari i seguenti componenti :
menti> Tipo di Arduino.
Una breadboard;
La scheda Arduino Micro;
Display LCD TFT Arduino;
Sensore di pressione BP180;
Alimentatore per breadboard;
Cavi colorati maschio-mascio per realiz-
zare i collegamenti;
Una batteria 9V per lalimentazione.
Vediamo le caratteristiche dei principali compo-
nenti utilizzati.

DISPLAY LCD TFT ARDUINO


Il display qui utilizzato lo stesso presentato
nellarticolo Scopriamo la nuova scheda Ar-
duino Esplora.
Si tratta di un display LCD tipo TFT (Thin Film
Occorrer inoltre indicare a quale porta seriale
Transistor), retroilluminato che misura 1,77 pari
collegato, selezionandola dal menu Strumenti>
a circa 45 mm di diagonale, con risoluzione di
Porta seriale.
160 x 128 pixel.
Come abbiamo visto lATMEGA32U4 su Ardui-
Il modulo misura 40x44mm circa e nella parte
no Micro programmato con un bootloader che
posteriore presente uno slot per schede mi-
144} Speciale Arduino - PROGETTI

cro-SD, che tra le altre cose, permette di memo- con una dimensione di 3,63,8 mm.
rizzare le immagini bitmap da visualizzare sullo
schermo.
Per la comunicazione, il display utilizza un pro-
tocollo SPI, per facilitare la gestione del display.
E disponibile unapposita libreria che inclusa
in quelle disponibili per lIDE 1.0.5 e successive.

Oltre al valore di pressione, il sensore fornisce


anche la misurazione della temperatura; i dati
sono trasmessi tramite uninterfaccia I2C, con
un indirizzo fisso 0x77.
La calibrazione fatta durante la produzione e
i valori sono salvati nella memoria del sensore.
Per facilitare luso del sensore, questo si trova di
SENSORE DI PRESSIONE BMP180 solito gi montato su una piccola basetta, dove
Il sensore utilizzato il BMP180 prodotto dalla oltre al sensore, trovano posto i pochi altri com-
BOSCH, permette di misurare pressioni da 300 ponenti necessari al suo funzionamento.
a 1100hPa (da -500m a +9000m relativi al livello Il modulo utilizzato dispone anche di un piccolo
del mare), la tensione di alimentazione com- regolatore di tensione tipo 662K che fornisce
presa tra 1.8-3,6 (VDD) e 1.62-3.6V (VDDIO), il in uscita una tensione di 3,3 V, che permette di
consumo di soli 5uA con una lettura al secon- alimentare il modulo anche con una tensione di
do. 5V.

ALIMENTATORE PER BREADBOARD


Per alimentare i vari componenti utilizzati, si
utilizzato unalimentatore compatto (dimensioni:
55 x 35mm) studiato appositamente per essere
impiegato con le breadboard.
Al modulo possibile applicare una tensione
compresa tra 6,5 e 12 Vdc, per ottenere in usci-
ta due tensioni distinte a 3,3 V e 5 V con una
corrente massima di circa 700 mA.

Ha un interruttore on/off, uscita USB 5V (non uti-


lizzata nel nostro caso), LED di alimentazione e
jumper di selezione tensione. Potrete trovarlo in
Il sensore contenuto in un package tipo LGA rete cercando YwRobot MB-V2
Speciale Arduino - PROGETTI {145

Schema del modulo utilizzato nel test

Pin Arduino PIN Sensore


Pin Display TFT
Micro BMP180
+5V +5V, BL +5V

GND GND GND


MISO MISO
SCK SCK
MOSI MOSI
SDA SDA
SCL SCL
D4 SD CS
D10 LCD CS
D9 D/C
SCHEMA DI COLLEGAMENTO
D8 Reset
Nellimmagine sotto riportata sono visibili i colle-
gamenti da realizzare per leffettuare il test.

LIBRERIA PER UTILIZZO SENSORE


BMP180
Per facilitare luso del sensore disponibile
unapposita libreria (bmp180), questa funzio-
na in unione alla libreria Wire.h gi presente
come libreria standard dellIDE di Arduino che
permette lutilizzo del protocollo I2C.
In rete ve ne sono molte versioni, quella utilizza-
146} Speciale Arduino - PROGETTI

GetTemperature() acquisisce dal sensore il


dato della temperatura.
GetPressure() acquisisce dal sensore il dato
della pressione in Pascal.
GetAltitude() acquisisce dal sensore il dato
dellaltitudine in metri, il risultato ottenuto deve
essere corretto per la pressione relativa al pun-
to in cui avviene la misurazione, nel programma
deve essere inserito il valore locale nella varia-
bile seaLevelPressure, che di default pari alla
pressione a livello del mare pari a 101325 Pa;

Nota: il dato della pressione fornito in Pascal


(Pa) nel Sistema internazionale pari a 1 new-
ton su metro quadrato (1 N/m). In ambito me-
ta per questo test possiede vari comandi:
teorologico, la pressione atmosferica si misura
Initialize();
in centinaia di Pascal (o ettopascal, abbreviato
GetUncompensatedTemperature();
con hPa). Si ha: 1 013,25 millibar = 101 325 Pa
GetUncompensatedPressure();
= 1 013,25 hPa
Compensate Temperature();
CompensatePressure();
Per utilizzare la libreria occorrer scaricarla e
SoftReset();
salvarla allinterno della cartella Library dellIDE
GetTemperature();
di Arduino.
GetPressure();
Successivamente per utilizzarla allinterno del
GetAltitude();
programma si dovranno aggiungere le seguenti
SetResolution();
righe:
IsConnected()
EnsureConnected() #include <Wire.h>
GetErrorText(). #include <BMP180.h>

Nel programma di test saranno utilizzati sola-


mente i seguenti:
PROGRAMMA DI TEST
Initialize() Inizializza il sensore Il programma di test (Sensore_BMP180) mo-

IsConnected() verifica che il sensore sia ef- strer sul display TFT, dopo una pagina ini-

fettivamente connesso. ziale di presentazione, i valori letti dal sensore

EnsureConnected() verifica che sia possibile BMP180.

connettersi con il sensore. Per il funzionamento del programma oltre alle

SoftReset() garantisce che quando si colle- librerie Wire.h e BMP180.h citate prima per la

gato il sensore vi sia un avvio pulito. gestione del sensore occorre utilizzare anche
altre due librerie che sono gi incluse in quelle
Speciale Arduino - PROGETTI {147

Questo valore potrebbe non essere corretto in


quanto la pressione dellaria dipende non solo
dellaltitudine, ma anche da altri fattori quali tem-
peratura, umidit relativa, e le condizioni atmo-
sferiche. Tuttavia, questa stima pu essere utile
per applicazioni non critiche.
Nota: Per i calcoli impostare il dato in uscita in
Pa.

#include <TFT.h> // Arduino LCD library


#include <SPI.h>
standard dellIDE versione 1.0.6, queste sono // gestione sensore BMP180
TFT.h e SPI.h che occorrono per la gestione del #include <Wire.h>
#include <BMP180.h>
display LCD.
Il listato sufficientemente commentato per // Definizione dei pin utilizzati
comprenderne il funzionamento. // per il display TFT
#define cs 10
Per ottenere i valori corretti dellaltitudine occor-
#define dc 9
re inserire il valore relativo alla propria posizio- #define rst 8
ne nella variabile seaLevelPressure, che di de-
#define indicatorLed 13
fault contiene il valore 101325 (espresso i Pa),
// array per contenere i dati di pressione
per determinare il valore si pu utilizzare lutility char PressurePrintout[5];
trovata in rete. String Pressure;
// array per contenere i dati di temperatura
char TemperaturePrintout[5];
String Temperature;
// array per contenere i dati di altitudine
char AltitudePrintout[5];
String Altitude;

// Crea unistanza per il senore BMP180.


BMP180 barometer;
// Inserire la pressione a livello del mare della
// vostra posizione a Pascal.
float seaLevelPressure = 101325;

// create an instance of the library


TFT TFTscreen = TFT(cs, dc, rst);

void setup() {
// Scrittura pagina di presentazione
TFTscreen.begin();
Il risultato del calcolo solamente una stima in TFTscreen.background(0, 0, 0);
cui si assume un calo esponenziale della pres- TFTscreen.setTextSize(2);
TFTscreen.stroke(255,255,0);
sione considerando una pressione a livello del
TFTscreen.text( Test sensore,0,0);
mare di 1 atm (101325 Pa). TFTscreen.text( BMP180,0,20);
148} Speciale Arduino - PROGETTI

TFTscreen.text(Arduino Micro,0,40);
TFTscreen.stroke(0,255,255); TFTscreen.text(Pressione:,0,0);
TFTscreen.text( adrirobot,0,60); TFTscreen.setTextSize(3);
Pressure = String (barometer.GetPressure());
// inizalizzazione della libreria I2C per la Pressure.toCharArray(PressurePrintout, 6);
// comunicazione con il sensore BMP180. TFTscreen.text(PressurePrintout, 0, 18);
Wire.begin(); TFTscreen.text(Pa,115,18);
// Impostazione LED indicatore.
pinMode(indicatorLed, OUTPUT); // Lettura e visualizzazione temperatura in gradi
// Creiamo unistanza del nostro sensore BMP180. Celsius.
barometer = BMP180(); TFTscreen.stroke(0,255,0);
// Si verifica che ci si pu collegare al sensore. TFTscreen.setTextSize(2);
if(barometer.EnsureConnected()) TFTscreen.text(Temperatura:,0,45);
{ TFTscreen.setTextSize(3);
TFTscreen.setTextSize(1); TFTscreen.stroke(0,255,0);
TFTscreen.stroke(0,255,0); Temperature = String (barometer.GetTemperatu-
TFTscreen.text(BMP180 collegato,30,100); re());
// Accensione led se sensore collegato Temperature.toCharArray(TemperaturePrinto
digitalWrite(indicatorLed, HIGH); ut, 6);
TFTscreen.text(TemperaturePrintout, 0, 63);
// Dopo il, collegamento, il sensore viene TFTscreen.circle(110, 65, 2);
//resettato per garantire un avvio pulito. TFTscreen.text(C,115,63);
barometer.SoftReset();
// Ora inizializziamo il sensore. //Lettura e visualizzazione quota attuale in me-
barometer.Initialize(); tri.
} TFTscreen.stroke(255,255,0);
else TFTscreen.setTextSize(2);
{ TFTscreen.text(Altitudine:,0,90);
TFTscreen.setTextSize(1); TFTscreen.setTextSize(3);
Altitude = String (barometer.
TFTscreen.stroke(255,0,0); GetAltitude(seaLevelPressure));
TFTscreen.text(BMP180 non collegato,20,100); Altitude.toCharArray(AltitudePrintout, 6);
// Spegnimento led se sensore non collegato TFTscreen.text(AltitudePrintout, 0, 108);
digitalWrite(indicatorLed, LOW); TFTscreen.text(m,115,108);
}
// Tempo di visualizzazione schermata iniziale // Attesa tra le misure
delay(2000); delay(1000);
TFTscreen.background(0, 0, 0);
} // Cancellazione dati per nuova misura
TFTscreen.stroke(0,0,0);
void loop() { TFTscreen.text(PressurePrintout, 0, 18);
if(barometer.IsConnected) TFTscreen.text(TemperaturePrintout, 0, 63);
{ TFTscreen.text(AltitudePrintout, 0, 108);
//Lettura e visualizzazione pressione in Pascal. }
TFTscreen.stroke(255,0,0); }
TFTscreen.setTextSize(2);
Speciale Arduino - PROGETTI {149

FILMATO ILLUSTRATIVO
E possibile vedere lesecuzione del programma
visionando il filmato:

Arduino Micro Lettura sensore di pressione BMP180


https://www.youtube.com/watch?v=FWeUyzwvtDs

CONCLUSIONI
Siamo al termine di questarticolo di presenta-
zione di questo piccolo/grande Arduino, abbia-
mo anche mostrato lutilizzo di un sensore con
cui il lettore potrebbe creare, con lutilizzo di al-
tri sensori quali sensore di umidit e un modu-
lo clock, una piccola stazione meteo, oppure
realizzare magari un altimetro come visibile in
questo filmato.
Non resta che liberare la propria immaginazio-
ne.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/arduino-micro-e-bmp180-per-realizzare-una-weather-station
150} Speciale Arduino - PROGETTI

Progetto Giardiniere: Gestire una


serra domestica con Arduino
di Gaspare Santaera

IL GIARDINIERE: LIDEA allirrigazione, allilluminazione ed alla ventila-

I
l progetto Giardiniere nasce come espansione zione di questultima.
di Thumbelina, un progetto che proponeva la In questo articolo verr presentato lo schema
realizzazione di un software capace di scrivere elettrico che utilizza un Arduino Uno, il firmware
in modo automatico uno sketch per Arduino, per scritto per questultimo, ed infine verr data una
la gestione combinata di sensori e trasduttori. Il breve descrizione delle valvole utilizzate per lir-
software stato sviluppato e testato su un pic- rigazione che sono state progettate ad-hoc per
colo modello di serra arrivando a conquistare questa applicazione e realizzate con lausilio
il secondo premio, nella challenge indetta dal
di una stampante 3D. Tutti i CAD delle valvole
CNA Italia allinterno dellHackathon, tenutasi in
nonch i CAD di tutti gli altri pezzi, stampati in
occasione dellInternet Festival a Pisa lo scorso
3D, della struttura sono allegati nel file Stl.
Ottobre.

SCHEMA ELETTRICO
Nella figura viene riportato lo schema elettrico
dove per semplicit lArduino Uno viene rappre-
sentato come un blocco sul quale sono stati ri-
portati i pin presenti sulla scheda. Nella parte
sinistra dello schema vengono rappresentati gli
ingressi, ovvero i sensori, mentre nella parte a
destra vengono rappresentate le uscite, ovvero
gli attuatori.
Per quanto riguarda gli ingressi, sono stati usati
sei diversi sensori a loro volta collegati a sei in-
Partendo da Thumbelina, quindi il Giardiniere, gressi analogici di Arduino; presente un sen-
che rispetto alla madre ha un nome meno fan- sore di temperatura, un sensore di luminosit e
tasioso ma pi esplicativo, un progetto per la quattro sensori di umidit, uno per ogni vasca o
creazione e la gestione di una serra verticale da vaso.
balcone. Nello specifico il sistema composto
Il sensore di temperatura usato un classico
da quattro vasche di terra e si occupa del mo-
LM335, un sensore analogico che restituisce
nitoraggio dei valori di umidit del terreno, della
sul suo piedino adj una tensione proporzionale
quantit di luce e della temperatura allinterno
alla temperatura misurata.
della serra, provvedendo ove sia necessario
Speciale Arduino - PROGETTI {151

Fotocellula

Considerazioni leggermente diverse vengono


fatte invece per i sensori di umidit, in questo
Simbolo del sensore dUmidit caso la resistenza presente nel partitore di ten-
sione di circa 4.7 MOhm in quanto la resistenza
Per quanto riguarda il sensore di luminosit elettrica del terreno notevolmente superiore. Il
stata usata una banalissima fotocellula, que- sensore dumidit, infatti, si basa sulla capacit
sta si comporta come una resistenza di valore del terreno di cambiare la propria resistenza al
variabile in funzione della luce, nello specifico variare della propria umidit. Un terreno secco
in assenza di luce avr una resistenza relativa- presenta una grossa resistenza elettrica, speri-
mente bassa (10/15 Kohm), mentre in caso di mentalmente stata misurata una resistenza di
luce aumenta la propria resistenza arrivando 7/8 Mohm, che scende allaumentare della per-
anche a superare i 150 KOhm. Usando nel pro- centuale dacqua, sperimentalmente stata mi-
getto il sensore di luminosit come un semplice surata una resistenza di 4 Mohm. Questeffetto
interruttore, atto ad accendere le luci artificiali dovuto alla capacit dellacqua di aumentare
quando quelle naturali scendono al di sotto di la conduttivit del terreno, in quanto portatrice di
una certa luminosit, nel partitore di tensione in- sali minerali ricchi di cationi ed anioni, e al tem-
sieme alla fotocellula viene usata una resisten- po stesso di compattare il terreno riducendo la
za da 150 Kohm, ottenendo cos un buon com- distanza tra le molecole di questultimo.
promesso tra lo stato di luce e quello del buio.
152} Speciale Arduino - PROGETTI

lirrigazione.
La pompa, le ventole e i led vengono controllati
tramite tre optoisolatori SFH618A (usati anche
qui) a loro volta pilotati da tre uscite digitali di
Arduino, mentre le otto valvole (quattro gruppi
da due) vengono pilotate tramite quattro uscite
PWM.
In particolare per quanto riguarda la pompa
stato riutilizzato un vecchio modello smontato
Sensore dUmidit (Simbolo Circuitale Modello Com-
dal parabrezza di unautomobile ed alimentato
merciale Sensore Usato nel Progetto)
a 12V, tale scelta, oltre ad essere abbastanza
economica, aggiunta alla gravit (i contenitori
Nella figura vengono mostrati rispettivamente:
dacqua si trovano sulla parte superiore della
uno schema del sensore; un modello commer-
struttura) garantisce una buona portata in tutte
ciale; il sensore usato in questo progetto. Con-
le vasche.
cettualmente i tre casi sono identici, come gi
detto si tratta di misurare la resistenza elettrica
tra due conduttori ad una certa distanza, quindi
qualunque soluzione che preveda dei conduttori
fissati nel terreno valida. Ovviamente i valo-
ri di resistenza misurati saranno funzione oltre
che dellumidit e del tipo di terreno usato anche
Pompa
della distanza tra i conduttori, sar quindi buo-
na norma eseguire alcune misure a vuoto sul
Anche per le ventole si optato per una solu-
terreno al fine di trovare il migliore valore per
zione di recupero, installando quattro ventole da
la resistenza da inserire nel partitore. Le misure
12V recuperate da alcuni alimentatori per PC
di resistenza riportate nel precedente paragrafo
si riferiscono al mio caso con il tipo di senso-
re mostrato in figura e una miscela di terriccio
standard di quelli normalmente acquistabili al
supermercato.
Nella parte destra dello schematico vengono
mostrate le connessioni tra Arduino e vari attua-
tori, in questo progetto viene usata una pompa
al fine di aumentare la portata tra i contenitori
dacqua e le vasche del terreno, quattro vento-
le (una per ogni vasca) per la ventilazione della
Ventola
serra, otto luci (due per ogni vasca) per lillumi-
nazione e otto valvole (due per ogni vasca) per
Lilluminazione affidata ad un gruppo di led,
Speciale Arduino - PROGETTI {153

alimentati a 9 Volt, anche questi recuperati da


alcune lampade da giardino normalmente ac-
quistabili in qualche ipermercato o catena di fer-
ramenta.

Esploso: Parte Superiore della Valvola

LED La struttura della valvola molto semplice, le


figure mostrano i CAD esplosi di questultima,
Infine, discorso diverso va fatto per le valvole, la parte inferiore composta da una parte rigida
innanzitutto per il tipo di controllo, in questo caso contenente due raccordi per il tubo dellacqua in
necessario un segnale PWM e in secondo luo- ingresso e in uscita e una parete centrale atta
go per la provenienza di questultime. Infatti a a dividere la parte a contatto con lacqua dal-
differenza della pompa, delle ventole e dei led le la parte a contatto con il servo (montato sulla
valvole usate nel progetto sono quasi completa-
parte superiore della valvola). Allinterno della
mente progettate e costruite in casa mediante
parte asciutta presente una flangia alla qua-
una stampante 3D. Come gi detto nel file Stl,
le incollato a sinistra uno stantuffo di silicone
trovate un archivio rar con tutti gli stl dei pezzi da
che chiude la valvola e a destra una molla che
stampare per montare la valvola oltre ai pezzi
serve ad aiutare il servo a spingere lo stantuffo
usati per il montaggio della struttura e la scatola
per chiudere la valvola o in caso di servo in folle
contenente lelettronica (qui un link interessante
chiude automaticamente la valvola prevenendo
su una stampante 3D commerciale).
eventuali perdite dacqua. La molla stata fissa-
ta al telaio mediante lutilizzo di un sistema bul-
lone-dado, la flangia e di conseguenza lo stan-
tuffo, che apre o chiude la valvola, viene mossa
mediante un sistema pignone-cremagliera dove
questultima rigidamente attaccata alla flangia.
Il pignone invece si trova sulla parte superiore
della valvola ed rigidamente attaccato al ser-
vo. Ricapitolando in ogni valvola un servo pilo-
tato da Arduino spinge avanti ed indietro uno
stantuffo aprendo e chiudendo opportunamente
Esploso: Parte Inferiore Valvola
154} Speciale Arduino - PROGETTI

la valvola. Il file Stl contiene tutti i file stampati condi al termine dei quali il contatore viene in-
in 3D per la realizzazione della struttura e delle crementato di 5.
valvole. Infine, viene controllato il valore letto dalla fo-
tocellula, se il sistema rileva una sufficiente
quantit di luce il valore del contatore viene
confrontato con un valore di soglia di luce e nel
caso in cui il valore del contatore superiore
a questultimo le piante hanno avuto luce per
pi tempo di quanto prefissato e quindi sarebbe
inutile accendere i led. Viceversa se il sistema
rileva una bassa quantit di luce e dal controllo
sul contatore del tempo si evince che le piante
hanno avuto luce per un tempo inferiore alla so-
Scheda di Controllo
glia prestabilita, il sistema provveder allaccen-

IL FIRMWARE sione dei led.

Il firmware di pari passo allo schema elettrico Dalla descrizione della logica di funzionamento

anchesso semplice, dopo una fase iniziale di del sensore di luce, si ben intuisce che il sistema

sori e dei vari pin usati da sensori e trasdutto- stato tarato affinch modificando due sempli-

ri, il programma entra in ciclo while infinito. In ci numeri si riesca facilmente a stabilire quanta

ogni ciclo vengono dapprima letti tutti i valori dei luce, tra naturale ed artificiale, dare alle piante

sensori, successivamente vengono eseguiti i ogni giorno, nonch il perch di una variabile

vari controlli sui valori letti. Il primo sensore ad che costantemente tiene il conto dei secondi.

essere controllato quello di temperatura, se il Dopo aver controllato tutti i sensori, il program-

valore letto superiore ad una certa soglia in ma si congela per 300 secondi, aggiornando

tick prestabilita vengono accese le ventole per sempre il contatore, prima di iniziare un nuovo

la ventilazione della serra. In questo caso le ciclo.

ventole rimarranno accese per 60 secondi e uno Cliccando su Giardiniere possibile scarica-

speciale contatore verr incrementato di 60. re il file .rar contenente il firmware.

Successivamente vengono via via controllati i


quattro sensori di umidit, in questo caso se il
CONCLUSIONI
In questo progetto si visto come poter svilup-
valore letto supera il valore di soglia prestabi-
pare in modo semplice, pratico ed economico
lito, viene dapprima attivata la pompa, succes-
una piccola serra domestica da tenere magari
sivamente viene abilitato il servo presente sulla
sul balcone. Lidea di fondo del progetto sem-
valvola e mandato a questultimo un valore in
plice tanto quanto la sua realizzazione, tuttavia
modo da aprire la valvola e far scorrere lacqua
non essendo un esperto di botanica oltre alle
allinterno di questa. Tutto il processo dura 5 se-
caratteristiche sviluppate (irrigazione, illumina-
Speciale Arduino - PROGETTI {155

zione e ventilazione) al momento non ho molte


altre idee su quali azioni o misure si possano
prendere al fine di curare meglio le piante o di
aumentarne la crescita. Per questo ultimo scopo
mi rivolgo alla fantasia e allesperienza degli altri
utenti della community, buon divertimento!

Struttura

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/progetto-giardiniere-gestire-una-serra-domestica-con-arduino
156} Speciale Arduino - PROGETTI

Un telecomando TV per
comandare un robot cingolato
di adrirobot

La luce infrarossa ma ve ne sono altre come: lampadine, resisten-

L
a luce infrarossa o radiazione infrarossa (IR) ze di riscaldamento, candele, impianto di riscal-
una radiazione elettromagnetica con ban- damento centralizzato, anche il nostro corpo ir-
da di frequenza dello spettro elettromagneti- radia luce infrarossa.
co inferiore a quella della luce visibile, con una Perci, occorre prendere alcune precauzioni per
lunghezza donda compresa tra 700 nm e 1 mm garantire che il nostro messaggio IR arrivi al ri-
(banda infrarossa). cevitore senza errori.
Il termine significa sotto il rosso (dal latino in-
fra, sotto), perch il rosso il colore visibile La modulazione
con la frequenza pi bassa. Per eliminare il problema del rumore di fondo,
Per noi esseri umani, questa luce invisibile necessario utilizzare la modulazione.
perch la sua lunghezza donda al di sotto Con la modulazione facciamo s che la sorgen-
dello spettro di sensibilit del nostro apparato di te infrarossa emetta il segnale a una particolare
sensing. frequenza.
Baster sintonizzare il ricevitore
infrarosso su quella frequenza, in
modo da ignorare tutto il resto.
Per analogia si pu fare lesempio
del lampeggio delle luci gialle a
lato dei cantieri che attirano latten-
zione anche in pieno giorno.
Nella comunicazione seriale di so-
Un metodo per vedere questa luce quello di lito parla di MARK e SPACE.
utilizzare una videocamera o fotocamera digita- Il MARK il segnale di default, che lo stato di
le (va bene anche quella di un telefonino). off nel caso del trasmettitore.
Basta puntare il telecomando verso una macchi- Nessuna luce emessa durante lo stato di SPA-
na fotografica, premere un pulsante qualsiasi e CE. Durante lo stato di MARK del segnale di
sar visibile la luce intermittente del LED. luce IR pulsata e si spegne a una particolare
Ci sono molte fonti di luce infrarossa, poich frequenza, di solito compresa tra 30 e i 60 kHz.
tutto ci che irradia calore, irradia an-
che luce infrarossa e questo potrebbe
creare interferenze (rumore di fondo)
tra il telecomando e il sensore.
Il sole la fonte pi brillante di tutte,
Speciale Arduino - PROGETTI {157

Sul lato ricevente un SPACE rappresentato Ultimamente sono per utilizzati dei microcon-
da un elevato livello di uscita del ricevitore. Un trollori visto il loro basso prezzo e soprattutto la
MARK rappresentato automaticamente da loro versatilit di utilizzo.
un livello basso. Nel funzionamento previsto che, se non si pre-
Si prega di notare che i MARK e gli SPACE me alcun tasto, siano mantenuti in modalit a
non sono gli 1 e gli 0 che vogliamo trasmettere. basso assorbimento e solo quando si preme un
Il vero rapporto tra i MARK e gli SPACE e tra 1 tasto, il processore viene risvegliato per linvio
e 0 dipende dal protocollo che viene utilizzato. del segnale IR appropriato.
Per il clock del processore non sono di solito
utilizzati i quarzi, in quanto molto fragili e con
tendenza alla rottura in caso di cadute; in que-
sto caso si utilizzano i risonatori ceramici, che
Nellimmagine sopra riportato un tipico treno sono leggermente meno precisi ma molto pi
di impulsi del protocollo SIRC (SONY), con que- resistenti agli urti.
sto protocollo il LSB (Least Significant Bit - bit Per il pilotaggio del led, la corrente che lo attra-
meno significativo) viene trasmesso per primo. versa, pu variare da 50 mA a oltre 1A.
Il primo impulso ampio 2.4ms, seguito da uno Pi alta la corrente, maggiore sar la distanza
spazio standard di 0.6ms. raggiunta dal segnale. Un buon compromesso
Oltre a segnalare linizio di un messaggio SIRC pu essere trovato tra i parametri dei LED, la
questo segnale di Start viene utilizzato anche durata della batteria e la distanza massima di
per regolare il guadagno del ricevitore IR. controllo.
Viene trasmesso, quindi, il comando di 7-bit, se- La corrente di alimentazione del LED pu esse-
guito dallindirizzo del dispositivo di 5-bit. re alta poich gli impulsi di pilotaggio sono molto
In questo caso sono trasmessi lIndirizzo 1 e il brevi, si consideri comunque che la dissipazione
Comando 19. di potenza media del LED non deve superare il
I comandi sono ripetuti ogni 45ms (misurato da suo valore massimo.
Start a Start) per tutto il tempo per cui il tasto sul necessario verificare che la corrente massi-
telecomando viene tenuto premuto. ma di picco per il LED, dato che riportato sulla
scheda tecnica del led, non sia superata.
Il trasmettitore Un esempio di pilotaggio pu essere un piccolo
Il trasmettitore o telecomando di solito porta- modulo fornito dalla SparkFun, il modulo deno-
tile ed alimentato a batteria, deve consumare minato Max Power IR LED Kit; formato da
meno energia possibile, mentre deve fornire un uno diodo led emittente luce infrarossa con una
segnale IR pi forte possibile per ottenere una lunghezza donda di 950nm, in serie presente
distanza di controllo accettabile. la resistenza R2 da 56 che calcolata consi-
Sul mercato si trovano chip che sono progettati derando i parametri di tensione di alimentazio-
per essere utilizzati come trasmettitori a infra- ne, caduta di tensione sul led e corrente massi-
rossi, di solito sono dedicati solo a uno dei molti ma che deve scorrere al suo interno.
protocolli che sono stati inventati. Laccensione garantita da un transistor NPN
158} Speciale Arduino - PROGETTI

tipo 2N3904 sulla cui base presente una resi- Il Ricevitore


stenza R1 da 330 . Esistono diversi modelli di ricevitore sul merca-
to, il pi importante criterio di selezione la fre-
quenza di modulazione utilizzata.

Nella nostra applicazione, sar utilizzato un te-


lecomando fornito a suo tempo per comandare
il robot Panettone della DeAgostini.

Analizziamo prima di tutto il loro funzionamento:


nella foto sotto potete vedere lo schema a bloc-
Cuore del circuito di comando lintegrato chi del ricevitore TSOP18XX.
SC73C0302-008 di produzione cinese che codi-
fica i segnali della tastiera con il protocollo Sony-
compatibile e li invia tramite un led trasmittente
ad infrarosso. Lalimentazione fornita tramite 2
batterie 1,5V stilo.
Il telecomando presenta 27 tasti a cui sono as-
sociate varie serigrafie.
Il segnale IR ricevuto prelevato dal diodo di
rilevazione a infrarossi PIN, questo segnale
amplificato e limitato nel primo blocco di Input.
Nel blocco AGC il segnale trattato in modo da
ottenere un livello di impulso costante, indipen-
dentemente dalla distanza del telecomando.
Il segnale AC poi inviato al filtro Passa Banda
(Band Pass) che sintonizzato sulla frequenza
di modulazione del telecomando.
Queste frequenze possono andare, per esem-
pio, nel modello TSOP18XX (da 30kHz a 40kHz).
Speciale Arduino - PROGETTI {159

[3] Traverse - n 2 pezzi;


[4] Piastra supporto scheda controllo -
n 1 Pezzo;
[5] Servomotori a rotazione continua
Nel blocco demodulatore avviene la rilevazione
della presenza della frequenza di modulazione Processore
scheda di co- Arduino UNO - ATmega328
e, se questa presente, luscita sar attivata e mando
si avr il segnale sul pin OUT. Comando servomotori
Uscite
Esistono diversi produttori di ricevitori IR tra i Comando led illuminazione
Sensore decodificatore segnali IR
quali: Siemens, Vishay e Telefunken. Sensori tipo TSOP 1836 (36 KHz)
6V tramite 4 batterie 1,5V tipo
Alimentazione
Esempio di applicazione AA
Come esempio di utilizzazione, si pensato di 2 servomotori a rotazione conti-
Motorizzazione
nua
realizzare un semplice robot che sar poi co-
Cingoli In gomma, prodotti dalla Tamiya
mandato tramite i comandi impartiti da un tele-
Misure 195x130x108 mm
comando.
Peso 465 g
Il modulo ricevente potr essere montato su una
semplice bread board.
completi di squadrette n 2 pezzi;
[6] Cingoli 66 maglie n 2 pezzi;
[7] Ruote medie folli 21,5 - n 6 pezzi;
[8] Ruote grandi folli 32 n 2 pezzi;
[9] Pignoni grandi n 2 pezzi;
[10] Portabatteria per 4 batterie tipo AA - n 1
pezzo;
[11] Mini breadboard 17x10 n 1 pezzo;
[12] Scheda di controllo utilizzata Arduino UNO;
[13] Distanziali esagonali M3 L= 20mm n 4
pezzi;
[14] Distanziali esagonali M3 L= 10mm n 4
Queste sono solo alcune delle caratteristiche
pezzi;
del robot proposto:
[15] Dadi M3 n38 pezzi;
[16] Viti testa cilindrica con intaglio M3 L= 8 n
Montaggio del robot 8 pezzi;
Per la costruzione del robot inizieremo dalla lista
[17] Viti testa croce M3 L= 25 n 8 pezzi;
delle parti necessarie, per la localizzazione sul
[18] Viti testa croce autofilettante M3 L= 8 n
robot fare riferimento al disegno sottostante.
8 pezzi;
[19] Viti testa cilindrica con intaglio M3 L= 10
[1] Piastre laterali - n 2 pezzi;
n 14 pezzi;
[2] Profilati fissaggio servomotori - n 2 pezzi;
[20] Rosette piane 3,2 - n 8 pezzi;
160} Speciale Arduino - PROGETTI

[21] Rondelle antisvitamento 3,2 - n 8 pezzi; sono presenti vari componenti come: spezzoni
[22] Modulo sensore a infrarossi tipo TSOP1836; di cingoli in gomma di varie lunghezze, alberi,
[23] Mammut 2 poli; ruote e pignoni
[24] Interruttore deviatore a Levetta sub minia- La lunghezza di cingoli, pignoni e ruote di di-
tura; mensioni diverse, consentono flessibilit nella
[25] Spina DC Dimensioni 2,1 x 5,5 x 9,5mm, progettazione del proprio robot.
terminali a saldare. Per il nostro robot si sono utilizzati:
tutti gli spezzoni per formare due cingoli
Cingoli (1 lungo+2 medi+2 piccoli) 66 maglie [6] ;
I particolari utilizzati sono allinterno della con-
n 6 ruote piccoli folli21,5 [7] ;
fezione Tamiya 70100 Track and Wheel Set;
n 2 ruote grandi folli 32 [8] ;
n 2 pignoni grandi [9].

Servomotore
Per la motorizzazione del robot, si sono utilizzati
due servomotori [5] di taglia normale, da questi
stato eliminato il blocco della rotazione.
Nel prototipo sono stati utilizzati due servomo-
tori Parallax, ma in rete possibile trovare vari
riferimenti dove viene spiegato come effettuare
la modifica su normali servomotori.
Speciale Arduino - PROGETTI {161

Alcune caratteristiche dei servo impiegati: TSOP1836, che fa parte della serie TSOP18XX
dimensioni: 40.5 20.0 38,0 millimetri; prodotto dalla Vishay, questo potr essere sosti-
peso: 43 g; tuito con lequivalente TSOP 4836 (da Conrad
alimentazione: 4,8-6V; codice 171107-62).
velocit A 6V: 50 rpm; Questi sensori, sono ideali come ricevitore per
stallo A6V coppia: 3,0 kg/cm; sistemi di telecomando a infrarossi.
lunghezza del cavo: 270 millimetri.

La batteria e i componenti per


il cablaggio elettrico Come in precedenza descritto, allinterno del di-
Lalimentazione del robot fornita da 4 batterie spositivo, presente il diodo PIN e il preampli-
da 1,5V tipo AA per un totale di 6V inserite allin- ficatore; sono montati su uno stampato inserito
terno di un portabatteria [10] opportunamente allinterno di un contenitore di resina epossidica
fissato al telaio del robot. che ha anche la funzione di filtro IR.
previsto un interruttore deviatore a levetta Il segnale di uscita pu essere demodulato diret-
subminiatura [24] per laccensione e un spina tamente e decodificato da un microprocessore.
DC [25] dimensioni 2,1 x 5,5 x 9,5mm (termina- Il principale vantaggio il funzionamento affida-
li da saldare per il collegamento con la scheda bile anche in ambienti disturbati e la protezione
Arduino). contro impulsi di uscita incontrollati.
Per il collegamento delle varie parti si utilizza un Alcune caratteristiche:
mammut 2 poli [23]. rilevatore IR e preamplificatore in un unico
contenitore;
filtro interno per la frequenza PCM;
compatibilit TTL e CMOS;
uscita attiva bassa;
schermatura contro i disturbi di natura
elettrica;
maggiore immunit contro tutti i tipi distur-
bo della luce;
Modulo ricevitore infrarossi nessuna comparsa di disturbi sugli impulsi
Il sensore utilizzato nel progetto il tipo sulluscita;
162} Speciale Arduino - PROGETTI

tempo di assestamento dopo


laccensione molto breve
(<200s).
Il sensore sensibile solamente ad
infrarossi con lunghezza donda di
950 nm e con una frequenza di 36
kHz.
Questo previene le interferenze IR
da sorgenti di infrarossi come la
luce solare e lilluminazione dome-
Questi sono attivati dal pin digitale 13 che an-
stica.
che quello che attiva il led presente sulla sche-
La luce solare vista come uninterferenza in
da Arduino UNO.
corrente continua (0 Hz), mentre lilluminazione
I led sono connessi in parallelo con la propria
domestica vista come uninterferenza a 100
resistenza di limitazione del valore di 100 , con
Hz, poich al di fuori della banda passante del
tale valore la corrente assorbita dal pin ancora
filtro elettronico; tale frequenza completamen-
nel range disponibile che di 40 mA.
te ignorata dal rivelatore IR.
Per il dimensionamento si utilizzata questa ri-
Si pu utilizzare il sensore cos com, oppure
sorsa della rete:
si pu acquistare un apposito modulo su cui, di
solito, sono montati dei componenti passivi che
prevedono dei pin di collegamento.

possibile realizzarne uno su una millefori op-


pure con un proprio CS.
Dato che lamplificatore interno allintegrato Le caratteristiche del led utilizzato tipo L5WCN5
impostato su un guadagno molto elevato, il si- o equivalente sono:
stema potrebbe iniziare ad oscillare molto fa- dimensioni: 5mm;
cilmente; per questo motivo presente la re- colore + materiale emettitore: super bian-
sistenza R1 e il condensatore C1 in modo da co GaN/SiC;
disaccoppiare la linee di alimentazione.
lunghezza donda: 465nm;
intensit luminosa: 20000mcd (If = 20mA);
LED illuminazione
angolo di visione: 20 ;
Due led ad alta luminosit completano il robot.
Speciale Arduino - PROGETTI {163

tensione diretta: 3.2V. [2] Profilati fissaggio servomotori - n 2


pezzi;
Costruzione particolari del telaio [3] Traverse - n 2 pezzi;
Il materiale base per la realizzazione del telaio [4] Piastra supporto scheda controllo - n
1 Pezzo;
del robot rappresentato da profilati in alluminio
Per la loro costruzione si far riferimento alle
di varie forme e dimensioni che potr essere tro-
misure riportate sui disegni presenti negli al-
vato presso una grossa ferramenta.
legati.
Occorre il seguente materiale:
angolare L in alluminio 30x15x1 mm; Assemblaggio dei particolari
angolare L in alluminio 15x10x1 mm; meccanici
piastra alluminio spessore 1,5 mm; Per il fissaggio dei vari particolari sono inoltre
piastra PVC espanso spessore 3 mm. necessari:
un cacciavite con la punta a taglio e uno
Per le lavorazioni, sono necessari un seghetto
con la punta a croce
per metalli e una lima da ferro.
un paio di pinze
Per le forature, occorre un trapano a colonna
con le punte dei diametri indicati.
Si raccomanda di effettuare i tagli e le foratu-
re serrando i pezzi su una morsa interponendo
eventualmente del materiale plastico per evitare
di rovinare la superficie dei pezzi.
Le operazioni indicate producono dei trucioli di Il montaggio incomincia con le traverse laterali
[2], i due servomotori a rotazione continua [5]
alluminio, quindi fortemente consigliato lutiliz-
ognuno mediante :n4 viti M3x8 [16], n4 dadi
zo dei DPI di protezione: per esempio occhiali
M3 [15] e n4 rondelle piane 3,2 [19].
protezione in policarbonato e guanti per manu-
tenzione, questi potranno essere trovati presso
la stessa Ferramenta dove troverete i profilati.

Si fisser quindi al telaio laterale completo di


servomotore la piastra di alluminio laterale [1]
utilizzando 3 viti lunghe M3x10 [19] e 4 dadi M3
[15].

Con questi attrezzi si costruiscono i seguenti


particolari:
[1] Piastre laterali - n 2 pezzi;
164} Speciale Arduino - PROGETTI
Speciale Arduino - PROGETTI {165

Per il fissaggio delle ruote motrici [9] al servomo- Si passer poi al fissaggio delle ruote folli ne-
tore, occorre allargare quattro fori presenti sulle cessarie per la guida del cingolo per ogni lato
squadrette che saranno state fornite con i servo- del robot.
motori [5], i fori dovranno essere pi piccoli della Sono necessarie una ruota grande [8], 3 medie
vite in modo che, quando saranno inserite le viti [7], n4 viti M3x25 [17] complete di dadi M3 [15]
queste possano fare presa. possibile eseguire e rondelle antisvitamento [21].
questi fori con una punta di trapano, oppure uti-
lizzando la lama di un cutter per ingrandire i fori
come mostrato nella figura.
Se si utilizza il cutter, assicurarsi di non ingran-
dire eccessivamente i fori, magari mediante la-
lesatura con il coltello sia sul lato superiore che
Si potranno unire le squadrette [9] al pignone
inferiore, in questo modo il foro sar pi omoge-
mediante le viti autofilettanti [18], quindi si fisse-
neo.
ranno le varie ruote folli.
166} Speciale Arduino - PROGETTI

Per il fissaggio delle ruote si proceder serrando terminer con il connettore polarizzato [25] che
il dado sulla ruota poi allentandolo di 1/4 o di andr poi inserito nella presa DC di Arduino.
1/3 di giro. Il gruppo ruota va collegato al telaio Si noti che il cavo positivo della batteria andr
con un dado e una rondella di bloccaggio allin- collegato al pin centrale del connettore polariz-
terno del telaio. Quando i due dadi su ciascu- zato.
na ruota sono serrati, controllare che ci sia un
piccolo spazio tra la ruota e il dado esterno per
consentire una facile rotazione, come mostrato
nella figura.

possibile montare adesso la piastra supporto


scheda [4] con n 4 viti M3x8 [16] su cui si fis-
seranno 4 distanziali esagonali L=10 mm [14]
fissati con 4 dadi M3 [15].
Il montaggio dei due cingoli [6] richiede 66 ma- La scheda Arduino UNO [12] sar fissata con n
glie per cui sono necessari: n1 pezzo da 30 4 viti M3x8 [16].
maglie, n2 pezzo da 10 maglie, n 2 pezzo da
8 maglie.

La mini breadboard [11] si fisser alla piastra

A questo punto i due cingoli potranno essere mediante la sua base autoadesiva.
installati sulle rispettive ruote, esercitando una Si passer quindi al cablaggio seguendo lo
leggera trazione sul cingolo stesso. schema riportato nel prossimo paragrafo.
necessario controllare che ogni ruota possa
girare senza sforzo e senza incepparsi.
Se dovessero bloccarsi, allentando il dado e ri-
montando per mantenere il piccolo spazio come
indicato precedentemente si risolver il proble-
ma. I due telai devono essere uniti con le tra-
verse [3] fissando il tutto mediante i 4 distanziali
esagonali L= 20 [13] e utilizzando 4 dati M3 [15]. Nella foto riportato lo schema di collegamento
Si fisser quindi il portabatteria [10] e linter- del modulo sensore [22], che prevede il contatto
ruttore [24] al telaio completando il cablaggio di alimentazione centrale, quello di GND sulla
mediante la morsettiera a mammut [23], il tutto sinistra e luscita del segnale sulla destra
Speciale Arduino - PROGETTI {167

Nel caso si preferisse lutilizzo del solo sensore


TSOP1836, occorrer modificare leggermente il
cablaggio in quanto, rispetto al modulo, il pin di
alimentazione a sinistra, il pin di massa al
centro e luscita del segnale a sinistra.

Nella foto riportato invece lo schema di colle- Libreria IRemote


gamento del semplice sensore, che possiede il Per la gestione del sensore IR occorre fare ri-
contatto di alimentazione sulla destra, quello di ferimento al lavoro fatto da Ken Shirriff per cui
GND al centro e luscita del segnale sulla sini- occorrer prima di tutto, scaricare lapposita li-
stra. breria.
Il primo programma da utilizzare quello neces-
Schema di collegamento sario per la verifica del funzionamento del sen-
Nella figura sotto riportata sono presenti i col- sore e per la determinazione del codice a cui
legamenti da eseguire: lalimentazione dei ser- sono associati i tasti del telecomando, quindi si
vomotori fornita dalle batterie derivate da Vin, caricher lo sketch IRrecvDemo che si trova tra
mentre il sensore e il led sono alimentati a +5V. gli esempi della libreria IRremote.
I segnali sono forniti/letti dai pin digitali 5 e 6 per Nel programma occorrer modificare il numero
i servomotori, 7 per il sensore, 13 per i led. della porta cui collegati il sensore:

int RECV_PIN = 7; Pin a cui collegato il


sensore

a questo punto attivando il monitor seriale,


si potr vedere il numero di codice del co-
mando inviato dal telecomando.
168} Speciale Arduino - PROGETTI

Comandi disponibili Comandi disponibili in Tra- gestione dei servomotori, questa gi disponi-
in Ricezione smissione bile in quanto tra le librerie standard dellIDE.

IRsend irsend; Per i comandi della libreria servo si potr far rife-
IRrecv irsend.sendNEC(IRcode, rimento allapposita sezione presente sul sito
numBits);
irrecv(receivePin) irsend.sendSony(IRcode, Arduino.
irrecv.enableIRIn() numBits);
Il programma prevede prima di tutto la configu-
irrecv. irsend.sendRC5(IRcode,
decode(&results) numBits); razione dei servomotori e linizializzazione del
irrecv.resume() irsend.sendRC6(IRcode, ricevitore IR.
numBits);
irrecv.blink13(true) irsend.sendR aw(raw buf, Nel loop viene letto il codice decodificato dal
rawlen, frequency);
sensore e in base al valore, attivata la relativa
routine di azionamento dei due servomotori.
Nota: non tutti i tipi di telecomando sono rico-
Per le varie assegnazioni di codici sar neces-
nosciuti dalla libreria, i modelli devono essere
sario modificare listruzione
conformi alla codifica: NEC, Sony, RC5, RC6.
if ( results.value == 0xA90 )
#include <IRremote.h>
int RECV_PIN = 7; Pin a cui collegato il sensore
e sostituire il valore A90, che corrisponde alla
IRrecv irrecv(RECV_PIN);
decode_results results; pressione del tasto STOP per il telecomando
void setup() utilizzato, quello del telecomando in vostro pos-
{
sesso.
Serial.begin(9600);
irrecv.enableIRIn(); // Start the receiver inoltre possibile inserire nuovi comandi sem-
} plicemente inserendo altre linee.
void loop() {
if (irrecv.decode(&results)) {
if ( results.value == 0xXXXX ){
Serial.println(results.value, HEX); NUOVA ROUTINE COMANDO();
irrecv.resume(); // Receive the next value }
}
}
NOTA:
possibile scaricare il progragramma gi mo- Per il suo funzionamento, la libreria IrRemote
dificato, presente negli allegati. utilizza un Timer sia per la trasmissione che per
la ricezione.
Il programma di gestione del Se si desidera utilizzare unaltra libreria che ri-
robot
chiede lo stesso Timer, necessario modificare
Una volta determinato a quali codici corrispon-
IRremoteInt.h per fare in modo che IrRemote
dono i tasti del proprio telecomando, si cariche-
utilizzi un timer differente.
r il programma di gestione che potrete trovare
negli allegati. Per questo motivo, per esempio, il comando
Il programma prevede lutilizzo, oltre che della Tone () per la creazione di suoni tramite buzzer,
libreria IRemote, anche la libreria Servo per la senza le opportune modifiche, non funzioner.
Speciale Arduino - PROGETTI {169

#include <Servo.h> // Caricamento libreria per la crazione degli


//oggetti Servo che generano segnali PWM
Servo leftDrive; // Creazione per controllo servomotore sinistro
Servo rightDrive; // Creazione per controllo servomotore destro

#include <IRremote.h> // Caricamento libreria per gestione sensore IR


int receiver = 7; // Definizione del pin a cui collegato il sensore IR
IRrecv irrecv(receiver); // Inizializzazione della libreria IRemote
decode_results results; // Decodifica del risultato che Arduino riceve dal sensore
// per ottenere un valore numerico utilizzabile nel confronto.
#define ledpin 13 // Definizione del pin a cui sono collegati i led di illuminazione

void setup()
{
leftDrive.attach(5); // attribuisce il servo sul pin 5 alloggetto servo
rightDrive.attach(6); // attribuisce il servo sul pin 6 alloggetto servo
pinMode(ledpin, OUTPUT); //Imposta il pin dei led come Output
irrecv.enableIRIn(); // si utilizza il metodo irrecv.enableIRIn(
// della libreria IRemote perch legga i valori provenienti dal sensore
Serial.begin(9600); // Imposta la velocit della seriale per controllo
}

void loop()
{
if (irrecv.decode(&results)) // stato ricevuto un segnale IR?
{
Serial.println(results.value, HEX); // Mostra eventualemnte sul monitor seriale
// il valore esadecimale ricevuto
irrecv.resume();// prosegue mettendo il sensore nuovamente in modalit di ascolto
}
if ( results.value == 0x810 ){
driveForward();
} // a seconda dei valori decodificati esegue una diversa routine

if ( results.value == 0x210 ){
driveBackward();
}
if ( results.value == 0xA90 ){
STOP();
}
if ( results.value == 0x410 ){
turnLeft();
}
if ( results.value == 0xA10){
turnBackLeft();
}
if ( results.value == 0x10 ){
turnRight();
}
if ( results.value == 0xC10 ){
turnBackRight();
170} Speciale Arduino - PROGETTI

}
if ( results.value == 0xE10 ){
digitalWrite(ledpin, HIGH);
} //Accende i led frontali
if ( results.value == 0x910 ){
digitalWrite(ledpin, LOW);
} //Spegne i led frontali
}
//Routine azionamento
void turnRight() //Il robot gira a destra
{
leftDrive.write(180);
rightDrive.write(180);
}
void turnBackRight() //Il robot indietro a destra
{
leftDrive.write(90);
rightDrive.write(0);
}
void turnLeft() //Il robot gira a sinistra
{
leftDrive.write(0);
rightDrive.write(0);
}
void turnBackLeft() //Il robot gira indietro a sinistra
{
leftDrive.write(180);
rightDrive.write(90);
}
void driveForward() //Il Robot va avanti
{
leftDrive.write(0);
rightDrive.write(180);
}
void driveBackward() //Il robot va indietro
{
leftDrive.write(180);
rightDrive.write(0);
}
void STOP()// Il robot si ferma
{
leftDrive.write(90);
rightDrive.write(90);
}
Speciale Arduino - PROGETTI {171

Filmato illustrativo
Il filmato mostra lutilizzo del robot.

https://watch/?v=YSH3z4BSsHU

Conclusioni
Abbiamo approfondito in questarticolo luso di
un sensore di raggi infrarossi per decodificare
gli impulsi forniti da un telecomando.
Si inoltre realizzato un robot, che potr essere
potenziato con altri sensori che potranno per-
mettergli, per esempio, di muoversi autonoma-
mente su terreno.
In rete potrete trovare innumerevoli esempi, ma-
gari con lutilizzo di sensori sonar, per cui lascia-
mo al lettore eventualmente proporre modifiche
e nuove implementazioni.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/telecomando-tv-comandare-robot-cingolato
172} Speciale Arduino - PROGETTI

G.F.A.rduino (Generatore di
Funzioni Arbitrarie con Arduino)
di Ernesto Sorrentino

CARATTERISTICHE tensioni sia per lo zero sia per il Vcc Max.

L
o scopo principale che mi sono imposto du-
rante la progettazione era di rendere questo
strumento un dispositivo di facile utilizzo,
eliminare tutti quei pulsanti per settare la forma
donda o per impostare il range della frequenza
e renderlo leggero per poterlo spostare como-
damente tra casa e lavoro; obiettivo centrato in
pieno utilizzando un Arduino UNO e un enco-
der rotativo. Tutti i comandi sono gestiti dalla
rotazione e dal pulsante dellencoder e per ren-
dere lutilizzo ancora pi pratico, le regolazioni e
le impostazioni sono visualizzate su un display I comandi dinput sono collegati direttamente
TFT a colori di Arduino. alla PORTA D dellAtmega.
Londa generata con una risoluzione di 100
parti, ci significa che il microcontrollore deve
generare almeno un ciclo di 100 impulsi per cre-
are unonda a 1 Hz, pertanto dato che il limite
di ON/OFF delle porte di Arduino 100 KHz
la frequenza massima dellonda sar di 1
Khz. Per aumentare il limite della frequenza ho
optato nella riduzione della risoluzione dellon-
da, realizzando unequazione capace di ridurre
https://www.youtube.com/watch?v=OYSejYt5OvU la risoluzione in modo automatico man mano
che incrementa la frequenza. Ho impostato
IL CIRCUITO ELETTRONICO come limite di Fmax a 5600 Hz perch ritenevo
Per la creazione della forma donda ho utilizza- che a tale frequenza londa fosse abbastanza
to un DAC tipo R2R ossia il TLC7524CN. Per accettabile ma possibile, cambiando unim-
non dilungarmi troppo rimando, per chi non co- postazione nello sketch, aumentare ancora
nosce la tecnica della conversione digitale/ana- la frequenza sempre per a discapito della
logico con scala R2R, a questarticolo di EOS. risoluzione.
Lintegrato TLC7524CN sostituisce la scala di Londa in uscita generata dal DAC sar amplifi-
resistenze ed possibile scegliere riferimenti di cata dalloperazionale (LM358) in configurazio-
Speciale Arduino - PROGETTI {173

ne non invertente con un rapporto fisso,


il trimmer R9 collegato al pin 2 uti-
lizzato per regolare la soglia massima
di amplificazione.

re (24V), per ottenere unampiezza del segnale


fino a 15V picco/picco. Per erogare una tensio-
ne di 24V e rendere il circuito portatile ho deciso
di utilizzare un DC-DC StepUp, anche questo
dispositivo alimentato da Arduino (5V) e gene-
ra una tensione in uscita regolabile fino a 30 V
con corrente max di 500 mA (soglia massima
di erogazione da Arduino). Un DC-DC StepUp
pu essere facilmente costruito con lintegrato
LM2755 come da schema seguente:
Tuttavia ho scelto una versione gi montata re-
peribile sulla rete a un prezzo modico.
Questa versione presenta un trimmer da 10 K
Si noti, dallo schema, che tutta lelettronica per regolare la tensione in uscita, una volta im-
alimentata da Arduino (5V) mentre tale lopera- postata la tensione a 24 V il trimmer non verr
zionale alimentato con una tensione maggio- pi utilizzato. Per variare lampiezza del segnale,
174} Speciale Arduino - PROGETTI

sione del segnale e correggerla col trim-


mer delloperazionale;
5. se londa presenta dei picchi superflui di-
minuire leggermente la tensione in uscita
del StepUp, invece se londa risulta taglia-
ta nellestremit aumentare leggermente
la tensione in uscita del StepUp.

invece, useremo il potenziometro da 10 K col- Regolazione ultimata.


legato al pin 1 del TLC7524CN, che regola il
livello MSB dei dati sulla scala R2R. Invece ELENCO MATERIALE UTILIZZATO
per il segnale TTL ho utilizzato un transistor 1 - Arduino UNO
BC547 pilotato dal DAC, una soluzione per otte- 1 - Arduino LCD TFT 1,77
nere un segnale ben squadrato e con ampiezza 1 - Encoder rotativo con pulsante
di 5 V. 1 - DAC TLC7524
2 - Amp OP LM358
1 - Rel due vie 5V
N - materiale vario come resistenze, condensa-
tori e transistor acquistabile presso conrad.it

IL PROGRAMMA
Il cuore del programma sta nellutilizzo della fun-
zione interrupt del Timer per pilotare i dati sulle
porte D dellAtmega collegato al TLC7524, per
questo progetto ho scelto il Timer1 per i suoi
16 bit. Linterrupt una routine di servizio (ISR
- Interrupt Service Routine) al di fuori del pro-
gramma originale che si avvia ad un specifico
REGOLAZIONI evento, in questo caso si avvia ogni volta che
Le regolazioni da compiere sono solo per lam- il contatore del Timer raggiunge una frequenza
plificazione del segnale, eseguire i seguenti stabilita. A ogni evento dinterrupt, lAtmega, in-
passi: via sulla PORTD 1 delle 100 parti per la creazio-
1. regolare il trimmer del DC-DC StepUp per ne dellonda. Il registro per assegnare il valore
ottenere una tensione a carico di 24V; da comparare al contatore del Timer lOCR1A
2. posizionare il trimmer delloperazionale a (relativo al Timer1).
met corsa; La formula di default :
3. avviare il generatore in modalit sinusoi-
dale; OCR1A = (16000000 / (prescaler * frequenza
4. con un oscilloscopio controllare la distor- desiderata di interrupt)) -1
Speciale Arduino - PROGETTI {175

dove 16000000 la frequenza di clock di Ardu- lizzato quattro liste, una per ogni tipo di forma
ino. In questo progetto invece la formula stata donda escluso il TTL.
impostata nel seguente modo:
byte sine[]= {127, 134, 142, 150, 158, ....};
OCR1A = (16000000 / (1 * (frequenza desiderata* byte triangle[] = {127, 132, 138, 143, .....};
100))-1 byte saw[] = {255, 252, 250, 247, 245,....};
byte squar[] = {255, 255, 255, 255, ........};

Si noti che il prescaler impostato a 1 e la


frequenza moltiplicata per 100 che sono le Ogni lista composta di 100 valori compresi tra
parti che compongono londa. Nello sketch ri- 0 e 255. Dove 0 corrisponde a 0 V in uscita del
sulta nel seguente modo:
DAC mentre 255 corrisponde a 5 V. possibile

OCR = (16000000/(Hz*K_Hz))-1; // riga creare una curva nuova rispettando per la con-
n164 dizione che lo zero del segnale corrisponda

Il valore di Hz letto dallencoder, la lettura a 127, ossia a circa 2.5 V; questo permetter
avviene grazie ad una libreria creata da Paul di ottenere un segnale, grazie al condensatore
Stoffregen. Questa libreria conteggia il valore di disaccoppiamento C2, in tensione duale.
di rotazione dellencoder in un contatore reso
consigliato sostituire la curva nuova con una di
disponibile sia per la lettura tramite il comando:
quelle gi presenti.

Encoder.read();
IMPOSTAZIONE UTENTE
sia per la scrittura, per impostare dei limiti, col Nello sketch ci sono alcune impostazioni che
comando: possono essere gestite dallutente per persona-
lizzare il progetto, come:
Encoder.write(valore);
user_Hz_min: si pu impostare il valore
minimo della frequenza da selezionare
Per approfondire, ecco alcuni dettagli.
con lencoder;
Dallo sketch si pu notare che il ciclo fondamen- user_Hz_max: si pu impostare la fre-
tale sono proprio queste due funzioni, la lettura quenza massima regolabile con lencoder.
dellencoder e il settaggio del registro OCR1A.
Di default impostata a 5600, pu essere
void loop() { aumentata ma a discapito della risoluzio-
encoder();
ne dellonda;
setting(Hz, K);
...} user_Hz_start: lutente pu impostare la
frequenza dinizio allavvio del program-
FORMA DONDA ma.
Per la generazione delle forme donda ho rea-
176} Speciale Arduino - PROGETTI

#define user_Hz_min 5 // Frequenza minima selezionabile


#define user_Hz_max 5600 // Frequenza massima selezionabile
#define user_Hz_start 100 // Frequenza iniziale dopo lavvio del programma
#define Vmax_out 9.7 // Tensione max in uscita dallampl. operazionale

REGOLAZIONI In questo men, oltre alla regolazione della fre-


Anche nel programma c una piccola imposta- quenza, si pu impostare il fattore di moltiplica-
zione da ultimare e riguarda la parte del Voltme- zione (1X, 10X o 100X).
tro. La lettura dellampiezza del segnale non 2 sezione : Scelta forma donda;
avviene direttamente alluscita dellamplificatore
operazionale LM358, una scelta fatta per evitare
distorsioni del segnale e componenti aggiuntivi
come inseguitori di tensioni. Ho preferito legge-
re la tensione al pin 1 del DAC che regola la
soglia MSB dei dati, ovvio che la lettura non
reale ma conoscendo la tensione massima in
uscita dellamplificatore operazionale possibi-
le regolare lo script per ottenere un risultato pre- In questa sezione si imposta la forma donda da
ciso da visualizzare sul display. Limpostazione generare.
va settata inserendo il valore della tensione 3 sezione: Gestione Duty-Cycle (solo per
massima, letta con un multimetro, in uscita TTL);
dallamplificatore LM358 selezionando lon-
da Quadra. Tale valore deve essere inse-
rito alla voce Vmax_out dellimpostazione
utente.

I COMANDI
Tutte le impostazioni sono state divise in tre
men visibili sul display in tre sezioni, nel se-
guente modo: In questultimo men si regola il duty-cycle e la
1 sezione: Gestione frequenza (impostazio- frequanza in contemporanea, valido solo per il
ne di default ); segnale TTL.
Per passare da una sezione allaltra bisogna
premere il pulsante dellencoder e tenerlo pre-
muto per almeno un secondo mentre per mo-
dificare la sezione scelta, bisogna premere una
sola volta il pulsante dellencoder. Tutte le scelte
sono selezionabili in ordine come descritto so-
pra e a ripetizioni in loop. Quando si passa da
Speciale Arduino - PROGETTI {177

una sezione allaltra il testo, della sezione scel-


ta, cambia colore in giallo per indicare la possi-
bilit di regolazione.

REALIZZAZIONE
Purtroppo per motivi di tempo non sono riuscito
a realizzare uno stampato ma lo schema sta-
to disegnato con Eagle per tanto chiunque pu
crearne uno con pochi e semplici passaggi. Tra
gli allegati sono presenti due librerie di Eagle,
uno per il modulo Arduino e laltro per lencoder
rotativo. Per chi volesse realizzare un PCB con-
siglio questa guida pubblicata su EOS.

PROSSIMAMENTE
Il progetto pu crescere e megliore, le idee per
evolverlo sono tante come realizzare un appli-
cazione con Processing per disegnare nuove
curve e caricarle sul SD, presente sulla board
del display, tramite la porta seriale di Arduino.

progetto in fase di lavorazione, disponibile al pi


presto nel prossimo articolo.

ALLEGATO
G_F_A_rduino (documentazione)

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/gfarduino-generatore-di-funzioni-arbitrarie-con-arduino
178} Speciale Arduino - PROGETTI

Arduino abbassa il volume degli


spot TV! [Fai-Da-Te]
di Piero Boccadoro

Introduzione principio di funzionamento semplicemente un

Q
ualche tempo fa, su queste pagine, pubbli- meccanismo a soglia che rilevi il volume attua-
cammo un articolo che parlava di una pos- le, lo compari con un valore di confronto ed agi-
sibile soluzione al problema degli spot tele- sca di conseguenza. Se siamo sopra la soglia
visivi dal volume decisamente troppo invadente. prestabilita di rumorosit accettabile, il sistema
La sua pubblicazione and ad aggiungersi alle deve inviare il comando per abbassare il volume
tante per le quali realizzammo il concorso Make- mentre in caso contrario per alzarlo.
4Cash. Ma anche senza cash, il progetto, alme- Nellimmagine di copertina, un test fatto sulla ri-
no il prototipo, ora completo. produzione di un file audio qualsiasi, per darve-
Le considerazioni preliminari da fare che danno ne una breve dimostrazione.
vita a questo progetto sono le stesse che ven- Tutto questo deve essere fatto mantenendo il
nero fatte proprio nellarticolo di presentazione dispositivo il pi vicino possibile alla cassa del
del concept: gli spot televisivi, ma spesso anche televisore. Una delle caratteristiche di questo
alcune porzioni dei film dazione, alcune scene, progetto proprio la sensibilit del microfono
sono davvero fastidiosi. Potrebbe essere utile che viene ottimizzata mantenendo il dispositivo
ed interessante realizzare un sistema che sia in non pi lontano di 5 cm dalla cassa. Sono sta-
grado di gestire in maniera intelligente queste te fatte diverse prove durante la realizzazione
situazioni, di fatto realizzando un equalizzazio- del progetto e vale la pena di anticipare adesso
ne con il volume che di solito viene considerato che, naturalmente, minore la distanza miglio-
accettabile ovvero quello del parlato o di scene re stato il risultato e la capacit del progetto
comunque non altrettanto movimentate oppure di seguire le variazioni e landamento del livello
appariscenti. del volume nel corso del tempo. Vi consigliamo,
E da queste idee e con queste premesse che pertanto, se sceglierete di provare a cimentar-
nasce il progetto che fu presentato allepoca e vi in questa sfida, di partire da queste distanze
che oggi completo funzionante. Ha subito al- cos come vi consigliamo di partire da questo
cune modifiche, stato rivisto e pesantemente hardware per poi modificarlo.
ottimizzato ed per questo che ora lo proponia-
mo. Cosa fare
Prima di poter partire con la realizzazione del
Come funziona codice ed il test necessario compiere alcuni
Il funzionamento di questo progetto abbastan- passi per ottimizzare i tempi. La prima cosa che
za semplice dal momento che dotato di un serve lacquisizione dei comandi. Come nel
microfono, un pulsante, due LED e poco pi. Il mio caso, il televisore non gestisce il protocollo
Speciale Arduino - PROGETTI {179

RC5 o RC6 e per questo motivo, dopo diverso mente servir unalimentazione dedicata e quin-
tempo, stato necessario pensare di ricostruire di una batteria.
la forma donda a mano.
Una volta fatto questo, che verr descritto pi Una volta che e stata realizzata la connessione
avanti, si passati alla realizzazione del circui- del microfono, serve subito lavorare sullaudio e
to partendo dallo schematico che vedrete tra un per fare questo stato usato un filtro in configu-
attimo. razione Sallen Key del secondordine. Utilizzere-
Scritto il programma, poi, tutto ha funzionato per mo delle immagini per farvi vedere come siamo
il meglio. andati avanti nella realizzazione ma in generale
Quindi per prima cosa bisogna studiare qual sappiate che quello che non trovate qui nellar-
lhardware di cui si ha bisogno, scrivere la BOM, ticolo esplicitamente riportato contenuto negli
stilare lo schematico, lavorare sui codici ad in- allegati che troverete pi avanti. In ogni caso,
frarosso, scrivere il programma ed effettuare i state tranquilli: la documentazione completa.
vari test. Dicevamo della sezione audio, la quale ci con-
Bene, ora che abbiamo le idee chiare su che duce direttamente ad uno degli ingressi di Ardu-
cosa dobbiamo fare, facciamolo! ino.

Lhardware
Non c progetto senza lhardware di riferimen-
to. Ed ecco che cosa vi occorre:
1 microfono Electret;
2 resistenze da 100 Ohm;
6 resistenze da 1 kOhm;
1 resistenza da 10 kOhm;
1 resistenza da 110 kOhm;
1 resistenza da 220 kOhm;
1 condensatore da 220 uF;
1 condensator3 da 4.7 nF;
3 condensatori da 10 nF;
1 LM324N (Quad OpAmp);
1 pulsante;
1 diodo LED IR;
1 ricevitore IR 38 kHz (TSOP2236);
1 Arduino;
fili vari.
Una piccola osservazione: lalimentazione per il Una volta fatto questo non abbiamo finito per-
funzionamento di questo progetto stata sem- ch bisogna creare circuiti di condizionamento
pre prelevata tramite lUSB del computer. Se per tutta la sezione che gestisce gli infrarossi.
dobbiamo pensare di renderlo autonomo, certa- Ed eccoli:
180} Speciale Arduino - PROGETTI

stato collegato

Una volta realizzate tutte queste connessioni e


alcuni dei risultati che abbiamo ottenuto utiliz-
zando loscilloscopio:

Loscilloscopio inizia a mostrare ben altre forme


donda, nel corso dei test e piano piano si distin-
gue sempre pi chiaramente ci che rumore
da ci che non lo :
Che, messo in pratica e realizzato, vien fuori
cos:

Nellimmagine che avete appena visto, stato


E non ancora tutto perch abbiamo detto che riportato laudio registrato dal microfono ascol-
abbiamo bisogno di un pulsante. Ecco come tando dei suoni.
Speciale Arduino - PROGETTI {181

Per iniziare i test, stato realizzato un semplice


filtro passa-basso (met del Sallen Key)

Bene, ora lhardware pronto.


Assemblato il prototipo, e verificato il funziona-
mento
Scopriamo i codici
Devo, per poter fare in modo che tutto funzio-

ni, scoprire come sono fatte le forme donda in

uscita dal telecomando in corrispondenza dei

due che dovr essere in grado di inviare cio

labbassamento e linnalzamento del volume.


realizzato il Sallen Key del secondo ordine
Per fare questo stato utilizzato il seguente co-
Il tutto stato assemblato opportunamente a
dare il prototipo completo. dice con cui programmare Arduino.
182} Speciale Arduino - PROGETTI

83B19366 (HEX),
#include <IRremote.h>
1000 0011 1011 0001 1001 0011 0110 0110 (BIN),
2209452902 (RAW)
int ricevitore = 10; // al pin 10 connesso il ricevi-
tore IR
IRrecv irrecv(receiver); // crea listanza irrecv
possibile che i codici ottenuti debbano essere
come da libreria
decode_results results; rivisti dal momento che la notazione esadecima-
le non va bene ed infatti sono stati riportati sia
void setup()
con la notazione esadecimale sia in binario sia
{
Serial.begin(9600); // Il debug dellapplicazione in formato grezzo.
vien fatto da seriale evidente che i dati raw servono a poco se non
irrecv.enableIRIn(); // Inizializza il ricevitore
esiste un metodo univoco per linterpretazione
pinMode(10, INPUT); // Il pin 10 serve come
input ma invece convertire in binario ha diversi van-
} taggi, non ultimo il fatto che sulloscilloscopio si
vedono i bit!
void loop()
{ Ecco per quale motivo stato importante cer-
if (irrecv.decode(&results)) // have we received an care un metodo per effettuare una conversione
IR signal? da esadecimale a binario e, tanto per utilizzare
{
Serial.println(results.value, HEX); // mostra il un esempio che noi abbiamo gi fatto eco un
codice sulla seriale in esadecimale paio di comandi in MATLAB che sicuramente vi
irrecv.resume(); // riceve il valore successivo faranno raggiungere lo scopo, se lo avete a di-
}
} sposizione.

bin_str = dec2bin(hex2dec(hex_str))
Questo corrisponde ad una configurazione mol-
to semplice in cui il ricevitore ad infrarossi col- se facessimo un esempio potremmo scrivere
legato direttamente da Arduino grazie allutilizzo
di semplici resistenze condensatori. hex_str = AF5
bin_str = dec2bin(hex2dec(hex_str))
bin_str = 101011110101
parlando dei codici che sono stati ricevuti, ec-
coli: Simpatico, non trovate?
vol +: Utilizzando la sonda delloscilloscopio sul
pin duscita stato possibile scoprire come-
68733A46 (HEX), rano fatte le forme donda.
0110 1000 0111 0011 0011 1010 0100 0110 (BIN),
1752382022 (RAW)
E qui cominciato il lavoro pi impegnativo, ov-
vero la ricostruzione delle stesse.
vol -: La libreria che stata impiegata, in mera teoria,
sarebbe stata capace di garantirmi lutilizzo di
Speciale Arduino - PROGETTI {183

Il codice
A questo punto tutto ci che manca la stesura
del codice, sapendo che per la lettura del livello
del volume sar sufficiente scrivere un comando
del tipo:

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

void loop() {
int livello = analogRead(A0);
Serial.println(livello); // Lavoro con i valori asso-
luti
float tensione = livello * (5.0 / 1023.0);
Serial.println(tensione); // Corrispondente livello
di tensione
delay(500);
}

e che poco altro sar davvero indispensabile


per la funzionalit completa del programma (lo
trovate in allegato).
Naturalmente il codice proposto certamente
perfettibile. Bisogna ottimizzarlo e sicuramen-
te indispensabile costruire le forme donda in
semplici vettori allinterno dei quali inserire i dati maniera diversa, lavorando con la libreria in ma-
corrispondenti ai bit ma con questa configura- niera tale da renderla compatibile con tanti for-
zione di dati grezzi non stato possibile. Lascio mati diversi, anche quelli non standard. In que-
ai lettori il compito di verificarne la funzionalit. sto modo la si pu universalizzare ed utilizzare
Per quanto riguarda il supporto, la libreria in in qualsiasi altro caso.
grado di gestire diversi protocolli di comunicazio- Vale la pena di osservare che la soglia di rumo-
ne tra cui quelli proprietari di aziende come NEC rosit viene impostata ad un valore compreso
e Panasonic ma anche RC5 ed RC6. Esistono fra 0 e 1023 dal momento che lADC disponibile
diverse funzioni definite allinterno della libreria su Arduino a 10 bit.
che permettono alla stessa di funzionare in ma-
niera egregia. Ci nondimeno, dal momento che Conclusioni
il televisore a disposizione rientrava in queste Bene,siamo in chiusura. Avete visto che tutto
casistiche, non ho potuto provarlo direttamente sommato stato abbastanza semplice realizza-
ma consiglio a voi di farlo. re questo progetto. Lo schema di funzionamen-
184} Speciale Arduino - PROGETTI

to piuttosto elementare, lhardware in gioco


non particolarmente costoso e le configurazio-
ni sono, tutto sommato, standard. La parte pi
interessante sulla quale lavorare stata lacqui-
sizione dei segnali, che ha portato via diverso
tempo dal momento che, nel mio caso specifico,
il protocollo si rivelato piuttosto particolare.
Ad ogni modo, esistono certamente diversi mar-
gini di miglioramento per questo progetto che
possono renderlo, in definitiva, molto pi com-
pleto.
Sono a disposizione nei commenti per ri-
spondere ad ogni eventuale domanda ed
eventualmente guidarvi nella realizzazione
di questo progetto.

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/arduino-abbassa-volume-degli-spot-tv-fai-da-te
Speciale Arduino - PROGETTI {185

Stazione Meteo Online con


Arduino di Giovanni Lorenzini

I
n commercio esistono molti dispositivi in grado - Temperatura
di acquisire (ma non sempre salvare) i valori - Umidit
climatici, ma spesso non posseggono i requisiti - Pressione atmosferica
dei quali necessitiamo, o in altri casi sono sem-
- Luminosit dellambiente
plicemente troppo costosi.
- Altezza della neve
Questo il primo motivo che mi ha spinto a rea-
lizzare la mia piccola stazione meteo.
Per chi non lo sapesse, Arduino una piatta-
Inoltre lidea di creare qualcosa di funzionale e
forma Hardware e Software con cui possibile
meravigliosamente versatile era troppo allettan-
te. imparare i principi fondamentali dellelettronica
e della programmazione.
I compiti principali che svolge questa stazione Questa fantastica board si basa su un circuito
meteo sono: stampato che integra un microcontrollore con
- Acquisire dati dai sensori pin connesso alle porte I/O, un regolatore di
- Preparare i dati per essere memorizzati tensione ed uninterfaccia USB che permette la
- Ogni tot secondi, memorizzare i dati su un ser-
comunicazione con il computer per la program-
ver online
mazione del microcontrollore.

I componenti necessari per realizzare questo


Arduino pu essere utilizzato per moltissimi pro-
progetto sono:
- Arduino (io ho utilizzato la board Arduino Uno, getti, come ad esempio costruire robot, rilevare

ma pu essere utilizzata qualsiasi altra piattafor- dati da sensori e svolgere delle azioni correlate,

ma basata su Arduino) gestire dei servo motori, e come direbbe Ivan


- Ethernet Shield Scordato, Lunico limite la propria fantasia.
- Sensore di temperatura e umidit DHT-22 Il sensore di temperatura DHT22 misura la tem-
- Sensore di pressione BMP085 peratura nel range -40 C - +80 C con un ac-
- Sensore di luminosit MF DIY LM358
curatezza di 0.5 C. Misura lumidit da 0% a
- Sensore ad ultrasuoni HC-SR04
100% con un accuratezza da 2% a 5%. un
- Cavetteria varia
sensore lento, che bisogna leggere massimo
ogni due secondi, ma da buoni risultati.
Quindi, i parametri che verranno gestiti sono:
186} Speciale Arduino - PROGETTI

Il sensore di pressione barometrica BMP085 Per interfacciarsi con Arduino baster utilizzare
permette di ottenere misurazioni nel range 300 i suoi 4 pin: VCC, GND, il pin Trig e il pin Echo.
- 1100hPa con unaccuratezza fino a 0.003hPa, Fornendo sul pin Trig un impulso positivo di cir-
basato sulla tecnologia piezo-resistiva che for- ca 10 uS il trasmettitore invier un segnale a ul-
nisce grande accuratezza, robustezza e stabilit trasuoni che dopo aver rimbalzato sulloggetto
nel tempo. Misura la temperatura ambientale, di in esame viene captato dal ricevitore.
cui far una media con la temperatura rilevata Invece sul pin Echo verr restituito un segna-
dal sensore DHT22 per ottenere una maggiore le logico alto con durata proporzionale alla di-
precisione. stanza.
Il sensore ad ultrasuoni HC-SR04 una scheda
compatta per la rilevazione di distanza misurata La formula con cui avviene il calcolo della di-
con il sistema a ultrasuoni. stanza : Distanza(cm)=Echo(us)/58
Funziona inviando un segnale ad ultrasuoni e Adesso vediamo come collegare tutti i compo-
aspettando il suo ritorno (che avviene se il rag- nenti ad Arduino:
gio ha rimbalzato su un ostacolo); a quel punto,
sar letto dallo stesso sensore. capace di leg- Il software che bisogna caricare su Arduino il
gere una distanza variabile dai 2 ai 400 cm, con seguente:
un margine di errore di 0,3 mm.
Speciale Arduino - PROGETTI {187

//Stazione Meteo con Arduino 12/2013


//Ivan Scordato e Giovanni Lorenzini

//dichiaro il pin di entrata del sensore di luminosit in una variabile


int pinfotoresistenza = A0;

//includo la libreria del sensore DHT22 di temperatura e umidit...


//...e dichiaro a che pin collegato
#include DHT.h
#define DHTPIN 2
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);

//includo le librerie wire e del sensore di temperatura e pressione BMP085


#include Wire.h
#include Adafruit_BMP085.h
Adafruit_BMP085 bmp;
//scl--> A5 sda-->A4

//dichiaro in due variabili i pin del sensore ad ultrasuoni HC-SR04 per misurare...
//...laltezza della neve
const int TRIG_PIN = 5;
const int ECHO_PIN = 6;

//includo le librerie della ethernet shield


#include
#include

//variabili per collegarsi a internet


byte mac[] = {
0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED};

IPAddress ip(192,168,50,100); //indirizzo IP disponibile sulla rete

IPAddress myDns(192,168,1,1); //tuo DNS

char server[] = www.fabbricaopensource.altervista.org; //sito web

EthernetClient client;

unsigned long lastConnectionTime = 0; //lultima volta che ti sei connesso...


//...al server in millisecondi
boolean lastConnected = false;
const unsigned long postingInterval = 60L*1000L; //la L necessaria per...
//...usare i numeri di tipo long

//dichiaro la stringa dove scrivo i dati per caricarli sul web


String strURL = ;

void setup()
{
188} Speciale Arduino - PROGETTI

//inizializzo i sensori sensori


dht.begin(); //inizializzo il sensore di umidit
bmp.begin(); //inizializzo il sensore di pressione
pinMode(TRIG_PIN, OUTPUT); //dichiaro come output il pin trig
pinMode(ECHO_PIN, INPUT); //dichiaro come input il pin echo

Serial.begin(9600); //stabilisco una connessione con il pc

delay(1000); //attendo un secondo

Ethernet.begin(mac, ip, myDns);

//invio al pc il mio IP
Serial.print(My IP address: );
Serial.println(Ethernet.localIP());

void loop()
{

if (client.available()) {
char c = client.read();
Serial.print(c);
}

if (!client.connected() && lastConnected) {


Serial.println();
Serial.println(Disconnessione...);
client.stop();
}

if(!client.connected() && (millis() - lastConnectionTime > postingInterval)) {


aggiornoDati(); //carico i dati sul server
}

lastConnected = client.connected();

//calcolo il punto di rugiada


double puntoDiRugiada(double temperatura, double umidita)
{
double a = 17.271;
double b = 237.7;
double temp = (a * temperatura) / (b + temperatura) + log(umidita/100);
double Td = (b * temp) / (a - temp);
return Td;
}

void aggiornoDati() //carico i dati sul server


{
//leggo la luminosit dal pin analogico A0
Speciale Arduino - PROGETTI {189

int luminosita = map(analogRead(pinfotoresistenza), 0, 1023, 0, 100); //eseguo un...


//...procedimento che riduce il range da 0-1023 a 0-100...
//...per esprimere la luminosit in percentuale

//leggo lumidit e la scrivo in una variabile


float umidita = dht.readHumidity();

//leggo la pressione e la scrivo in una variabile


float pressione = bmp.readPressure();

//leggo la temperatura da due sensori, faccio la media e la scrivo in una variabile


float temperatura = (bmp.readTemperature() + dht.readTemperature());
temperatura = (temperatura / 2.0);

//misuro laltezza della neve


float neve, durata; //dichiaro la variabile neve e la variabile durata
float cmPerMicrosecondi = 0.0331 + ( 0.000062 * temperatura); //calcolo i cm/ms...
//...del suono in base alla temperatura
digitalWrite(TRIG_PIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIG_PIN, HIGH);
delayMicroseconds(10); //faccio un impulso di dieci microsecondi sul pin trig
digitalWrite(TRIG_PIN, LOW);
durata = pulseIn(ECHO_PIN,HIGH); //mi metto in ascolto sul pin eco e calcolo la...
//...durata dellimpulso
neve = (durata*cmPerMicrosecondi/2.0); //calcolo la distanza con la formula...
//...durata*(cm/ms)/2, diviso due perch il suo va, rimbalza contro...
//...un oggetto e ritorna,...
//...quindi compie due volte il tragitto
float menoNeve = 200.0 - neve;

if (client.connect(server, 80))
{
Serial.println(Connessione...);

//creo lurl utilizzando una stringa


strURL =GET /meteo/salva.php?temp=; //url
strURL+=temperatura;
strURL+=&umi=;
strURL+=umidita;
strURL+=&pres=;
strURL+=pressione;
strURL+=&lum=;
strURL+=luminosita;
strURL+=&neve=;
strURL+=menoNeve;
strURL+=&rug=;
strURL+=puntoDiRugiada(temperatura, umidita);
strURL+= HTTP/1.1;

//invio la richiesta al server


190} Speciale Arduino - PROGETTI

client.println(strURL);
client.println(Host: www.fabbricaopensource.altervista.org); //sito web
client.println(User-Agent: arduino-ethernet);
client.println(Connection: close);
client.println();

lastConnectionTime = millis();

delay(1000);
Serial.println(strURL);
}
else
{
Serial.println(Errore Connessione);
Serial.println(Disconnessione...);
client.stop();
}
}

Per salvare i nostri dati su un database $database = database;


MySQL, abbiamo bisogno di un dominio e di $password = password;
$link = mysql_connect($host, $database, $pas-
un database.
sword);
I file che dovranno essere caricati sul server if (!$link) {
sono due: salva.php e visualizza.php. die(non connesso : . mysql_error());
}
Il primo file riceve i dati acquisiti da Arduino tra-
mite metodo GET, mentre laltro sar la pagina // effettuo la connessione al database mysql
dove possiamo vedere i dati che sono stati ac- $db_selected = mysql_select_db(NOME_DATA-
BASE, $link);
quisiti.
if (!$db_selected) {
Tutto il codice commentato e quindi (spero) di die (Non possibile connettersi al database : .
facile comprensione. mysql_error());
--- FILE salva.php }

PHP // seleziono la tabella nella quale memorizzare i dati


// dichiaro le variabili che ricevo da arduino $query = mysql_query(SELECT * FROM dati);
$temperatura = $_GET[temp]; $fetch = mysql_fetch_array($query);
$umidita = $_GET[umi]; // inserisco i valori
$pressione = $_GET[pres]; if (mysql_query(INSERT INTO
$luminosita = $_GET[lum]; //unite il codice tra i ...
$neve = $_GET[neve]; dati(temperatura,umidita,pressione,luminosita,...
$rugiada = $_GET[rug]; ...neve,rugiada,data)...
...VALUES($temperatura,$umidita,$pressione,...
$tmsp = strtotime(now); ...$luminosita,$neve,$rugiada,$data)...
$date = date(d m Y,$tmsp); ... )or die(mysql_error()))
{ // se tutto andato a buon fine...
// effettuo la connessione al mysql echo OK;
$host = host; }
Speciale Arduino - PROGETTI {191

else{
echo ERROR;

/PHP

--- FILE visualizza.php

PHP
// effettuo la connessione al mysql
$host = host;
$database = database;
$password = password;
$link = mysql_connect($host, $database, $password);
if (!$link) {
die(non connesso : . mysql_error());
}

// effettuo la connessione al database mysql


$db_selected = mysql_select_db(my_fabbricaopensource, $link);
if (!$db_selected) {
die (Non possibile connettersi al database : . mysql_error());
}
/PHP
//fate tasto destro ispezione elemento per vedere il codice della tabella

PHP
$query = mysql_query(SELECT * FROM dati);
while($row = mysql_fetch_array($query)){
$data = $row[data];
$temperatura = $row[temperatura];
$umidita = $row[umidita];
$luminosita= $row[luminosita];
$pressione = $row[pressione];
$neve = $row[neve];
$rugiada = $row[rugiada];

echo ;
}
/PHP

Data: Temperatura: Umidit: Luminosit Pressione: Altezza della neve: Punto di rugiada:
$data $temperatura $umidita $luminosita $pressione $neve $rugiada
192} Speciale Arduino - PROGETTI

Quello che stato appena presentato, il codi- LA VELOCIT DEL SUONO E LA TEM-
ce che dovr essere caricato sul server, mentre PERATURA
per creare la tabella nel database mysql po- In natura le onde possono essere di vario tipo:
tete utilizzare la seguente query: onde sismiche, elettromagnetiche, sonore, gra-
vitazionali. Le onde di per se non possono cre-
CREATE TABLE `NOME_DATABASE`.`meteo` ( arsi se non immerse in un mezzo il quale per-
`id` INT NOT NULL , mette loro di muoversi tramite forza elastica che
`temperatura` VARCHAR( 100 ) NOT NULL , scaturisce dalla deformazione del mezzo stes-
`umidita` VARCHAR( 100 ) NOT NULL , so (le onde elettromagnetiche e a livello teorico
`pressione` VARCHAR( 100 ) NOT NULL , quelle gravitazionali possono diffondersi anche
`luminosita` VARCHAR( 100 ) NOT NULL , nel vuoto). Per concretizzare quando detto fin
`neve` VARCHAR( 100 ) NOT NULL , qui, immaginiamo di lanciare un sasso in uno
`rugiada` VARCHAR( 100 ) NOT NULL , specchio dacqua. Il risultato noto a tutti: si
`data` DATE NOT NULL , verranno a formare delle circonferenze concen-
PRIMARY KEY ( `id` ) triche in costante allontanamento dal punto di
) ENGINE = MYISAM partenza. Il mezzo che permette alle onde di
formarsi proprio lacqua. Lo stesso discorso lo
Considerazioni e osservazioni possiamo fare per laria, quandessa viene col-
Di questa stazione meteorologica ne ho realiz- pita da una vibrazione emessa da una sorgente
zato due esemplari. sonora. Le caratteristiche classiche di un suono
Una lho posizionata presso la mia abitazione sono tre: intensit (energia dellonda), altezza
in montagna, mentre laltra stata impiantata (tonalit dellonda, anche chiamata frequenza o
da un mio amico in valle, dove abita. In questo armonica fondamentale) e il timbro (composizio-
modo ad entrambi possibile conoscere in tem- ne in termini di frequenze armoniche superiori
po reale i dati di due posti diversi. dellonda).
Quello che ho presentato il codice generico. Ma a che velocit si propaga unonda sonora
Infatti, nel caso in cui vogliate utilizzare pi di nei vari mezzi presenti in natura (noi terremo
una stazione meteo, dovrete modificare il codice presente laria, lacqua e lacciaio, che funge da
aggiungendo un valore identificativo, altrimenti i solido)?
dati che saranno salvati sul database verranno La velocit di propagazione di unonda sonora
confusi tra loro. dipende fondamentalmente dal mezzo che deve
Adesso, potrete leggere qu di seguito un pic- attraversare e non dalle caratteristiche del suo-
colo approfondimento sul Meteo di Sebastiano no. stato ormai dimostrato il fatto che la veloci-
Carpentari (il mio amico che possiede la secon- t delle onde aumenta allaumentare della tem-
da stazione meteo) peratura e della densit del mezzo e per quando
Speciale Arduino - PROGETTI {193

riguarda quelli presi in esame, essa : Umidit relativa: in meteorologia, lumidi-


t relativa ci indica in via percentuale la
MEZZO VELOCITA SPERIMENTALE quantit di vapore contenuta nellatmosfe-

ACQUA a 20C ra e viene definita come il rapporto tra la


1480 m/s
densit del vapore contenuto in atmosfera
ACCIAIO a 20C 5980 m/s
e la densit del vapore saturo alla tempe-
ratura della miscela. Lo strumento che la
Tabella 1 Velocit del suono in alcuni mezzi campione
rileva chiamato igrometro.

Ma concentriamoci un momento sulla velocit Pressione: per riassumere in breve il


delle onde sonore in base alla temperatura. Le- concetto di pressione atmosferica possia-
quazione che ci permette di venir a conoscenza mo dire che essa la pressione che vie-
della stessa , rispettivamente per laria e per ne esercitata dalla colonna daria su un
lacqua, la seguente: qualsiasi punto della superficie terrestre.
A livello del mare essa pari a 1013,25
mBar, cio 1Atm. Un accorgimento da te-
ner presente quando si parla di pressione
il fatto che essa varia con la quota e con

Dove per 0,6 e 4,2 si intende tasso di variazione le perturbazione dellequilibrio atmosfe-
della velocit con la temperatura (la sua unit di rico come le aree di bassa pressione (o
misura m/(s*K) . cicloni) oppure gli anticicloni.
Temperatura: essa il parametro meglio
ALCUNI PARAMETRI FONDAMENTALI
conosciuto dalla maggior parte delle per-
NELLA METEOROLOGIA
sone. La temperatura serve a descrivere
I parametri che concorrono a una buona previ-
sione meteorologica sono molti. Di seguito ne lo stato termico di un sistema e le unit
sono elencati solamente alcuni, rilevati anche di misura sono molte. Le pi usate sono:
dalla stazione meteo creata con Arduino: Kelvin, Celsius e Fahrenheit.
Punto di rugiada: questo parametro, co-
nosciuto anche come dew point, indica
Possibili modifiche e sviluppi futuri
la temperatura alla quale bisognerebbe
Quella che stata presentata in questo articolo,
portare una massa daria unitaria, a pres-
sione costante, affinch essa, raggiunga una versione base che pu essere usata in
la saturazione (100% umidit relativa). La molti contesti.
formula che ci permette di calcolarla la E possibile modificarla facilmente ed ampliare il
seguente: suo funzionamento.
Ad esempio, possibile aggiungere la memo-
rizzazione dei dati acquisiti su una memory card
194} Speciale Arduino - PROGETTI

micro sd (Lethernet shield gi predisposta)


affinch, nel caso in cui dovesse mancare la
connessione internet, automaticamente i dati
acquisiti vengono memorizzati sulla memoria
locale.
Sul sito si potrebbe inoltre creare un grafico che
mostra i dati che sono stati rilevati lultimo giorno
e quelli rilevati nellultimo mese.

Ringraziamenti
Voglio ringraziare Ivan Scordato che mi ha aiu-
tato a realizzare questo progetto, specialmen-
te nella parte del codice PHP e nella scrittura
dellarticolo stesso.

ALLEGATI
Stazione Meteo
Stazione Meteo con Arduino

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/stazione-meteo-online-con-arduino
Speciale Arduino - PROGETTI {195

Crepuscolare fai-da-te con


Arduino di Piero Boccadoro

C
ome tutti ormai ben sapete, e come molti di no dimostrazioni di progetti funzionanti... insom-
noi condividono, la filosofia dellopen source ma, mi ero documentato su quanto successo e
alla base di ogni mia considerazione e quali risultati arduino avesse ottenuto.
siccome sono affascinato dalla potenza e dal- Le informazioni raccolte avevano portato a far-
la bellezza del concetto stesso di condivisione mi unidea, poi confermata, che il modo giusto
mi sono affacciato, con grande entusiasmo, al per spiegare i che si tratta Arduino is not for
mondo di Arduino. quitters. Grandi potenzialit, dunque, ma, come
Un esame alluniversit ha rappresentato lo sti- ogni progetto Open Source, alta richiesta di im-
molo decisivo a fare lacquisto che, finora, si sta pegno da parte di chi lo usa... Come giusto
rivelando la spesa pi riuscita e stimolante che che sia!
io abbia fatto.
Per il momento, per, voglio descrivere ci che s
proposto come semplice obiettivo hobbistico,
ovvero creare un sensore di luminosit che
pilotasse, almeno in miniatura, un impianto
crepuscolare da semplice neofita.
Vi racconter, quindi, la genesi del progetto.
Lidea, quando ho deciso di fare lacquisto, era Appena collegato Arduino al pc, ho avuto il mio
quella di procurarmi loccorrente per completare primo problema: Arduino e il pc non comunica-
il dispositivo. no! Ho iniziato compilando e facendo lupload di
Lo Store di Arduino molto molto ben fornito e uno sketch predefinito, uno degli esempi precon-
tra le mille possibilit offerte, c lo Starter Kit, fezionati ma... Arduino si bloccava, il program-
un piccolo set di strumenti e dispositivi molto ma andava in crash e non ne venivo a capo. Mi
semplice in cui ci sono resistenze, condensatori, sono collegato sul sito ed ho capito immediata-
pulsanti vari e poi semplici fili, reostati... Insom- mente che il problema era relativo alluso delle
ma, un po di tutto. porte COM, alla politica di assegnazione degli
Una volta ricevuto il pacco, arrivato in tempi mol- slot e che Arduino andava in conflitto con il Blue-
to celeri, ho iniziato a provare e sperimentare. tooth del mio pc, il cui modulo di comunicazione
Avevo gi letto che i codici di Arduino si chiama- esterno e USB.
no sketch, che il linguaggio di programmazione Cos, una scheda di prototipazione esterna mi
era da imparare ex novo, che cera una grande ha insegnato che la gestione degli indirizzi di co-
community molto attiva, che cera tanto da po- municazione e dei protocolli non deve in alcun
ter imparare, che cerano tanti progetti gi svolti, modo essere lasciata nella manie del sistema
spiegati e commentati, che su you-tube si trova- operativo e che certe cose devo tenerle sotto
196} Speciale Arduino - PROGETTI

occhio io in prima persona. nettori delle linee digitali numeri 13, 12 e 11.
Appresa questa importante lezione, sono anda- Ciascuno dei led va connesso tra linea di riferi-
to avanti ed ho iniziato ad occuparmi di capire mento e GND.
come funzionassero gli ingressi, le uscite, lali- Ora veniamo al codice, vero cuore del crepu-
mentazione e dopo una ventina di minuti di stu- scolare. Lo sketch il seguente:
dio sulla scheda, ho iniziato a fare i collegamen-
ti per creare un semplice sensore di luce con // Sensore di luminosit versione con 3 LED
lLDR incluso nella scatola ed un LED. int ledPin1 = 13; // Dichiaro il LED sulluscita
Dopo aver creato il primo sketch e la prima con- digitale 13
figurazione funzionante, ho deciso di migliorare int ledPin2 = 12; // Dichiaro un secondo LED
questo prototipo ed ho immaginato un sensore sulluscita digitale 12
di luminosit con 3 gradi di sensibilit che ac- int ledPin3 = 11; // Dichiaro un terzo LED sullu-
cendesse altrettanti LED a seconda della luce scita digitale 11
presente. int sensore = 0; // Dichiaro lLRD su ingresso
Ed proprio questo progetto che ora descriver. analogico 0
Sulla board Arduino, ci sono due file di pin ai lati. int val; // dichiaro una variabile di appoggio
Guardando Arduino dal lato della porta USB, ci void setup()
sono sulla sinistra 13 ingressi digitali (che ge- {
neralmente vengono usati come uscite) e sulla Serial.begin(9600); //apro la porta seriale per
destra quelli analogiche (che di solito fungono mettere in comunicazione il circuito col pc Il
da ingressi). baudrate fisso a 9600 bits per secondo
Accanto ai pin analogici, poi, ce ne sono alcu- pinMode(ledPin1, OUTPUT); // imposto il LED1
ni contrassegnati come power, tra i quali c il come uscita
punto a 5V e GND. pinMode(ledPin2, OUTPUT); // imposto il LED2
come uscita
PER REALIZZARE IL CREPUSCOLA- pinMode(ledPin3, OUTPUT); // imposto il LED3
RE SI PROCEDA COME SEGUE: come uscita
- prendendo due fili e portando i 5V e GND su }
un pad della breadboard compresa nello starter void loop()
kit. (Il consiglio che do, quando si lavora su bre- {
adboard, di usare sempre le colonne + e - val = analogRead(sensore); // leggo i valori
per questo passaggio. Si arriva fin troppo presto associati al sensore
a scoprire che lordine fondamentale!!!) Serial.println(val); // scrivo i valori letti del sen-
- attaccando lLDR ai 5V e connettendo laltro sore nella variabile val
pin ad unaltra fila, che va allingresso A0. int range=val/4; // ricavo il valore di val modulo
- la resistenza va connessa tra il secondo pin 4
dellLDR e GND (per questa esperienza io ho delay(10); // effettuo la lettura ogni centesimo di
usato una resistenza da 22kOhm.) secondo
- ora vanno collegati i LED. Vengono usati i con- switch (range) {
Speciale Arduino - PROGETTI {197

case 0: // tutti i LED sono accesi => luminosit


nulla
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, HIGH);
break;
case 1: //due LED su 3 sono accesi => luce
scarsa
digitalWrite(ledPin1, HIGH);
digitalWrite(ledPin2, HIGH);
digitalWrite(ledPin3, LOW);
break;
case 2: //2 LED su 3 sono spenti => luce mode-
rata
digitalWrite(ledPin1, HIGH);
portanza ma se si utilizza la scheda per progetti
digitalWrite(ledPin2, LOW);
pi corposi anche questo aspetto va tenuto in
digitalWrite(ledPin3, LOW);
conto.
break;
case 3: //tutti i LED sono spenti => luce natura-
PROGETTO CREPUSCOLARE, IN
le
CONCLUSIONE:
digitalWrite(ledPin1, LOW);
Arduino una scheda semplice, efficiente, fun-
digitalWrite(ledPin2, LOW);
zionale e divertente. Rende lelettronica e la pro-
digitalWrite(ledPin3, LOW);
grammazione appetibili e fruibili anche a chi non
break;
ha competenze specifiche e la sua versatilit
}
garanzia di efficienza.
}
Il costo contenuto, la facilit di interfacciamento
e la variet delle applicazioni a cui pu esser ri-
Visto che il codice commentato, non ho molto
ferita, fanno di questa scheda un utilissimo sup-
altro da dire.
porto.
Solo un piccolo appunto: il controllo sullintensi-
t luminosa scandito ogni centesimo di secondo
non affatto necessario! Lo si pu comunque
fare ogni decimo di secondo. Questo diminuisce
la frequenza delle interrogazioni e libera il bus
di comunicazione. Ovvio che, in questa ap-
plicazione specifica questo non ha granch im-

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/crepuscolare-fai-da-te-con-arduino
198} Speciale Arduino - PROGETTI

Realizziamo una Smart Sveglia


Bluetooth con Arduino di Luigi DAcunto

P
remesso che la mission di questo articolo circuiti digitali che eseguono comandi a ritmo di
non la realizzazione di un prototipo di al- clock. Loscillatore che regola il tempo di esecu-
larme bluetooth, ma il proof of concept, con zione dei comandi macchina dei microcontrol-
cui spero di aprire la mente dei lettori, iniziamo lori spesso esterno per ragioni di stabilit e
a parlare di questo progetto entrando subito nel dimensioni ed in grado di scandire intervalli
vivo ed elencando i componenti utilizzati nella temporali dellordine dei nanosecondi con una
Smart Sveglia. eccellente risoluzione.
Tuttavia, in assenza di un riferimento temporale
COMPONENTI UTILIZZATI che leghi lintervallo temporale scandito dallo-
Arduino UNO; scillatore al tempo coordinato universale (UTC),
DS1302 (RTC); impossibile sfruttare un oscillatore come se
24LC256 (EEPROM); fosse un vero e proprio orologio.
CR2032 (BATTERIA 3V); In questo contesto il real-time clock trova la
HM-10 (MODULO BLUETOOTH LE); sua ragion dessere in quanto capace di portare
Display LCD 16x2; il tempo anche quando il dispositivo allinterno
Trimmer 10k; del quale integrato spento.
Quarzo 32.768 kHz; Tutto ci possibile sfruttando un doppio circu-
Buzzer x1; ito di alimentazione costituito dallalimentazione
Resistori: 2.2kOhm x1, 470Ohm x1, primaria e dalla batteria tampone in grado di
47Ohm x1; alimentare lintegrato, che consuma pochi nano-
LED x1; Watt, per diversi anni.
Solitamente la batteria tampone una
piccola cella al litio ma sistemi pi recenti
tendono ad utilizzare dei supercapacitori,
in quanto questi ultimi possono essere in-
tegrati nel processo di assemblaggio del
PCB. Il primo dispositivo commerciale do-
tato di RTC fu il PC/AT di IBM nel 1984
che adottava il chip MC146818 di Moto-
rola. Attualmente i chip pi utilizzati allo scopo
IL REAL TIME CLOCK tra gli hobbisti sono sicuramente i DS1302 e i
Ogni nostra azione quotidiana scandita dalli- DS1307 (in vendita su Conrad).
nesorabile incedere del tempo. Non un caso che questi microcontrollori richie-
Questa necessit si riflette allo stesso modo nei dano un quarzo esterno con frequenza di 32.768
Speciale Arduino - PROGETTI {199

kHz, che, essendo una potenza di 2 (2^15),


pi semplice da manipolare con dei contatori di- #include < DS1302.h >
gitali. #include < stdio.h >
Nella Smart Sveglia ho utilizzato un DS1302,
#define kCePin 5 // DS1302 - Chip Enable
gi dotato di quarzo da 32.768kHz e batteria al #define kIoPin 6 // DS1302 - Input/Output
litio CR2023 da 3V. #define kSclkPin 7 // DS1302 - Serial Clock
DS1302 rtc(kCePin, kIoPin, kSclkPin);

void printTime()
{
Time t = rtc.time();
char buf[50];
snprintf(buf, sizeof(buf), %04d-%02d-%02d
%02d:%02d:%02d,t.yr, t.mon,
t.date, t.hr, t.min, t.sec);
Serial.println(buf);
}

image credits: playzone.ch void setup()


{
Serial.begin(9600);
I pin digitali di Arduino 5, 6, 7 sono stati collegati rtc.writeProtect(false); //Abilita la scrittura sul chip
ai pin SLCK (Serial Clock), I/O e CE (Chip Ena- dando un
valore LOW al pin CE
ble) per implementare linterfaccia 3 Wire.
rtc.halt(false); // Mette in sleep in clock se posto a
TRUE
Time t(2014, 5, 5, 1, 38, 50, Time::kSunday);
rtc.time(t);
}

void loop()
{
printTime();
image credits: datasheets delay(1000);
}
Se non si utilizzano le linee digitali di Arduino,
gi dotate di resistori di pull-up, necessario ag- Con questo semplice sketch possibile setta-
giungerli in modo da preservare lintegrit della re lora e il giorno di riferimento per il DS1302,
trasmissione. monitorare il tempo e visualizzarlo ogni secondo
A questo punto, per testare il chip, stata utiliz- sulla porta seriale.

zata una libreria per Arduino aggiunta su GitHub


La chiave di volta di questo sketch sono le righe
da Matt Sparks che crea un oggetto DS1302 di
cui possono essere richiamati metodi di lettura
Time t(2014, 5, 5, 1, 38, 50, Time::kSunday);
o scrittura. rtc.time(t);
200} Speciale Arduino - PROGETTI

con le quali vengono imposta-


te ora e data corrente sullRTC.
Chiaramente questa operazio-
ne andrebbe eseguita una tan-
tum e non ogni qualvolta viene
programmato il microcontrollo-
re.
E pertanto opportuno imposta-
re un flag di controllo sul primo
utilizzo del controllore in cui impostare lorario
image credits: Microchip Datasheet
corrente sul DS1302.
Lorario attuale viene letto attraverso il metodo
Il chip in questione in grado di memorizzare
rtc.time() richiamato nella funzione printTime().
fino a 32 kBytes (64 volte in pi di quella in-
terna ad Arduino), ha tempi di latenza massimi
LA EEPROM
in scrittura pari a 5 ms (un dettaglio assoluta-
Per la realizzazione della Smart Sveglia una
mente non trascurabile) e la sua memoria di-
EEPROM esterna del tutto NON necessaria.
visa in pagine da 64 bytes ciascuna (ovvero
Se ne potrebbe tranquillamente fare a meno ed
con una gestione ottimizzata di codice e risorse
utilizzare quella interna ad Arduino che ha una
si potrebbe pensare di scrivere una intera pagi-
capacit di 512 bytes; tuttavia, ho ritenuto op-
na con un solo ciclo riducendo, cos, i tempi di
portuno utilizzarne una esterna per completezza
latenza).
di trattazione, in quanto la ridotta memoria pu
Il datasheet garantisce inoltre il componente per
risultare in un limite alle potenzialit della sve-
oltre un milione di cicli di scrittura e la corretta
glia, ad esempio se si vogliono memorizzare pi
conservazione dei dati per oltre 200 anni!
sveglie o informazioni.
Una EEPROM (Electrically Erasable Program-
mable Read Only Memory) una memoria di
tipo non volatile che pu essere scritta oppure
letta.
Solitamente, per la sua capacit ridotta, utiliz-
zata per memorizzare impostazioni di configura-
image credits: Microchip Datasheet
zione. E sconsigliato utilizzarla come se fosse
una RAM per via del limitato tempo di vita medio
Il protocollo per accedere alla EEPROM lI2C
legato al numero di cicli di scrittura (tipicamente
(Inter Integrated Circuit) supportato nativamente
100000).
da Arduino, che richiede soltanto 2 pin: SCL
Il componente che ho scelto per la Smart Sve-
(Serial Clock Line), poich un bus sincrono, e
glia il chip 24LC256 prodotto da Microchip,
SDA (Serial DAta line).
realizzato in tecnologia CMOS ed in vendita su
I pin A0, A1 e A2 servono ad impostare lindirizzo
Conrad.
Speciale Arduino - PROGETTI {201

#include < Wire.h >

void writeEEPROM(int deviceaddress, unsigned int eeaddress, byte data )


{
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.send(data);
Wire.endTransmission();
delay(5);
}

byte readEEPROM(int deviceaddress, unsigned int eeaddress )


{
byte rdata = 0xFF;
Wire.beginTransmission(deviceaddress);
Wire.send((int)(eeaddress >> 8)); // MSB
Wire.send((int)(eeaddress & 0xFF)); // LSB
Wire.endTransmission();
Wire.requestFrom(deviceaddress,1);
if (Wire.available()) rdata = Wire.receive();
return rdata;
}

del chip allinterno del bus. I pin SCL e SDA sono stati collegati ai pin ana-
LI2C infatti ha 7 bit di indirizzo e pu pertanto logici di Arduino 4 e 5, come suggerito dalla
supportare fino a 128 nodi. documentazione della libreria Wire.h di Arduino.
Vi sono, per, 16 indirizzi protetti e non acces- In questo modo si pu evitare di inserire resisto-
sibili, pertanto il numero massimo di dispositivi ri di pull-up poich gi presenti sulla linea ana-
che possono essere connessi sul bus di 112. logica di Arduino e abilitati attraverso la libreria
Tuttavia, il 24LC256 possiede soltanto 3 bit di suddetta. Uneccellente sketch per controllare
indirizzamento, infatti gli altri 4 bit (quelli pi la EEPROM si pu trovare sul forum di Ardui-
significativi) vengono considerati (di default) no utilizzando la libreria EEPROM.h, tuttavia ho
pari a 1010. Cos facendo, il numero massi- sfruttato un altro riferimento che utilizza la libre-
mo di EEPROM che possono essere aggiunte ria Wire.h.
al bus viene limitato a 2^3=8. Il pin WP (Write Attraverso queste due funzioni possibile leg-
Protection) se posto a valore logico alto, in que- gere o scrivere sulla EEPROM caratterizzata
sto caso Vcc, impedisce la scrittura, preservan- da un indirizzo I2C univoco deviceaddress un
do i dati precedentemente memorizzati, e, per- byte data nella locazione di memoria della EE-
tanto, nellesempio in questione stato posto a PROM eeaddress.
massa. Analogamente sono stati posti a massa E stato inserito un delay di 5ms nella funzio-
i pin A0, A1, A2, assegnando, cos, al chip indi- ne writeEEPROM poich questo il tempo di
rizzo 1010000 sul bus I2C. latenza massima garantito dal datasheet per la
202} Speciale Arduino - PROGETTI

scrittura in memoria. re pu variare tra 0 e 31999.


Con le funzioni writeEEPROM e readEEPROM
si pu salvare/leggere in memoria un singolo
#define eeprom1 0x50 //INDIRIZZO DEL
byte e questo sicuramente poco pratico per
24LC256
void setup(void) manipolare delle stringhe.
{ Si pu pensare allora di scrivere delle routine
Serial.begin(9600); per richiamare ciclicamente queste funzioni.
Wire.begin();
Quelle mostrate di seguito richiedono come
unsigned int address = 0;
writeEEPROM(eeprom1, address, A); parametri la dimensione delle aree di memoria
Serial.print(readEEPROM(eeprom1, address), da leggere (in numero di byte) e lindirizzo da
DEC); cui iniziare a leggere, oltre che quello della EE-
}
PROM sul bus I2C.

La routine writeEEPROMstring, tuttavia, non


ottimizzata per la scrittura in memoria a pagine
e pertanto il tempo di latenza per la scrittura
di una stringa pari a 5ms*lunghezza_stringa.

IL BLUETOOTH HM-10
Il modulo bluetooth HM-10, prodotto da JNHua-
Mao Technology Company, utilizza il chip di Te-
xas Instruments CC2540 e implementa lo stack
image credits: Microchip Datasheet protocollare del Bluetooth 4.0 Low Energy e,
pertanto, si sposa bene con lapplicazione da
Nel codice mostrato sopra, il codice HEX 0x50 Smart Sveglia per via del basso consumo ener-
getico.
corrisponde alla eeprom indirizzata con i bit A0,
A1, A2 a massa, infatti

1 0 1 0 A2 A1 A0
1 0 1 0 0 0 0

0*(2^0)+0*(2^1)+0*(2^2)+0*(2^3)+1*(2^4)+0*(
2^5)+1*(2^6)=16+64=80 in decimale che corri-
sponde a 50 in esadecimale.
A questo punto occorre definire anche lindiriz- Nonostante questo chip sia dotato di 34 pin, nel
zo della locazione di memoria (la variabile ad- corso di questarticolo mi concentrer soltanto
dress) in cui si vuole andare a scrivere il byte su quelli per il funzionamento minimale di questo
da salvare in memoria (in questo caso la lettera dispositivo, ovvero i pin di alimentazione, quelli
A). Chiaramente essendo la EEPROM in que- per lUART, il pin di RESET e quello per il LED
stione da 32K lindirizzo che possiamo sceglie- (utile in fase di debugging ma non necessario).
Speciale Arduino - PROGETTI {203

void writeEEPROMstring(int deviceAddress, unsigned int startingEepromAddress,


unsigned int memorySize,char *string)
{
for(int i=0;i < memorySize;i++)
writeEEPROM(deviceAddress,startingEepromAddress+i,string[i]);
}

String readEEPROMstring(int deviceAddress, unsigned int startingEepromAddress,


unsigned int memorySize)
{
char string[memorySize+1];
for(int i=0;i < memorySize;i++)
string[i]=charValue(readEEPROM(deviceAddress,startingEepromAddress+i));
}
string[memorySize]=\0;
return string;
}

char charValue(int integer)


{
return char(integer-0);
}

image credits: Microduino


204} Speciale Arduino - PROGETTI

Per lUART (Universal Asynchronous Receiver-


Transmitter) sono necessari, in questo esempio, RIALE EMULATA
soltanto i pin UART_TX e UART_RX, mentre i }
pin UART_CTS e UART_RTS possono essere void loop()
lasciati floating. {
Attenzione: lHM-10, a differenza del resto char buffer[100];
int k=0;
della circuiteria trattata in questo articolo, while (mySerial.available()){
DEVE essere alimentato a 3.3V. buffer[k]=mySerial.read();
In questo esempio ho collegato i pin 1 e 2 del- k++;
}
lHM-10 rispettivamente ai pin 10 e 11 di Ardu-
if(k!=0){
ino, ho omesso il condensatore anti-disturbi tra buffer[k]=\0;
alimentazione e massa, connesso il pin 24 a un }
Serial.print(buffer);
LED verde tramite un resistore da 47 Ohm e il
}
pin 23 alla tensione 3.3V di Arduino tramite
un resistore da 3.3 kOhm, con in parallelo un
interruttore di tipo Normally Open (NO). Con questo codice possibile stampare a video,
Una volta effettuate le connessioni, il LED lam- tramite la seriale, i dati che si ricevono sullUART
pegger in modo continuato, per evidenziare tramite la seriale emulata dai pin 10 e 11.

che la periferica HM-10 in modalit Adverti-


IL DISPLAY LCD 16X2
sing, fino a quando un Bluetooth Master non
Ogni sveglia che si rispetti, oltre a svolgere la
effettua laccoppiamento (pairing).
funzione di allarme, mostra allutente lorario,
A questo punto il LED manterr la sua luce fissa
per questo ho deciso di inserire un display LCD
per lintera durata della connessione al Master.
alfanumerico nel progetto.
Per implementare la UART mantenendo le fun-
Il display utilizzato diviso in 16 colonne e 2
zionalit della porta seriale per il debugging righe (16x2) ed basato sul noto controller HI-
consigliabile non utilizzare i pin 0 e 1 di Ardu- TACHI HD44780.
ino, ma la seriale emulata (in questo esempio Questo genere di display monta uninterfaccia di
dai pin 10 e 11) dalla libreria SoftwareSerial.h. comunicazione standard a 16 pin e pu essere
#include < SoftwareSerial.h > comandato sia in modalit 8 bit (utilizza 8 pin
per la comunicazione) sia 4 bit (utilizza 4 pin
#define kRxSwSer 10 // RX Software Serial - Blue- per la comunicazione ma pi lenta poich ogni
tooth Comm
messaggio diviso in due blocchi).
#define kTxSwSer 11 // TX Software Serial - Blue-
tooth Comm

SoftwareSerial mySerial(kRxSwSer, kTxSwSer);

void setup()
{
Serial.begin(9600); //INIZIALIZZO LA SERIALE
while(!Serial){;}
mySerial.begin(9600); //INIZIALIZZO LA SE- image credits: 3.bp
Speciale Arduino - PROGETTI {205

#include < LiquidCrystal.h >

#define kRSLCD 13//LCD RS


#define kELCD 12//LCD E
#define kD4LCD 9 //LCD D4
#define kD5LCD 8 //LCD D5
#define kD6LCD 3 //LCD D6
#define kD7LCD 2 //LCD D7

LiquidCrystal lcd(kRSLCD, kELCD, kD4LCD, kD5LCD, kD6LCD, kD7LCD);

void setup()
{
lcd.begin(16, 2);
delay(1000);
lcd.setCursor(0, 0);
lcd.print(EOS DISPLAY);
}

Seguendo le indicazioni riportate sul datasheet nazione del display si brucerebbe.


risulta davvero semplice connettere il display Questa realizzata in tecnologia LED e, pertan-
ad un microcontrollore, in particolare, nel caso to, fissa la tensione ai suoi capi, in questo caso
in esame, ho utilizzato la modalit di funziona- a 4.2 V.
mento a 4 bit, lasciando i pin D0, D1, D2, D3 Se Vcc=5V, allora, la corrente destinata alla re-
floating. troilluminazione, per la legge di Ohm, pari a
Il pin RW (Read Write) stato collegato a mas- (5-4.2)/470= 1.8 mA un valore sufficientemente
sa poich il display viene, in questo esempio, lontano da quello massimo tollerato dai LED, di
utilizzato soltanto in scrittura e non in lettura. certo poco accurato, ma rappresenta una solu-
I pin RS (Register Select) ed E (Enable) del di- zione precauzionale da attuare qualora non si
splay sono stati collegati rispettivamente ai pin possegga il datasheet dellLCD.
13 e 12 di Arduino. Il controller HD44780 richiede una inizializza-
I pin D4, D5, D6, D7 del display sono stati colle- zione abbastanza complessa con tempi di la-
gati rispettivamente ai pin 9, 8, 3, 2 di Arduino. tenza ben precisi, fortunatamente la libreria
Il pin Vo del display usato per la regolazione LiquidCrystal.h di Arduino svolge questo lavoro
del contrasto ed stato connesso al terminale per noi.
centrale di un trimmer da 10 kOhm posto tra
Vcc e GND. In questo esempio, dopo aver creato un ogget-
Infine, i pin A e K dellLCD, utilizzati per la re- to lcd della classe LiquidCrystal e averlo ini-
troilluminazione, sono stati connessi rispettiva- zializzato come un display con 16 colonne e 2
mente a Vcc tramite un resistore da 470 Ohm e righe, tramite il metodo lcd.begin(16, 2), pos-
a GND. sibile visualizzare il testo EOS DISPLAY.
Attenzione: Senza il resistore, la retroillumi- Il metodo richiamato nel codice setCursor(x,y)
206} Speciale Arduino - PROGETTI

//
// BTAlarmViewController.h
// coreBluetoothiPhone
//
// Created by Luigi DAcunto on 01/05/14.
// Copyright (c) 2014 Luigi DAcunto. All rights reserved.
//

#import < UIKit/UIKit.h >


#import < CoreBluetooth/CoreBluetooth.h >

@interface BTAlarmViewController : UIViewController


@property (weak, nonatomic) IBOutlet UIDatePicker *datePick;
@property (weak, nonatomic) IBOutlet UIButton *enableButton;
- (IBAction)enableAction:(id)sender;

@property (strong, nonatomic) CBCentralManager *myCentralManger;


@property (strong, nonatomic) CBPeripheral *myPeripheralBLE;
@property (strong, nonatomic) CBCharacteristic *myCharacteristic;
@property (strong,nonatomic) NSString *deviceType;
@end

prevede due parametri x e y che indicano rispet- zato per lHM-10.


tivamente la riga e la colonna del display a parti- Nello storyboard ho trasformato lunico ViewCon-
re dalle quali iniziare a scrivere il testo. troller finora presente nel rootViewController di
un NavigationController e aggiunto un segue
LAPP IOS con il nome BTAlarmViewController collegato al
Partendo dal precedente articolo sul Bluetooth pulsante SVEGLIA.
Low Energy e i dispositivi Apple, andiamo a mo- Ho inserito quindi da interfaccia grafica un og-
dificare il codice gi esistente, predisposto per getto UIDatePicker e un oggetto UIButton cui
il BC127, per connettere un iPhone al modulo ho associato il metodo enableAction nellhea-
HM-10. der di BTAlarmViewController riportato di se-
Nella classe BTViewController v fatta una pic- guito.
cola modifica poich la periferica HM-10 ha un
solo servizio con ununica caratteristica che, HEADER
a differenza del BC127, prevede una modali- Le propriet relative al Bluetooth vengono im-
t di scrittura senza risposta (CBCharacteri- portate dal ViewController trattato in preceden-
sticWriteWithoutResponse). za.
Pertanto andiamo a sostituire CBCharacte- Nel file di implementazione, invece, ho gestito la
risticWriteWithResponse con CBCharacteri- possibilit di abilitare/disabilitare lallarme lavo-
sticWriteWithoutResponse. rando sul toggle del tasto ENABLE.
Il codice Xcode allegato allarticolo gi ottimiz- Ho aggiunto, inoltre, alla stringa che viene invia-
Speciale Arduino - PROGETTI {207

ta dalliPhone un carattere di inizio (*) e fine (;) - (id)initWithNibName:(NSString *)nibNameOr-


comando per poter discriminare dalla periferica Nil bundle:(NSBundle *)nibBundleOrNil
bluetooth la lunghezza del messaggio in arrivo. {
self = [super initWithNibName:nibNameOrNil
bundle:nibBundleOrNil];
if (self) {

}
return self;
}

- (void)viewDidLoad
{
[super viewDidLoad];
Come evidenziato dal mokup la stringa viene
inviata allHM-10 soltanto se viene premuto il NSDate *currentTime = [NSDate date];
pulsante ENABLE/DISABLE che, oltre a con- NSDateFormatter *dateFormatter = [[NSDate-
Formatter alloc] init];
catenare le stringhe di data e ora in formato
[dateFormatter setDateFormat:@ddMMyyyy
yyyyMMddHHmm, aggiunge un flag booleano, hh:mm];
che indica se lallarme attivo o meno, e il pay- NSString *min = [dateFormatter stringFromDa-
load (*;). te: currentTime];

La stringa finale inviata dal telefono allHM-10 e, NSString *max = @22042024 12:00;
che dovr essere elaborata da Arduino, risulta NSDateFormatter *dateFormat = [[NSDateFor-
allora: matter alloc] init];
[dateFormat setDateFormat:@ddMMyyyy
hh:mm];
*yyyyMMddHHmmE; NSDate *datemin = [dateFormat
dateFromString:min];
IMPLEMENTATION NSDate *datemax = [dateFormat
dateFromString:max];
// self.datePick.maximumDate = datemax;
// BTAlarmViewController.m self.datePick.minimumDate = datemin;
// coreBluetoothiPhone }
//
// Created by Luigi DAcunto on 01/05/14. - (IBAction)enableAction:(id)sender {
// Copyright (c) 2014 Luigi DAcunto. All rights if([self.enableButton.titleLabel.text
reserved. isEqualToString:@ENABLE]){
// [self.enableButton setTitle:@DISABLE
forState:UIControlStateNormal];
#import BTAlarmViewController.h [self sendMessage:1];
}
@interface BTAlarmViewController () else if([self.enableButton.titleLabel.text
isEqualToString:@DISABLE]){
@end [self.enableButton setTitle:@ENABLE
forState:UIControlStateNormal];
@implementation BTAlarmViewController [self sendMessage:0];
}
208} Speciale Arduino - PROGETTI

}
-(void)sendMessage:(NSUInteger) enable{

NSDateFormatter *dateFormatter = [[NSDate-


Formatter alloc] init];
[dateFormatter
setDateFormat:@yyyyMMddHHmm];
NSString *dateString = [dateFormatter string-
FromDate: self.datePick.date];
NSString *stringSS = [NSString stringWithFor
mat:@*%@%d;,dateString,enable];
NSLog(@%@,stringSS); typedef struct
{
NSData* data = [stringSS dataUsingEncoding:N int year;
SUTF8StringEncoding]; int mon;
if([self.deviceType isEqualToString:@BC127]) int day;
{ int hh;
[self.myPeripheralBLE writeValue:data int mm;
forCharacteristic:self.myCharacteristic int ss;
type:CBCharacteristicWriteWithResponse]; boolean enabled;
NSLog(@Send String To BC127); } alarmType;
}
else if([self.deviceType
isEqualToString:@HM10]) che contiene le informazioni su un orario di allar-
{
[self.myPeripheralBLE writeValue:data me e un flag booleano che indica se la la sveglia
forCharacteristic:self.myCharacteristic stata abilitata o meno.
type:CBCharacteristicWriteWithoutResponse]; Definisco poi indirizzi e locazioni di memoria
NSLog(@Send String To HM10);
della EEPROM e inizializzo una variabile di tipo
}
} alarmType.
@end

//INDIRIZZI LOCAZIONI MEMORIA EEPROM


#define ADD_FIRSTTIME 0
LA SMART SVEGLIA #define ADD_DATE 1
Mettendo insieme i vari frammenti di codice (pi #define ADD_TIME 11
qualche funzione extra) e di hardware riportati in
//DIMENSIONI LOCAZIONI MEMORIA EE-
questo articolo e, aggiungendo un piccolo buz- PROM (aggiungere sempre +1!)
zer piezoelettrico tra il pin 4 di Arduino e GND, #define ADD_DATE_SIZE 11
si pu procedere alla realizzazione della Smart #define ADD_TIME_SIZE 9

Sveglia. #define kBuzzer 4 // BUZZER

Il codice che ho scritto prevede la creazione di alarmType alarm;


una struttura nominata alarmType
Speciale Arduino - PROGETTI {209

...... INSERIRE IN SETUP ......


pinMode(kBuzzer, OUTPUT);
digitalWrite(kBuzzer, LOW);

if(readEEPROM(EEPROM1, ADD_FIRSTTIME)==1){ //NOT FIRST TIME


Serial.print(Not First Time);
readAlarmFromEEPROM();
}
else{ //FIRST TIME
Serial.print( First Time);
writeEEPROM(EEPROM1, ADD_FIRSTTIME,1);
Time t(2014, 5, 1, 17, 56, 0, Time::kMonday);
rtc.time(t);
delay(200);
saveTestAlarmToEEPROM();
delay(200);
}
}
...... INSERIRE IN SETUP ......

void saveTestAlarmToEEPROM()
{
alarm.year = 2014;
alarm.mon = 4;
alarm.day = 30;
alarm.hh = 12;
alarm.mm = 46;
alarm.ss = 40;
alarm.enabled = 0;
alarmSet(alarm);
}

void alarmSet (alarmType al)


{
String dateString = int2string(al.year)+int2string(al.mon)+int2string(al.day);
String timeString = int2string(al.hh)+int2string(al.mm)+int2string(al.ss);

char date[40];
char time[40];

dateString.toCharArray(date,dateString.length()+1);
timeString.toCharArray(time,timeString.length()+1);

writeEEPROMstring(EEPROM1,ADD_DATE,ADD_DATE_SIZE,date);
writeEEPROMstring(EEPROM1,ADD_TIME,ADD_TIME_SIZE,time);
}

void readAlarmFromEEPROM ()
{
210} Speciale Arduino - PROGETTI

String time = readEEPROMstring(EEPROM1,ADD_TIME,ADD_TIME_SIZE);


String date = readEEPROMstring(EEPROM1,ADD_DATE,ADD_DATE_SIZE);

alarm.year = date.substring(0,4).toInt();
alarm.mon = date.substring(4,6).toInt();
alarm.day = date.substring(6,8).toInt();
alarm.hh = time.substring(0,2).toInt();
alarm.mm = time.substring(2,4).toInt();
alarm.ss = time.substring(4,6).toInt();
}

Nel blocco di setup viene controllato un flag to, questo viene scomposto in sottostrin-
memorizzato nella EEPROM nella locazione di ghe yyyy MM dd HH mm E dalla funzione
memoria ad indirizzo 0 (ADD_FIRSTTIME). executeCommand(char *cmd), che, convertite
Tale flag, se posto pari a 0, indica che quello in in interi, vanno a popolare la variabile globale
corso il primo utilizzo della EEPROM e, solo alarm.
in questo caso, si procede ad impostare lorario La struct alarm viene, al ciclo successivo, utilizzata
corrente sul RTC manualmente e, eventualmen- dalla funzione shouldPlayAnAlarm(alarmType
te, a salvare un allarme di test disabilitato sulla *alarm) che compara i suoi campi con data e
EEPROM. ora correnti lette dal RTC e, qualora risultassero
Viene inoltre impostato il pin relativo al Buzzer uguali e il flag alarm.enabled fosse pari a true,
come uscita, e posto a valore logico basso. comunicherebbe ad Arduino di attivare il Buz-
zer.
Nel Loop, invece, la
funzione sprtinf(cmd
Buffer,receiveComm
and(cmdBuffer)) inse-
risce, se presente, un
comando nellarray di
char cmdBuffer, una
volta privato del pay-
load dalla funzione
depackCmd(char*cmd).
Il comando, che non pre-
vede alcun tipo di ecce-
zione, atteso nel for-
mato specificato nellapp
iOS (yyyyMMddHHm-
mE).
Una volta ricevu-
Speciale Arduino - PROGETTI {211

void loop()
{
delay(1000);
if(shouldPlayAnAlarm(alarm)==true){
Serial.print(\nALARM!\n);
lcd.setCursor(0, 0);
lcd.print(ALARM!);
digitalWrite(kBuzzer, HIGH);
}
else{
digitalWrite(kBuzzer, LOW);
lcd.setCursor(0, 0);
lcd.print(printTime());
Serial.print(printTime());
}

char cmdBuffer[20];
sprintf(cmdBuffer,receiveCommand(cmdBuffer));
}

int shouldPlayAnAlarm(alarmType al)


{
Time t = rtc.time();
if(t.yr==al.year&&t.mon==al.mon&&t.date==al.day&&t.hr==al.hh&&t.min==al.mm)
if(al.enabled ==true)
return 1;
return 0;
}

void executeCommand(char *cmd)


{
char strTemp[20];
strTemp[0]=cmd[0];
strTemp[1]=cmd[1];
strTemp[2]=cmd[2];
strTemp[3]=cmd[3];
strTemp[4]=\0;
alarm.year = atoi(strTemp);
strTemp[0]=cmd[4];
strTemp[1]=cmd[5];
strTemp[2]=\0;
alarm.mon = atoi(strTemp);
strTemp[0]=cmd[6];
strTemp[1]=cmd[7];
strTemp[2]=\0;
alarm.day = atoi(strTemp);
strTemp[0]=cmd[8];
strTemp[1]=cmd[9];
strTemp[2]=\0;
212} Speciale Arduino - PROGETTI

alarm.hh = atoi(strTemp);
strTemp[0]=cmd[10];
strTemp[1]=cmd[11];
strTemp[2]=\0;
alarm.mm = atoi(strTemp);
strTemp[0]=cmd[12];
strTemp[1]=\0;
if(atoi(strTemp)==1)
alarm.enabled=1;
else
alarm.enabled=0;

}
char* receiveCommand(char *buffer)
{
int k=0;
while (mySerial.available()){
buffer[k]=mySerial.read();
k++;
}
if(k!=0)
{
buffer[k]=\0;
executeCommand(depackCmd(buffer));
return OK;
}
else
return NULL;
}

char* depackCmd(char* cmd)


{
char strTemp[20];
int k=1,endFound=0;
for(int i=0;i if(cmd[i]==*){
k--;
}
else{
strTemp[k]=cmd[i];
if(strTemp[k]==;){
strTemp[k]=\0;
endFound=1;
break;
}
k++;
}
}
if(endFound==0)
Serial.print(Missing End);
return strTemp;
}
Speciale Arduino - PROGETTI {213

CONCLUSIONI
Abbiamo realizzato insieme una Smart Sveglia
programmabile da remoto tramite Bluetooth
Low Energy da Smartphone iOS. Lo scopo di
questo piccolo progetto non quello di realizza-
re un prodotto finito e funzionante bens di aprire
la mente ai lettori riguardo potenzialit e proble-
matiche legate alla scrittura su una EEPROM e
alle esigenze di sincronizzazione tra orario UTC
e Arduino.

https://www.youtube.com/watch?v=842gnyS4QTU

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/realizziamo-smart-sveglia-bluetooth-con-arduino
214} Speciale Arduino - PROGETTI

Costruiamo un Voice Shield per


far parlare Arduino [Progetto
Completo Open Source] di adrirobot

I
l progetto proposto permette di dare la paro- mite le quattro linee RX, TX, Busy, Reset.
la ad Arduino; sar cos facile, per
esempio, sentire il valore letto tra-
mite una porta analogica attraverso
laltoparlante connesso alla scheda.
Il tutto possibile utilizzando uno
speciale shield su cui installato un
modulo sonoro LPM11162 con cui
possibile memorizzare e riprodurre file
audio in formato wave. Lo shield misu-
ra 43x59 mm e, su di esso, sono pre-
senti uno stadio alimentatore, uninterfaccia per Per maggiori informazioni e per lacquisto del
ladattamento delle tensioni di comunicazione modulo vedere il sito del produttore LP Elettro-
tra il processore Arduino e il modulo LPM11162, nica
uno stadio amplificatore e, infine, una sezione
sensori e una di I/O. DESCRIZIONE DEL CIRCUITO
Per la descrizione del circuito partiamo dallo
SCHEMA ELETTRICO stadio di alimentazione del modulo LPM11162
Cuore dello shield il Modulo LPM1162, che si che necessita della tensione di 3,3 V, senza uti-
presenta come un piccolo circuito (28x20 mm) lizzare quella fornita da Arduino.
dotato di due file da sei pin. Sul modulo sono Nel nostro caso, si utilizza la tensione derivata
presenti pochi componenti tra cui il processo- da quella a +5V che ridotta utilizzando un clas-
re, un PIC32MX320F, e una memoria flash da sico regolatore LM317LZ (corrente massima
2Mbyte che permette di memorizzare un mas- fornita 100mA), il valore della tensione impo-
simo di 95 secondi di registrazione in formato stato tramite le due resistenze da 240 e 390.
wave 11 KHz-16bit mono (tempo massimo per Dato che il modulo LPM11162 funziona con una
tutti i file), mentre il numero massimo di file tensione di alimentazione di +3,3 V, anche le
di 512 e non c limitazione alle dimensioni di comunicazioni seriali e i segnali di reset e busy
ciascun file. sono e devono essere a questa tensione. Visto
che Arduino ha una logica a +5V, necessario
Per gestire il modulo sono necessari pochi e adattare i livelli uscenti ed entranti dal modulo.
semplici comandi seriali che vengono inviati tra- Per quelli entranti (RX - Reset), sufficiente un
Speciale Arduino - PROGETTI {215

partitore resistivo 10K/15K che adatta la tensio- Il condensatore, infatti, influisce su questo valo-
ne duscita 5 V di Arduino ai 3,3 V con cui il mo- re dal momento che esso funge da bypass per
dulo LPM11162 alimentato. Per quelli uscenti, il resistore e la componente resistiva in gioco
si sono utilizzati due transistor BC337 che tra- quella della impedenza complessa che varia
slano il livello duscita 3,3 V del modulo audio ai come 1/C.
5 V di Arduino. La regolazione del volume ottenuta con il trim-
Per amplificare il segnale audio analogico in mer RV1 da 10 kOhm, il condensatore da 47 nF e
uscita dal pin 9 del modulo LPM11162, utiliz- la resistenza da 10 in serie sulluscita dellam-
zato un integrato amplificatore, in questo caso plificatore, sono necessari per rendere stabile
un LM386. Questo circuito integrato che si pre- lamplificatore come indicato nel Datasheet. In
senta in un contenitore plastico ad 8 pin (DIP8), serie allaltoparlante presente il condensatore
molto diffuso perch con pochi componenti di disaccoppiamento C9 che costituisce un bloc-
esterni in grado di pilotare direttamente un co per la componente in continua evitando che
piccolo altoparlante: con 5 V di alimentazione la medesima venga inviata allaltoparlante.
riesce a fornire una potenza di circa 300 mW su Per il collegamento dei sensori sono presenti
un altoparlante da 8 Ohm. Per quanto riguarda due connettori, X1 connesso allingresso Analo-
il guadagno, questo impostato a 200 tramite gico A0, e X2 connesso allingresso A3.
il condensatore C6 da 10 F connesso ai pin 1 Abbiamo poi altre due possibilit di interagire
ed 8. con la scheda, rappresentati da un pulsante
216} Speciale Arduino - PROGETTI

connesso alla porta digitale D7 e da un led do- a 5 volt, in un valore digitale. Ruotando lalbero
tato di resistenza limitatrice connesso alla porta del potenziometro, si cambia la quantit di re-
digitale D6. sistenza su entrambi i lati del pin centrale del
potenziometro. Questo cambia la resistenza re-
CONNETTORI PER SENSORI
lativa tra il pin centrale e i pin esterni, dando una
Ai connettori X1 e X2, possibile collegare sen-
tensione diversa allingresso analogico. Quando
sori con uscita analogica come un sensore di
lalbero girato completamente in una direzio-
temperatura LM35; questo si presenta con tre
terminali: uno per lalimentazione, uno di massa ne, non vi resistenza tra il pin centrale e il pin

e uno per luscita della tensione proporzionale collegato a GND. La tensione al pin centrale
alla temperatura rilevata che pari a 10 mV per quindi 0 volt. Quando lalbero girato tutto nella
ogni grado centigrado, ed calibrato in gradi direzione opposta, non vi resistenza tra il pin
Celsius. Per trasformare la tensione letta si pu centrale e il pin collegato a +5 volt. La tensione
utilizzare la formula: al pin centrale quindi di 5 volt. Perci analo-
gRead() restituir un numero tra 0 e 1023 che
temp = (5.0 * analogRead(tempPin) * 100.0) /
proporzionale alla quantit di tensione applicata
1024
al pin analogico.

Si consideri che, con un campionamento a 10


bit, Arduino ha una risoluzione in tensione di cir- CIRCUITO STAMPATO
ca 5 mV, e considerando che LM35 fornisce 10
mV per ogni grado centigrado, la massima pre-
cisione che si pu ottenere, di mezzo grado.
Altro tipo di dispositivo collegabile al connettore
un potenziometro; si possono utilizzare indif-
ferentemente i potenziometri in contenitore rota-
tivo o lineare.

Limmagine vista riporta la traccia del circuito


stampato, questo del tipo monofaccia e sono
previsti solamente tre ponticelli.

Anche in questo caso per la lettura della por- Piano di montaggio


ta analogica, si user il comando analogRe- Di seguito invece visibile limmagine del piano
ad() che converte la tensione dingresso da 0 di montaggio.
Speciale Arduino - PROGETTI {217

di dimensioni 43x59 mm, il metodo potr esse-


re quello della fotoincisione o del trasferimento
termico utilizzando i cosiddetti fogli blu (PRESS-
N-PELL), in questo caso ricordo che limmagine
delle tracce del circuito dovr essere speculare.
Una volta inciso il rame, si verificher in contro-
luce o mediante lutilizzo di un multimetro, che
non vi siano cortocircuiti soprattutto tra le piste
pi vicine. Si passer quindi alla foratura della
stessa, utilizzando principalmente una punta da
0,8 mm, mentre, se ne utilizzer una da 1 mm
per le pin strip. In seguito, si potr passare al
LISTA PARTI posizionamento e alla saldatura dei componen-
ti seguendo lo schema di
montaggio visto prima.
Per la saldatura, si utiliz-
zer un piccolo saldatore
a punta fine, della potenza
di circa 25 30 W. Sinizie-
r dai vari ponticelli, conti-
nuando con le resistenze;
si potr, quindi, procedere
con il pulsante, lo zoccolo
dellintegrato, i condensa-
tori. Si concluder con le
pin strip e i connettori.
Terminata la saldatu-
ra, si potranno inserire
gli integrati IC2 (Modulo
LPM1162) e IC3 (LM386) nellapposito zoccolo
REALIZZAZIONE PRATICA facendo attenzione alla tacca di riferimento.
Per la costruzione della scheda, si proceder ini-
ziando dalla realizzazione del circuito stampato, SENSORI
la traccia scaricabile in scala 1:1 mediante il Come detto sopra, alla scheda possono essere
link (in fondo allarticolo). connessi vari sensori, la cui uscita sia analogica
Occorre ricordare che la stampa dovr essere con un range di tensione compreso tra 0 e +5V.
fatta deselezionando la funzione che adatta il Nella figura sotto, sono visibili due esempi: un
foglio alla pagina. Per la sua realizzazione, si potenziometro (utilizzato poi nel test) e un sen-
utilizzer una basetta in vetronite (monofaccia) sore di temperatura LM35.
218} Speciale Arduino - PROGETTI

Firmware.

Per la programmazione tramite la sche-


da Arduino, disponibile la modalit
Bridge: Arduino diventa programma-
tore per il modulo audio LPM11162 e
non sono necessari dispositivi esterni.
Quindi il modulo LPM11162 collegato
ad Arduino che a sua volta collegato
al PC tramite una COM virtuale (con-
nessione USB).

PROGRAMMA TOOLKIT
Per trasferire i file wav nella memoria del mo-
dulo LPM11162, disponibile presso il sito del
produttore, uno speciale programma chiamato
LPM11162 ToolKit; con questapplicazione per
PC luso del modulo diventa semplice.

Con questo programma possibile:


Convertire i file wave nel formato mono-
11KHz-16bit.
Programmare i file wave sul LPM11162
Riprodurre i file wave programmati con re- LIBRERIA ARDUINO
golazione del volume. Per la gestione del modulo, disponibile, sem-

Verificare la versione di firmware dei mo- pre presso il sito del produttore, la LPM11162

duli LPM11162. Arduino Library che una libreria open-source

Aggiornare il firmware allultima versione per il controllo dei moduli audio LPM11162 con
Arduino.
Speciale Arduino - PROGETTI {219

La libreria fornisce alcune semplici funzioni e Pilota direttamente il pin /RESET del modulo
invia comandi seriali al modulo audio per ripro- LPM11162.
durre i file programmati. Sono disponibili le se-
guenti funzioni: synch()

begin(baudrate) Verifica la presenza del collegamento con il To-


olkit per la programmazione dei file WAV sul mo-
Configura la libreria e lhardware per comunica- dulo LPM11162.
re con il modulo audio LPM11162 con il baudra-
te selezionato, tipicamente 9600. bridge()

end() Con questa funzione la libreria Arduino entra in


modalit Bridge.
Allopposto di begin() rilascia interamente le ri-
sorse hardware e software impegnate per la co- PROGRAMMA PER CREAZIONE FILE
municazione con il modulo audio LPM11162. WAV
Se, oltre ai numeri e alle parole presenti nel pro-
play(fileName) gramma demo, si vogliono registrare altri nume-
ri o parole da pronunciare, si pu utilizzare un
Inizia la riproduzione del file WAV il cui nome qualsiasi programma di registrazione audio, ma
specificato come parametro della funzione. utilizzando un programma di TTS cio Text To
Speech tutto si semplifica poich sufficiente
stop() scrivere quello che vogliamo far pronunciare e
il programma, utilizzando la sintesi vocale che
Interrompe la riproduzione del file WAV che in la tecnica per la riproduzione artificiale della
corso. voce umana, creer per voi il file che potr esse-
re salvato in formato wav. Quello che consiglio
volume(volume) si chiama DSpeech stato scritto da Dimitrios
Coutsoumbas (Dimio). Il programma che tra lal-
Regola il livello del volume di riproduzione audio tro freeware, oltre alle funzioni TTS, possiede
passando un numero tra 0 e 100 come parame- le funzionalit di ASR (Automatic Speech Re-
tro per indicare il volume. cognition) integrate. E cio, in grado di leggere
ad alta voce il testo scritto e di scegliere le frasi
isBusy() da pronunciare a seconda delle risposte vocali
dellutente.
Legge lo stato del pin /BUSY del modulo Non ha bisogno di essere installato e occupa
LPM11162. Questa informazione utile per sa- poca memoria. Permette di salvare loutput sot-
pere se la riproduzione di un file WAV ancora to forma di un file Wav, Mp3, Aac, Wma o Ogg.
in corso.
reset(resetLevel) Per scaricarlo e per le istruzioni di come instal-
larlo vedere il seguente link.
220} Speciale Arduino - PROGETTI

PROGRAMMA DI PROVA
Segue un esempio di programma, in questo
caso letto il valore di tensione variato trami-
te un potenziometro collegato al connettore X2.
Il valore di tensione poi pronunciato tramite
laltoparlante connesso alluscita. La procedura
di caricamento la seguente.
Lanciare lIDE e trasferire il programma nella
https://www.youtube.com/watch?v=iDwIAd46qlI
memoria di Arduino. A caricamento termina-
to, lanciare il programma ToolKit e utilizzando #include <SoftwareSerial.h>
la funzione bridge trasferire nella memoria del
#include <LPM11162.h>
modulo LPM11162 i file wav presenti nel file zip
allegato a questarticolo, essi sono riferiti ai nu- #define LPM11162_RX 3 //Arduino TX (out)
meri, la parola punto e volt. Sconnettere il
#define LPM11162_TX 4 //Arduino RX (in)
programma toolkit e resettare la scheda Ardu-
ino. A questo punto ruotando lalberino del po- #define LPM11162_RESET 2 //(out)

tenziometro, si udr dallaltoparlante il valore di #define LPM11162_BUSY 5 //(in)


tensione letta
Speciale Arduino - PROGETTI {221

#define pin_tensione A3 // Pin analogico lettura


}

LPM11162 audio(LPM11162_RX, LPM11162_


TX, LPM11162_RESET, LPM11162_BUSY); void SayVolts(int volts)

int pinval = 0; {

int oldpinval =0; int BigNumber = 0;

int SmallNumber = 0;
void setup()

{ BigNumber = abs(volts/204); // Converte il


valore analogico in tensione
Serial.begin(9600);
Serial.println (BigNumber);
if ( audio.synch() )
SmallNumber = volts - abs(BigNumber*204); //
{ Converte i decimali ad una sola cifra

audio.bridge(); SmallNumber = abs(204-SmallNumber)/2;

} SmallNumber = abs(100-SmallNumber)/10;

audio.begin(9600); Serial.println (SmallNumber);

} if (BigNumber != 0)

{
void loop()
String intero= String (String (BigNumber) +
{ .wav);

pinval = analogRead(pin_tensione); // Legge il char frase_array[20];


pin analogico
intero.toCharArray( frase_array, sizeof(frase_
if(pinval != oldpinval) array) );

{ audio.play(frase_array);

oldpinval = pinval; while( audio.isBusy() );

SayVolts(pinval); // Converte in una tensione delay (1000);


e dice il valore
}
}
audio.play(punto.wav); // Dice punto
delay (2000);
222} Speciale Arduino - PROGETTI

Schema elettrico PDF


while( audio.isBusy() ); Layout PDF
Circuito stampato PDF
delay (1000);
Schema elettrico e layout sorgente EA-
GLE
String decimale = String (String (SmallNumber) Sketch per Arduino
+ .wav);
File wav da memorizzare sul Modulo
char frase_array[20]; LPM11162.

decimale.toCharArray( frase_array, sizeof(frase_


array) );

audio.play(frase_array);

while( audio.isBusy() );

delay (1000);

audio.play(volt.wav); // Dice volt

while( audio.isBusy() );

delay (1000);

CONCLUSIONI
Il programma presentato molto semplice, ma
possibile crearne altri, per esempio uno che leg-
gendo la tensione in uscita dal sensore di LM35,
converte il valore letto e fa pronunciare questul-
timo tramite laltoparlante.

Documentazione completa Open Source

La documentazione completa disponibile, a


questo link: voice_shield_arduino.zip

Lautore e a disposizione nei commenti per eventuali approfondimenti sul tema dellArticolo.
Di seguito il link per accedere direttamente allarticolo sul Blog e partecipare alla discussione:
http://it.emcelettronica.com/costruiamo-voice-shield-far-parlare-arduino-progetto-completo-open-source

Vous aimerez peut-être aussi