Académique Documents
Professionnel Documents
Culture Documents
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
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
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
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.
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
*/
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
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
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
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
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
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
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-
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
SPEEDTEST
Il main loop dello sketch di esempio (si veda il li-
stato SpeedTest) comprende soltanto due istru-
zioni:
//********************************* #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
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
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
*/
#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- }
int main(void){
script che useremo il seguente:
DDRB=0x20;
28} Speciale Arduino - TUTORIAL
arduino.c per le informazioni hardware dei pin che questo file utilizzabile solo per la
Speciale Arduino - TUTORIAL {31
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();
#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
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
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.
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
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
*/
#define encoder_A 2
#define encoder_B 4
#define encoder_pb 3
void setup() {
pinMode(encoder_A, INPUT);
pinMode(encoder_B, INPUT);
pinMode(encoder_pb, INPUT);
Serial.begin (9600);
Serial.println(Encoder test);
void loop(){
Serial.println(count);
void encint() {
*/
if (digitalRead(encoder_B) == 0) delta=1;
void buttint() {
multi++;
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
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
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).
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-
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.
SCHEMA 1
}
void loop() {
int sensorValue = analogRead(A0);
int outputValue = map(sensorValue, 0, 1023, 0,
255);
analogWrite(transistorPin, outputValue);
}
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
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
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
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.
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
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
lita.
#include <NewPing.h>
// Pin assignment for first half-bridge
const int IN_1 = 3; // input (PWM)
const int INH_1 = 12; // inhibit (low = sleep)
#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.
void setup() {
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
/* half bridge mode, two unidirectional motors motor 1 connected to OUT1 and GND motor 2 connected
to OUT2 and GND */
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
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
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.
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
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.
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.
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
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
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
aa=analogRead(quale); if (tiporeg>1) {
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){
}
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;};
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 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
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
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
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
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
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
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
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
#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;
{
long x1, x2;
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;
x1 = (p>>8) * (p>>8);
x1 = (x1 * 3038)>>16;
x2 = (-7357 * p)>>16;
p += (x1 + x2 + 3791)>>4;
return p;
}
Wire.beginTransmission(BMP085_ADDRESS);
92} Speciale Arduino - TUTORIAL
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 1);
while(!Wire.available());
return Wire.read();
}
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(address);
Wire.endTransmission();
Wire.requestFrom(BMP085_ADDRESS, 2);
while(Wire.available()<2);
msb = Wire.read();
lsb = Wire.read();
// ATTENZIONE al sovracampionamento!
Wire.beginTransmission(BMP085_ADDRESS);
Wire.write(0xF4);
Wire.write(0x34 + (OSS<<6));
Wire.endTransmission();
return up;
}
// Inizia il programma
void setup()
{
Serial.begin(9600);
Wire.begin();
lcd.begin();
bmp085Calibration();
}
void loop()
{
temperature = bmp085GetTemperature(bmp085ReadUT())/10;
pressure = bmp085GetPressure(bmp085ReadUP());
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
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
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
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.
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
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
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.
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);
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
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
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
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
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
//Umidificatore
if((int)myDHT22.getHumidity() >= hmax-1){
digitalWrite(UMIDIFICATORE, HIGH);
}
if((int)myDHT22.getHumidity() <= hmin+1){
digitalWrite(UMIDIFICATORE, LOW);
}
/************************************************* 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
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
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
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.
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
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)
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
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
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-
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
I motori a 4 fili sono di tipo bipolare, come dedu- di 1.1 Ampere per ogni stadio. Accetta tensioni
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
Ho deciso di utilizzare un motore passo-passo tore. E compatibile pin to pin con lL293D che
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
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
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
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
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.
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
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.
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.
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.
IsConnected() verifica che il sensore sia ef- strer sul display TFT, dopo una pagina ini-
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
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:
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
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
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
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 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
ventole rimarranno accese per 60 secondi e uno Cliccando su Giardiniere possibile scarica-
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
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
[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.
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.
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
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
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
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
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, ........};
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
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
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.
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
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
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);
}
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
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.
ma pu essere utilizzata qualsiasi altra piattafor- dati da sensori e svolgere delle azioni correlate,
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
//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;
EthernetClient client;
void setup()
{
188} Speciale Arduino - PROGETTI
//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);
}
lastConnected = client.connected();
if (client.connect(server, 80))
{
Serial.println(Connessione...);
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();
}
}
else{
echo ERROR;
/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());
}
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
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
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
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
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
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
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);
}
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.
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
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 setup()
{
Serial.begin(9600); //INIZIALIZZO LA SERIALE
while(!Serial){;}
mySerial.begin(9600); //INIZIALIZZO LA SE- image credits: 3.bp
Speciale Arduino - PROGETTI {205
void setup()
{
lcd.begin(16, 2);
delay(1000);
lcd.setCursor(0, 0);
lcd.print(EOS DISPLAY);
}
//
// BTAlarmViewController.h
// coreBluetoothiPhone
//
// Created by Luigi DAcunto on 01/05/14.
// Copyright (c) 2014 Luigi DAcunto. All rights reserved.
//
}
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{
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);
}
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
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));
}
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;
}
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
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.
Firmware.
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.
Verificare la versione di firmware dei mo- pre presso il sito del produttore, la LPM11162
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()
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)
int pinval = 0; {
int SmallNumber = 0;
void setup()
} SmallNumber = abs(100-SmallNumber)/10;
} if (BigNumber != 0)
{
void loop()
String intero= String (String (BigNumber) +
{ .wav);
{ audio.play(frase_array);
audio.play(frase_array);
while( audio.isBusy() );
delay (1000);
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.
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