Sei sulla pagina 1di 110

SOMMARIO

Speciale Arduino

SAFETY TUTOR SYSTEM INTELLIGENZA


CON ARDUINO 2 ARTIFICIALE CON 75
ARDUINO
REALIZZAZIONE DI UN
PATROLLING ROBOT 11 PROGETTIAMO CON
CON ARDUINO ARDUINO IOT CLOUD 79
JUKEBOXINO: SCEGLI GIOCHIAMO A TRIS
IL TUO BRANO CON 18 CON ARDUINO 88
ARDUINO
ALLARME ANTIGAS
GIOCHIAMO CON CON ARDUINO NANO 97
ARDUINO: STRUMENTO 25
MUSICALE AD IL PRIMO MICRO PLC
ULTRASUONI “NO TOUCH” DI CASA ARDUINO 102
CON FUNZIONALITÀ
SMART POT SENSOR: IOT INDUSTRIALI
IOT APPLICATO 33
ALL’AGRICOLTURA IL RILEVAMENTO
(PARTE 1) DIVENTA SMART 105
CON ARDUINO
SMART POT SENSOR: NICLA SENSE ME
IOT APPLICATO 38
ALL’AGRICOLTURA
(PARTE 2)
UN SEMPLICISSIMO
ENERGY METER 46
CON ARDUINO
CONTROLLO DEL MOTO
DI UNA SMART CAR 50
CON ARDUINO
LA NUOVA
SCHEDA ARDUINO 61
EDGE CONTROL
AUTOMATIZZA
L’AGRICOLTURA
INTELLIGENTE
[DIY] COME
AGGIUNGERE 67
UNA WEBCAM E IL
CONTROLLO REMOTO AL
VOSTRO ROBOT

1
SAFETY TUTOR SYSTEM
CON ARDUINO di Giuseppe Silano

L'obiettivo dell'articolo è mostrare come sia possibile realizzare un Safety Tutor System, un rilevatore di
velocità media, utilizzando Arduino UNO ed una coppia di sensori ad ultrasuoni HC-SR04. Il sistema è in
grado di rilevare la velocità media di un veicolo, un’ottima soluzione per stimare il rapporto velocità-Arduino
PWM quando non si hanno a disposizione encoder ottici. La collezione di dati raccolta è elaborata utilizzando
un approccio di tipo statico. L’obiettivo è realizzare un look-up table, da integrare all'interno dell’algoritmo di
controllo, per la movimentazione del veicolo e conseguentemente la realizzazione di sistemi più complessi.
Dunque, uno strumento di analisi indispensabile per applicazioni successive. In sintesi, saranno descritte
le componenti e le interconnessioni del sistema, lo sketch per Arduino e l’analisi statica per la sintesi dello
stimatore. Per concludere, saranno mostrati i risultati dell’analisi di regressione condotta per associare ad
ogni valore di PWM di Arduino un valore di velocità media del veicolo.

PREMESSA ALLO STUDIO DEL SISTEMA cariche e per bassi valori di scarica delle stesse. Difatti,

L
o studio condotto e descritto all'interno di questo ar- durante l'intero esperimento, le batterie sono state sosti-
ticolo si basa su un'ipotesi stringente ma necessa- tuite ogni 5 cicli di misura (significato chiarito nel seguito).
ria per il funzionamento del robot di terra: la look-up Tale valore è stato ottenuto empiricamente, osservando il
table ottenuta costituisce una buona approssimazione di degradamento improvviso delle misure per cicli succes-
velocità-PWM (Pulse Width Modulation, si veda la spe- sivi. Inoltre, affinché sia possibile riutilizzare tale appros-
cifica sezione) solo se le batterie sono completamente simazione, è necessario che la forza di attrito tra ruote

Figura 1: Foto del Safety Tutor System

2
SAFETY TUTOR SYSTEM CON ARDUINO

la volontà di realizzare un progetto che fosse quanto il più


semplice possibile, si è pensato di sfruttare solo il concet-
to di Tutor sostituendo la parte di elaborazione delle
immagini con il rilevamento del passaggio del veicolo
da parte di una coppia di sensori ad ultrasuoni utiliz-
zati come una sorta di relè: misurano il cambio improvviso
di misura della distanza, di almeno un'ordine di grandez-
za, tra i due attraversamenti. In Figura 1 è mostrata una
foto del sistema in cui sono stati evidenziati i due sensori
ad ultrasuoni (sensor A e sensor B) oltre che la scheda
Arduino UNO, utilizzata più come un DSP (Digital Signal
Processor) che un vero e proprio microcontrollore (ap-
prossimazione valida per il caso in case, ai fini della stima
condotta).
Al fine di misurare la velocità media, i due sensori ad ultra-
suoni sono stati posizionati alla distanza di un metro l'uno
dall'altro. Tale valore, per nulla casuale, è stato scelto al
fine di minimizzare la deriva che caratterizza il veicolo in
modalità skid sterring utilizzato per l'esperimento: robot
di piccole dimensioni, a struttura rigida, privo di ruote ster-
Figura 2: Schema circuitale del Safety Tutor System, colle- zanti. Un veicolo di questo tipo è composto tipicamente da
gamenti sensori ad ultrasuoni con Arduino UNO quattro ruote, due a due meccanicamente bloccate ed in
sincronia su ogni lato, con il lato sinistro che può essere
e terra rimanga entro le condizioni operative dell'esperi- guidato in maniera del tutto indipendente dal lato destro.
mento condotto. Questo, però, non costituisce un vincolo Facendo ruotare la coppia di ruote destre e sinistre a di-
stringente (come nel primo caso) poiché un controllo suf- versa velocità, è possibile, provocando uno scivolamento
ficientemente robusto è in grado di compensarlo, in modo della macchina sul terreno, ruotarne l'orientamento. Mac-
piuttosto semplice. Per dettagli aggiuntivi su come rea- chine di questo tipo, oltre che nell'ambito robotico, trova-
lizzare un sistema di controllo sufficientemente robusto, no tipicamente impiego nel settore edilizio, ad esempio le
si rimanda il lettore ad approfondimenti su testi/manuali macchine per il movimento terra.
dedicati. In Figura 2 è riportato lo schema circuitale realizzato uti-
lizzando Fritzing (software open source per facilitare lo
SAFETY TUTOR SYSTEM sviluppo di progetto DIY, Do It Yourself). In nero e rosso
Per la realizzazione del Safety Tutor System ci si è sono rappresentati rispettivamente alimentazione e mas-
ispirati al tanto temuto sistema Tutor di Autostrade sa; in giallo/arancione il pin utilizzato per l'echo, mentre
per l'Italia: strumento che rileva la velocità media te- in verde/celeste - spiegati nell'apposita sottosezione al
nuta da un veicolo (di qualsiasi tipo) in un tratto di au- fine di mantenere viva l'attenzione del lettore sul funziona-
tostrada (di solito compreso tra i 10 ed i 25 chilometri). mento del sistema - quello per il trigger. Data la distanza
Quando il veicolo attraversa il portale del Tutor, i sensori fisica tra i due sensori è stato necessario utilizzare due
a terra (normalmente 4 per ogni striscia di asfalto) rico- breadboard, come si evince anche dalla Figura 1. L'ali-
noscono il tipo di veicolo ed attivano la fotocamera posta mentazione, come del resto l'acquisizione dati, è avvenu-
nella parte superiore del portale. Attraverso un sistema ta per mezzo di un computer host collegato via USB al
per l'elaborazione delle immagini, estrae il numero di tar- microcontrollore.
ga e calcola, banalmente, la velocità media lungo i due Per garantire la consistenza delle misure, dovute al
attraversamenti. Si tratta di un sistema complesso, costo- transitorio dei motori DC (Direct Current, Corrente Conti-
so, ma che garantisce mediamente ottimi risultati per il nua), è stata fatta raggiungere al veicolo la velocità di regi-
controllo delle velocità garantendo così la sicurezza sulle me (facendolo partire a meno di una decina di centimentri
strade (e facendo anche un po' di cassa). prima di incontrare il sensore), relativa allo specifico va-
Nel caso in esame, date le ridotte dimensioni del veicolo, lore di PWM, prima di misurare l'intervallo di tempo che

3
SAFETY TUTOR SYSTEM CON ARDUINO

intercorre nell'attraversamento del punto A e B (Figura 1). rapporto tra la durata dell'impulso positivo e di quello ne-
Banalmente, per misurare la velocità media del veicolo tra gativo (duty cycle, Figura 3). Allo stesso modo è fonda-
i due punti di misura, associata ad uno specifico valore di mentalmente utilizzato per protocolli di comunicazione in
PWM, è stato calcolato il rapporto tra distanza (s, 1 metro) cui l'informazione è codificata sotto forma di durata nel
e tempo (telapsed): tempo di ciascun impulso. Grazie ai moderni microcontrol-
lori (Arduino è tra questi) è possibile attivare o inattivare
un interruttore ad alta frequenza e, allo stesso modo, rile-
vare lo stato ed il periodo di un impulso.
La durata di ciascun impulso può essere espressa in rap-
Gli intervalli dei valori della PWM (0 - 255) sono stati di- porto al periodo tra due impulsi successivi, implicando il
visi in undici classi di misura non uniformi (100, 105, 110, concetto di ciclo di lavoro. Un ciclo di lavoro utile pari a
115, 125, 142, 175, 200, 225, 255) al fine di scegliere il 0% indica un impulso di durata nulla, in pratica assenza
campione nella maniera più significativa. Non sono sta- di segnale, mentre un valore del 100% indica che l'im-
ti considerati valori della PWM inferiori a 100 poiché per pulso termina nel momento in cui ha inizio il successivo.
valori inferiori il veicolo non riesce a vincere le forze di Un segnale di clock è a volte utilizzato per determinare la
inerzia, quelle di primo distacco, non modificando così la posizione degli impulsi, ma spesso non è necessario in
sua posizione iniziale. Sono state scelte classi di misu- quanto al segnale viene aggiunto un valore minimo che
ra più piccola nell'intervallo 100 ÷ 150 al fine di ottenere garantisce la presenza di un piccolo impulso anche per il
una migliore risoluzione dall'analisi di regressione. Da un valore zero.
punto di vista tecnico sono stati effettuati cinquanta cicli La modulazione a larghezza di impulso può essere
di misura, dove con ciclo di misura si è inteso l’insieme utilizzata per variare la velocità di un motore elettrico
delle velocità misurate per ogni valore di PWM. In questo in corrente continua (DC) e per variare la luminosità
modo la scarica delle batterie influenza la misura di velo- delle lampadine. Come si può intuire, con un duty cycle
cità per ogni valore di PWM. Dopo aver acquisito i dati, le pari a zero la potenza trasferita è nulla, mentre al 100%
misure sono state elaborate utilizzando un approccio di la potenza corrisponde al valore massimo trasferito nel
tipo statistico (sezione successiva). Le piccole dimensioni caso non sia presente il circuito di modulazione. Ogni va-
della varianza hanno reso sufficienti solo cinquanta cicli di lore intermedio determina una corrispondente fornitura di
misura per eseguire questo tipo di analisi. potenza.
Arduino UNO offre la possibilità di usare ai pin 3, 5, 6, 9,
PULSE WITH MODULATION IN ARDUINO 10, 11 l’istruzione analogWrite() per generare tale segnale.
La modulazione di larghezza di impulso, in inglese Pul- L'istruzione consente, appunto, di far lampeggiare un LED
se Width Modulation (PWM), in elettronica e telecomu- o governare un motore elettrico mentre lo sketch esegue
nicazioni è un tipo di modulazione digitale che permette altre istruzioni. La sintassi della funzione è alquanto bana-
di ottenere una tensione media variabile dipendente dal le: analogWrite(pin, valore). Pin è il piedino su cui inviamo
il segnale, per Arduino UNO i pin 3, 5, 6, 9, 10, 11; valore:
è il duty cycle compreso tra 0 (sempre off) e 255 (sempre
on). La funzione non restituisce nessun valore.

SENSORE AD ULTRASUONI HC-SR04


Il sensore ad ultrasuoni HC-SR04 (Figura 4) segue lo
stesso funzionamento di un sonar per determinare la
distanza: utilizza la propagazione del suono (sott'acqua
in genere) per la navigazione, la comunicazione o per ri-
levare la presenza e la posizione di imbarcazioni. Il sonar
(attivo) opera secondo il principio del radar e permette la
localizzazione dei corpi sommersi tramite la rivelazione
degli echi relativi a impulsi sonori o ultrasonori emessi per
Figura 3: Esempio di pilotaggio di un motore AC (Alterna- mezzo di un trasduttore piezoelettrico o magnetostrittivo.
ting Current, Corrente Alternata) attraverso il PWM Il trasduttore emette un segnale ad alta energia acustica,

4
SAFETY TUTOR SYSTEM CON ARDUINO

#include <NewPing.h>
#define SONAR_NUM 2 // Numero di sensori
#define MAX_DISTANCE 200 // Massima distanza in centimetri tra i ping
#define PING_INTERVAL 35 // Millisecondi tra i diversi ping
#define TRIGGER_PIN_1 4 // Pin Arduino utilizzato per il ping, primo sensore
#define ECHO_PIN_1 2 // Pin Arduino utilizzato per l'echo, primo sensore
#define TRIGGER_PIN_2 7 // Pin Arduino utilizzato per il ping, secondo sensore
#define ECHO_PIN_2 8 // Pin Arduino utilizzato per l'echo, secondo sensore

unsigned long pingTimer [SONAR_NUM] ; // Memorizza i valori assunti dal tempo quando dovrebbe arrivare il ping per ogni
sensore
float cm[SONAR_NUM] ; // Dove sono memorizzare le distanze
uint8_t currentSensor = 0 ; // Tiene traccia di quale sensore è attivo
float constant = 90.00; // Distanza dall'ostacolo
long time [SONAR_NUM] ;

int counter=0; //Contatore di misura

//Crea un nuovo oggetto di tipo SONAR_NUM


NewPing sonar[SONAR_NUM] = { //Vettore contenente i sensori
NewPing(TRIGGER_PIN_1, ECHO_PIN_1, MAX_DISTANCE), //Indica i parametri formali per il primo sensore
NewPing(TRIGGER_PIN_2, ECHO_PIN_2, MAX_DISTANCE), //Indica i parametri formali per il secondo sensore
}
//Inizializza il vettore tempo
void setup(){
initialize_time();

//Inizializza la comunicazione seriale


Serial.begin(9600);
while(!Serial){
; //Resta in attesa fin tanto che la comunicazione non va a buon fine
}
pingTimer[0] = millis() + 75; //Il primo ping parte a 75ms, da il tempo ad Arduino di avviarsi prima di partire
for(uint_8_t i = 1; i < SONAR_NUM; i++) //Imposta il tempo di avvio per ogni sensore
pingTimer[i] = pingTimer[i-1]+PING_INTERVAL;
}

//Loop di Arduino
void loop(){
long time_write;
for (uint8_t i = 0, i < SONAR_NUM; i++){ //Ciclo per tutto i sensori
if(millis() >= pingTimer[i]){ //È tempo di avviare il sensore?
pingTimer[i] += PING_INTERVAL*SONAR_NUM; //Imposta il prossimo valore temporale per il sensore di cui sarà fatto
il ping
if(cm[i]<=constant) //Vettore tempo, millisecondi quando attraverso un ostacolo
time[i] = millis();
sonar[currentSensor].timer_stop(); //Per essere certi che il valore temporale precedente è stato cancellato primo di
inviare un nuovo ping
currentSensor = i;
cm[currentSensor] = 0; //Per essere certi che la distanza sia uguale a zero nel caso in cui non vi sia un echo per questo
sensore
sonar[currentSensor].ping_timer(echoCheck); //Fa il ping (processi continui, interrompendo quando chiamerà echo-
Check per guardare se via un segnale di echo)
}
}
if(time[0]!=0 && time[1]!=0){
time_write = time[1] - time[0];
counter++;
Serial.print(time_write); //Stampa il valore di time_write
Serial.print(", ");
if(counter==2){
Serial.println();
counter=0;
}
time_write=0; //Ripristina la variabile tempo
initialize_time();
}
}

void echoCheck(){ //Se il ping viene ricevuto, imposta la distanza del sensore nel vettore
if(sonar[currentSensor].check_timer())
cm[currentSensor] = sonar[currentSensor].ping_result/57.00;
}

5
SAFETY TUTOR SYSTEM CON ARDUINO

Figura 4: Principio di funzionamento del sensore ad ultrasuoni HC-SR04

o ping (fino a 200 dB); gli oggetti presenti nell'area riflet- mezzo (l'aria) dividendola per l'intervallo di tempo
tono il suono e l'onda riflessa (echo) viene raccolta dai intercorso tra l'invio e la ricezione (del segnale).
sensori del sottomarino. Il tempo trascorso tra il momento
dell'emissione del segnale acustico e quello in cui l'onda La libreria NewPing, qui il link per il download, consente
riflessa di questo raggiunge l'emettitore, fornisce la distan- di gestire automaticamente l'intero processo (oltre ad una
za dell'obiettivo con estrema precisione. serie di funzionalità, come la gestione del ping quando
Il sensore offre un eccellente intervallo per la misura sono connessi al microcontrollore più sensori) restituen-
della distanza priva di contatto nell'intervallo da 2 cm a do in uscita direttamente la distanza misurata. È possibile
400 cm. Il modulo include un trasmettitore ad ultrasuoni, ottenere lo stesso risultato collegando la scheda all'am-
un ricevitore ed un circuito di controllo. Nel seguito vengo- biente di calcolo numerico MATLAB, ma in questo caso è
no descritti i principi di funzionamento: necessario realizzare una S-Function (scritta in codice C)
1. per emettere l'onda è necessario mantenere alto ad hoc per gestirne il comportamento.
per almeno 10 μs il pin di trigger (verde in Figura In Figura 5 è riportato lo schema Simulink utilizzato per
2); gestire il sensore in ambiente MATLAB. Il data type con-
2. il modulo automaticamente invia onde sonore ad version è necessario per convertire la rappresentazione a
una frequenza di 40KHz e rileva l'eventuale segna- 16 bit, utilizzata da MATLAB per rappresentare gli interi, in
le di ritorno (segnalato attraverso il pin di echo); quella ad 8 bit, impiegata da Arduino. È necessario, quin-
3. se vi è un segnale di ritorno, il pin di echo assume di, un processo di conversione prima della trasmissione
un valore alto fornendo indirettamente una misura dei dati sulla porta del microcontrollore. Per avere una
di distanza. Infatti, la routine per la gestione del migliore risoluzione, ragionando sul tipo di misura (la di-
sensore è in grado di calcolare la distanza cono- stanza non può mai assumere valori negativi), si è scelto
scendo la velocità di propagazione del suono nel di impiegare un tipo di dato unsigned.

Figura 5: Schema Simulink per l'interfacciamento del sensore ad ultrasuoni HC-SR04

6
SAFETY TUTOR SYSTEM CON ARDUINO

in entrambi i casi non è richiesta la cono-


scenza della caratterizzazione statistica
degli osservabili. Per poter capire quale dei
due fosse migliore per il caso di interesse è
stato necessario calcolare il valore assunto
dalla varianza.

dove ||y-v(x)|| è l'errore di misura.


Per stimare la varianza e la polarizzazio-
ne, gli indici di qualità di uno stimatore, è
stata impiegata la varianza campionaria
non polarizzata (corretta, eq. 1) e la va-
Figura 6: ECDF dei campioni misurati rianza campionaria (eq. 2) per ogni valore
di PWM. È stato calcolato anche il valore
ANALISI STATISTICA assunto dalla polarizzazione (eq. 4). I dati sono mostrati
Acquisite le misure, si è utilizzato un approccio di tipo sta- in Figura 8.
tistico per la loro elaborazione. Dapprima, si è provato a
capire se le misure fossero osservabili, ovvero, se avesse-
ro caratteristiche simili ad una distribuzione di probabilità
nota (Gaussiana, Uniforme, di Poisson, e così via). A tale
scopo è stata calcolata la ECDF (Empirical Cumulative Di-
stribution Function, Funzione di Distribuzione Cumulativa
Empirica) delle osservazioni (Figura 6). La ECDF conver-
ge al valore vero della CDF con probabilità pari ad 1: L'incremento del valore della PWM causa un aumento
della polarizzazione con entrambe le varianze: il Sa-
fety Tutor System non è abbastanza veloce a cattura-
re la dinamica del veicolo. Tuttavia, la polarizzazione è
due ordini di grandezza più grande della varianza
dove N è il numero delle misure, cinquanta nel nostro quindi può essere trascurata .
caso, e #[y(i)≤v] è il numero delle osservazioni minori o Discorso uguale per la varianza comparata rispetto alla
uguali a v. Sfortunatamente, il numero delle osservazioni velocità del veicolo. Una piccola varianza indica che i
non è sufficiente a capire il tipo di distribuzione. Per que- campioni tendono ad essere chiusi rispetto al valore vero.
sta ragione sono stati rappresentati i diagrammi di disper- Per tale ragione la media campionaria, chiamata anche
sione per i differenti valori di PWM (Figura 7). stimatore naturale, può essere utilizzata come stimatore
Sulla base dei risultati ottenuti dalla stima della CDF si è della velocità del veicolo.
arrivati a capire che non era possibile utilizzare lo stimare
MVU (Minimum Variance Unbiased) o ML (Maximum
Likelihood) per i dati, a causa della mancata conoscen-
za della caratterizzazione statistica degli osservabili. A
questo punto, un'alternativa era utilizzare lo stimatore na-
turale o la stima LS (Least Square, Minimi Quadrati):

7
SAFETY TUTOR SYSTEM CON ARDUINO

Figura 7: Diagrammi di dispersione per differenti valori di PWM

La media campionaria è uno stimatore non polarizzato dove X (N) è l'errore di stima.
(l'errore di stima tende a zero all'aumentare del numero di Al fine di studiare la relazione tra PWM e la velocità del
campioni, eq. 7) e consistente (l'errore quadratico medio veicolo, è stata condotta un'analisi di regressione. Tale
tende a zero con l'aumento del numero di osservazioni, funzione può essere lineare, quadratica, cubica, etc (Fi-
eq. 8). gura 8). Lo stimatore naturale è stato utilizzato per otte-
nere la velocità per ogni valore della PWM. La funzione
di regressione più piccola, in termini di complessità, che
minimizza la somma dei quadrati residui, è la regressione
cubica.
La loop-up table (risultato finale dell'analisi, utilizzabile per
la realizzazione di applicazioni complesse) è stata realiz-

8
SAFETY TUTOR SYSTEM CON ARDUINO

Figura 8: Varianza e polarizzazione

zata a partire dall'analisi di regressione, in particolare la SKETCH ARDUINO


funzione cubica che meglio approssima l'andamento della All'interno di questa sezione è riportato lo sketch Ardui-
curva. no (alimentato via pc) utilizzato per la realizzazione del
La minima e la massima velocità sono state rispettiva- sistema. I due sensori ad ultrasuoni sono stati sincroniz-
mente 1.362×10-1 m/s e 5.088×10-1 m/s. zati utilizzando la libreria NewPing (nominata in preceden-

9
SAFETY TUTOR SYSTEM CON ARDUINO

za), così da gestire facilmente il ping intervall: l'intervallo


di tempo che deve trascorrere tra il ping di un sensore e
di quello successivo per evitare fenomeni di interferenza for(int i=0; i<11, i++){
quindi misure scorrette. Infine, le misure sono state ac- digitalWrite(M1, LOW);
quisite utilizzando un pc come host (come sopra citato),
dunque attraverso una porta seriale (listato pag. 6). digitalWrite(M2, LOW);
Nel seguito lo sketch utilizzato per la movimentazione del analogWrite(E1, value[i]); //PWM per il controllo
veicolo.
di velocità

analogWrite(E2, value[i]); //PWM per il controllo


#define E1 = 5;
di velocità
#define M1 = 4;
delay(time[i]);
#define E2 = 6;
analogWrite(E1, 0); //PWM per il controllo della
#define M2 = 7;
velocità
#define MEASURES_NUMBER 11
analogWrite(E2, 0); //PWM per il controllo della

velocità
int value[MEASURES_NUMBER], time[MEASURES_
delay(5000);
NUMBER]
}

delay(100);
void setup(){
}
value={100, 105, 110, 115, 125, 142, 150, 175, 200,

225, 255},

time={15000, 15000, 15000, 10000, 10000, 10000,


CONCLUSIONI
8000, 6000, 5000, 5000, 5000};
La realizzazione di un Safety Tutor System con Ardu-
pinMode(M1, OUTPUT); ino, progetto di relativa semplicità, ha consentito di af-
frontare concetti chiave: utilizzo di una libreria (NewPing),
pinMode(M2, OUTPUT);
analisi di regressione, stimatori, varianza, polarizzazione,
etc. Inoltre, l’implementazione del software ha consentito
di introdurre un cardine nella realizzazione degli attuali si-
//Inizializza la comunicazione seriale
stemi di controllo: il pilotaggio per mezzo di PWM.
Serial.begin(9600); Difatti, la quasi totalità dei sistemi vedono l'utilizzo di se-
gnali PWM per comandare l'intensità di LED, il pilotaggio
while(!Serial){
di motori in continua, l'accensione e lo spegnimento di in-
; //Attende l'avvenuto avvio della comunicazione terruttori (semplici MOSFET o BJT), etc.

L’autore è a disposizione nei commenti per eventuali


void loop(){ approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
direttamente all’articolo sul Blog e partecipare alla discussione:
delay(5000); https://it.emcelettronica.com/safety-tutor-system-con-
arduino

10
REALIZZAZIONE DI UN
PATROLLING ROBOT
CON ARDUINO di Giuseppe Silano

In questo articolo è presentato il modello e l'algoritmo di controllo sviluppato per la guida di un robot mobile
capace di seguire una parete (wall follower), principio utilizzato poi per realizzare un robot pattugliatore.
Arduino, in particolare la versione Mega 2560, è stato scelto come unità di controllo. L'algoritmo, attraverso
una coppia di sensori ad ultrasuoni HC-SR04, scandaglia l'ambiente acquisendo misure di distanza, rego-
lando così la sua traiettoria seguendo la linea della parete. Il robot è anche in grado di rilevare la presenza
di eventuali ostacoli, grazie ad un sensore frontale (sempre ad ultrasuoni), così da variare il percorso per
evitare eventuali collisioni. Il sistema di controllo è progettato per garantire l'asintotica stabilità del sistema
evitando la saturazione degli attuatori, e quindi un loro irrimediabile danneggiamento. Saranno illustrati e
descritti tutti i passaggi, come del resto anche le componenti utilizzate ed i relativi schemi circuitali, seguiti
per la messa in pratica dell'idea. Infine, saranno forniti link a video che mostrano i risultati sperimentali e
quindi la validità dell'approccio seguito.

INTRODUZIONE tragici oppure a robot in grado di pulire automaticamen-

A
l giorno d'oggi, le applicazioni che coinvolgono te i pavimenti delle abitazioni, o ancora quelli in grado di
agenti autonomi stanno aumentando ad un ritmo tagliare (impostata una lunghezza desiderata) l'erba del
elevato e si prevede che tale tendenza continui giardino.
anche nel futuro grazie a progressi tecnologici che apri- Il problema del patrolling o della circumnavigazione di un
ranno la strada a nuove possibilità applicative. Tali dispo- oggetto consiste nel guidare un agente (un generico ro-
sitivi trovano impiego non solo ai fini della ricerca ma an- bot) lungo il bordo di un ostacolo garantendo il manteni-
che in contesti quotidiani. Ad esempio, si pensi a robot mento di una distanza minima da esso.
per la ricerca ed il recupero di dispersi in seguito ad eventi Al di là del semplice pattugliamento, il patrolling trova ap-

11
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO

solo informazioni locali ottenute attraverso sensori atti


alla rilevazione di oggetti. Infatti, la soluzione più intuiti-
va a questo problema vuole che l'agente si diriga verso il
goal fino all'individuazione di un ostacolo, per poi proce-
dere al patrolling fino a quando il percorso per l'obiettivo
torna ad essere libero da impedimenti.
In Figura 1 è riportato uno screen della missione spaziale
Curiosity della NASA, tra gli obiettivi l'esplorazione di Mar-
te, tipico esempio di un robot pattugliatore.
Le applicazioni spaziali non sono le uniche in cui i robot
pattugliatori trovano impiego.
In Figura 2 è riportato un esempio di soluzione aziendale
utilizzata per monitorare i perimetri di impianti industriali,
dotata di camera omnidirezionale e pan-tilt-zoom.
L'obiettivo del lavoro è illustrare i passi che hanno per-
messo la realizzazione di un robot pattugliatore utilizzan-
do Arduino Mega 2560, una serie di sensori ad ultrasuoni
(gli HC-SR04, già introdotti all'interno di un precedente ar-
Figura 2: Robot autonomo impiegato per il monitoraggio di ticolo) per l'analisi dell'ambiente e l'individuazione di even-
impianti industriali tuali ostacoli, mentre la movimentazione è affidata a due
coppie di motori DC (Direct Current, Corrente Continua)
che consentono al robot di spostarsi nell'ambiente lavo-
rando in modalità skid steering (abbiamo già discusso di
questa modalità).

MODELLO CINEMATICO
Consideriamo il modello dell'uniciclo - approssimazione
valida dato che il robot scelto lavora in modalità skid stee-
ring - posizionato ad una distanza diversa da zero rispetto
all'obiettivo (xd in Figura 3) in un sistema di riferimento
cartesiano. Il suo moto lungo l'obiettivo è governato dall'a-
zione combinata della velocità angolare ω e della velocità
lineare u, la quale è sempre nella direzione di uno dei due
assi del frame <a> attaccato al robot.
Dunque, l'usuale insieme di equazioni che governano la
dinamica del robot, nel sistema cartesiano [x, y] dato l'an-
golo di imbardata φ, è:

Figura 3: Posizione ed orientamento del robot nello spazio

dove φ è misurato rispetto all'asse x.


Consideriamo ora il caso di un robot intento nel naviga-
re un corridoio (Figura 4). Le variabili di stato cambiano
plicazione nel più generale problema della navigazione di rispetto al caso precedente, e sono definite in relazione
un ambiente sconosciuto (in letteratura noto come SLAM, al corridoio come x̃ tilde e φ, dove x̃ rappresenta la de-
che sta per Simultaneous Localization and Mapping), viazione del robot dal centro del corridoio (o la linea che
in cui si vuole che un agente sia in grado di raggiungere si desidera seguire) e φ è la deviazione angolare rispetto
un punto nello spazio, detto goal (obiettivo), utilizzando all'asse del corridoio. In questo caso le equazioni cinema-

12
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO

tiche si riducono a: e visibile in Figura 7, dove ψ rappresenta l'angolo di rota-


zione con cui il robot evita l'ostacolo.
Nel seguito lo pseudo codice realizzato a partire dall'al-
goritmo di controllo appena descritto implementato sul
microcontrollore.
Capite le equazioni generali (eq. 1) e particolari (eq. 2)
che governano la dinamica del sistema, è possibile for- Data: error, PWMLeft, frontSensor
mulare l'algoritmo di controllo che varia le velocità degli Result: cancelling the error and avoid the obstacles
attuatori seguire la linea della parete. PWMLeft=InitialVelocity;
PWMRight=InitialVelocity;
IL SISTEMA DI CONTROLLO while ever do
Per la realizzazione del sistema di controllo si è pre- read the data from ultrasonic sensors;
so in considerazione il sistema rappresentato in Figura calculate error;
5. Rispetto al caso precedente, le variabili di stato sono if frontSensor<DISTANCE then
definite in relazione alla parete come φ e ᵭ, dove φ è la LeftDirection=backward;
deviazione angolare relativa alla linea delle mura, mentre RightDirection=forward;
ᵭ rappresenta la distanza del robot da una linea immagi- PWMLeft=255;
naria ad una desiderata distanza dwall. PWMRight=255;
In Figura 5 sono rappresentati anche i sensori ad ultra- else
suoni, indicati con si (dove con i è indicato il sensore i-esi- LeftDirection=forward;
mo), in grado di misurare la distanza ys0 e ys15. In questo RightDirection=forward;
caso la distanza ᵭ è calcolata come: if error>0 AND (PWMLeft<(255-increment)) then
PWMLeft=PWMLeft+increment;
end
if error<0 AND (PWMLeft>(0+increment)) then
PWMLeft=PWMLeft-increment;
dove il segno più o meno è da tenersi a mente nel caso in end
cui il robot segua la parete dal lato destro (nel nostro caso if error==0 then
la stiamo seguendo dal lato sinistro). Il robot è anche ca- PWMLeft=InitialVelocity;
pace di rilevare la presenza di eventuali ostacoli, devian- end
doli. Per questo è dotato di un sensore aggiuntivo, posto end
sulla parte frontale, che conferisce la capacità, come sud- end
detto, di evitare gli ostacoli che potrebbero eventualmente
presentarsi davanti al robot intento a seguire la parete.
A questo scopo, si considera un segnale di deviazione IL ROBOT
come una perturbazione ωp verso il sistema di controllo, Chiara l'idea alla base del funzionamento del robot, non
come mostrato in Figura 6. resta altro che assemblare il veicolo, nella fattispecie un
Il segnale è calcolato sulla base della posizione ᵭ fornita robot che lavora in modalità skid steering. In particolare,
dal sistema di controllo, descritta in precedenza. L'algo- per la realizzazione del pattugliatore è stato utilizzato il kit
ritmo di controllo è in grado, così, di guidare il robot dal fornito da DFRobot, il Baron-4WD: una piattaforma ver-
punto iniziale a quello finale, l'obiettivo xd visto in Figura satile dotata di quattro motoriduttori con ruote da 65mm;
3. Così come è strutturato, il rilevatore non influisce sulla due piastre dotate di tagli e fori per il montaggio di sensori,
guida del veicolo nel mentre è intento a seguire una pa- microcontrollori (Arduino Mega 2560 nel nostro caso) o
rete. Quando viene rilevato un ostacolo, il sistema di con- altro hardware; inoltre, lo spazio tra le piastre è ideale per
trollo genera un segnale di comando ωp in grado di evitare batterie o altri componenti.
la collisione puntando ad un nuovo obiettivo xr, così come
descritto dall'equazione seguente: Data la semplicità di assemblaggio, grazie anche alle
istruzioni riportate nella confezione, in questa sezione ci
si occuperà esclusivamente dei motori DC e dello schema

13
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO

Figura 6: Schema sistema di controllo con rilevatore di ostacoli

Figura 4: Robot intento a navigare un corridoio

Figura 7: Schema robot che varia traiettoria per evitare l'ostacolo

anteriore e posteriore dello chassis), necessario per avere


maggiore chiarezza sulla saldatura che si andrà ad effet-
tuare di lì a poco.
Nel caso in cui non si disponga di un alimentatore rego-
labile in casa, è possibile utilizzare l'alimentazione fornita
Figura 5: Schema del robot nel mentre insegue la parete da Arduino (5V) per verificare il funzionamento dei motori
in DC.
circuitale (Figura 10) utilizzato per collegare le varie com- Quindi, è sufficiente collegare due jamper (banalmente dei
ponenti alla scheda di controllo. I sensori ad ultrasuoni, fili di rame, in dotazione anche nel kit di Arduino) rispetti-
gli HC-SR04, utilizzati per l'ispezione dello scenario sono vamente ai pin di 5V e GND di Arduino per poi poggiarli
stati già oggetto, come del resto anche la libreria utilizzata sui poli, le foglie, dei motori tenendo d'occhio la rotazione
per la gestione del ping ed i fenomeni di interferenza, di di quest'ultimo.
numerosi articoli. L'operazione va ripetuta per tutti e quattro i motori.
Su Elettronica Open Source è possibile consultare uno In Figura 8 è riportato uno screen dei collegamenti per
dei più recenti che riguarda la realizzazione di un Safety l'interconnessione dei motori, mentre in Figura 9 e 10 ne
Tutor System. è riportato lo schema circuitale seguito rispettivamente
Procediamo con la saldatura dei motori, la parte più "com- per il collegamento dei motori (fare in modo che il robot la-
plessa" da eseguire, quella che determina il movimento vori in modalità skid steering) e delle componenti dell'in-
totale del robot. Innanzitutto, bisogna identificare il senso tero sistema.
di rotazione dei motori (ciò andrà a determinare la parte La presenza di un piezo (Figura 10), componente già di-

14
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO

scusso in un precedente articolo, consente


di segnalare la presenza del robot mentre è
intento nel pattugliamento di un'area; il filtro
RC per l'acquisizione di misure sullo stato dei
motori (utilizzato solo nella fase di testing).
Ogni coppia di motori, per ragioni di spazio,
è stata rappresentata in Fritzing per mezzo di
un solo motore DC, idem per le batterie (due
9V, una per i motori, l'altra per il sistema) rap-
presentate simbolicamente con due AA (stilo,
batteria di dimensioni standardizzate).

In Figura 11 e 12 le foto del sistema finale


così realizzato. Al link è possibile visionare
Figura 8: Cablaggio motori DC per funzionamento del robot in modalità
il video che mostra il robot capace di evita-
skid steering re gli ostacoli, mentre al link quello del robot
pattugliatore.

ARDUINO MEGA
Arduino Mega 2560 (Figura 13) è un micro-
controllore basato su ATmega2560. Dotato
di 54 pin di input/output digitale (15 dei quali
possono essere utilizzati come uscite PWM),
16 ingressi analogici, 4 UART (porte seriali
per l'hardware), un oscillatore a 16 MHz (im-
portante per la generazione di segnali PWM),
un connettore USB, un jack per l'alimentazio-
ne, un ICSP ed un bottone per il reset (sem-
pre utile in caso di malfunzionamenti improv-
visi o comportamenti anomali).
Figura 9: Schema circuitale collegamento dei motori del robot Il dispositivo è compatibile con motor shield

Figura 10: Schema elettrico del sistema finale

15
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO

disegnate per Arduino UNO.


Il MEGA 2560, rispetto ad Arduino UNO, si differenzia
esclusivamente per il numero di porte messe a disposi-
zione e del numero di interrupt (del loro utilizzo se ne è
discusso all'interno di un precedente articolo).
Come la UNO, utilizza un chip ATmega16U2 programma-
to per fungere da convertitore seriale/USB così da poter
essere connessa direttamente al PC, ed è alimentato da
una tensione di funzionamento di 5 V. Il layout riprende
quello della UNO nella metà di sinistra, aggiungendo altri
connettori nella parte destra per i pin in più.
Essendo il chip della stessa famiglia AVR, ad 8 bit come
quella della UNO ed essendo il compilatore identico, i pro-
Figura 11: Foto del robot pattugliatore (vista laterale)
grammi generici scritti per la UNO girano senza modifiche
anche sulla MEGA 2560. Inoltre, il team di
sviluppo ha cercato di mantenere sui pin in
comune con la UNO le stesse funzionalità
base per cui il led integrato è sul pin 13 anche
sulla MEGA, la seriale è sulla coppia D0/D1
e così via. Solo i programmi che utilizzano
in maniera diretta l’hardware della UNO pos-
sono avere problemi di compilazione, così
come i programmi scritti specificatamente
per la MEGA 2560 possono non funzionare
sulla UNO.

In sintesi, data la "complessità" del sistema,


è stato necessario disporre di un numero
Figura 12: Foto del robot pattugliatore (vista dall'alto) maggiore di porte di input/output (alcune

Figura 13: Arduino Mega 2560

16
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO

Figura 14: Motor Shield Arduino

erano occupate dalla motor shield, quindi non disponibili) originare un incendio.
per l'acquisizione delle misure sul campo ed il pilotaggio
degli attuatori. Si rimanda al lettore per ulteriori approfondimenti sull'ar-
gomento, partendo da quanto riportato all'interno di que-
MOTOR SHIELD sto articolo.
Per il pilotaggio dei motori in continua è stata impiegata la
Motor Shield di Arduino (Figura 14). CONCLUSIONI
Basata su L298, è un ponte a quattro quadranti (co- La realizzazione di un robot pattugliatore, un progetto di
siddetto full-bridge) progettato per carichi induttivi come relativa complessità, ha consentito di analizzare tutte le
relè, motori DC e passo-passo. fasi che coinvolgono lo sviluppo di un'applicazione ro-
Data una coppia di motori in continua è possibile pilotar- botica: dall'idea, alla progettazione, sino ad arrivare alla
ne velocità e direzione, in maniera del tutto indipendente, realizzazione del sistema (con tutti i problemi annessi e
utilizzando Arduino. Inoltre, la scheda consente di misura- connessi).
re l'assorbimento di corrente di ogni motore, funzionalità
molto utile per evitare danneggiamenti oltre che per capire Si è partiti dall'idea di robot pattugliatore, accennando al
la presenza di eventuali problemi legati alla sovracorrente. suo utilizzo in contesti industriali, per poi introdurre il mo-
dello matematico che è dietro l'intero sistema, progettato
Il fenomeno (la sovracorrente) si verifica quando la cor- l'algoritmo di controllo, nonché scelti i sensori e gli attua-
rente assorbita da un carico, e quindi la potenza, supera tori (da qui sono stati analizzati collegamenti elettrici e
quella che può essere fornita e sopportata dalla linea. software) sino a mostrare i risultati sperimentali raggiunti.
Una corrente di sovraccarico può essere causata da gua-
sti, errori di progettazione o installazione, oppure da un
L’autore è a disposizione nei commenti per eventuali
errato utilizzo, ad esempio dovuto all'aver collegato troppi
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
apparecchi ad una presa multipla o una prolunga. In que- direttamente all’articolo sul Blog e partecipare alla discussione:
ste condizioni i conduttori subiscono per effetto Joule un https://it.emcelettronica.com/realizzazione-di-un-
surriscaldamento che può causare il danneggiamento del patrolling-robot-con-arduino
conduttore metallico stesso e i materiali isolanti, e si può

17
JUKEBOXINO: SCEGLI
IL TUO BRANO CON
ARDUINO di Andrea Garrapa

Sfruttare Arduino per generare dei toni attraverso un buzzer non è certo una novità. In questo progetto si è
voluto integrare diverse periferiche di ingresso e uscita per realizzare un vero e proprio jukebox. Mediante un
tastierino numerico (keypad) è possibile scorrere in un menu, visualizzato su uno schermo LCD, per selezio-
nare una tra le 3 tracce memorizzate nello sketch. La traccia selezionata viene poi eseguita per mezzo di un
buzzer. Nella sua semplicità il progetto mette insieme diverse conoscenze e applicazioni, come la creazione
di menu e sotto-menu per display LCD o l'utilizzo all'interno del codice di diverse periferiche di input/output.

INTRODUZIONE nel codice.

I
più giovani, forse, potrebbero non aver mai sentito la
parola Jukebox. Si trattava di un apparecchio instal- FUNZIONAMENTO
lato in molti luoghi pubblici che permetteva, in seguito Una volta alimentato il progetto, il display LCD visualiz-
all'introduzione di una moneta, di selezionare ed ascoltare zerà la schermata di defualt (Figura 1) in cui si chiede
una delle canzoni presenti al suo interno. Il progetto che all'utente di scegliere una delle tracce premendo o il tasto
andremo a presentare si ispira a questo dispositivo ormai 1 o il tasto 2 o il tasto 3 sul keypad. Premendo uno dei tasti
vintage, permettendo all'utente di selezionare e ascoltare si entrerà in un sotto-menu in cui sulla prima riga verrà vi-
una melodia tra quelle presenti, senza però aver bisogno sualizzato il titolo della traccia con affianco il relativo tasto
di una moneta. tra parentesi quadre.
Jukeboxino è un semplice progetto basato su Arduino. Premendo di nuovo il tasto relativo alla traccia, il buzzer
L'idea è quella di utilizzare la scheda Arduino Uno per intonerà la melodia scelta, e sul display verrà visualizzato
generare onde quadre di opportuna frequenza e durata sulla prima riga "Hai scelto la traccia" e sulla seconda
affinchè siano proporzionali alla frequenza e alla durata riga il titolo della traccia. Terminata la traccia, il display
delle note di una melodia qualsiasi. In questo modo in- tornerà a visualizzare la schermata di default.
viando l'onda quadra in ingresso ad un buzzer, esso gene- Nella seconda riga del sotto-menu sono presenti delle
rerà in successione le note della melodia. Tra una nota e frecce con accanto dei numeri.
la successiva occorrerà inserire un opportuno ritardo per Premendo sui tasti relativi a questi numeri ci si sposterà
garantire così il giusto ritmo alla melodia. Inoltre, grazie ad nei sotto-menu delle altre tracce. Mentre premendo il ta-
un display LCD e ad un tastierino numerico sarà pos- sto 0, in qualsiasi dei sotto-menu, si tornerà alla scherma-
sibile scorrere e selezionare tra le melodie memorizzate ta di default.

Figura 1: a sinistra la schermata di default, al centro il sotto-menu di selezione della traccia e a destra la visualizzazione del-
la traccia selezionata

18
JUKEBOXINO: SCEGLI IL TUO BRANO CON ARDUINO

Figura 2: schema a blocchi del progetto Jukeboxino

Figura 3: il modulo adattatore/convertitore da bus parallelo a seriale I2C utilizzato per semplificare il collegamento tra display
LCD e scheda Arduino

SCHEMA A BLOCCHI (VDD, GND), 1 pin per il controllo del contrasto


Il progetto Jukeboxino è realizzato essenzialmente per dello schermo (V0), 2 pin di controllo (Enable e
mezzo di 4 blocchi principali come riportato in Figura 2. Register Select), 1 pin opzionale per la selezione
Analizziamo ora i singoli blocchi: lettura/scrittura (R/W), e 2 pin per la retroillumina-
• Arduino Uno Rev.3 è una scheda che tutti cono- zione dello schermo (A, K). Grazie al modulo adat-
scono, una board per la prototipazione rapida in tatore/convertitore da bus parallelo a seriale I2C
grado di fornire buone prestazioni ad un prezzo (Figura 3), è possibile utilizzare solo 2 pin (SDA,
contenuto. Grazie alle numerose librerie integrabili SCL) per controllare il display, più ulteriori 2 (VCC,
con l'ambiente di sviluppo (IDE), è possibile utiliz- GND) per l'alimentazione.
zare un gran numero di periferiche semplificando • Un buzzer anche noto in italiano come cicalino è
lo sviluppo del codice. un dispositivo audio di segnalazione. Può essere
• Display LCD a segmenti da 2 righe per 16 ca- di tipo meccanico, elettromeccanico o piezoelettri-
ratteri, con annesso modulo I2C, per poter vi- co. Nel nostro caso si tratta della tipologia piezoe-
sualizzare il menu di selezione della traccia. Per lettrica. A seconda della frequenza del segnale in-
poter pilotare un tradizionale display LCD 16x2, il viato al buzzer, esso emetterà un differente suono.
numero di pin da collegare può variare da 16 a Utilizzando la funzione tone(pin,frequenza,durata)
12 a seconda che si voglia comunicare in moda- sarà possibile generare un'onda quadra della fre-
lità 4 o 8 bit. Infatti, oltre alle 8 linee dati (DB0, quenza specificata (e duty cycle del 50%) su un
..., DB7) sono presenti 2 pin per l'alimentazione pin. Se non viene specificata una durata, l'onda

19
JUKEBOXINO: SCEGLI IL TUO BRANO CON ARDUINO

continuerà fino a una chiamata della funzione no- una connessione a GND;
Tone(). • tutti i collegamenti di colore blu rappresentano l'a-
• Un tastierino numerico (keypad) con il quale se- limentazione VCC;
lezionare il numero della traccia scelta. I pulsanti • il collegamento color porpora connette il pin digi-
su un keypad sono disposti in righe e colonne. Nel tale di uscita 12 al terminale positivo del buzzer;
caso del nostro progetto si è trattato di una tastie- • il colore rosso è stato utilizzato per connettere i
ra 4x4, quindi con 4 righe e 4 colonne. Sotto ogni pin del keypad ai pin d'ingresso della scheda Ar-
tasto c'è un interruttore a membrana. Ogni riga e duino. In particolare i pin 9, 8, 7, 6 sono stati as-
colonna viene mostrata su un singolo pin, per un sociati alle righe del keypad, mentre i pin 5, 4, 3, 2
totale di 8 pin su una tastiera 4x4. Premendo un sono stati riservati alle colonne dello stesso;
pulsante si chiude l'interruttore tra una colonna • infine i collegamenti di colore grigio e bianco
e un riga, consentendo alla corrente di scorrere. sono stati dedicati per connettere i pin di control-
Arduino rileva quale pulsante è stato premuto rile- lo dell'adattatore I2C per display LCD, rispettiva-
vando il pin di riga e colonna collegati al pulsante. mente ai pin A5 e A4.
• Una breadboard.
ANALISI DELLO SKETCH
COLLEGAMENTI Analizziamo il codice dello sketch, suddividendolo in se-
In Figura 4 vengono riportati i collegamenti tra i vari com- zioni. Come al solito nella parte iniziale richiamiamo le li-
ponenti del progetto. I colori dei collegamenti sono coe- brerie utilizzate nel progetto, quella per il keypad e quella
renti tra loro, nel senso che: per lo schermo LCD. Per implementare questo progetto
• tutti i collegamenti di colore giallo rappresentano abbiamo scelto di utilizzare un display LCD con interfac-

Figura 4: configurazione dei collegamenti tra i vari componenti utilizzati nel progetto

20
JUKEBOXINO: SCEGLI IL TUO BRANO CON ARDUINO

cia I2C, semplificando così il numero dei collegamenti, per nerie: Tetris, Super Mario, Jingle Bells.
questo occorre includere la libreria LiquidCrystal_I2C.h.
Inoltre, andiamo a inizializzare la libreria attraverso il
comando LiquidCrystal_I2C lcd(), facendo attenzione a int uscita = 12; //pin digitale 12 comanda il buzzer
modificare l'indirizzo del dispositivo da 0x3F a 0x27 (che //suoneria Tetris
sono i due valori di default) nel caso il primo non dovesse
funzionare. int melodia[] = {660, 660, 660, 510, 660, 770, 380, 510,
380, 320, 440, 480, 450, 430, 380, 660, 760, 860, 700,
760, 660, 520, 580, 480, 510, 380, 320, 440, 480, 450,
#include <Keypad.h> //Libreria keypad
#include <LiquidCrystal_I2C.h> // Libreria LCD I2C 430, 380, 660, 760, 860, 700, 760, 660, 520, 580, 480,
500};
LiquidCrystal_I2C lcd(0x3F, 2, 1, 0, 4, 5, 6, 7, 3, POSI- int durata[] = {100, 100, 100, 100, 100, 100, 100, 100,
TIVE ); 100, 100, 100, 80, 100, 100, 100, 100, 80, 50, 100, 80, 50,
80, 80, 80, 80, 100, 100, 100, 100, 80, 100, 100, 100, 100,
Passiamo quindi alla configurazione del keypad. Il keypad 80, 50, 100, 80, 50, 80, 80, 80, 80, 100};
utilizzato nell'esempio è un 4x4, avente quindi 16 tasti, bi- int ritardo[] = {150, 300, 300, 100, 300, 550, 575, 450,
sognerà allora apportare le modifiche opportune nel caso 400, 500, 300, 330, 150, 300, 200, 200, 150, 300, 150,
350, 300, 150, 150, 500, 450, 400, 500, 300, 330, 150,
si utilizzi uno di dimensioni diverse (come un 4x3). Alle 300, 200, 200, 150, 300, 150, 350, 300, 150, 150, 500,
righe del keypad sono stati associati i pin digitali 6,7,8,9 300, 300};
mentre alle colonne i pin 5,4,3,2. Nel caso si volessero
impiegare configurazioni di pin differenti, ricordarsi di mo- //suoneria Super Mario

dificare le relative righe di codice. int melodia_s[] = {659, 493, 523, 587, 523, 493, 440, 440,
523, 659, 587, 523, 493, 523, 587, 659, 523, 440, 440,
440, 493, 523, 587, 698, 880, 783, 698, 659, 523, 659,
const byte ROWS = 4; //numero di righe 587, 523, 493, 493, 523, 587, 659, 523, 440, 440};
const byte COLS = 4; //numero di colonne int durata_s[] = {80, 50, 50, 80, 50, 50, 80, 50, 50, 80, 50,
char keys[ROWS][COLS] = { 50, 100, 50, 80, 80, 80, 80, 50, 50, 50, 50, 100, 50, 80, 50,
{'1','2','3','A'}, 50, 100, 50, 80, 50, 50, 80, 50, 50, 80, 80, 80, 80, 80};
{'4','5','6','B'}, int ritardo_s[] = {80, 50, 50, 80, 50, 50, 80, 50, 50, 80, 50,
{'7','8','9','C'}, 50, 100, 50, 80, 80, 80, 80, 50, 50, 50, 50, 100, 50, 80, 50,
{'*','0','#','D'} 50, 100, 50, 80, 50, 50, 80, 50, 50, 80, 80, 80, 80, 120};
};
//suoneria Jingle bells
byte rowPins[ROWS] = {6, 7, 8, 9}; //pin associati alle righe
byte colPins[COLS] = {5, 4, 3, 2}; //pin associati alle colon- int melodia_j[] = {20, 20, 20, 20, 20, 20, 20, 25, 16, 18, 20,
ne 22, 22, 22, 22, 22, 20, 20, 20, 18, 18, 20, 18, 25};
int durata_j[] = {200, 200, 400, 200, 200, 400, 200, 200,
Keypad keypad = Keypad( makeKeymap(keys), rowPins, 200, 200, 400, 200, 200, 200, 200, 200, 200, 200, 200,
colPins, ROWS, COLS ); //istanzia un oggetto keypad 200, 200, 200, 200, 200, 400, 400};
int ritardo_j[] = {400, 400, 800, 400, 400, 800, 400, 400,
400, 400, 800, 400, 400, 400, 400, 400, 400, 400, 400,
Per inviare l'onda quadra in ingresso al buzzer è stato 400, 400, 400, 400, 400, 800, 800};
scelto il pin 12. In questa sezione del codice abbiamo im-
postato le suonerie che il nostro Jukeboxino comporrà.
Per ogni suoneria occorre definire 3 vettori: Proseguiamo inizializzando tre contatori, che utilizzere-
1. vettore melodia[] che raccoglie le frequenze (Hz) mo dopo, la porta seriale e il display LCD con l'opportuno
associate alle singole note; numero di colonne e righe. Nel nostro esempio, il display
2. vettore durata[] che raccoglie la durata (ms) per è un 16x2.
ogni singola nota;
3. vettore ritardo[] dove sono indicati gli intervalli int counter1 = 0;
int counter2 = 0;
temporali (ms) di silenzio tra la fine di una nota e int counter3 = 0;
l'inizio della successiva.
void setup() {
I vettori per ogni singola suoneria devono essere tutti delle
Serial.begin(9600);
stesse dimensioni. Questi parametri si possono facilmen- lcd.begin(16,2);
te trovare su internet. Nel nostro esempio vi sono tre suo- }

21
JUKEBOXINO: SCEGLI IL TUO BRANO CON ARDUINO

void loop() {

char key = keypad.getKey(); //ritorna il valore del tasto che è stato premuto

if(counter1 == 0 && counter2 == 0 && counter3 ==0){


lcd.setCursor(0,0);
lcd.print("Scegli Traccia");
lcd.setCursor(0,1);
lcd.print("[1][2][3]");
}

if(key == '1') {
Serial.println(key);
counter1++;
counter2=0;
counter3=0;

if(key == '1' && counter1 == 1){


lcd.clear();
lcd.setCursor(0,0);
lcd.print("[1]Tetris");
lcd.setCursor(0,1);
lcd.print("<-[3] [0] [2]->");}

if(key == '1' && counter1 == 2){


lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hai scelto");
lcd.setCursor(0,1);
lcd.print("Tetris");
int size = sizeof(melodia_s)/sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
tone(uscita, melodia_s[thisNote], durata_s[thisNote]*2);
delay(ritardo_s[thisNote]*4);
}
counter1=0;
}
}

if(key == '2'){
Serial.println(key);
counter2++;
counter1=0;
counter3=0;

if(key == '2' && counter2 == 1){


lcd.clear();

22
JUKEBOXINO: SCEGLI IL TUO BRANO CON ARDUINO

lcd.setCursor(0,0);
lcd.print("[2]Mario Bros");
lcd.setCursor(0,1);
lcd.print("<-[1] [0] [3]->");}

if(key == '2' && counter2 == 2){


lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hai scelto");
lcd.setCursor(0,1);
lcd.print("Mario Bros");
int size = sizeof(melodia)/sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
tone(uscita, melodia[thisNote], durata[thisNote]*2);
delay(ritardo[thisNote]);
}
counter2=0;

}
}

if(key=='3'){
Serial.println(key);
counter3++;
counter2=0;
counter1=0;

if(key == '3' && counter3 == 1){


lcd.clear();
lcd.setCursor(0,0);
lcd.print("[3]Jingle bell");
lcd.setCursor(0,1);
lcd.print("<-[2] [0] [1]->");}

if(key == '3' && counter3 == 2){


lcd.clear();
lcd.setCursor(0,0);
lcd.print("Hai scelto");
lcd.setCursor(0,1);
lcd.print("Jingle Bell");
int size = sizeof(melodia_j)/sizeof(int);
for (int thisNote = 0; thisNote < size; thisNote++) {
tone(uscita, melodia_j[thisNote], durata_j[thisNote]*2);
delay(ritardo_j[thisNote]);
}
counter3=0;
}

23
JUKEBOXINO: SCEGLI IL TUO BRANO CON ARDUINO

}
if(key=='0'){
counter1=0;
counter2=0;
counter3=0;}

Passiamo quindi al cuore del codice, ovvero il loop(). dia. La scelta della melodia avviene mediante un tastie-
1. Quando un tasto viene premuto, la funzione rino numerico ed un display LCD, con i quali scorrere in
getKey() metterà il suo valore (char) relativo al tasto un menu dove sono visualizzabili e selezionabili tutte le
nella variabile key. tracce presenti nel codice dello sketch. La suoneria pre-
2. Se tutti e tre i contatori sono a 0, sulla prima riga scelta viene quindi eseguita per mezzo di un buzzer che
del display comparirà la frase "Scegli Traccia" e sulla trasforma l'onda quadra generata, opportunamente, del-
seconda riga "[1][2][3]". Ovvero l'utente è invitato a la scheda in suono. Sebbene completo e funzionante, il
scegliere una tra le tre suonerie possibili associate ai progetto si presta a molti miglioramenti, soprattutto nello
tasti 1, 2 e 3. sketch, di cui ne citiamo alcuni:
3. A seconda del valore assunto dalla variabile, e quin- • interruzione della traccia in esecuzione - infatti,
di del tasto premuto sul keypad, si salterà alla sot- una volta in esecuzione occorre aspettare la fine
to-routine corrispondente. Per semplicità analizzere- della traccia per poterne scegliere un'altra. Biso-
mo solo la prima di esse, essendo le altre identiche gnerebbe implementare un modo per interrompe-
tranne che per i parametri contenuti. re l'esecuzione;
4. Se alla variabile key è associato il valore char "1" allo- • migliorare il caricamento delle tracce - il cari-
ra il contatore "counter1" viene incrementato e gli altri camento delle tracce attraverso i vettori melodia,
posti a zero. A questo punto se "counter1" ha valore durata e ritardo può risultare difficoltoso, soprattut-
1, la schermata del display cambierà: sulla prima riga to per brani lunghi. Inoltre, i tre vettori non sempre
avremo "[1]Tetris", mentre sulla seconda "<-[3] [0] [2]- sono disponibili per tutte le melodie;
>" . Premendo il tasto 0, tutti i contatori vengono azze- • migliorare la visualizzazione - il display LCD
rati tornando così al punto 1 (menu di default), mentre 16x2 non permette di inserire delle descrizioni
premendo i tasti 3 e 2 ci si muoverà nei sotto-menu chiare ed esaustive, a causa del numero limitato
delle altre tracce. di segmenti;
5. Se invece viene premuto nuovamente il tasto 1, il • aggiungere opzione esecuzione continua - si
contatore "counter1" verrà incrementato ulterior- potrebbe pensare di aggiungere allo sketch un'op-
mente assumendo valore 2, avviando così l'ultima zione per far suonare le tracce in sequenza per
parte della sotto-routine. Sullo schermo LCD apparirà poi ripartire dopo una breve pausa. Ad esempio,
la scritta "Hai scelto" "Tetris", e inizierà il ciclo for del- durante le festività natalizie si potrebbero inserire
la relativa suoneria. Grazie alla funzione tone() ver- solo brani natalizi, per avere un sottofondo musi-
rà generata un'onda quadra sul pin di uscita, la cui cale vicino l'albero.
frequenza e durata corrispondono ai parametri della
melodia scelta. Al termine della suoneria il relativo ALLEGATI
contatore viene posto a 0, ed è quindi possibile sce- Download Sketch
gliere una nuova traccia (ovvero si ritorna nel menu di
default).
L’autore è a disposizione nei commenti per eventuali
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
CONCLUSIONI direttamente all’articolo sul Blog e partecipare alla discussione:
In questo articolo è stato presentato il progetto Jukeboxi- https://it.emcelettronica.com/jukeboxino-scegli-il-tuo-
no, un semplice dispositivo basato sulla scheda Arduino brano-con-arduino
Uno, che permette di selezionare e ascoltare una melo-

24
GIOCHIAMO CON
ARDUINO: STRUMENTO
MUSICALE AD
ULTRASUONI “NO TOUCH” di Angelo Montanaro

Questo semplice progetto è nato durante un corso sull'utilizzo di Arduino con i miei alunni ed ha preso
spunto dall'uso dei sensori ad ultrasuoni per il parcheggio delle automobili nei quali viene emesso un suono
tanto più acuto (a frequenza maggiore) quanto minore è la distanza che separa il nostro paraurti da quello
dell’automobile vicina. L’idea è stata quella di realizzare uno “strumento musicale” che emette le note con
il solo movimento del palmo della mano del “musicista”. Aumentando la distanza della mano dal sensore,
aumenta la frequenza emessa da un buzzer, ovvero da un componente elettronico in grado di generare toni
ed utilizzato spesso per attirare l'attenzione. Chiaramente, con questo metodo non è possibile generare del-
le frequenze precise che corrispondono ad altrettante note, quindi non si tratta di uno strumento musicale
degno di questo nome, ma di una sperimentazione didattica che consente di acquisire nozioni di elettronica
giocando.

PRINCIPIO DI FUNZIONAMENTO La distanza rilevata in centimetri dal sensore viene molti-

D
opo aver realizzato il progetto ho effettuato una ri- plicata per un coefficiente per ottenere la frequenza da in-
cerca a ritroso scoprendo che l'idea di realizzare viare al buzzer. E’ stato utilizzato un interruttore o seletto-
uno strumento musicale in grado di emettere un re a tre posizioni, tramite il quale scegliere due coefficienti
suono senza alcun contatto con il musicista nacque agli diversi e quindi suonare con due gamme di frequenze. In
inizi del 1900 e prese il nome (anche se francesizzato) particolare, se il selettore è nella posizione 0 (centrale) il
del suo ideatore Theremin. Con questo strumento formato buzzer è disabilitato; in questo modo eviteremo il suono
da due oscillatori ad alta frequenza, il musicista, muoven- continuo dello strumento che si attiverebbe in presenza
do delicatamente le mani vicino a due antenne, con una della sola alimentazione. Se il selettore è nella posizio-
ne controlla il volume, e con l'altra la frequenza dei suoni ne 1 il software moltiplica il numero di centimetri per un
emessi. Oggi la stessa idea può essere realizzata aven- coefficiente di valore = 20 e quindi le frequenze generate
do la possibilità di utilizzare microcontrollori e sensori a varieranno da 0 Hz, quando la mano è a contatto con il
basso costo. In un articolo pubblicato sul blog di Elettro- sensore, fino alla frequenza ottenuta dal prodotto della di-
nica Open Source, l'autore ha illustrato il progetto di uno stanza massima in cm, dalla mano del musicista al piano
strumento musicale che emette frequenze diverse in base di appoggio del sensore, moltiplicata x 20 (opzione bassa
all'intensità luminosa rilevata da una fotoresistenza. Per frequenza segnalata dall’accensione del LED giallo). Se,
poter ridurre al minimo i costi, nel nostro progetto abbiamo infine, il selettore è nella posizione 2 il software moltiplica
utilizzato Arduino Uno e alcuni componenti facilmente il numero di centimetri per un coefficiente di valore = 50
reperibili: un sensore ultrasonico HC-SR04, un buzzer o e quindi le frequenze generate varieranno da 0 Hz quan-
cicalino piezoelettrico (presente nei vari kit di Arduino), un do la mano è a contatto con il sensore fino alla distanza
interruttore a tre posizioni, due diodi LED di colore diverso massima x 50 (opzione alta frequenza segnalata dall’ac-
e due resistori da 220 Ω. Attraverso questi componenti censione del LED rosso). A seconda della scala scelta,
abbiamo realizzato il semplice strumento musicale. la frequenza massima dipenderà chiaramente dall’altezza

25
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

Figura 1: principio di funzionamento del sensore ad ultrasuoni

del piano su cui poggia lo strumento e dall’altezza del mu- Si può riscontrare comunque la presenza del coefficiente
sicista. di correzione 0,6 moltiplicato per la temperatura presente
nell’ambiente il cui valore, nel nostro caso, è costante e
COMPONENTI UTILIZZATI fissato a 20°C. Se volessimo essere più precisi, ci baste-
Sensore ultrasonico HC-SR04: come illustrato in Figu- rebbe quindi aggiungere nel progetto l’acquisizione della
ra 1, il funzionamento del nostro sensore a quattro pin temperatura da memorizzare in una variabile che andreb-
consiste nell’inviare attraverso lo spazio un segnale sono- be sostituita al valore costante 20.
ro trasmesso utilizzando il pin Trigger Pulse a 40 kHz, e Il sensore scelto ha un range di misura da 2 cm a 4 m,
quindi ben al di sopra della soglia massima udibile dall’uo- un angolo di misura di 15 gradi e, come si può notare in
mo che teoricamente è dell’ordine di 20 kHz, ma scende Figura 2, utilizza 4 pin: 2 per l’alimentazione e 2 per gli
drasticamente all’aumentare dell’età. Tale frequenza, non impulsi sonori in trasmissione e ricezione:
essendo percepita dall’orecchio umano, evita di disturbar- • 5 V Supply;
ci durante il funzionamento del dispositivo. Questo segna- • Trigger Pulse Input;
le sarà poi riflesso da eventuali ostacoli, tornerà indietro • Echo Pulse Output;
e sarà ricevuto tramite il pin Echo Pulse. Conoscendo la • 0 V Ground.
velocità del suono (circa 340 m/s a 20°C) e misurando il
tempo impiegato dallo stesso per percorrere la distanza di Il sensore HC-SR04 funziona ascoltando l’eco dei suo-
andata e ritorno, è possibile calcolare la distanza percorsa ni, per cui deve essere posizionato in modo appropria-
utilizzando la formula: to evitando che il suono rimbalzi contro un finto ostacolo
come, ad esempio, il bordo della breadboard utilizzata per
spazio = velocità x tempo il montaggio dei componenti o un tavolo. Inoltre, il musici-
sta dovrebbe mantenere la sua mano quanto più possibi-
Il suono si muove più velocemente quando fa più caldo, le perpendicolare al trasmettitore del sensore per evitare
ma in questa prima versione del progetto non è nostro che una superficie inclinata rifletta il suono, deviandolo
interesse una misura precisa della distanza e quindi ci ac- dalla direzione desiderata.
contentiamo di misurarla senza tener conto del fattore di Buzzer o cicalino piezoelettrico: è un componente elet-
correzione dovuto alla variazione di temperatura e suppo- tronico in grado di generare toni sfruttando l'effetto piezo-
nendo che sia costante e pari a 20°C. elettrico di un cristallo contenuto all’interno del dispositivo.
Nello sketch la costante velocità è definita come: const La vibrazione del cristallo, provocata da una variazione
float v=331.5+0.6*20. di tensione, fa vibrare l’aria e quindi genera un suono.

26
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

Figura 2: sensore ad ultrasuoni HC-SR04

Ad esempio, applicando, con il comando digitalWrite, ai in corrispondenza di quasi tutte le istruzioni. Analizziamo-
terminali del buzzer un’onda quadra di tensione variabi- lo per gli aspetti principali: la prima parte è dedicata alla
le tra il valore HIGH (5 V su Arduino) e LOW (0 V) esso dichiarazione dei pin utilizzati nel progetto tramite costanti
emetterà un suono. Nel nostro sketch abbiamo utilizzato globali di tipo intero. Abbiamo utilizzato due pin per l'inter-
la funzione incorporata e più potente tone (pin, frequenza, ruttore o selettore (2 e 3), due pin per i LED (10 e 11), due
durata) che genera un tono dal pin indicato alla frequenza per il sensore ad ultrasuoni (7 e 8) ed uno per il buzzer (9).
voluta espressa in herz. Il parametro durata è opzionale e Infine, la dichiarazione della costante v di tipo float con-
rappresenta la durata del tono espressa in millisecondi. Il tiene la velocità del suono espressa in metri al secondo:
pin di Arduino utilizzato come output deve essere collega- al valore costante 331.5 si aggiunge un fattore di corre-
to al terminale positivo del componente visibile in Figura zione (0.6) che si moltiplica per la temperatura ambiente
3. espressa in gradi centigradi (nel nostro caso supponiamo
Interruttore a tre posizioni: un interruttore a tre posizioni, valga 20 °C). La velocità è di circa 340 m/s 0 1200 km/h.
in Figura 4 potete vederne un esempio, (a volte definito Le costanti e le variabili definite in questa sezione hanno
ON-OFF-ON o SPTT) presenta 3 PIN: il comune (centrale validità globale, cioè possono essere utilizzate in tutte le
o posizione 0) e i due di uscita (posizioni 1 e 2). Quando sezioni che compongono il programma.
la levetta è in alto o in basso, il PIN comune è connesso
ad uno dei due PIN di uscita; quando la levetta è in po-
sizione centrale, il PIN comune non è connesso a nulla. PROGETTO Strumento ad ultrasuoni No_Touch Versio-
LED di colore giallo e rosso: abbiamo utilizzato due ne 1.0 - ANGELO MONTANARO
LED che segnalano la posizione dell’interruttore ciascuno
dei quali collegato in serie ad un resistore di 220 Ω per // Dichiarazione dei pin utilizzati
limitare la corrente; posizione 0 LED spenti, posizione const int SwitchBf=2; // 1.
1 LED giallo acceso e LED rosso spento (opzione bassa const int SwitchAf=3; // 2.
frequenza), posizione 2 LED giallo spento e LED rosso const int ledBf=10; // 3.
acceso (opzione alta frequenza).
const int ledAf=11; // 4.
const int trigPin = 8; // 5.
REALIZZAZIONE DEL PROGETTO
const int echoPin = 7;
Circuito elettrico
const int buzzerPin=9; // 6.
In Figura 5 trovate il circuito elettrico di una prima versio-
ne del progetto realizzato con fritzing, mentre in Figura 6
la foto del primo prototipo. const float v=331.5+0.6*20; // m/s
Sketch: lo sketch è spiegato tramite i commenti presenti

27
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

Nella seconda parte dello sketch, dedicato al setup, ab-


biamo impostato i pin, definiti nella sezione precedente, al
funzionamento come input o output ed inizializzato la co-
municazione seriale con velocità di 115200 bit/s. In questo
modo potremo leggere nel monitor seriale dell’IDE di Ar-
duino i valori di distanza rilevati dal sensore e le frequenze
emesse dal buzzer.

void setup()
{

// Impostazione dei pin d'ingresso/uscita e comunica-


zione seriale
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
Figura 3: buzzer piezoelettrico pinMode (SwitchBf, INPUT);
pinMode (SwitchAf, INPUT);
pinMode (ledBf, OUTPUT);
Commenti alla prima parte: pinMode (ledAf, OUTPUT);
1. Il pin 2 è stato collegato allo switch a tre posizioni pinMode (buzzerPin, OUTPUT);
digitalWrite (SwitchBf, HIGH);
per selezionare la posizione 1 che corrisponde alla
digitalWrite (SwitchAf, HIGH);
selezione dell’intervallo di bassa frequenza.
Serial.begin(115200);
2. Il pin 3 è stato collegato allo switch a tre posizioni
}
per selezionare la posizione 2 che corrisponde alla
selezione dell’intervallo di alta frequenza.
3. Il pin 10 è stato collegato al LED giallo per visua- La terza parte è quella eseguita in modo ciclico perché
lizzare l’intervallo selezionato - bassa frequenza. presente nella funzione loop.
4. Il pin 11 è stato collegato al LED rosso per visualiz- La prima istruzione è una chiamata della funzione distan-
zare l’intervallo selezionato - alta frequenza. ceM che calcola la distanza della mano del musicista
5. I pin 7 e 8 sono stati collegati rispettivamente al pin dallo strumento musicale ed è presente nella successiva
Echo e al pin Trigger del sensore HC-SR04. sezione: il valore restituito dalla funzione è memorizzato
6. Il pin 9 è stato collegato al terminale positivo del nella variabile di tipo intero d. Nelle variabili SelettoreBf
buzzer. e SelettoreAf sarà memorizzata la posizione dell'interrut-
tore. Nelle variabili frequenza, durataNota e pausa sa-
ranno memorizzate: la frequenza calcolata
ed espressa in hertz, la durata della singola
nota e la pausa fra una nota e la successiva
espresse in millisecondi.
Tramite delle istruzioni condizionali (if) se l'in-
terruttore è in posizione 1 si accende il cor-
rispondente LED e la frequenza è calcolata
moltiplicando la distanza rilevata dal sensore
per un moltiplicatore (20), mentre la durata
della nota e la pausa sono impostate a 250
ms; se l'interruttore è in posizione 2, la fre-
quenza è pari alla distanza per il coefficiente
50 con durata e pausa uguali a 125 ms. Se
l'interruttore è in posizione 0 lo strumento è in
Figura 4: interruttore a tre posizioni pausa con entrambi i LED spenti.

28
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

Figura 5: circuito elettrico Versione 1.0

void loop()
{ Commenti alla terza parte:
1. Se l’interruttore è in posizione 1 (bassa frequenza).
int d=distanceM(); 2. Accende il LED di bassa frequenza.
int SelettoreBf=digitalRead(SwitchBf);
int SelettoreAf=digitalRead(SwitchAf); 3. Calcola la frequenza f moltiplicando la distanza d
int frequenza; per la costante 20.
int durataNota; 4. 250 millisecondi che corrispondono ad 1/4 di battuta.
int pausa;
5. Genera nota con frequenza e durata assegnata.
if (SelettoreBf==1 && SelettoreAf==0) { // 1. 6. Definisce pausa per la nota successiva.
digitalWrite(ledBf,HIGH); // 2. 7. Se l’interruttore è in posizione 2 (alta frequenza).
digitalWrite(ledAf,LOW);
frequenza = d*20; 8. Accende il LED di alta frequenza.
// 3. 9. Calcola la frequenza f moltiplicando la distanza d
durataNota=250; // 4. per la costante 50.
tone(buzzerPin,frequenza,durataNota);
// 5. 10. 125 millisecondi che corrispondono ad 1/8 di battuta.
pausa=durataNota*1.0; 11. Genera una nota con frequenza e durata assegnata.
// 6. 12. Definisce la pausa per la nota successiva.
delay(pausa);
} 13. Se l’interruttore è in posizione 0 emette nota di fre-
else if (SelettoreBf==0 && SelettoreAf==1) { // 7. quenza e durata zero e spegne entrambi i LED.
digitalWrite(ledAf,HIGH); // 8.
digitalWrite(ledBf,LOW);
frequenza=d*50; // 9. Nella quarta ed ultima parte sono presenti quattro istru-
durataNota=125; // 10. zioni, all'interno del void loop, che visualizzano sul monitor
tone(buzzerPin,frequenza,durataNota); seriale i valori di distanza rilevata dal sensore e frequenza
// 11.
pausa=durataNota*1.0; calcolata in base alla posizione dell'interruttore. Succes-
// 12. sivamente è presente la funzione che legge la distanza
delay(pausa); utilizzando il sensore HC-SR04. Tramite il pin di Trigger
}
else { è trasmesso un impulso rettangolare (valore basso della
// 13. durata di 3 µs (3*10-6 secondi = 3 milionesimi di secondo),
frequenza=0; utile affinché il pin si stabilizzi, e valore alto della durata di
durataNota=0;
digitalWrite(ledBf,LOW); 5 µs che rappresenta il segnale sonoro che dovrà essere
digitalWrite(ledAf,LOW); rilevato dal pin Echo in ricezione. La funzione PulseIn re-
} stituisce il tempo in microsecondi che impiega l'impulso a

29
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

Figura 6: collegamento elettrico dei componenti Versione 1.0

percorrere la distanza di andata e ritorno e lo memorizza 2. Invia l'impulso sonoro.


nella variabile tUs di tipo float. Infine, questo valore è tra- 3. In ascolto dell’eco.
sformato in secondi e diviso per due per ottenere il tempo 4. Tempo in microsecondi.
necessario alla percorrenza del solo percorso di andata 5. Tempo in secondi.
o ritorno e la distanza è calcolata prima in metri e poi in 6. Distanza in metri.
centimetri. 7. Distanza in centimetri.

Serial.print("Distanza= "); // 1. In Figura 7 è rappresentato il circuito elettrico di una nuo-


Serial.print(d, DEC); va versione del progetto, nella quale abbiamo sostituito
Serial.print(" - Frequenza= "); all’interruttore un potenziometro da 10 kΩ realizzando uno
Serial.println(frequenza, DEC); strumento sicuramente più versatile. In questo modo le
due gamme di frequenza (bassa e alta) sono state sosti-
}
tuite da un intervallo variabile il cui valore dipende dalla
posizione del potenziometro. Il valore analogico acquisito
float distanceM(){ // 2.
dal potenziometro modula, in tre modi diversi e utilizzan-
digitalWrite(trigPin, LOW);
delayMicroseconds(3); do la funzione map(), il valore analogico da inviare ad un
digitalWrite(trigPin, HIGH); unico LED, il valore della frequenza e la durata della nota
delayMicroseconds(5); da inviare al cicalino.
digitalWrite(trigPin, LOW);
// 3. CONCLUSIONI
float tUs = pulseIn(echoPin, HIGH); // 4. A conclusione del lavoro, emerge in modo evidente la sua
float t = tUs / 1000.0 / 1000.0 / 2; // 5. valenza didattica. Il progetto, infatti, ha avuto l'obiettivo di
float d = t*v; // 6. avvicinare i ragazzi all'elettronica stimolando in loro la fan-
return d*100; // 7. tasia nelle sue innumerevoli applicazioni. L’entusiasmo di-
}
mostrato dagli studenti nella realizzazione dello strumento
è stato notevole e ha permesso l’acquisizione “ludica” di
Commenti alla quarta ed ultima parte: concetti basilari dell’elettronica. Inoltre, il progetto rappre-
1. Visualizza su monitor seriale distanza e frequen- senta un punto di inizio e si presta ad ulteriori modifiche
za. ed evoluzioni. Si potrebbe, ad esempio, suddividere il ran-

30
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

Figura 7: circuito elettrico Versione 2.0

/*
PROGETTO Strumento ad ultrasuoni No_Touch Versione 2.0 - ANGELO MONTANARO
*/

// Dichiarazione dei pin utilizzati

const int led=10; // Led per visualizzare il valore di frequenza


const int trigPin = 8; // Sensore ad ultrasuoni
const int echoPin = 7;
const int buzzerPin=9; // Buzzer

float v=331.5+0.6*20; // m/s 1)

void setup()
{
// Impostazione dei pin d'ingresso/uscita e seriale
pinMode(trigPin, OUTPUT);
pinMode(echoPin, INPUT);
pinMode (led, OUTPUT);
pinMode (buzzerPin, OUTPUT);

Serial.begin(115200);
}

void loop()
{

int d=distanceM();
int frequenza=0;
int durataNota=0;
int pausa=0;
int modLed=0;
int modFrequenza=0;

int potenziometro = analogRead(A0); // 2)


modLed=map(potenziometro,0,1023,0,200);
analogWrite(led,modLed);
modFrequenza=map(potenziometro,0,1023,0,100);

31
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”

durataNota=map(potenziometro,0,1023,125,250);
frequenza = d*modFrequenza;
tone(buzzerPin,frequenza,durataNota); // Genera nota con frequenza e durata assegnata
pausa=durataNota*1.0; // Definisce pausa per la nota successiva
delay(pausa);

Serial.print("Distanza= "); // Visualizza su monitor seriale distanza e frequenza


Serial.print(d, DEC);
Serial.print(" - Frequenza= ");
Serial.println(frequenza, DEC);
}

float distanceM(){ // 3)
// Invia l'impulso sonoro 4)
digitalWrite(trigPin, LOW);
delayMicroseconds(3);
digitalWrite(trigPin, HIGH);
delayMicroseconds(5);
digitalWrite(trigPin, LOW);
// In ascolto dell'eco
float tUs = pulseIn(echoPin, HIGH); // tempo in microsecondi 5)
float t = tUs / 1000.0 / 1000.0 / 2; // tempo in secondi 6)
float d = t*v; // distanza in m
return d*100; // distanza in cm
}

/* NOTE
* 1) Calcola la velocità del suono alla temperatura di 20°C (se la temperatura ambiente è molto diversa,
* basterà cambiare il valore 20 con la temperatura ambiente espressa in gradi centigradi. La velocità è
* di circa 340 m/s o 1200Km/h.
* 2) Il valore analogico acquisito dal potenziometro modula, in tre modi diversi, utilizzando la funzione map,
* il valore analogico da inviare al led, il valore della frequenza e la durata della nota.
* da inviare al cicalino.
* 3) Funzione che legge la distanza tramite il sensore HC_SR04.
* 4) Impulso rettangolare (valore basso della durata di 3ms - valore alto della durata di 5 ms - valore basso).
* 5) La funzione pulseIn restituisce il tempo in microsecondi che impiega l'impulso a percorrere la distanza
* di andata e ritorno (misura il tempo che intercorre tra echoPin=LOW e echoPin=HIGH.
* 6) Tempo in secondi necessario alla percorrenza del solo percorso di andata o ritorno.
*/

ge spaziale, misurato dal sensore, in intervalli ed associa- In tal modo potrebbe avere un migliore utilizzo nel campo
re a ciascuno di essi una frequenza sonora precisa (nota). musicale oppure trovare applicazione nella costruzione di
giocattoli sonori. Alla fine dell’articolo ho inserito un video
dal quale potrete valutare l’efficacia e la “qualità sonora”
dello strumento.

Bibliografia: Sensori per maker: progetti ed esperimenti


per misurare il mondo con Arduino e Raspberry Pi (T. Kar-
vinen, K. Karvinen, V. Valtokari)

L’autore è a disposizione nei commenti per eventuali


approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
direttamente all’articolo sul Blog e partecipare alla discussione:
https://it.emcelettronica.com/giochiamo-con-arduino-
strumento-musicale-ad-ultrasuoni-no-touch

32
SMART POT SENSOR:
IOT APPLICATO
ALL’AGRICOLTURA
(PARTE 1) di Daniele Valanzuolo

La filosofia dell’Internet delle Cose (IoT) sta da un decennio rivoluzionando ogni ambito, introducendo tec-
nologia e digitalizzazione anche in quei settori che sono sempre stati dei “dinosauri”. Nonostante le sue
peculiarità rurali, tra questi settori ritroviamo anche l’agricoltura. Infatti, soprattutto grazie al contributo
innovativo di tantissimi giovani che vogliono innovare e rinnovare i vecchi business di famiglia, nel settore
dell’agricoltura o più in generale dell’agroalimentare sono state introdotte nuove tecnologie produttive.

INTRODUZIONE • monitorare il fabbisogno idrico per l’irrigazione

O
ggigiorno la tecnologia IoT non si applica solo dei campi in modo tale da ottimizzare le risorse
agli impianti industriali, e la rivoluzione in essere idriche, nonché migliorare lo sviluppo delle colture;
dell’Industry 4.0 ha contagiato tutti i settori: anche • monitorare i parametri biochimici del suolo per
quello dell’agricoltura. L’introduzione di innovazione tec- valutare i processi di concimazione o definire con
nologica e digitalizzazione in questo settore ha portato a precisione i cicli delle differenti colture;
raggiungere livelli di eccellenza della filiera agroalimenta- • monitorare i parametri ambientali;
re attraverso la tracciabilità, l’agricoltura di precisione, • prevenire patologie delle colture;
l’ottimizzazione delle risorse, il monitoraggio di vaste aree • prevenire infestanti;
di coltivazione, e via dicendo. • individuare principi di incendio e intervenire tem-
Seppur il settore risulta ancora di nicchia, le aziende che pestivamente per la salvaguardia di boschi e col-
hanno adottato questo processo di rinnovamento riscon- ture;
trano benefici in termini di sinergia delle risorse al fine di • monitorare lo stato di salute dei capi di bestiame
evitare lo spreco per un mondo sempre più “green”. Come allo stato brado.
in un’industria metallurgica è importante preparare e pia-
nificare i cicli di produzione al fine di ottimizzare l’azienda, Dunque, l’adozione delle tecnologie innovative in ambito
ridurre gli sprechi e i tempi morti e costi di produzione, così agroalimentare consente di ottenere benefici sia di tipo
anche le grandi aziende agroalimentari ricorrono sempre qualitativo (incrementando la qualità del prodotto e del
più a soluzioni tecnologiche per la corretta pianificazione processo) che quantitativo (con l’incremento delle produ-
delle proprie colture, dalla preparazione del fondo, alla se- zioni).
mina, fino al raccolto. Inoltre, anche i consumatori finali
e la grande distribuzione trovano vantaggi attraverso la IL PROGETTO
tracciabilità, in modo da fornire dati dettagliati di tutto il Passiamo ora al nostro progetto, infatti, in questo articolo
processo dell’agroalimentare, dalla raccolta, al confezio- realizzeremo uno Smart Pot Sensor, ossia un sensore
namento fino alla distribuzione. intelligente per monitorare il vaso di una piantina che vo-
Dunque, la fusione dell’agricoltura di precisione con l’in- gliamo far crescere rigogliosa. Il progetto è stato concepi-
novazione tecnologica dell’IoT, o meglio ancora dell’In- to in modo tale che possa essere realizzato ed utilizzato
ternet of Farming, consente i seguenti benefici: da ognuno di noi. Quasi tutti noi abbiamo una pianta in

33
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 1)

le mie intenzioni sono di proporre un oggetto alla portata


di tutti, ho pensato di realizzarlo con una scheda che tutti
conosciamo: Arduino. Nel caso specifico farò riferimento
ad Arduino UNO, ma il progetto ben si presta ad essere
implementato con altre schede della famiglia Arduino e/o
compatibili. Con un effort leggermente maggiore è possi-
bile implementare il progetto con qualsiasi altra scheda
a microcontrollore che avete a disposizione o che usate
abitualmente.
Inoltre, il nostro Smart Pot Sensor per rendere un vaso
intelligente sarà dotato dei seguenti sensori:
• Sensore di umidità terreno
• Sensore di umidità dell’aria
• Temperatura ambientale
Figura 1. Esempio di sensore economico di umidità terreno
• Sensore di pioggia
• Sensore di luminosità

Sensore di umidità del terreno

Quando si vuole far crescere rigogliosa una qualsiasi


pianta, sia essa in vaso che in giardino, è molto impor-
tante monitorare l’umidità del suolo o del terriccio, per va-
lutare quando irrigare la pianta e limitando gli eccessi da
entrambi i lati (terreno troppo bagnato o terreno troppo
secco). In commercio si trovano a prezzi ridicoli tantissimi
sensori per poter monitorare l’umidità del terreno come
quello riportato in Figura 1. Questi sensori hanno una par-
ticolare forma a forchetta che va infilata nel terreno.
Ma come funzionano? Il principio di funzionamento è mol-
Figura 2. Sensore di pioggia to semplice ed è basato su una misura resistiva. Il terreno,
infatti, cambia la propria resistenza elettrica in funzione
della percentuale di acqua presente al suo interno. L’ele-
vaso in balcone o in cortile, i più fortunati hanno anche un mento sensibile del sensore è dotato di un piccolo trasdut-
piccolo giardino; in ogni caso la problematica per tutti noi tore che serve a far circolare una corrente tra i due elettro-
è dovere gestire l’innaffiatura per non fornire alla pianta di inseriti nel terreno. Il trasduttore, standard e conosciuto
troppa o poca acqua. Ci cimenteremo nella realizzazione da chi smanetta con i sensori Arduino, è dotato di due
di un sensore intelligente che sia in grado di darci indica- LED e di un potenziometro con cui è possibile regolare
zioni sulla necessità di innaffiare o meno le nostre piante, la soglia di scatto per il segnale digitale. L’interfaccia con
sia quando sono in vaso sul nostro balcone, sia quando questo sensore ha 4 pin a cui corrispondono:
sono in giardino. In realtà, per far crescere rigogliosa una • Alimentazione e GND
pianta floreale, un bonsai e quant’altro non è importante • Uscita analogica 0-5 V
solo la quantità di acqua, ma anche la temperatura am- • Uscita digitale
bientale, l’umidità e l’irraggiamento. Ogni pianta, infatti,
presenta caratteristiche diverse e necessità vitali differen- Sensore di pioggia
ti.
Il secondo sensore che andremo ad utilizzare è un senso-
MATERIALE OCCORRENTE re di pioggia. Questo è realizzato in maniera molto simile
La fase di concezione di un nuovo dispositivo parte sem- al sensore di terreno, ma anziché avere due elettrodi si
pre dalla scelta della tecnologia da utilizzare. Visto che presenta con una piastra, simile alla Figura 2, sulla quale

34
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 1)

Tra i vari parametri da monitorare per far crescere rigo-


gliosa una pianta troviamo sicuramente la temperatura e
l'umidità dell'aria. Infatti, in funzione della tipologia della
pianta e del clima a cui è abituata, questi due parametri
possono influenzarne la crescita e la sopravvivenza. Per
rendere il vaso smart e monitorare anche questi due pa-
rametri aggiungiamo un piccolo sensore molto conosciuto
nell'ecosistema Arduino: il DHT11.
Questo piccolissimo oggetto di colore blu è un sensore a
basso costo capace di rilevare contemporaneamente la
temperatura e l’umidità relativa. Le caratteristiche sono le
seguenti:
• Alimentazione 5 V;
Figura 3. Sensore DHT11
• Range umidità 20-80% con il 5% di precisione;
• Range temperatura 0-50°C con ± 2°C di precisio-
ne;
• Frequenza di campionamento 1 Hz (una volta al
secondo).

Per utilizzarlo correttamente basta aggiungere le librerie


fornite da Adafruit che comprendono già le funzioni per ot-
tenere la temperatura (sia in gradi celsius che fahrenheit)
e la funzione per ottenere la percentuale di umidità nell'a-
ria.

Sensore di luminosità

E, dulcis in fundo, aggiungiamo al nostro Smart Pot un


Figura 4. Sensore di luminosità
sensore per monitorare il livello di luminosità che riceve
la pianta durante il giorno. Tra i kit di sensori economici
due piste di rame sono disegnate a serpentina e formano per le schede Arduino è molto diffusa questa tipologia di
i due elettrodi. sensore, in quanto si basa su una resistenza fotosensibile
Il principio fisico è sempre una misura di resistenza elet- (LDR - Light Dependent Resistor) facile da reperire in
trica, che sarà variabile a seconda della quantità di ac- commercio. In genere questi componenti hanno un range
qua presente sulla superfice del sensore. In particolare, di variazione molto ampio (dai kohm ai Mohm) e nel circu-
all’aumentare dell’acqua sulla scheda sensibile si ottiene ito presentano una resistenza (R1 in Figura 4) che viene
una riduzione della resistenza misurata tra i due elettrodi. posizionata tra il punto di misura del segnale e massa.
Anche il sensore di pioggia generalmente è fornito di un
trasduttore a 4 pin simile a quello che abbiamo osserva- SCHEMA DEL CIRCUITO
to per il sensore di terreno. Il segnale analogico di uscita In Figura 5 è riportato lo schema circuitale realizzato per
al sensore assumerà il valore di fondo scala (1024 punti far interagire la nostra scheda Arduino con tutti questi
del canale adc corrispondente sul nostro sketch Arduino) sensori che vi ho appena descritto. Lo schema è molto
quando l’acqua non è presente (di fatto corrisponde ad semplice e facile da realizzare con l'ausilio di una bread-
una resistenza infinita o meglio assenza di resistenza tra i board (o eventualmente di uno shield di prototipazione).
due elettrodi della serpentina). Il valore del segnale dimi- Infatti, ho condizionato la scelta dei sensori affinché non si
nuirà fino a 0 in base alla quantità di acqua presente tra le dovessero aggiungere ulteriori circuiti di condizionamento
serpentine dell'elemento sensibile. rispetto a quelli già forniti con i sensori. Di fatto, l'alimen-
tazione di tutti i sensori avviene con la tensione di uscita a
Sensore ambientale 5 VDC. Il DHT11 comunicherà con la scheda Arduino sul

35
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 1)

Figura 5. Schema dei collegamenti ai sensori

Figura 6. Screenshot della Console

pin digitale n.2, mentre gli altri sensori sfrutteranno i pin console dove visualizzare ciclicamente le informa-
analogici (A0 sensore umidità terreno, A1 sensore pioggia zioni acquisite.
e A2 sensore luminosità). • Per la stessa è stata creata una variabile "vitality"
che serve a visualizzare in sequenza i simboli |\-/-.
SCELTE DI PROGRAMMAZIONE In questo progetto ha poco senso tale variabile,
Prima di mostrarvi il codice, riportato integralmente nel ma vedremo l'utilità nell'evoluzione del progetto
paragrafo successivo, voglio riassumervi alcune scelte nel prossimo articolo.
tecniche adottate durante la programmazione: • I sensori di umidità del terreno, irraggiamento e
• E' stata inizializzata la seriale per poter avere una pioggia sono stati riportati in percentuale del fondo

36
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 1)

scala, come viene ad esempio rappresentata già


l'umidità dell'aria. Inoltre, per pioggia e umidità ter-
reno, la percentuale è stata invertita in modo tale terreno = 100 - (int)analogRead(A0)*0.09765625; //
che allo 0% corrisponde il fondo scala dell'ADC.
read the input pin
Questo consente una visualizzazione delle infor-
pioggia = 100 - (int)analogRead(A1)*0.09765625; //
mazioni più chiara e diretta.
• Per il sensore DHT11 ho utilizzato la libreria che read the input pin
rende disponibile Adafruit. La libreria consente di luce = (int)analogRead(A2)*0.09765625; // read the
calcolare anche l'"heat index" ossia la tempera- input pin
tura percepita in funzione di temperatura ed umi- Serial.print("%\nUmidità Terreno = ");
dità dell'aria. Il codice è riportato tra i commenti in Serial.print (terreno, DEC);
quanto ho preferito non aggiungerlo alle informa-
Serial.print("%\nPioggia =");
zioni disponibili in console.
Serial.print (pioggia, DEC);

SKETCH Serial.print("%\nIlluminazione =");


Serial.print (luce, DEC);
#include "DHT.h"
#define DHTPIN 2 //pin di comunicazione con DHT11 /* float hic = dht.computeHeatIndex(t, h, false);
#define DHTTYPE DHT11 Serial.print("\nHeat index: ");
DHT dht(DHTPIN, DHTTYPE); Serial.print(hic);
Serial.print("°C ");*/
const char* vitality = "|\\-/-"; //simboli per la vitality

Serial.print ("%\n" + String(vitality[counter++%5]));


int terreno = 0; // variable to store the value read }
int pioggia = 0; // variable to store the value read
int luce = 0; // variable to store the value read
int counter = 0;
CONSIDERAZIONI CONCLUSIVE
Siamo giunti al termine di questa prima fase di progetta-
void setup() {
zione di uno Smart Sensor per rendere il vaso della no-
// put your setup code here, to run once:
stra pianta intelligente. Il codice sviluppato è elementare
Serial.begin(9600); e facile da leggere. Con le informazioni acquisite si può
Serial.print("Smart Pot Sensor\nby Daniele Valanzuolo\ pensare anche di implementare algoritmi, o realizzare
nfor ElettronicaOpenSource"); un archivio di misure per valutarne la variazione nell'arco
dht.begin(); della giornata. Se avete avuto problemi nel realizzare il
} vostro oggetto (software, librerie, schemi di dettaglio) uti-
lizzate pure i commenti per chiedere consigli e soluzioni.
Non perdetevi il prossimo articolo dove, con l'utilizzo
void loop() {
di un ESP-01, andremo a dotare il nostro oggetto di
float t; connettività wireless in modo da poter monitorare le in-
int h; formazioni vitali della nostra pianta anche da remoto.
delay(2000);
Serial.print("\nTemperatura = ");
L’autore è a disposizione nei commenti per eventuali
Serial.print(t=dht.readTemperature()); approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
Serial.print("°C\nUmidità Aria = "); direttamente all’articolo sul Blog e partecipare alla discussione:

Serial.print(h=(int)dht.readHumidity()); https://it.emcelettronica.com/smart-pot-sensor-iot-
applicato-allagricoltura-parte-1
//Conversioni misure in percentuali

37
SMART POT SENSOR:
IOT APPLICATO
ALL’AGRICOLTURA
(PARTE 2) di Daniele Valanzuolo

Anche il settore agroalimentare è interessato dall'evoluzione tecnologica dell’Internet delle Cose (IoT), con
innovazioni di tecnologie produttive, processi e filiera in generale. Nel precedente articolo abbiamo iniziato
a progettare un sensore per monitorare i parametri vitali di una pianta, sia essa in un vaso in balcone sia in
giardino. Questo oggetto è stato battezzato Smart Pot Sensor, ma per essere veramente smart e per abbrac-
ciare la filosofia IoT ha bisogno di connettività.

INTRODUZIONE Il microcontrollore ESP8266 include al proprio interno un

I
n questo articolo andremo ad upgradare il nostro Smart processore RISC Tensilica L106 a 32 bit, caratterizzato da
Pot Sensor dotandolo di una connettività di tipo wireless un consumo energetico estremamente basso e velocità di
ed in particolar modo una connessione Wi-Fi attraverso clock massima di 160 MHz. Il chip è dotato anche di un
un oggetto che nell'ambiente Arduino è molto conosciuto: sistema operativo in tempo reale (RTOS) che integra lo
il modulo ESP-01 (rappresentato in Figura 1). stack Wi-Fi. Nonostante il sistema operativo precaricato,
Questo piccolissimo oggetto è un modulo wi-fi completo la potenza di calcolo a disposizione dei progettisti è anco-
basato sul chip ESP8266, un microcontrollore progettato ra generosa, mentre l'architettura utilizzata consente un
proprio per comunicazioni Wi-Fi dalla ESPRESSIF SY- ottimo risparmio energetico (per applicazioni IoT o dispo-
STEMS (in Figura 2 è riportato il diagramma a blocchi). sitivi elettronici indossabili). Infine, il chip offre tre modalità

Figura 1. Modulo di comunicazione Wi-Fi ESP-01

38
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

Figura 2. Diagramma a blocchi del microcontrollore ESP8266 (fonte: datasheet ufficiale)

Figura 3. ESP-o1 Tabella PINOUT

di funzionamento (modalità attiva, modalità sleep e mo- • UART/I2C/HSPI/Ir comunicazioni seriali


dalità deep sleep) che si adattano facilmente alle diverse • GPIO e PWM
applicazioni per cui è stato progettato.
Non mi dilungo particolarmente sulle funzionalità del com-
Le altre caratteristiche del modulo ESP-01 sono: ponente o della board ESP-01, che già sono state larga-
• Wi-Fi a 2.4 GHz secondo lo standard 802.11b/g/n mente discusse tra gli articoli del blog.

39
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

Figura 4. Schema dei collegamenti ai sensori

IL PROGETTO (FASE 2) codice che vi propongo utilizza il modulo in con-


Partendo dal progetto che abbiamo già realizzato nel pre- figurazione access point, ossia crea una rete ad
cedente articolo (e schematizzato in Figura 4) passiamo hoc (con tanto di SSID e password configurate nel
ora ad implementare la connettività wireless creandoci codice) a cui ci si può accedere attraverso l'indi-
un Web Server. L'idea di base è realizzare un'estensione rizzo IP. In genere, in questa configurazione l'in-
del monitor seriale, facendo in modo che tali informazioni, dirizzo IP che si autoassegna il modulo ESP-01 è
anziché finire all'interno della console dell'IDE di Arduino, 192.168.4.1. Un'altra funzionalità del modulo sarà
vengano mostrate in una pagina web, il cui accesso avvie- quella di rimanere in ascolto sulla seriale dalla
ne tramite la rete Wi-Fi e l'indirizzo IP generato dal modulo quale riceve le informazioni dei sensori attraverso
ESP-01. Arduino, ed usarle per completare il contenuto del-
Il modulo ESP-01, per chi non lo sapesse, non è sempli- la pagina home del Web Server;
cemente un modulo di estensione per Arduino (come le • il secondo software è un upgrade del software già
shields) ma è una vera e propria scheda di sviluppo auto- realizzato nel precedente articolo. A differenza del
noma cosiddetta "intelligente". Infatti, il chip ESP8266 che precedente, questo software aggiunge la funzio-
troviamo a bordo del modulino è un microcontrollore che nalità di SoftwareSerial, ossia un'ulteriore comuni-
va programmato. Il successo di questo modulo, oltre ad cazione seriale che viene gestita non più a livello
essere economico, è anche dovuto alla compatibilità con hardware ma a livello software. Anche in questo
l'IDE Arduino e alla presenza di librerie complete all'inter- caso la community Arduino viene a facilitarci il
no dell'IDE stesso (ovviamente le librerie devono esse- compito. Infatti, è disponibile una libreria nell'IDE
re scaricate). Inoltre, anche per la programmazione, può di Arduino che facilita al massimo l'implementazio-
essere utilizzato un convertitore ad hoc oppure, attraver- ne di una seriale gestita a livello software.
so la schematizzazione riportata in Figura 5, è possibile
programmare il modulo sfruttando la seriale di Arduino (e SCHEMA CIRCUITO
ponendo in reset la scheda Arduino). In Figura 6 è riportato lo schema circuitale realizzato che
Dunque, avremo in definitiva due software: integra il progetto dell'articolo precedente (ossia i 4 sen-
• il primo per dotare il modulo ESP-01 di una logi- sori) e il modulo di comunicazione Wi-Fi. Anche in questo
ca. Di fatto il software implementerà le funzionalità caso, lo schema di interconnessione è molto semplice e
per creare e gestire efficacemente la rete Wi-Fi. Il immediato. E' possibile realizzarlo con l'ausilio di una bre-

40
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

Figura 5. Schema di collegamento Arduino <-> ESP01 per programmazione

Figura 6. Schema di collegamento Arduino <-> ESP01 per utilizzo Software Serial

adboard (o eventualmente di una shield di prototipazio- SCELTE DI PROGRAMMAZIONE


ne). Per il modulo ESP-01 sono disponibili anche degli Prima di mostrarvi i due codici (per ESP-01 e per Ardu-
adattatori per la breadboard che facilitano ancora di più ino), riportati integralmente nei successivi paragrafi, vo-
le interconnessioni. Da notare, come il modulo ESP-01 glio riassumervi alcune scelte tecniche adottate durante
sia alimentato questa volta dalla tensione di uscita 3.3 V la programmazione:
anziché la 5 V. • Per evitare errate gestioni è consigliato far lavo-
Questo perché il modulo è progettato per lavorare nel ran- rare le seriali dello sketch Arduino a velocità diffe-
ge di tensioni di alimentazione 3/3.6 V e non va assoluta- renti. Nella fattispecie ho aggiornato la seriale del
mente collegato all'alimentazione a 5 V. monitor a 38400 e ho impostato la SoftwareSerial

41
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

bordo del modulo ESP-01 per avere una diagno-


stica del corretto funzionamento del modulo.

<Sketch ESP-01>

#include <ESP8266WiFi.h>

#include <WiFiClient.h>

#include <ESP8266WebServer.h> int counter; //global


counter

const char* ap_ssid = "smartpot"; //access point SSID

const char* ap_psw = "12345678"; //password wifi

const char* vitality = "|\\-/-"; //simboli per la vitality

Figura 7. Pagina web dello Smart Pot Sensor


String result;

ESP8266WebServer server(80);
a 57400, che corrisponde anche alla massima fre-
quenza di lavoro consigliata. Inoltre, per la seriale void setup() {
software ho utilizzato i pin 10 e 11. Se nell'imple-
mentazione di questo progetto non utilizzate Ar- WiFi.softAP(ap_ssid, ap_psw); IPAddress ap_ip = WiFi.
duino UNO, ma un'altra versione, vi consiglio di softAPIP();
prestare massima attenzione alla scelta dei pin da
utilizzare per la seriale. Un ottimo aiuto è dato di- delay(2000); //2sec delay
rettamente dalle indicazioni riportate nel materiale
su Arduino.cc, poiché non tutti i pin di I/O presen- /* comunicazione con la software serial di arduino */
tano la funzionalità di interrupt esterno necessario
per il corretto funzionamento della libreria Softwa- Serial.begin(57600);
reSerial.
• Anche in questo caso è stata creata una variabile server.on("/", home); //home function
"vitality" nel software per ESP-01 che serve a vi-
sualizzare in sequenza i simboli |\-/-. Rispetto al server.begin(); //start webserver
progetto precedente, questa è fondamentale per
capire se la pagina web visualizzata si sta aggior- pinMode(LED_BUILTIN, OUTPUT); //imposto il pin
nando regolarmente. GPIO0 come uscita
• Rispetto alla console, la pagina web può mostrare
una grafica migliore e più accattivante utilizzando /*il led della ESP01 lo pilotiamo per valutare l'attività
il codice html. Però il mio consiglio è di non strafa- della board*/
re, in quanto più codice si aggiunge e più la comu-
nicazione va a rilento. Per ottimizzare, ho creato counter = 0; //init global counter
una specie di template con l'header iniziale diret-
tamente nel software del modulo ESP-01, mentre } /*Funzione principale del server*/
attraverso la seriale viene inviato un testo con po-
chi tag di formattazione html. /*usiamo i codici html per realizzare una grafica della
• Ho utilizzato anche la gestione del blink del LED a pagina*/

42
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

//page_update contiene un refresh a 5 secondi della if (code.length()!= 0)


pagina
{result = code;}
String page_update = "<meta http-equiv=\"refresh\"
content=\"5\">"; //led control and delay

//page_title contiene il titolo della pagina digitalWrite(LED_BUILTIN, HIGH);

String page_title ="<h1><span style=\"color: #000080; delay(250);

\">Smart Pot Sensor</span></h1>"; digitalWrite(LED_BUILTIN, LOW); delay(250);

String page_title_2 ="<p><strong><span style =\"color: //chiamata all'handler del server


#008000;
server.handleClient();
\">by Daniele Valanzuolo<br
}
/>for ElettronicaOpenSource</span></strong></
p><h1>";

void home() <Sketch Arduino>

{ #include "DHT.h"

server.send #include "SoftwareSerial.h" #define DHTPIN 2

(200, "text/html", page_update + page_title + page_tit- #define DHTTYPE DHT11 DHT dht(DHTPIN, DHT-
le_2 TYPE);

+ String(vitality[counter++%5]) + const char* vitality = "|\\-/-"; //simboli per la vitality

" </h1>__________________________<br>"+ result ); SoftwareSerial wifi_serial(11,10);

//String(vitality[counter++%5]) int terreno = 0; // variable to store the value read

seleziona un carattere della stringa vitality int pioggia = 0; // variable to store the value read

} int luce = 0; // variable to store the value read

void loop() { int counter = 0;

// interrogo la seriale, void setup() {

se ho un messaggio aggiorno la stringa result // put your setup code here, to run once:

String code; Serial.begin(38400);

code = Serial.readString(); Serial.print("Smart Pot Sensor");

43
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

wifi_serial.begin(57600);

dht.begin();

void loop() {
Serial.print(hic); Serial.print("°C ");*/

float t;
Serial.print ("%\n" + String(vitality[counter++%5]));
int h;
wifi_serial.print ("<h2> Temperatura &ensp;");
delay(2000);
wifi_serial.print (t);
Serial.print("\nTemperatura= ");

wifi_serial.print ("&degC<br>&ensp; Umidita' Aria


Serial.print(t=dht.readTemperature());
&ensp;");
Serial.print("\nUmidità= ");
wifi_serial.print (h);
Serial.print(h=(int)dht.readHumidity());
wifi_serial.print ("%<br> Umidita' terreno &ensp;");
//Conversioni misure in percentuali

wifi_serial.print (terreno);
terreno = 100 - (int)analogRead(A0)*0.09765625;

// read the input pin pioggia = wifi_serial.print

100 - (int)analogRead(A1)*0.09765625; // read the ("%<br>&emsp;&emsp;&emsp;&ensp;Pioggia &ensp;");


input pin luce =

wifi_serial.print (pioggia);
(int)analogRead(A2)*0.09765625; // read the input pin

wifi_serial.print ("%<br>&emsp;&emsp;Luminosita'
Serial.print("%\nUmidità Terreno = ");
&ensp;");
Serial.print (terreno, DEC);
wifi_serial.print (luce);
Serial.print("%\nPioggia =");

wifi_serial.print ("%</h2><br>"+String(vitality[coun-
Serial.print (pioggia, DEC);
ter++%5]));

Serial.print("%\nIlluminazione =");
}
Serial.print (luce, DEC);

/* float hic = dht.computeHeatIndex(t, h, false);

Serial.print("\nHeat index: ");

44
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)

SVILUPPI FUTURI grado di resistere nel tempo alle intemperie e all'umidità.


Abbiamo realizzato un oggetto interessante, che ognuno In generale, il costo di gestione dei sistemi tecnologici per
di noi può realizzare tranquillamente con pochi elementi il settore agroalimentare è ancora elevato, soprattutto se
ma soprattutto spendendo pochissimo. si pensa ai bassi margini di guadagno.
Il modulo ESP-01 è la soluzione ideale per aggiungere, Tuttavia, la tecnologia promette vantaggi economici e in-
praticamente a costo 0, connettività wireless al proprio cremento di qualità che se ben sfruttati possono offrire
progetto Arduino. un vantaggio alle aziende che puntano sugli investimenti
Di fatto, il progetto è semplicemente uno scheletro funzio- tecnologici.
nale di un oggetto che può essere migliorato ed ottimizza- Per chi si affaccia al settore dell’agricoltura 4.0 dal punto
to in differenti modi. Alcune delle features che si possono di vista di fornitore professionale, c’è da dire che gli svilup-
realizzare a partire da questo progetto sono: pi futuri sono ancora tanti e ben promettenti.
• dotare l'oggetto di un involucro, casomai un pic- Tralasciando la miriade di sensori e dispositivi che si pos-
colo box in abs auto-prodotto con una stampante sono realizzare, nonché delle infrastrutture, anche il set-
3D in modo da proteggerlo dalle intemperie se lo tore agroalimentare, con l’agricoltura 4.0, è coinvolto dalla
vogliamo installare in giardino; necessità di elaborare big-data, vista la mole dei dati che
• realizzare una struttura adeguata per fissare il si accinge ad acquisire e immagazzinare.
sensore di pioggia. Infatti, per farlo funzionare in Infatti, proprio in questo ambito, gli sviluppi futuri prevedo-
maniera ottimale andrebbe posizionato a 30°, in no numerose proposte di elaborazione di questi dati per
modo tale che l'acqua piovana possa scorrere la corretta ottimizzazione delle risorse agrarie e per svi-
senza alcun problema; luppare nuove teorie relative all’agricoltura di precisione.
• implementare le altre funzionalità del Wi-Fi per in- Nuove figure professionali dovranno essere in grado di
tegrarlo alla propria rete domestica. Andrebbe do- saper progettare reti ad hoc per monitorare i parametri
tato anche di un sistema di protezione più robusto ambientali di vaste aree, in modo tale da poter organizza-
per evitare che venga hackerato facilmente; re attività mirate di sfruttamento delle risorse in funzione
• dotare il dispositivo di una batteria o meglio delle caratteristiche biochimiche del fondo agricolo.
ancora di un sistema di energy harvesting. Allo stesso modo, sarà possibile monitorare gli alleva-
La prima idea che mi viene in mente è un pan- menti allo stato brado, mantenendo la tracciabilità dei capi
nellino fotovoltaico la cui tensione in uscita carica di bestiame e monitorandone lo stato di salute, a benefi-
una piccola batteria a litio. Ovviamente, in tal caso cio dell’allevatore e dei consumatori finali delle carni e dei
è necessario progettare o selezionare anche un prodotti derivati.
battery manager adeguato per gestire al meglio e
in sicurezza le batterie a litio;
• aggiungere un modulo per memorie SD per ren-
dere il dispositivo come datalogger ed accumulare
informazioni da trasmettere poi via Wi-Fi quando MAKING IOT È IL NUOVO PERCORSO FORMATIVO
interrogato il dispositivo; DELLA MAKERS ACADEMY, PENSATO E REALIZZA-
• connettere il dispositivo ad una piattaforma IoT per TO DAL DOCENTE LORENZO NERI PER ACQUISIRE
lo storage continuo delle informazioni acquisite, COMPETENZE NELLA REALIZZAZIONE DI PROGETTI
oppure ad un'app per smartphone. E SOLUZIONI PER L'IOT. IL CORSO È DISPONIBILE A
QUESTO LINK.
Siamo giunti al termine di questo progetto.
Se avete avuto problemi nel realizzare il vostro oggetto
utilizzate pure i commenti.

CONCLUSIONI L’autore è a disposizione nei commenti per eventuali


approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
Abbiamo realizzato un piccolo oggetto economico, ma di direttamente all’articolo sul Blog e partecipare alla discussione:
fatto per applicazioni su larga scala è sempre necessario https://it.emcelettronica.com/smart-pot-sensor-iot-
adottare soluzioni tecnologicamente più robuste, a partire applicato-allagricoltura-parte-2
dai sensori come quello del terreno, che devono essere in

45
UN SEMPLICISSIMO
ENERGY METER
CON ARDUINO di Andrea Garrapa

La maggior parte dei progetti di energy meter che si possono trovare in rete sembrano tutti un pò troppo
complicati per una semplice applicazione domestica. Per misurazioni accurate è necessario monitorare sia
la tensione di alimentazione che la corrente, ma per un semplice monitoraggio domestico che fornisce stime
dei costi, può bastare anche la sola corrente. Un semplice misuratore realizzato con Arduino potrebbe misu-
rare la corrente di alimentazione di casa attraverso un CT (trasformatore di corrente) e, attraverso un paio di
calcoli, fornire la corrente e la potenza consumate.

INTRODUZIONE tensione e quindi scalare il riferimento di tensione in un

Q
uesto articolo descrive in dettaglio come costru- intervallo 0-5 V.
ire un semplice monitor energetico su una bre- Il circuito base del progetto con i collegamenti è mostrato
adboard, che può essere utilizzato per misurare nella Figura 1.
quanta energia elettrica si consuma in casa. Misurando Dopo aver collegato tutti i componenti, è necessario colle-
soltanto la corrente ed utilizzando un valore fisso presunto gare il sensore a ciò che si desidera monitorare. Occorre
per la tensione è possibile calcolare la potenza apparente. mettere il CT attorno a uno dei cavi di alimentazione, pre-
Sebbene non sia accurato come un monitor che misura la feribilmente il cavo "sotto tensione". Occorre metterlo solo
tensione e la corrente, è un metodo comunemente utiliz- intorno ad un cavo o non funzionerà. Inoltre, non può es-
zato nei monitor di energia per l'intera casa disponibili in sere collegato attorno al filo di terra (filo giallo-verde) poi-
commercio per motivi di semplicità e costo. ché l'energia non viene assorbita attraverso questo cavo.
Ecco di seguito un elenco dei componenti di cui si ne-
cessita per completare questo progetto. Uno schermo Attenzione: collegando il misuratore di potenza alla rete
LCD opzionale è ovviamente utile se si prevede di instal- di casa occorre assicurarsi che l'alimentazione sia spenta
lare o utilizzare permanentemente il misuratore, tuttavia è prima di fare qualsiasi cosa nella scatola di rete. Non ri-
possibile semplicemente utilizzare l'interfaccia seriale di muovere cavi o viti, e magari sarebbe opportuno chiedere
Arduino per visualizzare le informazioni. aiuto ad un elettricista certificato per installare il CT.
• Una scheda Arduino (va bene la classica Uno)
• un sensore CT (consigliato SCT-013-000) ALCUNE NOZIONI
• 1 resistore di carico R3 = 33 Ω Alcune nozioni di elettrotecnica prima di cominciare po-
• 2 resistori di pari valore R1 = R2 = 10 kΩ trebbero essere utili per capire meglio il progetto. Nella
• 1 condensatore C1 = 10 μF corrente alternata (AC) la tensione e la corrente oscillano
• 1 breadboard in modo sinusoidale 50 volte al secondo (50 Hz). Ad ogni
istante avremo un valore diverso di potenza. Abbiamo bi-
Per prima cosa occorre assemblare i componenti sulla sogno di un valore che sia la media della potenza istanta-
breadboard affinché il sensore di corrente produca un se- nea, che chiamiamo potenza reale o attiva. La potenza
gnale tale da essere rilevato da Arduino. Arduino Uno ha reale è definita come la potenza utilizzata da un dispositi-
solo ingressi di tensione analogici il cui intervallo di tensio- vo per produrre un lavoro utile. I valori positivi della poten-
ne va da 0 a 5 V in corrente continua, quindi è necessario za rappresentano quella parte che va dall'alimentatore al
convertire l'uscita di corrente del CT in un riferimento di carico, mentre quelli negativi rappresentano la parte che

46
UN SEMPLICISSIMO ENERGY METER CON ARDUINO

la corrente alternata (AC). Sono


particolarmente utili per misura-
re il consumo o la generazione di
elettricità. Come qualsiasi altro
trasformatore, un trasformatore
di corrente ha un avvolgimento
primario, un nucleo magnetico
e un avvolgimento secondario.
Nel caso di monitoraggio dell'in-
tero edificio, l'avvolgimento pri-
mario è il filo sotto tensione o
il neutro (NON entrambi!) che
entra nell'edificio e viene fatto
passare attraverso l'apertura del
CT. L'avvolgimento secondario
è costituito da molte spire di filo
sottile alloggiate all'interno del
trasformatore. Esistono due
tipi di trasformatori di corren-
te (CT), funzionano esattamen-
te allo stesso modo, la differen-
za è nella loro costruzione:
1. Il trasformatore di
corrente ad anello, nel quale il
Figura 1: schema circuitale del misuratore di corrente nucleo è solido e il cavo su cui
si desidera inserirlo deve esse-
re scollegato per installare il CT.
ritorna all'alimentazione dal carico. La potenza che è stata Pertanto, viene utilizzato solo dove è pratico, sicuro
effettivamente utilizzata dal carico, ovvero la potenza in e legale scollegare il circuito. Il suo vantaggio è una
avanti meno quella che ritorna, è la potenza reale. La po- maggiore precisione.
tenza immaginaria o reattiva è una misura della potenza 2. Il trasformatore di corrente split-core, dove il nu-
che va avanti e indietro tra il carico e l'alimentazione, non cleo è costituito da due parti tenute insieme da clip o
facendo alcun lavoro utile. viti. Le due parti vengono semplicemente posizionate
Un'altra misura utile della potenza è la potenza apparen- attorno al cavo e assemblate. Non è necessario di-
te, che è il prodotto della tensione RMS e della corrente sconnettere nulla. A condizione che il trasformatore di
RMS. Per carichi puramente resistivi, la potenza reale corrente abbia un carico collegato, può essere instal-
è uguale alla potenza apparente. Ma per tutti gli altri ca- lato su un cavo sotto tensione, isolato e che trasporta
richi, la potenza reale è inferiore alla potenza apparente. corrente.
La potenza apparente è una misura della potenza reale e
reattiva, ma non è una somma delle due, poiché la som- La corrente alternata che scorre nel primario produce un
ma delle due non tiene conto delle differenze di fase. campo magnetico nel nucleo, che induce una corrente nel
circuito dell'avvolgimento secondario. La corrente nell'av-
Per la misurazione dell'energia domestica, è probabile volgimento secondario è proporzionale alla corrente che
che la potenza reale sia il valore più utile, poiché ci dice scorre nell'avvolgimento primario:
quanta energia consumano effettivamente tutti gli elettro-
domestici e che incide nel calcolo della bolletta. I2 = RCT x I1 dove RCT = N1/N2

IL TRASFORMATORE DI CORRENTE CT La formula indica che la corrente nel secondario (I2) è pari
I trasformatori di corrente (CT) sono sensori che misurano al prodotto tra RCT e la corrente che scorre nel primario

47
UN SEMPLICISSIMO ENERGY METER CON ARDUINO

(I1). Dove RCT è il rapporto tra il numero di avvolgimenti del corgimenti per operare in sicurezza:
primario (N1) e il numero di avvolgimenti del secondario 1. Un CT non deve mai essere lasciato a circuito
(N2). Un CT con "uscita in corrente" deve essere utilizzato aperto una volta collegato ad un conduttore che
con un resistore di carico. Il resistore di carico completa conduce corrente. Esso è potenzialmente pericolo-
o chiude il circuito secondario. Il valore di carico è scelto so se a circuito aperto.
per fornire una tensione proporzionale alla corrente se- 2. Collegare sempre il CT prima di agganciarlo attorno
condaria. Il valore del carico deve essere sufficientemente al conduttore che trasporta corrente e sganciarlo dal
basso per prevenire la saturazione del nucleo del CT. conduttore che trasporta la corrente prima di scolle-
In generale, un CT non deve mai essere lasciato a circuito garlo.
aperto una volta collegato ad un conduttore che conduce 3. Non tentare mai di montare un CT ad un condut-
corrente. Esso è potenzialmente pericoloso se a circuito tore nudo a meno che non si sia assolutamente certi
aperto. Se a circuito aperto con corrente che scorre nel che sia progettato per quello. Oltre all'ovvio pericolo
primario, il secondario del trasformatore tenterà di conti- di scosse elettriche, ci sono due fattori da considera-
nuare a guidare la corrente in quella che è effettivamente re: la resistenza dell'isolamento del CT e la sua capa-
un'impedenza infinita. Ciò produrrà una tensione elevata cità di resistere alle temperature più elevate alle quali
e potenzialmente pericolosa sul secondario. Alcuni CT normalmente operano i conduttori nudi.
hanno una protezione integrata. Alcuni hanno diodi Zener 4. Un CT split-core, specialmente uno che ha un nu-
protettivi come nel caso dell'SCT-013-000 consigliato per cleo di ferrite non dovrebbe mai essere "fissato"
l'uso in questo progetto (Figura 2). Se il CT è del tipo al cavo utilizzando alcun tipo di materiale da im-
"uscita in tensione", avrà un resistore di carico integrato. ballaggio, perché la natura fragile del nucleo di ferrite
Pertanto, non potrà essere lasciato a circuito aperto. implica che potrebbe facilmente rompersi. È neces-
L'avvolgimento primario nel caso del progetto è il filo che sario fissare il CT al cavo solo se l'alloggiamento è
trasporta la corrente che si desidera misurare. Aggancian- progettato specificamente per farlo. Allo stesso modo,
do il CT attorno ad un cavo che ha 2 fili che trasportano la un CT con nucleo ad anello non dovrebbe mai essere
stessa corrente ma in direzioni opposte, i campi magne- forzato su un cavo troppo grande per passare libe-
tici creati dai fili si annulleranno a vicenda e non si avrà ramente attraverso il centro. La posizione e l'orien-
uscita. tamento del cavo all'interno dell'apertura del CT non
influisce sull'uscita.
ACCORGIMENTI
Leggere attentamente questo paragrafo che riporta gli ac- ARDUINO E SENSORE CT
Per collegare un sensore CT ad una scheda Arduino, il se-
gnale di uscita dal sensore CT deve essere condizionato
in modo da soddisfare i requisiti di ingresso degli ingressi
analogici di Arduino, ovvero una tensione positiva tra zero
V e la tensione di riferimento.
Ciò può essere ottenuto con il circuito che consiste di due
parti principali:
• Il sensore CT e il resistore di carico
• Il partitore di tensione di polarizzazione (R1 e R2)

Se il sensore CT è di tipo "uscita in corrente" come YHDC


SCT-013-000, il segnale di corrente deve essere converti-
to in un segnale di tensione con un resistore di carico. Se
si tratta di un CT con uscita in tensione, è possibile saltare
questo passaggio e tralasciare il resistore di carico, poi-
ché il resistore di carico è integrato nel CT.
Il CT YHDC SCT-013-000 ha una gamma di corrente da
0 a 100 A. Per questo scegliamo 100 A come possibile
Figura 2: trasformatore di corrente split-core YHDC SCT-013-000 corrente massima.

48
UN SEMPLICISSIMO ENERGY METER CON ARDUINO

La corrente di picco nel primario sarà data dal prodotto #include "EmonLib.h"
del valore di corrente RMS nel primario per la radice di 2: // Include Emon Library
EnergyMonitor emon1;
I1peak = IRMS x √2 = 100 A x 1,414 = 141,4 A // Create an instance
void setup()
{
La corrente di picco nel secondario sarà data dal rapporto Serial.begin(9600);
tra la corrente di picco nel primario e il numero di avvolgi-
menti nel secondario: emon1.current(1, 111.1); // Current: input pin,
I2peak = I1peak /N2 = 141,4 A/2000 = 0,0707 A calibration.
}
Per massimizzare la risoluzione della misura, la tensio-
void loop()
ne sul resistore di carico al picco della corrente dovrebbe {
essere la metà della tensione di riferimento analogica di double Irms = emon1.calcIrms(1480); // Calculate Irms
Arduino. Per le schede operanti a 5 V si traduce in 2,5 V. only
Quindi il valore del resistore di carico sarà: Serial.print(Irms*230.0); // Apparent power
Serial.print(" ");
Serial.println(Irms); // Irms
R3 = (VREF/2)/I2peak = 2,5 V/0,0707 A = 35,4 Ω
}

35 Ω non è un valore comune di resistenza. I valori più vi- CONCLUSIONI


cini sono 39 e 33 Ω. Meglio scegliere il valore più piccolo, In questo articolo è stato presentato un misuratore di con-
poiché la corrente di carico massima potrebbe creare una sumi di potenza basato sul solo rilevamento della corren-
tensione superiore a VREF. Si consiglia un carico di 33 Ω te. Sebbene meno accurato rispetto ai misuratori basati
± 1%. Utilizzare 2 resistenze in serie potrebbe portare il sul rilevamento di tensione e corrente, ha dalla sua parte
carico più vicino al valore ideale. il vantaggio di essere semplice e poco costoso. Il disposi-
Più il valore è lontano dall'ideale, minore sarà la precisio- tivo è costituito da una scheda Arduino Uno, un sensore
ne. CT e un circuito di condizionamento del segnale. I risultati
Gli ingressi analogici di Arduino richiedono una tensione della misurazione possono essere analizzati aprendo il
positiva. Occorre che la tensione di uscita del CT oscil- monitor seriale dell'IDE Arduino. Il progetto si apre a mol-
li intorno a metà (2,5 V ) della tensione di alimenta- tissimi miglioramenti sia hardware che software, come ad
zione rimanendo così sempre positiva. I resistori R1 e esempio l'aggiunta di uno schermo LCD o il calcolo di altre
R2 nello schema del circuito rappresentano un semplice grandezze, oltre la potenza apparente e la corrente RMS,
partitore di tensione che divide per due la tensione di ali- quali i kilowattora o il costo dei consumi totali. Se opportu-
mentazione. namente modificato può essere utilizzato per sapere rapi-
Essi quindi hanno lo stesso valore di resistenza. Sceglien- damente i costi e i consumi domestici di energia elettrica
do un valore alto, tipo di 10 kΩ, si può ridurre il consumo di in un qualsiasi momento.
energia. Il condensatore C1 fornisce un percorso a massa
per la corrente alternata per bypassare il resistore. Un va- RIFERIMENTI
lore di 10 μF può risultare adatto. "https://learn.openenergymonitor.org/"

LO SKETCH IL CORSO SU ARDUINO È DISPONIBILE ALL'INTER-


Prima di caricare lo sketch nel microcontrollore occorre NO DEL PERCORSO FORMATIVO DELLA MAKERS
scaricare mediante la gestione delle librerie dell'IDE Ardu- ACADEMY A QUESTO LINK.
ino, la libreria "Emonlib".
Una volta scaricata, basterà andare nel menu dell'IDE ed
L’autore è a disposizione nei commenti per eventuali
aprire l'esempio denominato "current_only".
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
Caricarlo sul microcontrollore ed aprire il monitor seriale direttamente all’articolo sul Blog e partecipare alla discussione:
dove appariranno due colonne: una a sinistra per la po- https://it.emcelettronica.com/un-semplicissimo-energy-
tenza apparente ed una a destra per il valore rms di cor- meter-con-arduino
rente.

49
CONTROLLO DEL MOTO
DI UNA SMART CAR
CON ARDUINO di Giordana Francesca Brescia

Sicuramente ciascuno di noi si è imbattuto almeno una volta in progetti smart finalizzati al monitoraggio e
al controllo di sistemi più o meno complessi. Se il nostro sistema è una smart car, ecco che dinanzi a noi si
apre uno spettro di possibilità. Che la nostra passione sia la robotica, la meccanica, l’elettronica o la mec-
catronica, il progetto che affronteremo in questo articolo abbraccia più ambiti e può essere implementato
a partire da una struttura di modello semplice che diventa a mano a mano più complessa con l’aggiunta di
componenti. In questo articolo capiremo come costruire un progetto sperimentale sfruttando le potenzia-
lità della nota scheda Arduino implementandola a bordo della nostra smart car, unitamente a una serie di
moduli sensori che espandono le funzionalità di controllo e monitoragio, e come effettuare un controllo di
sistema anche da remoto. La nostra smart car diventa così un ponte tra l’ambiente fisico e quello elettrico
digitale, sfruttando le interazioni tra input e output, tra sensori e attuatori. Vedremo come utilizzando una
scheda controller per motori potremo pilotare due motori DC controllandone i parametri velocità e direzione.

INTRODUZIONE

L
a scheda Arduino è una board elettronica pro-
grammabile che copre un grande numero di ap-
plicativi, per questo è molto utilizzata sia da pro-
grammatori esperti che da hobbisti, studenti, makers e
progettisti elettronici. Il progetto Arduino, nato presso l’IDII
(Istituto di Interaction Design di Ivrea) ha da subito aderito
alla filosofia dell’Open Source, infatti sia l’ambiente di
sviluppo, le librerie, i codici di base, che gli schemi elettrici
delle board, sono totalmente open source. Siamo quin-
di nell’ambito dell’Open Source Hardware e dell’Open
Source Software. Il prototipo che ci accingiamo a costru-
ire viene arricchito di funzionalità attraverso la program-
mazione della scheda Arduino e l’implementazone di mo-
duli di sensori che consentono di ottimizzare l’interazione
dell’oggetto con l’ambiente circostante. In particolare, Figura 1. La board Arduino Uno utilizzata nel progetto – top view
equipaggeremo la nostra smart car anche di un modulo
bluetooth per il controllo da remoto degli spostamenti,
sia in termini di monitoraggio di direzione e verso, che in e con un bassissimo consumo di energia. Quest'ultimo è
termini di impostazione di funzioni avanzate, come il rile- un aspetto essenziale che differenzia i microcontrollori dai
vamento di ostacoli e l’inseguimento di una linea. Voglia- potenti computer odierni.
mo realizzare un progetto che sia il più possibile ricettivo
nei confronti di stimoli sensoriali, il tutto in un ambien- LA SCHEDA ARDUINO
te altamente integrato grazie al fatto che in una board La scheda Arduino UNO e’ dotata di una memoria flash
come Arduino, tutti i componenti sono integrati in un chip da 32 kbyte, 2 kbyte di sdram ed 1 kbyte di eeprom. Gra-

50
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

Figura 2. La board Arduino Uno utilizzata nel progetto – Figura 4. La scheda Dual H-Bridge Motor Driver L298N
bottom view

Figura 5. Layout dello schema delle connessioni del Dual


H-Bridge Motor Driver con le dimensioni caratteristiche

del microprocessore ed il programma di gestione della


connessione usb che consente di collegare la scheda al
Figura 3. Motore DC utilizzato nel progetto computer per alimentarla e programmarla. I connettori
collegano con l’esterno i pin del microcontrollore e l’ali-
zie alla memoria flash che mantiene il suo stato anche in mentazione. I pin sono numerati, in particolare i pin digitali
assenza di alimentazione, una volta caricato il program- vanno da 0 a 13, mentre quelli analogici da AO ad A5. Tutti
ma sulla scheda, questo resta memorizzato e disponibile i pin funzionano a una tensione operativa di 5V e possono
sino a quando non ne viene caricato un altro. La scheda erogare una corrente massima di 40 mA.
Arduino UNO è dotata di microcontrollore integrato ATme- Una volta caricato il programma all’interno della memoria
ga328, un minicomputer che incorpora un microproces- del microcontrollore, il programma resterà caricato anche
sore da 16 MHz, una memoria RAM da 2 kB, memoria se viene tolta l’alimentazione. Prima di scrivere un pro-
programma di 32kB, i relativi bus, il software di boostrap, gramma, talvolta è necessario scaricare le librerie per in-
ovvero il bootloader che è il software di inizializzazione stallare le quali si può utilizzare il gestore librerie, al link

51
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

Figura 9. Modulo a infrarossi di inseguimento

Figura 6. Modulo sensore a ultrasuoni HC SR04 - top view

Figura 10. Telecomando a infrarossi per controllo da remoto

Figura 7. Modulo sensore a ultrasuoni HC SR04 - bottom


view

Figura 8. Modulo a infrarossi di prevenzione degli ostacoli


con regolatore di sensibilità e intervallo di regolazione Figura 11. Modulo bluetooth - top view

52
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

sogna avere chiaro quello che è lo schema cinematico


che ci dà indicazioni sul flusso del moto, ad esempio da
dove entra la potenza motrice e come questa viene
trasmessa dall’albero motore alla ruota. Quindi do-
vremmo porci in sostanza queste domande: quanti moto-
ri sono necessari per realizzare il progetto? Come viene
trasmesso il moto dal motore alle ruote? Il primo compo-
nente che esaminiamo è di importanza basilare perchè
è la fonte del moto di un sistema. Si tratta del motore a
corrente continua DC (Direct Current), tipicamente utiliz-
zato in applicazioni prototipali e in ambito hobbistico dove
i valori di tensione e corrente sono bassi. Un motore DC è
dotato di due morsetti e viene alimentato da una batteria
solitamente a 5V, infatti basta sottoporlo a una tensio-
ne per porlo in rotazione. All’interno di un motore DC è
presente una coppia di magneti permanenti orientati con
Figura 12. Modulo bluetooth - bottom view
polarità opposta e situati sul corpo cilindrico. Sull’asse è
presente un’elettrocalamita libera di ruotare e alimentata
dalle spazzole. Quando viene applicata una tensione ai
morsetti, l’elettrocalamita si magnetizza e tende a ruotare
per allineare i suoi due poli con quelli opposti dei magneti
permanenti. Ogni mezzo giro le spazzole invertono la po-
larità dell’elettrocalamita allineata con il magnete, per cui
l’asse continua a ruotare finchè il motore riceve corrente.
Nel nostro progetto utilizziamo due motori DC biassiali.

L298N DUAL H-BRIDGE MOTOR DRIVER


La scheda controllo motori che utilizziamo nel nostro pro-
totipo è basata sul driver Dual H-Bridge L298N, trova ap-
plicazione per pilotare motori elettrici DC e motori passo
passo bipolari. Costruttivamente il modulo è composto da
due connettori laterali cui vengono collegati i motori, e da
connettori frontali per collegare l’alimentazione e le con-
nessioni logiche, ha dimensioni notevolmente piccole ed
è estremamente compatto, misura infatti solo 43 x 43 x 28
mm e ha un peso di soli 25 grammi. Ciascun ponte può
essere abilitato o disabilitato tramite il relativo piedino di
enable per controllare e gestire due motori DC a spazzo-
le o un motore passo passo a quattro fasi, direttamente
da Arduino o altri microcontrollori. L’enA è il ponticello di
abilitazione del motore A, mentre l'enB è il ponticello di
Figura 13. Particolare di montaggio del Dual H-Bridge Mo-
tor Driver L298N con i cavi di collegamento ai motoriduttori
abilitazione del motore B, le connessioni in1, in2, in3 e
sul telaio in4 servono per la gestione degli stati dei motoriduttori.
Quindi i piedini di enable, rispettivamente enA ed enB,
https://www.arduino.cc/en/Reference/Libraries è possibile attivano/disattivano (HIGH/LOW) i motori A e B e, se
trovare le librerie maggiormente utilizzate. connessi ad una porta PWM, ne controllano anche la
velocità. Attraverso il modulo L298N è possibile ottenere
MOTORI DC un discreto livello di controllo sui numeri di giri agendo
Quando si progetta un sistema più o meno complesso bi- sul tempo di attivazione e attraverso le porte enA ed enB

53
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

Figura 14. I due motoriduttori DC nella vista dal basso della


smart car. Sono visibili le due ruote calettate sugli alberi dei
motoriduttori, il pacco delle batterie ricaricabili agli ioni di
litio che è stato bloccato sul telaio mediante l’utilizzo di viti
e i due sensori a infrarossi di inseguimento

Figura 16. Il prototipo in funzione

zionale.
I collegamenti laterali di enable (enA ed enB) e input logici
(in1, in2, in3, in4) servono ad abilitare e gestire i moto-
ri. Dallo schema delle connessioni, gli output A e output
B sono i collegamenti che permettono l’alimentazione dei
due motoriduttori che forniscono il moto alla smart car.
Invertendo il collegamento dei due morsetti nei rispettivi
output, cambiano i versi di rotazione dei motor sia la velo-
cità che il senso di marcia possono essere modificati
e regolati in base alle condizioni dettate dal codice i,
infatti sia Arduino che il driver L298N determinano il senso
di marcia dei motori. Inoltre sia la velocità che il senso di
marcia possono essere modificati e regolati in base alle
condizioni dettate dal codice.
Il modulo può funzionare con tensioni comprese nel range
Figura 15. Smart car a fine montaggio equipaggiata della
scheda Arduino Uno, i moduli dei sensori, lo stack batteria, i tra i 5V e i 35V e ogni uscita fornisce 2A di corrente.
due motoriduttori DC e il modulo L298N
UN CASO APPLICATIVO: GESTIONE DEI MO-
utilizzate con tecnica PWM (Pulse Width Modulation), è TORI DC CON ARDUINO E IL MOTOR CON-
possibile controllare anche la tensione erogata a ciascu- TROLLER L298N
no dei due motori, compensando così eventuali differenze Per passare al lato software, per prima cosa procediamo
di efficienza. Si ottengono in questo modo performance con l’installazione del programma, ovvero l’IDE di Ardu-
simili su entrambi i motori e una riduzione del gap presta- ino, dove andremo a scrivere e caricare il codice. L’IDE

54
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

(Integrated Development Environment) di Arduino è un Nel blocco void setup () inseriamo le istruzioni di confi-
ambiente di sviluppo integrato totalmente open source e gurazione da fare all’accensione, dichiariamo quindi i pin
pensato per funzionare sui diversi sistemi operativi, Linux, inseriti sopra, come output:
Windows e Mac OS. Ad installazione completata si può
collegare la scheda all’usb per terminare la configurazio- void setup ()
ne dei driver. All’interno del microcontrollore è precarica- {
to il bootloader, un software che ci permette di caricare i // set the motors as output
programmi.
pinMode(enA, OUTPUT);
Possiamo utilizzare la scheda Arduino per controllare il
motor driver L298N che a sua volta serve per controllare i pinMode(enB, OUTPUT);
due motoriduttori DC. E’ importante sottolineare a questo pinMode(in1, OUTPUT);
punto che proprio grazie agli shield la fase di progettazio- pinMode(in2, OUTPUT);
ne viene resa più fluida perchè con delle schede acces- pinMode(in3, OUTPUT);
sorie si possono espandere le funzionalità della scheda
pinMode(in4, OUTPUT);
Arduino, in questo caso specifico controllare e pilotare
due motori in modo indipendente e che possono ruotare }
in entrambi i versi di rotazione senza la necessità di dover
invertire la tensione di alimentazione. Abbiamo descritto A questo punto inizia il programma principale, nel loop
precedentemente il funzionamento del driver del motore andiamo a effettuare i test dei due motori alimentati dal
che è in grado di gestire due motori in corrente continua o driver:
un motore passo passo.
Il driver L298N gestisce i due motori che chiameremo mo- void loop ()
tore A e motore B e che andremo a collegare ai connettori {
posti a destra e a sinistra del Dual H-Bridge Motor Driver // starts the motor A
L298N. Dopo aver collegato il driver, la scheda Arduino e digitalWrite(in1, HIGH);
i due motori DC, arrivati a questo punto bisogna collegare digitalWrite(in2, LOW);
la scheda Arduino al pc tramite il cavo USB e caricare lo // set the speed to 150 (0~200)
sketch tramite l’IDE di Arduino, ovvero il file di codice, che analogWrite(enA, 150);
avrà estensione .ino.
Programmiamo ora la nostra car inizialmente in modo da // starts the motor B
consentirle di eseguire automaticamente e senza control- digitalWrite(in3, HIGH);
lo remoto gli spostamenti programmati, siamo nella fase digitalWrite(in4, LOW);
in cui istruiamo e programmiamo Arduino per far compiere // set the speed to 150 (0~200)
ai motori determinate operazioni non appena la macchina analogWrite(enB, 150);
viene accesa. Procediamo quindi con l’inizializzazione dei
pin: delay(3000);

// motor A Possiamo invertire il senso di rotazione dei motori:

int enA = 10;


// change the direction of the motors
int in1 = 9; digitalWrite(in1, LOW);
int in2 = 8; digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
// motor B
digitalWrite(in4, HIGH);
int in3 = 7;
delay(3000);
int in4 = 6;

int enB = 5;
Per spegnere i motori scriviamo questo blocco:

55
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

nerare il moto turn left e turn right della smart car, i motori
// turn off all motors devono essere impostati con versi di rotazione opposti,
digitalWrite(in1, LOW); viceversa per gli spostamenti forward e back i versi di ro-
digitalWrite(in2, LOW); tazione dei motori coincidono. Inoltre abbiamo impostato
digitalWrite(in3, LOW); in ogni blocco di istruzione lo stesso valore di velocità per
entrambi i motori.
digitalWrite(in4, LOW);

QUALI SONO I MODULI SENSORE UTILIZZATI


delay(2000); NEL PROGETTO
I sensori sono componenti elettronici che hanno la fun-
Se in1 è HIGH ed in2 è LOW, il motore A gira in senso ora- zione di percepire e misurare le caratteristiche fisiche
rio, se in1 è LOW ed in2 è HIGH, il motore A gira in senso dell’ambiente circostante. Vediamo in dettaglio quali sono
antiorario. Se in3 è HIGH ed in4 è LOW, il motore B gira i sensori che abbiamo utilizzato per monitorare la nostra
in senso orario, se in3 è LOW ed in4 è HIGH, il motore B smart car.
gira in senso antiorario. La fase di riaccensione dei mo-
tori è caratterizzata da un aumento graduale di potenza MODULO SENSORE A ULTRASUONI HC SR04
che possiamo ottenere mediante l’accelerazione (listato Il sensore a ultrasuoni consente alla smart car di vedere
a pag. 58). e riconoscere virtualmente l'oggetto, misurare la distanza
L'ultima parentesi graffa chiude il blocco del ciclo void ed evitare gli ostacoli, con un raggio operativo che varia
loop. In questo listato possiamo subito notare due blocchi in un range compreso tra i 2 cm e i 450 cm. Il modulo
base: il blocco void setup () nel quale vengono scritte sensore ultrasonico HC SR04 per Arduino viene utiliz-
le istruzioni di configurazione da fare all’accensione e il zato per il rilevamento degli ostacoli e trasmette le onde
blocco void loop () in cui si scrive il programma princi- ultrasoniche dalla sua testa per poi ricevere nuovamente
pale. Le funzioni void setup () e void loop () sono dei veri le onde ultrasoniche riflesse da un oggetto. Il principio di
e propri blocchi di codice, la funzione setup contenente funzionamento del sensore a ultrasuoni è il seguente: il
impostazioni e parametri iniziali viene eseguita all’inizio, a sensore ultrasonco emette il segnale breve e ad alta fre-
questa segue la funzione loop in cui è scritto il programma quenza. Gli ultrasuoni si propagano nell'aria alla velocità
principale eseguito ciclicamente finchè non viene resetta- del suono. Se colpisce un oggetto, riflette il segnale dell'e-
ta la scheda tramite il pulsante di reset o tolta l’alimenta- co sul sensore. Costruttivamente il sensore a ultrasuoni
zione. Come è facile notare, i blocchi di programma sono è costituito da un multi vibratore fissato alla base, una
racchiusi in parentesi graffe. La funzione digitalWrite () combinazione di vibratore e risonatore che eroga un'onda
consente la variazione dello stato di un pin tra HIGH e ultrasonica generata dalla vibrazione. L'emettitore produ-
LOW, infatti digitalWrite è una funzione usata per trattare ce un'onda sonora alla frequenza di 40 kHz mentre il ri-
segnali digitali che possono assumere solo valori logici e velatore rileva un'onda sonora alla frequenza di 40 kHz e
quindi per comandare attuatori mediante una logica LOW/ restituisce il segnale elettrico al microcontrollore.
HIGH. Con la funzione delay imponiamo una pausa, ad
esempio delay 1000 significa che abbiamo imposto una MODULI A INFRAROSSI
pausa di 1 secondo, dal momento che la funzione delay I raggi infrarossi sono delle radiazioni elettromagnetiche
richiede la misurazione dell’intervallo di tempo in ms. La la cui lunghezza d’onda λ varia da 0.7 micron a 0.4 milli-
funzione analogWrite () scrive un valore analogico ad un metri. Sul modulo a infrarossi per il rilevamento degli osta-
pin e serve in questo caso per pilotare il motore a diffe- coli sono montati un generatore e un rilevatore di infraros-
renti valori di velocità. La funzione analogWrite è utilizzata si, un paio di resistenze variabili, due led, un timer usato
quindi per trattare segnali analogici e per comandare per modulare la sequenza dei segnali infrarossi, alcune
attuatori mediante una logica analogica. A questo punto resistenze e condensatori. Il generatore lancia un fascio
non ci resta che programmare quelli che potremmo de- di segnali infrarossi che vengono riflessi da un eventuale
finire i “gradi di libertà” della nostra smart car, ovvero gli ostacolo e poi intercettati dal modulo di ricezione. Agendo
spostamenti consentiti (listato a pag. 59). sulle resistenze variabili può essere possibile diminuire la
Avendo associato agli stati LOW e HIGH i versi di rotazio- distanza massima di rilevamento.
ne dei due motori, dal listato si può notare come per ge- Il sensore di traccia è in grado di rilevare la presenza

56
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

// rekindles motors

digitalWrite(in1, LOW);

digitalWrite(in2, HIGH);

digitalWrite(in3, LOW);

digitalWrite(in4, HIGH);

// accelerates from 0 to 200

for (int i = 0; i < 201; i++)

analogWrite(enA, i);

analogWrite(enB, i);

delay(30);

// decelerates

for (int i = 200; i >= 0; --i)

analogWrite(enA, i);

analogWrite(enB, i);

delay(30);

// turn off all motors

digitalWrite(in1, LOW);

digitalWrite(in2, LOW);

digitalWrite(in3, LOW);

digitalWrite(in4, LOW);

delay(2000);

di una traccia nera su di un fondo bianco. Trova ampia Tramite controllo remoto da telecomando a infrarossi è
applicazione nella robotica, in particolare nei robot inse- possibile ad esempio impostare la modalità evita ostacoli
guilinee. Utilizza il medesimo principio del modulo di ri- che prevede il procedere della car fino a che non incon-
levamento ostacoli, ma in questo caso il generatore ed tra un ostacolo; la modalità inseguimento linea segue una
il ricevitore di infrarossi sono meno sensibili e in grado di linea nera in contrasto con lo sfondo bianco; la modalità
rilevare solo segnali di ritorno da una superficie bianca. inseguimento segue i movimenti dell'oggetto posto davan-

57
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

// motor A
int enA = 10;
int in1 = 9;
int in2 = 8;
// motor B
int in3 = 7;
int in4 = 6;
int enB = 5;
void setup ()
{
pinMode(enA, OUTPUT);
pinMode(enB, OUTPUT);
pinMode(in1, OUTPUT);
pinMode(in2, OUTPUT);
pinMode(in3, OUTPUT);
pinMode(in4, OUTPUT);
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(2000);
}
void loop ()
{
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);

delay(1000);
// forward
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA, 180);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(enB, 180);
delay(1000);
// back
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 180);

58
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enB, 180);
delay(1000);
// stop
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(1000);
// turn left
digitalWrite(in1, HIGH);
digitalWrite(in2, LOW);
analogWrite(enA, 180);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(enB, 180);
delay(1000);
// stop
digitalWrite(in1, LOW);
digitalWrite(in2, LOW);
digitalWrite(in3, LOW);
digitalWrite(in4, LOW);
delay(1000);
// direct
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA, 180);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(enB, 180);
delay(1000);
// turn right
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
analogWrite(enA, 180);
digitalWrite(in3, HIGH);
digitalWrite(in4, LOW);
analogWrite(enB, 180);
delay(1000);
}

59
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO

ti alla smart car, effettuando anche eventuali curve. Il tele- MODULO BLUETOOTH
comando non è altro che un led che emette luce infraros- Oltre al controllo da remoto con telecomando a infrarossi,
sa, alla pressione di un tasto il telecomando emette una la nostra smart car può essere controllata tramite blue-
serie di brevissimi flash di luce infrarossa che vengono tooth connettendosi con un dispositivo intelligente come
letti ed interpretati dal ricevitore. uno smartphone, utilizzando un’app per gestire il robot
car.

UN ESEMPIO DI SKETCH Entrambe le modalità di funzionamento sono indipendenti


Nel listato che segue, un esempio di funzione void setup e possono implementare le diverse funzioni dei vari sen-
() relativa al controllo remoto con infrarossi: sori.

void setup()
IL PROTOTIPO
{ Di seguito vengono mostrati i vari particolari di montaggio
della smart car.
// Initialize motor drive for output mode Dopo aver effettuato gli opportuni assemblaggi e cablag-
gi, la smart car è pronta all’uso.
pinMode(Left_motor_go,OUTPUT); In figura viene mostrato il prototipo completo di tutti i com-
ponenti sopra descritti.
pinMode(Left_motor_back,OUTPUT);

pinMode(Right_motor_go,OUTPUT);
CONCLUSIONI
pinMode(Right_motor_back,OUTPUT); Con questo articolo abbiamo cercato di fornire un input
alla prototipazione con Arduino, implementando la scheda
pinMode(Right_motor_en,OUTPUT); per programmare il moto di una mini smart car.

pinMode(Left_motor_en,OUTPUT); Ovviamente non abbiamo analizzato tutti gli scenari possi-


bili con i relativi sketch, ad esempio il controllo a ultrasuoni
pinMode(key,INPUT);// Set button as input
per evitare ostacoli o il controllo da remoto con infrarossi.
pinMode(beep,OUTPUT);// Set buzzer as output
Le combinazioni sono molteplici e le funzionalità espandi-
bili, non resta che stimolare la curiosità sperimentando
i vari scenari per testare le infinite possibilità di questa
pinMode(SensorRight, INPUT); // Set Right Line scheda apportando le opportune modifiche al codice.
Walking Infrared sensor as input
La messa su tavola dei circuiti è semplificata da Fritzing,
pinMode(SensorLeft, INPUT); // Set left Line Walking
un free software utilizzato per la progettazione elettronica
Infrared sensor as input
(Electronic Design Automation), totalmente open sour-
pinMode(SensorRight_2, INPUT); //Set Right Infrared ce e che permette di passare dall'idea di prototipo basato
sensor as input sulla breadboard al circuito stampato.

pinMode(SensorLeft_2, INPUT); //Set left Infrared


sensor as input

digitalWrite(key,HIGH);//Initialize button L’autore è a disposizione nei commenti per eventuali


approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
digitalWrite(beep,LOW);// set buzzer mute direttamente all’articolo sul Blog e partecipare alla discussione:
https://it.emcelettronica.com/controllo-del-moto-di-una-smart-car-
} con-arduino

60
LA NUOVA
SCHEDA ARDUINO
EDGE CONTROL
AUTOMATIZZA
L’AGRICOLTURA
INTELLIGENTE di Giordana Francesca Brescia

Arduino Edge Control è il nuovo dispositivo della serie Arduino PRO, di facile implementazione, adatto per
applicazioni di monitoraggio in tempo reale e controllo remoto, ottimizzato per applicazioni in ambienti
esterni. Si amplia quindi la gamma di componenti della famiglia Arduino, la piattaforma a microcontrollore
made in Italy, amatissima da makers, progettisti e appassionati di elettronica. In questo articolo vedremo
cosa è Arduino Edge Control e cosa si può realizzare con questa potente e versatile scheda.

UNA PANORAMICA INTRODUTTIVA gli sforzi dei produttori di componenti elettronici, per for-

S
ono trascorsi ormai ben sedici anni dall'uscita della nire soluzioni sempre al massimo delle possibilità e delle
prima scheda a microcontrollore Arduino. Il proget- prestazioni. Vediamo ora, nello specifico, di cosa si tratta.
to Arduino nasce presso l'Istituto di Interaction De- L'hardware open source Arduino Edge Control apporta
sign di Ivrea grazie alla collaborazione di cinque docenti. creatività e innovazione all'agricoltura moderna. Allo stes-
La scheda elettronica programmabile Arduino è da sem- so tempo, è una soluzione sicura e altamente scalabile. La
pre considerata la base per la realizzazione di progetti in scheda è in grado di ottimizzare il monitoraggio e il con-
modo rapido e intuitivo, un must per i progettisti elettronici, trollo remoto nelle applicazioni dell'agricoltura intelligente,
gli appassionati ed i makers di tutto il mondo. Nel corso nell'agricoltura di precisione e in tutte quelle applicazioni
del tempo si sono susseguiti diversi modelli della scheda che richiedono un controllo intelligente e automatizzato in
e, parallelamente, si è andata ad ampliare in modo consi- luoghi remoti. Si tratta di settori in forte crescita, dei quali
stente la gamma di applicazioni realizzabili, spaziando da sentiremo sempre di più parlare in futuro, grazie anche
piccoli progetti di hobbistica a prototipi di robotica, mec- alle moderne tecnologie che li supportano. Se volessi-
canica o monitoraggio ambientale. Un lasso di tempo nel mo invece definire il tipo di mercato al quale si rivolge, è
quale sono state sviluppate e diffuse sul mercato soluzioni sicuramente quello delle applicazioni high level, si tratta
che solo fino a qualche anno prima erano del tutto impen- infatti di un hardware di livello professionale. Come sem-
sabili. Arduino Edge Control (Figura 1, Figura 2, Figura pre accade quando vengono lanciate nuove tecnologie
3) è la nuova scheda di casa Arduino, lanciata da poco nel mondo Arduino, la partecipazione della community
sul mercato embedded delle schede a microcontrollore. sarà preziosa per sviluppare e testare progetti anche
Dal design robusto e accattivante, Arduino Edge Control con questo nuovo hardware. L'innovativa piattaforma
ha sin da subito trovato la sua naturale collocazione nella Arduino, infatti, vanta una grande community di milioni
moltitudine di applicazioni verso le quali si concentrano di utenti a livello mondiale, fatta di makers e progettisti

61
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE

Figura 1. La scheda Arduino Edge Control

ne nell'agricoltura di precisione. Arduino Edge


Control ha tutto ciò che serve per realizzare
un progetto IoT. Se ci pensiamo, ciò che serve
per realizzare un progetto IoT è, innanzitutto,
un hardware open source flessibile e scalabile,
una piattaforma di sviluppo, un set di sensori e
una app per il monitoraggio da remoto.
Grazie all'Arduino Edge Control può essere
migliorata la qualità del raccolto, oltre al moni-
toraggio intelligente in tempo reale di condizio-
ni ambientali, qualità del suolo e crescita delle
colture. C'è un fattore importante da tenere in
considerazione. Oggigiorno i dispositivi IoT
non sono percepiti solo come semplici prodot-
ti, tutt'altro, sono dei veri e propri servizi che
permettono di gestire in modo automatizzato
Figura 2. Arduino Edge Control packaging i dati forniti e raccolti dai sensori intelligenti
ai quali i dispositivi stessi sono collegati, per
questo motivo molte realtà aziendali stanno
elettronici, molto attiva e orientata al "learning by doing". implementando le tecnologie dell'Internet delle Cose per
Una breve digressione era doverosa. Torniamo ora alla offrire ai propri clienti il massimo livello di automazione
scheda Arduino Edge Control. Per gestire l'Arduino Edge delle attività.
Control da remoto basterà installarlo sul campo e utilizza- L'elaborazione intelligente dei dati real time è un altro
re quindi il servizio Arduino IoT Cloud (Figura 5) o altri punto di forza della scheda Arduino Edge Control. A tal
servizi di terze parti. Progettata per ridurre al massimo proposito, ricordo che i sensori sono componenti molto
il consumo di energia, requisito particolarmente richie- frequentemente impiegati proprio nell'agricoltura smart, e
sto nelle applicazioni low power dell'ecosistema IoT e che ben si prestano nella gestione intelligente dei dati am-
dell'agricoltura 4.0, la scheda mantiene acceso solo l'har- bientali. Relativamente ad Arduino Edge Control, i dati,
dware essenziale relativo agli interrupt esterni. I sistemi di infatti, come anticipato in precedenza, possono essere
controllo a bassa potenza hanno trovato ampia diffusio- raccolti in tempo reale dai sensori e inviati all'Arduino

62
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE

Figura 3. Fronte-retro della confezione contenente la scheda Arduino Edge Control

IoT Cloud per l'analisi in tempo reale. La catena del valo- In generale, Arduino Edge Control viene utilizzato in
re dei dati è un'analisi preziosa utile per supportare i pro- applicazioni fisse e ben si presta per il monitoraggio e il
cessi aziendali a vari livelli. Tutti noi sappiamo bene quan- controllo in questi specifici settori di attività:
to i dati siano importanti strumenti di valore e quanto la • condizioni meteorologiche
corretta gestione di essi faccia la differenza nella resa di • misurazioni agricole
un processo e di un'attività. • sistemi di irrigazione smart
• qualità del suolo
IN QUALI APPLICAZIONI POSSIAMO • crescita delle colture
UTILIZZARE ARDUINO EDGE CONTROL • resa del raccolto
Il dispositivo consente di automatizzare una vasta gam- • efficienza delle apparecchiature
ma di attività agricole come l'irrigazione, la fertilizzazione • controllo dell'irrigazione
e il controllo dei parassiti. Arduino Edge Control è in grado • controllo della fertilizzazione
di gestire dati relativi alle condizioni meteorologiche, alla • controllo dei parassiti
qualità del suolo ed alla crescita delle colture, parametri • qualità del raccolto
determinanti per la resa di un'attività agricola, poiché of- • controllo degli accessi
frono una metrica sull'efficienza e sulla produzione delle • condizioni delle acque nelle piscine
colture. Il largo impiego di Arduino Edge Control è dovuto • acquisizione di dati geospaziali
all'automatizzazione dei processi con conseguente au- • automatizzazione del controllo qualità
mento della qualità delle colture e riduzione dello sforzo
o errore umano, e di ogni fonte di rischio derivante dalle “Con Arduino Edge Control, in sostanza, è possibile
attività agricole. L'hardware si presta a una vasta gam- monitorare in tempo reale un processo agricolo
ma di situazioni e può essere posizionato praticamente completo
ovunque, è in grado di collegare sensori e azionare attua-
tori come valvole di blocco, molto comuni in agricoltura. Arduino Edge Control è anche una soluzione di monito-
Utilizzando Arduino Edge Control è possibile minimizzare raggio e controllo ideale per la gestione di queste impor-
i rischi legati alla produzione e gli errori umani di gestio- tanti attività:
ne del processo, riducendo i costi annessi e migliorando • Serre automatizzate: per gestire in modo auto-
l'efficienza del business con l'automazione e l'agricoltura matico l'umidità e la temperatura e altri parametri,
predittiva. garantendo il miglior ambiente per la crescita delle
piante, riducendo al minimo le emissioni di car-
“Quali sono le applicazioni di monitoraggio e
bonio e massimizzando la resa economica delle
controllo, alle quali si rivolge Arduino Edge Control?
colture. Con l'aggiunta di uno scudo GPS Arduino

63
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE

MKR, è possibile effettuare una pianificazione


ottimale della rotazione delle colture ed acqui-
sire dati geospaziali;
• Idroponica/Acquaponica: nelle applicazioni
che prevedono la crescita delle piante senza
il suolo, si rende necessario un controllo au-
tomatizzato delle condizioni ambientali adatte
alla crescita delle colture minimizzando il la-
voro manuale;
• Coltivazione di funghi: per monitorare i pa-
rametri di temperatura e umidità adatti a so-
stenere la crescita delle spore. Sensori water-
mark, porte di uscita e opzioni di connettività
disponibili su Arduino Edge Control, rendono
questo possibile.

Arduino Edge Control può essere implementato an-


che come soluzione adatta per altri ambienti ester-
ni, ad esempio, nei cantieri o nel settore immobiliare
per automatizzare il controllo degli accessi, o dalle
società di manutenzione e pulizia delle piscine per
monitorare e controllare le condizioni dell'acqua della
piscina da luoghi remoti.

SPECIFICHE TECNICHE DI LIVELLO


PROFESSIONALE
Come accennato precedentemente, si tratta di una
scheda affatto energivora, il basso consumo energeti-
co è uno degli aspetti che la rendono particolarmente
interessante e facilmente implementabile. L'assenza
Tabella 1. Specifiche tecniche della scheda Arduino Edge
sulla scheda di sensori built-in, che sono invece pre- Control (Fonte: store.arduino.cc/edge-control)
senti in diverse altre soluzioni embedded, viene am-
piamente compensata dalle numerose porte I/O, slot unità a virgola mobile che opera a 64 MHz. Per quanto
MKR integrati (per collegare le schede MKR Arduino ed concerne invece la connettività, Arduino Edge Control
estendere le funzioni di connettività) e connettori dedicati è dotato di Bluetooth integrato. La sua connettività può
per interfacciare moduli (ad esempio un modulo display essere espansa facilmente attraverso l'utilizzo di modem
LCD). A ciò si aggiunge anche la possibilità di connette- 2G/3G/CatM1/NB-IoT, LoRa®, Sigfox e Wi-Fi aggiungen-
re sensori esterni o associare stazioni meteorologiche, in do qualsiasi scheda della famiglia MKR. Arduino Edge
base all'applicazione specifica richiesta. Un ampio ven- Control può essere alimentato da un pannello solare o da
taglio di possibilità per una vasta gamma di funzionalità un classico alimentatore DC. In Tabella 1 sono riassunte
espandibili. le principali caratteristiche funzionali della scheda.
Relativamente all'ingombro, la scheda ha dimensioni di Sulla control board è presente anche uno slot per schede
104 mm x 86 mm. La scheda Arduino Edge Control è micro SD e una memoria flash aggiuntiva da 2 MB per
basata sul processore SoC nRF52840, appartenente l'archiviazione dei dati, entrambi direttamente connessi
alla famiglia di SoC della famiglia nRF52. Si tratta, nello al processore tramite un'interfaccia SPI. Gli schematici
specifico, dello stesso processore della scheda Arduino dell'Arduino Edge Control sono completamente open
Nano BLE. E' compatibile con molte librerie per Intelligen- source, Arduino mette a disposizione tutti gli stru-
za Artificiale, quale TensorFlow micro. Il chip nRF52840 menti per creare il vostro hardware personalizzato.
è costruito attorno alla CPU ARM Cortex-M4 a 32 bit con Il basso consumo energetico, le numerose porte di

64
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE

#include <Arduino_EdgeControl.h>

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

// Set the timeout


auto startNow = millis() + 2500;
while (!Serial && millis() < startNow);
Serial.println("Hello, Edge Control Sketch!");

// Enable power lines


Power.enable3V3();
Power.enable5V();

// Start the I2C connection


Figura 4. Un esempio di applicazione della scheda Arduino Wire.begin();
Edge Control con display LCD e due schede Arduino MKR 1300
// Initalise the expander pins
Expander.begin();
output, le diverse opzioni di connettività modulare e la
Expander.pinMode(EXP_LED1, OUTPUT);
possibilità di collegare numerosi sensori esterni rendo-
}
no Arduino Edge Control non solo una scheda interessan- void loop()
te dal punto di vista hardware, ma un vero e proprio siste- {
ma di controllo altamente flessibile e scalabile, in grado di // put your main code here, to run repeatedly:
adattarsi alle specifiche esigenze agricole e di migliorare Serial.println("Blink");
significativamente le attività dell'agricoltura intelligente, Expander.digitalWrite(EXP_LED1, LOW);
senza al contempo perdere la connotazione dell'open delay(500);
source, da sempre elemento distintivo dell'intero ecosi- Expander.digitalWrite(EXP_LED1, HIGH);
stema Arduino, sia lato software sia lato hardware. delay(500);
Per utilizzare la scheda è stata predisposta una apposi- }
ta libreria di controllo, che fornisce l'accesso a molti dei
diversi pin e funzionalità. Si tratta della libreria "Arduino_ Diversi sketch di esempio si possono consultare sul sito
EdgeControl" che fornisce anche le API fondamentali utili web Arduino PRO o nell'ambiente di sviluppo Arduino IDE.
per la scrittura del codice.
Le librerie sono risorse preziose che tornano sempre utili ARDUINO IOT CLOUD, LA WEB APP
in fase di programmazione, essendo porzioni di codice già INTELLIGENTE
scritte. Arduino PRO fornisce anche un utile tutorial inizia- Arduino IoT Cloud (Figura 5) è un servizio sicuro, sca-
le, una guida introduttiva passo-passo per prendere su- labile e di facile configurazione, per sviluppare i propri
bito dimestichezza con l'Arduino Edge Control, completa progetti IoT in modo fluido e veloce, connettendo sen-
delle istruzioni di configurazione della scheda con il noto sori con applicazioni intelligenti. Connettere, monitorare,
ambiente di sviluppo IDE (Integrated Development Envi- controllare e gestire i dispositivi da remoto attraverso la
ronment) di Arduino. dashboard, non sarà più un problema con Arduino IoT
Nella guida di Arduino PRO troverai anche i collegamenti, Cloud. La dashboard della web app Arduino IoT Cloud
l'alimentazione, le funzioni di controllo dei pin GPIO e lo consente di fare tutto questo in modo semplice e intuitivo.
sketch per far lampeggiare un LED, riportato qui sotto. Il Anche la fase di creazione del codice per programmare il
tutorial può essere interamente visualizzato QUI. dispositivo è notevolmente semplificata, basta aggiungere
solo alcune righe di codice per personalizzare quello che
Di seguito un esempio di sketch completo per far lampeg- fornirà l'app. Una volta aggiunto il dispositivo all'Arduino
giare il LED della scheda: IoT Cloud, infatti, Arduino Cloud crea automaticamente il

65
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE

Figura 5. La dashboard di Arduino IoT Cloud

codice per programmare il device. I codici di esempio per store ufficiale di Arduino: store.arduino.cc
sensori e attuatori semplificano ulteriormente il processo
di programmazione. Si possono trasmettere i dati dei >> Per consultare tutte le specifiche tecniche, i pin, le po-
sensori a fogli di calcolo o database e automatizzare sizioni dei connettori e il disegno meccanico della scheda,
alerts e azioni. Con le API Arduino IoT Cloud gli sviluppa- vi rimando alla prossima sezione.
tori possono anche creare app personalizzate. Ma non è
tutto. Sono forniti anche esempi per connettersi a Google RIFERIMENTI & PRODUCT DATASHEET
Spreadsheets, Amazon Alexa o altri servizi di terze parti.
La web app Arduino IoT Cloud garantisce comunicazioni [1] STORE ARDUINO EDGE CONTROL
sicure dei dispositivi IoT al cloud con protocollo standard
industriale SSL. Con Arduino IoT Cloud si possono ana- [2] Sense the future of smart agriculture with Arduino
lizzare in tempo reale i dati dei sensori e organizzarli in Edge Control
grafici raggiungendo alti livelli di automatizzazione della
nostra attività. [3] Introducing the Arduino Pro Edge Control: The Future
of Smart Agriculture:
CONSIDERAZIONI CONCLUSIVE
Arduino Edge Control è il sistema di controllo low power
pensato per rendere innovativa l'agricoltura di precisio-
ne, connettere i dispositivi IoT al cloud utilizzando app
per controllarli, visualizzare, gestire e analizzare i dati
dei sensori, e automatizzare molte delle comuni attività
agricole, semplificando e accelerando lo sviluppo del pro-
prio progetto. Grazie alla scheda Arduino Edge Control si
può customizzare la propria applicazione IoT con il pote-
re dell'edge e dell'Intelligenza Artificiale. La possibilità di
espansione della connettività wireless con le schede della
famiglia Arduino MKR, rende Arduino Edge Control una
scheda dalle potenzialità applicative infinite.
L’autore è a disposizione nei commenti per eventuali
“L'agricoltura4.0 diventa sempre più smart con approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
direttamente all’articolo sul Blog e partecipare alla discussione:
Arduino Edge Control
https://it.emcelettronica.com/la-nuova-scheda-arduino-
edge-control-automatizza-lagricoltura-intelligente
Arduino Edge Control è disponibile per l'acquisto sullo

66
[DIY] COME AGGIUNGERE
UNA WEBCAM E IL
CONTROLLO REMOTO AL
VOSTRO ROBOT di Stefano Lovati

Gli appassionati di robotica sanno quanto sia importante aggiungere una funzionalità particolare quale
una webcam a un piccolo robot o auto radiocomandata, con la possibilità di visualizzare il video remota-
mente, su uno smartphone o su un tablet. Non meno importante e utile è la possibilità di controllare i movi-
menti del robot tramite un dispositivo mobile dotato di un’opportuna applicazione Android. In questo arti-
colo presenteremo due progetti DIY (Do-It-Yourself) che vi mostreranno, passo per passo, come raggiungere
questi due avvincenti traguardi.

PRIMA PARTE: CONTROLLO REMOTO DEL HARDWARE


ROBOT 1. una board Arduino;

I
n questo progetto vedremo come sia possibile control- 2. due servo motori a rotazione continua;
lare remotamente un robot o un veicolo radiocomanda- 3. un modulo Bluetooth con UART TTL 5V (come ad
to tramite un’applicazione Android e uno smartphone esempio il Bluesmirf Gold/Silver);
o tablet. I componenti richiesti per la realizzazione del 4. un ball caster per robot;
progetto sono elencati di seguito: 5. due ruote per robot;

Figura 1: schema a blocchi del robot controllato remotamente

67
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

PRINCIPIO DI FUNZIONAMENTO
Il robot comunica con l’applicazione in ese-
cuzione sul dispositivo remoto Android trami-
te l’interfaccia Bluetooth. Quando, infatti, si
preme un tasto qualsiasi sul pannello dell'in-
terfaccia utente dell’applicazione, i corrispon-
denti comandi vengono inviati tramite la con-
nessione Bluetooth al modulo installato sul
robot. Tutti i comandi sono in formato ASCII,
e sono quindi composti da una sequenza di
caratteri. Il software in esecuzione sulla bo-
ard Arduino presente sul robot controlla poi i
comandi ricevuti e, se questi corrispondono a
quelli attesi, attiva i servo motori in funzione
Figura 2: vista dall’alto del robot con i componenti già posizionati
dello specifico comando, causando il movi-
mento in avanti, indietro, a sinistra, a destra,
oppure l’arresto del robot.
Lo schema a blocchi del progetto relativo al robot con-
trollato da un’applicazione Android è visibile in Figura 1.
Vediamo ora in dettaglio i vari passi su cui si articola la
realizzazione del robot a controllo remoto.

STEP 1 - ASSEMBLAGGIO DEI COMPONENTI


Prendete la piastra di materiale plastico e posizionate i
servo motori in corrispondenza dei bordi laterali destro
e sinistro utilizzando della normale colla a caldo per il
fissaggio. Aggiungete poi il ball caster. Sul lato superio-
re della piastra andrà poi posizionata la board Arduino,
utilizzando del nastro bi-adesivo; un’operazione analoga
andrà eseguita per il contenitore delle batterie. Il risultato
è mostrato nelle Figure 2 e 3.

STEP 2 - SETUP DEL COLLEGAMENTO CON


ANDROID
In questo step vedremo come realizzare i collegamenti a
Figura 3: vista dal basso del robot con in evidenza il ball livello hardware con la scheda Arduino e con i servomoto-
caster
ri. A differenza dei normali servomotori, quelli a rotazione
continua non possono essere controllati e impostati su
6. un telaio (chassis) per robot - una piccola scatola uno specifico valore di angolo. Questo tipo di servomotore
di materiale plastico dovrebbe essere sufficiente dispone di tre fili per il collegamento: rosso (alimentazio-
per questo scopo; ne), nero (ground) e bianco oppure giallo (segnale PWM
7. quattro pile AA e relativo contenitore. /PPM).
Il filo bianco/giallo del servomotore sul lato sinistro andrà
SOFTWARE collegato al pin digitale 9 di Arduino, mentre il filo bianco/
ambiente di sviluppo (IDE) per Arduino; giallo del servomotore posto sul lato destro andrà collega-
Eclipse per la programmazione in Android (opzionale, non to al pin digitale 10 di Arduino. I fili neri di entrambi i servo-
è strettamente richiesto). motori andranno collegati al pin GND di Arduino, mentre i
Per ulteriori informazioni si può fare riferimento al relativo fili rossi andranno collegati al terminale positivo del porta-
tutorial. batterie. Il pin RX del modulo Bluetooth va collegato al pin

68
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

Figura 4: schema dei collegamenti del robot controllato da Arduino

Figura 5: screenshot relativo allo sketch Arduino

69
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

Figura 6: ricerca dei dispositivi sulla rete Bluetooth Figura 7: l’app Android per il controllo remoto del robot

TX (pin digitale 1) di Arduino, mentre il pin TX del modulo trasferire il codice dello sketch dal PC alla board Arduino.
Bluetooth va collegato al pin RX di Arduino (pin digitale 0). Il modulo andrà collegato solo dopo aver completato la
I pin VCC e GND dello stesso modulo vanno collegati ai programmazione della board.
corrispondenti pin di Arduino.
Il terminale negativo del portabatterie va infine collegato al Lo sketch utilizza la libreria per i servomotori di Arduino,
pin GND di Arduino. Lo schema completo dei collegamen- oltre a qualche semplice comando.
ti è visibile in Figura 4. I servomotori vengono controllati tramite comandi del
tipo:
STEP 3 - CARICAMENTO DELLO SKETCH
ARDUINO servo.write(90) -> arresta il movimento del servomo-
Lo sketch Arduino relativo al progetto del robot controlla- tore
to remotamente può essere scaricato al nostro indirizzo. servo.write(180) -> fa ruotare il servomotore in senso
Una volta scaricato il codice, potete uploadarlo sulla bo- orario
ard Arduino. servo.write(0) -> fa ruotare il servomotore in senso
antiorario
Nota importante: poichè il modulo Bluetooth è collegato
ai pin RX e TX di Arduino, esso andrebbe rimosso prima di Uno screenshot dello sketch è visibile in Figura 5.

70
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

Figura 8: schema a blocchi del progetto

SECONDA PARTE: AGGIUNGIAMO UNA


WEBCAM AL ROBOT
Dotare di una webcam un piccolo robot o un veicolo radio-
comandato è sicuramente un’operazione utile e vantag-
giosa che permette, ad esempio, di vedere esattamente
dove il veicolo si sta dirigendo tramite una connessione
wi-fi ed uno smartphone o tablet. Vediamo, quindi, come
realizzare questo progetto utilizzando un Raspberry Pi e
Figura 9: il Raspberry Pi con la webcam USB e il dongle WiFi una webcam USB. Il flusso video catturato dalla webcam
potrà essere visualizzato (con un ritardo minimo e del tut-
to trascurabile) su un monitor collegato al Raspberry Pi,
STEP 4 - DOWNLOAD DELL’APP ANDROID E oppure su un altro dispositivo connesso alla stessa rete
IMPOSTAZIONE DEL BLUETOOTH locale.
Per installare l’applicazione Android sullo smartphone,
occorre trasferire il file.apk (unzip la cartella) dal PC al di- MATERIALE RICHIESTO
spositivo Android, e poi cliccare su di esso per eseguirne La dotazione hardware richiesta per la realizzazione del
l’installazione. Per chi volesse modificare l’app Android, progetto prevede l’utilizzo di:
sono disponibili i relativi sorgenti del progetto. Assicurate- 1. una scheda Raspberry Pi, equipaggiata con una
vi, inoltre, di aver spuntato l’opzione che consente l’instal- scheda di memoria SD già programmata con un
lazione di app non provenienti dallo Store. sistema operativo;
Una volta installata l’applicazione, prima di aprirla occorre 2. un dongle WiFi o al limite la versione Raspberry Pi
eseguire il pairing e la connessione con il modulo Blue- 3 con il modulo Wireless incorporato;
tooth. Per fare ciò occorre alimentare sia la board Ardui- 3. una webcam USB;
no che il modulo Bluetooth, e poi abilitare la connessione
Bluetooth sullo smartphone. Si può, a questo punto, atti- Per quanto riguarda invece la componente software, si
vare la ricerca di nuovi dispositivi Bluetooth (Figura 6) e, utilizzeranno la distribuzione Raspbian (probabilmente
una volta selezionato il modulo dalla lista proposta, inse- quella più diffusa per il Raspberry Pi) e il linguaggio HTML.
rire il codice richiesto per il pairing (normalmente questo
codice è "1234" oppure "0000"). PRINCIPIO DI FUNZIONAMENTO
Prendete nota del nome del vostro dispositivo (in questo Vediamo ora di esaminare il principio di funzionamento
caso è “HC-06”). Dopo aver eseguito il pairing con il robot, del progetto. La webcam USB collegata al Raspberry Pi
andate sull’app Android (“DIY RC car”) e inserite il nome viene normalmente associata al device /dev/video0. In-
del vostro modulo Bluetooth che vi siete annotati in prece- stallando il servizio di streaming “mjpg streamer”, è pos-
denza, e cliccate su “OK”. A questo punto, lo smartphone sibile poi trasmettere il video all’indirizzo IP e alla porta
si collegherà con il robot, e quest’ultimo si muoverà in ac- locale del Raspberry Pi. Sia la risoluzione del video che il
cordo con i tasti premuti sull’applicazione Android (Figura frame rate possono essere impostati tramite dei comandi
7). Linux, anche con il servizio mjpg già attivo. Il video può

71
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

Figura 10: robot controllato tramite smartphone

Figura 11: assemblaggio del robot

72
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

per aggiornare la lista dei pacchetti da installare, e


inseriamo poi i seguenti comandi:

sudo apt-get install ffmpeg


ffplay -f video4linux2 -framerate 15 -video_size
320x240 /dev/video0

Il primo comando installa l’ffmpeg. Il secondo co-


mando fa invece partire il video con un frame rate
di 15fps utilizzando la modalità video4linux2, con
una risoluzione di 320×240, e utilizzando il device
/dev/video0. Una volta fatto partire il video, sarà
possibile vedere sul monitor lo stream catturato
Figura 12: le diverse parti che compongono il robot
dalla webcam.

essere, inoltre, riprodotto su un qualunque dispositivo col- STEP 2 - IMPOSTAZIONE DEL SERVIZIO DI
legato alla rete locale aprendo un file HTML in un browser, STREAM VIDEO PER LA WEBCAM
e puntando all’indirizzo IP e alla porta del Raspberry Pi. In questo step, il video catturato dal Raspberry Pi verrà
Inoltre, per testare la webcam localmente, viene utilizzato trasmesso sulla rete locale, in modo tale che ogni altro
il servizio ffmpeg, il quale permette di osservare il video dispositivo collegato alla stessa rete possa vedere le im-
catturato dalla webcam direttamente su un monitor colle- magini provenienti dalla webcam. Per fare ciò, occorre
gato al Raspberry Pi. anzitutto installare lo streamer mjpg tramite i seguenti co-
Il principio di funzionamento del progetto è riassunto nello mandi:
schema a blocchi di Figura 8.
sudo apt-get install libv4l-dev
Vediamo ora in dettaglio gli step necessari per la realizza- sudo apt-get install libjpeg8-dev
zione del progetto. sudo apt-get install subversion
sudo apt-get install imagemagick
STEP 1 - COLLEGAMENTO E TEST DELLA
WEBCAM USB libv4l-dev e libjpeg8-dev sono richiesti come dipenden-
Il primo passo consiste nel verificare che la webcam venga ze, imagemagick è richiesto per l’installazione, mentre
correttamente rilevata dal Raspberry Pi, e che lo stream subversion è necessario per installare software open
di immagini da essa catturato possa essere visualizzato source. Per scaricare e compilare il codice utilizziamo i
(Figura 9). Per fare ciò, occorre digitare anzitutto il co- seguenti comandi:
mando “lsusb” in una finestra terminale del Raspberry Pi.
L’output del comando è rappresentato dalla lista di tutti i svn co https://svn.code.sf.net/p/mjpg-streamer/code/
dispositivi USB collegati al Pi. Occorre, dunque, verificare cd /home/pi/code/mjpg-streamer/
se in tale lista è presente la webcam: questa può essere make USE_LIBV4L2=true clean all
identificata dal nome del produttore o del software utiliz- sudo make DESTDIR=/usr install
zato. Successivamente, occorre verificare se si è in grado
di vedere sul Pi lo stream video prodotto dalla webcam.
Digitiamo, quindi, il comando “cd /dev/” per posizionarci Ora, per lanciare il servizio e iniziare lo streaming, digitia-
nella directory /dev, e poi digitiamo il comando “ls” per vi- mo il seguente comando:
sualizzarne il contenuto, verificando che il device “video0”
sia presente. mjpg_streamer -i "/usr/lib/input_uvc.so -d /dev/video0
Ora, occorre utilizzare il servizio ffmpeg per visualizzare -y -r 640x480 -f 10" -o "/usr/lib/output_http.so -p 8090
il video catturato dalla webcam su un monitor collegato al -w /var/www/mjpg_streamer"
Pi. Digitiamo anzitutto il comando “sudo apt-get update”

73
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT

Il significato delle opzioni presenti nel comando preceden- monitor. Il robot (Figura 12) può essere controllato uti-
te è il seguente: lizzando un’app su uno smartphone Android. Il video
• -i: parametri di input; catturato dalla webcam USB può poi essere visualizzato
• -d: identifica il device video; tramite un Ipad, un PC, o un qualunque altro dispositivo
• -y: abilita il formato YUV, disabilita l’MJPEG; collegato alla rete WiFi locale.
• -r: specifica la risoluzione;
• -f: specifica il frame rate; CONCLUSIONI
• -o: parametri di output; Questo progetto può servire come base per la realizzazio-
• -p: specifica il numero di porta; ne di sistemi di videosorveglianza, robot per lo streaming
• -w: specifica la directory di output del webserver. video, o persino droni.
Lo stream in tempo reale può essere prodotto (con un ri-
A questo punto il Raspberry Pi avrà cominciato a trasmet- tardo minimo) utilizzando lo streamer mjpg, considerato
tere il video; per poterlo visualizzare, occorre scaricare uno dei migliori servizi di streaming oggi disponibili. Si noti
questo file HTML: video.html. Il contenuto di questo video come, per la realizzazione completa del progetto, non sia
apparirà come nella pagina raspberry pi webcam robot (il richiesto avere sia una board Arduino che un Raspberry
quadrato presente nella pagina verrà sostituito dallo stre- Pi. Il progetto può essere assemblato utilizzando soltanto
am video). Prima di utilizzare il file appena menzionato, il Raspberry Pi.
occorre modificarlo nel modo seguente:
BIBLIOGRAFIA
<html> <body> <h1>DIY Hacking - Webcam Robot</ 1. Android controlled robot: the best Arduino tutorial
h1> <img src="http:192.168.1.9:8090/?action=stream" - DIY Hacking
width="600"> </body> </html> 2. Raspberry Pi webcam robot – best video strea-
ming tutorial - DIY Hacking

L’indirizzo IP “192.168.1.9” deve essere sostituito con DOWNLOAD


quello del vostro Raspberry Pi (potete ottenere questo in- • Codice Arduino (primo progetto)
dirizzo digitando sul Pi il comando “ifconfig”). Utilizzate • App Android: apk e codice (primo progetto)
poi il browser per aprire questo file html e visualizzare il • Video (secondo progetto)
video. Per i dispositivi come l’Ipad o similari, potete utiliz-
zare l’app file manager per aprire il file HTML.

STEP 3 - ASSEMBLAGGIO DEL RASPBERRY PI


WEBCAM ROBOT
Se volete costruire un vostro robot personale, potete se-
guire le istruzioni contenute nel progetto presentato nella
prima parte di questo articolo, che vi permetterà di rea-
lizzare un robot controllabile remotamente tramite uno
smartphone (Figura 10).
Ora dobbiamo aggiungere al robot il Raspberry Pi e la
webcam, e utilizzare un dongle WiFi per abilitare la con-
nessione wireless (oppure la versione Raspberry Pi 3).
Come piattaforma per il Raspberry Pi e la webcam si può
utilizzare una scatola di plastica tagliata a metà (Figura
11), utilizzando della colla per fissare assieme le parti.
L’autore è a disposizione nei commenti per eventuali
Abbiamo così completato il progetto, realizzando un robot
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
controllabile tramite smartphone, con funzionalità di video direttamente all’articolo sul Blog e partecipare alla discussione:
streaming. https://it.emcelettronica.com/diy-come-aggiungere-una-
Si può, infine, utilizzare SSH per attivare da remoto il pro- webcam-e-il-controllo-remoto-al-vostro-robot
gramma sul Raspberry Pi, senza bisogno di collegare un

74
INTELLIGENZA
ARTIFICIALE
CON ARDUINO di Daniele Valanzuolo

L'attività di apprendimento automatico all'interno del campo della robotica è la tematica che maggiormen-
te stimola la ricerca al fine di ottenere “circuiti” in grado di replicare il comportamento umano. Le difficoltà
sono innumerevoli, tra cui sicuramente la potenza di calcolo richiesta che deve essere notevole al fine di po-
ter gestire contemporaneamente sia l’acquisizione da diversi sensori che l’elaborazione delle informazioni,
con la produzione di un risultato finale (output) elaborato in autonomia dall’Intelligenza Artificiale. In que-
sto articolo affronteremo la tematica calata all'interno dell'ecosistema Arduino, valutando i progressi degli
ultimi anni ed i limiti di questa tecnologia a basso costo.

INTRODUZIONE di estrazione delle informazioni a partire dai dati acqui-

T
utti ormai ci siamo cimentati almeno una volta nel siti. Elemento fondamentale dell’apprendimento diviene
realizzare uno sketch o un progetto più complesso l’esperienza nel produrre risultati validi. La definizione
hardware/firmware con il mondo Arduino. Nono- contemporanea di Machine Learning (apprendimento del-
stante negli ultimi anni siano state rilasciate versioni più le macchine) è stata fornita da Tom M. Mitchell:
performanti con processori Arm, le schede Arduino sono
conosciute per le loro limitate potenze di calcolo. Questo “Machine Learning is the study of computer algorithms
forte limite in realtà consente di avere a disposizione del- that allow computer programs to automatically
le schede di sviluppo dal costo contenuto ed accessibile improve through experience.
a chiunque voglia cimentarsi nel mondo dei Makers, ma
di conseguenza limita le possibili applicazioni. Di fatto, la L’apprendimento automatico prevede diverse tipologie
maggior parte dei progetti sono relativi ad applicazioni di di tecniche e/o algoritmi, classificabili nelle seguenti ma-
IoT o capaci di automatizzare funzioni molto semplici quali cro-categorie:
acquisizione dati, visualizzazione informazioni su display • tecniche di apprendimento supervisionato: ven-
e trasferimento attraverso interfacce di comunicazione wi- gono forniti degli esempi di connessione tra input
red o wireless. e output in modo da formare la macchina a preve-
dere nuovi output in futuro. In particolare, la mac-
IL MACHINE LEARNING china sarà in grado di definire una relazione tra
Nel mondo della robotica e dei processi industriali, da anni ingressi e uscite fornite e imparerà ad utilizzarla in
si parla del concetto di Intelligenza Artificiale, ossia l’evo- seguito per casi simili agli ingressi ottenuti;
luzione dell’elettronica che diviene abile nell'elaborazione • tecniche di apprendimento non-supervisiona-
di informazioni a prescindere da modelli o equazioni spe- to: la macchina deve individuare modelli nascosti
cifiche, come farebbe l’essere umano durante l'apprendi- all’interno dei dati di input già strutturati. L’assenza
mento sul campo. Dunque nell’ambiente dell’Intelligenza di output associati agli ingressi consente di trovare
Artificiale viene prestata attenzione in modo particolare ad modelli nascosti a partire dal set dei dati di ingres-
un sottoinsieme applicativo dell’AI che comprende le tec- so;
niche e gli algoritmi di Machine Learning. Le metodologie • tecniche di Deep Learning: il Deep Learning è de-
di Machine Learning, ossia di apprendimento automatico, finito come un sottoinsieme di tecniche di Machine
sono basate in linea di principio su metodi computazionali Learning (come rappresentato in Figura 1) basato

75
INTELLIGENZA ARTIFICIALE CON ARDUINO

necessitano di un ridimensionamento e dell’introduzio-


ne di nuove tecniche adeguate alle limitate risorse quali
potenza e memoria a disposizione. Una delle principali
modifiche apportate dal team alla versione Lite è quella
dell’abolizione dei numeri in virgola mobile attraverso l’u-
tilizzo di interi a 8 bit.
E’ disponibile anche il progetto TensorFlow Lite che con-
sente l’estensione delle funzionalità di Machine Learning
e reti neurali a sistemi basati su microcontrollori. La diffe-
renza sostanziale tra le due librerie è che TensorFlow è
basata su reti neurali che richiedono comunque una
maggiore complessità di calcolo. Il Machine Learning
non è necessariamente reti neurali, e la libreria TinyML
Figura 1: Dall'Intelligenza Artificiale fino al Deep Learning fornisce una valida alternativa di tecniche di appren-
dimento applicabili anche a microcontrollori a 8 bit e con
una quantità di RAM esigua.
su reti neurali stratificate in grado di processare A partire da questi due progetti di Machine Learning e
elevate quantità di dati. le relative librerie, sono stati sviluppati all’interno della
Community Arduino diversi esempi applicativi sfruttando
In realtà, a partire da queste 3 macro-categorie esistono le capacità di una delle schede Arduino di ultima gene-
molte sotto-categorie che, sfruttando le peculiarità delle razione, ossia la scheda Arduino Nano 33 BLE Sense.
varie tecniche di apprendimento, realizzano ulteriori algo- Questa tipologia di scheda (dotata di un processore ARM
ritmi e tecniche che di fatto trovano la vera applicazione Cortex-M4) è stata scelta per la presenza anche di diversi
nei sistemi dotati di Machine Learning. Tra le tecniche più sensori interessanti (IMU, microfono, modulo BLE, sen-
conosciute ed adoperate troviamo gli alberi decisionali, sori ambientali) su una superficie dell’oggetto veramente
il clustering per la classificazione degli oggetti nei metodi ridotta. Gli esempi prodotti dalla combinazione delle libre-
non supervisionati, algoritmi basati su calcoli probabili- rie di Machine Learning e questa fantastica scheda sono:
stici, stratificazione dell’elaborazione (con l’utilizzo di reti • Riconoscimento vocale grazie all’utilizzo di un mi-
neurali) e tanto altro. crofono integrato sulla scheda
• Riconoscimento gestuale adoperando i dati acqui-
TINYML E TENSORFLOW APPLICATI AD siti dal modulo inerziale IMU
ARDUINO
Il progetto TinyML nasce con l’esigenza di sviluppare tec- MACHINE VISION APPLICATA AD ARDUINO
niche di apprendimento semplici da applicare a sistemi a La Machine Vision, detta anche visione artificiale, è un
basso consumo con l’obiettivo di supportare lo sviluppo di aspetto molto importante nel settore industriale in quanto
una varietà di oggetti adatti o adattabili a molteplici casi è possibile realizzare sistemi automatici per monitorare i
d'uso, garantendo una semplicità di utilizzo e una larga processi industriali ed ottenere maggiori livelli di qualità
diffusione del concetto di Machine Learning. In questa ed efficienza nella produzione. Le tecniche e le tecnologie
evoluzione, e grazie al trend Makers in atto da diversi utili alla realizzazione di sistemi di Machine Vision sono in-
anni, il team di Tiny si è prefissato di realizzare anche numerevoli e presentano molte peculiarità che dipendono
una versione compatibile con i microcontrollori meno dall’obiettivo prestazionale finale. Inoltre, la combinazio-
prestanti come quelli adoperati sulle board Arduino, e ne di queste informazioni con la possibilità di controllare
dunque oggetti che dispongono di una potenza di calcolo dei sistemi di attuazione (o veri e propri robot industriali)
ancora più limitata. L’idea di base è poter avere a dispo- consente di realizzare sistemi complessi molto avanzati.
sizione oggetti economici e piccoli in grado di poter L’introduzione delle tecniche di Machine Learning com-
eseguire operazioni di Machine Learning in maniera binate a dati forniti dall’acquisizione di immagini video,
localizzata. Ovviamente, la strada del successo è lunga fornisce una combinazione per ottenere sistemi dotati di
in quanto gli algoritmi di apprendimento automatico appli- Intelligenza Artificiale evoluta, che trovano larga applica-
cabili su piattaforme ad elevata potenza computazionale zione non solo nel settore industriale ma anche in quello

76
INTELLIGENZA ARTIFICIALE CON ARDUINO

Figura 2: Modulo OV7670 accoppiato a ELEGOO UNO R3 Figura 3: Modulo camera OV7670

della sicurezza nazionale in luoghi sensibili (stadi durante • Gamma dinamica: 52 dB


eventi importanti, aeroporti, luoghi di culto, etc.). Come in-
trodotto precedentemente, le forti limitazioni prestazionali C’è da precisare che con questo modulo non stiamo par-
di Arduino non consentono la realizzazione di veri e propri lando di camere FULLHD o 4K e va sottolineato che il
progetti di Machine Vision, ma esiste comunque una so- sistema di focus è completamente meccanico. Nono-
luzione valida per dotare la nostra fidata scheda del dono stante queste forti limitazioni, il costo davvero irrisorio del
della vista (Figura 2). modulo (circa 5€) rende l’oggetto accessibile ed utile per
L’oggetto che voglio mostrarvi è il modulo OV7670 (vedi realizzare innumerevoli progetti dotandoli delle funziona-
Figura 3) distribuito da AZ delivery. Questo è un modulo lità di Machine Vision per elaborare semplici informazioni
di espansione a 18 pin dotato di sensore di immagine (ap- (presenza di movimento, luce, identificazione di oggetti
punto il sensore OV7670 prodotto dalla OmniVision Te- colorati o da particolari forme) o per il trasferimento delle
chnologies Inc.) che consente di acquisire immagini con immagini acquisite verso un’unità di elaborazione più po-
le seguenti risoluzioni: VGA (640x480) (valore di default), tente ed applicare algoritmi di image processing e Intelli-
QVGA (320x240), CIF (352x240) e QCIF (176x144). genza Artificiale evoluti.
L’interfacciamento con Arduino avviene attraverso un bus Il Pinout del modulo OV7670 è il seguente:
dati parallelo a 8 linee e secondo uno standard configu-
rabile quale: YCbCr422 (protocollo di default), RGB565,
RGB555 e RGB444. Le ulteriori caratteristiche del modulo
sono le seguenti:
• Risoluzione massima: 640 x 480
• Frequenza fotogrammi massima: 30 FPS
• Area pixel: area pixel 3,6 μm x 3,6 μm
• Intervallo di temperatura massimo: da -30 °C a 70 °C
• Uscita: YUV/YCbCr4: 2: 2 RGB565/555/444
GRB4: 2: 2 Raw RGB Data
• Rapporto segnale/rumore: 46 dB
• Corrente di buio: 12 mV/s a 60 °C
• Voltaggio: 2,5 - 3VDC
• Potenza: 60 mW @ 15 FPS
• Angolo di visione: 25 °
• Intervallo di temperatura consigliato: da 0 °C a 50 °C
• Dimensione ottica: 1/6 "
• Sensibilità 1,3 V/(Lux-sec)

77
INTELLIGENZA ARTIFICIALE CON ARDUINO

La coppia di pin SIOC e SIOD è utilizzata per interfacciare torni. A questo possono essere aggiunti algoritmi
il modulo con i pin della periferica I2C di Arduino in modo di identificazione delle forme
da poter configurare il device nella fase di startup. Il proto- • Scanner di QCODE o Codici a barre
collo utilizzato è SCCB (acronimo di Serial Camera Con- • Rilevamento del colore
trol Bus) sviluppato dalla OmniVision Technologies Inc. • Inseguimenti di oggetti combinando gli algoritmi
per l’interfacciamento con i propri dispositivi CameraChip. precedenti con un sistema di movimentazione
Il protocollo nasce come bus seriale a 3 fili e solo succes- • Rilevamento dei gesti
sivamente è stata introdotta la modalità di funzionamento
a 2 fili per l’interfacciamento di moduli con un numero di Questi esempi sono tutti molto semplici e richiedono ridot-
pin ridotto. ta complessità computazionale.
Attraverso il protocollo SCCB è possibile configurare Nei casi di Machine Vision più evoluta (individuazione e
molti parametri di acquisizione e image processing riconoscimento volti, algoritmi di image processing com-
del chip OV7670 tra i quali bilanciamento del bianco, sa- plessi, individuazione di veicoli in movimento, etc.) è pos-
turazione dei colori, esposizione e tanto altro. sibile immaginare di realizzare un sistema più complesso
Il sensore di imaging (fotografato in Figura 4) è dotato al realizzando l'acquisizione dati attraverso la combinazione
suo interno di blocchi funzionali capaci di svolgere tutte le Arduino+OV7670 e l'elaborazione delle immagini su una
funzionalità di controllo in autonomia e fornire i segnali di piattaforma più performante.
Video Timing (sincronismi verticale ed orizzontale, clock, Possibili soluzioni sono sia il pc, sia le schede Raspberry
strobe). Pi che, compatibili con Python, consentono l'utilizzo di li-
Il distributore AZ delivery fornisce un manuale dettagliato brerie di image processing già collaudate.
su come realizzare il collegamento tra il modulo e Ardu-
ino UNO e riporta anche i link a diversi sorgenti utilizza- CONCLUSIONI
bili per verificare velocemente il corretto collegamento e il In questo articolo è stato possibile osservare lo stato
funzionamento del modulo Camera. dell’arte di diversi progetti in corso che mirano ad ottenere
Il campo della Machine Vision è molto avvincente e ci funzionalità di Machine Learning o Machine Vision su
sono molte ricerche in termini di combinazioni tra Machi- schede a microcontrollore come Arduino e simili.
ne Vision e Deep Learning per realizzare robot in grado di Nonostante la limitata disponibilità di risorse computa-
apprendere ed interagire con il mondo visivo. zionali e di memoria, queste tipologie di schede risultano
Con le esigue risorse messe disponibili da Arduino e la molto interessanti per realizzare nodi economici di una
risoluzione/qualità di questo modulo non ci aspettiamo di sensor network, soprattutto grazie alla disponibilità di pro-
realizzare complessi progetti di Machine Vision o algoritmi dotti che già integrano una grande varietà di sensori ab-
di image processing, ma di seguito vi elenco un pò di idee binata a moduli di comunicazione wireless (come la sen-
che possono essere realizzate con questa combinazione: soristica e il modulo BLE disponibili a bordo della scheda
• Individuazione di oggetti a partire da algoritmi di Arduino Nano 33 BLE Sense).
image processing per la rilevazione dei bordi/con- Con l'utilizzo del modulo OmbiVision OV7670, invece, è
possibile dotare del dono della vista le schede Arduino
(anche le meno potenti Arduino UNO) avendo così la pos-
sibilità di realizzare piccoli progetti di Machine Vision.
E voi avete avuto modo di utilizzare queste schede Ardui-
no o la libreria del progetto TinyML?

L’autore è a disposizione nei commenti per eventuali


approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
direttamente all’articolo sul Blog e partecipare alla discussione:
https://it.emcelettronica.com/intelligenza-artificiale-con-
arduino
Figura 4: Modulo OV7670 con ottica smontata e pinout visibile

78
PROGETTIAMO CON
ARDUINO IOT CLOUD di Daniele Valanzuolo

L’Internet delle Cose (IoT) è la disciplina che maggiormente stimola l’innovazione nel settore dell’elettronica
di consumo e del DIY (Do It Yourself, equivalente dell'italiano Fai-Da-Te) e non poteva mancare una piatta-
forma Cloud sviluppata dagli ideatori di Arduino, la più grande rivoluzione nel settore del DIY elettronico. In
questo articolo affronteremo l’utilizzo della piattaforma Aduino IoT Cloud in abbinamento ad una scheda
Arduino MKR Wi-Fi 1010 per realizzare un primo progetto applicativo IoT con la piattaforma Cloud messa a
disposizione dalla community Arduino.

INTRODUZIONE • Secure Element ATECC508

A
rduino IoT Cloud è uno dei servizi più recenti of- • Digital I/O Pins 8
ferti dalla community per consentire a chiunque • PWM Pins 13 (0 .. 8, 10, 12, 18/A3, 19/A4)
di progettare e realizzare applicazioni IoT sia con • Comunicazioni: UART, SPI, I2C
device Arduino che di terze parti. L’utilizzo del servizio è • Analog Input Pins 7 (ADC 8/10/12 bit)
molto intuitivo, supportato da un’interfaccia user-friendly. • Analog Output Pins 1 (DAC 10 bit)
A partire da una configurazione della propria applicazione • External Interrupts 10
(che si chiamerà Thing), il servizio consente di genera- • CPU Flash Memory 256 kB (internal)
re automaticamente gli sketch da caricare sui device • SRAM 32 kB
Arduino, configurati per poter lavorare con le imposta- • LED_BUILTIN 6
zioni del progetto configurate, e interagire con lo spazio • USB Full-Speed USB Device and embedded Host
cloud dei servizi della community. Il servizio, inoltre, offre • Dimensioni fisiche: 61.5 mm x 255 mm/peso 32 g
compatibilità con connessioni Wi-Fi e LoRa e possono
essere realizzate in maniera facile e veloce delle sensor Per il progetto aggiungiamo a questa scheda un sensore
networks con monitoraggio dei dati in tempo reale. Per DHT22 per la misura delle temperature (un must che già
poter utilizzare la piattaforma Arduino IoT Cloud è ne- tutti conosciamo nel mondo di Arduino) che andrà connes-
cessario registrarsi dapprima sulla community di Arduino, so al pin0 di Arduino e un display I2C OLED 128x32 basa-
ma scommetto che già lo avete fatto da tantissimo tempo. to sul driver SSD1306 (che andremo ad utilizzare grazie
alla libreria Adafruit) che connetteremo ai pin SCL e SDA
MATERIALE OCCORRENTE dell'Arduino. Lo schema di interconnessione tra Arduino,
Per questo progetto di esempio applicativo ho deciso di display e sensore è riportato in Figura 2.
utilizzare la scheda Arduino MKR Wi-Fi 1010 (vedi Figu- Infine, affinché la nostra applicazione sia IoT e possa co-
ra 1) che integra l’interconnessione Wi-Fi e Bluetooth per municare con Arduino IoT Cloud avremo bisogno di una
realizzare in maniera veloce e immediata progetti di Inter- connessione Wi-Fi a cui collegarci, che può tranquilla-
net of Things. La scheda è dotata di un Arm Cortex-M0 mente essere quella di casa o di uno smartphone in con-
che si interfaccia con un chipset per le comunicazioni wi- figurazione hotspot.
reless, un modulo per la carica di eventuali batterie Litio.
Le caratteristiche complete della scheda sono: PRIMI PASSI
• Microcontroller SAMD21 Cortex®-M0+ 32bit low Per il primo passo da effettuare per il corretto funziona-
power ARM MCU mento è necessario installare sul proprio PC il tool Ardui-
• Modulo radio u-blox NINA-W102 no Create Agent, un plugin che consente la connessione
• Alimentazione (USB/VIN) 5 V delle schede Arduino all’editor web della community Ardu-
• Tensione operativa 3.3 V ino. Il download del plugin è disponibile direttamente sul

79
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 1: Arduino MKR Wi-Fi 1010

Figura 2: Schema di collegamento Arduino - Display - Sensore

sito (riportata in Figura 3 la schermata di installazione dal inglese), però attraverso questa prima pagina possiamo
sito), viene installato sul proprio PC e consente la con- iniziare a scegliere con quale dispositivo interfacciarci ed
nessione al web editor in maniera automatica di tutte le avere tutto sotto controllo. Questa sarà la pagina principa-
schede collegate al PC tramite la porta USB. le attraverso cui possiamo realizzare gli sketch in maniera
Installato il tool Arduino Create Agent possiamo dun- automatica.
que accedere al servizio Arduino IoT Cloud. La prima Allora facciamo Click su “Create Thing” e iniziamo a per-
schermata che compare (Figura 4) ci consente di creare sonalizzare il nostro progetto passo passo. Prima di tut-
il nostro primo “Thing” altrimenti di che Internet of Things to, cambiamo il nome in alto a sinistra (vedi Figura 5) ed
stiamo parlando? Come già accennato nell’introduzione, aggiungiamo un nuovo device. Per aggiungere un nuovo
l’interfaccia è molto semplice ed intuitiva (anche se in device comparirà una procedura guidata che, interagendo

80
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 3: Installazione di Arduino Create Agent

Figura 4: Schermata principale di IoT Cloud

con il plugin Arduino Create Agent, riconosce in automa- re nuovi sketch direttamente dal web e poter comunicare
tico le schede connesse alle porte USB, nel nostro caso con la piattaforma e tutte le sue funzionalità.
la scheda Arduino MKR Wi-Fi 1010 (come mostrato in Nella Figura 8 osserviamo la pagina principale del no-
Figura 6). stro Thing di nome “EOS-MKR1010 "con il device di nome
Premendo ora sul pulsante “CONFIGURE” la procedura “eoswifi”. Come si osserva all'interno della tabella del
proseguirà con la configurazione del dispositivo ed andrà device lo stato riportato del dispositivo è “Ready to con-
a caricare un nuovo software (vedi Figura 7) sulla sche- nect” ossia è stato configurato per lavorare con Arduino
da selezionata in modo tale da renderla disponibile per la IoT Cloud, ma nessun software è stato ancora caricato a
piattaforma IoT Cloud, ossia per garantirci di poter carica- bordo per connettersi alla piattaforma.

81
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 5: Schermata principale di un nuovo Thing

verso il pulsante “Add variable” si aprirà una procedura


guidata che ci aiuta a definire la variabile nelle sue carat-
teristiche: nome, tipologia di dato, parametri di aggiorna-
mento e modalità di interazione.
Per le tipologie di dato esistono delle variabili specifiche
standard preconfigurate oppure i tipi di dati generici (boo-
leani, interi, etc.).
Per il nostro progetto creiamo due variabili (riportate in
Figura 9):
• Temperatura (Figura 10): una variabile di tipo
CloudTemperatureSensor, con aggiornamento
ogni 10 secondi e con permessi di sola lettura
• Display_command: una variabile di tipo boolea-
na, di tipo read&write perché la useremo per in-
viare comandi dalla piattaforma cloud alla nostra
scheda. In particolare, attraverso questa variabile
Figura 6: Schermata di riconoscimento Arduino MKR Wi-Fi
andremo a cambiare l’impostazione di visualizza-
1010 zione della temperatura da °C a °F.

La creazione di queste variabili andrà ad aggiornare i file


Prima di caricare questo software dobbiamo effettuare an- di configurazione dello sketch in modo tale da rendere de-
cora due passaggi: finite ed utilizzabili tali variabili.
• Definire le variabili del progetto, ossia le variabili
da monitorare e scambiare con la piattaforma IoT CONNETTIAMO IL NOSTRO DEVICE AD UNA
• Definire i parametri di connessione del device RETE
Per completare la configurazione è necessario inserire i
PASSIAMO ALLA CREAZIONE DELLE VARIABILI parametri di connessione alla rete Wi-Fi. Questo è possi-
Le variabili del progetto, ossia i parametri da osservare e bile attraverso il relativo pulsante dove si potranno inserire
scambiare con la piattaforma Cloud di Arduino, possono i parametri quali SSID e Password che saranno poi salvati
essere create dalla pagina principale della Thing. Attra- all’interno del file di configurazione dello sketch.

82
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 7: Schermata di aggiornamento del dispositivo per la piattaforma IoT

Figura 8: Schermata del progetto Thing

CREARE LO SKETCH full editor”.


Adesso che tutti i file di configurazione sono pronti pos- Di seguito riporto il codice dell'intero Sketch utilizzato per
siamo andare a creare il nostro sketch, aggiungendo il il funzionamento del display e del sensore di temperatura:
codice del comportamento del nostro dispositivo come se
lavorassimo all’interno dell’IDE Arduino. Il file dello sketch COSTRUIRE LA DASHBOARD
principale è accessibile dalla relativa TAB (vedi Figura 11) Ora che abbiamo configurato il dispositivo e la rete, creato
ed è disponibile anche il Monitor Seriale, ma se si voglio- le variabili, completato lo sketch e caricato con successo
no aggiungere librerie e ulteriori file da modificare al pro- il codice, possiamo passare alla parte più divertente: cre-
getto, allora vi consiglio di passare nella versione “open are la propria dashboard! Dall'interfaccia web di IoT Cloud

83
PROGETTIAMO CON ARDUINO IOT CLOUD

#include <Wire.h>
#include "Adafruit_SSD1306.h" display.setTextSize(1); // Draw 2X-scale text
#include "splash.h" display.setTextColor(SSD1306_WHITE);
#include "DHT.h" display.setCursor(30, 0);
#define SCREEN_WIDTH 128 // OLED display width, display.print(F("EOS\nArduino IoT Cloud\n"));
in pixels display.display();
#define SCREEN_HEIGHT 32 // OLED display height,
in pixels Serial.print("\nEOS Arduino IoT Cloud Example");
}
#define OLED_RESET 4 // Reset pin # (or -1 if sharing
Arduino reset pin) void loop() {
#define SCREEN_ADDRESS 0x3C ///< See datasheet // Your code here
for Address; 0x3D for 128x64, 0x3C for 128x32 temperatura = dht.readTemperature(display_com-
Adafruit_SSD1306 display(SCREEN_WIDTH, SCRE- mand);
EN_HEIGHT, &Wire, OLED_RESET);
Serial.print("\nTemp= ");
#define DHTPIN 0 Serial.print(temperatura);
#define DHTTYPE DHT22 Serial.print(((char)247));
DHT dht(DHTPIN, DHTTYPE); if (display_command == false) {Serial.print("C");}
const char* vitality = "|\\-/-"; //simboli per la vitality else {Serial.print("F");}
#include "thingProperties.h" delay(200);
int counter = 0;
bool update; if (update ==true) update_display();
void setup() { ArduinoCloud.update();
display_command = false;
// Initialize serial and wait for port to open: }
Serial.begin(9600);
// This delay gives the chance to wait for a Serial Moni- void onDisplayCommandChange() {
tor without blocking if none is found
delay(1500); }
update = true;
// Defined in thingProperties.h void update_display()
initProperties(); {

// Connect to Arduino IoT Cloud display.clearDisplay();


ArduinoCloud.begin(ArduinoIoTPreferredConnection); display.setTextSize(1); // Draw 2X-scale text
display.setTextColor(SSD1306_WHITE);
setDebugMessageLevel(2); display.setCursor(30, 0);
ArduinoCloud.printDebugInfo(); display.print(F("EOS\nArduino IoT Cloud\n"));
display.print(String(vitality[counter++%5]));
dht.begin(); display.print(F("\nTemp="));
display.print(temperatura);
if(!display.begin(SSD1306_SWITCHCAPVCC, SCRE- display.print((char)247);
EN_ADDRESS)) { if (display_command == false) {display.print("C");}
Serial.println(F("SSD1306 allocation failed")); else {display.print("F");}
for(;;); // Don't proceed, loop forever display.display();
} //update = false;
delay(200);
display.clearDisplay(); }
delay(1500);

84
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 9: Le variabili del progetto

Figura 10: Info della variabile Temperatura

85
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 11: Schermata della Tab Sketch

Figura 12: Pagina per la creazione di Dashboard

Figura 13: Widgets disponibili per la realizzazione della dashboard

86
PROGETTIAMO CON ARDUINO IOT CLOUD

Figura 14: Dashboard del progetto

• uno switch per gestire l'acquisizione celsius/


fahrenheit che andremo a collegare alla variabile
"display_command"
• un gauge per visualizzare la temperatura all'inter-
no di un intervallo prestabilito che andremo a col-
legare alla variabile temperatura
• un grafico per mostrare l'andamento della tempe-
ratura nel tempo, che andremo a collegare alla va-
riabile temperatura

Il risultato finale della nostra interfaccia grafica è mostrato


in Figura 14, mentre in Figura 15 è riportata una foto con
il display e il sensore collegati alla scheda Arduino MKR
Wi-Fi 1010.

CONCLUSIONI
Siamo giunti al termine di questo progetto con cui abbia-
mo realizzato un sensore di acquisizione della tempera-
Figura 15: Foto del progetto con i dati visualizzati a display
tura, che interagisce con il servizio Arduino IoT Cloud.
Come avete potuto osservare, la piattaforma risulta molto
possiamo accedere alla tab Dashboards e fare click su versatile ed intuitiva nei comandi. La semplicità del pro-
"build dashboard" per creare la nostra. getto consente di poter realizzare complesse reti di sen-
La dashboard è una pagina grafica dove possiamo ag- sor network, con comunicazioni sia Wi-Fi che cellulari
giungere oggetti (che si chiamano Widgets) in grado di o LoRa. Il pacchetto free del servizio limita l’utilizzo alle
interagire con le variabili di tutti i device connessi al pro- schede ufficiali Arduino, ma con un upgrade dal costo ir-
getto. Nel nostro caso abbiamo solo due variabili a dispo- risorio possiamo collegare anche le schede di terze parti,
sizione, ma in progetti più complessi di sensor networks come quelle basate su ESP-01 o ESP32, molto diffuse
ci possono essere tantissime variabili associate in nell’ecosistema del mondo dei Makers Arduino.
maniera indipendente ad innumerevoli device che re-
alizzano i nodi della rete. In figura è riportato l'elenco
L’autore è a disposizione nei commenti per eventuali
delle tipologie di widget a disposizione. L'associazione tra
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
widget e variabili deve sempre rispettare il tipo di variabile direttamente all’articolo sul Blog e partecipare alla discussione:
e la tipologia di widget, per cui non tutte le combinazioni https://it.emcelettronica.com/progettiamo-con-arduino-
sono sempre disponibili. iot-cloud
Nel nostro progetto andremo ad aggiungere 3 widgets:

87
GIOCHIAMO A TRIS
CON ARDUINO di Daniele Valanzuolo

Il numero di progetti che si possono realizzare con le piattaforme Arduino è diventato ormai pressoché infi-
nito grazie alle innumerevoli shield e sensori che sono stati sviluppati per interfacciarsi con i diversi modelli
delle schede Arduino. In questo articolo andremo a realizzare uno dei giochi più diffusi tra i bambini: il gioco
del TRIS detto anche TIC TAC TOE. Chi non ci ha mai giocato? Bastava un foglio di carta e una penna per sfi-
dare i propri amici a chi era il più bravo. Andremo a realizzare questo semplice gioco creando un’interfaccia
grafica e uno schermo touch per giocare con chi vogliamo.

INTRODUZIONE 1. Board Arduino UNO Rev3 o compatibile (a dirla

C
hi non ha mai giocato a TRIS? Il gioco è semplicis- tutta nel mio parco schede ho provato con soddi-
simo: su una griglia 3x3 dobbiamo mettere in fila 3 sfazione anche una ELEGOO UNO rev3)
simboli uguali: la X o la O. Per giocarci basta car- 2. Display OPEN-SMART 3.2: è uno di quelli che si
ta e penna, ma qui sulla community di Elettronica Open trovano sui siti cinesi e costa meno di 10€. Ce ne
Source andremo a realizzarne una versione digitale con sono in commercio molti che differiscono per pro-
un tutorial passo-passo e sfruttando un display TFT touch duttore e per dimensioni. Potete scegliere quello
e la board Arduino Uno. che più vi piace, dovendo però riadattare le librerie
Dunque il materiale occorrente per questo progetto è il da utilizzare con il software.
seguente:

Figura 1: Shield OPEN-SMART 3.2 lato top

88
GIOCHIAMO A TRIS CON ARDUINO

Figura 2: Shield OPEN-SMART 3.2 lato bottom

La shield OPEN-SMART 3.2 per Arduino presenta sul lato


top il display TFT con touch (come si vede in Figura 1)
e sul lato bottom (Figura 2) gli integrati di gestione dello
stesso (ad opera dell’integrato ILI9327). Inoltre, sul bot-
tom vediamo la presenza di uno slot per microSD e di un
sensore di temperatura.
Il principio di funzionamento dello schermo touchscreen
è il seguente:
• La parte display è divisa in pixels con una riso-
luzione di 240px sull’asse x e 400px sull’asse y.
L’origine degli assi è nel primo punto (punto 0,0)
in alto a sinistra.
• La parte touchscreen funziona attraverso due pin
analogici che si muovono tra 0 e 1024: il primo as-
sociato all’asse x e il secondo associato all’asse y.
Per l’asse x i valori più piccoli sono sul lato destro
mentre quelli più grandi sulla sinistra, mentre per
l’asse y i valori più piccoli sono in basso mentre
quelli più grandi in alto. Essendo i valori analogici
che dipendono di fatto anche dalle resistenze in
gioco (di fatto la resistenza è quella propria dello
schermo touch che andrebbe misurata e tarata) i
valori possono essere leggermente diversi e non
vedremo mai lo 0 o il 1024 nella scala.

Per la corretta gestione dell’hardware ho adopera-


Figura 3: Screen del Gioco del Tris to le librerie fornite direttamente dal produttore dell’O-

89
GIOCHIAMO A TRIS CON ARDUINO

LA STRUTTURA DELL’INTERFACCIA GRAFICA


(GUI)
La GUI (Graphic User Interface) è stata realizzata in
maniera semplice ed immediata facendo ricorso alle
funzioni di base della libreria per il disegno di figure
geometriche quali rettangoli, linee e cerchi. Prima di
tutto ho posizionato un quadrato 210 punti x 210 punti,
all’interno del quale ho tracciato le due linee verticali e
le due linee orizzontali per realizzare la griglia 3x3. Ogni
quadrato avrà dunque le dimensioni 70x70 e il centro di
questi quadrati sarà utilizzato per posizionare il simbolo
durante il gioco. In basso alla griglia ho riportato un ul-
teriore quadrato per indicare il simbolo del turno di gioco
mentre, in alto alla griglia è riportato un pulsante di start
solo quando è necessario.

LA LOGICA DI FUNZIONAMENTO
Per il gioco del TRIS, la logica di funzionamento è qualco-
sa di estremamente semplice che possiamo rappresenta-
re con il diagramma di flusso riportato in Figura 4:
• Scelta del simbolo che inizia (RANDOM X or O):
questa funzione è stata realizzata ricorrendo alla
funzione random(0,100) e facendone il modulo 2,
ossia decidendo il numero pari o dispari.
• Attesa della mossa nel turno di gioco (WAIT AZIO-
NE): è stato realizzato attraverso una funzione che
valuta i punti toccati sullo schermo e li assegna ad
uno dei 9 spazi disponibili all’interno della griglia,
se non ancora utilizzato.
• Verifica di un vincitore (CHECK WIN): ad ogni
turno viene effettuata la verifica del vincitore. Di
seguito riporterò la strategia che ho utilizzato per
effettuare queste verifiche.
• Controllo della fine del gioco: il gioco finisce se c’è
un vincitore o se la griglia è stata completata (ho
semplicemente inserito un contatore di turno fino
a 9).
Figura 4: Diagramma di flusso del gioco • Il gioco finirà con un vincitore o con la parità.

Gli algoritmi di controllo del gioco si basano semplicemen-


PEN-SMART che si basano su librerie Adafruit GFX e te su una matrice 3x3, che in C si definisce semplicemen-
TFT-LCD. Purtroppo credo che queste librerie siano state te come un array con doppia dimensione.
leggermente modificate per il corretto funzionamento, in
quanto installando le librerie originali Adafruit GFX il di-
splay non visualizzava nulla. “int matrice [3][3];
Inoltre, con l’ausilio del programma di esempio del touch-
screen di queste librerie ho realizzato una mappatura dei Per chi è meno esperto di programmazione, gli array sono
punti touch di interesse per il gioco che saranno riportati dei vettori di n elementi (dimensione) a cui possiamo ac-
in seguito. cedere attraverso l'indirizzo che va dalla posizione 0 alla

90
GIOCHIAMO A TRIS CON ARDUINO

Figura 5: Differenti screen del gioco realizzato

posizione “n-1”. Dunque, nel nostro caso avremo un array punti centrali di ogni singolo spazio della griglia
di 2 dimensioni, ognuna delle quali composta da 3 ele- che servirà per le funzioni successive.
menti (dunque un array 3x3). Le celle di questo array 3x3 • void CampoVuoto(): viene invocata ad ogni inizio
potranno essere raggiunte con gli indirizzi 0,0; 0,1; 0,2; partita per realizzare la struttura del campo. L’im-
1,0...e via dicendo. Le celle di questa matrice assumeran- plementazione di questa funzione è molto simile
no concettualmente solo 3 diversi valori: 0, +1 e -1. In par- alla precedente funzione in quanto condivide gran
ticolare, al valore 0 ho associato l’assenza di informazione parte del codice tranne il disegno dei pallini colo-
ossia la cella vuota, al valore +1 la presenza del simbolo rati. Si può decisamente ottimizzare il codice rea-
“X” e, dualmente, al valore -1 è associata la presenza del lizzando funzioni atomiche da poter riutilizzare ma
simbolo “O”. Questa scelta si ripercuote sulla gestione per il momento è stato più semplice realizzarlo e
successiva della funzione di verifica del vincitore. Questa debuggarlo in questo modo.
funzione effettua semplicemente 8 somme indipen- • void wait_start(): la funzione è in attesa che i punti
denti delle caselle (le 3 linee orizzontali, le 3 verticali e restituiti dal touch corrispondano alla posizione del
le due diagonali). Se almeno una somma è +3 oppure -3 tasto di “START”. Inolte, è possibile conoscere i
allora il gioco termina con un vincitore, altrimenti prosegue valori x e y del touch durante il tocco direttamente
fino a quando non compare una somma pari a +3/-3 op- all’interno della console seriale grazie alla seguen-
pure il contatore del turno raggiunge 9 (griglia completa). te istruzione:

L’ARCHITETTURA DEL PROGRAMMA Serial.print("\ntp.x=" + String(tp.x) + " tp.y=" + Strin-


Il programma, di cui vi allego anche il codice sorgente nel
g(tp.y) + " ");
successivo paragrafo, è stato realizzato attraverso una
scomposizione in macro-funzioni come segue:
• void setup(void): viene chiamata l’inizializzazione Quest’ultima è molto utile in fase di tuning dei valori per il
del display TFT, della Seriale e la prima pagina corretto riconoscimento della posizione sul touch e dun-
grafica da visualizzare. que dell’assegnazione delle azioni.
• void start_screen(): all’interno di questa funzione è
implementata la prima interfaccia grafica che mo- • int check_win(): come già mostrato nel preceden-
stra una griglia 3x3 con dei pallini colorati al centro te paragrafo, questa funzione effettua il check del
e il pulsante di start in alto. Realizzare accurata- vincitore attraverso 8 somme indipendenti. Il valo-
mente questa pagina grafica è stato utile anche re di ritorno della funzione potrà essere +1/-1 (in
per ottimizzare le posizioni degli oggetti come i caso di una somma vincente) oppure 0.

91
GIOCHIAMO A TRIS CON ARDUINO

• void wait_azione(int turno): la funzione, simile alla // GND -- GND


funzione di wait_start monitora i punti toccati sul // 3V3 -- 3.3V
touch per posizionare eventualmente il simbolo // CS -- A3
del giocatore di turno. Il simbolo viene piazzato se // RS -- A2
i punti corrispondono ai valori limiti riportati della // WR -- A1
casella e se questa risulta vuota. // RD -- A0
• void draft_symbol (int x, int y, int turno): la funzione // RST -- RESET
è stata realizzata per aggiungere velocemente il // LED -- GND
simbolo grafico all’interno della casella. I simboli // DB0 -- 8
dipendono dal giocatore di turno (X oppure O) e // DB1 -- 9
sono realizzati rispettivamente attraverso linee in- // DB2 -- 10
crociate per rendere il simbolo più spesso oppure // DB3 -- 11
cerchi concentrici (con il più piccolo dello stesso // DB4 -- 4
colore dello sfondo) per realizzare la “O”. // DB5 -- 13
• void loop(void): realizza la sequenza della logica // DB6 -- 6
di gioco come riportata nel diagramma di flusso al // DB7 -- 7
precedente paragrafo. // most mcufriend shields use these pins and Portrait
mode:
In Figura 5 sono riportate differenti foto che mostrano le uint8_t YP = A1; // must be an analog pin, use "An"
varie fasi del gioco che ho realizzato. In particolare osser- notation!
viamo: uint8_t XM = A2; // must be an analog pin, use "An"
A. Inizio del gioco notation!
B. Gioco concluso in parità uint8_t YM = 7; // can be a digital pin
C. Gioco concluso con vittoria del simbolo "O" uint8_t XP = 6; // can be a digital pin
D. Gioco concluso con vittoria del simbolo "X" uint8_t SwapXY = 0;
E. Una fase generica del gioco
uint16_t TS_LEFT = 920;
CODICE SORGENTE uint16_t TS_RT = 90;
uint16_t TS_TOP = 940;
#include <Adafruit_GFX.h> // Core graphics library
uint16_t TS_BOT = 140;
//#include <Adafruit_TFTLCD.h> // Hardware-specific
char *name = "Unknown controller";
library
//Adafruit_TFTLCD tft(A3, A2, A1, A0, A4);
// For better pressure precision, we need to know the
#include <MCUFRIEND_kbv.h>
resistance
MCUFRIEND_kbv tft; // hard-wired for UNO shields
// between X+ and X- Use any multimeter to read it
anyway.
// For the one we're using, its 300 ohms across the X
#include <TouchScreen.h>
plate
TouchScreen ts = TouchScreen(XP, YP, XM, YM, 500);
#if defined(__SAM3X8E__)
TSPoint tp;
#undef __FlashStringHelper::F(string_literal)
#define F(string_literal) string_literal
#define MINPRESSURE 100
#endif
#define MAXPRESSURE 6000

int matrice [3][3];


//#define SWAP(a, b) {uint16_t tmp = a; a = b; b = tmp;}
int turno;

uint16_t identifier;
//----------------------------------------|
// TFT Breakout -- Arduino UNO / Mega2560 / OPEN-
SMART UNO Black
#define BLACK 0x0000

92
GIOCHIAMO A TRIS CON ARDUINO

#define BLUE 0x001F tft.fillScreen(BACKGROUND);


#define RED 0xF800 int x1, y1, x2, y2,
#define GREEN 0x07E0 w = tft.width(),
#define CYAN 0x07FF h = tft.height();
#define MAGENTA 0xF81F Serial.print("w="); Serial.print(w); Serial.print(", h=");
#define YELLOW 0xFFE0 Serial.println(h);
#define WHITE 0xFFFF
tft.setCursor(0, 15);
#define NAVY 0x000F tft.setTextColor(WHITE); tft.setTextSize(3);
#define DARKGREEN 0x03E0 tft.println(" TRIS GAME");
#define DARKCYAN 0x03EF tft.setTextSize(1);
#define MAROON 0x7800 tft.setCursor(0, 380);
#define PURPLE 0x780F tft.println("Created by Daniele Valanzuolo");
#define LIGHTGREY 0xC618 //tft.print("Rotation = "); tft.println(rotation);
#define DARKGREY 0x7BEF
//GRIGLIA rettangolo di gioco
#define ORANGE 0xFD20 tft.drawRect(15, 100, 210, 210, YELLOW);
#define GREENYELLOW 0xAFE5 tft.drawLine(15, 170, 220, 170, YELLOW);
#define PINK 0xF81F tft.drawLine(15, 240, 220, 240, YELLOW);
tft.drawLine(85, 100, 85, 310, YELLOW);
#define BACKGROUND 0x7BEF tft.drawLine(155, 100, 155, 310, YELLOW);

void setup(void) //test display


{ tft.fillCircle(50, 135, 15, RED);
uint16_t tmp; delay (250);
tft.begin(9600); tft.fillCircle(120, 135, 15, BLUE);
delay (250);
tft.reset(); tft.fillCircle(190, 135, 15, YELLOW);
identifier = tft.readID(); delay (250);
tft.fillCircle(50, 205, 15, RED);
/* switch (Orientation) { // adjust for different aspects delay (250);
case 0: break; //no change, calibrated for PORTRAIT tft.fillCircle(120, 205, 15, BLUE);
case 1: tmp = TS_LEFT, TS_LEFT = TS_BOT, TS_BOT = delay (250);
TS_RT, TS_RT = TS_TOP, TS_TOP = tmp; break; tft.fillCircle(190, 205, 15, YELLOW);
case 2: SWAP(TS_LEFT, TS_RT); SWAP(TS_TOP, TS_ delay (250);
BOT); break; tft.fillCircle(50, 275, 15, RED);
case 3: tmp = TS_LEFT, TS_LEFT = TS_TOP, TS_TOP = delay (250);
TS_RT, TS_RT = TS_BOT, TS_BOT = tmp; break; tft.fillCircle(120, 275, 15, BLUE);
}*/ delay (250);
tft.fillCircle(190, 275, 15, YELLOW);
Serial.begin(9600); delay (250);

tft.begin(identifier); tft.fillRoundRect (90,50,50,30,15,GREENYELLOW);


start_screen(); tft.setCursor(100, 60);
} tft.setTextSize(1);
tft.setTextColor(BLACK);
void start_screen() { tft.println("START");
tft.setRotation(0);

93
GIOCHIAMO A TRIS CON ARDUINO

}
tp = ts.getPoint();
void CampoVuoto() { if (tp.x > 470 && tp.x < 600 && tp.y > 800 && tp.y <
860) return;
matrice[0][0]=0;
matrice[0][1]=0; }*/
matrice[0][2]=0;
matrice[1][0]=0; tft.setTextSize(2);
matrice[1][1]=0; tft.setTextColor(YELLOW, BLACK);
matrice[1][2]=0; while (1) {
matrice[2][0]=0; tp = ts.getPoint();
matrice[2][1]=0; pinMode(XM, OUTPUT);
matrice[2][2]=0; pinMode(YP, OUTPUT);
pinMode(XP, OUTPUT);
pinMode(YM, OUTPUT);
//tft.setRotation(0);
tft.fillScreen(BACKGROUND); if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE)
/*int x1, y1, x2, y2, continue;
w = tft.width(), if (tp.x > 470 && tp.x < 600 && tp.y > 800 && tp.y <
h = tft.height();*/ 860) break;
//Serial.print("w="); Serial.print(w); Serial.print(", h="); tft.setCursor(0, (tft.height() * 3) / 4);
Serial.println(h); Serial.print("\ntp.x=" + String(tp.x) + " tp.y=" + Strin-
g(tp.y) + " ");
tft.setCursor(0, 15); }
tft.setTextColor(WHITE); tft.setTextSize(3); }
tft.println(" TRIS GAME");
tft.setTextSize(1);
tft.setCursor(0, 380); int check_win() {
tft.println("Created by Daniele Valanzuolo");
//tft.print("Rotation = "); tft.println(rotation); int sum [8];

//GRIGLIA rettangolo di gioco sum[0]= matrice[0][0]+matrice[0][1]+matrice[0][2];


tft.drawRect(15, 100, 210, 210, YELLOW); sum[1]= matrice[1][0]+matrice[1][1]+matrice[1][2];
tft.drawLine(15, 170, 220, 170, YELLOW); sum[2]= matrice[2][0]+matrice[2][1]+matrice[2][2];
tft.drawLine(15, 240, 220, 240, YELLOW); sum[3]= matrice[0][0]+matrice[1][0]+matrice[2][0];
tft.drawLine(85, 100, 85, 310, YELLOW); sum[4]= matrice[0][1]+matrice[1][1]+matrice[2][1];
tft.drawLine(155, 100, 155, 310, YELLOW); sum[5]= matrice[0][2]+matrice[1][2]+matrice[2][2];
sum[6]= matrice[0][0]+matrice[1][1]+matrice[2][2];
//turno sum[7]= matrice[0][2]+matrice[1][1]+matrice[2][0];
tft.setCursor(50, 340);
tft.setTextSize(2); for (int i=0; i<8; i++)
tft.println("Turno"); {
tft.drawRect(120, 330, 40, 40, WHITE); if (sum[i]==3){return i+1;}
else if (sum[i]==-3){return -i-1;}
} }

void wait_start() { return 0;


}
/*for (;;){

94
GIOCHIAMO A TRIS CON ARDUINO

void wait_azione(int turno){ no); matrice[2][0]=koeff; break;}


if (matrice[2][1] ==0 && tp.x > 480 && tp.x < 630 &&
tft.setCursor(130, 340); tp.y > 360 && tp.y < 470) {draft_symbol(120,275,tur-
tft.setTextColor(YELLOW,BACKGROUND); no); matrice[2][1]=koeff; break;}
tft.setTextSize(3); if (matrice[2][2] ==0 && tp.x > 250 && tp.x < 400 &&
int koeff = 0; tp.y > 360 && tp.y < 470) {draft_symbol(190,275,tur-
if (turno==1){ no); matrice[2][2]=koeff; break;}
koeff=1;
tft.println("X"); Serial.print("\ntp.x=" + String(tp.x) + " tp.y=" + Strin-
}else g(tp.y) + " ");
{ }
koeff=-1; }
tft.println("O");
}
void draft_symbol (int x, int y, int turno)
tft.setTextSize(2); {
tft.setTextColor(YELLOW, BLACK); if (turno == 1)
{
while(1){ int dim =15;
for (int i=-5; i<5; i++)
tp = ts.getPoint(); {
pinMode(XM, OUTPUT); tft.drawLine(x+i-dim, y-dim, x+i+dim, y+dim, NAVY);
pinMode(YP, OUTPUT); tft.drawLine(x+i-dim, y+dim, x+i+dim, y-dim, NAVY);
pinMode(XP, OUTPUT); }
pinMode(YM, OUTPUT); }
else
if (tp.z < MINPRESSURE || tp.z > MAXPRESSURE) {
continue; tft.fillCircle(x, y, 20, RED);
tft.fillCircle(x, y, 15, BACKGROUND);
if (matrice[0][0] ==0 && tp.x > 700 && tp.x < 860 && }
tp.y > 630 && tp.y < 750) {draft_symbol(50,135,turno);
matrice[0][0]=koeff; break;} }
if (matrice[0][1] ==0 && tp.x > 480 && tp.x < 630 &&
tp.y > 630 && tp.y < 750) {draft_symbol(120,135,tur- void loop(void) {
no); matrice[0][1]=koeff; break;} int giro, result;
if (matrice[0][2] ==0 && tp.x > 250 && tp.x < 400 && wait_start();
tp.y > 630 && tp.y < 750) {draft_symbol(190,135,tur-
no); matrice[0][2]=koeff; break;}
if (matrice[1][0] ==0 && tp.x > 700 && tp.x < 860 && for (;;) {
tp.y > 500 && tp.y < 615) {draft_symbol(50,205,turno); result = 0;
matrice[1][0]=koeff; break;} CampoVuoto();
if (matrice[1][1] ==0 && tp.x > 480 && tp.x < 630 && //testLines();
tp.y > 500 && tp.y < 615) {draft_symbol(120,205,tur- giro = 0;
no); matrice[1][1]=koeff; break;} turno = random(0,100)%2;
if (matrice[1][2] ==0 && tp.x > 250 && tp.x < 400 && while (result ==0 && giro<9)
tp.y > 500 && tp.y < 615) {draft_symbol(190,205,tur- {
no); matrice[1][2]=koeff; break;} wait_azione(turno);
if (matrice[2][0] ==0 && tp.x > 700 && tp.x < 860 &&
tp.y > 360 && tp.y < 470) {draft_symbol(50,275,tur- if (turno==1){turno=0;}else{turno = 1;}

95
GIOCHIAMO A TRIS CON ARDUINO

result = check_win();
giro++; tft.drawLine(190, 135-1, 50, 275-1, PURPLE);}
}
}
//indicazione vincitore else
tft.setCursor(40, 340); {
tft.setTextColor(YELLOW,BACKGROUND); tft.setCursor(35, 340);
tft.setTextSize(2); tft.println("PARITY");
tft.fillCircle(140, 350, 25, BACKGROUND);
if (result != 0) }
{ tft.fillRoundRect (90,50,50,30,15,GREENYELLOW);
tft.println("WINNER"); tft.setCursor(100, 60);
//tft.drawRect(120, 330, 40, 40, WHITE); tft.setTextSize(1);
tft.fillCircle(140, 350, 25, BACKGROUND); tft.setTextColor(BLACK);
tft.println("START");
if (result > 0)
{ wait_start();
draft_symbol (140, 350, 1);
} delay (1000);
else }
{ }
draft_symbol (140, 350, 0);
}

result= abs(result); CONCLUSIONI


Con questo tutorial abbiamo realizzato in maniera sem-
if (result == 1){tft.drawLine(50, 135, 190, 135, PUR- plice e veloce un bellissimo passatempo che possiamo
PLE);tft.drawLine(50, 135+1, 190, 135+1, PURPLE);tft. usare per stupire i nostri amici o mettere alla prova i più
drawLine(50, 135-1, 190, 135-1, PURPLE);} piccoli. Oltre all'esercizio pratico della realizzazione del
if (result == 2){tft.drawLine(50, 205, 190, 205, PUR- progetto, è molto interessante come banco di prova anche
PLE);tft.drawLine(50, 205+1, 190, 205+1, PURPLE);tft. l’utilizzo del display TFT con touch che può consentirci
drawLine(50, 205-1, 190, 205-1, PURPLE);} di realizzare innumerevoli progetti, o semplicemente rea-
if (result == 3){tft.drawLine(50, 275, 190, 275, PUR- lizzare grafiche più accattivanti per progetti che già abbia-
PLE);tft.drawLine(50, 275+1, 190, 275+1, PURPLE);tft. mo realizzato.
drawLine(50, 275-1, 190, 275-1, PURPLE);} Oltre alle funzioni basilari che ho utilizzato per la realizza-
if (result == 4){tft.drawLine(50, 135, 50, 275, PUR- zione dell’interfaccia grafica esistono anche innumerevoli
PLE);tft.drawLine(50+1, 135, 50+1, 275, PURPLE);tft. altre funzioni nella libreria Adafruit GFX che meritano
drawLine(50-1, 135, 50-1, 275, PURPLE);} di essere provate per arricchire il proprio bagaglio cul-
if (result == 5){tft.drawLine(120, 135, 120, 275, PUR- turale nello sviluppo di interfacce grafiche utente sempre
PLE);tft.drawLine(120+1, 135, 120+1, 275, PUR- più performanti.
PLE);tft.drawLine(120-1, 135, 120-1, 275, PURPLE);}
if (result == 6){tft.drawLine(190, 135, 190, 275, PUR-
PLE);tft.drawLine(190+1, 135, 190+1, 275, PUR-
PLE);tft.drawLine(190-1, 135, 190-1, 275, PURPLE);}
L’autore è a disposizione nei commenti per eventuali
if (result == 7){tft.drawLine(50, 135, 190, 275, PUR-
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
PLE);tft.drawLine(50, 135+1, 190, 275+1, PURPLE);tft. direttamente all’articolo sul Blog e partecipare alla discussione:
drawLine(50, 135-1, 190, 275-1, PURPLE);} https://it.emcelettronica.com/giochiamo-a-tris-con-
if (result == 8){tft.drawLine(190, 135, 50, 275, PUR- arduino
PLE);tft.drawLine(190, 135+1, 50, 275+1, PURPLE);

96
ALLARME ANTIGAS
CON ARDUINO NANO di Daniele Corte

La sicurezza non è mai troppa e ad oggi esistono migliaia di dispositivi ipertecnologici che aiutano l'essere
umano a vivere più al sicuro. In auto, in bicicletta, a piedi e in casa. Grazie a combinazioni di sensori, attua-
tori e microcontrollori la tecnologia riesce a tenere lontano i ladri, il freddo e i pericoli in generale. In questo
articolo si costruirà un allarme antigas utilizzando Arduino Nano che, tramite un sensore, dovrà segnalare
acusticamente se ci sono perdite o presenze di gas in casa e un led lampeggiante ne segnalerà il corretto
funzionamento. In caso di allarme, non sarà possibile disattivarlo finché il pericolo non sarà rientrato.

ATTENZIONE: Questo è un progetto dimostrativo e non vuole assolutamente sostituirsi alle apparecchiature certificate
presenti in commercio. Se si desidera installare questo allarme antigas è bene utilizzarlo sempre parallelamente ad un
dispositivo certificato.

HARDWARE Il funzionamento di questi sensori è simile tra loro: all'in-

C
ome si avrà modo di constatare, questo sarà un terno della capsula anti esplosione (quella metallica che
progetto molto semplice, con pochi componenti si vede a occhio nudo) si trova una pellicola che reagi-
e poche righe di codice. Il cuore sarà un classi- sce in base al gas misurato aumentando o diminuendo
co Arduino Nano che si interfaccerà ad un sensore e ad la sua conducibilità elettrica. Nel caso del sensore usato
un piccolo buzzer. Il sensore che è stato scelto è l'MQ-2 per questo progetto, l'MQ-2 ha un sottile film di Biossido
(Figura 1) che è in grado di rilevare il GPL, i-butano, pro- di Stagno (SnO2) che è un materiale con una bassa con-
pano, metano e fumo. duttività che va ad aumentare in caso di presenza di uno
In alternativa si può scegliere l'MQ-5 che però rileva so- dei gas posto all'interno di un tubo di ceramica. Questa
lamente il GPL, il gas naturale e il gas di città. Esistono variazione si traduce in una tensione variabile generata
anche altri tipi di sensori di gas: dal circuito (Figura 2) su cui è saldato, che arriva al pin di
uscita del sensore. Arduino leggerà questa tensione come
MQ-3, ad esempio, è in grado di rilevare etanolo ingresso analogico. Dai datasheet si legge che il range di
funzionamento è da -20°C a 50°C e con umidità minore
MQ-4, invece, rileva molto bene il Gas Naturale del 95%. Tuttavia, le letture ideali dei valori di gas avven-
gono con 20°C e con il 65% di umidità.
MQ-6 rileva la presenza di GPL, i-butano e propano a Il tutto si riduce ad un semplice partitore di tensione.
concentrazioni da 300 a 10000ppm (parti per milioni) Chiamando Rs la resistenza del sensore e RL la resisten-
za di carico e considerando che il sensore funziona a 5V
MQ-7 ha un'alta sensibilità al letalissimo monossido di (Vcc), si ha una tensione variabile all'uscita A0 con la for-
carbonio (CO) mula:

MQ-8 rileva la presenza di idrogeno con concentrazioni


da 100ppm a 10000ppm

MQ-9 ha un'alta sensibilità al monossido di carbonio, al E' possibile, inoltre, utilizzare un'uscita digitale, quindi
metano e al propano avere due stati: c'è del gas, non c'è gas senza poter sa-
pere però quanto ce ne sia. L'integrato LM393ADT che
MQ-135 è sensibile alla quantità di vapori di ammonia- si vede nello schema di Figura 2 è un comparatore a
ca, agli ossidi di azoto e al benzene bassa potenza. Nel pin 2 entra Vout ricavata nel partitore

97
ALLARME ANTIGAS CON ARDUINO NANO

Il cuore del progetto è un Arduino Nano


(Figura 4), scelto per la sua compattezza,
bassi consumi e costi irrisori. Alla versio-
ne attuale v3.3, monta un microcontrollore
ATMega328 con clock di 16MHz, una me-
moria flash di 32kB (di cui due occupati dal
bootloader), 2kB di RAM. Infine, può fun-
zionare da 5 a 12V.
Ecco che grazie a questa versatilità e sem-
plicità porta il progettista a farne quasi sem-
pre la prima scelta.
Analizzando la piedinatura di Arduino Nano
schematizzata in Figura 5, si notano due
grandi gruppi di pin: i pin etichettati da A0
a A7 sono I/O analogici e i pin etichettati
da D2 a D13 sono, invece I/O digitali. Da
notare che alcuni pin digitali hanno la dici-
tura PWM: sta a significare che hanno la
Figura 1: Sensore di gas MQ-2 possibilità di scrivere un valore analogico
(onda PWM). Vengono utilizzati per pilotare
sopra e viene confrontata con la tensione di soglia (Vs) motori con velocità variabili oppure LED con diverse lumi-
data dalla resistenza variabile R6 nel pin 3 che va a defi- nosità. I pin A4 e A5 possono essere utilizzati come bus
nire la sensibilità del sensore: se Vout > Vs l'integrato al- I2C, mentre i pin RX0 TX1 vengono utilizzati come porta
zerà lo stato del pin 1 di uscita portando D0 alto, indicando seriale aggiuntiva. Il gruppo di sei pin in basso viene riser-
così la presenza di eventuale gas. Per concludere l'analisi vato al bus ICSP (In Circuit Serial Programming) ed è un
sensoristica, è importante sapere che LM393ADT ha 4 in- bus riservato per la programmazione. Si utilizza quando si
gressi e due uscite. Dà la possibilità quindi di comparare vuole ripristinare o installare il bootloader. Arduino Nano
due gruppi di valori e portare alte due uscite separata- monta, infine, due uscite a 5V, una a 3.3V e un terminale
mente, come si vede dal pinout in Figura 3. di terra GND. La piedinatura potrebbe cambiare in base

Figura 2: Lo schema elettrico del sensore e il circuito che va a generare la tensione d'uscita

98
ALLARME ANTIGAS CON ARDUINO NANO

Figura 3: Integrato LM393ADT e il suo pinout

Per evitare di usurare troppo il LED che, normalmente,


funzionerebbe a 3.3V ma l'uscita digitale D2 ne fornisce 5,
si è messa in serie una resistenza che genera una caduta
di tensione, che varia in base al tipo e colore di LED che
si andrà a scegliere.
Supponendo si scelga un LED di colore rosso da 5mm,
la caduta di tensione tra l'anodo e il catodo non è di 0.7V,
come un normale diodo al silicio, ma cambia in base alla
lunghezza d'onda del colore, in questo specifico caso
1.6V. Se il LED fosse stato giallo, la caduta di tensione
sarebbe stata di 2.2V e se, invece, fosse stato verde sa-
rebbe stata di 2.4V. Definendo Vcc la tensione presente
su D2 e Vd la caduta di tensione del diodo LED, si utilizza
la formula inversa:

Figura 4: Un tris di schede Arduino Nano


dove I è la corrente che transita attraverso il diodo che,
alla versione acquistata, ma tutti i pin sono comunque nel caso di Arduino Nano, è definita di un massimo di
sempre serigrafati e numerati. Trovano infine posto alcuni 40mA. Facendo i conti spicci, quindi, si ha una resisten-
LED di segnalazione: un LED PWR che serve ad indicare za di 85Ohm, che si andrà ad arrotondare con una re-
la presenza di alimentazione, una coppia di LED denomi- sistenza da 100Ohm. Nel progetto pratico, questo LED
nati RX-TX che indicano il trasferimento di dati e un LED avrà solamente lo scopo di segnalare il funzionamento
interno definito come LED_BUILTIN che si può utilizza- della centralina, lampeggiando ogni secondo, quindi non
re nel basico programma BLINK, quello presente tra gli ha necessità di essere molto luminoso. Si cercherà di ab-
esempi nell'IDE di Arduino che fa lampeggiare un LED. bassare ulteriormente la corrente assorbita per ridurne i
Come si vede in Figura 6, lo schema di collegamento è consumi aumentando il valore della resistenza: esiste una
molto semplice. Si collega l'uscita analogica del sensore convenzione che, per i LED rossi, si usa una resistenza
MQ-2 sul pin A0 di Arduino Nano; in questo caso è stata da 350Ohm.
usata l'immagine del sensore MQ-3 perché non si è tro-
vata la libreria corretta sul programma CAD Fritzing, ma i ARDUINO IDE E LO SKETCH
collegamenti sono equivalenti. L'alimentazione viene data L'IDE di Arduino, ovvero Integrated Development Envi-
rispettivamente dai pin 5V e GND. roment, è l'ambiente creato per programmare il micro-

99
ALLARME ANTIGAS CON ARDUINO NANO

Compilando e caricando questo codice con sola-


mente il sensore collegato ad Arduino e aprendo
il monitor seriale da Strumenti -> Monitor Se-
riale si vedranno una serie di valori preceduti
dalla scritta "Valore Gas:". Sono i valori letti dal
sensore in condizioni normali. Avvicinando un
accendino con il gas che esce (senza fiamma)
per qualche secondo, si dovrebbero vedere i
valori aumentare repentinamente. A questo pun-
to è possibile ricavare una soglia oltre la quale
scatterà l'allarme, ad esempio 500. Togliendo
l'accendino, poi, la misura si normalizzerà ai va-
lori letti inizialmente. Il codice completo, allegato
in fondo all'articolo, è molto semplice: le prime
righe vanno a identificare i pin: A0, come pin
analogico, 2 e 3 come pin digitali. Successiva-
Figura 5: Pinout di Arduino Nano mente si definisce una variabile val che servirà
a memorizzare il valore letto dal sensore e una
controllore e lo si può scaricare direttamente dal sito di variabile soglia calcolata empiricamente in precedenza.
Arduino. Essendo stato scritto in Java è compatibile con La funzione loop viene ripetuta di continuo, mentre la
Windows, Linux e Mac Os. In questo articolo si darà per funzione setup solamente una volta. All'interno della fun-
scontato che l'IDE sia già scaricato, installato e corretta- zione setup si definiscono gli ingressi e le uscite con la
mente configurato sul proprio sistema operativo. Questo funzione pinMode e i vari stati dei pin: se alti (ovvero
sketch non ha bisogno di particolari librerie, in quanto le attivi) o bassi con la funzione digitalWrite. Dopo aver in-
letture vengono fatte con la funzione analogRead() nati- dividuato e settato le condizioni iniziali, nella funzione loop
va nel codice Arduino. Come indicato nelle reference, se si implementa il fulcro dell'allarme: si va ad accendere il
non diversamente specificato si avrà una lettura del dato LED ed a leggere il valore dal sensore, che viene confron-
a 10bit, ma è possibile cambiare questo valore a 12bit tato con la soglia. Se il valore letto è superiore, allora si
con il comando analogReadResolution() specificando accende il buzzer che resterà alto finché il valore soglia
un valore da 1 a 32bits. Per capire come il sensore di gas non scenderà. Infatti, dopo questo controllo, dopo un se-
mostra i dati rilevati, è bene partire da un semplice spez- condo il codice ripartirà all'inizio della funzione loop che
zone di codice: farà un'altra lettura e un altro confronto. Se, finalmente,
il valore di gas presente nell'aria è sceso al di sotto della
int sensoreGasPin = A0; soglia di guardia, allora il buzzer verrà spento e il LED di
float val = 0; segnalazione riprenderà il suo lampeggiare ogni secondo,
ripetendo così il ciclo del codice.
void setup() {
CONSIDERAZIONI FINALI
Serial.begin(9600);
Questo progetto è servito soprattutto per studiare ap-
}
profonditamente il funzionamento di questa tipologia
di sensori, infatti, nel codice sono stati trascurati appo-
void loop() { sitamente tutti i controlli per il corretto funzionamento in
val = analogRead(A0); totale sicurezza. Per tale ragione questa centralina non
Serial.print("Valore Gas: "); può assolutamente considerarsi affidabile come unico
Serial.println(val); strumento di protezione. Tuttavia, qualora si decidesse di
installarla realmente in casa affiancata al proprio sistema
delay(1000);
di allarme, sarebbe bene stampare un piccolo enclosure
per proteggere l'elettronica. Sul sito web thingiverse ce
} ne sono un'infinità e per tutti i gusti, basta cercare sulla

100
ALLARME ANTIGAS CON ARDUINO NANO

Figura 6: Schema di collegamento dei sensori

barra di ricerca del sito la parola chiave MQ2 (o qualsiasi


pinMode(ledPin, OUTPUT);
altro sensore sia stato utilizzato) e divertirsi a stampare.
digitalWrite(ledPin, LOW);
Un'altra considerazione importante da fare è che ogni gas
ha una densità diversa: il GPL, ad esempio, ha una den- pinMode(buzzerPin, OUTPUT);
sità maggiore dell'aria e quindi tenderà a saturare il locale digitalWrite(buzzerPin, LOW);
dal basso verso l'alto e, per avere un allarme repentino, }
va collocata in basso, vicino al pavimento. Lo stesso vale
per i-butano e benzene. Se invece si vuole segnalare la void loop() {
presenza di gas metano, idrogeno, etanolo, monossido
digitalWrite(ledPin, HIGH);
di carbonio o ammoniaca, la centralina va messa in alto
val = analogRead(sensoreGasPin);
sul soffitto, poiché questi gas sono più leggeri dell'aria e
quindi galleggiano, tendendo a saturare dall'alto verso il if(val > soglia){
basso. Un interessante spunto per uno sviluppo alternati- digitalWrite(buzzerPin, HIGH);
vo potrebbe essere l'uso di una scheda Wi-Fi aggiuntiva delay(1000);
ad Arduino, che invia i dati ad una centrale domotica o ad } else {
un database collegato a un sito web, per creare uno sto- digitalWrite(buzzerPin, LOW);
rico della qualità dell'aria, magari con un array di sensori,
delay(1000);
in modo da avere ancora più dati a disposizione. Sta al
digitalWrite(ledPin, LOW);
lettore ora sbizzarrirsi al meglio, secondo le proprie idee
e necessità. delay(1000);
}
IL CODICE COMPLETO }
int sensoreGasPin = A0;
int ledPin = 2; L’autore è a disposizione nei commenti per eventuali
int buzzerPin = 3; approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
direttamente all’articolo sul Blog e partecipare alla discussione:
float val = 0;
https://it.emcelettronica.com/allarme-antigas-con-
int soglia = 500;
arduino-nano
void setup() {

101
IL PRIMO MICRO PLC
DI CASA ARDUINO
CON FUNZIONALITÀ
IOT INDUSTRIALI di Giordana Francesca Brescia

Il team Arduino non smette mai di sorprenderci. Questa volta, ad ampliare il già ricco e diversificato set di
componenti hardware di casa Arduino, ci pensa Opta, il primo micro PLC con funzionalità IoT industriali per
il controllo, il monitoraggio e la manutenzione predittiva in tempo reale. Arduino Opta è facile da usare ed
è progettato in collaborazione con Finder, produttore leader di dispositivi per l'automazione industriale e
degli edifici.

ARDUINO OPTA PORTA L'AUTOMAZIONE A campo dei componenti elettromeccanici ed elettronici


UN LIVELLO SUPERIORE mission-critical. Arduino Opta offre un calcolo ad alte pre-

L
'innovazione aiuta ad affrontare ogni possibile sfi- stazioni per operazioni in tempo reale e manutenzione
da, e questo gli ideatori di Arduino lo sanno bene. predittiva, oltre agli aggiornamenti firmware OTA e alla
Il nuovo Arduino Opta della serie Arduino Pro è sicurezza dei dati, con tutta la semplicità di utilizzo e la
la soluzione giusta per le applicazioni di automazione flessibilità dell'ecosistema open source Arduino, risorse
industriale IIoT e di building automation. Opta è un mi- della community, oltre a sketch, tutorial e librerie software
cro PLC ad alte prestazioni con capacità IoT industriali, di Arduino. Uno strumento indispensabile per lavorare ve-
pensato specificamente per le esigenze degli ingegne- locemente. Opta supporta l'esperienza di programmazio-
ri PLC e progettato in partnership con Finder, produtto- ne Arduino e i linguaggi standard PLC opzionali.
re leader di dispositivi per l'automazione industriale nel Opta consente agli utenti professionisti di ampliare i propri

102
IL PRIMO MICRO PLC DI CASA ARDUINO CON FUNZIONALITÀ IOT INDUSTRIALI

103
IL PRIMO MICRO PLC DI CASA ARDUINO CON FUNZIONALITÀ IOT INDUSTRIALI

progetti di automazione industriale e degli edifici. Attraver- con funzionalità incrementali, da scegliere in base al pro-
so la connettività integrata e le capacità di apprendi- prio progetto. Ogni configurazione soddisfa le esigenze
mento automatico, Arduino Opta apre nuove opportunità di qualsiasi utente: Opta Lite, con integrazione di Ether-
consentendo a tutti di progettare, iterare e implementare net e porte di programmazione USB-C, Opta RS485 che
idee sempre più ambiziose per una produzione di quali- aggiunge anche l'interfaccia di connettività half duplex
tà superiore, maggiore efficienza, migliore produttività e RS485 e Opta WiFi, l'opzione più versatile, dotata anche
redditività. di connettività Wi-Fi/Bluetooth Low Energy a basso con-
sumo energetico.
QUALI SONO LE CARATTERISTICHE
TECNICHE DI ARDUINO OPTA CONSIDERAZIONI CONCLUSIVE
Interessanti le specifiche tecniche del micro PLC Arduino Con Arduino Opta non c'è limite alle applicazioni. Inte-
Opta (Tabella 1). grando il micro PLC con macchine, dispositivi e linee di
In particolare, Arduino Opta consente diversi vantaggi e produzione esistenti, anche in combinazione con altri ele-
funzionalità chiave: menti dell'ecosistema Arduino modulare e versatile o sen-
• Sviluppo software facile e veloce, a partire da sori, si possono realizzare progetti di livello professionale
sketch, tutorial e librerie Arduino pronti per l'uso personalizzabili per soddisfare qualsiasi esigenza.
• Supporto opzionale per linguaggi PLC standard In ambito industriale Opta può essere combinato con celle
IEC 61131-3 di carico o sistemi di visione per gestire il flusso di produ-
• Integrazione bus di campo tramite Modbus TCP zione, assicurando che i contenitori siano riempiti corret-
(ethernet) e Modbus RTU (seriale RS485) tamente mentre si muovono lungo i nastri trasportatori.
• Connettività IoT senza interruzioni (Ethernet/Wi- Può anche eseguire la sincronizzazione dell'orologio tra-
Fi/Bluetooth Low Energy) mite Network Time Protocol (NTP) e stampare automati-
• Monitoraggio remoto in tempo reale tramite dash- camente le informazioni sull'ora sulle etichette dei prodotti
board Arduino Cloud (o servizi di terze parti) o sulla confezione.
• Sicurezza a livello hardware grazie all'elemento Arduino Opta è in grado di abilitare il monitoraggio in
secure integrato e alla conformità allo standard tempo reale, in locale tramite un'interfaccia operatore uti-
X.509 lizzando Bluetooth Low Energy o in remoto collegandosi
• Aggiornamenti sicuri del firmware OTA e gestione ad Arduino Cloud, utilizzando dashboard personalizzate
dei dispositivi cloud per garantire il corretto svolgimento dei processi di produ-
• Commutazione relè ad alta potenza (4 x 2,3 kW) zione. Un importante contributo è sicuramente quello che
• Affidabilità nel design, grazie alle certificazioni in- Arduino Opta offre alla manutenzione: è infatti possibile
dustriali e all'esperienza di Finder nella tecnologia prevenire i problemi di malfunzionamento implementando
di commutazione la manutenzione predittiva, grazie alla potenza di calcolo
• Facilità di installazione, con compatibilità su guida e agli algoritmi di Machine Learning in grado di rilevare le
DIN anomalie.
Oltre alle applicazioni di automazione industriale, il micro
Il potente processore MCU STM32H747XI dual-core PLC Arduino Opta si rivolge anche all'automazione degli
Cortex®-M7 +M4 consente agli utenti di eseguire calcolo edifici intelligenti, ottimizzando la gestione dei dispositivi
ad alte prestazioni (HPC, High-Performance Computing), da remoto e migliorando il comfort e l'efficienza dei con-
controllo e monitoraggio, nonché operazioni in tempo re- sumi energetici.
ale, implementando anche funzionalità di manutenzione
predittiva.
Opta è un dispositivo affidabile, durevole, sicuro e robu-
sto, con un design che opera a intervalli di temperatura
L’autore è a disposizione nei commenti per eventuali
industriali (da -20 °C a +50 °C) grazie a un'architettura
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
dual-core che non richiede alcun raffreddamento ester- direttamente all’articolo sul Blog e partecipare alla discussione:
no. Supporta gli aggiornamenti firmware OTA e garanti- https://it.emcelettronica.com/il-primo-micro-plc-di-casa-
sce la sicurezza dei dati dall'hardware al Cloud attraverso arduino-con-funzionalita-iot-industriali
la comunicazione M2M. Opta è disponibile in tre varianti

104
IL RILEVAMENTO
DIVENTA SMART
CON ARDUINO
NICLA SENSE ME di Giordana Francesca Brescia

Con la diffusione delle applicazioni dell'ecosistema IoT è aumentata la richiesta di dispositivi low power
compatti ed equipaggiati con set di sensori integrati, in grado di rilevare parametri ambientali e fornire in
tempo reale dati e informazioni. La scheda di sviluppo Arduino Nicla Sense ME è un piccolo strumento a
bassa potenza implementabile nelle soluzioni di rilevamento intelligente, con un consumo energetico estre-
mamente basso e fattore di forma ultra compatto. Caratterizzata da semplicità di integrazione e scalabilità,
tipiche della piattaforma Arduino, la scheda Nicla Sense ME combina quattro sensori all'avanguardia di
Bosch Sensortec di livello industriale racchiusi in un minimo ingombro. La piattaforma, versatile e robusta,
consente agli utenti di sviluppare applicazioni di rilevamento intelligente. Nicla Sense ME è facile da usare
per gli appassionati e sufficientemente flessibile per gli utenti più esperti.

INTRODUZIONE gamme Arduino MKR e Portenta - nonché un design robu-

U
n nuovo componente si aggiunge alla famiglia Ni- sto, questa scheda è particolarmente adatta a progetti che
cla della serie Arduino Pro: la scheda Nicla Sen- devono combinare la fusione dei sensori e le capacità di
se ME, pensata appositamente per il rilevamento Intelligenza Artificiale al limite, unitamente a una grande
intelligente. L'hardware robusto include sensori di livello potenza di calcolo e una capacità di elaborazione a
industriale con Intelligenza Artificiale incorporata. Con basso consumo che la rende adatta anche ad applica-
questa piccola scheda di sviluppo analizzare il movimen- zioni standalone dove il funzionamento è legato alla pre-
to e l'ambiente circostante è davvero molto semplice. La senza di una batteria. La scheda, infatti, quando alimenta-
scheda di sviluppo prende la denominazione ME proprio ta a batteria, diventa un dispositivo standalone completo.
dalla capacità di analizzare il movimento e i parametri Proprio questa sua capacità di unire dimensioni compatte
ambientali in tempo reale (M sta per Motion, E per En- ad una grande potenza computazionale, le è valsa la de-
vironment). Questo dispositivo è un prodotto modulare finizione di "A tiny board for sensing the big world". Diamo
intelligente ricco di funzionalità avanzate, dalle dimensio- ora uno sguardo ai campi di applicazione della scheda:
ni ridotte e facile da usare, molto versatile e accessibile tra i principali target applicativi ci sono le reti di sensori
per una vasta gamma di applicazioni di "remote environ- wireless (WSN, Wireless Sensor Networks), la fusione di
mental sensing" e, al contempo, dal costo contenuto. Tra dati, l'Intelligenza Artificiale, l'edge computing, la capacità
le funzionalità più interessanti anche il basso consumo di rilevamento ambientale, il rilevamento gas, la misura e
energetico e la possibilità di aggiungere capacità di il monitoraggio remoto di parametri di processo, l'analisi
rilevamento ai progetti esistenti. E' in grado di misurare remota, il rilevamento industriale per identificare le con-
rotazione, accelerazione, pressione, umidità, temperatu- dizioni operative all'interno di un macchinario, di una fab-
ra, qualità dell'aria e livelli di CO2 introducendo sul mer- brica o di una serra da remoto, anche in zone di difficile
cato avanzati sensori Bosch Sensortec completamente accesso. Le funzionalità mesh consentono una semplice
nuovi e di alta qualità. Con dimensioni estremamente ri- implementazione di WSN con requisiti di infrastruttura mi-
dotte - il nuovo fattore di forma è compatibile anche con le nimi. Con l'analisi remota si ottiene subito anche un signi-

105
IL RILEVAMENTO DIVENTA SMART CON ARDUINO NICLA SENSE ME

do di ospitare l'Intelligenza ai bordi (edge). Un driver LED


I2C pilota il LED RGB ed è in grado di erogare un'uscita
massima di 40 mA. In Tabella 1 sono indicati i parametri e
i dati tecnici dettagliati della scheda.
Arduino Nicla Sense ME è alimentata da un SoC (System
on Chip) nRF52832 all'interno del modulo ANNA-B112. Il
SoC nRF52832 è costruito attorno a un microcontrollore
ARM Cortex-M4 con unità a virgola mobile in esecuzio-
ne a 64 MHz. Gli sketch vengono archiviati nella memo-
ria FLASH interna da 512 KB nRF52832 condivisa con il
bootloader. 64 KB di SRAM sono disponibili per l'utente.
L'ANNA-B112 funge da host SPI per la registrazione dei
dati flash da 2 MB e l'IMU a 6 assi BHI260. Un oscillato-
re esterno fornisce un segnale a 32 KHz. Arduino Nicla
Sense ME integra un set di sensori di livello industriale
racchiusi in un ingombro minimo, è in grado di misurare
parametri di processo come temperatura, pressione, umi-
dità e movimento, integra sensore di gas con AI e sen-
sori di alta linearità integrati ad alta precisione. Il fattore
Figura 1: La scheda di sviluppo Arduino Nicla Sense ME
di forma Nicla è stato sviluppato specificamente presso
Arduino come standard per la rete di sensori wireless
ficativo miglioramento dei livelli di sicurezza. Arduino Nicla che può essere adattata dai partners per sviluppare solu-
Sense ME consente inoltre l'implementazione e lo svilup- zioni industriali progettate su misura. Con la scheda Nicla
po di soluzioni personalizzate per gli utenti finali, inclusi Sense ME è possibile ad esempio creare una rete di rile-
dispositivi indossabili intelligenti connessi al cloud e vamento wireless di livello industriale utilizzando i sensori
applicazioni di robotica autonoma. In ambito didattico i Bosch BHI260AP, BMP390, BMM150 e BME688 integrati.
ricercatori e i docenti possono utilizzare questa potente Nello specifico, i sensori Bosch integrati sulla piattaforma
piattaforma per lavorare su uno standard riconosciuto a Nicla Sense ME sono:
livello industriale per la ricerca e lo sviluppo di sensori wi- • Sensore di movimento Bosch BHI260AP con AI
reless che può ridurre il time to market. Il consumo ener- integrato: il Bosch BHI260 è un sensore program-
getico ultra ridotto e la gestione integrata della batteria mabile a bassissima potenza, che combina un
consentono una facile implementazione della scheda di core processor Fuser2, IMU a 6 assi (giroscopio
sviluppo in varie funzionalità. e accelerometro) insieme a un framework softwa-
re per la fusione dei sensori (sensor fusion). Il
NICLA SENSE ME: IL RILEVAMENTO SMART A BHI260 è il core del sensore intelligente, che ospi-
PORTATA DI MANO ta un sistema di riconoscimento programmabile, in
Con Nicla Sense ME si ottengono subito una serie di van- grado di gestire la comunicazione con altri sensori
taggi chiave, alcuni dei quali sono stati anticipati nel para- su Arduino Nicla Sense ME tramite connessioni
grafo precedente: dimensioni estremamente ridotte, fun- I2C e SPI. C'è inoltre una Flash dedicata da 2 MB
zionalità diversificate di alto livello, bassissimo consumo utilizzata per memorizzare il codice Execute in
energetico, maggiore capacità di rilevamento, è dotata di Place (XiP) e per l'archiviazione di dati come i dati
un processore potente, effettua misurazioni precise di mo- di calibrazione dell'algoritmo di fusione del senso-
vimento e parametri ambientali, ha un hardware robusto, re Bosch (BSX). Il BHI260 è in grado di caricare
include un set di sensori di livello industriale con Intelli- algoritmi personalizzati che possono essere adde-
genza Artificiale integrata. La connettività BLE (Bluetooth strati su un PC. L'algoritmo intelligente generato
Low Energy) massimizza la compatibilità con apparec- opera quindi su questo chip.
chiature professionali e di consumo. L'elaborazione dei • Magnetometro a 3 assi Bosch BMM150: il ma-
dati del sensore è attiva 24 ore su 24, 7 giorni su 7. In virtù gnetometro a 3 assi Bosch BMM150 fornisce mi-
del potente processore, Nicla Sense ME è anche in gra- surazioni accurate a 3 assi del campo magnetico

106
IL RILEVAMENTO DIVENTA SMART CON ARDUINO NICLA SENSE ME

107
IL RILEVAMENTO DIVENTA SMART CON ARDUINO NICLA SENSE ME

Figura 2: La scheda di sviluppo Arduino Nicla Sense ME

con precisione a livello di bussola. In combinazio-


ne con l'IMU BHI260, la fusione dei sensori Bosch La scheda Nicla Sense ME è disponibile a catalogo sul
può essere utilizzata per ottenere un orientamento sito web della TME Electronic Components cliccando
spaziale ad alta precisione e vettori di movimento sul seguente link: NICLA SENSE ME ARDUINO - Sche-
per il rilevamento della direzione nei robot auto- da espansiva | MKR; 5VDC; Bluetooth,I2C,SPI,UART;
nomi e per la manutenzione predittiva. C'è una Nr diodi: 1; ABX00050 | TME - Componenti elettronici.
connessione I2C dedicata al BHI260, che funge TME Electronic Components è fornitore leader nel merca-
da host. to dei componenti elettronici e industriali. L'offerta di TME
• Sensore di pressione Bosch BMP390: il sensore include prodotti di quasi 1200 produttori, e il suo gruppo
di pressione Bosch BMP390 offre accuratezza e è composto da 12 società dislocate in Europa, Asia ed
stabilità di livello industriale nelle misurazioni della America Settentrionale.
pressione. Il sensore è progettato per un uso pro-
lungato, con una precisione relativa di ±0,03 hPa CONCLUSIONI
e un valore efficace di 0,02 Pa in modalità ad alta Arduino Nicla Sense ME è la soluzione ideale per tutte
risoluzione. Bosch BMP390 è adatto per misura- quelle applicazioni nelle quali il rilevamento e il monitorag-
zioni rapide con una frequenza di campionamento gio intelligente sono fondamentali. La scheda di sviluppo
di 200 Hz o per un utilizzo a bassa potenza con è ultra compatta, a risparmio energetico e adatta per la
una frequenza di campionamento di 1 Hz che con- prototipazione rapida. Questo piccolo strumento elettro-
suma meno di 3,2 µA. nico, grazie alla combinazione di sensori altamente inte-
• Sensore ambientale Bosch BME688: il sensore grati, consente a un'ampia gamma di applicazioni di rivol-
Bosch BME688 dell'Arduino Nicla Sense ME è in gersi ai diversi segmenti dei mercati emergenti dell'IoT e
grado di eseguire il monitoraggio ambientale intel- dell'AI. Per programmare la scheda Arduino Nicla Sense
ligente. Ciò fornisce funzionalità per la rilevazione ME offline è sufficiente installare l'ambiente di sviluppo Ar-
di pressione, umidità, temperatura e di composti duino Desktop IDE. Per collegare la scheda al computer
organici volatili (VOC). Il Bosch BME688 esegue sarà sufficiente disporre di un cavo micro USB, che forni-
il rilevamento del gas tramite un array di semicon- sce anche alimentazione alla scheda, come indicato dal
duttori a ossido di metallo eNose con un ciclo di LED. Tutte le schede Arduino, inclusa questa, funzionano
scansione del gas tipico di 10,8 secondi. immediatamente sull'Arduino Web Editor. E' sufficiente

108
IL RILEVAMENTO DIVENTA SMART CON ARDUINO NICLA SENSE ME

Figura 3: Il set di sensori Bosch Sensortec integrati sulla scheda di sviluppo Nicla Sense ME

la configurazione, librerie, esempi di codice, pinout, sche-


matici, diagrammi a blocchi, projects hub, etc. Non resta
che esplorare le infinite possibilità che questo piccolo e
potente strumento versatile offre cominciando a mettere
le mani sui nostri primi progetti.

RIFERIMENTI DOCUMENTAZIONE TECNICA


https://www.tme.eu/it/details/abx00050/soluzioni-arduino/
arduino/nicla-sense-me/

installare un semplice plug-in. Arduino Web Editor è ospi-


tato online, quindi sarà sempre aggiornato con le ultime
funzionalità e il supporto per tutte le schede. Tutti i prodotti
Arduino abilitati per l'IoT sono supportati su Arduino IoT
Cloud che consente di registrare, rappresentare grafica-
mente e analizzare in tempo reale i dati dei sensori, attiva-
re eventi e automatizzare la propria casa o azienda. Inol-
tre, Arduino Nicla Sense ME fornisce funzionalità per gli
aggiornamenti OTA del firmware e il monitoraggio remoto
utilizzando WebBLE. Esempi di sketch per Arduino Nicla
L’autore è a disposizione nei commenti per eventuali
Sense ME possono essere reperiti nel menu "Examples"
approfondimenti sul tema dell’Articolo. Di seguito il link per accedere
nell'IDE Arduino o nella sezione "Documentation" del sito direttamente all’articolo sul Blog e partecipare alla discussione:
web Arduino Pro. Arduino mette a disposizione degli utenti https://it.emcelettronica.com/il-rilevamento-diventa-
anche una serie di risorse online, quali documentazione smart-con-arduino-nicla-sense-me
tecnica, datasheet, tutorial, files, guida step-by-step per

109

Potrebbero piacerti anche