Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
Speciale Arduino
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
2
SAFETY TUTOR SYSTEM CON ARDUINO
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.
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] ;
//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
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.
6
SAFETY TUTOR SYSTEM CON ARDUINO
7
SAFETY TUTOR SYSTEM CON ARDUINO
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
9
SAFETY TUTOR SYSTEM CON ARDUINO
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},
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.
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
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 φ, è:
12
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO
13
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO
14
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO
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
15
REALIZZAZIONE DI UN PATROLLING ROBOT CON ARDUINO
16
REALIZZAZIONE DI UN PATROLLING ROBOT CON 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.
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 3: il modulo adattatore/convertitore da bus parallelo a seriale I2C utilizzato per semplificare il collegamento tra display
LCD e scheda Arduino
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(key == '1') {
Serial.println(key);
counter1++;
counter2=0;
counter3=0;
if(key == '2'){
Serial.println(key);
counter2++;
counter1=0;
counter3=0;
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=='3'){
Serial.println(key);
counter3++;
counter2=0;
counter1=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.
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”
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”
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”
void setup()
{
28
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”
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”
30
GIOCHIAMO CON ARDUINO: STRUMENTO MUSICALE AD ULTRASUONI “NO TOUCH”
/*
PROGETTO Strumento ad ultrasuoni No_Touch Versione 2.0 - ANGELO MONTANARO
*/
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;
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);
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.
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.
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)
34
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 1)
Sensore di luminosità
35
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 1)
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)
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à.
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à
38
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)
39
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)
40
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)
Figura 6. Schema di collegamento Arduino <-> ESP01 per utilizzo Software Serial
41
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)
<Sketch ESP-01>
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
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)
{ #include "DHT.h"
(200, "text/html", page_update + page_title + page_tit- #define DHTTYPE DHT11 DHT dht(DHTPIN, DHT-
le_2 TYPE);
seleziona un carattere della stringa vitality int pioggia = 0; // variable to store the value read
se ho un messaggio aggiorno la stringa result // put your setup code here, to run once:
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  ");
delay(2000);
wifi_serial.print (t);
Serial.print("\nTemperatura= ");
wifi_serial.print (terreno);
terreno = 100 - (int)analogRead(A0)*0.09765625;
wifi_serial.print (pioggia);
(int)analogRead(A2)*0.09765625; // read the input pin
wifi_serial.print ("%<br>  Luminosita'
Serial.print("%\nUmidità Terreno = ");
 ");
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);
44
SMART POT SENSOR: IOT APPLICATO ALL’AGRICOLTURA (PARTE 2)
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.
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
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)
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 Ω
}
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
51
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO
52
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO
53
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO
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);
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);
56
CONTROLLO DEL MOTO DI UNA SMART CAR CON ARDUINO
// rekindles motors
digitalWrite(in1, LOW);
digitalWrite(in2, HIGH);
digitalWrite(in3, LOW);
digitalWrite(in4, HIGH);
analogWrite(enA, i);
analogWrite(enB, i);
delay(30);
// decelerates
analogWrite(enA, i);
analogWrite(enB, i);
delay(30);
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.
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.
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
62
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE
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
64
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE
#include <Arduino_EdgeControl.h>
void setup()
{
Serial.begin(9600);
65
LA NUOVA SCHEDA ARDUINO EDGE CONTROL
AUTOMATIZZA L’AGRICOLTURA INTELLIGENTE
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.
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;
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.
68
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT
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
71
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT
72
[DIY] COME AGGIUNGERE UNA WEBCAM E IL CONTROLLO REMOTO AL VOSTRO ROBOT
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
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.
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
76
INTELLIGENZA ARTIFICIALE CON ARDUINO
Figura 2: Modulo OV7670 accoppiato a ELEGOO UNO R3 Figura 3: Modulo camera OV7670
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?
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.
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
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
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
82
PROGETTIAMO CON ARDUINO 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(); {
84
PROGETTIAMO CON ARDUINO IOT CLOUD
85
PROGETTIAMO CON ARDUINO IOT CLOUD
86
PROGETTIAMO CON ARDUINO IOT CLOUD
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.
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:
88
GIOCHIAMO A TRIS CON ARDUINO
89
GIOCHIAMO A TRIS CON ARDUINO
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à.
90
GIOCHIAMO A TRIS CON ARDUINO
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:
91
GIOCHIAMO A TRIS CON ARDUINO
uint16_t identifier;
//----------------------------------------|
// TFT Breakout -- Arduino UNO / Mega2560 / OPEN-
SMART UNO Black
#define BLACK 0x0000
92
GIOCHIAMO A TRIS CON ARDUINO
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];
94
GIOCHIAMO A TRIS CON ARDUINO
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);
}
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.
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-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
Figura 2: Lo schema elettrico del sensore e il circuito che va a generare la tensione d'uscita
98
ALLARME ANTIGAS CON ARDUINO NANO
99
ALLARME ANTIGAS CON ARDUINO NANO
100
ALLARME ANTIGAS CON ARDUINO NANO
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.
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.
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
106
IL RILEVAMENTO DIVENTA SMART CON ARDUINO NICLA SENSE ME
107
IL RILEVAMENTO DIVENTA SMART CON ARDUINO NICLA SENSE ME
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
109