Sei sulla pagina 1di 599

Per

i principianti Arduino un punto di partenza ideale che non richiede una profonda
preparazione tecnica. Ma se siete ingegneri oppure maker che intendono utilizzare
Arduino per prototipare il vostro innovativo prodotto hardware, dovete sapere con
precisione come e perch funziona.
Questo manuale tecnico descrive i dettagli di funzionamento interno ed esterno di
questa piattaforma di prototipazione elettronica open source. Qui troverete informazioni
sui microcontroller AVR, sulle librerie di Arduino, sulle shield, sui moduli e su altri
componenti.
I capitoli finali sono dedicati a progetti reali e avanzati che mettono in luce idee
specifiche che potete utilizzare in altre applicazioni, fra i quali, oltre alle molte possibilit
descritte su come personalizzare i componenti, troviamo un generatore di segnale
programmabile e il design di un termostato intelligente.

J. M. Hughes un ingegnere di sistemi integrati con pi di 30 anni di esperienza in


elettronica, sistemi aerospaziali e programmazione di applicazioni scientifiche. stato il
responsabile del surface imaging software sul Phoenix Mars Lander e ha fatto parte del
team che ha sviluppato un innovativo interferometro laser eterodino per calibrare il
controllo della posizione degli specchi sul telescopio spaziale James Webb.
Arduino
per tecnici, ingegneri e maker

J. M. Hughes
Arduino per tecnici, ingegneri e maker
Titolo originale: Arduino: A Technical Reference
di J. M. Hughes

Authorized Italian translation of the English edition John Hughes


This translation is published and sold by permission of OReilly Media, Inc., the owner of all rights to publish and sell the
same.

Copyright per ledizione italiana:


2016 Tecniche Nuove S.p.A., via Eritrea 21, 20157 Milano
Redazione: tel. 0239090258
e-mail: libri@tecnichenuove.com
Vendite: tel. 0239090440, fax 0239090335
e-mail: vendite-libri@tecnichenuove.com
http://www.tecnichenuove.com

ISBN: 978-88-481-3178-0
ISBN (PDF): 978-88-481-3179-7
ISBN (E-PUB): 978-88-481-3180-3

Tutti i diritti sono riservati. Nessuna parte del libro pu essere riprodotta o diffusa con un mezzo qualsiasi, fotocopie,
microfilm o altro, senza il permesso delleditore

All rights reserved. No part of this book shall be reproduced, stored in a retrieval system, or transmitted, by any means,
electronic, mechanical photocopying, recording or otherwise without written permission from the publisher

Traduzione: Barbara Sansone

Questo libro disponibile e acquistabile in versione digitale su www.tecnichenuove.com.


Sommario

Prefazione
Capitolo 1 - La famiglia di Arduino
Una breve storia
Tipi di dispositivi Arduino
Gallerie di Arduino
I dispositivi compatibili con Arduino
I dispositivi compatibili con lhardware
I dispositivi compatibili con il software
Le convenzioni per la nomenclatura di Arduino
Che cosa posso fare con Arduino?
Per maggiori informazioni

Capitolo 2 - Il microcontroller AVR


La storia
Larchitettura interna
La memoria interna
Le funzioni periferiche
I registri di controllo
Le porte I/O digitali
I timer/contatori da 8 bit
I timer/contatori da 16 bit
Il prescaler del timer/contatore
Il comparatore analogico
Il convertitore analogico-digitale
Gli I/O seriali
LUSART
La SPI
La TWI
Gli interrupt
Caratteristiche elettriche
Per ulteriori informazioni

Capitolo 3 - I microcontroller AVR specifici per Arduino


LATmega168/328
La memoria
Le caratteristiche
I package (contenitori)
Le porte
Le funzioni dei pin
Gli input del comparatore analogico
Gli input analogici
Le interfacce seriali
Gli I/O del timer/clock
Gli interrupt esterni
Le assegnazioni dei pin di Arduino
Le caratteristiche elettriche fondamentali
LATmega1280/ATmega2560
La memoria
Le caratteristiche
I package
Le porte
Le funzioni dei pin
Gli input del comparatore analogico
Gli input analogici
Le interfacce seriali
Gli I/O del timer/clock
Gli interrupt esterni
Le assegnazioni dei pin di Arduino
Le caratteristiche elettriche
LATmega32U4
La memoria
Le caratteristiche
I package
Le porte
Le funzioni dei pin
Gli input del comparatore analogico
Gli input analogici
Le interfacce seriali
Gli I/O del timer/clock
Gli interrupt esterni
Linterfaccia USB 2.0
Le caratteristiche elettriche
Le assegnazioni dei pin di Arduino
I fuse bit
Per ulteriori informazioni

Capitolo 4 - I dettagli tecnici di Arduino


Caratteristiche e funzionalit di Arduino
Le interfacce USB di Arduino
Le dimensioni fisiche di Arduino
I tipi di PCB Arduino di base
I tipi di PCB Arduino con fattore di forma Mega
I tipi di PCB Arduino con fattore di forma piccolo
I tipi di PCB per scopi speciali
Le configurazioni del pinout di Arduino
Il layout dei pin dellArduino di base
Il layout dei pin esteso di base
Il layout dei pin sulla serie Mega
I layout non standard
Per ulteriori informazioni

Capitolo 5 - Programmare Arduino e i microcontroller AVR


Il cross-compiling dei microcontroller
I bootloader
Lambiente IDE di Arduino
Installare lIDE di Arduino
Configurare lIDE di Arduino
Eseguire il cross-compiling con lIDE di Arduino
Limmagine eseguibile di Arduino
Il processo di creazione del software di Arduino
Le schede degli sketch
Larchitettura software di Arduino
Il supporto del runtime: la funzione main()
Uno sketch di esempio
Le costanti
Le variabili globali
Le librerie
Utilizzare le librerie negli sketch
Aggiungere una libreria nellIDE di Arduino
Creare librerie personalizzate
Il codice sorgente di Arduino

Capitolo 6 - La vita senza lIDE di Arduino


Le alternative allIDE
PlatformIO
Ino
La toolchain di AVR
Installare la toolchain
make
avr-gcc
binutils
avr-libc
Costruire programmi C o C++ a partire da zero
Compilare con avr-gcc o avr-g++
Diversi file sorgente e make
Il linguaggio assembly di AVR
Il modello di programmazione AVR
Creare programmi in linguaggio assembly per AVR
Le fonti del linguaggio assembly per AVR
Caricare codice eseguibile sullAVR
La programmazione in-system
Programmare con il bootloader
Caricare senza il bootloader
JTAG
AVRDUDE
Utilizzare un Arduino come un ISP
Lazione del bootloader
Sostituire il bootloader
Riepilogo

Capitolo 7 - Le librerie di Arduino


I componenti delle librerie
Altre librerie

Capitolo 8 - Le shield
Le caratteristiche elettriche delle shield
Le caratteristiche fisiche delle shield
Montare diverse shield una sopra laltra
Shield Arduino comuni
Input/Output
Shield di estensione I/O
Shield despansione I/O
Rel shield
Shield che trasportano il segnale
Memoria
Comunicazione
I/O seriale e MIDI
Ethernet
Bluetooth
USB
ZigBee
CAN
Prototipazione
Creare una shield di prototipazione personalizzata
Controllo del movimento
Controllo di motori DC e passo-passo
Controllo di PWM e servomotori
Display
Shield per la strumentazione
Shield adattatori
Shield varie
Shield di Arduino non comuni
Fonti

Capitolo 9 - Moduli e componenti I/O


I moduli
I fattori di forma fisici
Le interfacce
Dove trovare i moduli
Le descrizioni dei moduli
I moduli TinkerKit
I moduli Grove
Descrizioni di sensori e moduli
I sensori
I sensori di temperatura, umidit e pressione
I sensori di inclinazione
I sensori audio
I sensori di luminosit
I sensori magnetici
I sensori di vibrazioni e shock
I sensori di movimento
I sensori a contatto e di posizione
I sensori di distanza
Le comunicazioni
I moduli wireless APC220
I moduli RF 315/433 MHz
La ricetrasmittente ESP8266
Dispositivi e componenti di output
Le fonti di luce
I rel, i motori e i servo
Gli output dei segnali analogici
Linput dellutente
I tastierini
I joystick
I potenziometri e gli encoder rotativi
Loutput dellutente
I display di testo
I display grafici
Funzioni di supporto
I clock
I timer
Le connessioni
Lavorare con ponticelli nudi
I sistemi di connessione dei moduli
Costruire connettori personalizzati
Scegliere un metodo di connessione
Fonti
Riepilogo

Capitolo 10 - Creare componenti personalizzati


Per cominciare
Le shield personalizzate
Considerazioni fisiche
Montare le shield una sopra laltra
Considerazioni elettriche
La shield personalizzata GreenShield
Obiettivi
La definizione e la pianificazione
Il design
Il collaudo finale
Il funzionamento
Prossimi passaggi
Design personalizzati compatibili con Arduino
Programmare un design personalizzato
Lo Switchinator
La definizione e la pianificazione
Il design
Il prototipo
Il software
La produzione
Il collaudo
Prossimi passaggi
Fonti

Capitolo 11 - Progetto: un generatore di segnale programmabile


Gli obiettivi del progetto
La definizione e la pianificazione
Il design
Le funzionalit
La custodia
Lo schema
Il prototipo
Gli input dei controlli e le modalit
La visualizzazione delloutput
Il modulo DDS
Il software
Lorganizzazione del codice sorgente
La descrizione del software
La libreria DDS
I test
Lassemblaggio finale
Le resistenze pull-up
La protezione degli input
I componenti dello chassis
Lalimentazione
I test finali e la chiusura
Ridurre il costo
Il costo nel dettaglio
Fonti

Capitolo 12 - Progetto: un termostato intelligente


Gli antefatti
Panoramica dei sistemi HVAC
Concetti fondamentali del controllo della temperatura
Il controllo intelligente della temperatura
Gli obiettivi del progetto
La definizione e la pianificazione
Il design
Le funzionalit
La custodia
Lo schema
Il software
Gli input/output dellutente
Loutput dei controlli
Il prototipo
Il sensore DHT22
Lencoder rotativo
Il modulo real-time clock
La shield LCD
Il software
Lorganizzazione del codice sorgente
La descrizione del software
I test
La versione finale
Lassemblaggio
I test e il funzionamento
Il costo nel dettaglio
Prossimi passaggi
Fonti

Capitolo 13 - Il modellino di lanciarazzi: lo studio di un design


Panoramica
Il ciclo del design
Gli obiettivi
Selezionare e definire i requisiti funzionali
Creare il design preliminare
La fattibilit del design
Lelenco preliminare dei componenti
Il prototipo
Il design finale
Gli aspetti elettrici
Gli aspetti fisici
Il software
I test e il funzionamento
Analisi dei costi
Prefazione

Quando fu introdotto nel 2005, Arduino divent immediatamente uno dei progetti di
hardware open source pi di successo del mondo (alcuni direbbero quello pi di
successo). Schede dal design aperto rilasciate dal team di Arduino cominciarono a
essere prodotte in vari paesi del mondo, come Italia, Brasile, Cina, Paesi Bassi, India e
Stati Uniti. possibile acquistare una scheda compatibile con Arduino pienamente
funzionante per circa 15 e lambiente di sviluppo di Arduino disponibile per essere
scaricato immediatamente e del tutto gratuitamente. Arduino, che allinizio si basava
sulla famiglia di microcontroller AVR da 8 bit (lAVR di per s un dispositivo
interessante con una storia altrettanto interessante), si poi spostato nel regno dei 32
bit, con laggiunta del modello Due con processore ARM, del Yn con un modulo sulla
scheda che utilizza la versione OpenWrt di Linux e con limminente modello Zero. Le
schede Arduino possono essere utilizzate per molti scopi diversi, dallinterattivit alla
robotica, da sensori ambientali ai piccoli satelliti CubeSat che piccoli gruppi possono
costruire e lanciare con una spesa molto ridotta rispetto a quella che comporterebbe un
satellite di dimensione normale.
Io ho comprato il mio primo Arduino (un Duemilanove) molti anni fa, pi che altro per
curiosit. Lavoro su sistemi di sviluppo con microprocessori e microcontroller dallinizio
degli anni 80: ho cominciato con il 6502, il 6800 e l8051 e poi sono passato all8086,
allo Z80, l80186 e alla famiglia dei 68000. In passato di solito programmavo questi
dispositivi in linguaggio assembly o PL/M, dal momento che allora queste erano davvero
le uniche scelte razionali per i sistemi integrati. Pi tardi diventato possibile utilizzare C
o Ada, dal momento che le capacit dei microprocessori erano migliorate e che gli
strumenti software erano maturati. In ogni caso, tuttavia, mi aspettavo sempre di
trovare a mia disposizione diversi materiali di riferimento: schede tecniche, manuali
pesanti o tascabili e documentazione di vario tipo che accompagnassero la scheda e i
suoi accessori. Il tutto generalmente arrivava in una grande e pesante scatola.
Quando arrivato il mio primo Arduino, ho aperto la minuscola scatolina e vi ho trovato
dentro soltanto una scheda elettronica, un alimentatore, alcuni LED e qualche
resistenza, alcuni ponticelli e una breadboard che non richiede saldature. Nessun
manuale, nessuno libro e nessuna scheda tecnica. Nemmeno un CD che contenesse
documenti e software. Nientaltro che qualche foglio di carta con un manifesto di quello
che conteneva la scatola e lURL della pagina web dove si potevano trovare alcuni
materiali su da dove cominciare e i link del software necessario. Sono rimasto davvero
sorpreso.
Ero anche ignorante. Quando ho comprato la scheda Arduino non conoscevo del tutto la
sua storia, n ero cosciente di quale fosse il pubblico al quale era diretta. Si d il caso
che allinizio sia stata pensata per persone con una base tecnica minima o nulla, che
semplicemente volessero fare esperimenti (in senso ludico) con qualcosa di divertente e
creare cose funzionanti. In altre parole, ad artisti e tinkerer, non a ingegneri con
uninclinazione per i dettagli tecnici e la passione per i progetti, le specifiche e,
ovviamente, i manuali.
Una volta che ho capito questo, tutto ha cominciato ad avere pi senso. Leggendo il
libro di Massimo Banzi Getting Started with Arduino (OReilly) ho afferrato meglio la
filosofia di Arduino e ho trovato un ottimo punto di partenza per la mia sete di ulteriori
dettagli. Inoltre, a differenza dei produttori di semiconduttori con i loro kit di sviluppo, la
gente del team di Arduino non aveva intenzione di fare soldi vendendo i suoi chip:
lavorava per ispirare la creativit. Il microcontroller AVR stato scelto perch poteva
essere applicato rapidamente a un progetto creativo. LAVR dotato di abbastanza
potere di calcolo e di sufficiente memoria integrata da riuscire a eseguire lavori
complessi e interessanti, a differenza delle generazioni precedenti di microcontroller che
di solito richiedevano costosi strumenti di sviluppo e offrivano soltanto scarse quantit di
memoria interna sul chip.
Lasciando da parte la semplicit e il basso costo, il vero segreto del successo di
Arduino il bootloader del firmware del chip AVR, associato a un ambiente di sviluppo
integrato (IDE, integrated development environment) semplice e facile da utilizzare e alle
librerie di codice che lo completano, tutte fornite gratuitamente sotto licenza open
source e Creative Commons. La filosofia di Arduino impone di rendere pi facile
possibile lutilizzo della scheda. Eliminando tutta la difficolt dei dettagli tecnici e
semplificando il processo di sviluppo, Arduino invita lutente a sperimentare, provare
nuove cose e, s, giocare. Per la prima volta dopo molto tempo mi sono ritrovato
davvero a divertirmi moltissimo, semplicemente collegando cose in combinazioni diverse
per vedere che cosa potevo fare. Mi sarebbe piaciuto aver potuto disporre di Arduino
quando insegnavo le basi del design dei sistemi integrati: mi avrebbe aiutato a ridurre
molta della frustrazione che sentivano i miei allievi quando cercavano di orientarsi tra i
listing, le mappe di memoria e i diagrammi di flusso del linguaggio assembly.
Quando ho cominciato a lavorare con il mio primo Arduino, ho scoperto molte risorse
utili e interessanti sui componenti aggiuntivi per la famiglia di Arduino, alcuni dei quali
davvero incredibili in termini di prezzo e capacit1. Infatti, sono diventato una sorta di
collezionista di Arduino, di quelli che comprano shield e moduli economici e costruiscono
una considerevole raccolta di cose. Ma, purtroppo, devo dire che molte volte ho aperto
una confezione con dentro un nuovo aggeggio interessante, soltanto per scoprire che
non conteneva documentazione di nessun tipo. Nemmeno un semplice diagramma dei
collegamenti.
Essendo io un ingegnere, trovo particolarmente frustrante comprare qualcosa di
interessante, per poi scoprire che non accompagnato dalla sua documentazione.
Quindi devo mettermi a cercare di scoprire se questa documentazione esiste e se
disponibile in una forma che mi permetta di leggerla (per esempio, non in cinese). A
volte questa ricerca non d frutti e per eseguire lingegneria inversa della scheda
elettronica e scoprire come collegarla mi trovo costretto a consultare le schede tecniche
dei componenti. Altre volte le informazioni che cerco esistono, ma sono sparse in diversi
siti web suddivise in vari pezzi. Questa situazione sta lentamente migliorando, ma pu
rivelarsi ancora difficile. Dopo aver collezionato per anni note, link di pagine web e
schede tecniche, alla fine ho deciso di organizzare il tutto e riunirlo in un unico posto.
E quindi, cosa c in questo libro che non si pu trovare altrove su Internet? Non molto,
a essere onesti, ma la mia speranza che aiuti a ridurre molta della frustrazione che
potenzialmente si accumula e del tempo che si perde e ovviamente contiene anche varie
cose che ho scoperto da solo. I dati tecnici ufficiali provengono da produttori come
Atmel, il team di Arduino e numerose altre fonti, alcune delle quali molto note e altre
meno. Alcuni rivenditori doltreoceano dispongono soltanto di siti web molto semplici,
mentre altri sono dotati di siti web molto belli con link ad altri siti dove si pu trovare
della documentazione. Questo libro contiene tutti i dati essenziali che sono riuscito a
trovare o a ricostruire, tutti in un unico posto comodo da consultare, con tutti i
collegamenti che sono riuscito a gestire. Il mio obiettivo evitare ad altri la frustrazione
che ho provato cercando di scoprire un semplice dettaglio tecnico sullinterfaccia USB,
oppure di capire perch una shield non funzionava correttamente, oppure ancora perch
quel sensore che avevo comprato da qualcuno su eBay sembrava non funzionare
affatto.
Il risultato delle mie frustrazioni questo libro, quello che avrei voluto avere per lavorare
con le schede e le shield di Arduino. Mi sarebbe davvero piaciuto avere qualcosa di
fisico da tenere vicino e a portata di mano sul mio tavolo di lavoro. Non sempre
comodo dover consultare una pagina web per cercare qualcosa e, per rendere le cose
ancora pi interessanti, a volte laccesso a Internet non disponibile (come quando stai
cercando di eseguire il debug di un dispositivo di logging remoto sulla cima di una
montagna accompagnato soltanto a un piccolo computer portatile e nessun servizio
wireless nel raggio di 60 chilometri). Mi sarebbe piaciuto disporre di qualcosa da poter
utilizzare rapidamente per cercare la risposta a una domanda mentre lavoravo con
Arduino e i suoi componenti aggiuntivi associati, a prescindere da dove mi trovassi. Per
quello che ne so, una cosa del genere non esisteva prima di adesso. Spero che
troverete questo libro utile quanto lo ho ritenuto io mentre riunivo i miei appunti per
scriverlo.

A chi diretto
Questo libro diretto a quelle persone che hanno bisogno o vogliono scoprire i dettagli
tecnici. Magari siete arrivati fino a dove potevate con il materiale introduttivo e libri del
tipo 99 progetti incredibili e adesso volete scoprire come fare qualcosa di nuovo e
unico. Oppure potete essere ingegneri o ricercatori che vorrebbero includere Arduino
nel loro laboratorio sperimentale. Potete anche essere qualcuno che desidera installare
un Arduino in un aereo RC, utilizzarlo in una stazione meteorologica DIY 2, oppure magari
per fare qualcosa di ancora pi ambizioso (per esempio un CubeSat?).
Idealmente, dovreste avere una preparazione di base di C o C++, qualche idea di come
si muovono gli elettroni in un circuito e un po di esperienza nella costruzione di dispositivi
elettronici. Se me lo permettete, vi suggerirei di procurarvi una copia del mio libro
Practical Electronics: Components and Techniques (edito anche questo da OReilly) e
di tenerlo a portata di mano, insieme ad altri testi di riferimento sulla programmazione e
lelettronica (troverete altri consigli nellAppendice D).

Che cos questo libro


Questo libro un manuale da leggere o da consultare. Ho cercato di organizzarlo in
modo da permettervi di trovare rapidamente e facilmente quello che cercate. Ogni volta
che stato possibile vi ho incluso le fonti delle mie informazioni, mentre le intuizioni che
sono emerse dalla mie ricerche personali sono contrassegnate come tali.

Che cosa non questo libro


Questo libro non un tutorial. Questo non il suo scopo principale. Qui non ho incluso i
concetti fondamentali dellelettronica, n vi troverete una descrizione del dialetto del
linguaggio C++ che si utilizza per creare i cosiddetti sketch per programmare un
Arduino. Esistono gi degli eccellenti tutorial che trattano la teoria generale
dellelettronica e della programmazione e li segnaler al lettore come punti di partenza
per prendere confidenza con questi argomenti.
Questo libro non neppure una guida ufficiale di Arduino e dei prodotti del team di
Arduino. Si basa su informazioni raccolte da diverse fonti, alcune meno note di altre,
insieme ai miei appunti e commenti personali basati sulle mie esperienze con Arduino.
Pertanto, sono lunico responsabile di eventuali errori e omissioni.

La terminologia
Le distinzioni tra processori, microprocessori e microcontroller sorta a un certo punto
allinizio degli anni 80, quando i produttori cercavano di distinguere i loro prodotti
basandosi sulla dimensione e la quantit di circuiti esterni necessari perch i dispositivi
facessero qualcosa di utile. Per poter risultare utili, i processori completi pi comuni e
quelli pi piccoli come quelli che generalmente si montano sui computer portatili
richiedono alcuni componenti esterni (alcuni ne richiedono parecchi). Un microcontroller,
invece, ha gi integrato tutto il necessario per fare il suo lavoro. Inoltre, un
microprocessore di solito supporta una memoria esterna, mentre microcontroller pu
offrire soltanto un supporto limitato (o non offrirlo del tutto) a una memoria ulteriore
rispetto a quella che si trova gi sul chip.
In questo libro, utilizzer i termini microcontroller e processore in maniera
intercambiabile. Anche se microcontroller pu essere considerato un termine
tecnicamente pi corretto, nella mia mente comunque un processore di dati, anche se
una versione pi ridotta rispetto alle enormi macchine con le quali lavoravo in un passato
ormai lontano. Tutti essenzialmente fanno la stessa cosa, soltanto a scale e velocit di
elaborazioni diverse.

Che cosa c in questo libro


Il Capitolo 1 presenta una breve storia di Arduino nelle sue varie forme. Presenta anche
i microcontroller AVR utilizzati sulle schede Arduino e mostra le differenze tra prodotti
basati su Arduino e compatibili con il suo software e hardware.
Il microcontroller Atmel AVR il protagonista del Capitolo 2. Questo vuole essere una
panoramica di quello che in realt un dispositivo molto sofisticato e quindi questo
capitolo offre uno sguardo rapido sulle caratteristiche principali, come la logica del timer,
il comparatore analogico, linput analogico, linterfaccia SPI e altri sottosistemi primari
del chip.
Il Capitolo 3 offre uno sguardo pi da vicino sui microcontroller AVR utilizzati sulle
schede Arduino, cio i dispositivi ATmega168/328, ATmega1280/2560 e ATmega32U4.
Riprende la panoramica presentata nel Capitolo 2 e propone alcuni ulteriori dettagli di
basso livello come larchitettura interna, le caratteristiche elettriche e i pinout del chip.
Il Capitolo 4 parla delle caratteristiche fisiche e delle funzioni dellinterfaccia di varie
schede Arduino. Queste comprendono i tipi di interfaccia USB, le dimensioni del circuito
stampato (PCB, printed circuit board) e i diagrammi dei pinout della scheda.
Quello che rende Arduino davvero unico il suo ambiente di programmazione e questo
largomento del Capitolo 5. Questo capitolo definisce il concetto di sketch di Arduino e
spiega come si utilizzano il linguaggi C e C++ per creare sketch. Presenta il bootloader
di Arduino e la funzione main() di Arduino. Questo capitolo descrive anche come si
scarica il codice sorgente di Arduino e come si fa a vedere come si presenta dietro le
quinte.
Il Capitolo 6 descrive la toolchain AVR-GCC e presenta le tecniche per programmare
una scheda Arduino senza utilizzare lIDE di Arduino. Parla anche dei makefile e include
una breve panoramica della programmazione con i linguaggi assembly. Il capitolo passa
poi agli strumenti disponibili per caricare il codice su un AVR.
Il Capitolo 7 dedicato alle librerie standard fornite con lIDE di Arduino. LIDE di
Arduino include numerose librerie e ne vengono continuamente aggiunte di ulteriori. Se
volete sapere se esiste il modulo di una libreria per un determinato sensore o per una
specifica operazione, questo un ottimo punto di partenza.
Il Capitolo 8 presenta i vari tipi di shield disponibili per Arduino. Descrive molti dei tipi pi
comuni, come memorie flash, prototipazione, input/output, Ethernet, Bluetooth, ZigBee,
controllo dei servomotori, controllo dei motori passo-passo, schermi di LED e schermi
LCD. Spiega anche come si utilizzano diverse shield contemporaneamente e offre alcuni
trucchi e suggerimenti per ottenere il massimo da una shield.
Il Capitolo 9 descrive alcuni dei vari componenti aggiuntivi disponibili che possono
essere utilizzati con Arduino. Questi includono sensori, moduli rel, tastierini numerici e
altri elementi che non sono specifici di Arduino, ma che funzionano bene con questa
scheda. Per molti degli elementi descritti vengono offerti i dati e gli schermi dei pinout
elettrici.
A volte semplicemente non possibile trovare facilmente una shield che serve a fare
quello che desideriamo. Il Capitolo 10 descrive i passaggi necessari per crearne una
personalizzata. Descrive anche come si utilizza un microcontroller AVR senza una
scheda a circuito come Arduino, ma utilizzando comunque lIDE di Arduino.
I Capitoli 11, 12 e 13 mostrano alcuni progetti che illustrano le capacit dei
microcontroller AVR e delle schede Arduino. Sono pensati per dimostrare come pu
essere applicato Arduino in diverse situazioni, non come guide per imparare a costruire
una scheda o un dispositivo. Tuttavia, se vi sentite ispirati potete costruire da voi uno
qualsiasi degli elementi descritti, che poi vi possono servire come punti di partenza per i
vostri progetti personali. La descrizione di ciascun progetto di esempio include la teoria
del funzionamento, schemi, un elenco dettagliato dei componenti, i layout delle PCB (se
necessario) e una panoramica del software necessario per far funzionare il tutto. Dal
momento che questo libro pone laccento soprattutto sullhardware di Arduino e sui
relativi moduli, sensori e componenti, il software mostrato pensato soltanto per
sottolineare i punti chiave: il mio obiettivo non era presentare esempi completi e pronti
per lutilizzo. I codici completi dei software relativi agli esempi e ai progetti si trovano su
GitHub (https://www.github.com/ardnut).
Il Capitolo 11 descrive un generatore di segnale semplice e programmabile, un
dispositivo pratico da tenere a portata di mano quando si lavora con circuiti elettronici.
Con questo progetto, potete generare impulsi a vari cicli di lavoro, emettere una
sequenza di impulsi in risposta a un input che la lanci, generare onde sinusoidali e
creare anche modelli programmabili di impulsi.
Il Capitolo 12 parla della progettazione e della costruzione di un termostato
intelligente, ideale da utilizzare con un sistema HVAC (riscaldamento, ventilazione e
condizionamento dellaria - heating, ventilation and air conditioning) domestico. Invece di
pagare per qualcosa di gi costruito e sigillato in un contenitore di plastica, potete
costruirvene uno da soli e programmarlo in modo che si comporti esattamente nel modo
che desiderate. Vi mostrer come aggiungervi pi di un unico sensore di temperatura: le
funzionalit comprendono diversi sensori di temperatura e umidit e lutilizzo del
ventilatore del vostro sistema HVAC per creare un ambiente confortevole senza bisogno
di utilizzare il compressore o di accendere il riscaldamento.
Nel Capitolo 13 vedremo come si costruisce un modellino automatico di lanciarazzi con
un sequenziatore programmabile e un sistema di controllo automatico. Anche se non
disponete di un modellino di lanciarazzi, questo progetto descrive delle tecniche che
potete applicare a molti tipi di processi controllati, che sia in una linea di produzione
oppure in un dispositivo che gestisce materiale robotico in un laboratorio.
LAppendice A una panoramica degli strumenti e degli accessori di base dei quali
potete aver bisogno se volete andare oltre le schede a circuito e i moduli gi pronti.
LAppendice B una raccolta dei registri di controllo dei microcontroller
ATmega168/328, ATmega1280/2560 e ATmega32U4.
LAppendice C un elenco riepilogativo dei distributori e produttori dei prodotti Arduino e
compatibili menzionati in questo libro. Non affatto esaustivo, ma spero che vi risulter
sufficiente per riuscire a trovare quello che vi serve.
LAppendice D elenca alcuni dei libri consigliati che parlano non soltanto di Arduino, ma
anche della programmazione in C e C++ e dellelettronica in generale.
Infine, lAppendice E un riepilogo di alcuni degli strumenti di sviluppo software Arduino
e AVR facili da trovare.

ATTENZIONE Le appendici sono disponibili in lingua originale in formato PDF allindirizzo


http://www.tecnichenuove.com/libri/arduino-per-tecnici-ingegneri-e-maker.

Riconoscimenti
In questo libro, a parte menzionare il team di Arduino e la comunit di Arduino.cc, non
appaiono riferimenti specifici a nessuno, almeno non intenzionalmente. Vi ho menzionato
diversi produttori e rivenditori di componenti e altri autori, ma ho cercato di essere
imparziale e non ne preferisco uno a un altro. Il mio unico criterio nel selezionare quelli
che ho menzionato stato il fatto di possedere uno o pi dei loro prodotti e lessere
riuscito a usare una shield, un modulo, un sensore, oppure una PCS Arduino (o in alcuni
casi un clone) di un fornitore, anche se soltanto in una dimostrazione di un qualche tipo.
Tutti i marchi registrati menzionati sono propriet dei rispettivi proprietari e qui appaiono
soltanto come riferimento. Lo stesso vale per le immagini: ho cercato di utilizzare i miei
componenti, strumenti, schede, moduli e altri elementi il pi possibile e, anche se in
unimmagine pu apparire una determinata marca o modello, questo non significa che si
tratti dellunico tipo disponibile, ma soltanto che era quello che possiedo e che utilizzo. In
alcuni casi ho utilizzato delle immagini con il permesso del rivenditore o del creatore,
opere di dominio pubblico, oppure immagini con licenza Creative Commons (CC) e
queste sono contrassegnate come richiesto. I diagrammi, gli schemi e le altre immagini
non fotografiche sono tutti di mia creazione e io sono lunico responsabile di eventuali
errori o omissioni in queste figure.

Convenzioni utilizzate in questo libro


In questo libro si utilizzano le seguenti convenzioni tipografiche:
Corsivo
Indica termini nuovi, URL, indirizzi email, nomi di file ed estensioni di file.
Monospaziato

Si utilizza per i codici dei programmi e anche allinterno dei paragrafi per riferirsi a
elementi dei programmi come nomi di variabili o di funzioni, database, tipi di dati,
variabili dambiente, dichiarazioni e parole chiave.
Monospaziato corsivo

Indica testi che devono essere sostituiti da valori forniti dallutente o da valori
determinati dal contesto.

Come contattarci
Per inviare alleditore commenti e domande relativi a questo libro:
Tecniche Nuove Spa Via Eritrea, 21 20157 Milano
Esiste anche una pagina web (in inglese) dedicata al libro, contenente errata corrige,
esempi e ulteriori informazioni. Lindirizzo della pagina :
http://bit.ly/arduino-a-technical-reference.
Per domande tecniche o commenti sul libro, inviate unemail a:
libri@tecnichenuove.com.

Ringraziamenti
Questo libro non sarebbe stato possibile senza la pazienza e il sostegno della mia
famiglia. Scrivere sembra causare assuefazione, ma loro mi hanno incoraggiato e
sostenuto e mi portavano perfino da mangiare e venivano a controllare che fossi ancora
vivo nel mio ufficio. Non si pu chiedere di meglio. Vorrei ringraziare specialmente mia
figlia Seren per il suo aiuto fotografico e nel mantenere catalogata e organizzata la mia
raccolta di bit. Vorrei anche ringraziare lo staff editoriale di OReilly per avermi offerto
lopportunit di lavorare di nuovo con loro. Come sempre, sono stati di grande aiuto,
pazienti e disposti a scommettere su di me. Un grazie speciale va a Brian Sawyer e a
Dawn Schanafelt per il loro eccellente sostegno editoriale e per le loro indicazioni, e a
Mike Westerfield per la sua acuta revisione tecnica del materiale.

1 Se scrivete Arduino nel campo di ricerca su eBay, vi appariranno moltissime cose come sensori di prossimit a
ultrasuoni, sensori di temperatura e umidit, vari cloni di Arduino, shield Bluetooth e ZigBee e molto altro ancora. Ma,
purtroppo, alcuni di questi prodotti sono accompagnati da una documentazione scarsa o nulla e, anche se ne
presentano una, questa potrebbe non essere molto aggiornata o precisa. Questo non significa che non dobbiate
acquistarli (i prezzi presso questi rivenditori sono di solito ottimi e la qualit della costruzione generalmente molto
buona), ma, come sempre quando si acquista qualcosa online, caveat emptor.
2 I libri Environmental Monitoring with Arduino e Atmospheric Monitoring with Arduino (OReilly), entrambi di Emily Gertz
e Patrick Di Justo, suggeriscono alcune buone idee per fare quello che dicono i titoli con questi sensori economici e
facili da trovare e una scheda Arduino.
1

La famiglia di Arduino

Questo capitolo presenta una breve storia di Arduino, descrivendo una concisa
genealogia dei vari tipi di scheda che sono stati creati a partire dal 2007. Non parla
delle schede che sono state prodotte prima del 2007, n cerca di offrire una
panoramica completa dei vari cloni e derivati che sono stati prodotti. Qui lobiettivo
principale individuare le differenze tra i vari tipi principali di schede Arduino, prestando
particolarmente attenzione ai tipi di processori utilizzati e al design fisico delle schede.
Qui daremo anche rapidamente unocchiata alla gamma di applicazioni possibili delle
schede a circuito Arduino.
Il Capitolo 2 offrir informazioni generali sulle funzioni interne dei processori Atmel AVR
e il Capitolo 3 parler dei processori specifici utilizzati sulle schede Arduino. Con
leccezione della Yn, il Capitolo 4 descriver le caratteristiche fisiche delle varie schede
Arduino ufficiali presentate in questo capitolo.

Una breve storia


Nel 2005, basandosi sul lavoro di Hernando Barragn (il creatore di Wiring), Massimo
Banzi e David Cuartielles hanno creato Arduino, un dispositivo programmabile e facile da
utilizzare per progetti di design interattivo, presso lInteraction Design Institute Ivrea a
Ivrea, in Italia. David Mellis ha svilupppato il software di Arduino, che si basa su Wiring.
Presto, Gianluca Martino e Tom Igoe si sono uniti al progetto e loro cinque sono
conosciuti come i fondatori originali di Arduino. Quello che volevano ottenere era un
dispositivo che fosse semplice, facile da collegare a varie cose (come rel, motori e
sensori) e semplice da programmare. Volevano anche che fosse economico, dal
momento che noto che studenti e artisti non dispongono di grossi risparmi. Quindi
hanno scelto la famiglia AVR di microcontroller da 8 bit (MCU o C) di Atmel e hanno
progettato una scheda a circuito indipendente con connessioni facili da utilizzare, hanno
scritto il firmware del bootloader del microcontroller e hanno raccolto il tutto in un
semplice IDE (ambiente di sviluppo integrato) che utilizzasse programmi di nome
sketch. Il risultato stato Arduino.
Da allora, Arduino cresciuto in varie direzioni: alcune versioni sono diventate pi
piccole delloriginale, mentre altre pi grosse. Ciascuna di esse pensata per una
specifica nicchia. Lelemento comune tra tutte la libreria di runtime AVR-GCC di
Arduino, che viene fornita con lambiente di sviluppo di Arduino, e il firmware del
bootloader sulla scheda, che gi precaricato sul microcontroller di tutte le schede
Arduino.
La famiglia di schede Arduino utilizza processori sviluppati dallAtmel Corporation di San
Jose, in California. Quasi tutti i design di Arduino utilizzano la serie di microcontroller
AVR da 8 bit. Leccezione principale rappresentata dal Due, con il suo processore
ARM Cortex-M3 da 32 bit. In questo libro non parleremo del Due, dal momento che
radicalmente diverso dai dispositivi AVR in molti modi fondamentali e realmente merita
una descrizione separata e dedicata a lui e ai microcontroller simili basati sul design
ARM Cortex-M3.
Anche se la scheda Arduino , come dichiara il team di Arduino, semplicemente una
scheda di sviluppo Atmel AVR di base, quello che fa la differenza lambiente software
di Arduino. Questo rappresenta lesperienza comune di tutti gli utenti di Arduino e la
pietra angolare del concetto che ne sta alla base. Nel Capitolo 5 vedremo lIDE di
Arduino, le librerie fornite con lIDE e il bootloader. Nel Capitolo 6 descriveremo il
processo di creazione del software su una MCU AVR senza utilizzare lIDE di Arduino.

Tipi di dispositivi Arduino


Nel corso degli anni, i designer di Arduino.cc hanno sviluppato diversi design della
scheda. La prima scheda Arduino che stata ampiamente distribuita, la Diecimila,
stata rilasciata nel 2007 e dal suo rilascio iniziale la famiglia di Arduino si sviluppata in
modo da approfittare dei vari tipi di dispositivi Atmel MCU AVR. Il Due, rilasciato nel
2012, il primo Arduino a utilizzare un processore ARM Cortex-M3 da 32 bit e provoca
una rottura con il resto della famiglia per quanto riguarda la potenza di elaborazione e la
configurazione del pinout sulla scheda. Anche altre schede, come la LilyPad e la Nano,
non presentano lo stesso pinout degli altri membri della famiglia e sono pensate per una
gamma diversa di applicazioni: cose da indossare nel caso del LilyPad, dispositivi
palmari nel caso della Esplora e oggetti molto piccoli nel caso del Mini, del Micro e del
Nano.
Ogni anno che passa appaiono nuovi tipi di schede Arduino, per cui lelenco presentato
qui potrebbe non risultare pi aggiornato quando lo leggerete. Le versioni pi recenti
sono dotate di processori pi avanzati con molta pi memoria e funzionalit input/output
(I/O) migliorate, ma per lo pi utilizzano gli stessi pinout e funzionano con le schede
aggiuntive gi esistenti, dette shield, e con vari componenti aggiuntivi come sensori, rel
e attuatori. La Tabella 1-1 elenca i tipi di Arduino che sono apparsi a partire dal 2005.
Sulle versioni pi recenti di Arduino funzioneranno anche la maggior parte degli sketch
creati per i modelli pi vecchi, magari con meno regolazioni e librerie pi nuove, mentre
gli sketch scritti per le versioni pi recenti possono funzionare o meno sui modelli pi
vecchi.
Tabella 1-1 - Timeline dei prodotti Arduino.

Scheda Anno Microcontroller Scheda Anno Microcontroller


Mega
Diecimila 2007 ATmega168V 2010 ATmega2560
2560
LilyPad 2007 ATmega168V/ATmega328V Uno 2010 ATmega328P
Nano 2008 ATmega328/ATmega168 Ethernet 2011 ATmega328
Mega
Mini 2008 ATmega168 2011 ATmega2560
ADK
Mini Pro 2008 ATmega328 Leonardo 2012 ATmega32U4
Duemilanove 2008 ATmega168/ATmega328 Esplora 2012 ATmega32U4
Mega 2009 ATmega1280 Micro 2012 ATmega32U4
ATmega32U4 +
Fio 2010 ATmega328P Yn 2013
Linino

La Tabella 1-1 non una guida per lacquisto, ma il suo scopo offrire un certo
contesto storico di Arduino. Come potete vedere, negli anni 2007 e 2008 abbiamo visto
lintroduzione del LilyPad, delle schede dal fattore forma pi ridotto come la Nano, la
Mini e la Mini Pro, e lintroduzione del Duemilanove come passaggio evolutivo naturale
basato sul Diecimila. Anche se tra il Diecimila e il Duemilanove non ci sono differenze
fisiche significative, il Duemilanove incorpora alcuni miglioramenti per quanto riguarda
lalimentazione, soprattutto il switchover automatico tra lalimentazione USB o con la
corrente DC esterna (corrente diretta). Le versioni pi recenti del Duemilanove utilizzano
anche la MCU ATmega328, che offre pi memoria ai programmi.
La Tabella 1-1 non include lArduino Robot, che una PCB con motori e ruote collegate.
Una delle schede pi recenti nella famiglia di Arduino la Yn, un dispositivo
interessante dotato del microcontroller ATmega32U4 e anche di un modulo Linino con
processore Atheros AR9331 basato su MIPS capace di eseguire una versione del
sistema operativo OpenWrt basato su Linux. Non mi spinger fino a parlare dellaspetto
OpenWrt della Yn, ma fondamentalmente la parte Arduino semplicemente un Arduino
standard (un Leonardo, per essere specifici). Se volete sapere si pi sulla scheda Yn,
vi consiglio di consultare sito web di Arduino
(https://www.arduino.cc/en/Main/ArduinoBoardYun).
Quando nella Tabella 1-1 appare pi di un microcontroller, significa che quella
determinata versione di scheda Arduino allinizio era prodotta con un microcontroller e
successivamente con laltro dispositivo, di solito dotato di maggiori capacit. Per
esempio, una versione pi vecchia del Duemilanove avr un ATmega168, mentre i
modelli pi nuovi hanno un ATmega328. Dal punto di vista della funzionalit,
lATmega168 e lATmega328 sono identici, ma lATmega328 dotato di pi memoria
interna.
Le ultime aggiunte nella famiglia di Arduino, la Leonardo, la Esplora, la Micro e la Yn,
utilizzano tutte lATmega32U4. Questo, pur essendo simile allATmega328, prensenta
anche un componente integrato che linterfaccia USB-seriale e che elimina uno dei
circuiti integrati (IC, integrated circuit) che si trovano sulle schede come la Uno e la
Duemilanove.
Inoltre, linterfaccia di programmazione si comporta in modo leggermente differente con
le schede che utilizzano lATmega32U4, ma per la maggior parte degli utenti questo
dovrebbe risultare ampiamente trasparente. Il Capitolo 2 descriver il funzionamento
generale dei microcontroller AVR, il Capitolo 3 contiene le descrizioni dei tipi specifici di
MCU AVR che si trovano sui dispositivi Arduino e il Capitolo 4 offrir le descrizioni delle
principali schede a circuito Arduino e le definizioni dei loro pinout.

Gallerie di Arduino
Le Tabelle dalla 1-1 alla 1-5 mostrano alcuni dei vari tipi di schede Arduino, sia del
passato che del presente. Non li includono tutti, dal momento che periodicamente
vengono aggiunti nuovi tipi o aggiornamenti a quelli esistenti. Le immagini che seguono
mostrano la vasta gamma di forme fisiche e applicazioni pensate per Arduino.
Dal punto di vista fisico, un Arduino non una scheda a circuito grande. Le schede di
base, la cui disposizione fisica dei pin di solito pensata per le schede aggiuntive (dette
shield e descritte nel Capitolo 8), misurano 2,1 per 2,7 pollici (53,3 per 68,6 mm). La
Figura 1-1 mostra una selezione di schede Arduino con accanto un righello, mentre la
Figura 1-2 mostra una scheda Nano montata su una breadboard che non richiede
saldature.

Figura 1-1 - Le dimensioni relative delle schede Arduino.


Figura 1-2 - Una scheda Arduino Nano su una breadboard che non richiede saldature.

Il Capitolo 4 contiene disegni di riferimento con le dimensioni e le definizioni dei pin della
maggior parte delle schede Arduino pi comuni. Notate che, pur essendo molto piccola,
una scheda come la Nano ha tutte le stesse capacit della Duemilanove, eccetto per i
comodi pin socket e il normale connettore USB (tipo B). ideale per applicazioni dove
non deve essere disturbata dopo la sua installazione e dove sono necessarie le sue
dimensioni ridotte. Alcune applicazioni che vengono subito in mente sono dispositivi
autonomi di raccolta di dati ambientali (stazioni meteorologiche autonome a energia
solare oppure boe per raccogliere dati negli oceani, per esempio), timing e raccolta di
dati per modellini di razzi, sistemi di sicurezza e magari perfino una caffettiera
intelligente.
Tabella 1-2 - Il layout delle schede Arduino di base.

Tipo Anno di introduzione

Diecimila 2007

Duemilanove 2008

Uno (versione R3) 2010

Ethernet 2011
Leonardo 2012

Tabella 1-3 - Il layout delle schede Arduino Mega.

Tipo Anno di introduzione

Mega 2009

Mega 2560 2009

Mega ADK 2011

Tabella 1-4 - Le schede Arduino con un fattore di forma ridotto.

Tipo Anno di introduzione

Nano 2008

Mini 2008

Fio 2010

Micro 2012

Tabella 1-5 - Le schede Arduino con un fattore di forma speciale.

Tipo Anno di introduzione

LilyPad 2007

Esplora 2012
I dispositivi compatibili con Arduino
Oltre ai vari tipi di schede progettati o approvati da Arduino.cc, esistono molti dispositivi
che sono compatibili con il suo hardware oppure con il suo software. Quello che rende
questi dispositivi compatibili con Arduino il fatto che incorporino il bootloader di Arduino
(oppure qualcosa che funzioni in modo simile) e che possano essere programmati con
lIDE di Arduino selezionando il tipo giusto di scheda Arduino compatibile nella casella
combinata dellIDE.

I dispositivi compatibili con lhardware


Un dispositivo compatibile con lhardware di Arduino un dispositivo dove i vari pin I/O
della scheda sono stati disposti in modo da corrispondere a uno dei fattori di forma di
Arduino esistenti. Una scheda compatibile con hardware (di solito) pu accettare una
qualsiasi delle shield e dei moduli aggiuntivi creati per le schede Arduino ufficiali. Il
motivo che sta dietro spiegato in Le convenzioni per la nomenclatura di Arduino a
pagina 10.
Nella maggior parte dei casi, le schede compatibili con lhardware hanno un aspetto
molto simile a quello delle schede Arduino, a eccezione che per il fatto che non
presentano il logo e la serigrafia ufficiali di Arduino. Altri prodotti compatibili con
lhardware possono non assomigliare affatto alle tipiche schede Arduino, ma offrire i pin
socket nella disposizione corretta per permettere di utilizzare una shield standard per
Arduino. Alcuni prodotti compatibili con lhardware includono ulteriori connessioni, come
la versione SainSmart della Uno con ulteriori connettori per le funzioni I/O. La Tabella 1-
6 elenca alcuni cloni di Arduino e alcune schede compatibili che sono disponibili. Ne
esistono molti altri, rispetto a quelli mostrati qui, ma questi dovrebbero bastare a farvi
unidea di quello che avete a vostra disposizione.
Tabella 1-6 - I dispositivi compatibili con lhardware di Arduino.

Nome Tipo Origine

SainSmart UNO Clone dellUNO Cina

SainSmart Clone del Mega


Cina
Mega2560 2560

Simile alla Uno, con


Brasuino Brasile
piccole modifiche

Kit clone
Diavolino compatibile con il USA
layout di Arduino

Notate che il Diavolino un kit e richiede montaggio.

I dispositivi compatibili con il software


Esistono molte schede compatibili con il software di Arduino. Queste utilizzano il
bootloader e lambiente di sviluppo di Arduino, ma non presentano un fattore di forma
fisico completamente compatibile con Arduino. I dispositivi compatibili con il software
possono essere programmati con gli strumenti di sviluppo di Arduino, ma possono
utilizzare disposizioni diverse dei pin I/O, oppure magari utilizzare alcuni altri tipi di
connettori anzich i pin socket che si trovano sulle normali schede Arduino. I circuiti
personalizzati basati su microcontroller AVR e costruiti in un dispositivo o sistema pi
grande possono ricadere nella categoria dei dispositivi compatibili con il software se nel
microcontroller installato il bootloader di Arduino.
Il cuore di Arduino sono il processore e il bootloader preinstallato. Utilizzando questa
definizione, si potrebbe avere soltanto un ATmega AVR IC con il firmware di Arduino
caricato. Si potrebbe quindi utilizzarlo con una breadboard che non richiede saldature e
lambiente di sviluppo di Arduino. Presso diverse fonti possibile acquistare MCU AVR
IC con il codice del bootloader pecaricato, oppure possibile farsene uno da soli. Nel
Capitolo 5 vedremo i passaggi necessari per caricare il firmware del bootloader di
Arduino su una MCU AVR. interessante notare che alcune delle schede Arduino, come
la Mini, la Micro, la Nano, la LilyPad e la Esplora, non sono compatibili con lhardware
nel senso che non utilizzano il layout di connessioni I/O standard. Non possono essere
utilizzate direttamente con una shield convenzionale, ma sono comunque schede Arduino
e sono supportate dallIDE di Arduino.
Un esempio di dispositivo compatibile con il software di Arduino la scheda Boarduino
di Adafruit Industries. Questa scheda progettata per essere montata su una
breadbord senza saldature standard, come un IC completo da 40 pin. disponibile in
due stili: DC e USB. La versione DC non dispone di un chip USB integrato e quindi per
programmarla necessario un adattatore USB esterno. Un altro esempio di scheda
compatibile con il software la Dragonfly di Circuit Monkey, che utilizza connettori
standard tipo Molex anzich i pin e i socket utilizzate sulle schede Arduino convenzionali.
pensata per ambienti ad alta vibrazione, come gli UAV (unmanned aerial vehicles) e la
robotica.
La scheda Raspduino pensata per essere montata su una scheda Raspberry Pi e
funziona in modo equivalente allArduino Leonardo. Questo produce una combinazione
equivalente alla Yn, ma non esattamente uguale. Ciascuna configurazione ha i suoi
punti di forza e i suoi punti di debolezza. La Tabella 1-7 elenca alcune schede compatibili
con il software di Arduino.
Tabella 1-7 - I dispositivi compatibili con il software di Arduino.

Nome Descrizione Origine


Progettata per
adattarsi a una
Boarduino DC breadboard che USA
non richiede
saldature
Progettata per
adattarsi a una
Boarduino USB breadboard che USA
non richiede
saldature
Utilizza connettori
Dragonfly di tipo Molex per USA
I/O
Progettata per
adattarsi su una
Raspduino Paesi Bassi
scheda Raspberry
Pi

Quella presentata non che una piccola selezione delle varie schede che sono
disponibili. Dal momento che il microcontroller AVR facile da integrare in un design,
viene utilizzato in numerose applicazioni. Con il firmware del bootloader di Arduino,
programmare un dispositivo diventato davvero molto pi semplice e le possibilit di
design sono innumerevoli.

Le convenzioni per la nomenclatura di Arduino


Nonostante il design dei circuiti e il software di Arduino siano open source, il team di
Arduino ha riservato lutilizzo del termine Arduino ai suoi design e il logo di Arduino un
marchio registrato. Per questo motivo, a volte troverete cose che si comportano e si
presentano come dispositivi Arduino ufficiali, ma che non presentano la marca Arduino e
che non sono state prodotte dal team di Arduino. Alcune di loro nel nome del prodotto
contengono i suffissi -duino o -ino, come Freeduino, Funduino, Diavolino, Youduino e
cos via. Alcune, come le schede di SainSmart, utilizzano proprio il nome del modello
(Uno e Mega2560, per esempio).

NOTA Mentre scrivevo questo libro era in corso una disputa tra la societ creata dai fondatori originali (Arduino LLC) e
unaltra societ avviata da uno dei fondatori originali (Arduino SRL). Di conseguenza, Arduino LLC utilizza il marchio
registrato Arduino negli Stati Uniti e Genuino altrove.

Occasionalmente, alcuni producono una scheda che dichiara di essere Arduino, ma in


realt non che una copia che utilizza il marchio registrato di Arduino senza permesso.
Anche la serigrafia utilizzata per aggiungere il logo e altre informazioni sulle schede
Arduino ufficiali protetta da copyright e il team di Arduino non la rilascia con il file del
layout delle PCB. Sul suo blog, Massimo Banzi ha una sezione
(http://www.massimobanzi.com/) dedicata esattamente a queste schede non
autorizzate e il suo esame delle copie palesi e spudorate a dir poco interessante. Vi
basta cercare il tag hall of shame.
Qui il concetto fondamentale che chiunque benvenuto se vuole copiare gli schemi, il
codice del bootloader e lIDE di Arduino, e utilizzarli per creare una versione
personalizzata di Arduino. Dopo tutto, si tratta di un progetto open source. Quello che
non consentito chiamarlo Arduino oppure utilizzare limmagine di Arduino.cc senza
permesso.

Che cosa posso fare con Arduino?


Oltre alla possibilit di programmare facilmente offerta dallIDE di Arduino, laltra
caratteristica importante di Arduino la potenza e la capacit del microcontroller AVR
sul quale si basa. Con una manciata di shield aggiuntive facili da reperire (descritte nel
Capitolo 8) e una vesta selezione di sensori e attuatori a basso prezzo (che saranno
descritti nel dettaglio nel Capitolo 9), c davvero ben poco che non si possa fare con
Arduino, a condizione che si tengano a mente alcuni limiti fondamentali.
Il primo limite la memoria. LMCU AVR non offre molta memoria dove salvare
programmazione e variabili e molti dei componenti AVR non permettono di aggiungerne
di ulteriori. Detto questo, i tipi ATmega32 e ATmega128 possono utilizzare memoria
esterna, ma poi le funzioni I/O di questi pin cessano di essere immediatamente
disponibili. Le schede Arduino non sono state progettate per accogliere memoria
esterna, dal momento che nel progetto di base si dato per scontato che il chip AVR di
per s avrebbe offerto gli I/O necessari e lutente vi avrebbe eseguito un programma
relativamente corto. LArduino non stato pensato come alternativa a un sistema
informatico completo con gigabyte di RAM e un hard disk (HDD, hard disk drive).
Esistono alcuni computer economici, basati su Intel e con un ununica scheda, che
corrispondono a questa descrizione, ma che non starebbero dentro a una scatoletta di
mentine, a un pezzo di tubo PVC attaccato a un palo o a un albero, a un piccolo robot, o
in una sezione di un modellino di lanciarazzi. Arduino s.
Il secondo limite la velocit. La velocit di clock della CPU di Arduino di solito
compresa tra 8 e 20 MHz (nel Capitolo 4 troverete un confronto dettagliato dei tipi di
dispositivi AVR di Arduino). Anche se pu sembrare lento, dobbiamo tenere presente
due fattori chiave: il primo che lAVR il design di un RISC (reduced instruction set
computer) molto efficiente e il secondo che le cose nel mondo reale in genere non
avvengono molto velocemente dal punto di vista di un microcontroller. Per esempio,
quanto spesso un termostato cosiddetto intelligente deve campionare la temperatura in
una casa o in un ufficio? Una volta al secondo probabilmente unesagerazione e una
volta ogni 5 o perfino10 secondi andr benissimo. Quanto spesso un robot deve
emettere un impulso a ultrasuoni per determinare se davanti c un ostacolo? Un
impulso ogni 100 ms probabilmente pi che sufficiente (a meno che il robot non
proceda molto, molto rapidamente). Quindi, nel caso di un Arduino a 16 MHz (come il
Leonardo, per esempio), tra gli impulsi del sensore si produrranno circa 1.000.000 o pi
di tick del clock della CPU, a seconda di cosaltro sta facendo la CPU con gli impulsi.
Dato che in un uno o due cicli del clock un AVR pu eseguire molte istruzioni, tra ciascun
impulso del sensore a ultrasuoni e laltro rimane disponibile molta attivit della CPU.
Il terzo limite principale lalimentazione elettrica. Dal momento che lhardware di
Arduino in realt non altro che una PCB su cui risiede un IC AVR, tra il microcontroller
e il mondo esterno non c un buffer. Se non facciamo attenzione a non far scorrere pi
corrente di quella che il dispositivo pu gestire, rischiamo rapidamente di bruciare un
AVR (in altre parole, di surriscaldare lIC e distruggerlo). Dobbiamo tenere presente
anche il voltaggio, dal momento che alcuni tipi di AVR hanno I/O da 3,3 V, mentre altri
sopportano 5 V. Collegare un TTL (transistor-transistor logic) da 5 V a un dispositivo da
3,3 V di solito provoca danni allhardware e cos si rischia di bruciarlo.
Tenendo in mente i limiti che abbiamo appena descritto, ecco alcune possibili
applicazioni per Arduino:
Monitoraggio nel mondo reale
Stazione meteorologica automatica
Rilevatore di fulmini
Monitoraggio del sole per pannelli solari
Monitor di radiazioni in background
Rilevatore automatico di fauna selvatica
Sistema di sicurezza domestico o aziendale
Controllo a piccola scala
Piccoli robot
Modellini di razzi
Modellini di aerei
UAV quadrirotori
CNC semplice per piccole machine
Automazione a piccola scala
Serra automatica
Acquario automatico
Robot porta campioni da laboratorio
Camera termica di precisione
Sistema di test automatizzato elettronico
Performance artistica
Controllo dinamico dellilluminazione
Controllo dinamico della sonorizzazione
Strutture cinematiche
Opere che reagiscano al pubblico

Nei Capitoli 11, 12 e 13 vedremo applicazioni come un termostato intelligente, un


generatore di segnale programmabile e un sistema di controllo automatico per lanciare
razzi che vi aiuti a realizzare le vostre aspirazioni suborbitali. E questi non sono che la
punta delliceberg. Le possibilit sono vaste e sono limitate soltanto dalla vostra
immaginazione. Se non cercate di chiedere ad Arduino di fare qualcosa che dovrebbe
fare un computer completo, potete integrarlo in applicazioni interessanti di ogni tipo, che
esattamente quello che avevano in mente i ragazzi di Arduino.cc.

Per maggiori informazioni


Le schede elencate in questo capitolo non sono che una breve selezione di tutte quelle
disponibili e anche la storia Arduino molto pi ricca di dettagli. Se digitate Arduino nel
campo di ricerca di Google, otterrete migliaia di risultati da esplorare.
Il sito ufficiale di Arduino si trova su http://www.arduino.cc. Il blog di Massimo Banzi si
trova su http://www.massimobanzi.com.
Inoltre, trovate i link di altri siti e libri consigliati nelle Appendici.
2

Il microcontroller AVR

Dal momento che un Arduino basato su AVR in realt soltanto una piattaforma fisica
per un microcontroller AVR (cio, una scheda breakout), le caratteristiche elettriche di
Arduino sono essenzialmente quelle di un dispositivo AVR sulla PCB. Capire i dettagli di
basso livello di un Arduino significa in realt capire il dispositivo AVR che ne sta alla
base. Da questo punto di vista, questo capitolo presenta materiale di ampia
applicazione che consiste nelle descrizioni di alto livello delle funzioni principali utilizzate
dalla famiglia AVR. Questo comprende la CPU dellAVR e le cosiddette funzioni
periferiche come timer, contatori, la logica dellinterfaccia seriale, convertitori analogo-
digitale (A/D), comparatori analogici e porte I/O digitali e discrete.
I microcontroller AVR sono disponibili in una vasta gamma di tipi di configurazioni e
pacchetti, il che rende una sfida scrivere un capitolo come questo. Fortunatamente, i
vari tipi di dispositivi AVR da 8 bit utilizzano una CPU (central processing unit) comune e
unarchitettura interna modulare costruita intorno a un bus di dati interno. Questo
permette a ciascuna variante di incorporare diverse combinazioni e quantit di moduli
funzionali nei circuiti interni dellAVR, per rispondere a esigenze specifiche di design e
supportare diverse applicazioni.
Per via dei limiti pratici di spazio, le descrizioni in questo capitolo sono necessariamente
concise e concentrate sulle caratteristiche fondamentali. Inoltre, non forniscono molti dei
dettagli di basso livello che si possono trovare nella documentazione di riferimento
messa a disposizione da Atmel (http://www.atmel.com). Se avete bisogno o desiderio di
conoscere il circuito logico e i dettagli a livello di registro di quello che contiene un
particolare microcontroller AVR, Atmel mette a vostra disposizione gratuitamente
schede tecniche, guide per lutente e note applicative.

La storia
Il microcontroller AVR ha preso vita allinizio degli anni 90 nella forma del progetto di
uno studente presso il Norwegian Institute di Technology. Due studenti, Alf-Egil Bogen e
Vegard Wollan, hanno concepito un dispositivo da 8 bit con unarchitettura interna di tipo
RISC mentre lavoravano presso il semiconduttore locale a Trondheim, in Norvegia. Pi
tardi, il progetto stato venduto ad Atmel, dove Bogen e Wollan hanno continuato a
lavorarci e a perfezionarlo.
I microcontroller AVR sono altamente configurabili e molto versatili e includono diverse
caratteristiche uniche che li distinguono da altri microcontroller da 8 bit come i
componenti 8051 o 68HC05. LAVR un microcontroller RISC da 8 bit con architettura
Harvard modificata. In un programma di sola lettura con architettura Harvard, il codice e
i dati modificabili (variabili) sono salvati in spazi di memoria separati. Per fare un
confronto, un microprocessore come il 68040 utilizza larchitettura Von Neumann, nella
quale i programmi e i dati condividono lo stesso spazio di memoria.
La famiglia di dispositivi AVR stata una delle prime a incorporare la memoria flash per
larchiviazione dei programmi, al posto di una ROM che si pu programmare una sola
volta (memoria di sola lettura), di una EPROM (memoria di sola lettura che si pu
programmare e cancellare) o di una EEPROM (memoria di sola lettura che si pu
programmare e cancellare elettricamente) come su altri microcontroller. Questo
permette di riprogrammare un microcontroller AVR semplicemente caricando il codice di
un nuovo programma sulla memoria flash interna del dispositivo. Molti componenti AVR
dispongono di una piccola quantit di EEPROM per archiviare cose come parametri
operativi che devono persistere quando avvengono modifiche sulla memoria flash.

Larchitettura interna
Internamente, un microcontroller AVR ATmega consiste in una CPU AVR e varie funzioni
di input/output, timing, conversione analogico-digitale, contatore/timer e interfaccia
seriale, insieme ad altre funzioni a seconda del numero dei componenti. Queste vengono
definite da Atmel funzioni periferiche. Oltre alle funzioni I/O, le differenze principali tra i
tipi di microcontroller sta nella quantit di memoria flash integrata e di funzioni I/O
disponibili. I componenti da 8 bit utilizzano tutti essenzialmente lo stesso core della CPU
AVR. Ecco un elenco che mostra alcune delle caratteristiche principali dei
microcontroller AVR:
Architettura RISC
131 istruzioni
32 registri da 8 bit per scopi generali
Clock rate fino a 20 MHz (20 MIPS)
Memoria integrata
Memoria flash programmabile (fino a 256K)
EEPROM integrata (fino a 4K)
SRAM interna (fino a 32K)
Tensione di esercizio
VCC = da 1,8 a 5,5 V DC

La Figura 2-1 mostra un diagramma a blocchi semplificato del core della CPU dellAVR
che si trova sui dispositivi AVR da 8 bit. La Figura 2-2 mostra un diagramma a blocchi
generico e di alto livello di un dispositivo AVR. Il suo scopo non rappresentare un
dispositivo AVR specifico, ma soltanto un AVR in generale.

Figura 2-1 - Il diagramma a blocchi della CPU dellAVR.


Figura 2-2 - Il diagramma a blocchi di un microcontroller AVR.

Le funzioni periferiche sono controllate dalla CPU per mezzo di un bus di dati interno ad
alta velocit. I registri di controllo (separati dai registri della CPU) si utilizzano per
configurare loperazione delle periferiche. Tutte le funzioni periferiche condividono i pin
delle porte con le funzionalit I/O digitali e discrete.
Atmel produce molti tipi diversi di microcontroller AVR, cosa che permette ai designer di
hardware di scegliere il componente che risponde alle loro esigenze specifiche e che
riduce il numero di pin non utilizzati e di spazio sprecato su una scheda a circuito
stampato. Alcuni, come i componenti tinyAVR, sono piccoli contenitori a montaggio
superficiale con soltanto sei pin. Ciascuno ha una o pi porte digitali I/O discrete, che
possono essere programmate per eseguire diverse funzioni (Le funzioni periferiche).
Per esempio, lATTINY13-20SQ si presenta come un contenitore a montaggio
superficiale con DIP (dual in-line pin) o un SOIC (small-outline IC) da otto pin. Sei dei pin
del dispositivo sono collegati a una porta I/O interna da 8 bit (porta B). Gli altri due sono
VCC (alimentazione) e messa a terra. I sei pin della porta B possono essere configurati
come input analogici, output delloscillatore, input dellinterrupt, segnali dellSPI, oppure
input o output digitali discreti. Internamente, il dispositivo (anche quelli pi piccoli)
comunque un microcontroller AVR, dotato di una memoria flash integrata da 1K per i
programmi e 64 byte di RAM per le variabili.
Allaltra estremit dello spettro ci sono i componenti AVR come lATmega649, con nove
porte da 8 bit (da A a J, ma senza la I, dal momento che la lettera I pu essere confusa
con il numero 1), 64K di memoria flash, 4K di RAM, 2K di EEPROM, 54 pin I/O per
scopi generali e uninterfaccia LCD integrata. La serie di componenti AVR32 formata
da processori AVR da 32 bit con fino a 256K di memoria flash, 32K di RAM, ununit
DSP (digital signal processing) integrata, memoria protetta e 36 pin I/O per scopi
generali.
Nessuna scheda Arduino utilizza un componente AVR piccolo come il tinyAVR
(comprimere il bootloader di Arduino in qualcosa con soltanto 1K di memoria flash
disponendo ancora di spazio per un programma utile sarebbe davvero una sfida) o
come lATmega649 o lAVR32, ma qui la questione che la famiglia AVR offre molte
scelte e i componenti che sono stati scelti per essere utilizzati nei dispositivi Arduino non
sono gli unici componenti AVR che si possono utilizzare.

La memoria interna
Tutti i dispositivi AVR contengono varie quantit di tre tipi di memoria: flash, SRAM
(static random-access memory) ed EEPROM. La memoria flash si utilizza per salvare il
codice dei programmi, la SRAM si utilizza per contenere dati transitori come le variabili
e gli stack dei programmi, mentre la EEPROM pu contenere dati che devono
persistere nonostante i cambiamenti del software e i riavvii. Le memorie flash ed
EEPROM possono essere caricate esternamente ed entrambe conservano i loro
contenuti quando lAVR viene spento. La SRAM volatile e i suoi contenuti vengono
persi quando lAVR perde lalimentazione.

Le funzioni periferiche
Il cuore di un microcontroller AVR la CPU da 8 bit, ma quello che lo rende un
microcontroller davvero utile sono le funzioni periferiche integrate nellIC con la logica
della CPU. Le funzioni periferiche di un dispositivo AVR variano a seconda del tipo.
Alcune dispongono di un timer, altre ne hanno due o pi (fino a sei nel caso di alcuni
tipi). Altri componenti possono disporre di un convertitore A/D (ADC) da 10 bit, mentre
altri di un convertitore da 12 bit. Tutti i componenti AVR mettono a disposizione pin I/O
bidirezionali per segnali digitali discreti. Alcune versioni, inoltre, supportano un
touchscreen e altri tipi di interfacce interattive.
Questo paragrafo contiene descrizioni generali delle funzioni periferiche utilizzate sui vari
tipi di dispositivi AVR che si trovano sui prodotti Arduino, con lATmega168 come
esempio di base. Questo paragrafo non cerca di offrire un riferimento esaustivo di tutti i
tipi di microcontroller AVR, ma descrive la funzionalit generale di ciascun tipo di
funzione periferica. Nel Capitolo 3 trovate informazioni specifiche sui processori che si
utilizzano sulle schede Arduino descritte in questo libro. Inoltre, potete trovare i dettagli
di basso livello che non forniamo qui nella documentazione tecnica di Atmel.

I registri di controllo
Oltre che dei 32 registri di scopo generale della CPU, i dispositivi AVR dispongono
anche di diversi registri di controllo che determinano come devono comportarsi le porte
I/O, i timer, le interfacce di comunicazione e altre funzionalit. La configurazione dei
registri di controllo cambia a seconda del tipo di dispositivo, dal momento che diversi tipi
possono disporre di pi o meno porte rispetto ad altri e di diverse configurazioni delle
funzioni periferiche. I registri di controllo dei componenti AVR utilizzati sulle schede
Arduino descritte in questo libro si trovano nellAppendice B. Sono descritti nel dettaglio
anche nella documentazione messa a disposizione direttamente da Atmel.
Perfino un componente AVR modesto come lATmega168 ha molte pi funzionalit
interne di quanti pin non abbia a disposizione da dedicare a ciascuna funzione. Per
questo motivo, la maggior parte dei pin dei microcontroller AVR possono essere
configurati in modo che eseguano funzioni specifiche in base alle configurazioni
contenute nei registri di controllo. Dal momento che le funzioni dei pin possono essere
configurate dinamicamente, possibile fare in modo che un pin esegua un tipo di
funzione a un certo punto e poi una diversa una volta che il valore del registro di
controllo viene modificato.
Per esempio, il pin 12 dellATmega168 in un package (contenitore) DIP da 28 pin
collegato a PD6 (Porta D, bit 6), ma pu essere configurato anche in modo che si
comporti come un sorgente di interrupt (PCINT22), come linput positivo del
comparatore analogico interno dellAVR (AIN0), oppure come loutput di un circuito
logico del comparatore del timer (loutput Timer/Counter0 corrisponde ad A), che pu
essere utilizzato per generare un segnale PWM (Pulse Width Modulation).

Le porte I/O digitali


Per comunicare con il mondo esterno, i microcontroller AVR utilizzano porte I/O
bidirezionali. Una porta un registro da 8 bit nel quale alcuni o tutti i bit sono collegati ai
pin fisici del dispositivo AVR. Tipi diversi di dispositivi AVR hanno diversi numeri di porte,
che vanno da una sola sullATTINY13-20SQ alle nove dellATmega649. Le porte sono
etichettate come A, B, C e cos via.
Ciascun pin di una porta controllato dalla logica interna che gestisce la direzione del
segnale, lo stato di una resistenza pull-up interna, il timing e altre funzioni. Potete
osservarne un semplice schema nella Figura 2-3. Il Px che appare nella Figura 2-3 si
riferisce al bit/pin x (da 0 a 7) della porta. Trovate una descrizione dettagliata della
logica delle porte sugli AVR nella documentazione tecnica di AVR.
Figura 2-3 - Il diagramma a blocchi delle porte I/O dei dispositivi AVR.

Per via della logica sofisticata che si utilizza per controllare le funzionalit, le porte AVR
possono eseguire diverse funzioni, alcune delle quali simultaneamente. Quando una
porta viene configurata come output, comunque possibile leggervi dati e un output pu
essere utilizzato per azionare un interrupt (come vedremo in Gli interrupt a pagina 26).

I timer/contatori da 8 bit
Sui microcontroller AVR, sono disponibili due forme di timer/contatori da 8 bit. Nel primo
tipo, linput del clock derivato dal clock del sistema principale e quindi il
timer/contatore sincrono. La seconda forma ha la capacit di agire in modo asincrono
utilizzando una fonte di clock esterna. La Figura 2-4 mostra uno schema semplificato di
un timer AVR. I registri di controllo del timer/contatore sono definiti nellAppendice B e
descritti nel dettaglio nella documentazione tecnica di Atmel.
Figura 2-4 - Il diagramma a blocchi del timer/contatore dei dispositivi AVR.

Il modulo Timer/Counter0 di una funzione periferica timer/contatore da 8 bit di un


dispositivo AVR un timer e/o contatore a scopo generale che dotato di due circuiti di
confronto degli output indipendenti con quattro modalit operative. Le modalit operative
del timer/contatore sono:

Modalit normale
Si tratta della modalit operativa pi semplice del timer/contatore. Il conteggio si
incrementa sempre e il contatore non viene azzerato quando raggiunge il suo valore
massimo da 8 bit. Quando questo avviene, il contatore va in overflow e ritorna a zero.
Quando il contatore torna a zero, viene impostato il Timer/Counter Overflow Flag
(TOV0). Il flag TOV0 pu essere visto come un nono bit, ma viene soltanto impostato, e
non azzerato, dalloverflow del timer. Linterrupt delloverflow del timer azzera
automaticamente il bit del flag delloverflow e pu essere utilizzato per incrementare un
secondo contatore, basato sul software, nella memoria. Un nuovo valore del contatore
pu essere scritto sul registro TCNT0 in qualsiasi momento.

Modalit CTC (Clear Timer on Compare)


Nella modalit Clear Timer on Compare, il registro OCR0A viene utilizzato per
manipolare la risoluzione del contatore definendo il suo valore massimo. Questo
permette di ottenere un grande controllo della frequenza di output del compare match e
aiuta a semplificare il conteggio di eventi esterni.

Modalit Fast PWM


La modalit fast pulse width modulation supporta la generazione di forme donda PWM
ad alta frequenza.

Modalit Phase correct PWM


La modalit phase correct PWM offre lopzione di generare forme donda PWM ad alta
risoluzione a correzione di fase. Inoltre, alcuni dispositivi AVR contengono un
timer/contatore da 8 bit con la capacit di agire in modo asincrono utilizzando input di
clock esterni (i pin di input del clock TOSC1 e TOSC2). Dal punto di vista funzionale
equivalente al circuito del timer/contatore sincrono da 8 bit descritto prima.

I timer/contatori da 16 bit
Il timer/contatore da 16 bit simile alla versione da 8 bit, ma con un intervallo di
conteggio pi esteso. pura logica da 16 bit, che permette la generazione di PWM da
16 bit a periodo variabile. Il modulo dotato anche di due circuiti di confronto degli
output indipendenti, di registri di confronto degli output con doppio buffer e di un circuito
di cattura degli input con eliminazione del disturbo. Oltre che per la generazione di
PWM, il timer/contatore da 16 bit pu essere utilizzato per catturare eventi esterni ad
alta risoluzione, per generare frequenze e per misurare il timing dei segnali. Ha la
capacit di generare quattro diversi interrupt (TOV1, OCF1A, OCF1B e ICF1).

Il prescaler del timer/contatore


In un dispositivo AVR, uno o pi contatori possono condividere la stessa logica del
prescaler, ma con impostazioni diverse. Il prescaler essenzialmente un circuito
divisore che genera un derivato del clock I/O del sistema a f/8, f/64, f/256, oppure
f/1024, che vengono detti tap. Un timer/contatore pu utilizzare il tap f/64, mentre un
altro pu utilizzare il tap f/1024. Lutilizzo di un prescaler permettere di estendere
lintervallo di un timer/contatore in modo che si avvicini maggiormente al ritmo al quale si
verifica un evento esterno e inoltre aumenta la distanza tra loverflow e il reset del
timer/contatore.

Il comparatore analogico
Il comparatore analogico di un microcontroller AVR si utilizza per confrontare le tensioni
di ingresso sui pin AIN0 e AIN1. Anche se AIN0 definito come linput positivo e AIN1
come quello negativo, questo si riferisce alla loro relazione e non alla polarit vera e
propria delle tensioni di ingresso. La Figura 2-5 mostra uno schema semplificato del
circuito del comparatore analogico di un AVR.
Figura 2-5 - Il diagramma a blocchi del comparatore analogico di un dispositivo AVR.

Quando AIN0 maggiore di AIN1, la logica del comparatore imposta il flag del
comparatore ACO. L output del comparatore pu essere configurato in modo che azioni
la funzione di cattura dellinput di uno dei moduli timer/contatore e pu anche generare
un interrupt specifico per il comparatore. Levento interrupt pu essere configurato in
modo che azioni un aumento, una caduta o un cambio del comparatore.
Il circuito del comparatore analogico capace di fare ben pi che semplicemente
confrontare le tensioni sugli input AIN0 e AIN1. Linput del comparatore analogico pu
anche essere configurato in modo che linput AIN1 possa essere confrontato con il
riferimento di tensione bandgap interno, oppure AIN0 pu essere confrontato con
loutput del multiplexer ADC (e la sua tensione ancora a disposizione dellinput
dellADC). Gli insoliti simboli con le quattro frecce rappresentano porte analogiche.
Come una porta risponder a un input di controllo indicato dal cerchio di inversione:
quando si utilizza linversione dellinput di controllo viene passato un segnale analogico
quando il controllo low, oppure un segnale quando high.

Il convertitore analogico-digitale
Quasi tutti i microcontroller AVR contengono un convertitore analogico-digitale da 8 bit,
10 bit, oppure 12 bit. I convertitori da 8 bit si trovano sui componenti ATtiny6 e ATtiny10.
Alcune delle versioni automotive del microcontroller AVR non dispongono di ADC.
Quando un ADC fa parte del design dellAVR, pu essere dotato di input da 4 fino a 28.
Il numero esatto degli input disponibili dipende ampiamente dalla configurazione fisica.
Gli input vengono selezionati uno alla volta per mezzo di un multiplexer interno: non sono
tutti attivi contemporaneamente. Inoltre, ad alcuni dei pin I/O utilizzati dal multiplexer
degli input sullADC anche possibile assegnare altre funzioni.
I dispositivi ATmega168 sono dotati di 6-8 canali di input ADC, a seconda del package.
Il package PDIP (plastic DIP) ha un ADC da 10 bit con sei canali di input. I contenitori a
montaggio superficiale TQFP e QFN/MFL hanno un ADC da 10 bit con otto canali di
input. La Figura 2-6 mostra un diagramma a blocchi della funzione periferica ADC
dellAVR.

Figura 2-6 - Il diagramma a blocchi del convertitore analogico-digitale di un dispositivo AVR.

Notate che nella Figura 2-6 lAVR utilizza quello che viene detto convertitore ad
approssimazioni successive. Questo tipo di convertitore non particolarmente veloce,
ma semplice da implementare, dal momento che richiede soltanto un DAC
(convertitore digitale-analogico) e un comparatore. La durata tipica di una conversione
sullADC da 10 bit di un dispositivo AVR in modalit free-running, anche se continua a
mantenere la piena risoluzione, di circa 65 microsecondi (s) per campione.

Gli I/O seriali


LATmega168 offre principalmente tre forme di interfaccia seriale: seriale
sincrona/asincrona, SPI master/slave sincrona e uninterfaccia a due fili orientata al byte
simile allo standard I2C (Inter-Integrated Circuit) di Philips.

LUSART
Un componente diffuso su molti componenti AVR lUSART (Universal
Synchronous/Asynchronous Receiver-Transmitter) integrato, detto anche UART
(Universal Asynchronous Receiver-Transmitter). Questa funzione pu essere usata per
implementare uninterfaccia RS-232 o RS-485, oppure senza logica di interfaccia
esterna per comunicazioni da chip a chip. Il baud rate viene determinato dalla frequenza
del clock utilizzato sul microcontroller, ma la velocit pi tipica 9.600. Sono possibili
velocit maggiori con un cristallo esterno veloce. LUSART pu essere utilizzato anche
nella modalit SPI (serial peripheral interface), in aggiunta alla logica dedicata alla SPI
che si trova sui dispositivi AVR. La Figura 2-7 mostra i componenti interni di base della
funzione periferica USART dellAVR.

Figura 2-7 - Il diagramma a blocchi dellUSART di un dispositivo AVR.

La SPI
La logica periferica SPI dellAVR supporta tutte e quattro le modalit SPI standard di
lavoro. I pin I/O del dispositivo AVR possono essere configurati in modo che si
comportino come segnali MOSI, MISO e SCK1 utilizzati dalla SPI. Questi pin sono
diversi dai pin RxD e TxD (receive data e transmit data) utilizzati dallUSART. La Figura
2-8 mostra una vista ad alto livello della logica della SPI.
Figura 2-8 - Il diagramma a blocchi della SPI di un dispositivo AVR.

La TWI
La terza forma di I/O seriale supportato da molti dispositivi AVR la TWI (two-wire
interface). Questa interfaccia compatibile con il protocollo I2C di Philips. Supporta sia
la modalit operativa master che la slave e un indirizzo di dispositivo da 7 bit.
Linterfaccia TWI pu raggiungere velocit di trasferimento pari a fino 400 kHz con
arbitraggio del bus multimaster e ha la capacit di generare una condizione wakeup
quando il dispositivo AVR si trova in modalit sleep. Internamente, la periferica TWI
piuttosto complessa, molto pi delle periferiche USART o SPI. La Figura 2-9 mostra una
panoramica dellinterfaccia TWI.
Figura 2-9 - Il diagramma a blocchi della TWI (I2C) di un dispositivo AVR.

Gli interrupt
Gli interrupt sono una funzione essenziale dei processori moderni. Permettono al
processore di rispondere agli eventi, che siano interni o esterni, passando a un blocco
speciale di codice che gestisce gli interrupt. Una volta che stato eseguito il blocco di
codice, il controllo ritorna al programma che stato interrotto nel punto nel quale si era
prodotto linterrupt. Nei dispositivi AVR la risposta di un interrupt pu essere attivata o
disattivata per mezzo di bit nei registri di controllo. Questo paragrafo specifico per
lATmega168. Per altri tipi di microcontroller, potete consultare lAppendice A oppure la
documentazione ufficiale di Atmel (http://www.atmel.com/design-
support/documentation/).
LATmega168 dotato di due input di interrupt esterni: INT0 e INT1. Questi input
possono essere configurati in modo che si azionino in caso di caduta, aumento o basso
livello. Per configurarne il comportamento si utilizza il registro di controllo EICRA (vedere
Appendice B). INT0 e INT1 richiedono la presenza di un clock I/O. La modalit low-level
di un interrupt genera interrupt finch linput rimane low.
Anche i pin I/O dellATmega168 possono essere utilizzati come sorgenti di interrupt. Gli
interrupt port-change sono definiti da PCINT0 a PCINT23 e ciascuno di essi associato
a uno dei pin delle porte I/O del dispositivo. Quando viene attivato, un interrupt viene
generato ogni volta che cambia lo stato del pin di una porta, anche se il pin
configurato in modo da comportarsi come un output. Questo permette a un pin di
generare un interrupt sotto controllo del software quando un programma cambia lo stato
del pin mentre linterrupt relativo ai cambiamenti della porta attivato.
Quando un pin qualsiasi compreso tra PCINT0 e PCINT7 cambia, aziona linterrupt
PCI0. pin compresi tra PCINT8 e PCINT14 azionano PCI1 e quelli compresi tra
PCINT16 e PCTIN23 azionano linterrupt PCI2. I registri PCMSK0, PCMSK1 e PCMSK2
controllano quali pin contribuiscono agli interrupt dei cambiamenti dei pin.
Quando si verifica lattivazione di un interrupt, la CPU salta in una posizione in una
tabella vettoriale della memoria, che stata assegnata a quel particolare interrupt.
Lindirizzo contiene unistruzione jump (RJMP) che dirige al blocco di codice vero e
proprio di quellinterrupt. Quando il codice dellinterrupt terminato, lesecuzione ritorna
al punto del programma originale dove si era verificato linterrupt. La Figura 2-10 mostra
come si utilizza la tabella vettoriale degli interrupt per passare allesecuzione del blocco
di codice dellinterrupt e poi restituire il controllo al programma principale una volta
terminato il codice dellinterrupt.

Figura 2-10 - I vettori degli interrupt sui dispositivi AVR (ATmega168/328).

LATmega168, per esempio, ha una tabella vettoriale con 26 voci, come mostra la
Tabella 2-1. Per altri tipi di processori, potete consultare la documentazione di Atmel,
dove trovate ulteriori informazioni sugli interrupt e su come vengono gestiti sui dispositivi
AVR.
Tabella 2-1 - I vettori degli interrupt sullATmega168.

Vettore Indirizzo Sorgente Definizione


1 0x0000 RESET Pin esterno, accensione, calo di tensione e
watchdog
2 0x0002 INT0 Richiesta 0 di interrupt esterno
3 0x0004 INT1 Richiesta 1 di interrupt esterno
4 0x0006 PCINT0 Richiesta 0 di interrupt cambio di pin
5 0x0008 PCINT1 Richiesta 1 di interrupt cambio di pin
6 0x000A PCINT2 Richiesta 2 di interrupt cambio di pin
7 0x000C WDT Interrupt watchdog di time-out
COMPA Confronto corrispondenza
8 0x000E TIMER2
Timer/Counter2 A
COMPB Confronto corrispondenza
9 0x0010 TIMER2
Timer/Counter2 B
10 0x0012 TIMER2 OVF overflow Timer/Counter2
11 0x0014 TIMER1 CAPT Cattura di eventi Timer/Counter1
COMPA Confronto corrispondenza
12 0x0016 TIMER1
Timer/Counter1 A
COMPB Confronto corrispondenza
13 0x0018 TIMER1
Timer/Counter1 B
14 0x001A TIMER1 OVF Overflow Timer/Counter1
15 0x001C TIMER0 COMPA Timer/Counter0 corrispondenza A
16 0x001E TIMER0 COMPB Timer/Counter0 corrispondenza B
17 0x0020 TIMER0 OVF Overflow Timer/Counter1
18 0x0022 SPI, STC SPI Trasferimento seriale completato
USART,
19 0x0024 USART, Rx completo
RX
USART,
20 0x0026 USART, registro dati vuoto
UDRE
USART,
21 0x0028 USART, Tx completo
TX
22 0x002A ADC Conversione ADC completata
EE
23 0x002C EEPROM pronta
READY
ANALOG
24 0x002E COMP Comparatore analogico
25 0x0030 TWI Interfaccia a due fili seriale
SPM
26 0x0032 Programma di memorizzazione pronto
READY

Il timer watchdog
LAVR mette a disposizione un timer watchgod (WDT, watchdog timer) con un periodo di
time-out che si pu configurare tra 16 e 8 ms. Se il WDT attivato, pu essere utilizzato
per generare un reset subito dopo un time-out, generare un interrupt al verificarsi di un
time-out, oppure una combinazione di entrambi. Utilizza un oscillatore sul chip separato
e, dato che il WDT gestito da un oscillatore separato, continua a contare anche
quando il microcontroller si trova nella modalit sleep. Per questo pu essere utilizzato
per svegliare il microcontroller dopo un determinato periodo di tempo.
Un altro utilizzo comune del WDT per forzare un reset oppure un interrupt se il timer
scade senza unazione di reset da parte del software. Questo si rivela utile per
obbligare il microcontroller a uscire da uno stato di stallo oppure per rilevare un codice
fuori controllo.

Caratteristiche elettriche
I microcontroller AVR ATmega168 e ATmega328 possono funzionare con una tensione
di alimentazione da 1,8 a 5,5 V DC. LATmega32U4 pu utilizzare una tensione di
alimentazione da 2,7 a 5,5 V DC.
Il consumo di corrente di un dispositivo AVR varia a seconda del tipo di dispositivo, dello
stato attivo o disattivo (sleep) del microcontroller e della velocit del clock. I valori delle
linee di prodotti ATmega e XMEGA oscillano tra 0,55 mA ai 30 mA. Il consumo di
corrente complessivo dipende anche dalla quantit di corrente che scorre attraverso i
pin I/O. Il Capitolo 3 elenca i valori specifici relativi ai microcontroller ATmega168,
ATmega328, ATmega1280, ATmega2560 e ATmega32U4.

Per ulteriori informazioni


Il Capitolo 3 descrive i pinout utilizzati sui tre tipi di MCU AVR che si trovano sulle
schede Arduino, mentre il Capitolo 4 mostra come i pin delle MCU AVR sono mappati
sui pin I/O delle varie schede Arduino.
Ciascuna delle varie MCU AVR possono avere diverse combinazioni di funzioni
periferiche interne e, in alcuni casi, la funzionalit pu variare leggermente a seconda
del tipo. La fonte migliore di informazioni relative alle MCU AVR il sito web di Atmel
(http://www.atmel.com).
3

I microcontroller AVR specifici per


Arduino

Questo capitolo presenta le descrizioni tecniche dei tipi di componenti AVR che si
utilizzano nei modelli di Arduino basati sui dispositivi AVR da 8 bit. Il suo scopo
rappresentare la continuazione delle descrizioni funzionali presentate nel Capitolo 2
rispetto ai microcontroller AVR in generale, ma prestando particolare attenzione ai
microcontroller ATmega168/328, ATmega1280/2560 e ATmega32U4.
Dal punto di vista di qualcuno che programmi un Arduino con lIDE, il microcontroller
unastrazione semplificata del dispositivo AVR vero e proprio che vi si nasconde. Il
codice necessario per eseguire operazioni come configurare un pin di output per
generare un segnale PWM oppure dirigere internamente una tensione analogica
nellADC integrato semplice. Gli indirizzi interni dei registri di controllo e i loro bit di
controllo sono predefiniti, in modo che lautore dello sketch non debba preoccuparsi dei
dettagli di basso livello.
Dal momento che una scheda Arduino in realt non niente pi che il package di un chip
AVR, le caratteristiche elettriche di Arduino sono per lo pi quelle del processore. I pin
del chip sono collegati direttamente ai terminali dei pin o alle flange di saldatura sul
bordo della scheda Arduino. Tra i punti di connessione del chip e della scheda non c
n buffer n level-shifting (traslatori di livello).
Quando stavo scrivendo questo libro, Arduino utilizzava cinque tipi fondamentali di
microcontroller ATmega e tre variazioni, per un totale di otto componenti, che trovate
elencati nella Tabella 3-1. Le differenze principali tra i vari dispositivi AVR risiede nella
quantit memoria flash integrata a disposizione, nella velocit massima del clock, nel
numero di pin I/O sul chip e naturalmente nelle funzioni periferiche interne disponibili. Il
dispositivo ATmega32U4 dispone anche di uninterfaccia USB integrata, che elimina la
necessit di un secondo componente per gestire le comunicazioni USB. Tutti i dispositivi
utilizzano la stessa serie di istruzioni delle CPU.
Tabella 3-1 - I microcontroller AVR utilizzati nei prodotti Arduino.

Microcontroller Flash Pin I/O (max) Note


ATmega168 16K 23 clock 20 MHz
ATmega168V 16K 23 clock 10 MHz
ATmega328 32K 23 clock 20 MHz
ATmega328P 32K 23 clock 20 MHz, picoPower
ATmega328V 32K 23 clock 10 MHz
ATmega1280 128K 86 clock 16 MHz
ATmega2560 256K 86 clock 16 MHz
ATmega32U4 32K 26 clock 16 MHz

Questo livello intrinseco di compatibilit fa s che i programmi scritti per un Arduino


Diecimila possano essere compilati ed eseguiti senza modifica su una Uno. La
differenza principale tra una scheda Diecimila e una Uno che una utilizza lATmega168
e laltra si basa sullATmega328P. Come potete osservare nella Tabella 3-1,
lATmega328P ha il doppio di memoria flash integrata rispetto allATmega168. Pertanto,
i programmi scritti per una scheda Uno possono non essere retrocompatibili con una
Diecimila, se il codice stato progettato per essere utilizzato con una quantit di
memoria superiore.

LATmega168/328
LATmega168 e lATmega328 sono fondamentalmente lo stesso con quantit diverse di
memoria integrata. Nella Figura 3-1 mostrato il diagramma a blocchi di un dispositivo
ATmega168 o 328.
Figura 3-1 - Il diagramma a blocchi del microcontroller ATmega168/328.

La memoria
LATmega328 ha una quantit di memoria di ogni tipo doppia rispetto allATmega168,
come mostra la Tabella 3-2. A parte questo, i due componenti sono identici.
Tabella 3-2 - La memoria integrata dellATmega168/328.

ATmega168 ATmega328
Memoria programma flash 16 KB 32 KB
EEPROM 512 byte 1 KB
RAM 1 KB 2 KB

Le caratteristiche
Questi due componenti hanno in comune queste caratteristiche:
Programmazione in-system che utilizza il programma di avvio presente sul chip
Due timer/contatori da 8 bit con prescaler separato e modalit di confronto
Un timer/contatore da 16 bit con prescaler separato, modalit di confronto e
modalit di cattura
Contatore in tempo reale con oscillatore separato
Sei canali PWM
ADC da 10 bit a sei o otto canali (a seconda del package)
USART
Interfaccia seriale SPI master/slave
Interfaccia seriale a due fili (compatibile con I2C di Philips)
Timer watchdog programmabile
Comparatore analogico
23 linee I/O programmabili

I package (contenitori)
LATmega168 e lATmega384 sono disponibili in quattro tipi diversi di package: DIP da
28 pin, MLF a montaggio superficiale da 28 pin, TQFP a montaggio superficiale da 32
pin e MLF a montaggio superficiale da 32 pin. Il DIP da 28 pin il package utilizzato pi
comunemente sulle schede Arduino, anche se la Uno SMD utilizza un contenitore a
montaggio superficiale da 32 pin. Questo paragrafo dedicato alla versione PDIP
dellATmega168.

Le porte
LATmega168/328 dotato di tre porte designate come B, C e D. Le porte B e D sono
porte da 8 bit. La porta C ha a sua disposizione sei pin che possono essere utilizzati
come input ADC. Inoltre, PC4 e PC5 sono collegati alla logica della TWI e offrono
segnali SCL e SDA compatibili con I2C (clock e dati). Notate anche che di solito PC6
viene utilizzato come input per il RESET. Sui componenti non c PC7. E notate ancora
che sul componente ATmega168/328 non c Porta A.
Ciascuna porta offre I/O digitali bidirezionali e discreti con resistenze pull-up
programmabili interne. Gli stati on/off delle resistenze pull-up si selezionano per mezzo
dei bit dei registri di controllo dei pin specifici delle porte.
I buffer di output delle porte hanno funzionalit di trasmissione simmetriche con capacit
sink e source. Come input, i pin delle porte che sono resi esternamente low forniscono
corrente se le resistenze pull-up interne sono attivate. I pin delle porte sono passati in
una modalit a tre stati (alta impedenza) quando diventa attiva una condizione di reset,
anche se il clock non attivo.

Le funzioni dei pin


La Figura 3-2 mostra le funzioni dei pin del package DIP da 28 pin. Per maggiori
informazioni sui pinout dei contenitori a montaggio superficiale potete consultare la
documentazione di Atmel (http://bit.ly/atmel-docs).

Figura 3-2 - Le funzioni dei pin del package DIP del microcontroller ATmega168/328.

Gli input del comparatore analogico


La Figura 3-3 mostra le posizioni dei pin AIN0 e AIN1 sullATmega168 o sullATmega328
in un package PDIP. Notate che AIN0 condivide un pin con loutput del timer/contatore
OC0A (PD6). Quindi, se PD6 viene utilizzato come output PWM, non pu essere
utilizzato come input AIN0 a meno che non venga riconfigurato ogni volta che deve
cambiare la sua funzione.
Figura 3-3 - I pin di input del comparatore analogico sul microcontroller ATmega168/328.

Gli input analogici


A eccezione che per i pin SCL e SDA che si utilizzano per le comunicazioni seriali della
TWI, i pin dellinput analogico possono essere utilizzati come I/O digitali discreti oppure
come input analogici senza conflitti con altre funzioni periferiche dellAVR. La Figura 3-4
mostra i pin del package PDIP di un ATmega168 utilizzati per gli input analogici.

Figura 3-4 - I pin di input ADC del microcontroller ATmega168/328.


Le interfacce seriali
La Figura 3-5 mostra i pin I/O di un ATmega168 (package PDIP) utilizzati dalle funzioni
dellinterfaccia seriale. Dal momento che nessuna delle funzioni seriali condivide i pin
delle porte, possibile utilizzarne tutte e tre le forme senza conflitti sulle porte.

Figura 3-5 - I pin I/O seriali del microcontroller ATmega168/328.

Gli I/O del timer/clock


La logica del timer/contatore interno di un AVR ATmega168/328 complessa e questo
dimostrato dallassegnazione dei pin del chip, mostrata nella Figura 3-6. Notate che i
pin OCxn (OC0A, OC0B, OC1A, OC1B, OC2A e OC2B) sono disponibili come output
PWM e cos come appaiono etichettati sulle schede Arduino. Notate anche che T1 e
OSC0B condividono lo stesso pin (PD5), ma altrimenti gli output compatibili con PWM
possono essere utilizzati senza conflitti con altre funzioni del timer/contatore.
Figura 3-6 - I pin del timer/contatore del microcontroller ATmega168/328.

Gli interrupt esterni


I pin PD2 e PD3 della porta D sono pensati espressamente per essere utilizzati come
input per gli interrupt esterni. Anche qualunque pin compreso tra i pin PCINT0 e
PCINT23 pu essere utilizzato come input per gli interrupt esterni senza interferire con
altre funzioni assegnate (per una panoramica di come possono essere utilizzati questi
interrupt, vedere Gli interrupt a pagina 26). La Figura 3-7 mostra gli input per gli
interrupt esterni disponibili sui dispositivi ATmega168/328.
Figura 3-7 - I pin degli input per gli interrupt sui microcontroller ATmega168/328.

Le assegnazioni dei pin di Arduino


Le schede Diecimila, Duemilanove, Uno ed Ethernet utilizzano fondamentalmente lo
stesso layout della scheda (descritto nel Capitolo 4), come mostra la Figura 3-8. Per i
pin socket header, queste schede Arduino utilizzano una nomenclatura basata sulle
funzioni dei pin dellATmega168 o dellATmega328 installati sulla PCB. Lenfasi posta
soprattutto sulle funzioni che si utilizzano pi spesso, cio gli I/O digitali discreti, gli input
analogici e le funzioni di output PWM dei microcontroller AVR.
Figura 3-8 - Le etichette dei pin Arduino sullATmega168/328.

Le caratteristiche elettriche fondamentali


La Tabella 3-3 mostra alcune delle caratteristiche elettriche fondamentali dei
microcontroller ATmega168/328, sottolineandone il consumo energetico.
Tabella 3-3 - Il consumo energetico dellATmega168/328.

Dispositivo Parametro Condizione VCC Tipico Max


4,2 12
Attivo 8 MHz 5 V
Corrente di mA mA
alimentazione 0,9 5,5
Inattivo 8 MHz 5 V
mA mA
0,75
32 MHz TOSC 1,8 V
ATmega168 Modalit risparmio uA
energetico 0,83
32 MHz TOSC 5 V
uA
WDT attivato 3 V 4,1 uA 15 uA
Modalit spegnimento
WDT
3 V 0,1 uA 2 uA
disattivato
5,2 12
Attivo 8 MHz 5 V
Corrente di mA mA
alimentazione 1,2 5,5
Inattivo 8 MHz 5 V
mA mA
ATmega328 Modalit risparmio 32 MHz TOSC 1,8 V 0,8 uA
energetico 32 MHz TOSC 5 V 0,9 uA
WDT attivato 3 V 4,2 uA 15 uA
Modalit spegnimento WDT
3 V 0,1 uA 2 uA
disattivato

Con un VCC compreso tra 1,8 e 2,4 volt, un input low su un I/O definito come tensione
compresa tra 0,5 e due decimi (0,2) di VCC. Per un VCC compreso tra 2,4 e 5,5 volt,
un input low su un I/O definito come tensione compresa tra 0,5 e tre decimi (0,3) di
VCC.
Con un VCC compreso tra 1,8 e 2,4 volt, un input high definito come tensione
compresa tra sette decimi (0,7) VCC e VCC + 0,5 volt. Per un VCC compreso tra 2,4 e
5,5 volt, definito come tensione compresa tra sei decimi (0,6) VCC e VCC + 0,5 volt.

LATmega1280/ATmega2560
Come nel caso dellATmega168/328, la differenza principale tra lATmega1280 e
lATmega2560 la quantit di memoria integrata. Per quanto riguarda tutto il resto,
questi dispositivi sono identici. Nella Figura 3-9 mostrato un diagramma a blocchi
semplificato di un dispositivo ATmega1280 o 2560.
Figura 3-9 - Il diagramma a blocchi dellinterno dei microcontroller ATmega1280/2560.

Se vogliamo essere pi precisi, nella Figura 3-9 mancano alcuni piccoli dettagli, ma
appaiono tutti i componenti essenziali. Se desiderate osservare un diagramma pi
dettagliato, potete cercarlo nella documentazione di Atmel relativa ai componenti
ATmega1280 e ATmega2560. Notate anche che la Figura 3-9 mostra le funzioni interne
disponibili sul package da 100 pin. Quello da 64 pin supporta un sottogruppo di quello
che descritto qui.

La memoria
LATmega2560 dotato del doppio di ciascun tipo di memoria rispetto allATmega1280
e di otto volte pi memoria flash rispetto allMCU dellATmega328. La memoria
disponibile mostrata nella Tabella 3-4. A parte questo, lATmega1280 e lATmega2560
con gli stessi tipi di package sono identici.
Tabella 3-4 - La memoria integrata dellATmega1280/2560.
ATmega1280 ATmega2560
Memoria programma flash 128 KB 256 KB
EEPROM 4 KB 4 KB
RAM 8 KB 8 KB

Le caratteristiche
Questi due componenti condividono queste caratteristiche:
Programmazione in-system che utilizza il programma di avvio presente sul chip
Due timer/contatori da 8 bit con prescaler separato e modalit di confronto
Quattro timer/contatori da 16 bit con prescaler separato, modalit di confronto e
modalit di cattura
Contatore in tempo reale con oscillatore separato
12 Canali Pwm
Uscita del modulatore comparatore
ADC da 10 bit e sei canali
Quattro funzioni USART
Interfaccia seriale SPI master/slave
Interfaccia seriale a due fili (compatibile con I2C di Philips)
Timer watchdog programmabile
Comparatore analogico
86 linee I/O programmabili

I package
I dispositivi ATmega1280 e ATmega2560 si trovano in un package TQFP da 100 pin, un
package BGA (ball grid array) da 100 pin e un package TQFP da 64 pin. La Figura 3-10
mostra le dimensioni relative e lo spazio tra i pin (pitch) dei tre tipi di package disponibili.
Soltanto i package da 100 pin offrono tutte le funzionalit mostrate nella Figura 3-9. Le
schede Arduino Mega e Mega2560 utilizzano entrambe la versione da 100 pin del
package TQFP.
Figura 3-10 - I package dellATmega1280/2560.

Le porte
Le versioni da 100 pin dellATmega1280 e dellATmega2560 sono dotate di 11 porte,
etichettate da A a L. Notate che la porta I non c, dal momento che la lettera I
potrebbe essere confusa con il numerale 1.
Le porte A, B, C, D ed E sono porte da 8 bit bidirezionali. La porta B ha capacit di
trasmissione migliori delle altre porte. Le porte F e K si utilizzano come input del
convertitore A/D interno, ma possono fungere anche da porte bidirezionali. La porta G
una porta da 6 bit e le porte H, J e L sono interfacce bidirezionali da 8 bit. Ciascuna
porta mette a disposizione I/O digitali discreti con resistenze pull-up interne
programmabili. Gli stati on/off delle resistenze pull-up si selezionano per mezzo dei bit
del registro di controllo dei pin della porta. I buffer di output delle porte hanno
funzionalit di trasmissione simmetriche con capacit sink e source. Come input, i pin
delle porte che sono resi esternamente low forniscono corrente se le resistenze pull-up
interne sono attivate. I pin delle porte sono passati in una modalit a tre stati (alta
impedenza) quando diventa attiva una condizione di reset.

Le funzioni dei pin


I diagrammi mostrati in questo paragrafo si riferiscono alla versione da 100 pin dei
dispositivi ATmega1280/2560. Per ulteriori dettagli sui componenti BGA e da 64 pin,
potete consultare la documentazione tecnica di Atmel.

Gli input del comparatore analogico


Come i dispositivi ATmega168/328, pi piccoli, i componenti ATmega1280/2560 sono
dotati di due input del comparatore analogico, come indicato nel dettaglio nella Tabella
3-5 e mostrato nella Figura 3-11.
Tabella 3-5 - Gli input del comparatore analogico.

Pin Porta Funzione


4 PE2 AIN0
5 PE3 AIN1

Figura 3-11 - I pin degli input del comparatore analogico dellATmega1280/2560.

Gli input analogici


I dispositivi ATmega1280/2560 supportano fino a 16 input del convertitore A/D. Questi si
trovano sulle porte F e K e sul package da 100 pin sono collegati ai pin dal 82 a 97
(vedere Tabella 3-6).
Tabella 3-6 - Gli input analogici.

Pin Porta Funzione Pin Porta Funzione


82 PK7 ADC15 90 PF7 ADC7
83 PK6 ADC14 91 PF6 ADC6
84 PK5 ADC13 92 PF5 ADC5
85 PK4 ADC12 93 PF4 ADC4
86 PK3 ADC11 94 PF3 ADC3
87 PK2 ADC10 95 PF2 ADC2
88 PK1 ADC9 96 PF1 ADC1
89 PK0 ADC8 97 PF0 ADC0

Anche la porta F ha funzioni alternate TCK, TMS, TDI e TDO e i pin della porta K sono
collegati agli interrupt da PCINT16 a PCINT23. Le posizioni fisiche dei pin sono
mostrate nella Figura 3-12.

Figura 3-12 - I pin degli input ADC dellATmega1280/2560.

Le interfacce seriali
I dispositivi ATmega1280/2560 sono dotati di quattro funzioni USART interne. Queste si
presentano nella forma di quattro coppie di pin, delle quali una funge da TXD e laltra da
RXD. Sui package da 100 pin, linterfaccia SPI disponibile sulla porta B sui pin dal 19
al 22. Linterfaccia a due fili (I2C) collegata alla porta D per mezzo dei pin dal 43 al
44. Le assegnazioni dei pin sono elencati nelle Tabelle dalla 3-7 alla 3-12. La Figura 3-
13 mostra le posizioni dei pin I/O seriali sul package da 100 pin.
Tabella 3-7 - USART 0.

Pin Porta Funzione


2 PE0 RXD0
3 PE1 TXD0

Tabella 3-8 - USART 1.

Pin Porta Funzione


45 PD2 RXD1
46 PD3 TXD1

Tabella 3-9 - USART 2.

Pin Porta Funzione


12 PH0 RXD2
13 PH1 TXD2

Tabella 3-10 - USART 4.

Pin Porta Funzione


63 PJ0 RXD3
64 PJ1 TXD3

Tabella 3-11 - SPI.

Pin Porta Funzione


19 PB0 SS (active low)
20 PB1 SCK
21 PB2 MOSI
22 PB3 MISO

Tabella 3-12 - TWI.

Pin Porta Funzione


43 PD0 SCL
44 PD1 SDA
Figura 3-13 - I pin I/O seriali dellATmega1280/2560.

Gli I/O del timer/clock


Nel dispositivo ATmega1280/2560 ci sono cinque funzioni timer/contatore, come mostra
la Figura 3-14.

Figura 3-14 - I pin del timer/contatore sullATmega1280/2560.


La Tabella 3-13 ne elenca i pin. Notate che non ce il pin T2.
Tabella 3-13 - I pin del timer/contatore dellAtmega1280/2560.

Pin Porta Funzione Pin Porta Funzione


1 PG5 OC0B 50 PD7 T0
5 PE3 OC3A 15 PH3 OC4A
6 PE4 OC3B 16 PH4 OC4B
7 PE5 OC3C 17 PH5 OC4C
8 PE6 T3 18 PH6 OC2B
9 PE7 ICP3 27 PH7 T4
23 PB4 OC2A 35 PL0 ICP4
24 PB5 OC1A 36 PL1 ICP5
25 PB6 OC1B 37 PL2 T5
26 PB7 OC0A/OC1C 38 PL3 OC5A
47 PD4 ICP1 39 PL4 OC5B
49 PD6 T1 40 PL5 OC5C

Gli interrupt esterni


I dispositivi ATmega1280/2560 supportano otto input per gli interrupt esterni, oltre alle
funzioni di interrupt disponibili sulle porte B, J e K. I pin sono elencati nella Tabella 3-14.
Tabella 3-14 - I pin degli interrupt sullATmega 1280/2560.

Pin Porta Funzione Pin Porta Funzione


6 PE4 INT4 43 PD0 INT0
7 PE5 INT5 44 PD1 INT1
8 PE6 INT6 45 PD2 INT2
9 PE7 INT7 46 PD3 INT3

Le assegnazioni dei pin di Arduino


Le schede Arduino Mega e Mega2560 utilizzano il layout della scheda descritto nel
Capitolo 4. Per quanto riguarda i pin socket header, queste schede Arduino utilizzano
una nomenclatura basata sulle funzioni dei pin dellATmega1280 o dellATmega2650
installati sulla PCB. Lenfasi posta soprattutto sulle funzioni che si utilizzano pi
spesso, cio gli I/O digitali discreti, gli input analogici e le funzioni di output PWM dei
microcontroller AVR.
La Tabella 3-15 elenca i pin della Mega o Mega2560 e le connessioni al dispositivo AVR
ATmega1280/2560 sulla scheda. Le funzioni racchiuse tra parentesi sono i pin di
indirizzamento della memoria esterna e la tilde (~) serve a indicare un segnale active-
low (true quando low). A differenza delle schede Arduino pi piccole, le schede Mega
sono in grado di utilizzare SRAM esterna.
Tabella 3-15 - Le assegnazioni dei pin su Arduino Mega e Mega2560.

Pin sulla Pin sulla


N pin sul N pin sul
scheda Funzione scheda Funzione
chip chip
Mega Mega
0 2 RXD0 35 55 I/O (A10)
1 3 TXD0 36 54 I/O (A9)
OC3B
2 5 37 53 I/O (A8)
[PWM]
OC3C
3 6 38 50 T0
[PWM]
OC0B
4 1 39 70 I/O (ALE)
[PWM]
OC3A
5 4 40 52 I/O (~RD)
[PWM]
OC4A
6 15 41 51 I/O (~WR)
[PWM]
OC4B
7 16 42 42 PL7
[PWM]
OC4C
8 17 43 41 PL6
[PWM]
OC2B OC5C
9 18 44 40
[PWM] [PWM]
OC2A OC5B
10 23 45 39
[PWM] [PWM]
OC1A OC5A
11 24 46 38
[PWM] [PWM]
OC1B
12 25 47 37 T5
[PWM]
OC0A
13 26 48 36 ICP5
[PWM]
14 64 TXD3 49 35 ICP4
15 63 RXD3 50 22 MISO
16 13 TXD2 51 21 MOSI
17 12 RXD2 52 20 SCK
18 46 TXD1 53 19 ~SS
A0 (ingresso
19 45 RXD1 54 97
analogico)
A1 (ingresso
20 44 SDA 55 96
analogico)
A2 (ingresso
21 43 SCL 56 95
analogico)
A3 (ingresso
22 78 I/O (AD0) 57 94
analogico)
A4 (ingresso
23 77 I/O (AD1) 58 93
analogico)
A5 (ingresso
24 76 I/O (AD2) 59 92
analogico)
A6 (ingresso
25 75 I/O (AD3) 60 91
analogico)
A7 (ingresso
26 74 I/O (AD4) 61 90
analogico)
A8 (ingresso
27 73 I/O (AD5) 62 89
analogico)
A9 (ingresso
28 72 I/O (AD6) 63 88
analogico)
A10
29 71 I/O (AD7) 64 87 (ingresso
analogico)
A11
30 60 I/O (A15) 65 86 (ingresso
analogico)

A12
31 59 I/O (A14) 66 85 (ingresso
analogico)
A13
32 58 I/O (A13) 67 84 (ingresso
analogico)
33 57 I/O (A12) 68 83 A14
(ingresso
analogico)
A15
34 56 I/O (A11) 69 82 (ingresso
analogico)

Figura 3-15 - I pin degli input degli interrupt sullATmega1280/2560.

Notate che i pin dal 22 al 37 e i pin 39, 40 e 41 possono essere utilizzati per accedere
alla memoria esterna. Altrimenti, possono essere utilizzati come singoli pin I/O digitali.

Le caratteristiche elettriche
La Tabella 3-16 mostra alcune delle caratteristiche elettriche fondamentali dei
microcontroller ATmega1280/2560, sottolineandone il consumo energetico.
Tabella 3-16 - Il consumo energetico dellATmega1280/2560.

Dispositivo Parametro Condizione VCC Tipico Max


Corrente di 14
ATmega1280 Attivo 8 MHz 5 V 10 mA
alimentazione mA
Corrente di 2,7
ATmega2560 Inattivo 8 MHz 5 V 4 mA
alimentazione mA
WDT attivato 15 uA
entrambi Modalit risparmio WDT 3 V <5 uA 7,5
energetico disattivato 3 V <1 uA uA

Con un VCC compreso tra 1,8 e 2,4 volt, un input low su un pin I/O definito come
tensione compresa tra 0,5 e due decimi (0,2) di VCC. Per un VCC compreso tra 2,4 e
5,5 volt, un input low definito come tensione compresa tra 0,5 e tre decimi (0,3) di
VCC.
Con un VCC compreso tra 1,8 e 2,4 volt, un input high definito come tensione
compresa tra sette decimi (0,7) VCC e VCC + 0,5 volt. Per un VCC compreso tra 2,4 e
5,5 volt, definito come tensione compresa tra sei decimi (0,6) VCC e VCC + 0,5 volt.

LATmega32U4
LATmega32U4 un membro della linea di microcontroller XMEGA di Atmel. dotato di
32 KB di memoria programma flash, 2,5 KB di SRAM e 1 KB di EEPROM. Alle funzioni
I/O si accede per mezzo delle porte dalla B alla F. In questo specifico dispositivo, non
c porta A. La Figura 3-16 mostra il diagramma a blocchi dei principali componenti
interni dellATmega32U4.
Figura 3-16 - Il diagramma a blocchi del funzionamento interno del microcontroller ATmega32U4.

LATmega32U4 presenta uninterfaccia USB 2.0 veloce e integrata, che elimina la


necessit di uninterfaccia separata. Include inoltre uninterfaccia JTAG conforme 1149.1
per il debugging sul chip. LATmega32U4 pu funzionare con una tensione compresa tra
2,7 e 5,5 volt.

La memoria
Come mostra la Tabella 3-17, lATmega32U4 ha la stessa quantit di memoria flash e di
EEPROM dellATmega328, ma dotato di 2,5 KB di RAM anzich di 2 KB.
Tabella 3-17 - La memoria integrata dellATmega32U4.

ATmega32U4
Memoria programma flash 32 KB
EEPROM 1 KB
RAM 2,5 KB
Le caratteristiche
LATmega32U4 presenta queste caratteristiche:
Programmazione in-system che utilizza il programma di avvio presente sul chip
Un timer/contatore da 8 bit con prescaler separato e modalit di confronto
Due timer/contatori da 16 bit con prescaler separato, modalit di confronto e
modalit di cattura
Un timer/contatore da 10 bit ad alta velocit con PLL (phase-locked loop) e
modalit di confronto
Quattro canali PWM da 8 bit
Quattro canali PWM con risoluzione programmabile da 2 a 16 bit
Sei canali PWM ad alta velocit con risoluzione programmabile da 2 a 11 bit
Uscita del modulatore comparatore
ADC da 10 bit e 12 canali
Funzioni USART con handshake CTS/RTS
Interfaccia seriale SPI master/slave
Interfaccia seriale a due fili (compatibile con I2C di Philips)
Timer watchdog programmabile
Comparatore analogico
Sensore di temperatura integrato
26 linee I/O programmabili

I package
LATmega32U4 disponibile nei contenitori a montaggio superficiale TQFP44 o QFN44.
Le designazioni dei pin, mostrata nella Figura 3-17, sono le stesse per entrambi i tipi di
package.
Figura 3-17 - Il package da 44 pin del microcontroller ATmega32U4.

Le porte
LATmega32U4 ha cinque porte etichettate da B a F. Nei contenitori a montaggio
superficiale QFN/TQFP da 44 pin soltanto le porte B e D hanno tutti gli otto bit presenti
sui pin del package. Le porte C, E ed F sono rappresentate internamente come registri
da 8 bit, ma soltanto i bit PC6 e PC7 della porta C sono disponibili esternamente. Nel
caso della porta E, soltanto i bit PE2 e PE6 sono disponibili esternamente e in quello
della porta F i bit PF2 e PF3 non sono presenti sui pin del package.
Oltre alle varie funzioni periferiche, le porte B, C, D, E ed F sono porte I/P digitali,
bidirezionali e discrete. Ciascuna porta fornisce I/O digitali, bidirezionali e discreti con
resistenze pull-up interne programmabili. Gli stati on/off delle resistenze pull-up si
selezionano per mezzo dei bit del registro di controllo dei pin delle porte.
I buffer di output delle porte hanno funzionalit di trasmissione simmetriche con capacit
sink e source. Come input, i pin delle porte che sono resi esternamente low forniscono
corrente se le resistenze pull-up interne sono attivate. I pin delle porte sono passati in
una modalit a tre stati (alta impedenza) quando diventa attiva una condizione di reset.

Le funzioni dei pin


La Tabella 3-18 elenca le assegnazioni dei pin dellATmega32U4 in un package da 44
pin. La mappatura dei pin del chip rispetto i pin degli header della scheda Arduino
Leonardo si trova in Le assegnazioni dei pin di Arduino a pagina 61.
Tabella 3-18 - Le assegnazioni dei pin sullATmega32U4 TQFP/QFN-44.

Pin Funzioni Porta Pin Funzioni Porta


1 INT6/AIN0 PE6 16 XTAL2 n/d
2 USB UVCC n/d 17 XTAL1 n/d
3 USB D n/d 18 OC0B/SCL/INT0 PD0
4 USB D+ n/d 19 SDA/INT1 PD1
5 USB UGnd n/d 20 RXD1/INT2 PD2
6 USB UCap n/d 21 TXD1/INT3 PD3
7 USB VBus n/d 22 XCK1/CTS PD5
8 PCINT0/SS PB0 23 GND n/d
9 PCINT1/SCLK PB1 24 AVCC n/d
10 PDI/PCINT2/MOSI PB2 25 ICP1/ADC8 PD4
11 PDO/PCINT3/MISO PB3 26 T1/OC4D/ADC9 PD6
12 PCINT7/OC0A/OC1C/RTS PB7 27 T0/OC4D/ADC10 PD7
13 RESET n/d 28 PCINT4/ADC11 PB4
14 VCC n/d 29 PCINT5/OC1A/OC4B/ADC12 PB5

Gli input del comparatore analogico


SullATmega32U4 c soltanto un input esterno per il comparatore analogico. AIN0 si
trova sul pin 1. Laltro input del comparatore analogico va dal multiplexer di input allADC
integrato sul chip. Il circuito interno identico a quello mostrato in Il comparatore
analogico a pagina 21 ma senza il collegamento del pin AIN1.

Gli input analogici


LATmega32U4 mette a disposizione 12 input del convertitore A/D, elencati nella Tabella
3-19 e mostrati nella Figura 3-18. Questi si trovano sulle porte B, D ed F. Notate che
ADC2 e ADC3 non hanno pin esterni.
Tabella 3-19 - Gli input ADC dellATmega32U4.

Pin Porta Funzione Pin Porta Funzione Pin Porta Funzione


41 PF0 ADC0 37 PF6 ADC6 27 PD7 ADC10
40 PF1 ADC1 36 PF7 ADC7 28 PB4 ADC11
39 PF4 ADC4 25 PD4 ADC8 29 PB5 ADC12
38 PF5 ADC5 26 PD6 ADC9 30 PB6 ADC13

Figura 3-18 - I pin di input ADC dellATmega132U4.

Le interfacce seriali
LATmega32U4 ha una funzione USART interne con linee di handshake hardware,
uninterfaccia SPI e uninterfaccia a due fili (TWI) compatibile I2C (vedere le Tabelle
dalla 3-20 alla 3-22). Linterfaccia USB viene descritta pi avanti, nella Figura 3-22. Le
assegnazioni dei pin sono mostrate nella Figura 3-19.
Tabella 3-20 - USART.

Pin Porta Funzione Pin Porta Funzione


20 PD2 RXD1 22 PD5 CTS
21 PD3 TXD1 12 PB7 RTS

Tabella 3-21 - SPI.


Pin Porta Funzione Pin Porta Funzione
8 PB0 SS 10 PB2 MOSI
9 PB1 SCLK 11 PB3 MISO

Tabella 3-22 - TWI.

Pin Porta Funzione


18 PD0 SCL
19 PD1 SDA

Figura 3-19 - I pin I/P seriali dellATmega32U4.

Gli I/O del timer/clock


LATmega32U4 dotato di quattro funzioni timer/contatore integrate sul chip. Queste
consistono di un timer/contatore da 8 bit integrato, due timer/contatori da 16 bit con
prescaler e modalit di confronto separati e un timer/contatore da 10 bit ad alta velocit
con PLL (phase-locked loop) e una modalit di confronto. Notate che i timer/contatori da
16 bit supportano anche una modalit di cattura.
I timer sono numerati da 0 a 4, ma non esiste il timer/contatore 2.
I pin OC1A, OC1B e T0 del timer/contatore 0 agiscono su pin condivisi con il
timer/contatore 4 (il timer/contatore ad alta velocit). Analogamente, i pin dei
timer/contatori 1 e 3 sono condivisi con pin disponibili per il timer/contatore 4.
La Tabella 3-23 elenca le assegnazioni dei pin delle funzioni timer/clock
dellATmega32U4 MCU. La tilde (~) indica un pin active-low (low = true).
SullATmega32U4 non ci sono i pin T3 e T4. Soltanto i timer/contatori 0 e 1 hanno a
disposizione i pin T0 e T1. Le assegnazioni dei pin sono illustrate nella Figura 3-20.
Tabella 3-23 - I pin del timer/clock.

Pin Porta Funzione Pin Porta Funzione


12 PB7 OC0A/OC1C 29 PB5 OC1A/~OC4B
18 PD0 OC0B 30 PB6 OC1B/OC4B
25 PD4 ICP1 31 PC6 OC3A/OC4A
26 PD6 T1/~OC4D 32 PC7 ICP3/~OC4A

Figura 3-20 - I pin del timer/contatore sullATmega32U4.

Gli interrupt esterni


Le assegnazioni degli interrupt dei pin sullATmega32U4 MCU sono elencate nella
Tabella 3-24 e mostrate nella Figura 3-21.
Tabella 3-24 - I pin degli interrupt esterni.

Pin Porta Funzione Pin Porta Funzione


8 PB0 PCINT0 12 PB7 PCINT7
9 PB1 PCINT1 18 PD0 INT0
10 PB2 PCINT2 19 PD1 INT1
11 PB3 PCINT3 20 PD2 INT2
28 PB4 PCINT4 21 PD3 INT3
29 PB5 PCINT5 1 PE6 INT6

Figura 3-21 - I pin degli interrupt esterni sullATmega32U4.

I pin da PD0 a PD3 della porta D e il pin PE6 della porta E sono pensati espressamente
per essere utilizzati come input per gli interrupt esterni. Anche tutti i pin compresi tra
PCINT0 e PCINT7 possono essere utilizzati come input per gli interrupt esterni senza
interferire con altre funzioni assegnate (trovate una panoramica di come possono
essere utilizzati questi interrupt in Gli interrupt a pagina 26).

Linterfaccia USB 2.0


LATmega32U4 incorpora uninterfaccia USB 2.0 a piena velocit, ma non pu fungere
da host USB, soltanto come dispositivo. Mette a disposizione diversi endpoint interni con
buffer FIFO configurabili. Un PLL integrato sul chip genera un clock da 48 MHz per
linterfaccia USB e linput del PLL pu essere configurato in modo da utilizzare un
oscillatore esterno, una fonte di clock esterna, oppure una fonte di clock RC interna.
Loutput da 48 MHz del PLL si utilizza per generare una piena velocit di 12 MHz oppure
un clock a bassa velocit da 1,5 MHz.
Notate che i pin USB dellATmega32U4 non sono associati a una porta, ma soltanto alla
logica USB interna e al circuito di regolazione della tensione. Le assegnazioni dei pin I/O
USB sono elencate nella Tabella 3-25 e mostrate nella Figura 3-22.
Tabella 3-25 - Gli I/O USB.

Pin Funzione Pin Funzione


2 USB UVCC 5 USB UGnd
3 USB D 6 USB UCap
4 USB D+ 7 USB VBus

Figura 3-22 - I pin USB dellATmega32U4.

Le caratteristiche elettriche
La Tabella 3-26 mostra le caratteristiche elettriche massime dellATmega32U4 e la
Tabella 3-27 mostra i parametri di consumo energetico di base.
Tabella 3-26 - Le caratteristiche massime dellATmega32U4.

Parametro Valori Unit


Tensione pin I/O Da -0,5 a VCC +0,5 V
Tensione pin reset Da -0,5 a +13,0 V
Tensione pin VBUS Da -0,5 a +6,0 V
Dispositivo VCC V 6,0 V
Corrente DC pin I/O 40,0 mA
Corrente VCC 200,0 mA

Tabella 3-27 - Il consumo energetico dellATmega32U4.

Parametro Condizione VCC Tipico Massimo


Corrente di Attivo 8 MHz 5 V 10 mA 15 mA
alimentazione Inattivo 8 MHz 5 V 6 mA
WDT attivato 3 V <10 uA 12 uA
Modalit risparmio
energetico WDT
3 V 1 uA 5 uA
disattivato

Le assegnazioni dei pin di Arduino


La scheda Arduino Leonardo usa la versione estesa del layout di base, che include
ulteriori pin. I pin dellinterfaccia USB sono collegati direttamente al connettore USB sulla
PCB e i segnali USB non vengono riportati sui pin-socket degli header ai lati della PCB..
Il layout della scheda Leonardo descritto nel Capitolo 4. Nella Tabella 3-28 trovate la
mappatura dei pin del chip su quelli della scheda Leonardo. Notate che non tutti i pin
dellATmega32U4 sono estratti e alcuni dei pin di input ADC sono utilizzati come pin I/O
digitali e discreti.
Tabella 3-28 - La mappatura dei pin di Leonardo sullATmega32U4.

Pin Pin
Pin di Pin di
del Funzioni del Funzioni
Leonardo Leonardo
chip chip
0 20 RXD1/INT2 11 12 PCINT7/OC0A/OC1C
1 21 TXD1/INT3 12 26 T1/OC4D/ADC9
2 19 SDA/INT1 13 32 ICP3/CLK0/OC4
3 18 OC0B/SCL/INT0 A0 36 ADC7/TDI
4 25 ICP1/ADC8 A1 37 ADC6/TD0
5 31 OC3A/OC4A A2 38 ADC5/TMS
6 27 T0/OC4D/ADC10 A3 39 ADC4/TCK
7 1 INT6/AIN0 A4 40 ADC1
8 28 PCINT4/ADC11 A5 41 ADC0
9 29 PCINT5/OC1A/OC4B/ADC12 AREF 42 AREF

I fuse bit
Per impostare vari parametri come la sorgente del clock, i divisori del timer, i blocchi di
accesso alla memoria e cos via, le MCU AVR utilizzano una serie di cosiddetti fuse.
Potete immaginarli come un gruppo di interruttori. In questo paragrafo daremo
unocchiata ai fuse bit dellATmega168/328. Questa e la MCU utilizzata nelle schede
Duemilanove, Mini, Nano e Uno e di solito nei progetti AVR si utilizza la versione DIP
(dual in-line pin). I concetti generali valgono anche per lATmega1280/2560 e
lATmega32U4.
NellATmega168/328 per i fuse bit ci sono tre byte: low, high ed extended. Un fuse bit si
imposta su zero quando viene programmato (cio, sono logica active-low). Le Tabelle 3-
29, 3-30 e 3-31 elencano i fuse bit dellAVR e le loro funzioni.
Tabella 3-29 - I byte dei fuse low.

N N
Nome Valore Nome Valore
del Descrizione del Descrizione
del bit pred. del bit pred.
bit bit
Clock diviso Sorgente del
CKDIV8 7 0 CKSEL3 3 0
per 8 clock
Output del Sorgente del
CKOUT 6 1 CKSEL2 2 0
clock clock
Momento di Sorgente del
SUT1 5 1 CKSEL1 1 1
avvio clock
Momento di Sorgente del
SUT0 4 0 CKSEL0 0 0
avvio clock

Tabella 3-30 - I byte dei fuse high.

N N
Nome del Valore Nome del Valore
del Descrizione del Descrizione
bit pred. bit pred.
bit bit
Disattiva EEPROM
RSTDISBL 7 reset 1 EESAVE 3 preservata 1
esterno
Attiva Livello
DWEN 6 1 BODLEVEL2 2 1
debugWIRE frigger BOD
Attiva
Livello
SPIEN 5 download 0 BODLEVEL1 1 1
frigger BOD
SPI
Timer
Livello
WDTON 4 watchdog 1 BODLEVEL0 0 0
frigger BOD
attivo

Tabella 3-31 - I byte dei fuse extended.

Nome N N
Valore Nome del Valore
del del Descrizione del Descrizione
pred. bit pred.
bit bit bit
- 7 - 1 - 3 - 1
Dimensione
- 6 - 1 BOOTSZ1 2 0
del boot
Dimensione
- 5 - 1 BOOTSZ0 1 0
del boot
Vettore di
- 4 - 1 BOOTRST 0 1
reset

Per il routing dellinput e delloutput del clock, lAVR utilizza una logica detta AVR Clock
Control Unit, come mostra la Figura 3-23. I nomi clk del timing route si riferiscono alla
funzione di timing di ciascun percorso. Trovate maggiori dettagli sulla scheda tecnica
dellATmega328 di Atmel (http://bit.ly/mc-atmega328). Il multiplexer del clock pu
essere configurato con i fuse bit CKSEL(3:0), oppure con il nibble di 4 bit meno
significativo. La Tabella 3-32 elenca le possibili opzioni di sorgenti di clock e i valore dei
fuse bit CKSEL.
Figura 3-23 - Il sottosistema di controllo e distribuzione dellAVR.

Tabella 3-32 - Selezionare la sorgente del clock utilizzando fuse bit CKSEL.

Sorgente del clock CKSEL(3:0) Sorgente del clock CKSEL(3:0)


Low power crystal 1111 - 1000 Calibrato interno 0010
Full swing crystal 0111 - 0110 Clock esterno 0000
Low frequency crystal 0101 - 0100 Non utilizzato (riservato) 0001

Notate che le sorgenti di clock al cristallo offrono ulteriori opzioni, a seconda di come
sono impostate. Nel Capitolo 10 utilizzeremo questi fuse bit per configurare un AVR
nuovo di zecca su una PCB personalizzata.
In un dispositivo o sistema basato su Arduino probabilmente i bit CKSEL non
dovrebbero essere alterati, ma altri fuse bit possono essere impostati in modo che
forniscano funzioni utili. Nel fuse byte high, i fuse bit WDTON e BODLEVEL possono
essere utilizzati per attivare il timer watchdog dellAVRe impostare il livello di risposta
BOD (brown-out detection). Sia il timer watchdog che il circuito brown-out detection
causano un reset della MCU.
In watchdog si rivela spesso molto utile, specie in situazioni nelle quali un errore di
qualche tipo pu provocare problemi pi gravi. Se il registro di controllo del watchdog
viene resettato prima del time-out, di solito nel ciclo principale, non aziona un interrupt.
Se qualche parte del codice smette di rispondere, il ciclo principale si interrompe e il
timer termina. Per il controllo del watchdog, avr-libc mette a disposizione le funzioni
wdt_enable(), wdt_disable() e wdt_reset().

La brown-out detection genera un interrupt se lalimentazione DC del VCC cade al di


sotto di una determinata soglia. Questo pu dare tempo sufficiente per salvare dati
importanti su una memoria flash collegata oppure per cambiare alcuni output digitali
discreti.
I fuse bit possono essere impostati utilizzando strumenti di programmazione come quelli
descritti in La programmazione in-system a pagina 150 nel Capitolo 6. Il riquadro
Impostare i fuse bit della MCU AVR per un cristallo a 16 MHz a pagina 420 descrive
come si impostano i fuse bit di una MCU AVR in modo che funzioni con un clock da 16
MHz.
Questo non stato che uno sguardo rapido sui fuse bit. Come sempre, per trovare le
descrizioni dettagliate del timer watchdog e dei livelli di brown-out detection, potete
consultare la documentazione di Atmel.

Per ulteriori informazioni


Il Capitolo 2 contiene le panoramiche delle funzioni periferiche interne che si trovano nei
microcontroller AVR. Il Capitolo 4 contiene i pinout delle schede Arduino per le funzioni
della MCU AVR.
Per informazioni dettagliate sulle funzioni periferiche interne dei microcontroller AVR,
potete consultare questi documenti di Atmel (disponibili sul sito web di Atmel, sotto
SupportDatasheets):
Datasheet: ATmega48PA/ATmega88PA/ATmega168PA/ATmega328P 8 bit
Microcontroller with 4/8/16/32K Bytes In-System Programmable Flash
Datasheet: Atmel ATmega640/V-1280/V-1281/V-2560/V-2561/V 8 bit Atmel
Microcontroller with 16/32/64KB In-System Programmable Flash
Datasheet: ATmega16U4/ATmega32U4 8 bit Microcontroller with 16/32K Bytes di
ISP Flash and USB Controller
4

I dettagli tecnici di Arduino

Questo capitolo descrive le caratteristiche generali, fisiche ed elettriche, di specifiche


schede Arduino, dalla Diecimila fino ai tipi pi recenti come la Leonardo, la Esplora e la
Micro. Gli argomenti trattati comprendono le descrizioni dei pinout e le dimensioni fisiche
della maggior parte degli attuali modelli di Arduino, dai tipi pi classici come la Uno, alle
schede con un fattore di forma superiore come la Mega e lunica Esplora, a quelle pi
compatte come i modelli Mini, Micro e Nano.

Caratteristiche e funzionalit di Arduino


La Tabella 4-1 mette a confronto i tipi pi diffusi di schede Arduino. Se confrontate
questa tabella con quelle del Capitolo 1, notate chiaramente che le funzionalit di base
di una scheda Arduino sono quelle fornite dal suo microcontroller. Tuttavia, dal momento
che i design di Arduino allocano determinati pin dei processori AVR a determinate
funzioni, oppure non mettono a disposizione tutti i pin del processore, non tutte le
funzionalit dei microcontroller sono disponibili sui terminali di Arduino.
Tabella 4-1 - Le funzionalit hardware di Arduino.

Nome della VCC Clock Pin Pin Pin


Processore USBc
scheda (V) (MHz) AINa DIOb PWM
ArduinoBT ATmega328 5 16 6 14 6 Nessuno
Duemilanove ATmega168 5 16 6 14 6 Normale
Duemilanove ATmega328 5 16 6 14 6 Normale
Diecimila ATmega168 5 16 6 14 6 Normale
Esplora ATmega32U4 5 16 - - - Micro
Ethernet ATmega328 5 16 6 14 4 Normale
Fio ATmega328P 3,3 8 8 14 6 Mini
Leonardo ATmega32U4 5 16 12 20 7 Micro
LilyPad ATmega168V 2,7 8 6 14 6 Nessuno
5,5
2,7
LilyPad ATmega328V 8 6 14 6 Nessuno
5,5
Mega ATmega1280 5 16 16 54 15 Normale
Mega ADK ATmega2560 5 16 16 54 15 Normale
Mega 2560 ATmega2560 5 16 16 54 15 Normale
Micro ATmega32U4 5 16 12 20 7 Micro
Mini ATmega328 5 16 8 14 6 Nessuno
Mini Pro ATmega168 3,3 8 6 14 6 Nessuno
Mini Pro ATmega168 5 16 6 14 6 Nessuno
Nano ATmega168 5 16 8 14 6 Mini-B
Nano ATmega328 5 16 8 14 6 Mini-B
Pro (168) ATmega168 3,3 8 6 14 6 Nessuno
Pro (328) ATmega328 5 16 6 14 6 Nessuno
Uno ATmega328 5 16 6 14 6 Normale
Yn ATmega32U4 5 16 12 20 7 Host (A)
a Input analogici.
b I/O digitali.
c Output pulse-width modulation (alternano funzioni pin DIO).

NOTA In questo e altri paragrafi si utilizza il termine pin quando ci si riferisce ai pin socket di Arduino. Lo facciamo
soprattutto per mantenerci fedeli alla terminologia che si trova altrove, ma tecnicamente non del tutto corretta. I punti
di connessione sulla scheda Arduino sono socket e i pin veri e propri sono i jumper e le shield che si inseriscono in
queste prese. Potete immaginare un pin come un punto di connessione di qualche tipo, che sia un terminale di un
circuito integrato, una posizione terminale di una presa di un header da 0,1 pollici (2,54 mm), oppure i pin che si
estendono dalla base di una PCB shield.

Le interfacce USB di Arduino


A partire dalla scheda Leonardo (2012), come processore principale viene utilizzato il
microcontroller ATmega32U4 XMEGA. Questo componente dotato di uninterfaccia
USB integrata, che elimina la necessit di un ulteriore chip come sui modelli precedenti
di Arduino con uninterfaccia USB. Tutte le schede Leonardo (2012), Esplora (2012),
Micro (2012) e Yn (2013) utilizzano il processore ATmega32U4.
I modelli pi vecchi di Arduino con USB utilizzavano uninterfaccia FTDI (il chip
FT232RL), un ATmega8 (Uno), oppure un ATmega16U2 (Mega2560 e Uno R3). Il
FT232RL esegue le conversioni tra seriale standard (come RS-232) e USB. Nelle
schede Uno, Uno R3 e Mega2560, gli ulteriori piccoli processori ATmega sono
preprogrammati in modo che fungano da interfaccia USB. Loperazione di questi
componenti trasparente quando si utilizza lIDE di Arduino per creare e caricare gli
sketch dei programmi.
Le schede che non sono dotate di interfaccia USB devono essere programmate
utilizzando un adattatore esterno.
Internamente, i tipi di Arduino che utilizzano linterfaccia seriale-USB FTDI FT232RL
sono essenzialmente identici e consistono di un circuito di regolazione della tensione DC
e di due IC. La Figura 4-1 mostra il diagramma a blocchi dei modelli Diecimila e
Duemilanove con interfaccia FTDI.

Figura 4-1 - Linterfaccia USB FTDI.

A partire circa dal 2010, per linterfaccia USB le schede Uno R2 e Uno SMD hanno
cominciato a utilizzare lATmega16U2, anzich la FTDI FT232RL. Anche la Uno R3 ha
lATmega16U2, che funge da interfaccia USB. LATmega16U2 incorpora uninterfaccia
USB integrata e fondamentalmente uguale allATmega32U4, ma con meno memoria.
La Figura 4-2 mostra il diagramma a blocchi di una scheda Uno R2 con un ATmega16U2
che fornisce linterfaccia USB. La Uno, con un ATmega8, internamente presenta la
stessa organizzazione funzionale della Uno R2, ma con una MCU diversa che funge da
interfaccia USB.

Le dimensioni fisiche di Arduino


Le schede Arduino si trovano in una vasta gamma di forme e dimensioni, ma in genere
tendono a essere organizzate in quattro gruppi: le schede di base, le mega, quelle con
un fattore di forma piccolo e quelle per scopi speciali.

Figura 4-2 - Linterfaccia USB dellATmega16U2.

NOTA Le dimensioni delle schede segnalate in questo paragrafo, anche se vi si avvicinano molto, in genere sono
approssimate, dal momento che possono esserci piccole variazioni a seconda del fornitore. Se vi servono le
dimensioni precise, potete consultare i layout delle PCB su Arduino.cc, dove ne trovate uno per ciascuna scheda.
Oppure, meglio ancora, potete misurare una scheda vera e propria.

Per farvi unidea della scala, la Figura 4-3 mostra diverse schede Arduino molto diffuse.
In senso antiorario a partire dallangolo in basso a sinistra, vedete una Duemilanove, una
Leonardo, un clone della Mega2560 di SainSmart con un layout di pin I/O esteso e una
Mega2560 ufficiale di Arduino, con una Arduino Nano al centro.
Figura 4-3 - Confronto di schede Arduino e cloni.

I tipi di PCB Arduino di base


La Figura 4-4 mostra i layout fisici di sei diverse schede Arduino di base, dalla Diecimila
alla Leonardo. Nel mezzo compaiono le varianti Duemilanove e Uno. In questo contesto,
di base si riferisce al layout della PCB Arduino classica, che determina il design fisico
della maggior parte delle shield e degli altri componenti aggiuntivi. Le funzioni degli I/O e
degli altri pin su ciascuna PCB sono descritte in Le configurazioni del pinout di Arduino
a pagina 78.
Figura 4-4 - I tipi di PCB Arduino di base.

Nel caso delle schede Diecimila, Duemilanove, Uno R2 (revisione 2) e Uno SMD, la
disposizione delle prese I/O sugli header ai bordi delle PBC non cambia. Quando parla
del fattore di forma dellArduino di base, questo libro si riferisce a questo. Inoltre, a
partire dalla Uno R2, sulla PCB appare un nuovo blocco di sei pin, in aggiunta a quello
che esisteva gi sulle schede precedenti. Si tratta dellinterfaccia ICSP (In-Circuit Serial
Programming) del processore ATmega16U2, che si utilizza per linterfaccia USB. Anche
la Uno SMD dotata di questa nuova interfaccia ICSP.
La Uno R3 ha introdotto la nuova configurazione estesa di pin I/O. Si tratta di
unestensione retrocompatibile, che significa che le shield pensate per i modelli
precedenti come il Duemilanove funzionano lo stesso sulle nuove schede. Lestensione
non fa altro che aggiungere nuovi pin-socket di segnale, ma nessun segnale nuovo, e
non altera nessuna delle funzioni dei pin che si trovano sul layout di base. La PCB
Leonardo utilizza il processore ATmega32U4, che offre il supporto USB integrato, per
cui su una PCS Leonardo ci sono soltanto un microcontroller IC e soltanto una porta
ICSP. Il layout dei pin I/O uguale a quello delle schede precedenti, anche se le porte
vere e proprie del microcontroller utilizzate sono diverse.
Tutte le schede Arduino di base hanno le stesse dimensioni fisiche, come mostra la
Figura 4-5. Le posizioni dei fori di montaggio della PCB variano da modello a modello, a
seconda della versione della scheda, ma le dimensioni esterne della scheda in generale
sono le stesse.
Figura 4-5 - Le dimensioni delle schede di base ed estesa.

I tipi di PCB Arduino con fattore di forma Mega


Le schede con fattore di forma Mega incorporano il pinout di base insieme a ulteriori pin
per adattarsi alle capacit aggiuntive dei microcontroller ATmega1280 e ATmega2560
(questi dispositivi sono descritti in LATmega1280/ATmega2560 a pagina 39 nel
Capitolo 3).

Le schede Mega e Mega2560


Le schede Mega e Mega2560 presentano essenzialmente lo stesso layout e la
differenza principale tra di loro il tipo di dispositivo AVR sulle schede. La Mega2560
sostituisce la Mega, che non viene pi prodotta da Arduino.cc, anche se si possono
ancora trovare alcune schede cloni second-source. Se si pensa alla memoria pi
potente della Mega2560, davvero non ci sono motivi per acquistare una Mega.
La Figura 4-6 mostra le dimensioni complessive delle schede Mega o Mega2560.
Notate che sulle schede Mega funzionano le shield per quelle di base (Uno, Leonardo,
ecc.). Sulla Mega, i pin I/O sono organizzati in modo che gli I/O digitali di base e gli
input A/D dallo 0 al 5 siano compatibili con il layout dei pin di base.
Figura 4-6 - Le dimensioni della Mega e della Mega2560.

La Mega ADK
La Mega ADK si basa sulla Mega2560, ma mette a disposizione uninterfaccia USB host
che permette di collegarla a telefoni Android e dispositivi simili. A parte che per il
connettore USB addizionale che si trova tra il connettore USB di tipo B e la presa di
corrente continua, in termini di dimensioni identica alla Mega2560. Come nel caso
della Mega2560, con la Mega ADK possibile utilizzare shield standard di tipo base.

I tipi di PCB Arduino con fattore di forma piccolo


Le schede Arduino di dimensione normale sono state le prime ad apparire intorno al
2005 e prima del 2007 il loro layout e quello esteso sono diventate le forme che si
utilizzano oggi. Ma il team di Arduino e i suoi partner si sono accorti che la scheda di
dimensione normale non si rivelava ideale per alcune applicazioni e quindi ne inventarono
alcuni formati in miniatura.
Le schede in miniatura sono i layout Mini, Micro, Nano e Fio. Queste PCB presentano
sia la lunghezza che la larghezza ridotte, ma sono comunque dotate di processori AVR
come quelle di dimensioni normali.

La Mini
La Mini pensata per essere utilizzata sulle breadboard oppure in altre applicazioni
dove lo spazio sia limitato. Non dotata di connettore USB e per trasferire codice
eseguibile sul microcontroller necessario utilizzare uninterfaccia esterna. La sue
dimensioni sono mostrate nella Figura 4-7.

Figura 4-7 - Le dimensioni dellArduino Mini.

La Pro Mini
La Pro Mini simile alla Mini per quanto riguarda il layout dei pin e il fattore di forma,
ma, a differenza della Mini, pensata per installazioni permanenti o semipermanenti. La
Pro Mini stata progettata e prodotta da SparkFun Electronics. La sue dimensioni sono
mostrate nella Figura 4-8.
Figura 4-8 - Le dimensioni dellArduino Pro Mini

La Nano
Simile alla Mini, la Nano una scheda dal fattore di forma ridotto, adatta per essere
utilizzata con breadboard che non richiedono saldature oppure come modulo aggiuntivo
per PCB pi grandi. stata progettata e prodotta da Gravitech. Le sue dimensioni sono
fornite nella Figura 4-9.

Figura 4-9 - Le dimensioni dellArduino Nano.

La Fio
La Fio pensata per applicazioni wireless, principalmente XBee, pertanto le mancano
alcune delle funzionalit di programmazione per mezzo di collegamento diretto delle
quali sono dotati altri tipi di Arduino. Una Fio pu essere programmata utilizzando un
adattatore seriale-USB, oppure via wireless utilizzando un adattatore USB-XBee.
stata progettata e prodotta da SparkFun Electronics; La sue dimensioni sono mostrate
nella Figura 4-10.

Figura 4-10 - Le dimensioni dellArduino Fio.

La Micro
La Micro utilizza un fattore di forma DIP (dual in-line pin) e un processore ATmega32U4,
identico a quello della scheda Leonardo. Come nel caso della Nano, la Micro adatta
per essere utilizzata con la breadboard che non richiede saldature e come modulo
aggiuntivo utilizzando una normale presa IC. stata sviluppata in collaborazione con
Adafruit. Le dimensioni della Micro sono mostrate nella Figura 4-11.

Figura 4-11 - Le dimensioni dellArduino Micro.

I tipi di PCB per scopi speciali


Le schede Arduino non devono necessariamente presentare semplici forme rettangolari.
La LilyPad un piccolo disco con i punti di connessione organizzati intorno ai bordi e
pu essere integrata nei tessuti per costruire creazioni da indossare. Fisicamente, la
Esplora configurata come un normale game controller, anche se in realt si tratta di un
Arduino che si pu programmare in modo che faccia molto pi che semplicemente
permettere di giocare.

La LilyPad
La LilyPad e le sue variazioni sono pensate per applicazioni da indossare. La scheda in
s misura circa 2 pollici (50 mm) di diametro, come mostra la Figura 4-12.

Figura 4-12 - Le dimensioni dellArduino LilyPad.

La Esplora
La Esplora mette a disposizione quattro pulsanti a pressione, un joystick tipo interruttore
e un connettore USB micro. Quattro fori di montaggio sono disponibili per fissare la
scheda a uno chassis o a un pannello. Le dimensioni della PCB Esplora sono mostrate
nella Figura 4-13.
Figura 4-13 - Le dimensioni dellArduino Esplora.

Le configurazioni del pinout di Arduino


Quando si crea una scheda shield per Arduino, la convenzione seguire il layout dei pin
di base descritto qui. Questa configurazione si trova sulle schede standard Arduino di
base costruite tra il 2007 e il 2012. Anche le schede che utilizzano il layout dei pin
esteso, pi recente (la Uno R3 e la Leonardo), oltre alle schede Mega, supportano le
connessioni di base, ma vi aggiungono ulteriori capacit estendendo le righe di terminali
sui lati delle PCB.

Il layout dei pin dellArduino di base


Il layout dei pin dellArduino di base che esiste oggi apparso con il modello Diecimila.
Nel corso degli anni, diventato de facto lo standard sul quale si basano diverse
schede. Le schede Arduino che utilizzano il layout di base dei pin sono elencate nella
Tabella 4-2.
Tabella 4-2 - Le schede Arduino con il layout di base.

Nome della scheda Anno Microcontroller


Diecimila 2007 ATmega168
Duemilanove 2008 ATmega168/ATmega328
Uno (R2 e SMD) 2010 ATmega328P

La Figura 4-14 mostra il pinout di una scheda Arduino di base, che include i modelli
Diecimila, Duemilanove, Uno R2 e Uno SMD. Le caselle grigie nella Figura 4-14 indicano
il numero del pin del chip e le assegnazioni delle porte nei componenti ATmega168/328.
Figura 4-14 - Le funzioni dei delle schede Arduino standard.

Il layout dei pin comune degli I/O e dellalimentazione su Arduino consiste di 14 pin I/O
digitali e discreti, un riferimento analogico, 3 pin per la messa a terra, 6 pin per gli
ingressi analogici, i pin per 3,3 V e 5 V e una linea di reset. Come mostra la Figura 4-
14, questi pin sono disposti come connettori a otto posizioni e due connettori a sei
posizioni sui lati della PCB.
Dal punto di vista della programmazione, sulla PCB Diecimila, Duemilanove, Uno R2,
oppure Uno SMD il pin di ciascuna interfaccia ha un nome predefinito, che si utilizza per
identificarlo nel software. Questi nomi sono rivelati dalle etichette stampate sulla PCB
Arduino. La Tabella 4-3 elenca le assegnazioni dei pin delle schede Arduino di base o
R2 con MCU ATmega168 o ATmega328. Vedere le assegnazioni dei pin per lArduino
Ethernet (Tabella 4-3) per la scheda Uno SMD.
Tabella 4-3 - Le assegnazioni dei pin sullArduino ATmega168/328.

Pin digitale Pin analogico Pin Porta Funzione/i


PWM AVR
(Dn) (An) AVR AVR AVR
0 2 PD0 RxD
1 3 PD1 TxD
2 4 PD2 INT0
3 5 PD3 INT1, OC2B S
4 6 PD4 T0, XCK
5 11 PD5 T1 S
6 12 PD6 AIN0 S
7 13 PD7 AIN1
8 14 PB0 CLK0, ICP1
9 15 PB1 OC1A S
10 16 PB2 OC1B, SS S
11 17 PB3 OC2A, MOSI S
12 18 PB4 MISO
13 19 PB5 SCK
14 0 23 PC0
15 1 24 PC1
16 2 25 PC2
17 3 26 PC3
18 4 27 PC4 SDA
19 5 28 PC5 SCL

Il layout dei pin esteso di base


A partire dalla versione R3 della Uno, sulla PCB Arduino sono apparsi altri quattro pin.
Due di questi si trovano accanto al pulsante di reset, che ha cambiato posizione, e
mettono a disposizione ulteriori connessioni per I2C (le linee SCL e SDA). Gli altri due
sono apparsi accanto alla connessione di reset sul lato opposto della scheda. Uno
pensato come IOREF (la tensione I/O nominale, che pu essere 3,3 V oppure 5 V a
seconda del tipo di scheda) e laltro per adesso non collegato. La Tabella 4-4 elenca
le schede di base con il layout esteso.
Tabella 4-4 - Le schede Arduino con il layout esteso.

Nome della scheda Anno Microcontroller


Uno R3 2010 ATmega328
Ethernet 2011 ATmega328
Leonardo 2012 ATmega32U4

La Uno R3
Come la Uno R2 e la Uno SMD, per gestire le comunicazioni USB la Uno R3 utilizza un
secondo microcontroller. LArduino Ethernet non dispone di USB integrata. La Figura 4-
15 mostra il diagramma a blocchi delle schede Uno R3 e Uno SMD.
Figura 4-15 - Linterfaccia USB dellATmega16U2.

Le funzioni dei pin della Uno R3 sono mostrate nella Figura 4-16.
Figura 4-16 - Le funzioni dei pin della Uno R3.

Le schede Arduino estese di base (R3) con MCU ATmega328 presentano le stesse
assegnazioni dei pin mostrate nella Tabella 4-3, ma con gli ulteriori pin per ADC4 e
ADC5 (A4 e A5). Le funzioni dei pin sulla Leonardo sono definite in La Leonardo a
pagina 84.

La Ethernet
La Ethernet si discosta dalle convenzioni di Arduino viste fino alla Uno R3, con la sua
inclusione di uninterfaccia Ethernet da 100Mb e di un connettore RJ45. priva di
interfaccia USB. La MCU una versione a montaggio superficiale dellATmega328, con
funzioni dei pin e numerazioni diverse rispetto allATmega328. Per linterfaccia Ethernet
si utilizza un chip WIZnet W5100. La Figura 4-17 mostra un diagramma a blocchi della
scheda Ethernet.
Figura 4-17 - Il diagramma a blocchi dellArduino Ethernet.

Per programmare la Ethernet si utilizza uninterfaccia di tipo FTDI con un adattatore,


come i dispositivi FTDI di SparkFun oppure di Adafruit. Questa interfaccia presenta un
header da sei pin ad angolo retto sul bordo della PCB, accanto al lettore microSD. La
Figura 4-18 mostra i pinout della scheda Ethernet.
Figura 4-18 - Le funzioni dei pin sulla scheda Arduino Ethernet.

Questo prodotto stato ritirato da Arduino.cc, ma si trova ancora presso diversi


fornitori. La connettivit Ethernet pu essere ottenuta utilizzando una shield Ethernet
(trovate maggiori dettagli sulle shield nel Capitolo 8).
La Tabella 4-5 elenca le assegnazioni dei pin per lArduino Ethernet. Notate che i pin 10,
11, 12 e 13 sono riservati per linterfaccia Ethernet e non sono disponibili per essere
utilizzati per scopi generali.
Tabella 4-5 - Le assegnazioni dei pin dellArduino Ethernet.

Pin digitale Pin analogico Pin Porta Funzione/i


PWM AVR
(Dn) (An) AVR AVR AVR
0 30 PD0 RxD
1 31 PD1 TxD
2 32 PD2 INT0
3 1 PD3 INT1, OC2B S
4 2 PD4 T0, XCK
5 9 PD5 T1, OC0B S
6 10 PD6 AIN0, OC0A S
7 11 PD7 AIN1
8 12 PB0 CLK0, ICP1
9 13 PB1 OC1A S
10 14 PB2 OC1B, SS S
11 15 PB3 OC2A, MOSI S
12 16 PB4 MISO
13 17 PB5 SCK
14 0 23 PC0
15 1 24 PC1
16 2 25 PC2
17 3 26 PC3
18 4 27 PC4 SDA
19 5 28 PC5 SCL

La Leonardo
La Leonardo ha introdotto il processore ATmega32U4, che contiene uninterfaccia USB
integrata e funzionalit migliorate. Questo ha semplificato il layout della PCB, come
potete osservare nella Figura 4-19. Inoltre, notate che la Leonardo utilizza un connettore
mini-USB anzich quello di tipo B e dimensione normale che si trova sulle schede
Arduino precedenti. Si trattava di una modifica piuttosto necessaria, che permette alla
Leonardo di lavorare con shield che avrebbero interferito con il connettore USB di tipo B
sui modelli pi vecchi. La Uno R3 e la Leonardo utilizzano entrambi lo stesso layout di
pin della PCB, ma alcune delle funzioni del microcontroller sono differenti. NellIDE di
Arduino, questo si gestisce utilizzando una serie di definizioni specifiche per ciascun tipo
di scheda, per mappare funzioni su determinati pin.
Figura 4-19 - Le funzioni dei pin sulla scheda Arduino Leonardo.

La Tabella 4-6 elenca le assegnazioni dei pin per un Arduino esteso o R3 con MCU
ATmega32U4.
Tabella 4-6 - Le assegnazioni dei pin dellArduino ATmega32U4.

Pin digitale Pin analogico Pin Porta Funzione/i


PWM AVR
(Dn) (An) AVR AVR AVR
0 20 PD2 INT3, RxD1
1 21 PD3 INT2, TxD1
2 19 PD1 INT1, SDA
INT0, OC0B,
3 18 PD0 S
SCL
4 25 PD4 ICP1, ADC8
5 31 PC6 OC3A, OC4A S
OC4D,
6 27 PD7 S
ADC10, T0
7 1 PE6 INT6, AIN0
8 28 PB4 ADC11
OC1A,
9 29 PB5 ADC12, S
*OC4B
OC1B,
10 30 PB6 S
ADC13, OC4B
11 12 PB7 OC0A S
*OC4D, ADC9,
12 26 PD6 S
T1
13 32 PC7 OC4A, ICP3 S
14 0 36 PF7 TDI
15 1 37 PF6 TDO
16 2 38 PF5 TMS
17 3 39 PF4 TCK
18 4 40 PF1
19 5 41 PF0

Il layout dei pin sulla serie Mega


Anche la serie Mega (che utilizza i processori ATmega1280 e ATmega2560) incorpora il
modello di pinout standard, ma include altri pin per accogliere le ulteriori capacit I/O
estese dei processori pi grandi. Il layout dei pin della serie Mega mostrato nella
Figura 4-20. Le schede che utilizzano questo layout sono elencate nella Tabella 4-7. Con
le schede Mega si possono utilizzare la maggior parte delle shield pi comuni.
Figura 4-20 - Le funzioni dei pin sulle schede della serie Arduino Mega.

Tabella 4-7 - Il layout dei pin delle schede Mega.

Nome della scheda Anno Microcontroller


Mega 2009 ATmega1280
Mega2560 2010 ATmega2560
Mega ADK 2011 ATmega2560

NOTA Nella Figura 4-20, le funzioni PCINT dei pin non sono mostrate per rendere limmagine pi chiara. Notate anche
che la versione R3 della Mega2560 contiene pin che non si trovano sulle versioni precedenti, ma che non interferiscono
con le shield con un layout di base.

I layout non standard


In termini di configurazioni dei pin non standard (non standard nel senso che sono
fisicamente incompatibili con le shield Arduino convenzionali), la pi radicale la LilyPad,
con il suo fattore di forma circolare e per il fatto che per le connessioni utilizza piazzole
di saldatura. Le schede con un fattore di forma ridotto come la Nano, la Mini, la Mini Pro
e la Micro hanno i pin saldati sul lato posteriore della scheda e sono adatte per essere
utilizzate con una breadboard che non richiede saldature, oppure come componenti su
una PCB pi grande. La Fio utilizza piazzole di saldatura con una spaziatura compatibile
con le pin strip standard e la Esplora ha un fattore di forma di tipo game controller.
Nessuna delle schede con layout non standard pu essere utilizzata direttamente con
una shield standard. Le schede che ricadono in questa categoria sono elencate nella
Tabella 4-8 e le funzioni dei pin relative a queste schede sono mostrate nelle Figure
dalla 4-21 alla 4-27 nei prossimi paragrafi.
Tabella 4-8 - Le schede con il layout del pin non standard.

Nome della scheda Anno Microcontroller


LilyPad 2007 ATmega168V/ATmega328V
Nano 2008 ATmega328/ATmega168
Mini 2008 ATmega168
Pro Mini 2008 ATmega328
Fio 2010 ATmega328P
Esplora 2012 ATmega32U4
Micro 2012 ATmega32U4

La LilyPad
Figura 4-21 - Le funzioni dei pin sullArduino LilyPad.

La Nano
Figura 4-22 - Le funzioni dei pin sulla Nano.

La Mini
Figura 4-23 - Le funzioni dei pin sulla Mini.

La Pro Mini
Figura 4-24 - Le funzioni dei pin sulla Pro Mini.

La Fio
Figura 4-25 - Le funzioni dei pin sulla Fio.

La Esplora
Figura 4-26 - Le funzioni dei pin sulla Esplora.

La Micro
Figura 4-27 - Le funzioni dei pin sulla Micro.

Per ulteriori informazioni


Il sito web di Atmel (http://www.atmel.com/avr) mette a vostra disposizione una
selezione di schede tecniche, software di esempio e altre sorgenti per lavorare con i
microcontroller AVR. Notate che questi materiali sono relativi ad AVR, non ad Arduino.
Trovate ulteriori informazioni sulle varie schede Arduino sul sito web di Arduino
(http://www.arduino.cc).
5

Programmare Arduino e i
microcontroller AVR

Questo capitolo un ambizioso tour di alto livello degli strumenti, dei concetti e delle
tecniche che si possono utilizzare per creare, compilare, assemblare e caricare
software su Arduino. Qui troverete molti concetti profondi trattati a grandi linee e
sarebbe impossibile rendere giustizia anche solo a uno di loro nello spazio di un unico
capitolo. Lobiettivo offrirvi informazioni sufficienti perch possiate cominciare a fare
esperienza con i microcontroller e magari scoprire qualcosa sullambiente di Arduino che
non sapevate prima.

NOTA Questo capitolo non descrive i linguaggi C o C++. Questi argomenti sono trattati in grande dettaglio altrove
(trovate alcuni libri suggeriti nellAppendice D). Qui lintento impartire una comprensione di come i contenuti di un
programma o di uno sketch vengono convertiti in codici binari che la MCU AVR, su una scheda Arduino o ovunque si
trovi, possa eseguire e che cosa necessario per farlo succedere.

Questo capitolo inizia con una breve panoramica del cross-compiling (compilazione
incrociata), la tecnica di utilizzo di un compilatore e altri strumenti su un sistema
informatico per creare programmi eseguibili che possano essere trasferiti su un altro
computer, magari con unarchitettura completamente differente. Questo esattamente
quello che lambiente di sviluppo integrato di Arduino stato progettato per fare. Il
Capitolo 6 mostrer in modo pi dettagliato gli strumenti di sviluppo e le tecniche di
basso livello che utilizza lIDE di Arduino, mentre qui ci concentreremo su che cosa pu
fare lIDE di Arduino e come lo si pu utilizzare in modo efficace.
Quindi presenteremo i bootloader, mettendo laccento sui microcontroller AVR. Il
bootloader una funzionalit essenziale della famiglia di componenti AVR utilizzata sulle
schede Arduino e capire come funziona pu aiutare a ridurre la frustrazione e gettare le
basi per costruire il proprio bootloader per i casi di necessit. Nel Capitolo 6 vedremo i
metodi per installare un nuovo bootloader, magari progettato da voi.
Quindi presenteremo lIDE di Arduino, spiegando come si installa su vari computer host
e come lo si configura per le proprie preferenze. Vedremo anche rapidamente che cosa
succede dietro le quinte dellIDE e come si sviluppato a partire da strumenti
precedenti. Un rapido sguardo a un programma semplice illustra i punti chiave nella
creazione di un programma Arduino, noto come sketch.
Il capitolo procede con una panoramica del codice sorgente di Arduino e mostra dove
potete trovarne una copia da esaminare. Avere a disposizione il codice sorgente, sia
per le librerie fornite che per lIDE e i suoi componenti, pu aiutare a rispondere a
domande come perch quello che accaduto accaduto cos e a determinare se
volete veramente provare un approccio alternativo per programmare Arduino.
NOTA Ricordate che, dal momento che in questo libro laccento posto principalmente sullhardware di Arduino e sui
relativi moduli, sensori e componenti, il software mostrato serve soltanto a sottolineare i punti chiave e non a presentare
esempi completi pronti per essere eseguiti. I codici completi dei software degli esempi e dei progetti si trovano su
GitHub (https://www.github.com/ardnut).

Il cross-compiling dei microcontroller


Come nel caso della maggior parte di sistemi di microcontroller a scheda singola, i
programmi per Arduino e la sua MCU AVR si sviluppano su un altro sistema di un
qualche tipo (Windows, Linux, oppure Mac) e poi si trasferiscono, o caricano, sul
microcontroller AVR della scheda Arduino. Il sistema di sviluppo viene detto host di
sviluppo e Arduino e gli altri dispositivi basati su MCU vengono detti target. Questo tipo
di processo di sviluppo esiste da parecchio tempo e viene utilizzato ogni volta che
necessario creare software per una macchina di destinazione che in s non ha la
capacit di compilare il codice.
La tecnica di creazione del software per un tipo di processore su un tipo di sistema
diverso viene detta cross-compiling ed davvero lunico modo di creare software
compilato per microcontroller. I microcontroller piccoli come lAVR (o qualsiasi
dispositivo piccolo da 8 bit) semplicemente non dispongono delle risorse per compilare
e collegarsi a qualcosa come un programma C o C++. Quindi, per compilare e
collegarsi si utilizza una macchina pi capace con risorse come una CPU veloce, dischi
con grande capacit e moltissima memoria e quindi il programma completo viene
trasferito sul target sul quale deve essere eseguito.
In alcuni casi, il sistema host pu perfino disporre di un emulatore del target che gli
permetta di caricare e testare i programmi in un ambiente simulato. Un emulatore
potrebbe non fornire una simulazione perfetta al 100% dellMCU target e del suo
ambiente vero e proprio, ma comunque pu rivelarsi uno strumento utile per verificare la
funzionalit di base del software prima di caricarlo sulla MCU reale. Esistono diversi
emulatori di AVR per il sistema operativo Linux, tra i quali simavr e lo GNU AVR
Simulator (nellAppendice E trovate un elenco di strumenti software per Arduino e AVR,
con i relativi link).

Oggetti, immagini e codice sorgente


Avrete notato che quando si parla di compilare, collegare e caricare software spesso si utilizzano i termini
oggetto, immagine, eseguibile e codice sorgente. Questi sono tutti termini molto vecchi, che risalgono
allepoca delle schede perforate, delle memorie a tamburo, dei nastri magnetici e dei computer che occupavano
intere stanze.
Codice sorgente, come potete intuire, si riferisce allinput che si fornisce a un compilatore o a un assembler. Il
codice sorgente pu essere letto dagli esseri umani e creato utilizzando un editor di testo di qualche tipo. Nel
caso di Arduino di solito questo significa C o C++, creato utilizzando lIDE di Arduino o qualche altro editor o IDE.
Loutput del compilatore o dellassembler viene detto codice oggetto e in realt non altro che codice macchina
per una determinata CPU. In altre parole, formato dai valori binari degli operation code della CPU e degli
eventuali dati associati nella forma di cosiddetti di valori letterali, anchessi in forma binaria. Questo
generalmente viene detto linguaggio macchina. Nel caso dei compilatori e degli assembler moderni, questo
quello che si trova allinterno dei file *.o e *.obj dopo il completamento dellassemblaggio o della compilazione.
Il codice oggetto pu essere non immediatamente eseguibile. Se un programma formato da due o pi moduli,
oppure richiede del codice oggetto proveniente da una libreria esterna, loutput del compilatore o dellassembler
conterr segnaposti che si riferiscono al software esterno.
In alcuni casi il codice esterno pu trovarsi nella forma di codice sorgente (come nel caso della maggior parte
del codice fornito da Arduino) e verr compilato contemporaneamente allo sketch, oppure potrebbe essere gi
compilato in una libreria di oggetti che contenga uno o pi moduli di codice separati. Le librerie di oggetti
precompilate di solito hanno estensione *.a.
Per riempire i vuoti e collegare le varie parti in unimmagine eseguibile si utilizza uno strumento detto linker. Nel
caso dei programmi di Arduino, di solito questo implica linclusione del supporto del runtime nella forma della
funzione main() e delle funzioni della libreria di runtime AVR di base per linput/output e altre operazioni di basso
livello.
Il risultato finale unimmagine eseguibile con tutto quello di cui ha bisogno il programma per girare, tutto in un
unico pacchetto. Dopo la conversione in un file ASCII formato da stringhe di caratteri esadecimali, viene caricata
nella MCU AVR, riconvertita in binario e salvata nella memoria flash integrata nella scheda per essere eseguita.

I bootloader
Passare un programma in un microcontroller moderno pu comportare uno di diversi
metodi, ma il pi facile lasciare che sia la MCU ad assistere nel processo. Questo si
ottiene con un piccolo bit di firmware precaricato detto bootloader (trovate una breve
descrizione del firmware nel riquadro Le origini del firmware a pagina 96).
Nella memoria flash integrata sulla scheda, la famiglia di microcontroller AVR riserva uno
spazio per il bootloader. Una volta che la MCU stata configurata in modo che utilizzi il
bootloader, lindirizzo di questo spazio di memoria speciale il primo posto dove la MCU
AVR cercher le istruzioni quando viene accesa (o riavviata). Finch il bootloader non
viene sovrascritto con un programma caricato, persiste nella memoria tra i vari cicli di
accensione e spegnimento.
Riservare una pozione per il bootloader in genere richiede lattivazione di un interruttore
interno, o fuse, con un dispositivo di programmazione speciale che comunica con la
MCU per mezzo di uninterfaccia ICSP o JTAG. La MCU esamina la configurazione del
fuse (bit di configurazione non volatile) allavvio per determinare come organizzata la
memoria flash e se c dello spazio riservato per qualche tipo di bootloader o di altro
codice di avvio (trovate maggiori dettagli sui fuse bit utilizzati nellAVR in I fuse bit a
pagina 62).
Una funzionalit chiave dei dispositivi AVR la loro capacit di caricare il codice dei
programmi nella loro memoria flash interna per mezzo di un bootloader e di
uninterfaccia seriale. Nel caso dellATmega32U4 (descritto nei Capitoli 2 e 3), per
caricare il codice del programma nella MCU pu essere utilizzata linterfaccia USB,
senza bisogno di speciali dispositivi di programmazione o di MCU ausiliarie.
Le schede Arduino (sia i prodotti ufficiali che le schede compatibili con il software)
hanno gi precaricato un bootloader di tipo Arduino nella MCU. Il bootloader di Arduino
implementa un protocollo specifico che gli permette di riconoscere lIDE di Arduino e di
eseguire il trasferimento dei dati di un programma dallhost di sviluppo alla scheda
target. Il bootloader di Arduino descritto nel dettaglio in Lazione del bootloader a
pagina 157 e alcune tecniche per sostituire il bootloader con uno di vostra scelta sono
spiegate in Sostituire il bootloader a pagina 159.

Le origini del firmware


Il termine firmware risale ai tempi nei quali i computer presentavano precaricati programmi che non potevano
essere modificati sul campo. In alcuni casi, un microcontroller o un microprocessore poteva essere prodotto
con software gi incorporato nel suo chip di silicio. Lo sviluppatore forniva al produttore del chip il codice
macchina binario, che quindi veniva incorporato nel processo di creazione del chip di silicio vero e proprio.
Questa veniva detta mask programming e, per quanto permettesse di produrre componenti a basso prezzo (se
venivano acquistati in quantit sufficientemente grandi), non era il modo pi pratico di sviluppare software.
Generalmente richiedeva una certa quantit di attrezzature di supporto per lo sviluppo, oltre a versioni speciali
del microcontroller target. In alcuni casi, questo significava utilizzare un ICE (in-circuit emulator), che
essenzialmente era lequivalente funzionale del processore target, implementato utilizzando IC logici e discreti
contenuti in una scatola metallica con un cavo a nastro da inserire nella presa dove il processore alla fine
doveva essere collocato sul circuito. Una volta che il codice funzionava correttamente ed era stato
accuratamente testato, poteva essere implementato sul chip con un certo grado di sicurezza, cio, dando per
scontato che lICE rappresentasse una simulazione accurata del microprocessore o del microcontroller vero e
proprio. Nel caso di alcune delle prime versioni degli strumenti, questo non accadeva sempre.
In altri casi, il firmware poteva essere caricato su un chip utilizzando un dispositivo di programmazione one-shot
simile a quello utilizzato per programmare una chip di memoria ROM (read-only memory). In effetti, questi
dispositivi di programmazione di solito potevano gestire sia dispositivi ROM che MCU. Il programma veniva
salvato sul chip nella forma di bit di memoria che potevano essere impostati soltanto una volta per rappresentare
valori pari a uno oppure a zero. Questi erano noti come componenti OTP, (one-time programmable). Un
componente one-time programmable serviva soltanto a questo: una volta che veniva programmato restava cos.
Se le quantit di produzione di chip previste non riuscivano a giustificare lo sviluppo e i costi di configurazione di
questo approccio, lOTP rappresentava unalternativa ragionevole. In ambienti di produzione piccoli, non era raro
utilizzare dispositivi detti gang programmer con speciali file di socket per programmare diversi processori OTP
contemporaneamente.
Tuttavia, lOTP richiedeva comunque moltissimo sviluppo up-front e molti test da eseguire con strumenti
speciali. Anche se caricare su un OTP un firmware pieno di bug dal punto di vista economico non era disastroso
come ordinare una produzione di 10.000 componenti difettosi, non era comunque una buona notizia quando i
componenti OTP finivano nella spazzatura, a causa di un piccolo errore nel codice.
Man mano che la tecnologia avanzava, i dispositivi pi recenti hanno cominciato a incorporare UV-EPROM (UV-
erasable programmable read-only memory, che di solito si trovava nei componenti in un package DIP, o dual in-
line pin, con una finestra di vetro trasparente perch la luce UV toccasse il chip e resettasse i bit di memoria) ed
EEPROM (electrically erasable programmable read-only memory). Entrambi questi tipi di componenti
richiedevano strumenti speciali per cancellare i contenuti della memoria a sola lettura e caricare nuovi dati, ma
caricare del codice sbagliato significava soltanto dover eseguire di nuovo il ciclo cancella-carica-testa-brontola,
anzich buttare il dispositivo nella spazzatura.
Adesso, la maggior parte delle ultime generazioni di microcontroller utilizzano memoria flash, ma si trovano
ancora componenti OTP. Uno dei principali vantaggi offerti dalla memoria flash che a lettura/scrittura: pu
essere scritta cos come letta, mentre il processore attivo. Un altro grande vantaggio che non volatile, che
significa che i contenuti persistono tra un ciclo di alimentazione e laltro. Il concetto di firmware basato sulla
memoria non volatile a sola lettura che richiedeva strumenti speciali per essere modificata sta diventando una
storia del passato, ma qualunque cosa caricata nella memoria flash di un microcontroller viene ancora detta
firmware.

Lambiente IDE di Arduino


Mentre stavo scrivendo questo libro, la versione pi recente dellIDE di Arduino era la
1.6.4. Ha un aspetto simile su tutte le piattaforme. La Figura 5-1 mostra la schermata
iniziale che appare quando si lancia lIDE.

Figura 5-1 - La schermata principale dellIDE di Arduino.

Lultima versione dellIDE incorpora alcune correzioni e alcuni aggiornamenti ad alcuni


dei menu, aggiunge uninterfaccia a linea di comando per gestire schede e librerie e
risolve alcuni problemi evidenti del codice. stato aggiunto il supporto della nuova
scheda Gemma e anche quello di schede non Arduino (cio, non ufficiali), permettendo
di inserire un URL che consenta allIDE di ricavare informazioni su una scheda dal sito
web del suo distributore e integrarle nel gestore di schede dellIDE.
Se possedete una scheda Arduino pi vecchia (come per esempio una Diecimila, una
Duemilanove, oppure una Uno), non disporre dellultima versione dellIDE in realt non
rappresenta un grande problema. La maggior parte della gente che utilizza una versione
pi vecchi dellIDE con un tipo pi vecchio di scheda Arduino probabilmente non noter
nemmeno che non dispone delle ultime modifiche. Se il vostro caso, a meno che non
prevediate di lavorare con una di queste schede Arduino pi nuove (come la Yn, la
Zero o la Gemma), probabilmente potete evitare di procurarvi lultima versione dellIDE,
almeno per adesso.

Installare lIDE di Arduino


La procedura per installare lIDE e le librerie di Arduino varia e pu rivelarsi
estremamente semplice o piuttosto impegnativa, a seconda della vostra piattaforma e di
quanta fatica volete fare. Per quasi tutti gli utenti Linux, lapproccio pi facile scaricare
un pacchetto di installazione per mezzo del gestore di pacchetti e lasciare che questo si
occupi anche di installare i pacchetti di supporto necessari.
Lo svantaggio, in questo caso, che quello che disponibile in un repository di
pacchetti pu non essere lultima versione disponibile. Il sito web principale
(http://arduino.cc/) di Arduino mette a disposizione sempre lultima versione, ma
raccogliere tutte le parti necessarie, riunirle ed eseguirle su Linux pu richiedere diversi
passaggi manuali. In questo senso, le cose su Windows e Mac OS X sono pi facili,
come vedremo nei prossimi paragrafi.
Al termine dellinstallazione, una buona idea prendersi qualche minuto e guardare che
cosa stato installato sul nostro sistema. Nella directory di installazione di Arduino
troveremo il codice sorgente di diversi esempi, risorse ed esempi per le librerie
predefinite, file sadecimali (immagine binaria caricabile) relativi a varie versioni del
bootloader e documentazione nella forma di una serie di pagine HTML, che possono
essere visualizzate con un browser web oppure aperte utilizzando la voce di menu Help
nellIDE.
Su Arduino.cc (http://www.arduino.cc/en/Main/Software) trovate i file da scaricare per i
sistemi host supportati. Basta selezionare quello pi adatto a voi.

Windows
Installare lIDE di Arduino su un sistema Windows semplicissimo. Il pacchetto di
installazione, arduino-1.6.4-windows.exe, si occupa di tutti i dettagli. Se per caso avete
una versione pi vecchia dellIDE gi installata, la elimina automaticamente prima di
installare quella nuova (ma senza cancellare gli sketch esistenti). I file eseguibili e le
librerie di Arduino vengono collocati in Program Files\Arduino. Qui trovate anche gli
esempli. Nella vostra directory home viene creata una cartella di nome Arduino, che
dove saranno salvati tutti gli sketch creati dallutente e le librerie da lui fornite.

Linux
Quasi tutte le distribuzioni Linux forniscono lIDE di Arduino in forme preimpacchettate,
che siano deb, rpm, ymp o altri tipi di pacchetti. Questo il modo migliore di ottenere
lIDE e le librerie in modo rapido e di installarli correttamente su un sistema Linux. Come
abbiamo detto prima, lo svantaggio di questo approccio che chi mantiene i pacchetti
per varie distribuzioni Linux pu non disporre dellultima versione disponibile su
Arduino.cc nel formato di un pacchetto di distribuzione.
Per esempio, lultima versione di Arduino disponibile per Kubuntu la 1.0.4.
Anche se un pacchetto di distribuzione il modo pi facile di ottenere lIDE di Arduino
installato su un sistema Linux, i vari componenti possono essere anche scaricati
direttamente da Arduino.cc e installati manualmente. Nel caso di alcune distribuzioni,
questa pu essere lunica opzione. Trovate maggiori informazioni sulle distribuzioni Linux
supportate sul sito web di Arduino (http://bit.ly/apg-linux).
Linstallazione di un pacchetto su un sistema di tipo Ubuntu (Ubuntu, Kubuntu o qualsiasi
altra distribuzione derivata da Ubuntu) si esegue utilizzando apt-get o uno strumento
simile. Per installare il pacchetto dellIDE, i sistemi OpenSuse utilizzano lo strumento
yast e altri sistemi possono utilizzare rpm o qualche altro gestore di pacchetti. Dopo
linstallazione, i vari esempi, hardware, file delle librerie e strumenti si trovano in
/usr/share/arduino. Sui miei sistemi Kubuntu e Xubuntu, i miei sketch e le mie librerie
personalizzate si trovano in una posizione predefinita nella mia directory home, in una
sottodirectory di nome sketchbook.

Mac OS X
La versione per Mac OS X dellIDE e delle librerie di Arduino viene fornita in un file ZIP
con il nome di arduino-1.6.4-macosx.zip. Secondo il sito web di Arduino, pensata per
la versione 10.7 (Lion) o successivo. Dopo aver decompresso larchivio, si pu copiare
Arduino.app nella posizione pi appropriata nel sistema (una possibilit la cartella
Applicazioni).
Trovate ulteriori informazioni sullinstallazione dellIDE di Arduino su un sistema Mac OS
X nel sito web Arduino.cc (http://www.arduino.cc/en/Guide/MacOSX).

Configurare lIDE di Arduino


possibile configurare lIDE per adattarla alle proprie necessit utilizzando la finestra di
dialogo Preferences, che si trova sotto FilePreferences nel menu principale (sotto
Arduino su un computer Mac). Questa finestra di dialogo permette di specificare la
directory degli sketch, di indicare un editor esterno (se non vi piace quello incluso
nellIDE) e di modificare vari comportamenti dellIDE. La Figura 5-2 mostra la finestra di
dialogo Preferences di una versione pi vecchia dellIDE su un sistema Linux.
Figura 5-2 - La finestra di dialogo delle preferenze dellIDE pi vecchia.

Il file di preferenze, che la finestra di dialogo indica come


/home/jmh/.arduino/preferences.txt nella Figura 5-2, contiene molte pi impostazioni
rispetto a quelle mostrate nella finestra di dialogo. Ma, come siamo soliti ripetere, non si
deve modificare questo file mentre lIDE attivo.
La Figura 5-3 mostra la finestra di dialogo Preferences relativa alla versione 1.6.4
dellIDE. Presenta molte pi opzioni rispetto alla versione pi vecchia, ma comunque
soltanto una versione grafica del file di preferenze.
Figura 5-3 - La finestra di dialogo delle preferenze dellIDE pi recente.

Il file di preferenze un file di dati ASCII KVP (coppia chiave/valore) che contiene le
impostazioni delleditor, la geometria iniziale dellapplicazione (la dimensione della
finestra dellIDE di Arduino), i parametri dellinterfaccia seriale (baud rate, dimensione
dei dati, ecc.) e il browser da utilizzare per vedere i file di aiuto HTML forniti, tra le altre
cose.
Il file di preferenze contiene anche informazioni sullultimo sketch che stato modificato
e sullultima dimensione della finestra dellIDE. Dal momento che viene modificata
dinamicamente dallIDE mentre attivo, dovrebbe essere modificata manualmente
quando lIDE non attivo.
Nella versione pi vecchia dellIDE, questo potrebbe essere lunico modo di modificare
parametri come la dimensione del rientro (quella predefinita sono 2 spazi, ma io
preferisco 4), la dimensione e il tipo di font utilizzati nelleditor (il predefinito
monospaziato con una dimensione pari a 12, ma io di solito lo imposto su 11 per poter
vedere pi codice nella finestra delleditor) e lespansione della tabulazione. Le versioni
pi recenti dellIDE offrono maggiori opzioni nella finestra di dialogo Preferences, ma
comunque potrebbero esserci alcuni dettagli che vorrete regolare nel file preferences.txt
vero e proprio.
Eseguire il cross-compiling con lIDE di Arduino
Quello che rende speciale Arduino, e non soltanto una PCB con un AVR saldato, sono
lIDE di Arduino, il firmware di Arduino, il codice runtime, le librerie software sviluppate
da Arduino.cc e naturalmente i programmi che vi aggiungete voi, gli sviluppatori. LIDE di
Arduino un modo facile e veloce di costruire software per un chip AVR. E lo e perch
nasconde in modo efficace la maggior parte di quello che succede quando il codice
viene compilato, collegato e trasferito sullAVR di destinazione.

NOTA Il linguaggio di programmazione utilizzato dallIDE di Arduino generalmente C++, anche se pu essere anche
C, dal momento che la toolchain AVR-GCC li accetta entrambi. Per questo motivo, troverete C/C++ quando questo
testo si riferisce a entrambi i linguaggi e C o C++ quando parla di un determinato linguaggio.

NellIDE vengono mostrati singoli file di codice sorgente in quelle che sono dette
schede. possibile passare da uno allaltro semplicemente selezionando la relativa
scheda in alto nella finestra delleditor. Quando il codice sorgente viene compilato, lIDE
passa in rassegna ciascuna scheda e crea un file oggetto per ciascuna di esse.
Per costruire il codice delleseguibile binario per un dispositivo AVR, lIDE di Arduino IDE
utilizza il compilatore avr-gcc e i relativi strumenti (che vengono detti toolchain). Le
librerie fornite da Arduino.cc mettono a disposizione funzioni per cose come ritardi di
tempo, output di dati seriali e altre funzioni (vedere Capitolo 7).
A volte, per indicare il fatto che Arduino utilizza un dialetto proprio di C/C++, si utilizza il
termine Arduinese. Ma non corretto. Il linguaggio utilizzato C o C++ vero e proprio,
con alcuni limiti su che cosa pu essere fatto con il codice sorgente C++.
Dovete ricordare che lIDE di Arduino in realt non nientaltro che un wrapper intorno
alla toolchain AVR-GCC (descritta in La toolchain di AVR a pagina 128).
Nello specifico, in avr-libc non presente il supporto degli operatori new e delete di
C++, ma questi vengono forniti dal team di Arduino. Potete trovare le definizioni di
Arduino in /usr/share/arduino/hardware/arduino/cores/arduino/new.h su un sistema
Linux, in C:\Program Files\Arduino\hardware\arduino\avr\cores\arduino su un sistema
Windows e in
/Applicazioni/Arduino.app/Contents/Java/hardware/arduino/avr/cores/arduino su un
sistema Mac.

Istanziare oggetti di classe con new


Lallocazione dinamica della memoria in un sistema integrato di solito non considerata una buona idea.
Generalmente, la memoria allocata dinamicamente viene presa dalla SRAM e la maggior parte delle MCU,
compreso lAVR, non sono dotate di moltissima SRAM. avr-libc supporta malloc(), ma non new. Tuttavia il team
di Arduino hanno pensato che convenisse includerlo e quindi lo ha fatto.
Notate che quando un oggetto di classe viene istanziato nel codice C++ di un AVR non viene creato nello spazio
della SRAM. Gli AVR delle MCU da 8 bit sono processori ad architettura Harvard e non eseguono il codice dalla
SRAM, ma soltanto dallo spazio della memoria flash. Qui la magia che loggetto viene creato durante il
momento della compilazione nella memoria flash e loperatore new restituisce un puntatore alloggetto.
Come mostra lEsempio 5-1, possibile utilizzare new con la versione 1.0.5 o successiva dellIDE in un file
sorgente che contiene variabili globali.

Esempio 5-1 - Istanziare un oggetto globale con new.

Se lcd e ddsdev sono dichiarati come export in un file include corrispondente, come mostra lEsempio 5-2, vi si
pu accedere da qualsiasi altro modulo sorgente che includa il file include globale.

Esempio 5-2 - Dichiarare oggetti globali come esterni.

In alternativa, possibile istanziare gli oggetti nei file sorgente delle variabili globali e poi assegnare
specificamente i puntatori (anche qui pu essere utilizzato lo stesso file include). Questo mostrato
nellEsempio 5-3.

Esempio 5-3 - Assegnare oggetti ai puntatore globali.

Unosservazione interessante da fare che, una volta compilati, gli oggetti che fanno parte di queste
dichiarazioni hanno dimensioni di costruzione diverse, a seconda del metodo che si utilizza. Lapproccio che fa
uso di new produce un oggetto eseguibile che 662 byte pi grande del metodo dellassegnazione del puntatore.
Non molto, a dire la verit, ma quando si dispone di appena 32K di memoria flash con la quale lavorare, ogni
minimo bit conta.
Queste porzioni di codice sono tratte dal codice sorgente del generatore di segnale presentato nel Capitolo 11.

Inoltre, i template C++ non sono disponibili e le eccezioni non sono supportate. Tuttavia
sono supportate le classi, compresi costruttori e distruttori.
Il codice C puro presenta alcuni limiti. Si possono utilizzare perfino malloc() e free(),
con alcune precauzioni (trovate maggiori dettagli e istruzioni sul manuale utente
(http://bit.ly/avr-libc-malloc) di avr-libc). Ma dovete tenere presente che dal punto di
vista tecnico utilizzare lallocazione dinamica della memoria con una MCU integrata
discutibile e pu causare problemi e codice non fluido.
Come dice il saggio: soltanto perch possibile, non significa che si debba per forza
farlo. Per utilizzare la memoria dinamica con un microcontroller con memoria limitata, si
deve avere un motivo molto valido.
Lorigine della confusione sul linguaggio che si utilizza con lIDE di Arduino possono
essere le definizioni delle macro e le funzioni predefinite che lambiente di Arduino utilizza
per semplificare laccesso alle varie funzioni I/O della MCU AVR. Uno sketch di Arduino
pu presentare un nome strano e unestensione di file insolita (.ino) e pu sembrare una
versione ridotta di C, ma questo non intenzionale. Ha perfettamente senso se pensate
qual il pubblico per cui stato pensato Arduino: persone prive di una significativa
esperienza con la programmazione (o addirittura che ne sono prive del tutto). Tuttavia,
la complessit di C e molta di quella di C++ ci sono ancora, se volete utilizzarlo.
Il Capitolo 6 descrive il processo di creazione di un codice eseguibile per Arduino (o per
qualsiasi altra AVR MCU) utilizzando i componenti della toolchain AVR-GCC sottostante,
un editor di testo e makefile.

I microcontroller non sono microprocessori


importante tenere presente che un microcontroller non una CPU a scopo generale. Un tipico microcontroller
un dispositivo indipendente con soltanto una quantit limitata di memoria programma e pochissima RAM, ma
con moltissime funzioni I/O gi integrate. I microcontroller di solito vengono utilizzati per una serie limitata di
operazioni specifiche, come rilevare le pressioni dei tasti su una tastiera, controllare alcuni motori, misurare
temperature, oppure fornire lintelligenza a progetti artistici dinamici, o tutto contemporaneamente. Con la
possibile eccezione dellATmega2560, con la sua capacit di accedere a memoria esterna, un microcontroller
AVR in realt non una piattaforma adatta per un word processor o un videogioco complesso. Detto questo,
utenti intelligenti sono riusciti a utilizzare codice pulito ed efficiente per far fare al microcontroller AVR cose molto
interessanti e complesse.

Limmagine eseguibile di Arduino


Di solito, il software eseguibile di Arduino (limmagine eseguibile descritta prima)
formato da tre componenti principali: lo sketch creato da uno sviluppatore (voi, in questo
caso), le librerie che si utilizzano per accedere alle varie funzioni di un AVR e il codice
runtime che contiene una funzione main() e un ciclo allinterno del quale eseguire il
software dellapplicazione. Se riguardate la Figura 5-1, vedete che lIDE si reso utile
fornendovi un modello minimo che potete riempire con il vostro proprio codice.
Gli strumenti e i componenti software coinvolti nella creazione di codice eseguibile per
un microcontroller AVR possono essere suddivisi in due categorie principali: gli strumenti
di sviluppo e le sorgenti di compilazione runtime sullhost, e il codice binario eseguibile
per il microcontroller AVR sul target. La Figura 5-4 mostra un diagramma a blocchi dei
principali componenti software di Arduino e include il programma fornito dallutente (lo
sketch), per mostrare come il tutto si amalgama in unimmagine binaria eseguibile e
completa.
Figura 5-4 - Lorganizzazione del software di Arduino.

Il processo di creazione del software di Arduino


Quando si utilizza lIDE, nel processo di creazione di Arduino ci sono cinque passaggi
principali:
La preparazione della sorgente
Lo sketch viene modificato leggermente dallIDE, che aggiunge la dichiarazione
#include "WProgram.h" nella versione 1.0 o successiva dellIDE, oppure
"Arduino.h" nelle versioni precedenti dellIDE. Le schede (i file sorgente) che non
hanno unestensione vengono concatenati con lo sketch principale, cosa che produce
un unico file di codice sorgente grande (le schede con le estensioni .c oppure .cpp
vengono compilate separatamente).
LIDE cerca anche di creare prototipi di funzioni per tutte le funzioni che non siano
setup() e loop(), che si trovano nello sketch. Questi vengono collocati allinizio del
file dello sketch, immediatamente dopo eventuali commenti o dichiarazioni del
preprocessore (#include e #define), ma prima di qualsiasi tipo di dichiarazione. In
un normale file sorgente C o C++, questi verrebbero inseriti in un file header .h per
essere inclusi durante la compilazione del codice, ma lIDE di Arduino se ne occupa
automaticamente, creandoli e inserendoli dinamicamente nel file sorgente dello
sketch. Lultima parte della preparazione della sorgente comporta laggiunta dei
contenuti del file main.cxx standard alla fine dello sketch (qui dove viene definito
main()).

La compilazione
Per tradurre il codice sorgente in file binari detti file oggetto, Arduino utilizza la suite
di compilatori AVR-GCC. Questi non sono immediatamente eseguibili, ma per poter
essere trattati dallhardware di Arduino devono essere elaborati da uno strumento
detto linker (come vedremo nel prossimo passaggio). Il compilatore AVR-GCC una
variet del compilatore GCC di base costruito specificamente per essere utilizzato
con la linea di dispositivi AVR di Atmel.
Per via dei limiti imposti dallhardware di destinazione (e in particolare della
memoria), non sono supportate tutte le funzionalit di C++, ma il supporto di C
completo.
Il compilatore accetta una vasta gamma di argomenti a linea di comando, detti anche
switch. LIDE di Arduino si occupa di fornire gli switch corretti al compilatore. Tra le
altre cose, questi comprendono opzioni di ottimizzazione, specificare dove devono
essere collocati i file include standard, opzioni specifiche per il target e livelli di
messaggi di avvertimento.
Il collegamento
Il collegamento il procedimento di connessione di file oggetto e moduli libreria.
Lidea di base riempire i vuoti che si trovavano nei file oggetto dove il codice
sorgente originale si riferiva a un oggetto o a una funzione che si trova in una libreria
o in un oggetto esterni, ma il compilatore non ne trovava lindirizzo durante la
compilazione del codice. Il compito del linker rintracciare i riferimenti mancanti e
scriverli nel file binario eseguibile finale, insieme al codice binario dei dati o delle
funzioni cui si fa riferimento.
La conversione
Il file binario creato dal linker deve essere convertito in quello che viene detto Intel
hex format, che quello che si aspetta di trovare il firmware del bootloader sul
dispositivo AVR. Per far questo si pu utilizzare lutility avr-objcopy, descritta nel
Capitolo 6.
Lupload
Il passaggio finale consiste nel trasferire il file binario eseguibile e completato
sullhardware di Arduino. Per farlo si utilizza un collegamento USB (di solito) e il
firmware del bootloader del microcontroller, insieme a unutility di nome AVRDUDE
(che in realt un acronimo). anche possibile caricare codice eseguibile in un
dispositivo AVR direttamente per mezzo dellinterfaccia ICSP (come quando non c
bootloader) e lIDE di Arduino lo supporta.

Le schede degli sketch


possibile, e in realt molto comodo, dividere uno sketch lungo in moduli di codice
sorgente (cio file) pi piccoli, ciascuno con il suo proprio file include. Quando lIDE
carica uno sketch, cerca ulteriori file nella directory degli sketch. I file ausiliari possono
essere privi di estensione o presentare le estensioni .c, .cpp, oppure .h.
I file con estensione .c o .cpp appaiono in una scheda ma vengono compilati in file
oggetto da collegare con il codice dello sketch principale. I file privi di estensione
vengono inclusi nello sketch. Per poter utilizzare la scheda di un file con estensione .h, vi
si deve fare riferimento per mezzo di una dichiarazione #include utilizzando le virgolette
doppie (non le parentesi quadre).
Se i file ausiliari sono accompagnati dai loro file include, questi devono essere tutti
inclusi nello sketch principale, anche se non fanno riferimento al codice. Lo stesso vale
per i moduli libreria esterni. Se un file ausiliario utilizza una classe che si trova in una
libreria ma lo sketch principale no, devono fare riferimento al file include della libreria.
Una tecnica che a me piace utilizzare quella di inserire tutte le variabili globali
(compresi gli oggetti di classe, come abbiamo detto prima) in un file sorgente separato.
Questo permette a qualsiasi altro modulo che debba accedere alle variabili di farlo.
Inoltre, rende lo sketch principale molto pi facile da leggere, dal momento che
potrebbe ridursi a contenere soltanto le funzioni setup() e loop(). Troverete maggiori
informazioni sugli sketch multifile su arduino.cc (http://bit.ly/arduino-build-process) e nel
Capitolo 11, che descrive un esempio funzionante e creato per il generatore di segnale
DDS (il codice sorgente completo disponibile su Github su https://github.com/ardnut).

Larchitettura software di Arduino


A prescindere da quanto grande o piccolo sia, uno sketch sempre formato da almeno
due funzioni obbligatorie: setup() e loop(). La funzione setup() viene chiamata una
sola volta quando comincia lo sketch. La funzione loop() viene eseguita continuamente
finch non si scollega lalimentazione oppure la scheda Arduino viene resettata. La
funzione loop() viene chiamata ripetutamente dalla funzione main() che viene fornita
automaticamente dallIDE di Arduino. Uno sketch pu contenere anche ulteriori funzioni.
Per esempio, lo sketch del termostato mostrato nel Capitolo 12 contiene diverse
funzioni, oltre alle obbligatorie setup() e loop(). Il codice runtime della funzione
principale descritto in Il supporto del runtime: la funzione main() a pagina 109.
Uno sketch, inoltre, allinizio del file presenta alcune dichiarazioni che definiscono altri file
da includere, le costanti dei pin I/O e altri valori e variabili globali. Potete vedere come
organizzato uno sketch tipico in Uno sketch di esempio a pagina 111. I paragrafi Le
costanti e Le variabili globali a pagina 114 e 115 parlano rispettivamente delle costanti
e delle variabili globali.
Un ciclo main() infinito, a volte detto ciclo di eventi, un modo comune di programmare
i microcontroller. Un piccolo dispositivo come un AVR non carica file di programmi dal
disco e tutti i programmi in esecuzione su di esso sono progettati in modo che eseguano
una determinata funzione (o una serie di funzioni) continuamente. Quindi, utilizzare il
concetto di ciclo principale sempre in corso assume perfettamente senso. Dal momento
che il codice del programma salvato nella memoria flash, pronto per essere
eseguito dopo che viene acceso o resettato Arduino.
Per aiutare a mettere le cose in prospettiva, la Figura 5-5 mostra come la funzione
main() fornita dallIDE di Arduino chiama le funzioni setup() e loop() che si trovano
nello sketch.

Figura 5-5 - La struttura dei programmi di Arduino.

Nella Figura 5-5, viene istanziato (cio, inizializzato) loggetto di classe di una libreria
esterna che non si trova n in setup() n in loop(), in modo che possa rimanere a
disposizione di tutte le funzioni dello sketch. Oltre a setup(), loop() e a eventuali altre
funzioni dello sketch principale, possono esserci anche delle funzioni in altri file e i file
addizionali di codice sorgente inclusi nello sketch vengono gestiti dallIDE di Arduino
nella forma di schede.
Notate che la scheda non una libreria vera e propria, ma nientaltro che ulteriore
codice sorgente dello sketch conservato in un file separato. Il codice utilizzato in una
scheda pu essere riutilizzato in altri sketch, ma, a differenza che nel caso delle librerie
vere e proprie, necessario specificare manualmente la scheda quando viene creato lo
sketch, perch limitarsi a fornire una direttiva include nel file sorgente dello sketch
principale non sufficiente. Per aggiungere codice in uno sketch nella forma di una
scheda, si deve utilizzare SketchAdd File nella barra dei menu dellIDE. Il file sorgente
della scheda non deve per forza risiedere nella stessa directory del file dello sketch
principale.
Le librerie esterne vengono integrate con limmagine eseguibile finale dopo la
compilazione del codice dello sketch e di tutti i file delle schede. LIDE di Arduino genera
quindi le opzioni corrette del linker in base alle dichiarazioni include che si trovano
allinizio dello sketch. Trovate maggiori informazioni su come si incorporano le librerie
negli sketch in Utilizzare le librerie negli sketch a pagina 116.

Il supporto del runtime: la funzione main()


I compilatori che si utilizzano sui sistemi Linux, Windows e Mac OS X forniscono una
libreria di funzioni specifica per la piattaforma detta libreria di runtime. Su un sistema
basato su GCC, questa di solito si chiama libgcc.a o libgcc_s.so.1 e su Windows le
librerie di runtime di solito hanno nomi come MSVCRT.DLL per C e MSVCPP.DLL per
C++. La versione AVR avr-libc, descritta nel Capitolo 6. La libreria di runtime contiene
funzioni di uso comune specifiche per una determinata piattaforma. Queste possono
essere operazioni matematiche, funzioni I/O di basso livello, timer di sistema, supporto
di printf() e cos via.
Anche Arduino ha il suo ulteriore modulo di supporto del runtime, ma con una peculiarit.
In s, lo sketch di un programma non fa molto. Non ha nessuna funzione main() che lo
faccia cominciare e nessun modo di essere eseguito continuamente una volta che parte.
Il supporto del runtime di Arduino include la funzione main() necessaria, insieme ad altre
funzioni di configurazione. Come potete vedere nellEsempio 5-4, in realt molto
semplice e si tratta di un design tipico per i microcontroller piccoli.

Esempio 5-4 - La funzione main() di Arduino.


Le chiamate a init(), initVariant() e (se applicabile) USBDevice.attach() sono
determinate al momento della compilazione in base al tipo di hardware Arduino di
destinazione selezionato nellIDE. Questo comprende i componenti principali del codice
di supporto del runtime specifico per ciascun tipo di scheda Arduino. In un realtime
operating system (RTOS) pi grande, questo potrebbe fare parte del BSP (board
support package) fornito dal rivenditore del RTOS o creato da uno sviluppatore. Ecco la
descrizione delle funzioni:
init()

Questa funzione, che si trova in


Arduino/hardware/arduino/avr/cores/arduino/wiring.c, inizializza vari componenti
periferici dellAVR come timer, prescaling di timer/contatore, prescaling del
convertitore A/D e modalit di output PWM in base al componente AVR utilizzato con
una determinata scheda Arduino.
initVariant()

Questa fornisce un gancio nella forma di una cosiddetta dichiarazione di funzione


debole. Generalmente si utilizza per fornire ulteriore inizializzazione del runtime per
hardware non incluso nelle definizioni e nel codice forniti in un ambiente di sviluppo
Arduino standard.
USBDevice.attach()

Fa riferimento al metodo attach() della classe USBDevice che si trova in


Arduino/hardware/arduino/avr/cores/arduino/USBCore.cpp. Questa classe fornisce
la funzionalit necessaria per comunicare con uninterfaccia USB.
Per molti, quello che in realt fanno queste funzioni di inizializzazione irrilevante.
Tuttavia, se davvero volete capire che cosa fa lIDE di Arduino e come lo fa, vale la
pena analizzare il codice sorgente di queste funzioni di supporto. Come si ottiene il
codice sorgente descritto in Il codice sorgente di Arduino a pagina 123.
Come abbiamo spiegato in precedenza, le funzioni setup() e loop() sono fornite dal
programmatore nello sketch del programma. La funzione setup() in genere si utilizza
per definire determinate porte I/O e stati di partenza, inizializzare alcune parti delle
funzioni periferiche dellAVR, oppure eseguire altre operazioni una sola volta.
ampiamente opzionale e pu perfino trattarsi di una funzione vuota, ma deve per forza
esistere nello sketch, altrimenti il linker genera un messaggio di errore.
La funzione loop() dove avviene lattivit principale nello sketch di un programma.
Come si pu notare, viene chiamata ripetutamente finch non si toglie lalimentazione
alla scheda Arduino. Durante lesecuzione di loop(), possono verificarsi degli interrupt,
come in realt accade, e alcune applicazioni possono incorporare linterrupt di un timer o
un ritardo per fare in modo che loop() si ripeta in un modo definito (anzich
liberamente).

Uno sketch di esempio


Come abbiamo gi visto, lo sketch di base di un programma di Arduino formato da
due parti: la funzione setup() e la funzione loop(). Dal momento che la funzione main()
fornita dallIDE, quando lavoriamo su sketch semplici non ce ne dobbiamo
preoccupare.
Il semplice sketch dellEsempio 5-5 controlla diversi input e produce un output se
qualcuno degli input cambia da low a high. Potrebbe essere la base per un semplice
antifurto.

Esempio 5-5 - Semplice allarme anti intrusione.


La Figura 5-6 mostra come Arduino pu essere collegato a interruttori esterni di porte e
finestre. Il motivo per cui gli interruttori sono collegati in serie e per cui unestremit della
catena collegata alla messa a terra semplice: se uno dei fili che collegano gli
interruttori del sensore viene tagliato, salta lallarme.

Figura 5-6 - Un semplice allarme anti intrusione costruito con Arduino.


In unapplicazione come questa, gli interruttori dei sensori possono essere pistoncini del
telaio di una finestra, rel reed azionati magneticamente, interruttori a levetta su porte
scorrevoli o perfino un modulo sensore come un rilevatore di suono. Lannunciatore pu
essere qualsiasi cosa, da un cicalino piezo da 50 centesimi, a un rel che controlli una
sirena o perfino un telefono autodialer. Per maggiori informazioni sui sensori compatibili
con Arduino, vi rimandiamo al Capitolo 9. Il design design di base pu essere esteso in
un numero qualsiasi di direzioni interessanti, fino alla creazione di un sistema di allarme
di qualit commerciale. Potete scaricare il software di questo libro da GitHub
(https://www.github.com/ardnut).

Le costanti
Esistono due modi di definire le costanti dei numeri dei pin I/O, di ritardi e altri valori. Il
primo utilizzare dichiarazioni #define. Il secondo utilizzare numeri interi che siano
inizializzati su qualche valore e poi mai modificati. Per esempio, una dichiarazione
#define per associare al pin 2 un nome potrebbe presentarsi cos:

Lapproccio alternativo creare un numero intero che contenga il valore:

Se osservate il codice Arduino dellesempio, vedrete utilizzati entrambi gli approcci ed


entrambi funzionano altrettanto bene. Anche se alcuni preferiscono evitare la
dichiarazione #define, per qualche motivo, offre un compromesso con luso della
memoria da tenere in considerazione.
Il vantaggio che offrono le dichiarazioni #define, come nellEsempio 5-5, che
producono un programma compilato di dimensioni inferiori. Con le dichiarazioni #define,
la dimensione finale del programma dellallarme anti intrusione 1.452 byte. Se
sostituiamo le dichiarazioni #define con le dichiarazioni int, diventa 1.540 byte. La
differenza di 88 byte pu non sembrare significativa, ma nel caso di uno sketch grande
con molte definizioni I/O e costanti pu diventarlo. Se, per esempio, tutto non deve
superare i 30.720 byte per un ATmega328, pu determinare se il programma funzioner
o meno.

Le variabili globali
Una cosa che potete notare in tutti gli sketch luso delle variabili globali. Queste sono
molto comuni negli sketch di Arduino per un motivo molto valido: la funzione loop() viene
chiamata ripetutamente da main() quando il codice dello sketch viene eseguito e se le
variabili sono definite in loop() vengono cancellate e ricaricate ogni volta che viene
chiamato loop(). Se loop() ha bisogno di una variabile con un valore persistente (per
esempio un contatore), questa deve trovarsi al di fuori di loop() in modo che non venga
cancellata e ricreata ripetutamente. Le variabili globali, inoltre, permettono a setup() di
impostare comodamente dei valori iniziali prima che loop() venga chiamato per la prima
volta e cos anche tutte le altre funzioni dello sketch avranno accesso alle variabili.
In alcuni circoli, le variabili globali si sono guadagnate una cattiva reputazione, per via
dei problemi che possono sorgere con accoppiamenti involontari tra diverse parti di un
programma. In applicazioni grandi che si caricano da un disco, vengono eseguite e poi
terminate da un utente, come un word processor, giochi e browser web, questo ha
senso. Non bello quando una parte di unapplicazione modifica una variabile globale e
unaltra parte dellapplicazione causa un crash quando anchessa modifica la stessa
variabile globale. In sistemi con moltissima memoria a disposizione, lallocazione
dinamica della memoria, semaphore e lock mutex e la possibilit di distribuire puntatori
per cose come strutture complesse, luso delle variabili globali potrebbe non essere
giustificabile.
Tuttavia, nel regno dei sistemi integrati, le variabili globali vengono utilizzate spesso
come una forma efficiente di memoria compartita che sia visibile per tutte le funzioni del
programma. Potete immaginare le variabili globali come un pannello pieno di interruttori,
indicatori, manopole e quadranti, come nella cabina di pilotaggio di un aeroplano. Tutto
dovrebbe andare bene finch rispettate la regola modificata da una sola funzione, letta
da molte funzioni.
Dal momento che uno sketch di Arduino non viene eseguito in parallelo con altri thread o
processi, le possibilit di una collisione di accesso sono pari a zero. Gli interrupt
possono rappresentare una sfida, a seconda di come sono implementati, ma anche qui i
problemi potenziali si possono evitare con un po di previdenza.

Le librerie
Le librerie fornite con lIDE di Arduino si occupano di moltissime cose, ma non di tutto,
come si pu vedere nel Capitolo 7. Se nessuno ha dedicato tempo e sforzo per creare
una libreria per un determinato sensore o una specifica interfaccia, dovrete fornire il
codice voi stessi. Questo caso si verifica pi spesso quando si lavora con sensori o
shield personalizzati o non molto diffusi che richiedono funzioni speciali.
NellIDE di Arduino, il termine libreria si utilizza in un modo che pu sembrare fuori dalla
linea alla quale eravate abituati se avete lavorato con GCC o Visual Studio in progetti
grandi. Quando si costruisce software per un computer completo come un PC desktop,
di solito la parola libreria si riferisce a un archivio di oggetto binario. Sui sistemi Linux e
Unix questo si ottiene utilizzando gli strumenti ln, ar e ranlib. Il file binario che ne risulta
una collezione indicizzata di file oggetto (vedere Oggetti, immagini e codice sorgente
a pagina 91) che il linker pu utilizzare per riempire i vuoti e generare un programma
completo. Se si tratta di una libreria dinamica, sar caricata quando lapplicazione
comincia (o addirittura durante lesecuzione del programma) e il collegamento avr
luogo in quel momento.
NellIDE di Arduino, di solito le librerie esistono nella forma di codice sorgente finch non
diventano necessarie in uno sketch. Quindi quello che accade in realt quando viene
compilato uno sketch che lo sketch (ed eventuali file di schede), tutte le librerie
necessarie e il codice runtime vengono compilati tutti contemporaneamente e collegati in
ununica immagine eseguibile binaria.

Utilizzare le librerie negli sketch


Come abbiamo spiegato prima, quando lIDE di Arduino incontra unistruzione include
che fa riferimento a una libreria gi registrata con lIDE, genera i passaggi di costruzione
necessari e le opzioni del linker per incorporarla automaticamente. Tuttavia, perch
questo funzioni, lIDE deve essere avvertito in anticipo della necessit della libreria.
Registrare una libreria con lIDE descritto in Aggiungere una libreria nellIDE di
Arduino a pagina 120. LIDE di Arduino contiene gi precaricata una selezione di librerie
per operazioni e dispositivi I/O comuni. La Figura 5-7 mostra lelenco di librerie
disponibili in una versione pi vecchia dellIDE e la Figura 5-8 mostra lelenco delle
librerie e delle opzioni di gestione delle librerie nella versione pi recente (1.6.4)
dellIDE.

Figura 5-7 - Lelenco delle librerie registrate su un IDE di Arduino pi vecchio.


Figura 5-8 - Lelenco delle librerie registrate sullultima versione dellIDE di Arduino.

LEsempio 5-6 mostra come una libreria (in questo caso la libreria SoftwareSerial) viene
incorporata in uno sketch. La prima cosa da notare la dichiarazione include allinizio del
file dello sketch:

Grazie a questa lIDE determina che ha bisogno di individuare una libreria di nome
SoftwareSerial e si aspetta di trovarla nel suo elenco di moduli libreria conosciuti.

Esempio 5-6 - Esempio di libreria 1.


Loggetto SoftwareSerial viene istanziato nella riga:

Questo definisce anche i pin da usare per la funzione I/O seriale, cio 2 e 3 (pin I/O
digitali).
Nella funzione setup(), viene impostato il baud rate seriale.
La funzione loop() legge un valore dal pin dellingresso analogico A0 e poi invia il valore
binario per mezzo delloggetto softSerial. La funzione loop() entra in pausa per 1
secondo dopo che stato inviato ciascun valore binario.
Questa tecnica pu essere utilizzata per inviare e ricevere dati binari tra due schede
Arduino, ma non funziona molto bene se volete ottenere un output leggibile per gli esseri
umani. Per quello dovete utilizzare i metodi print() e println() nella libreria, come
mostra lEsempio 5-7.

Esempio 5-7 - Esempio di libreria 2.


anche possibile utilizzare la funzione di libreria standard printf() per inviare dati sulla
porta seriale, ma printf() non viene gi preattivato con le funzioni core di Arduino. Se
volete imparare come attivare printf() e capire che effetto pu avere sui vostri sketch,
potete consultare la pagina web di Arduino dedicata a come attivare printf() negli
sketch di Arduino (http://playground.arduino.cc/Main/Printf).
Potete scoprire di pi sul modulo libreria SoftwareSerial nellaiuto integrato dellIDE e nel
paragrafo Le librerie e potete trovare il codice sorgente nelle directory della vostra
installazione di Arduino. SoftwareSerial descritto anche nel Capitolo 7.

Aggiungere una libreria nellIDE di Arduino


Le librerie aggiuntive fornite dallutente sono la chiave per utilizzare dispositivi esterni
come sensori di umidit e temperatura, moduli RF (radio frequenza) e componenti di
controllo remoto a infrarossi (IR). Potete scrivere una libreria di funzioni personalizzata,
oppure potete scegliere di installare del codice creato da qualcun altro.
Le librerie aggiuntive di solito si trovano in una directory di nome libraries che si trova
nella directory sketchbook. La serie di file che comprende la libreria aggiuntiva risiede in
una sottocartella con un nome appropriato. il nome di questa sottocartella che appare
nellelenco di librerie nellIDE. Esistono due modi per farlo:
Metodo 1, automatico
Le versioni recenti dellIDE di Arduino (1.0.5 e successiva) sono in grado di installare
automaticamente il codice sorgente della libreria nella directory sketchbook (la
posizione esatta dipende dal sistema operativo). Nel menu principale dellIDE, si
deve fare clic su SketchImport LibraryAdd Library e quindi selezionare la
directory o il file ZIP che contiene il codice sorgente della libreria. La versione pi
recente dellIDE (1.6.4) utilizza una serie di passaggi leggermente diversa e le
funzioni di gestione delle librerie sono raggruppate sotto Include Library.
Uno dei vantaggi offerti da questo metodo (a parte la sua semplicit) che lIDE
riconosce immediatamente la nuova libreria, senza richiedere che lo si riavvii. Inoltre,
nelle versioni pi recenti dellIDE, potete scaricare e installare librerie provenienti da
sorgenti esterne.
Metodo 2, manuale
Per installare manualmente una libreria aggiuntiva nellIDE di Arduino sono necessari
questi passaggi:
Innanzitutto, dovete chiudere lIDE se attivo.
Poi dovete decomprimere i file della nuova libreria in una cartella temporanea
(la maggior parte delle librerie aggiuntive sono fornite nella forma di file ZIP).
Devono apparirvi almeno due file di codice sorgente: un file .c o .cpp (il
programma) e un file .h (un include o file header).
Quindi dovete creare una sottocartella sotto <home>/sketchbook/libraries con
lo stesso nome dei due file sorgente.
Infine dovete copiare tutti i contenuti della cartella temporanea nella nuova
directory della libreria che avete creato nel passaggio precedente.
Quando si riavvia lIDE, la libreria appare elencata nellelenco SketchInclude
Library.
La convenzione per organizzare i contenuti di una libreria aggiuntiva la seguente:

Notate che questo soltanto un esempio. Per quel che ne so, non esiste (ancora) la
libreria di un tracker IR per Arduino.
La sottocartella della libreria deve avere lo stesso nome dei file sorgente e questa
convenzione utilizzata per tutte le directory dellIDE di Arduino. Per esempio, nella
cartella di esempio di Arduino (/usr/share/arduino/examples in un sistema Linux), le
sottocartelle hanno gli stessi nomi dei file .ino.
Come potete vedere nella struttura delle cartelle degli esempi, possono esserci ulteriori
sottocartelle per funzioni utility e anche ulteriori file sorgente rispetto ai due file che
condividono lo stesso nome della sottocartella. Non appaiono nellelenco delle librerie,
ma il codice della libreria pu accedervi quando viene compilato.
Probabilmente avrete notato un file di nome keywords.txt al livello di base della struttura
di cartelle delle librerie. Si tratta di un file importante, dal momento che offre allIDE
alcune definizioni su quali cose fare nel codice sorgente della libreria. Il file keywords.txt
dellipotetica libreria del tracker IR utilizzato per il nostro esempio di struttura di cartelle
si presenterebbe cos:

Il formato molto semplice. Il cancelletto (#) indica che tutto, fino alla fine di quella riga,
un commento e deve essere ignorato. Delle parole chiave speciali, elencate nella
Tabella 5-1, servono a indicare il tipo di costanti letterali, classi, strutture, variabili o
funzioni allIDE.
Tabella 5-1 - Le definizioni delle parole chiave per keywords.txt.

Tipo Definizione
LITERAL1 Costanti letterali (cio, macro)
LITERAL2 Costanti letterali (cio, macro)
KEYWORD1 Classi, tipi di dati e parole chiave di C++
KEYWORD2 Metodi e funzioni
KEYWORD3 Strutture

Potete trovare anche ulteriori informazioni nel file keywords.txt che si trova nella
directory dove sono installati i componenti runtime di Arduino sul vostro sistema. Sulla
mia macchina Linux, questa /usr/share/arduino/lib e su Windows si trova in
C:\Program Files\Arduino\lib. Potete anche dare unocchiata a quello che hanno fatto
altri esaminando i loro file keywords.txt nelle sottocartelle delle librerie fornite con lIDE.
Anche se possibile collocare librerie aggiuntive nella serie predefinita di cartelle
dellIDE di Arduino, questo approccio non consigliato. Le librerie predefinite fornite con
lIDE possono cambiare quando si aggiorna lIDE a una versione pi recente. Le librerie
e gli sketch aggiunti dallutente non sono mai alterati da un aggiornamento.
In ogni caso, un componente libreria formato da due parti fondamentali: il modulo
sorgente (name.c oppure name.cpp) e il file include (name.h). Il codice del modulo
sorgente una serie di funzioni che comprende una semplice classe C++. La classe in
s definita nel file header. Per utilizzare la libreria non si deve fare altro che copiarla in
una cartella adatta, lanciare lIDE di Arduino e quindi selezionare la nuove libreria
nellelenco SketchImport Library. LIDE esamina quindi il file header e inserisce la
dichiarazione #include <name.h> nello sketch.

Creare librerie personalizzate


Creare una libreria personalizzata da utilizzare con lIDE di Arduino facile. Non significa
necessariamente che debba essere semplice, dal momento che le librerie possono
essere molto complesse, ma, semplici o complicate, tutte seguono lo stesso modello di
base. Nella versione ridotta di AVR di C++, il codice sorgente scritto nella forma di
una classe, a volte con una o pi classi associate che aiutino ulteriormente. Se
osservate il codice sorgente di alcune delle librerie elencate nel Capitolo 7, potete farvi
unidea di come organizzato il codice sorgente delle librerie.
Come abbiamo notato prima, una libreria minima formata da almeno due file: il file
sorgente .cpp e il file include .h. Il file sorgente contiene limplementazione della classe
della libreria e il file include contiene la definizione della classe, le definizioni dei tipi e le
definizioni delle macro.
Ricorderete dal nostro semplice esempio di struttura di cartelle che la directory che
contiene i file sorgente e include della libreria deve avere lo stesso nome del file
sorgente (.cpp) principale. Inoltre deve contenere i file keywords.txt e README e la
cartella examples, che sempre un tocco di classe (in particolare se volete rilasciare la
vostra libreria perch possano utilizzarla altri).

Il codice sorgente di Arduino


Il codice sorgente di Arduino completo contiene file sorgente sia per le schede basate
su AVR che per le schede Due basate su ARM, che non sono trattate in questo libro. Il
codice sorgente disponibile su GitHub (https://github.com/arduino/Arduino.git)
utilizzando lURL e il comando git clone. Potete anche scaricare un file ZIP con
limmagine di tutti i file dal repository di GitHub
(https://github.com/arduino/Arduino/archive/master.zip).
Se prevedete di approfondire maggiormente Arduino senza limitarvi al suo IDE, vi
conviene tenere a portata di mano il codice sorgente. Analizzare i file sorgente pu
aiutare a rendere le cose pi chiare. Potete utilizzare uno strumento come Doxygen
(http://bit.ly/doxygen-main) per creare una serie di pagine web collegate con grafica
subordinata, grafica richiesta e un indice di classi, file sorgente e funzioni. Anche se la
sorgente di Arduino non ha molto in termini di tag specifici per Doxygen, comunque
possibile generare documentazione utile.
Al livello pi alto, la struttura di cartelle della sorgente di Arduino contiene directory per il
codice sorgente di applicazione (app), moduli di costruzione (build), file specifici per
lhardware (hardware) e i moduli libreria inclusi nella distribuzione standard di Arduino
(libraries). Da una prospettiva di basso livello, le cartelle hardware e libraries sono le
pi interessanti.
Nella sottocartella hardware trovate il codice sorgente di vari bootloader, il codice di
supporto del runtime (che in questa serie di file sorgente viene detto core) che include
main.cpp e una piccola raccolta di moduli per EEPROM, I/O seriali, SPI e interfacce a
due fili (nella cartella hardware/avr/arduino/libraries, che diversa dalla directory
libraries della quale parlavamo prima). Le librerie di supporto incluse nellIDE di Arduino
si trovano nella cartella libraries. Le sue sottocartelle includono codice sorgente per
audio, Ethernet, schermi a cristalli liquidi, schede di memoria SD, servo motori, motori
passo-passo, schermi TFT e moduli WiFi. Ci sono librerie anche per i prodotti Arduino
Robot, Esplora e Yn. Molte delle sottocartelle delle librerie contengono anche sketch di
programmi di esempio e alcune contengono documentazione nella forma di file di testo.
Una cosa da tenere presenta quando si legge il codice sorgente di Arduino che fa un
uso massiccio di dichiarazioni #if, #ifdef, #ifndef e #define per determinare che cosa
sar incluso e compilato per un determinato tipo di scheda Arduino. Questo allinizio pu
confondere e capire che cosa sta succedendo pu richiedere un piccolo sforzo. Vale
anche la pena notare che in alcuni casi viene utilizzata una funzione o una serie di
funzioni, mentre in altri casi per uno scopo specifico viene definita una classe.
6

La vita senza lIDE di Arduino

In realt, lhardware di Arduino non niente di speciale: non altro che una scheda
sviluppata in modo molto semplice basata sui dispositivi AVR di Atmel. Sono il suo IDE e
il suo firmware del bootloader a rendere pi facile per i non programmatori lavorarci e
far funzionare le cose. Tuttavia, possibile dimenticarsi completamente dellIDE di
Arduino. Questo unapplicazione comoda che si occupa di moltissimi dei dettagli pi
difficili del processo di costruzione del software al posto del programmatore, ma coloro
che vogliono lavorare nella linea di comando utilizzando semplicemente un editor di testo
possono farlo, senza dover utilizzare mai un IDE.
In questo capitolo, vedremo alcuni esempi di modi alternativi per costruire programmi
per Arduino e come si utilizza la toolchain AVR-GCC dalla linea di comando, senza
nessun aiuto se non quello di un makefile. Vedremo anche come possibile utilizzare il
linguaggio assembly direttamente per collegare lultimo bit di prestazioni da una MCU
AVR.
Proprio come esistono diversi modi di creare codice eseguibile per Arduino, esistono
diversi modi di caricare software in un AVR. In questo capitolo, vedremo alcune delle
tecniche necessarie per farlo che non coinvolgono lIDE di Arduino.

Le alternative allIDE
LIDE di Arduino non lunico modo di sviluppare e caricare programmi per una MCU
AVR su una scheda Arduino. Unalternativa di programmazione per Arduino lo
strumento PlatformIO, che gira sotto Linux, Mac OS X e Windows. Si tratta di un
costruttore di codice e gestore di librerie basato su Python che si esegue dalla linea di
comando. Un altro strumento Python per costruire programmi per Arduino Ino, che
funziona su Linux e Mac OS, ma attualmente non disponibile per lambiente Windows.

PlatformIO
PlatformIO (http://platformio.org/) uno strumento a linea di comando basato su Python
che supporta oltre 100 diversi microcontroller di destinazione. ampiamente
indipendente dalla piattaforma, dal momento che per girare su Windows, Mac OS X o
Linux richiede soltanto Python 2.6 o 2.7 (vi consiglio di installare Python 2.7). Per
ulteriori informazioni, potete visitare il sito web di PlatformIO.
Basato sul tipo di microcontroller specificato, PlatformIO determina quali componenti
della toolchain sono necessari e quindi li chiama nellordine corretto per completare le
operazioni di compilazione, collegamento e caricamento sul target. Le schede
supportate da PlatformIO comprendono la serie Trinket di Adafruit, tutte le schede AVR
di Arduino, la BitWizard Raspduino (menzionata nel Capitolo 1), le schede Digispark di
Digistump, la Engduino, le schede LowPowerLab Mote, la Microduino, le schede AVR
Sanguino e le schede AVR di SparkFun. Sono supportati anche veri prodotti basati su
ARM, come le schede che utilizzano la MCU SAM di Atmel, la MCU STM32, la LPC di
NXP, la Nordic nRF51, oltre alla serie TI MSP430 e altre.
Installare PlatformIO su un sistema Linux o Mac facile. Si utilizza la linea di comando,
si scarica uno script di installazione, oppure si utilizza uno strumento pip di Python.
Prima pu essere necessario installare lo strumento cURL per il trasferimento dei dati,
ma questa unutility diffusa e sui sistemi Linux pu essere ottenuta direttamente da un
repository di pacchetti.
La Figura 6-1 mostra loutput della console dopo aver scaricato e installato
correttamente i pacchetti di PlatformIO.

Figura 6-1 - Loutput della console dopo la corretta installazione di PlatformIO.

Una volta installato, potete scoprire quello che possibile fare. Se digitate platformio
boards, vi appare il lungo elenco delle schede attualmente supportate.

Per mantenere tutto pulito e ordinato, PlatformIO utilizza la nozione dei progetti. Ciascun
progetto comincia con un file di configurazione e due sottocartelle, src e lib. Il file di
configurazione deve essere modificato prima di essere utilizzato. Si tratta di un file
ASCII KVP (coppia chiave/valore) convenzionale di tipo INI.
Trovate una documentazione pi dettagliata nella pagina di riferimento Project
Configuration File (http://bit.ly/platformio-pcf).
Io consiglio di creare una sottocartella per i progetti di PlatformIO separata dalla
directory sketchbook che utilizza lIDE di Arduino. Nel mio caso, ho chiamato la mia
platformio (una scelta non molto creativa, ma per me va bene). Per creare un nuovo
progetto, dovete digitare platformio init. La Figura 6-2 mostra loutput della console
quando si crea un progetto.

Figura 6-2 - Inizializzare un nuovo progetto di PlatformIO.

PlatformIO ha molte funzionalit, compresi framework predefiniti per vari tipi di schede,
un gestore di librerie e la possibilit di integrarsi con un IDE o un editor di tipo IDE come
quello di Arduino (oltre a Eclipse, Energia, Qt Creator, Sublime Text, Vim e Visual
Studio).

Ino
Ino un semplice strumento di costruzione a linea di comando che adotta un approccio
basato sui makefile per compilare per target Arduino. Come PlatformIO, costruito
utilizzando Python, ma, a differenza di PlatformIO, pensato specificamente per essere
utilizzato con schede Arduino. Ino supporta file di sketch *.ino e *.pde, oltre a sorgenti
*.c e *.cpp, e dichiara di supportare tutte le schede supportate dallIDE di Arduino.
Notate che la versione attuale di Ino funziona soltanto con le piattaforme host Linux e
Mac OS X. Ino funziona con Python 2.6 o 2.7.
Potete scaricare e installare Ino scaricando un file TAR compresso
(http://inotool.org/#installation), clonandolo da GitHub, oppure utilizzando gli strumenti
Python pip o easy_install. Per installare Ino e i suoi vari componenti, io ho utilizzato pip.
Dopo linstallazione, lanciando il comando ino -h ho fatto apparire nella finestra della
console loutput mostrato nella Figura 6-3.

Figura 6-3 - Laiuto dello strumento Ino.

Ino crea e utilizza makefile, ma questi sono trasparenti per lutente. Come PlatformIO,
utilizza uno schema di progetti basato sulle directory e, quando si inizializza un progetto,
Ino crea due sottocartelle: src e lib. Crea anche un modello di sketch essenziale
(sketch.ino) nella directory src, proprio come fa la versione pi recente dellIDE di
Arduino. Siete voi a dovervi occupare di riempire i vuoti e di fornire il resto dei file
necessari.
Trovare maggiori informazioni su Ino sul sito web ufficiale (http://inotool.org/); lo
strumento pu essere scaricato dal Python Package Index (http://bit.ly/ino-ppi).

La toolchain di AVR
Il mezzo principale per convertire un file sorgente con codice sorgente C o C++ in un
oggetto binario che possa quindi essere incorporato in un programma AVR eseguibile e
completo il compilatore AVR-GCC, con la sua suite di utility. Tutti insieme vengono
definiti una toolchain. Come abbiamo anticipato prima, il ruolo principale dellIDE di
Arduino avvolgere una shell facile per lutente intorno a questi strumenti e nascondere
il pi possibile i dettagli pi complicati. Anche PlatformIO e Ino nascondono la toolchain
dietro gli script Python. Ma comunque ancora l, nonostante tutto, e, se volete
costruire il vostro codice AVR utilizzando un makefile dalla linea di comando, oppure se
semplicemente volete eseguire ciascun passaggio manualmente, avete a vostra
disposizione il compilatore, il linker, lassembler e altri strumenti.

NOTA Il pacchetto di installazione dellIDE di Arduino (in qualsiasi forma funzioni per il vostro OS) si prende cura di
installare al vostro posto la toolchain di AVR-GCC. Su un sistema Linux, lIDE di Arduino richiede la toolchain di AVR-
GCC e i componenti a essa associati, e quindi il gestore di pacchetti li installa durante linstallazione dellIDE di Arduino.
Il motivo principale per installare la toolchain oltre a quello che viene fornito dallIDE di Arduino avere la possibilit di
utilizzare le versioni pi recenti degli strumenti. Su un sistema Windows, lIDE di Arduino, gli strumenti e le librerie
vengono collocati in una directory separata rispetto a dove qualcosa come la suite WinAVR normalmente
posizionerebbe i componenti della sua toolchain, per cui se volete farlo potete avere a disposizione entrambi.

La Tabella 6-1 elenca gli strumenti di AVR che si trovano su un sistema Linux dopo aver
installato il pacchetto di distribuzione di Arduino. La stessa serie di base di programmi si
trova sui sistemi Windows o Apple dopo linstallazione dellIDE di Arduino. I metodi per
procurarsi e installare gli strumenti GNU AVR su vari sistemi host sono descritti in
Installare la toolchain a pagina 131.
Tabella 6-1 - Gli strumenti per il cross-compilation AVR.

Strumento Descrizione
avr-addr2line Converte gli indirizzi in nomi di file e numeri di riga
avr-ar Crea archivi di codice oggetto e modifica o estrae codice
avr-as Lassembler GNU portatile per lAVR
avr-c++filt Decodifica i simboli C++
avr-gcc Il backend del compilatore GCC per fornire codice oggetto AVR
Il backend del compilatore G++ per produrre codice oggetto
avr-g++
AVR
avr-ld Il linker GNU per il codice oggetto AVR
avr-nm Elenca i simboli inclusi dei file oggetto
avr-objcopy Copia e traduce i file oggetto
avr-objdump Mostra informazioni sui file oggetto
avr-ranlib Genera un indice per un archivio di librerie
avr-readelf Mostra informazioni sui file ELF
avr-size Elenca le dimensioni totali e di sezioni dei file oggetto
avr-strings Stampa stringhe di caratteri stampabili nei file binari
avr-strip Elimina i simboli nei file oggetto AVR
AVRDUDE Il programma driver per vari programmatori MCU AVR

Non tutti gli strumenti elencati nella Tabella 6-1 sono necessari per costruire programmi
eseguibili per un chip AVR su una scheda Arduino. Con leccezione di AVRDUDE, sono
versioni AVR di strumenti GNU esistenti, con funzionalit simile o identica.
Gli strumenti importanti della toolchain, per poter ottenere qualcosa di compilato per
Arduino (o qualsiasi MCU AVR), sono avr-gcc, avr-g++, avr-ar, avr-as, avr-ld, avr-
objcopy, avr-ranlib e AVRDUDE.
Il cuore della toolchain il compilatore, che si chiama avr-gcc, oppure avr-g++ per le
sorgenti C++. Questi sono versioni del compilatore GNU tagliate su misura per essere
utilizzate con codice sorgente C o C++ e con la linea di microcontroller AVR di Atmel.
Sono simili alla versione completa di gcc, con alcune delle opzioni del compilatore
preimpostate per renderle pi comode da utilizzare per il cross-compiling MCU AVR.
Se per caso guardate nella directory dove sono stati installati i componenti della
toolchain, ecco che cosa vi trovate:

Tutte queste non sono che varianti del compilatore GNU. I file avr-c++ e avr-g++ sono
identici. Anche i file avr-cpp, avr-gcc e avr-gcc-4.5.3 sono identici. Se siete curiosi,
potete ottenere le informazioni sulla versione digitando avr-gcc -v e avr-g++ -v.
Dopo che il codice sorgente stato compilato, il linker (avr-ld) combina tutti i moduli
binari in un unico eseguibile. Prima di poter essere elaborati dal linker, i moduli sorgente
devono essere gi stati compilati in file oggetto.
La compilazione e il collegamento non sono la fine del processo, per, dal momento che
limmagine binaria eseguibile creata dal linker deve essere convertita in un cosiddetto
file Intel Hex, che contenga una rappresentazione ASCII del codice binario nella forma di
caratteri esadecimali ASCII. Quindi pu essere caricata sulla scheda target, dove il
bootloader ritraduce gli esadecimali ASCII in valori binari e li scrive sulla memoria flash
del microcontroller.
Anche altri membri della toolchain GNU, come ar, ranlib, nm, ld e strip, hanno versioni
AVR. La Figura 6-4 mostra un diagramma di come il compilatore, il linker, il convertitore
e luploader lavorano tutti in sequenza per trasformare un programma in una forma
compilata, collegare le funzioni necessarie dei moduli libreria e quindi trasferire il
programma completato in un AVR target.
Figura 6-4 - La toolchain AVR-GCC.

I file oggetto mostrati nella Figura 6-4 possono essere il codice compilato di altri moduli
del progetto, oppure possono provenire dal codice fornito con un sensore o altri
accessori, oppure ancora possono essere codice di supporto del runtime AVR-GCC,
come la funzione main() fornita dallIDE di Arduino. Gli oggetti libreria mostrati possono
essere librerie binarie vere e proprie come avr-libc, oppure altre librerie create con avr-
ar e avr-ranlib, oppure ancora possono essere file oggetto creati quando una libreria in
stile Arduino viene compilata prima del collegamento.
NOTA Un componente non menzionato qui la libreria di supporto del runtime AVR-GCC, avr-libc, che fornisce molte
delle stesse funzioni che si trovano in una libreria C standard di runtime AVR-GCC. Include inoltre funzioni di supporto
specifiche per il microcontroller AVR. avr-libc descritta nel dettaglio in avr-libc a pagina 138.

Installare la toolchain
Anche se i componenti della toolchain di solito vengono installati automaticamente
durante linstallazione dellIDE di Arduino utilizzando un gestore di pacchetti, linstaller
per Windows o il file ZIP per Mac OS X, se prevedete di non utilizzare lIDE di Arduino
potete installare questi componenti uno a uno.
Come minimo, vi serviranno questi pacchetti (questi sono i nomi dei pacchetti Linux):
avr-lib
avrdude
avrdude-doc
binutils-avr
gcc-avr
gdb-avr
Se utilizzate Windows, potete anche decidere di installare altri strumenti compatibili con
Unix/ Linux come grep, fgrep, ls e diff. Questi sono gi presenti sulle piattaforme Linux e
Mac OS X. Anche se qui non spiegato nel dettaglio, possibile installare la toolchain
AVR GNU su sistemi Solaris o BSD Unix (FreeBSD, per esempio) o su qualcosa di
ancora pi lontano dai sentieri battuti. Vi servono soltanto una buona ragione, moltissima
pazienza e possibilmente una significativa quantit di capacit di lavorare con i pacchetti
di codice sorgente. In generale, molto pi facile utilizzare sistemi per i quali sono
disponibili pacchetti di installazione gi pronti.

Linstallazione su Windows
Come abbiamo anticipato prima, il pacchetto di Arduino contiene gi il compilatore e i
programmi binutils necessari. Semplicemente installando lIDE di Arduino, si installano i
componenti della toolchain che gli servono nella stessa directory dove si trova il codice
eseguibile principale dellIDE.
Atmel Corporation fornisce pacchetti di installazione binari e precompilati, la
documentazione di base e il codice sorgente per gcc e binutils AVR. Potete accedere ai
pacchetti di installazione e ad altre sorgenti nel sito web di Atmel (http://bit.ly/atmel-avr-
win). I pacchetti di codice sorgente sono disponibili anche sul sito web
(http://bit.ly/atmel-source).
Un altro modo facile di installare la toolchain AVR-GCC su un sistema Windows con il
pacchetto WinAVR (http://winavr.sourceforge.net/). Lo script di installazione crea una
directory (sulla mia macchina C:\WinAVR-20100110) e gli eseguibili binari, le librerie e
i file include vengono collocati qui. Trovate anche una buona raccolta di file di
documentazione, sia in formato PDF che HTML, in C:\WinAVR-20100110\doc. Ma
sappiate che WinAVR non stato aggiornato circa dal 2010, per cui alcuni dei
componenti della toolchain sono un po vecchi, ma ancora possibile utilizzarli per la
maggior parte dei progetti. La versione Atmel sembra essere pi recente.
Una raccolta di utility GNU precompilate per Windows si trova su GnuWin32
(http://gnuwin32.sourceforge.net/). Si tratta di una vasta raccolta di strumenti e utility di
sistema, ma non include i compilatori gcc/ g++ n i pacchetti binutils. Potete scaricarli
da Atmel o WinAVR.
Potete trovare altri pacchetti e tutorial su Google cercando Windows avr binutils. Se vi
piace utilizzare leditor/ambiente IDE Eclipse e volete provarlo per lo sviluppo software
AVR, potete consultare il tutorial AVR Eclipse Environment on Windows su
Protostack.com (http://bit.ly/protostack-eclipse).

Linstallazione su Linux
Sulla maggior parte dei sistemi Linux, linstallazione dei pacchetti GNU gcc, binutils e
altri legati ad AVR soltanto questione di selezionare i pacchetti utilizzando un gestore
di pacchetti software. Potete avere installati contemporaneamente sia i normali
componenti GCC della toolchain sia i componenti AVR della toolchain, dal momento che
le versioni AVR del compilatore e gli strumenti binutils presentano il prefisso avr-. Non
vi raccomando di cercare di costruire avr-gcc n nessuno degli altri membri della
toolchain dalla sorgente, a meno che non abbiate un motivo davvero convincente per
farlo e vi troviate davvero a vostro agio lavorando con pacchetti di codice sorgente
molto grandi e complessi.

Linstallazione su Mac OS X
Dal momento che Mac OS X si basa su BSD Unix, molto di quello che pu essere detto
per Linux vale anche per Mac OS X. La brava gente di Adafruit ha creato unutile guida
(http://bit.ly/avr-osx) allinstallazione della toolchain AVR GNU in ambiente Mac OS X. In
questa pagina, il link del pacchetto per Mac obsoleto, ma nel prossimo paragrafo
troverete quello corretto.
Lambiente di sviluppo CrossPack di Object Development contiene tutti i componenti
della toolchain necessari per sviluppare software AVR in ambiente Mac OS X e non
richiede Xcode per essere compilato. Potete scaricarlo dal sito web di Object
Development (http://bit.ly/crosspack-avr). Notate che questa soltanto la toolchain: non
fornisce un IDE GUI n un editor, per cui dovrete installarveli da soli.
Esiste una versione dellIDE di Eclipse per Mac OS X con la toolchain AVR e
naturalmente esiste una versione dellIDE di Arduino per la piattaforma Mac OS X.

make
Nel caso di programmi piccoli, utilizzare i programmi della toolchain a linea di comando
pu andare bene, ma poi, quando le cose cominciano a espandersi, conviene disporre
di un qualche modo di automatizzare il processo. Lo strumento adatto in un ambiente a
linea di comando make.
make un tipo di interprete ed elabora quelli che vengono chiamati makefile. Il
linguaggio utilizzato da make non un linguaggio di programmazione a scopo generale,
ma piuttosto una serie di azioni, regole e definizioni di relazioni. Potete immaginarlo
come una specie di script e spesso viene detto linguaggio macro dal momento che le
dichiarazioni utilizzano rimpiazzi e sostituzioni per costruire comandi per altri strumenti.
make fa ben pi che soltanto questo, per, poich anche in grado di rilevare
cambiamenti nei file sorgente e di tener traccia delle dipendenze tra file sorgente (per
esempio, se A dipende da B e C e B cambia, B verr compilato di nuovo e anche A
dovr essere compilato di nuovo per incorporare questi cambiamenti). Allinizio, make
stato creato da Richard Stallman, Roland McGrath e Paul D. Smith.
Molti IDE per lo sviluppo di codice a grande scala utilizzano make come backend per
la compilazione. Anche gli strumenti PlatformIO e Ino utilizzano make, ma lo fanno in
modo da nascondere quello che sta succedendo e poi dopo fanno le pulizie. Esistono
anche degli strumenti che automatizzano il processo di creare input per lo strumento
make e, se mai avete utilizzato lo strumento configure per costruire un pacchetto
software, avete visto questo tipo di utility in azione.
Lidea di base che sta dietro a make gestire una vasta gamma di file sorgente dei
programmi. Pu determinare quale file sorgente cambiato e quali altri file sorgente
hanno bisogno di essere compilati di nuovo se dipendono dai file che sono cambiati.
Lutility make pu invocare compilatori, linker, generatori automatici di documentazione e
perfino altri makefile (in situazioni dove il codice sorgente debba essere distribuito su
diverse sottocartelle). make anche in grado di riconoscere quando uno strumento
come avr-gcc o avr-ld si imbatte in un errore.
Un buon punto di partenza per farsi unidea di come si utilizza make analizzare i
makefile che si trovano in progetti gi esistenti. Descrivere tutte le funzionalit di make
va ben oltre lambito di questo libro (il manuale GNU ufficiale lungo pi di 200 pagine)
ed esistono molti libri che parlano di make e delle sue applicazioni nel dettaglio (vedere
Appendice D). Potete scaricare il manuale utente ufficiale di make in formato PDF dal
sito web di GNU (http://www.gnu.org/software/make/manual/make.pdf).

avr-gcc
GCC lacronimo di GNU Compiler Collection. La GCC si basa sul concetto di utilizzare
diversi processori frontend simbolici per linguaggi specifici e poi passare il codice
intermedio che ne risulta a un backend per una determinata piattaforma target. Il
compilatore avr-gcc costruito a partire dalla sorgente GCC ed preconfigurato per
generare codice oggetto specificamente per la famiglia di microcontroller AVR. La GCC
in grado di generare codice oggetto a partire da molti tipi diversi di processori, tra i
quali le CPU Intel che si trovano sui PC, le CPU SPARC RISC, la famiglia 68000 di
microprocessori a grande scala, le MCU MSP430 di Texas Instruments, varie MCU
basate su ARM e molti altri.
avr-gcc e avr-g++ accettano numerosi argomenti a linea di comando, detti anche
switch. Questi definiscono cose come ottimizzazione, modalit di compilazione,
argomenti pass-through per il linker, percorsi dei file include e il processore target.
Anche se esistono letteralmente centinaia di switch a linea di comando, per compilare
correttamente il codice per un determinato processore target ne sono necessari
soltanto alcuni.
La compilazione pu richiedere fino a quattro passaggi: la pre-elaborazione, la
compilazione, lassemblaggio e il collegamento. Questi avvengono sempre in questo
ordine. Il preprocessore espande tutte le dichiarazioni include (#include) caricando il
testo nel file con nome nella sorgente corrente. Normalmente le dichiarazioni #include
devono essere utilizzate soltanto per includere i cosiddetti file header, come stdio.h o
stdlib.h, e non file sorgente (anche se questa generalmente non considerata una
buona idea, ho visto farlo). Il preprocessore, inoltre, si sbarazza di tutti i commenti e
interpreta tutte le dichiarazioni condizionali del preprocessore, come #ifdef, #else ed
#endif. Loutput del preprocessore un file sorgente pulito e leggero, che contiene
codice sorgente puro e nientaltro. Per fermare il processo dopo che il preprocessore
ha finito ed esaminare il codice sorgente ridotto, si pu utilizzare lo switch -E.
La GCC fondamentalmente un traduttore per un particolare linguaggio tipo C come
quello tradizionale, oppure ANSI C, C++, Objective-C o Objective-C++. Loutput del
compilatore un file di linguaggio assembly intermedio. Di solito questo linput
dellassembler (avr-as), che a sua volta genera un file oggetto. Il file intermedio in
linguaggio assembly viene eliminato dopo lesecuzione dellassembler. possibile
interrompere il processo appena prima che parta lassembler ed esaminare loutput in
linguaggio assembly utilizzando lo switch -S.
Lo switch -c viene utilizzato per creare un file oggetto senza invocare il linker. Questo si
utilizza nei makefile dove tutti i file sorgente vengono prima compilati e poi collegati in un
unico passaggio. Il compilatore dispone anche di switch per ottimizzazione, avvertimenti
(pu generarne moltissimi) e specifica di percorsi in modo da poter rintracciare i file
include. Lo switch -o specifica il nome di unimmagine eseguibile compilata:
limpostazione predefinita di solito a.out.
Per ulteriori informazioni, potete consultare le pagine del manuale di GCC, oppure
potete scaricare un manuale utente in formato PDF, PostScript o HTML dalla
documentazione online di GCC (https://gcc.gnu.org/onlinedocs). GCC non una
semplice utility e la quantit di opzioni disponibili incredibile. Fortunatamente, per
creare codice eseguibile che funzioni non avete bisogno di utilizzarle tutte.

binutils
I binutils GNU sono una raccolta di programmi che gestisce le varie operazioni coinvolte
nella conversione delloutput del compilatore in qualcosa che possa essere eseguito da
un processore. La Tabella 6-2 elenca i contenuti del pacchetto binutils-avr su un
sistema Linux. Questa suite di strumenti contiene tutto il necessario per assemblare,
collegare, convertire ed elaborare file eseguibili binari in una forma adatta per un
microcontroller AVR di destinazione. I manuali degli strumenti binutils e della maggior
parte degli altri software GNU si trovano sul sito web ufficiale presso GNU Manuals
Online (http://bit.ly/gnu-manuals).
Tabella 6-2 - La raccolta di binutils AVR.

Strumento Descrizione
avr-addr2line Converte gli indirizzi in nomi di file e numeri di riga
avr-ar Crea archivi di codice oggetto e modifica o estrae codice
avr-as Lassembler GNU portatile per lAVR
avr-c++filt Decodifica i simboli C++
avr-ld Il linker GNU per il codice oggetto AVR
avr-nm Elenca i simboli inclusi dei file oggetto
avr-objcopy Copia e traduce i file oggetto
avr-objdump Mostra informazioni sui file oggetto
avr-ranlib Genera un indice per un archivio di librerie
avr-readelf Mostra informazioni sui file ELF
avr-size Elenca le dimensioni totali e di sezioni dei file oggetto
avr-strings Stampa stringhe di caratteri stampabili nei file binari
avr-strip Elimina i simboli nei file oggetto AVR

Le utility di supporto essenziali e necessarie per costruire programmi per una MCU AVR
sono avr-ar, avr-as, avr-ld, avr-objcopy e avr-ranlib, ma gli altri componenti della suite
di binutils possono rendersi utili o meno a seconda del software che state sviluppando.
Le applicazioni principali sono:
avr-ar
avr-ar si utilizza per creare archivi di codice oggetto binario oppure librerie statiche.
Pu essere utilizzato anche per modificare una libreria esistente o per estrarre
codice da una libreria. Un file binario di libreria (di solito con estensione .a) una
raccolta di moduli di codice binario (cio di moduli oggetto) con un indice principale
(che si crea utilizzando avr-ranlib, descritto tra poco). La libreria di un codice
oggetto viene detta libreria statica perch tutti i componenti che vengono utilizzati in
un altro programma vi sono incorporati e diventano parti permanenti, o statiche,
delloggetto eseguibile finale. Se siete curiosi, le librerie dinamiche condivise sono
una cosa diversa e, dal momento che di solito non vengono utilizzate con i dispositivi
AVR (n con altri microcontroller piccoli) non sono descritte in questo libro.
avr-as
avr-as lassembler GNU portatile per la famiglia di MCU AVR. Anche se spesso
viene utilizzato insieme alla GCC, pu essere utilizzato anche come assembler
indipendente (come spiegato in Il linguaggio assembly di AVR a pagina 143). Per i
microcontroller AVR esistono altri assembler che sono descritti anchessi in Il
linguaggio assembly di AVR, ma soltanto avr-as pensato per essere utilizzato con
i compilatori gcc/g++.
avr-ld
avr-ld di solito lultimo passaggio nel processo di creazione di un oggetto
eseguibile binario. La funzione principale del linker combinare due o pi file
oggetto, trovare tutti i riferimenti degli indirizzi tra di loro e ricollocare i dati secondo
necessit.
Quando un eseguibile costruito a partire da diversi file oggetto, ciascuno di questi
file oggetto pu contenere un riferimento a una funzione o a dati che non risiedono
allinterno di un particolare oggetto, ma in un altro. La versione AVR di libc, descritta
qui di seguito, un esempio di situazione di questo tipo. Per esempio, un
programma pu fare riferimento a qualcosa come atoi() (ASCII-to-integer), ma non
includere la sorgente di atoi() al suo interno. Quando il programma viene compilato
in un file oggetto (un file .o), il compilatore lascia un vuoto, per cos dire, nel codice
binario che si riferisce ad atoi(). Il linker si accorge di questa posizione vuota, trova
lindirizzo della funzione atoi() in una libreria (cio, avr-libc.a), scrive lindirizzo
esterno nel codice e quindi include il codice oggetto della funzione atoi()
nellimmagine eseguibile binaria finale.
avr-objcopy
Lutility avr-objcopy copia i contenuti di un file oggetto in un altro formato, di solito un
file ASCII esadecimale in cosiddetto formato Intel, adatto per essere caricato su una
MCU AVR utilizzando il bootloader di Arduino. avr-objcopy anche in grado di
generare un tipo di file ASCII esadecimale di nome S-record, che si utilizza spesso
sulle MCU Motorola (Freescale).
Il file in formato esadecimale Intel pu presentarsi simile a questo, dove vedete le
righe iniziali e finali del bootloader di Arduino per una MCU ATmega168 o
ATmega328 MCU:

Al centro del codice sono state omesse molte righe, per amor di brevit, ma potete
trovare il file originale e altri nella directory /usr/share/
arduino/hardware/arduino/bootloaders su un sistema Linux, oppure in C:\Program
Files\Arduino\hardware\arduino\avr\bootloaders su un sistema Windows.
In questo codice, ciascuna riga contiene un codice di partenza (il carattere :), un
conteggio di byte (che in tutte tranne che nelle quattro ultime righe del nostro
esempio lesadecimale 10, o 16), la posizione nella quale deve essere scritto il
codice nella memoria flash della MCU (il bootloader pu alterarla se necessario), un
codice tipo record, il codice vero e proprio scritto fino a 32 caratteri ASCII
esadecimali (2 caratteri per byte, per 16 byte) e un checksum end-of-line. Trovate
maggiori informazioni sul formato di file esadecimale Intel su Wikipedia
(https://en.wikipedia.org/wiki/Intel_HEX), anche se raramente si rende necessario
esaminare direttamente un file esadecimale.
Per convertire un eseguibile binario in un file esadecimale, potete utilizzare objcopy:

objcopy, come quasi tutti gli strumenti GNU, sa fare molto di pi e offre una vasta
gamma di opzioni a linea di comando, la maggior parte delle quali non avrete mai
loccasione di utilizzare. Il manuale online di objcopy si trova su Sourceware.org
(http://bit.ly/sw-objcopy).
avr-ranlib
avr-ranlib genera un indice per linclusione in un file archivio di oggetto binario.
Questo aiuta ad rendere pi agile il processo di collegamento, dal momento che
questo quello che utilizzer il linker per trovare lindirizzo di un oggetto necessario
per riempire un vuoto in un altro file oggetto. Se lindice non disponibile, il linker
deve analizzare il file della libreria, oggetto per oggetto, cercando la corrispondenza
adatta.

avr-libc
avr-libc una versione AVR della libreria di runtime di C/C++. Insieme ad avr-gcc e ad
avr-binutils, forma il cuore della toolchain GNU per microcontroller AVR.
Le librerie esterne fornite con la toolchain AVR, come arv-libc, dovrebbero trovarsi in
una posizione standard, che su un sistema Linux sarebbe qualcosa come /usr/lib/avr/lib/
oppure /usr/local/avr/lib, a seconda di come stato costruito avr-gcc e di come
configurato il sistema. Ma, in realt, le librerie esterne possono trovarsi in qualsiasi
directory, purch il linker riesca a trovarle.
avr-libc un componente cruciale non fornito con avr-gcc e binutils. Si tratta di una
libreria C/C++ standard che contiene gli equivalenti AVR delle stesse funzioni che si
trovano in una libreria C standard (cio libc GNU), con alcuni limiti dovuti alle funzionalit
delle MCU AVR (memoria disponibile limitata, per esempio).
La Tabella 6-3 elenca i file include disponibili con avr-libc. Se avete esperienza con la
programmazione C o C++ su un sistema completo, la maggior parte di essi vi risulter
familiare.
Tabella 6-3 - I file include pi comuni forniti da avr-libc.
Nome del file Descrizione
alloca.h Alloca spazio dello stack frame del caller
assert.h Testa unespressione per un risultato falso
ctype.h Macro di conversione dei caratteri e macro ctype
errno.h Definisce codici di errori di sistema
inttypes.h Conversioni di tipi numeri interi
math.h Funzioni matematiche di base
setjmp.h Definisce metodi goto non locali setjmp() e longjmp()
stdint.h Definisce tipi numeri interi standard
stdio.h Standard I/O facilities
stdlib.h Utility generali
string.h Operazioni sulle stringhe e utility

Alcuni dei file include forniti con avr-libc sono unici per lAVR target e sono elencati nella
Tabella 6-4. Questi file include si trovano nella directory /usr/lib/avr/include/avr (su un
sistema Linux). Alcuni definiscono funzioni e costanti per cose come la gestione
dellavvio, i ritardi, laccesso alla EEPROM, limpostazione dei fuse e le funzioni dei pin
delle porte. Altri definiscono gli interrupt e la mappatura degli I/O per tipi specifici di
processore.
Tabella 6-4 - I file include specifici per AVR forniti da avr-libc.

boot.h io90pwm316.h iom169pa.h iom32u2.h iomx8.h iotn45.h


iox128a3.h builtins.h io90pwm3b.h iom169p.h iom32u4.h iomxx0_1
iotn461a.h iox128d3.h common.h io90pwm81.h iom16a.h iom32u6
iomxx4.h iotn461.h iox16a4.h cpufunc.h io90pwmx.h iom16.h
iom406.h iomxxhva.h iotn48.h iox16d4.h crc16.h io90scr10
iom16hva2.h iom48.h iotn10.h iotn4.h iox192a3.h delay.h
ioa6289.h iom16hva.h iom48p.h iotn11.h iotn5.h iox192d3
eeprom.h ioat94k.h iom16hvb.h iom640.h iotn12.h iotn84a.h
iox256a3b.h fuse.h iocan128.h iom16hvbrevb.h iom644.h iotn13a.h
iotn84.h iox256a3.h interrupt.h iocan32.h iom16m1.h iom644p
iotn13.h iotn85.h iox256d3.h io1200.h iocan64.h iom16u2
iom644p.h iotn15.h iotn861a.h iox32a4.h io2313.h iocanxx.h
iom16u4.h iom6450.h iotn167.h iotn861.h iox32d4.h io2323.h
io.h iom2560.h iom645.h iotn20.h iotn87.h iox64a1.h
io2333.h iom103.h iom2561.h iom6490.h iotn22.h iotn88.h
iox64a1u.h io2343.h iom1280.h iom3000.h iom649.h iotn2313a
iotn9.h iox64a3.h io43u32x.h iom1281.h iom323.h iom649p
iotn2313.h iotnx4.h iox64d3.h io43u35x.h iom1284p.h iom324.h
iom64c1.h iotn24a.h iotnx5.h lock.h io4414.h iom128.h
iom324pa.h iom64.h iotn24.h iotnx61.h parity.h io4433.h
iom128rfa1.h iom3250.h iom64hve.h iotn25.h iousb1286.h pgmspac
io4434.h iom161.h iom325.h iom64m1.h iotn261a.h iousb128
portpins.h io76c711.h iom162.h iom328p.h iom8515.h iotn261.h
iousb162.h power.h io8515.h iom163.h iom3290.h iom8535
iotn26.h iousb646.h sfr_defs.h io8534.h iom164.h iom329.h
iom88.h iotn28.h iousb647.h signal.h io8535.h iom165.h
iom32c1.h iom88pa.h iotn40.h iousb82.h signature.h io86r401
iom165p.h iom32.h iom88p.h iotn4313.h iousbxx2.h sleep.h
io90pwm1.h iom168.h iom32hvb.h iom8.h iotn43u.h iousbxx6
version.h io90pwm216.h iom168p.h iom32hvbrevb.h iom8hva.h iotn44a.h
iox128a1.h wdt.h

avr-libc include anche numerose utility e file include per la compatibilit, come mostra la
Tabella 6-5. I file delay.h, crc16.h e parity.h che si trovano nella directory avr/ in realt
puntano a file include che si trovano nella directory util/, per cui se nel vostro codice
includete, per esempio, <avr/parity.h>, in realt verr utilizzato <util/parity.h>.
Tabella 6-5 - File include utility e per la compatibilit forniti da avr-libc.

Nome del file Descrizione


util/atomic.h Blocchi di codice eseguiti atomicamente e non atomicamente
util/crc16.h Calcoli CRC
util/delay.h Funzioni per loop di ritardo busy-wait
util/delay_basic.h Loop di ritardo busy-wait di base
util/parity.h Generazione bit di parit
util/setbaud.h Macro helper per calcoli di baud rate
util/twi.h Definizioni maschere di bit TWI
compat/deprecated.h Elementi obsoleti
compat/ina90.h Compatibilit con IAR EWB 3.x

Per maggiori informazioni sulluso di avr-libc potete consultare il manuale utente e non
dimenticate di controllare i file include per vedere se presentano note riguardo alle loro
applicazioni e i loro limiti. Tenete presente che cose come malloc() e printf(), anche
se possono essere utilizzate con una MCU AVR, presentano dei limiti nellambiente con
poca memoria dellAVR. Un altro problema la matematica, dal momento che le MCU
AVR non dispongono di funzioni matematiche a virgola mobile. Supportano calcoli di
numeri interi e a virgola fissa, ma i calcoli a virgola mobile devono essere eseguiti
utilizzando una simulazione, che lenta, per cui da evitare il pi possibile.
La home page di avr-libc si trova su http://www.nongnu.org/avr-libc/.
NOTA Una versione compressa bzip2 della documentazione utente in PDF si trova su http://bit.ly/avr-libc-manual. La
documentazione di avr-libc parla anche della toolchain AVR.

Costruire programmi C o C++ a partire da zero


Se volete costruire il vostro software senza utilizzare lIDE di Arduino, il suo runtime
AVR-GCC e le sue librerie standard, potete certamente farlo. Tuttavia, non sempre
facile riuscire a far funzionare qualcosa utilizzando gli strumenti di Arduino e poi
continuare a riscrivere le parti che hanno bisogno di ottimizzazione o personalizzazione.

Compilare con avr-gcc o avr-g++


Quello che fanno avr-gcc o avr-g++ internamente con il codice sorgente non qualcosa
di cui normalmente dovreste preoccuparvi, ma, naturalmente, potete analizzare pi nel
dettagli gli strumenti GCC su GNU.org (https://gcc.gnu.org/onlinedocs/gccint).
I comandi gcc e g++ in realt fanno ben pi che soltanto compilare il codice sorgente. Se
utilizzate un comando come questo:

gcc compila test_src.c per lATmega32U4, chiama avr-ld per collegarlo al file di nome
libruntime.a che si trova in ../avrlibs e quindi inserisce il risultato finale in unimmagine
eseguibile binaria di nome test.
Se volete semplicemente che il compilatore compili qualcosa in un file oggetto per
collegarlo nel passaggio successivo, potete utilizzare lo switch -c (solo compilazione).
Questo comune nei makefile dove prima si compilano diversi file sorgente e poi li si
collega in un file eseguibile (possibilmente anche con librerie esterne) come passaggio
finale. Il comando per farlo semplice:
avr-gcc supporta anche una suite di switch per cose come ottimizzazione, avvisi e
percorsi alternativi per i file include (header).

Diversi file sorgente e make


Quando si lavora con diversi file sorgente, lutility make essenziale. Potete scrivere il
vostro proprio makefile (che quello che di solito faccio io), oppure utilizzare uno
strumento come arduino-mk. Questo un makefile predefinito che incorpora la logica
necessaria per costruire sketch di Arduino utilizzando i componenti della toolchain AVR-
GCC.
Potete scaricare arduino-mk da GitHub. Per alcune piattaforme Linux disponibile nella
forma di un pacchetto da installare. Se lo installate da un gestore di pacchetti, notate
che molto probabilmente inserir il file principale, arduino-mk, nella stessa directory
dove lIDE di Arduino ha installato i suoi componenti. Il sito web principale si trova su
Hardware Fun (http://bit.ly/hf-makefile) e potete scaricare un archivio ZIP da GitHub
(http://bit.ly/gh-makefile). Una volta installato arduino-mk, probabilmente dovrete
installare alcune ulteriori funzioni di supporto e definire alcune variabili globali
dellambiente shell. Trovate maggiori dettagli nella documentazione sul sito web
Hardware Fun.
Se non avete dimestichezza con il linguaggio dei makefile, utilizzarli pu richiedere una
curva di apprendimento ripida, ma secondo me vale la pena, se volete andare oltre lIDE
e passare nel regno del vero sviluppo dei sistemi integrati. Non tutte le MCU hanno a
disposizione un IDE e non tutti gli IDE sanno fare tutto quello che si pu fare quando si
ha il controllo diretto del processo di costruzione. Per creare un makefile semplice come
quello che segue, possiamo riutilizzare i concetti dellEsempio 5-5. In questo caso,
stiamo fornendo la nostra propria funzione main() nel file sorgente main.cpp,
lequivalente delle funzioni setup() e loop() in alarmloop.c, delle variabili globali in
globals.c e delle dichiarazioni #define nel file defs.h. Il nostro makefile si presenta cos:
La directory di questo semplice progetto deve contenere, come minimo:

Semplicemente digitando make diamo inizio al processo. make cerca nella directory
corrente un file di nome Makefile (notate la M maiuscola, che obbligatorio) e se lo
trova lo carica e lo elabora. Se volete potete assegnare al makefile un altro nome
indicando a make che cosa cercare, come per esempio qui:

Il nostro makefile desempio ha diverse caratteristiche che vale la pena descrivere


brevemente. Innanzitutto c la dichiarazione dei nomi alias, come CC, LD e SRCS.
Questi vengono espansi quando vengono trovati pi avanti nel file e permettono di
risparmiare molte digitazioni ripetitive, oltre a eseguire sostituzioni con dichiarazioni
condizionali.
Unaltra cosa da notare sono le regole. In questo caso, ho utilizzato regole esplicite nella
forma di:

Laction rientrata utilizzando un carattere di tabulazione. make richiede


obbligatoriamente questo come parte della sua sintassi e quindi qui dovete fare
attenzione a non utilizzare spazi. Inoltre, notate che sotto una regola possono esserci
tutte le azioni che volete, purch ciascuna risieda sulla propria riga e sia preceduta da
una tabulazione.
Quando make valuta una regola, guarda le dipendenze per determinare che cosa
necessario per costruire il target. Nel caso di main.o, la regola specifica main.c e gli
altri file include (header), che sono definiti dalla macro $(HDRS). Se il target non esiste
ancora, verr sempre costruito, ma se esiste make cercher di vedere se qualcuna
delle dipendenze cambiata esaminando lora e la data dei file. Soltanto se sono
avvenuti dei cambiamenti, il target verr compilato di nuovo. Nel caso di $ (TARGET), la
regola impone che, se qualcuno degli oggetti sorgente cambiato, devono avvenire due
azioni successive (collegamento e conversione delloggetto).
Quindi, per esempio, se modificate alarmloop.c in modo che cambi qualcosa e poi
eseguite make, la prima cosa che far sar compilare di nuovo alarmloop.c per creare
un nuovo alarmloop.o. Quindi ricostruir $(TARGET), dal momento che loggetto
alarmloop.o adesso cambiato. Se il file include alarmloop.h cambiato, prima di
ricostruire $(TARGET) compiler di nuovo sia main.c sia alarmloop.c.
Creare un makefile pu rivelarsi abbastanza noioso, ma, una volta fatto, di solito non
necessario modificarlo molto spesso, eccetto forse per aggiungere un nuovo modulo
sorgente oppure cambiare limpostazione di uno switch del compilatore o del linker.

Il linguaggio assembly di AVR


Per coloro che davvero desiderano ottenere le massime prestazioni da un dispositivo
AVR, esiste la programmazione in linguaggio assembly. Che certamente non indicata
per i deboli di cuore, ma permette di assumere un controllo completo di quello che fa la
MCU e di quando lo fa. In alcune situazioni, questo livello di controllo pu rivelarsi
necessario per ottenere le prestazioni migliori possibili con la quantit minima di
memoria programma. Nel caso di alcune delle MCU AVR, come la serie ATtiny, in realt
il linguaggio assembly lunico modo di procedere, dal momento che un programma C o
C++ pu essere facilmente compilato in qualcosa che sarebbe troppo grande per
adattarsi alla quantit limitata di memoria.
In questo paragrafo, forniamo una panoramica molto di alto livello della programmazione
in linguaggio assembly per AVR. Come abbiamo annunciato nella prefazione, questo
libro non un tutorial di programmazione, ma un manuale di riferimento sullhardware e
una guida per trovare fonti di informazioni pi dettagliate. Lobiettivo di questo paragrafo
fornire unidea generale di che cosa comporta la programmazione in linguaggio
assembly, in modo che possiate decidere se qualcosa in cui vi volete avventurare. Per
fare giustizia a questo argomento ci vorrebbe un libro molto, molto pi lungo.
Fortunatamente, ne esistono gi molti e potete scaricare moltissime informazioni utili da
diversi siti web, come quelli elencati in Le fonti del linguaggio assembly per AVR a
pagina 146.
Dal momento che il linguaggio assembly pi vicino allhardware di qualsiasi altro
linguaggio, a volte viene detto linguaggio macchina. In realt, il linguaggio macchina
composto dai codici binari di varie istruzioni, mentre il linguaggio assembly una forma
del linguaggio macchina che pu essere letta dagli umani. Il compito dellassembler
tradurre da leggibile per gli umani a leggibile per le macchine e anche aggiungere alcune
funzionalit utili come macro, nomi simbolici, inclusioni condizionali e la possibilit di fare
riferimento a funzioni che si trovano in librerie esterne.
In linguaggio assembly, possiamo scrivere qualcosa come MOV R6, R7, che copia i
contenuti del registro R7 nel registro R6 e che verr tradotto dallassembler in una
forma binaria (linguaggio macchina) che possa essere eseguita dalla MCU. I nomi che si
utilizzano per le varie operazioni svolte dal processo della MCU vengono detti mnemonici
e i parametri che seguono un mnemonico (se esistono) vengono detti operandi.
Programmare in linguaggio assembly larte di fornire le dettagliate istruzioni passo a
passo necessarie perch una CPU possa fare qualcosa di utile. Un linguaggio come C si
occupa dei dettagli, per cui il programmatore non deve decidere quali registri utilizzare e
quali bit di stato controllare. Nel caso del linguaggio assembly, tra il programmatore e la
logica fondamentale del processore non c niente e deve essere descritta perfino
loperazione pi semplice.

Il modello di programmazione AVR


Internamente, una MCU AVR consiste di un core AVR, di memoria flash ed EEPROM e
di una suite di funzioni periferiche. Il core contiene un registro e decodificatore di
istruzioni, un contatore di programma, una piccola quantit di RAM, vari bit di stato, 32
registri per scopi generali e una ALU (Arithmetic Logic Unit). La Figura 6-5 mostra come
sono organizzati i vari componenti allinterno di una MCU AVR. Nel Capitolo 2 e nel
Capitolo 3 trovate ulteriori dettagli sulle funzioni interne delle MCU AVR.
Figura 6-5 - Il diagramma a blocchi della CPU dellAVR.

Le istruzioni agiscono sui registri e sulla memoria, nel senso che i dati possono essere
copiati da un registro allaltro; che due registri possono essere confrontati, scambiati,
sommati, sottratti, moltiplicati e divisi (per citare alcune delle operazioni possibili); e che
i dati possono essere letti nella memoria flash, EEPROM, oppure RAM. Anche le
funzioni periferiche sono controllate e vi si accede per mezzo dei registri, ma queste non
fanno parte del core dei 32 registri per scopi generali. Le tre funzionalit principali della
MCU (memoria, istruzioni e registri) sono descritte di seguito.
Lorganizzazione della memoria
Come abbiamo menzionato nel Capitolo 2, la MCU AVR di Atmel utilizza quella che
viene detta unarchitettura Harvard. In unarchitettura Harvard, il codice del
programma viene salvato nella memoria a sola lettura (flash) e i dati che possono
essere modificati (le variabili) vengono salvati in uno spazio di memoria separato (la
RAM nel core dellAVR). Altri microprocessori possono utilizzare uno schema
alternativo che viene detto architettura Von Neumann, nella quale i programmi e i dati
condividono lo stesso spazio di memoria.
In una MCU AVR, i registri per scopi generali e i registri I/O utilizzati dalle funzioni
periferiche tecnicamente fanno parte dello spazio di memoria lettura/scrittura. La
Figura 6-6 mostra come organizzata la memoria nella MCU AVR.

Figura 6-6 - Il layout della memoria dellAVR.

La Figura 6-6 intenzionalmente generica. Le direttive CSEG, DSEG e ESEG


dellassembler (utilizzate dallassembler di Atmel) si riferiscono rispettivamente al
codice, ai dati e agli spazi di memoria EEPROM. Gli indirizzi pi alti per gli spazi di
memoria CSEG, DSEG e ESEG variano da un tipo di AVR allaltro. Notate che
space alla fine dello spazio CSEG riservato un bootloader facoltativo.
Lelaborazione delle istruzioni
Una MCU AVR utilizza quella che viene detta pipeline a livello singolo per ricavare,
decodificare ed eseguire le istruzioni provenienti dalla memoria flash. Mentre viene
eseguita unistruzione, la successiva viene previamente estratta dalla memoria e
diventa pronta per essere decodificata ed eseguita appena listruzione corrente
stata completata. Questa funzionalit e la natura RISC del core AVR quello che
permette a una MCU AVR di eseguire la maggior parte delle istruzioni in un unico
ciclo del clock.
I registri
Molte delle istruzioni AVR impostano oppure cancellano bit in un registro di stato da
8 bit (SREG). Ciascun bit ha uno scopo preciso, come mostra la Tabella 6-6 e lo
stato vero o falso (1 o 0) di alcuni bit viene controllato da istruzioni come BREQ
(Branch if Equal) o BRNE (Branch if Not Equal) a seguito di unistruzione CP
(Compare), che pu alterare i bit di stato Z, C, N, V, H e S.
Tabella 6-6 - I bit di stato SREG di AVR.
Bit Simbolo Funzione
0 C Flag di carry
1 Z Flag di zero
2 N Flag negativo
3 V Indicatore di overflow del complemento a due
4 S Per test firmati
5 H Flag di half carry
6 T Transfer bit utilizzato dalle istruzioni BLD e BST
7 I Flag per attivare/disattivare gli interrupt globali
I 32 registri per scopi generali sono organizzati come registri a 8 bit, con le tre
coppie finali (26-27, 28-29 e 30-31) disponibili come registri di indice a 16 bit
(indirizzo indiretto), riferiti rispettivamente ai puntatori X, Y e Z.
Un numero limitato di istruzioni pu agire su due registri a 8 bit come una coppia di
registri a 16 bit. Il registro con il numero pi basso della coppia contiene i bit meno
significativi. Anche il registro meno significativo deve avere un numero pari e quindi la
coppia r0:r1 valida, ma r1:r2 no.
Oltre al registro di stato, i registri per scopi generali e i registri I/O, lAVR dotato di
un registro PC (program counter) e di un registro SP (stack pointer). Questi vengono
modificati da certe istruzioni (un jump modifica il PC, per esempio) o da una
chiamata di subroutine, che utilizza sia il registro PC che il registro SP. Per esempio,
quando viene incontrata unistruzione CALL il valore corrente del PC viene regolato in
modo che punti allistruzione che segue CALL, per poi essere spinta nello stack. Il
PC viene quindi caricato con lindirizzo iniziale della subroutine. Quando la subroutine
ritorna per mezzo di unistruzione RET, il PC salvato viene estratto dallo stack e il
programma ritorna al punto immediatamente seguente listruzione CALL.
Ovviamente ci sono molti altri dettagli che riguardano il funzionamento interno delle MCU
AVR e del linguaggio assembly per AVR dei quali non abbiamo parlato qui. Se
desiderate esplorare la programmazione in linguaggio assembly con un AVR, vi consiglio
caldamente di leggere uno o due buoni libri. LAppendice D contiene alcuni consigli e
anche i link gi menzionati sono molto utili.

Creare programmi in linguaggio assembly per AVR


A seconda dellassembler, i commenti di una sola riga possono cominciare con un punto
e virgola (;), il simbolo del cancelletto (#), oppure con qualche altro carattere.
Lassembler GNU (avr-as) supporta i commenti di pi righe che cominciano con /* e
finiscono con */, come quelli che si trovano nel codice C. Trovate maggiori informazioni
sulla documentazione del vostro assembler.
I commenti in linguaggio assembly sono molto importanti. Immaginate, per esempio, di
avere del linguaggio assembly che si presenta cos:

A che cosa serve? In questo caso, abbastanza facile vedere che tutto quello che fa
caricare il registro 16 (R16) con un valore pari a 0 o a 255 (0xFF) e poi scrivere quel
valore su PORTB. I pin di PORTB si attiveranno o disattiveranno velocemente quando la
MCU riesce a eseguire il ciclo.
Possiamo migliorare questo e aggiungervi il resto dei bit mancanti per cose come
lorigine del programma e linizializzazione delle porte. Ecco come si presenta il risultato:

Qui forse ho esagerato con i commenti, ma in linguaggio assembly non infrequente


trovare un commento quasi in ogni riga. Tenete presente che, per ottenere lo stesso
risultato, perfino qualcosa di semplice come il diffuso programma hello world in
linguaggio assembly richiede molte pi istruzioni che in C o C++ e che alcune delle
istruzioni dellassembler possono non risultare immediatamente ovvie.
La maggior parte degli assembler mette a disposizione una serie di parole chiave
predefinite che vengono dette direttive. Nellesempio precedente ne appare una: la
direttiva .ORG. La Tabella 6-7 elenca alcune altre direttive utili. Queste parole chiave
vengono dette direttive perch chiedono allassembler di eseguire determinate
associazioni oppure determinate azioni.
Tabella 6-7 - Le direttive dellassembler dellAVR.

Direttiva Operazione
BYTE Riserva uno o pi byte come variabile
CSEG Utilizza il segmento di codice
CSEGSIZE Configura la dimensione della memoria del segmento di codice
DB Definisce un byte o dei byte costanti
DEF Definisce un nome simbolico per un registro
DEVICE Definisce per quale dispositivo assemblare (il target)
DSEG Utilizza il segmento di dati
DW Definisce una parola o delle parole costanti (valori da 16 bit)
ENDM,
Fine della definizione di una macro
ENDMACRO
EQU Assegna un simbolo a unespressione
ESEG Utilizza il segmento EEPROM
EXIT Esce dal file
INCLUDE Legge e include sorgenti da un altro file
LIST Attiva la generazione dei file di elenco
LISTMAC Attiva lespansione macro nel file di elenco
MACRO Inizia la definizione di una macro
NOLIST Disattiva la generazione dei file di elenco
ORG Imposta lorigine del programma
SET Assegna un simbolo a unespressione

I frammenti di codice che seguono mostrano come possono essere utilizzate alcune
delle direttive.
Le fonti del linguaggio assembly per AVR
Se volete immergervi pi in profondit nel linguaggio assembly per AVR, online potete
trovare molte ottime fonti di informazione e utili tutorial:
Il sito AVR Assembler (http://avr-asm.tripod.com/) offre moltissime informazioni,
tutte ben organizzate in varie categorie.
AVRbeginners.net (http://www.avrbeginners.net/) un sito web molto pratico con
moltissimi dettagli sul funzionamento interno delle MCU AVR e alcuni esempi di
linguaggio assembly.
Atmel offre il manuale di riferimento online AVR Assembler (http://bit.ly/avr-
assembler) e una descrizione dellassembler di Atmel si trova nellAVR Assembler
User Guide (http://bit.ly/avr-assembler-guide). Non uguale allassembler avr-as,
ma i principi generali sono simili.
Lassembler avr-as descritto nella documentazione che si trova presso GNU
Manuals Online (http://bit.ly/gnu-manuals) e ne offre una breve panoramica anche
la documentazione di avr-libc.
Gerhard Schmidt ha creato un sito web (http://bit.ly/avr-overview) con moltissime
informazioni utili, disponibile sia in inglese che in tedesco. Il materiale disponibile
anche nella forma di un file PDF (http://bit.ly/avr-overview-pdf).
Presso il sito web della Johns Hopkins University (http://bit.ly/jhu-assembler)
potete scaricare un riassunto del linguaggio assembly.
Questa era soltanto la punta delliceberg, per cos dire. NellAppendice D trovate alcuni
libri consigliati.

Caricare codice eseguibile sullAVR


Compilare o assemblare codice in un file eseguibile soltanto la met del processo.
Laltra met consiste nel caricare il codice eseguibile in una MCU AVR perch venga
eseguito.
Esistono diversi modi per farlo, come per mezzo del bootloader di Arduino,
dellinterfaccia ICSP che si trova su molte schede Arduino (ameno, i pin importanti di
solito sono disponibili) e di uninterfaccia JTAG.

La programmazione in-system
La nota applicativa AVR910 (http://bit.ly/avr-insystem) di Atmel descrive linterfaccia di
programmazione utilizzata sulle MCU AVR. Questa quella che sulle schede Arduino
viene detta interfaccia ICSP. Fondamentalmente, si tratta di unestensione
dellinterfaccia SPI della MCU AVR. Questa funzione (I/O seriale) stata mostrata
come blocco funzionale separato nella Figura 6-5, dal momento che ha la capacit di
comunicare direttamente con la memoria flash ed EEPROM della MCU.

La durata della memoria flash


Tutte le memorie flash possono eseguire soltanto un numero limitato di operazioni di scrittura. Nei componenti
moderni, di solito si tratta di un numero ampio (che pu variare da un componente allaltro), che non
infrequente che corrisponda a 10.000 o pi cicli. Questo potrebbe non sembrare molto, quando lo si compara
con la quantit di lavoro che normalmente esegue un hard disk in un computer desktop, ma dobbiamo tenere
presente che, anche se pu essere visto come un tipo di ard disk lento (come una memoria USB), la memoria
flash di un microcontroller non un hard disk. La si utilizza per caricare un programma da eseguire e non per
ospitare i dati di runtime AVR-GCC durante il funzionamento (di solito per questo scopo i microcontroller hanno a
disposizione un po di RAM e qualcosa come un wafer microSD, con unaspettativa di vita di circa 100.000 cicli
di scrittura, pu essere utilizzato per registrare grandi quantit di dati di runtime AVR-GCC). Quindi, anche se
ricaricassimo i contenuti della memoria flash con il codice di un programma una volta al giorno, durerebbe
comunque 4 o 5 anni.

La Figura 6-7 mostra il pinout del connettore ICSP principale su un Arduino Uno (R2).
Sulla scheda c un secondo connettore ICSP, utilizzato per la MCU AVR che gestisce
linterfaccia USB. Il collegamento lo stesso, ma in realt non c motivo di utilizzarlo a
meno che non si abbia bisogno di riprogrammare anche questa MCU (e magari di
perdere la funzionalit USB). Notate che c anche un formato di connettore da 10 pin
definito da Atmel, ma che non viene utilizzato sulla maggior parte delle schede di tipo
Arduino. Il connettore da 10 pin ha gli stessi segnali del connettore da 6 pin e pi
collegamenti con la messa a terra che occupano gli altri 4 pin.
Figura 6-7 - Il connettore ICSP su un Arduino Uno R2.

In I binutils a pagina 135 abbiamo descritto lo strumento avr-objcopy, concentrandoci


sulla conversione di unimmagine eseguibile binaria in un file ASCII esadecimale. Il
motivo per convertire limmagine binaria in un file esadecimale la possibilit per il
formato esadecimale Intel hex di definire segmenti di record, indirizzi e la fine del file e
quindi di inviare i dati su un link di comunicazione che potrebbe avere problemi con dati
binari puri. Per programmare la memoria flash la MCU AVR utilizza dati binari, ma se
guardate la nota applicativa AVR910 potete vedere che, qualunque cosa stia facendo la
programmazione, ha moltissimo controllo sul processo. Il file esadecimale viene
utilizzato da un dispositivo di programmazione e non dalla MCU AVR.

Programmare con il bootloader


Nel caso di una scheda Arduino, il dispositivo di programmazione il bootloader nella
memoria flash. Questo permette alla MCU di programmarsi da sola, al prezzo di
perdere un po dello spazio della memoria flash per contenere il bootloader. In assenza
del bootloader, avere a che fare con il posizionamento finale dei dati (indirizzi target), la
configurazione dei bit della MCU (fuse) e altri dettagli di basso livello diventano compiti
del dispositivo di programmazione (per maggiori dettagli sui fuse bit utilizzati nelle MCU
AVR, potete leggere I fuse bit a pagina 62).
importante notare che il firmware del bootloader di Arduino utilizza i pin dellinterfaccia
seriale dellAVR (RxD e TxD rispettivamente sui pin D0 e D1), e quindi se volete
collegare qualcosa come un convertitore RS-232 potete utilizzarlo per programmare
lAVR, oppure potete utilizzare un adattatore USB-seriale come il modulo di SparkFun
mostrato nella Figura 6-8. Sulle schede Arduino che per linterfaccia USB utilizzano un
FTDI FT232L, un ATmega8, oppure un ATmega16U2, una rapida occhiata allo schema
mostra che il chip dellinterfaccia o la MCU stanno utilizzando i pin seriali D0 e D1
attraverso resistenze da 1K e che per generare un reset della MCU AVR principale si
utilizza il segnale DTR.

Figura 6-8 - Ladattatore USB-seriale di SparkFun.

Potete sempre utilizzare i pin D0 e D1, sempre che siano isolati correttamente. Lo
schema parziale della Figura 6-9 mostra come un FTDI FT232L di solito collegato a
una MCU AVR su Arduino. Notate che questo non vale per la Leonardo e altre schede
dotate dellATmega32U4, che hanno uninterfaccia USB integrata.
Figura 6-9 - Linterfaccia USB di Arduino utilizzando un convertitore IC FTDI.

Caricare senza il bootloader


Se per un programma davvero avete bisogno di utilizzare il massimo spazio a
disposizione sulla memoria flash dellAVR, oppure se non volete utilizzare i pin D0 e D1
nel modo standard di Arduino di caricare un programma, potete caricare un programma
compilato direttamente utilizzando linterfaccia ICSP. Questo approccio funziona con una
MCU ATmega nuova fornita direttamente da Atmel, oltre che con una scheda Arduino.
Caricare senza lIDE di Arduino richiede uninterazione diretta con lutility AVRDUDE
(descritta in AVRDUDE a pagina 155). Di solito, questo coinvolge anche lutilizzo di
makefile o di qualche altra tecnica per produrre codice compilato.
Se volete comodamente lasciare che sia lIDE di Arduino a occuparsi di gran parte della
compilazione, potete scegliere anche questa via. LIDE di Arduino supporta la
programmazione diretta dei dispositivi AVR permettendo di selezionare un dispositivo di
programmazione in una voce di menu sotto Tools nel menu principale. Quindi si pu
avviare un upload utilizzando la funzione Upload Using Programmer che si trova nel
menu File. Se avete sovrascritto il firmware del bootloader e poi decidete di tornare
indietro per utilizzare il bootloader nel modo convenzionale, dovete ricaricarlo come
descritto in Sostituire il bootloader a pagina 159.
Ovviamente, se lo spazio di memoria non un problema e il bootloader di Arduino gi
stato installato, non c bisogno di eliminare il bootloader. Linterfaccia ICSP funziona
bene con o senza il bootloader. Se scegliete di utilizzare linterfaccia ICSP, potete
semplicemente ignorarlo.
La vita senza il bootloader richiede un dispositivo di programmazione speciale. Alcuni
strumenti di Atmel, come lAVRISP MKII e il nuovo Atmel-ICE, sono ottimi standard, per
via delle loro capacit e compatibilit. Purtroppo, Atmel ha smesso di produrre lAVRISP
MKII, a favore dellAtmel-ICE, ma attualmente esistono molti dispositivi compatibili.
LAVRISP MKII non supportava JTAG.
Tuttavia, dal momento che linterfaccia ISP essenzialmente una porta seriale SPI, per
raggiungere il vostro scopo potete utilizzare una vasta gamma di dispositivi, compresa
unaltra scheda Arduino (tra poco ne parleremo pi approfonditamente). Alcuni
dispositivi di programmazione facili da trovare sono anche lUSBtinyISP di Adafruit
(Figura 6-10) e il Pocket AVR Programmer di SparkFun (Figura 6-11).

Figura 6-10 - LUSBtinyISP di Adafruit (assemblato).

Figura 6-11 - Il Pocket AVR Programmer di SparkFun.

LUSBtinyISP un kit, ma relativamente facile da assemblare. Trovate maggiori


informazioni sul sito web di Adafruit (http://bit.ly/usbtinyisp-avr). Il Pocket AVR
Programmer viene gi preassemblato e potete trovare ulteriori informazioni su SparkFun
(http://bit.ly/sf-pocketavr).
Inoltre, per caricare software su un AVR, si pu utilizzare anche un programmatore che
legga i registri, esamini la memoria e imposti i fuse bit. La possibilit di impostare fuse
bit un motivo imprescindibile per avere a portata di mano un qualche dispositivo ISP.
Per ulteriori informazioni sui fuse bit, potete leggere I fuse bit a pagina 62.

JTAG
JTAG, lacronimo di Joint Test Action Group, uninterfaccia di basso livello progettata
per fornire laccesso alle funzionalit di debugging incorporate in una MCU o in un altro
dispositivo logico. La definizione formale si trova sul documento IEEE Standard Test
Access Port and Boundary-Scan Architecture, IEEE Standard 1149.1-1990. La
versione pi recente di questo e altri standard si trova presso IEEE
(https://standards.ieee.org/).
Non tutte le MCU AVR offrono il supporto di JTAG. Per quello che posso dire
basandomi sulle guide e le schede tecniche di Atmel, la serie di dispositivi XMEGA lo
offre, ma i componenti della serie Mega da 8 bit (come quelli utilizzati sulle schede
Arduino) no. Tuttavia, dal momento che esistono molti tipi di MCU AVR, perfettamente
possibile che alcuni componenti XMEGA non lo presentino e alcuni componenti Mega s.
Nella maggior parte dei casi, per, non avrete bisogno delle funzionalit avanzate di
JTAG. bello quando volete analizzare il codice passo a passo con un debugger,
oppure esaminare al volo i contenuti dei registri, ma pi spesso semplicemente
controllare i pin con un oscilloscopio o un analizzatore logico vi fornir moltissime
informazioni.
Per accedere alle funzioni interne di un AVR, potete utilizzare qualcosa come
USBtinyISP per impostare i fuse bit interni dellAVR oppure per caricare la EEPROM.
Quindi, a meno che non abbiate unimpellente necessit di uno strumento JTAG,
probabilmente potete risparmiarvi questo acquisto.

AVRDUDE
Disporre di un programmatore AVR conviene, ma questo ha bisogno di qualcosa che gli
fornisca i dati da caricare nella MCU AVR. Questo qualcosa si chiama AVRDUDE.
AVRDUDE, o AVR Download UploaDEr, un programma utility per caricare e scaricare
codice e dati dagli spazi di memoria di una MCU AVR. La Figura 6-12 mostra loutput
che AVRDUDE genera quando viene eseguito senza nessun argomento.
Figura 6-12 - Louput dellaiuto di AVRDUDE.

AVRDUDE pu anche programmare la memoria EEPROM della scheda e anche i fuse e


lock bit. Lo strumento gira sia nella linea di comando sia in modalit interattiva. La
modalit a linea di comando utile quando si vuole incorporare AVRDUDE in uno script
o in un makefile, mentre quella interattiva pu essere utilizzata per curiosare nella
memoria della MCU, modificare singoli byte nella EEPROM, oppure giocherellare con
fuse o lock bit.
AVRDUDE supporta una gamma di dispositivi di programmazione, come lAtmel
STK500, lAVRISP e lAVRISP MKII, bit-banger seriali e uninterfaccia porta parallela.
Esiste un manuale in formato PDF (http://bit.ly/avrdude-pdf).
LIDE di Arduino utilizza AVRDUDE per gestire il processo di upload e potete vedere
come si presenta la linea di comando attivando loutput dellupload nella finestra di
dialogo Preferences. Ecco come si presenta quando si carica il semplice sketch
dellallarme anti intrusione che abbiamo visto nel Capitolo 5:

Le cose pi importanti da notare qui sono gli switch -p, -c, -P, -D e -U. Questi e alcuni
degli altri switch disponibili sono descritti nella Tabella 6-8. Gli switch -v multipli
semplicemente chiedono ad AVRDUDE di essere pi prolisso possibile.
Tabella 6-8 - Gli switch a linea di comando di AVRDUDE.

Switch Funzione Descrizione


Identifica la parte collegata con il programmatore. Nel
ID del
-p nostro caso, la scheda Arduino da programmare in realt
processore
dotata di un ATmega328p: una Duemilanove.
ID del Specifica il programmatore da utilizzare. In questo caso, il
-c
programmatore programmatore il bootloader di Arduino.
-C Configurazione Specifica il file di configurazione da utilizzare.
Identifica la porta alla quale collegato il programmatore.
Nome della
-P Trattandosi di un sistema Linux, si utilizza la pseudo porta
porta
seriale su /dev/ ttyUSB.
Baud rate della
-b Sovrascrive il baud rate predefinito.
porta
Cancellazione
-D Disattiva la cancellazione automatica della flash.
automatica
-U Upload Specifica dellupload.

Notate che lo switch -U nella linea di comando formato da diverse parti. Definisce la
memoria di destinazione (la flash), la modalit (scrittura) e un file sorgente che contenga
la forma esadecimale dellimmagine eseguibile. La i alla fine della stringa
dellargomento specifica che la sorgente esadecimale in formato Intel.

Utilizzare un Arduino come un ISP


Caricando un programma utility su un Arduino, potete farlo diventare un ISP per un altro
Arduino. Utilizzando questa tecnica, potete caricare un nuovo bootloader. Il sito web di
Arduino (http://bit.ly/arduino-isp) fornisce semplici istruzioni.
Essenzialmente, non necessario altro che uno sketch fornito con lIDE di Arduino e due
schede Arduino. La Figura 6-13 mostra come sono collegate le schede. In questo caso,
una Duemilanove funge da dispositivo ISP per un Uno R3. Pu funzionare anche con
schede che non hanno gli stessi pinout per i segnali dellSPI, come la Leonardo, ma in
questo caso sono necessarie alcune regolazioni. Trovate maggiori dettagli sulla
documentazione di Arduino.
Figura 6-13 - Utilizzare un Arduino come programmatore per un altro Arduino.

Lazione del bootloader


Lo scopo del bootloader accettare un programma per lAVR dal sistema di sviluppo
host. I microcontroller installati sulle schede Arduino hanno gi il bootloader preinstallato
e nel caso della maggior parte delle applicazioni raramente si rende necessario
eliminare o ricaricare il suo software. A meno che non si abbia un motivo irrinunciabile
per provare a reclamare i pochi kilobyte di memoria (a seconda del tipo e dellet del
processore) che consuma il bootloader, lapproccio pi facile semplicemente non
toccarlo e approfittare di esso.
Lazione del bootloader di Arduino simile a quella di qualsiasi altro microcontroller
dotato di memoria flash. Lobiettivo principale ottenere il programma fornito dallutente
nella memoria integrata e quindi trasferire il controllo al nuovo programma per
lesecuzione. Quando si fornisce alimentazione a un Arduino, comincia a essere eseguito
il bootloader. Quindi il bootloader cerca nuovi dati di programma provenienti
dallinterfaccia USB e, se non trova nulla dopo un breve lasso di tempo, viene eseguito il
programma caricato nella sezione principale della memoria flash.
Sulle versioni pi recenti di Arduino, la ricerca dei dati in arrivo avviene anche mentre il
processore AVR sta eseguendo un programma salvato in precedenza, in modo che,
quando viene rilevato il caricamento di un nuovo programma, il codice del programma
esistente viene interrotto e il bootloader assume il pieno controllo del processore. Sulle
schede Arduino pi vecchie, per rilevare il caricamento si deve premere il pulsante di
reset non appena lIDE inizia a caricare il programma compilato. Per farlo nel momento
giusto pu rendersi necessario farlo diverse volte. Notate che si comportano cos anche
alcune schede compatibili con Arduino.
Una volta che il bootloader ha determinato che i dati in arrivo rappresentano il
caricamento di un programma valido, sblocca la memoria flash sulla scheda e comincia
a leggere il nuovo programma e a scriverlo sulla memoria flash (ma non nella posizione
dove risiede il bootloader). Una volta completato il caricamento, la memoria viene di
nuovo bloccata in modo che non possa essere modificata accidentalmente e viene
generato un interrupt che ridiriga il processore allindirizzo iniziale del nuovo programma.
Le versioni attuali del bootloader di Arduino possono leggere dati a 19.200 baud (19,2
Kbaud), o circa 1.900 byte al secondo. Le versioni pi vecchie del bootloader
percepivano dati in arrivo a 9.600 baud e se necessario potete alterare il
comportamento dellIDE di Arduino. A 19,2K, trasferire lo sketch di un programma lungo
sul processore di destinazione pu comunque richiedere molti secondi.
Il codice sorgente del bootloader disponibile su Arduino.cc e vale la pena leggerlo, se
siete davvero curiosi di come funziona. Se lo leggete accuratamente, noterete che la
sezione che manipola la memoria flash scritta in linguaggio assembly per AVR. A
questo punto, il codice puro e interagisce con i registri di controllo interni del
microcontroller, e lassembly il linguaggio ideale per queste operazioni. Inoltre, il
codice sorgente del bootloader offre alcuni indizi su che cosa succede ai livelli pi bassi
in un microcontroller. Quando un programma viene caricato ed eseguito, dietro le quinte
avvengono moltissime cose.

Sostituire il bootloader
Se vi dovesse sorgere la necessit (o il desiderio) di installare un nuovo bootloader sul
processore AVR di un Arduino, per programmare la memoria flash del microcontroller
direttamente per mezzo della porta ICSP vi servir un dispositivo, come quelli mostrati
nelle Figure 6-10 e 6-11, oppure potete utilizzare il trucco Arduino-Arduino descritto in
Utilizzare un Arduino come un ISP a pagina 154.
In un AVR, il bootloader risiede in unarea specifica della memoria flash disponibile
soltanto per questo scopo e la dimensione disponibile va da 256 byte a 4 KB, a
seconda del tipo di AVR. LIDE di Arduino supporta il caricamento del bootloader per
mezzo di un dispositivo di programmazione come quello mostrato prima. Sotto Tools, nel
menu principale dellIDE, dovete selezionare il tipo di programmatore che avete,
compilare il bootloader e quindi caricarlo sul microcontroller AVR. Trovate maggiori
dettagli sullaiuto integrato di Arduino e sul sito web principale di Arduino.
Riepilogo
Questo capitolo ha spaziato tra diversi argomenti, dai componenti della toolchain AVR
allutility make, alla programmazione in linguaggio assembly e infine al cuore dei
bootloader AVR. Anche se non utilizzerete mai gli strumenti o le tecniche descritti qui, vi
conviene comunque sapere qualcosa di quello che succede dietro le quinte dellIDE di
Arduino. utile anche farsi unidea di comera lavorare con i sistemi integrati prima che
entrasse in scena lIDE di Arduino.
Se volete esplorare in maggiore dettaglio qualcuno degli argomenti presentati qui, vi
conviene seguire i riferimenti forniti e non dimenticarvi di leggere lAppendice D, dove
troverete ulteriori fonti di informazioni. I microcontroller integrati sono componenti chiave
della civilt moderna e per ogni computer che vedete ce ne sono molti, molti di pi che
non potete vedere, nascosti nei telecomandi dei televisori, nei forni a microonde, negli
stereo e nei riproduttori DVD, nei semafori, nelle automobili e perfino nella tastiera del
computer sulla vostra scrivania. Una volta tutti questi piccoli dispositivi venivano
programmati utilizzando le tecniche descritte brevemente in questo capitolo e molti di
loro sono ancora programmati con questi stessi metodi oggi.
7

Le librerie di Arduino

LIDE di Arduino contiene una raccolta di librerie che possono essere utilizzate con gli
sketch dei programmi. Queste contengono funzioni per accedere a dispositivi periferici
come uninterfaccia Ethernet, uno schermo a cristalli liquidi, uninterfaccia seriale
convenzionale e molti altri.
Notate che anche se il termine libreria si utilizza per descrivere codice ausiliario, i
moduli in s non sono sempre quello che potete immaginare come una libreria, nel
senso di un modulo precompilato, come le librerie .a (archive) oppure .so (shared
object) su Unix o Linux. In molti casi, sono soltanto file sorgente C o C++ standard (con i
limiti di AVR-GCC, naturalmente), ma il risultato finale ampiamente lo stesso. Il codice
delle librerie viene compilato come necessario con il codice degli sketch in file oggetto e
collegato con gli sketch (vedere Capitoli 5 e 6). In altri casi, una libreria in realt un
oggetto binario, come i componenti forniti con la suite di librerie avr-libc. Se volete
sapere da dove proviene una libreria o un modulo di codice esterno, potete consultare
sia la documentazione di avr-libc che quella di Arduino.
Dopo che lo sketch di un programma e tutti i moduli libreria sono stati compilati, lutility
linker trova i riferimenti degli indirizzi tra i componenti delle librerie e le funzioni fornite
dallutente e quindi unisce tutti i componenti in ununica image eseguibile binaria. Lutility
AVRDUDE utilizzata dallIDE (descritta nel Capitolo 6) gestisce il processo di interazione
con il bootloader della scheda (descritto nel Capitolo 5) per trasferire il codice binario
compilato su un dispositivo AVR e salvarlo nella memoria integrata del processore.
Per una panoramica del processo di sviluppo del software utilizzando lIDE di Arduino,
potete tornare al Capitolo 5. Il Capitolo 6 descrive lo sviluppo del codice utilizzando
soltanto la toolchain AVR-GCC.

I componenti delle librerie


Lambiente di sviluppo di Arduino include una selezione di librerie di supporto per cose
come I/O seriali per mezzo di un collegamento USB, EEPROM lettura/scrittura, I/O
Ethernet, uninterfaccia LCD e il supporto di servomotori e motori passo-passo, tra le
altre cose. Queste sono descritte nei prossimi paragrafi.
NOTA Per necessit, queste descrizioni sono scarne. Per maggiori dettagli ed esempi di uso potete consultare la
pagina delle librerie di Arduino (http://bit.ly/arduino-libraries)oppure la documentazione fornita nella forma di file HTML
con lIDE di Arduino (le pagine dellaiuto integrato). Tenete presente che il sito web di Arduino offre la documentazione
pi aggiornata delle versioni pi recenti delle librerie, mentre laiuto integrato nellIDE di Arduino descrive le librerie
incluse in quello specifico rilascio.

Potete esaminare lelenco delle librerie a vostra disposizione selezionando


SketchImport Library nella barra degli strumenti dellIDE. In questo modo, vedrete
anche tutte le librerie che avete aggiunto nellambiente (come si aggiungono librerie
spiegato nel Capitolo 5).
Le seguenti descrizioni riguardano le librerie fornite con uninstallazione di base dellIDE
di Arduino (ulteriori librerie sono messe a disposizione da Arduino e presso altre fonti
come i rivenditori di shield):
EEPROM
Supporta lettura e scrittura su archiviazione permanente utilizzando una EEPROM
integrata dellAVR
Ethernet
Utilizzata con la shield Ethernet di Arduino per il collegamento Ethernet
Firmata
Offre comunicazioni con applicazioni sul computer utilizzando un protocollo seriale
standard
GSM
Utilizzata con la shield GSM per collegarsi a una rete GSM/GPRS
LiquidCrystal
Contiene funzioni per controllare LCD (liquid crystal display)
SD
Fornisce il supporto per scrivere e leggere schede SD di memoria flash
Servo
Una raccolta di funzioni per controllare servomotori
SPI
Supporta lutilizzo del bus SPI (Serial Peripheral Interface)
SoftwareSerial
Implementa la comunicazione seriale sui pin digitali
Stepper
Una raccolta di funzioni per controllare i motori passo-passo
TFT
Fornisce funzioni per disegnare testo, immagini e forme sullo schermo TFT di
Arduino
WiFi
Supporta la shield WiFi di Arduino per le reti wireless
Wire
Supporta linterfaccia a due fili (TWI/I2C) per inviare e ricevere dai su un network di
dispositivi o di sensori
Esplora
Fornisce funzioni per accedere ai vari attuatori e sensori montati sulla scheda
Esplora (si utilizza solamente sulla Esplora)
USB
Utilizzata con le schede Leonardo, Micro, Due e Esplora per gli I/O seriali per mezzo
del collegamento USB
Keyboard
Invia pressioni di tasti a un computer collegato
Mouse
Controlla il movimento del cursore su un computer collegato

EEPROM
La libreria EEPROM supporta lettura e scrittura su archiviazione permanente
utilizzando una EEPROM integrata nellAVR. La EEPROM persistente e conserva tutto
quello che vi stato scritto quando viene tolta lalimentazione dalla scheda. Anche se la
memoria flash principale del microcontroller altrettanto non volatile, la EEPROM non
viene disturbata quando sulla scheda viene caricato del nuovo codice eseguibile. Vi si
deve accedere specificamente via software. I diversi tipi di microcontroller AVR utilizzati
sulle schede Arduino hanno diverse quantit di spazio di archiviazione EEPROM
disponibile, che vanno dai 512 byte dellATmega168 ai 4 KB dellATmega1280 e
dellATmega2560. Nel Capitolo 3 trovate i dettagli specifici per ciascun microcontroller.
La classe EEPROM definisce le funzioni utilizzate per leggere, scrivere e caricare i
contenuti della EEPROM integrata sullAVR. Deve essere istanziata prima che possa
essere utilizzata qualsiasi funzione della EEPROM. Il file include della libreria,
EEPROM.h, dichiara EEPROM come unistanza statica della classe EEPROM. Se volete
utilizzare la classe istanziando voi stessi un oggetto EEPROM, dovete eseguire questo:

Le versioni pi vecchie della libreria EEPROM dispongono di sole due funzioni per
accedere alla EEPROM integrata di una MCU AVR:
read()

Legge il valore di un byte da un determinato indirizzo nella EEPROM. Le posizioni


non inizializzate conterranno un valore pari a 255. Questa funzione restituisce il valore
del byte letto presso lindirizzo dato. Gli indirizzi partono da zero (0).

write()

Scrive il valore di un byte sullo spazio di archiviazione EEPROM del microcontroller


presso un determinato indirizzo. Gli indirizzi partono da zero (0). Per eseguire
unoperazione di scrittura sulla EEPROM ci vogliono circa 3,3 ms e la EEPROM
della VR ha unautonomia dichiarata di 100.000 cicli scrittura/lettura, quindi dovrebbe
durare abbastanza. La funzione non restituisce nulla.

Lultima versione della libreria EEPROM ha quattro ulteriori funzioni: update(), get(),
put() ed EEPROM[]. Vale la pena guardare il codice sorgente della classe della libreria
EEPROM per vedere come il codice gestisce i tipi di dati arbitrari.
update()

La funzione update() scrive un byte di dati sulla EEPROM presso un determinato


indirizzo, ma soltanto se il valore che si trova attualmente in quellindirizzo diverso
da quello fornito come argomento alla funzione. Questa funzione non restituisce
nulla.

put()

La funzione put() scrive dati di qualsiasi tipo sulla EEPROM, cominciando


nellindirizzo specificato. I dati possono essere tipi primitivi (per esempio, numeri
interi o a virgola mobile), oppure possono essere strutture. La funzione restituisce un
riferimento alloggetto dei dati passato per mezzo dellargomento data. Notate che
per eseguire loperazione di scrittura questa funzione utilizza update() e quindi la
scrittura non avviene se i dati che si trovano presso lindirizzo specificato sono uguali
a quelli passati nella chiamata a put().

get()

La funzione get() legge e restituisce dati o oggetti di qualunque tipo nella EEPROM.
I dati letti nella EEPROM sono scritti presso lindirizzo dellargomento data in stile
byte-wise, con la quantit di byte corrispondente alla dimensione delloggetto a cui
punta data. La funzione restituisce un riferimento alloggetto dei dati passato per
mezzo dellargomento data.
EEPROM[]

Loperatore EEPROM[] permette di accedere alla EEPROM come se fosse un oggetto


array. Lindirizzo vero e proprio della EEPROM EEPROM_base_address + int
index. Loperatore restituisce un riferimento alla cella della EEPROM.

Ecco un semplice esempio basato vagamente su quello che fornito da Arduino.cc nella
documentazione della libreria EEPROM, ma con qualche modifica. Scrive e legge nello
spazio di memoria della EEPROM e utilizza loperatore modulo per determinare se un
valore pari o dispari:

Ethernet
La libreria Ethernet fornisce la funzionalit necessaria per interagire con una shield
Ethernet di Arduino. Come nel caso di tutte le librerie di Arduino, abbastanza
complessa e offre funzionalit sia server che client. Inoltre, supporta quattro connessioni
input o output (o una miscela dei due) simultanee. Per comunicare con la scheda host
Arduino, la shield Ethernet utilizza linterfaccia SPI. La libreria Ethernet formata da una
raccolta di cinque classi C++. La maggior parte delle classi eredita dalle classi genitore,
ma, nel caso della maggior parte delle applicazioni, non dovete preoccuparvi dei
dettagli. Tuttavia, se avete bisogno di vedere le definizioni della classe a basso livello,
potete trovarle nella directory hardware/arduino/avr/cores/arduino nel codice sorgente
di Arduino. Questo elenco mostra le cinque classi della libreria Ethernet e le funzioni
pubbliche di ciascuna classe. Vedremo ciascuna di esse pi nel dettaglio nei prossimi
paragrafi:
Classe Ethernet
begin()
localIP()
maintain()
Classe IPAddress
Classe Server
EthernetServer()
begin()
available()
write()
print()
println()
Classe Client
EthernetClient()
connected()
connect()
write()
print()
println()
available()
read()
flush()
stop()
Classe EthernetUDP
begin()

read()

write()

beginPacket()

endPacket()

parsePacket()
available()

stop()

remotePort()

La classe Ethernet: EthernetClass


La classe Ethernet inizializza la libreria Ethernet e le impostazioni di rete. Il nome reale
della classe EthernetClass e un oggetto di nome Ethernet viene istanziato nel file
della libreria Ethernet.cpp ed esportato in Ethernet.h. Se volete, potete creare la vostra
propria istanza di EthernetClass, oppure potete utilizzare semplicemente quella che
fornisce la libreria.
begin()

Si utilizza per inizializzare la libreria Ethernet e stabilire i parametri della connessione


di rete. Il metodo (o funzione, se preferite) begin() overloaded e quindi esistono
cinque modi di invocarlo.
Tutti gli argomenti sono array di uint8_t byte. La forma soltanto DHCP di questo
metodo (Ethernet.begin(mac)) restituisce 1 se si ottenuto correttamente un lease
DHCP, 0 in caso contrario. Tutte le altre forme non restituiscono niente. Il tipo di
classe IPAddress descritto nel prossimo paragrafo.

localIP()

Ottiene lindirizzo IP del local host (per esempio, la shield Ethernet). Questo utile
per determinare lindirizzo IP locale quando si utilizza DHCP. Se lEthernet locale
stato inizializzato correttamente, Ethernet.localIP() restituisce un oggetto
IPAddress che contiene lindirizzo IP assegnato o specificato.

maintain()

Questo metodo non appare nelle versioni pi vecchie della libreria. Quando a un
dispositivo viene assegnato un indirizzo IP da un server DHCP, viene detto lease e un
lease DHCP dato per un determinato periodo di tempo (dipende da come stato
configurato il server DHCP). Il metodo Ethernet.maintain() serve a rinnovare un
lease DHCP.
Ethernet.maintain() restituisce 0 se non successo niente, 1 se il rinnovo del
lease non riuscito, 2 se il lease stato rinnovato correttamente, 3 se il rebind
DHCP non riuscito e 4 se il rebind riuscito.
La classe IPAddress
La classe IPAddress definisce un oggetto dati che contiene i dati degli indirizzi IP locali e
remoti. La classe ha quattro tipi di costruttori overloaded. Ciascuno accetta una forma
diversa di indirizzo come mostrato qui:

Un oggetto IPAddress pu contenere una serie di quattro ottetti di indirizzi IP (il formato
192.168.1.100, per esempio, senza i punti), una versione con un numero intero da 32 bit
di un indirizzo IP, oppure un array di byte senza segno. La classe IPAddress serve a
creare istanze di tipi di dati indirizzo. Per esempio:

ip, dnServer, gateway e subnet sono oggetti di tipo IPAddress. La libreria Ethernet sa
che deve cercare questi nomi quando inizializza uninterfaccia Ethernet. Notate che tutti
utilizzano la forma di inizializzazione con diversi ottetti.
Potete trovare il file sorgente di IPAddress nella directory
Arduino/hardware/arduino/avr/cores/arduino della sorgente di Arduino.
La classe Server: EthernetServer
Nel vocabolario di Ethernet, un server e un sistema (o un host) che accetta richieste di
connessione da un altro sistema e stabilisce un canale di comunicazione. Il sistema che
richiede la connessione viene detto client. Un server aspetta passivamente che i client lo
contattino: non d mai inizio a una connessione. Per fare un esempio del mondo reale,
immaginiamo un server web. Il server web aspetta che un browser (il client) si colleghi e
richieda una pagina web. Quindi restituisce i dati richiesti al client e poi resta in attesa
della richiesta successiva. Ogni volta che si seleziona un link, si fa clic su un pulsante
oppure si digita un testo in un campo di testo nella finestra di un browser, si crea una
richiesta che viene inviata al server web.
La classe Server la classe di base della classe EthernetServer della libreria
Ethernet. Non viene chiamata direttamente, ma viene utilizzata dalle altre classi. Come
nel caso di IPAddress, la sorgente della classe Server si trova nella directory
Arduino/hardware/arduino/avr/cores/arduino della sorgente di Arduino.
EthernetServer()

Stabilisce la porta da utilizzare quando si rimane in attesa di una richiesta di


collegamento da parte di un client. Di solito la porta viene specificata quando viene
istanziato un oggetto di tipo EthernetServer. Non restituisce niente (void).
Esempio:

Il valore dellargomento port pu essere un numero qualsiasi compreso tra 0 e


65535, ma di solito i valori da 0 a 1024 sono riservati per servizi di sistema come
FTP, SSH e possibilmente un server web. Per evitare conflitti, conviene assegnare
alle porte valori rappresentati da numeri molto alti (superiori a 9000, per esempio).
begin()

Chiede al server di cominciare ad aspettare i collegamenti da parte dei client sulla


porta che stata impostata al momento della creazione delloggetto server.

available()

Restituisce una connessione con un client collegato e pronto per comunicare.

write()

Scrive dati su un client collegato a un server. I dati vengono scritti su tutti i client
collegati. Accetta un valore rappresentato da un unico carattere (o byte), oppure un
puntatore a un array di valori di tipo char e restituisce il numero di byte scritti.

print()

Stampa dati su tutti i client collegati a un server nella forma di una sequenza di
caratteri ASCII.
println()

Simile a print(), ma aggiunge un carattere di ritorno a capo alla fine delloutput.


Accetta dati di tipo char, byte (uint8_t), int, long o string. Restituisce il numero di
byte scritti. In assenza di argomenti, la funzione si limita a inviare un carattere di
ritorno a capo.

La classe Client: EthernetClient


La classe Client crea oggetti client, che possono collegarsi a un server per inviare e
ricevere dati. Generalmente un client inizia una transazione, o scambio, di dati con un
server. Un server resta in ascolto e in attesa di un client che voglia collegasi e, una volta
avvenuta la connessione, il client pu richiedere dati al server, inviare dati al server,
oppure richiedere che il server esegua qualche azione da parte sua.
La classe Client la classe di base della classe EthernetClient del la libreria
Ethernet. Non viene chiamata direttamente: la classe EthernetClient eredita da essa.
Come nel caso di Server, la sorgente della classe di base Client si trova nella directory
Arduino/hardware/arduino/avr/cores/arduino della sorgente di Arduino.
EthernetClient()

Crea un oggetto client che sia in grado di collegarsi a un server presso un indirizzo
IP specifico utilizzando una porta specifica. Per definire il server e la porta da
utilizzare, si utilizza il metodo connect(). Per esempio:

connected()

Determina se un client collegato o meno, restituendo true o false.

connect()

Crea il collegamento con un server presso un indirizzo IP (un array di quattro byte)
specifico e una porta specifica. Anzich un indirizzo IP, si pu utilizzare un URL
(indirizzo web).

Restituisce un numero intero che rappresenta lo stato del collegamento:

write()

Invia un valore oppure i contenuti di un buffer al server collegato. I dati vengono


inviati nella forma di una serie di byte. Il metodo write() restituisce il numero di byte
scritti. Questo valore restituito pu essere tranquillamente ignorato.

print()
Stampa dati sul server collegato, nella forma di una sequenza di caratteri ASCII.
Accetta dati di tipo char, byte (uint8_t), int, long, oppure string. Pu anche accettare
una base specificata. I tipi base validi sono BIN (binario), DEC (base 10), OCT (base
8) ed HEX (base 16). Restituisce il numero di byte scritti.

println()

Identico al metodo print(), a eccezione che per il fatto che alla fine delloutput di
caratteri ASCII viene aggiunto un ritorno a capo. Un println() privo di parametri
invia al server collegato soltanto un ritorno a capo.

Restituisce il numero di caratteri disponibili da leggere provenienti dal server


collegato. Pu essere utilizzato per verificare se sono presenti dati in arrivo.

read()

Legge il successivo byte disponibile che proviene dal server. Utilizza un ciclo per
leggere diversi caratteri, oppure legge e valuta ciascun carattere uno alla volta.

flush()

Elimina tutti i caratteri provenienti dal server e non letti che si trovano nel buffer di
ricezione.

stop()

Si sconnette dal server attualmente collegato. Una volta scollegato, il client pu


connettersi con un altro server (oppure nuovamente con lo stesso server,
naturalmente).

La classe EthernetUDP
A differenza di TCP/IP, che un protocollo di streaming (cio che non ha limiti definiti di
inizio e fine), UDP un protocollo di datagramma. Ciascun elemento di dati un singolo
pacchetto, detto datagramma, e i dati devono entrare nei limiti del pacchetto del
datagramma. UDP non dotato di rilevamento degli errori, n garantisce la consegna
dei dati, ma, nel caso di pacchetti corti di dati non fondamentali, o dove il software di
livello superiore in grado di gestire cose come il rilevamento degli errori e i nuovi
tentativi, rappresenta un modo veloce e relativamente semplice di spostare dati tra host.
begin()

Inizializza la classe UDP per iniziare ad aspettare i dati in arrivo su una porta
specifica.

read()

Legge i dati in arrivo dal buffer specificato. Se non viene fornito nessun parametro,
restituisce un carattere del buffer corrente. Se sono specificati il buffer e la
dimensione, restituisce fino a maxsize byte del buffer.

Notate che questa funzione pensata per essere utilizzata immediatamente dopo
una chiamata a UDP.parsePacket().
write()

Invia dati a un collegamento remoto. La funzione write() deve essere inserita tra le
chiamate beginPacket() ed endPacket(). beginPacket() inizializza il pacchetto di
dati e in realt la chiamata endPacket() a inviare i dati allhost remoto.

beginPacket()

Apre un collegamento UDP con un host remoto su un indirizzo IP specifico e una


porta specifica. Restituisce 1 (true) se il collegamento avviene correttamente,
oppure 0 in caso contrario.

endPacket()

Invia un pacchetto UDP creato dalla funzione write() allhost remoto specificato
dalla funzione beginPacket().

parsePacket()

Controlla su un collegamento UDP aperto se presente un pacchetto datagramma e


restituisce la dimensione dei dati in attesa. parsePacket() deve essere chiamato
prima di read() oppure, per ricavare i dati (se ce ne sono), si utilizza la funzione
available().
available()

Restituisce il numero di byte dei dati ricevuti che attualmente si trovano nel buffer di
ricezione. Notate che deve essere chiamato solo dopo una chiamata a
parsePacket().

stop()

Si scollega dallhost UDP remoto e si libera di tutte le sorgenti utilizzate durante la


sessioneUDP.

remoteIP()

Restituisce lindirizzo IP del collegamento UDP remoto nella forma di un array di 4


byte. Questa funzione deve essere chiamata soltanto dopo una chiamata a
parsePacket().

remotePort()

Restituisce la porta UDP del collegamento UDP remoto nella forma di un numero
intero. Questa funzione deve essere chiamata soltanto dopo una chiamata a
parsePacket().

Firmata
Firmata uninteressante libreria con moltissime applicazioni potenziali. Firmata mette a
disposizione i mezzi per utilizzare comunicazioni seriali tra Arduino e unapplicazione o un
computer host utilizzando un protocollo simile al MIDI. stata sviluppata con lobiettivo
di permettere di controllare pi funzionalit di Arduino possibili con un computer host: in
altre parole, di utilizzare Arduino come se fosse unestensione delle funzionalit I/O
dellhost.
Prima di imbarcarsi in un progetto Firmata per la prima volta, conviene provare il
software dimostrativo. Potete scaricare un client adatto dalla vecchia wiki di Firmata
(http://firmata.org/wiki/Main_Page) e la porzione di codice Arduino gi inclusa nelle
librerie distribuite con lIDE di Arduino.
Questo paragrafo presenta soltanto un riepilogo delle funzioni disponibili nella libreria
Firmata. Il prossimo elenco mostra lorganizzazione dei componenti della libreria.
Sfortunatamente, questi componenti non sembrano essere accuratamente documentati
e quindi qualcosa di quello che potete voler scoprire per utilizzarli deve essere intuito nel
codice sorgente. Per maggiori dettagli ed esempi di utilizzo, potete consultare la wiki di
Firmata (http://firmata.org/, ormai abbandonata e non pi supportata) oppure il
repository Firmata di GitHub (https://github.com/firmata). Cercate di prestare
particolarmente attenzione alla definizione del protocollo
(https://github.com/firmata/protocol), dal momento che quello che utilizza
lapplicazione host per comunicare con unapplicazione Firmata attiva su Arduino.
SUGGERIMENTO Il codice della libreria Firmata incluso nellIDE di Arduino pu non essere la versione pi recente,
per cui vi conviene guardare nel repository di GitHub (https://github.com/firmata/arduino). La documentazione
presentata qui pu fare riferimento a funzioni che non sono presenti nella vostra versione.

La libreria Firmata organizzata cos:


Metodi di base
begin()
printVersion()
blinkVersion()
printFirmwareVersion()
setFirmwareVersion()
Inviare messaggi
sendAnalog()
sendDigitalPorts()
sendDigitalPortPair()
sendSysex()
sendString()
sendString()
Ricevere messaggi
available()
processInput()
Funzioni di callback
attach()
detach()
Tipi di messaggi
I metodi di base
Nei prossimi paragrafi, analizzeremo una a una ciascuna di queste categorie.
begin()

La forma base di begin() inizializza la libreria Firmata e imposta la velocit dei dati
seriali su quella predefinita di 57.600 baud. La seconda forma accetta un argomento
di tipo long, che contiene il baud rate desiderato per la comunicazione tra Firmata e
un sistema host. La terza forma avvia la libreria utilizzando uno stream diverso da
Serial. pensata per funzionare con qualsiasi flusso di dati che implementi
linterfaccia Stream (Ethernet, WiFi, ecc.).
Per ulteriori informazioni sullo stato attuale di questo metodo, potete consultare le
discussioni sulla pagina Firmata di GitHub
(https://github.com/firmata/arduino/issues).

printVersion()

Invia la versione del protocollo della libreria al computer host.

blinkVersion()

Fa lampeggiare la versione del protocollo sul pin 13 (il LED integrato sulla scheda
Arduino).

printFirmwareVersion()

Invia il nome e la versione del firmware al computer host.

setFirmwareVersion()

Imposta il nome e la versione del firmware utilizzando il nome di file dello sketch,
meno lestensione.

Inviare messaggi
sendAnalog()

Invia un messaggio di dati analogico.

sendDigitalPort()

Invia lo stato delle porte digitali nella forma di singoli byte.

sendString()

Invia una stringa al computer host.

sendString()
Invia una stringa al computer host utilizzando un tipo di comando personalizzato.

sendSysex()

Invia un comando che contenga un array arbitrario di byte.

Ricevere messaggi
available()

Controlla se stanno arrivando messaggi nel buffer di input.

processInput()

Ricava ed elabora i messaggi in arrivo dal buffer di input e invia i dati alle funzioni di
callback registrate.

Funzioni di callback
Per poter associare una funzione a un tipo specifico di messaggio, la funzione deve
corrispondere a una funzione di callback. In Firmata esistono tre tipi fondamentali di
funzioni di callback. Li vedremo uno a uno nei prossimi paragrafi: generico, stringa e
sysex e un quarto tipo per gestire il reset del sistema. Le funzioni di callback sono:
attach()

Associa una funzione a un tipo specifico di messaggio in arrivo.

detach()

Scollega una funzione da un tipo specifico di messaggio in arrivo.

Tipi di messaggi
Una funzione pu essere associata a un tipo specifico di messaggio. Firmata mette a
disposizione questi tipi di messaggi:
ANALOG_MESSAGE

Il valore analogico di un singolo pin


DIGITAL_MESSAGE
Otto bit di dati di un pin digitale (una porta)
REPORT_ANALOG

Attiva/disattiva il reporting di un pin analogico


REPORT_DIGITAL

Attiva/disattiva il reporting di una porta digitale


SET_PIN_MODE

Cambia la modalit del pin tra INPUT/OUTPUT/PWM/ecc.


FIRMATA_STRING

Per le stringhe in stile C; per il tipo di funzione utilizza stringCallbackFunction


SYSEX_START

Per messaggi generici di lunghezza arbitraria (per mezzo del protocollo MIDI
SysEx); per il tipo di funzione utilizza sysex CallbackFunction
SYSTEM_RESET

Resetta il firmware sul suo stato predefinito; per il tipo di funzione utilizza
systemResetCallbackFunction

GSM
La libreria GSM si utilizza con la shield GSM per collegarsi a una rete GSM/GPRS.
inclusa con le versioni 1.0.4 e successive dellIDE di Arduino. La libreria GSM supporta
la maggior parte delle funzioni che ci si aspetta di trovare su un telefono GSM, come la
possibilit di eseguire e ricevere chiamate, inviare e ricevere messaggi SMS e collegarsi
a Internet per mezzo di una rete GPRS. GSM sta per global system for mobile
communications e GPRS lacronimo di General Packet Radio Service.
Per trasferire dati da una porta seriale alla rete GSM, la shield GSM incorpora un
modem. Il modem utilizza comandi di tipo AT per eseguire diverse funzioni. In un utilizzo
normale, ciascun comando AT fa parte di una serie pi lunga che esegue una funzione
specifica. Per supportare la comunicazione tra Arduino e il modem GSM, la libreria
GSM si appoggia alla libreria SoftwareSerial.
NOTA La libreria GSM unaggiunta recente. Se avete una versione pi vecchia dellIDE, possibile che non ne
disponiate. Per vedere se avete a vostra disposizione o meno la libreria GSM, dovete consultare lelenco di librerie
disponibili nellIDE.

La suite di classi della libreria GSM complessa e una descrizione completa di tutte le
funzionalit andrebbe oltre lambito di questo libro. Questo paragrafo presenta un
riepilogo della funzionalit. Per informazioni pi dettagliate, potete consultare la guida
della libreria GSM di Arduino (https://www.arduino.cc/en/Reference/GSM) oppure laiuto
integrato dellIDE di Arduino. Inoltre alcuni distributori, come Adafruit, producono shield
GSM compatibili con Arduino e per questi prodotti mettono a disposizione le loro
librerie.
La compatibilit con la libreria Ethernet
La libreria GSM ampiamente compatibile con lattuale libreria Ethernet di Arduino,
tanto che un programma di porting che utilizzi le librerie Ethernet o WiFi di Arduino per
GSM da utilizzare con la shield GSM dovrebbe risultare relativamente semplice.
Saranno necessarie alcune modifiche specifiche per la libreria, come includere le librerie
specifiche per GSM e GPRS e ottenere le impostazioni di rete dal nostro provider del
network cellulare.
La struttura della libreria
La libreria GSM piuttosto complessa ed costituita da 10 classi principali. Ecco le
funzioni di ciascuna delle classi di GSM:
Classe GSM
begin()
shutdown()
Classe GSMVoiceCall
getVoiceCallStatus()
ready()
voiceCall()
answerCall()
hangCall()
retrieveCallingNumber()
Classe GSM_SMS
beginSMS()
ready()
endSMS()
available()
remoteNumber()
read()
write()
print()
peek()
flush()
Classe GPRS
attachGPRS()
Classe GSMClient
ready()

connect()
beginWrite()
write()
endWrite()
connected()
read()
available()
peek()
flush()
stop()
Classe GSMServer
ready()
beginWrite()
write()
endWrite()
read()
available()
stop()
Classe GSMModem
begin()
getIMEI()
Classe GSMScanner
begin()
getCurrentCarrier()
getSignalStrength()
readNetworks()
Classe GSMPIN
begin()
isPIN()
checkPIN()
checkPUK()
changePIN()
switchPIN()
checkReg()
getPINUsed()
setPINUsed()
Classe GSMBand
begin()

getBand()

setBand()

La classe GSM
Questa classe prepara le funzioni che comunicheranno con il modem. Gestisce la
connettivit della shield ed esegue la registrazione di sistema necessaria con
linfrastruttura GSM. Per gestire le funzioni di comunicazione a basso livello, tutti i
programmi GSM/GPRS di Arduino devono includere un oggetto di questa classe.
Questa la classe di base di tutte le funzioni che si basano su GSM. Deve essere
istanziata cos:

begin()

Avvia il modem GSM/GPRS e lo associa a una rete GSM. Ecco come si presenta il
prototipo completo del metodo begin():

Il metodo begin() pu essere chiamato in quattro modi diversi perch a ciascun


argomento assegnato un valore predefinito. La prima forma non accetta argomenti
e d per scontato che la SIM non abbia nessun pin configurato.

shutdown()

Spegne il modem (gli toglie lalimentazione).

La classe GSMVoiceCall
La classe GSMVoiceCall attiva la comunicazione vocale per mezzo del modem,
ammesso che alla shield GSM siano collegati un microfono, un altoparlante e un piccolo
circuito.
Questa la classe di base di tutte le funzioni GSM che si utilizzano per ricevere ed
effettuare chiamate vocali e deve essere istanziata cos:

getVoiceCallStatus()

Restituisce lo stato di una chiamata vocale nella forma di IDLE_CALL, CALLING,


RECEIVINGCALL, oppure TALKING.
ready()

Restituisce lo stato dellultimo comando: 1 se lultimo comando stato eseguito


correttamente, 0 se lultimo comando ancora in esecuzione e >1 se si verificato
un errore.

voiceCall()

Effettua una chiamata vocale in modalit asincrona oppure sincrona. Nel primo caso,
voiceCall() restituisce un valore mentre si chiama il numero. Nella modalit
sincrona, voiceCall() non restituisce niente finch la chiamata non inizia oppure
viene annullata.
Il primo argomento una stringa che contiene il numero da chiamare. possibile
utilizzare o meno un prefisso internazionale. Il buffer non deve essere cancellato o
utilizzato finch voiceCall() non completo (il comando terminato). Largomento
timeout espresso in millisecondi e viene utilizzato soltanto nella modalit sincrona.
Se impostato su 0, voiceCall() aspetta indefinitamente che laltro risponda.

answerCall()

Accetta una chiamata vocale in arrivo. Nella modalit asincrona, answerCall()


restituisce 0 se lultimo comando ancora in esecuzione, 1 se stato eseguito
correttamente e >1 se si verificato un errore. Nella modalit sincrona,
answerCall() restituisce 1 se si risponde alla chiamata e 0 in caso contrario.

hangCall()

Risponde a una chiamata iniziata o a uno squillo. Nella modalit asincrona, hang
Call() restituisce 0 se lultimo comando ancora in esecuzione, 1 se stato
eseguito correttamente e >1 se si verificato un errore. Nella modalit sincrona,
hangCall() restituisce 1 se si risponde alla chiamata e 0 in caso contrario.

retrieveCallingNumber()

Ricava il numero che chiama e lo inserisce in un buffer. Il buffer dellargomento un


puntatore a un buffer di caratteri e bufsize la dimensione del buffer, espressa in
byte. Il buffer deve essere sufficientemente grande da contenere almeno 10
caratteri.
Nella modalit asincrona, retrieveCallingNumber() restituisce 0 se lultimo
comando ancora in esecuzione, 1 se stato eseguito correttamente e >1 se si
verificato un errore. Nella modalit sincrona, retrieveCallingNumber() restituisce 1
se il numero stato acquisito correttamente e 0 in caso contrario.

La classe GSM_SMS
Questa classe fornisce la possibilit di inviare e ricevere messaggi SMS (Short
Message Service).
beginSMS()

Definisce il numero di telefono per ricevere un messaggio SMS. Il numero di telefono


un array di caratteri. Nella modalit asincrona, la funzione restituisce 0 se lultimo
comando ancora attivo, 1 se stato eseguito correttamente e un valore >1 se si
verificato un errore. Nella modalit sincrona, la funzione restituisce 1 se il comando
precedente stato eseguito correttamente e 0 in caso contrario.

ready()

Restituisce lo stato dellultimo comando GSM SMS. Nella modalit asincrona,


ready() restituisce 0 se lultimo comando ancora attivo, 1 se stato eseguito
correttamente e un valore >1 se si verificato un errore. Nella modalit sincrona, la
funzione restituisce 1 se il comando precedente stato eseguito correttamente e 0
in caso contrario.

endSMS()

Si utilizza per informare il modem del fatto che il messaggio completo e pronto per
essere inviato. Nella modalit asincrona, la funzione restituisce 0 se ancora in
esecuzione, 1 se stato eseguito correttamente e >1 se si verificato un errore.
Nella modalit sincrona, restituisce 1 se stato eseguito correttamente e 0 in caso
contrario.

available()

Se un messaggio SMS disponibile per essere letto, questa funzione restituisce il


numero di caratteri che contiene. Se non disponibile nessun messaggio, restituisce
0.
remoteNumber()

Estrae il numero di telefono remoto da un messaggio SMS in arrivo e lo restituisce in


un array di caratteri. Largomento size definisce la dimensione massima dellarray
passato a remoteNumber(). Nella modalit asincrona, la funzione restituisce 0 se
ancora in esecuzione, 1 se stato eseguito correttamente e >1 se si verificato un
errore. Nella modalit sincrona, la funzione restituisce 1 se stato eseguito
correttamente, 0 in caso contrario.

read()

Legge un byte (un carattere) da un messaggio SMS. Restituisce il byte nella forma
di un numero intero, oppure -1 se non ci sono dati disponibili.

write()

Scrive un carattere in dimensione di byte in un messaggio SMS.

print()

Scrive un array di caratteri in un messaggio SMS. Restituisce il numero di byte che


riuscito a scrivere.

peek()

Restituisce il byte (un carattere) disponibile successivo di un messaggio SMS, senza


eliminare il carattere, oppure -1 se non ci sono dati disponibili.

flush()

Cancella dal modem tutti i messaggi inviati dopo che sono stati inviati tutti i caratteri
in uscita.

La classe GPRS
GPRS la classe di base di tutte le funzioni GPRS. Questo include le funzioni client e
server per Internet. Questa classe inoltre responsabile di includere i file coinvolti con
la comunicazione TCP.
attachGPRS()

Si collega con un determinato APN (access point name) per iniziare comunicazioni
GPRS. I provider di reti cellulari dispongono di APN che fungono da ponti tra la rete
cellulare e Internet. Restituisce una di queste stringhe: ERROR, IDLE, CONNECTING,
GSM_READY, GPRS_READY, TRANSPARENT_CONNECTED.

La classe GSMClient
Questa classe crea client che possono collegarsi a server e inviare e ricevere dati.
ready()

Restituisce lo stato dellultimo comando. Nella modalit asincrona, la funzione


restituisce 0 se ancora in esecuzione, 1 se stato eseguito correttamente e >1 se
si verificato un errore. Nella modalit sincrona, la funzione restituisce 1 se stato
eseguito correttamente e 0 in caso contrario.

connect()

Si collega a porta specifica di un indirizzo IP specificato. Restituisce true se il


collegamento avvenuto correttamente, oppure false in caso contrario.

beginWrite()

Inizia unoperazione di scrittura sul server collegato.

write()

Scrive dati su un server collegato. Restituisce il numero di byte scritti.

endWrite()

Smette di scrivere dati su un server collegato.

connected()

Restituisce lo stato del collegamento di un client. Notate che un client si considera


collegato se la connessione stata chiusa ma nel buffer ci sono dati che non sono
stati ancora letti. Restituisce true se il client collegato, oppure false in caso
contrario.

read()
Legge il byte di dati successivo e disponibile proveniente dal server con il quale
collegato il client. Restituisce il byte successivo, oppure -1 se non ci sono dati
disponibili.

available()

Restituisce il numero di byte provenienti dal server collegato e che sono in attesa di
essere letti.

peek()

Restituisce il byte successivo e disponibile di un messaggio in arrivo senza eliminarlo


dal buffer. Le chiamate successive a peek() si limitano a restituire lo stesso byte.

flush()

Elimina tutti i dati attualmente in attesa nel buffer e resetta il conteggio dei dati
disponibili riportandolo a zero.

stop()

Forza la disconnessione dal server.

La classe GSMServer
La classe GSMServer crea server che possono inviare dati a client collegati e riceverne
da essi. Implementa funzionalit server di rete, simili a quelli delle librerie Ethernet e
WiFi. Notate che alcuni operatori di rete non ammettono connessioni di rete in entrata
provenienti dallesterno delle loro reti.
ready()

Restituisce lo stato dellultimo comando. Nella modalit asincrona, questa funzione


restituisce 0 se ancora in esecuzione, 1 se stato eseguito correttamente e >1 se
si verificato un errore. Nella modalit sincrona, la funzione restituisce 1 se stato
eseguito correttamente e 0 in caso contrario.

beginWrite()

Inizia unoperazione di scrittura su tutti i client collegati.


write()

Scrive dati sui client collegati. Restituisce il numero di byte scritti.

endWrite()

Interrompe la scrittura dei dati sui client collegati.

read()

Legge il byte successivo disponibile, proveniente da un client collegato. Restituisce il


byte letto, oppure -1 se non ci sono dati disponibili.

available()

Rimane in attesa di richieste di collegamento da parte dei client. Restituisce il


numero di client collegati.

stop()

Fa in modo che il server smetta di aspettare le richieste di collegamento dei client.

La classe GSMModem
La classe GSMModem mette a disposizione funzioni diagnostiche di supporto per i modem
GSM interni.
begin()

Controlla lo stato del modem e lo riavvia. Questa funzione deve essere chiamata
prima di chiamare getIMEI(). Restituisce 1 se il modem funziona correttamente,
oppure un errore in caso contrario.

getIMEI()

Chiede al modem di ricavare il suo numero IMEI (International Mobile Equipment


Identifier). Il numero IMEI viene restituito in forma di stringa. Questa funzione deve
essere chiamata soltanto dopo una chiamata a begin().

La classe GSMScanner
La classe GSMScanner fornisce funzioni per ottenere informazioni diagnostiche sul
network e sulloperatore.
begin()

Resetta il modem. Restituisce 1 se il modem sta funzionando correttamente, un


codice di errore in caso contrario.

getCurrentCarrier()

Restituisce il nome dellattuale network server provider (loperatore) in forma di


stringa.

getSignalStrength()

Restituisce la potenza relativa di segnale del collegamento di rete in forma di stringa,


con cifre ASCII da 0 a 31 (31 indica che la potenza > 51 dBm), oppure 99 se non
viene rilevato nessun segnale.

readNetworks()

Cerca operatori di rete disponibili. Restituisce una stringa che contiene lelenco degli
operatori rilevati.

La classe GSMPIN
La classe GSMPIN contiene funzioni utility per comunicare con la scheda SIM.
begin()

Resetta il modem. Restituisce 1 se il modem sta funzionando correttamente, un


codice di errore in caso contrario.

isPIN()

Esamina la scheda SIM per determinare se bloccata con un PIN o meno.


Restituisce 0 se il blocco per mezzo del PIN disattivato, 1 se il blocco attivato, -1
se attivato il blocco per mezzo del PUK e -2 se si verificato un errore.

checkPIN()

Invia un PIN alla scheda SIM per determinare se valido o meno. Restituisce 0 se il
PIN valido e -1 se non lo .
checkPUK()

Invia un codice PUK alla scheda SIM per determinare se valido e stabilisce una
nuovo codice PIN. Restituisce 0 se tutto avvenuto correttamente e -1 in caso
contrario.

changePIN()

Cambia il codice PIN di una scheda SIM dopo aver verificato che il vecchio PIN sia
valido.

switchPIN()

Cambia lo stato di blocco per mezzo del PIN.

checkReg()

Cerca di determinare se il modem registrato in una rete GSM/GPRS. Restituisce 0


se il modem registrato, 1 se il modem in roaming e -1 se si verificato un
errore.

getPINUsed()

Cerca di determinare se si sta utilizzando il blocco del PIN. Restituisce true se


attivato e false in caso contrario.

setPINUsed()

Imposta lo stato del blocco del PIN. Se largomento true, il PIN bloccato; se
false, sbloccato.

La classe GSMBand
La classe GSMBand fornisce informazioni sulla banda di frequenza alla quale si collega il
modem. Esistono anche metodi per impostare la banda.
begin()

Resetta il modem. Restituisce 1 se il modem sta funzionando correttamente, un


codice di errore in caso contrario.
getBand()

Restituisce la banda di frequenza che sta attualmente utilizzando il modem per


collegarsi.

setBand()

Imposta la banda di frequenza che che deve utilizzare il modem.

LiquidCrystal
Questa classe permette a una scheda Arduino di controllare un modulo LCD (liquid
crystal display). pensata specificamente per LCD che si basano sul chipset Hitachi
HD44780 (o compatibile), che si trova sulla maggior parte degli LCD basati sul testo. La
libreria supporta la modalit di interfaccia sia a 4 che a 8 bit e utilizza anche tre dei pin
di Arduino per le linee di controllo RS (register select), clock enable e R/W (read/write,
lettura/scrittura).
LiquidCrystal()

Crea unistanza di un oggetto di classe LiquidCrystal. Le diverse forme della classe


permettono di adattarla a diversi metodi di interfaccia LCD.

Dove:
rs Il pin di Arduino collegato al pin RS dellLCD
rw Il pin di Arduino collegato al pin RW dellLCD
enable Il pin di Arduino collegato al pin enable dellLCD
d0 .. d7 I pin di Arduino collegati ai pin dati dellLCD
Lutilizzo dei segnali d4, d5, d6 e d7 facoltativo. Se vengono utilizzate soltanto
quattro linee digitali, questi possono essere omessi. Esempio:

begin()

Inizializza linterfaccia sul controller LCD del modulo LCD. Gli argomenti specificano
la larghezza e laltezza dellLCD. La dimensione predefinita dei caratteri 5 8 pixel.
Questa funzione deve essere chiamata prima che possa essere utilizzata qualsiasi
altra funzione della libreria LCD.

clear()

Cancella gli schermi LCD e riporta il cursore nellangolo in alto a sinistra.

home()

Posiziona il cursore in alto a sinistra sullLCD. Non cancella lLCD: per farlo si deve
utilizzare la funzione clear().

setCursor()

Posiziona il cursore nel punto specificato dagli argomenti column e row.

write()

Scrive un byte (char) di dati sullLCD. Restituisce il numero di byte scritti.

print()

Questa funzione in realt fa parte del codice standard di runtime AVR-GCC di


Arduino ed overloaded in modo che possa accettare dati di diversi tipi. Il file
Print.h, che si trova in hardware/arduino/avr/cores/arduino/Print.h, definisce queste
forme della funzione print():

cursor()

Attiva il cursore, un carattere di sottolineatura, nella posizione dove verr scritto il


carattere successivo sullo schermo LCD.
noCursor()

Disattiva il cursore, in realt nascondendolo. Non ha conseguenze sulla posizione


dove apparir il carattere successivo.

blink()

Fa apparire un cursore lampeggiante.

noBlink()

Disattiva il cursore lampeggiante.

display()

Attiva lLCD, se prima era stato disattivato con la funzione noDisplay(). Ripristina il
cursore e tutto il testo che prima era visibile o che pu essere stato aggiunto,
cancellato o modificato a partire dal momento in cui il display stato disattivato.

noDisplay()

Disattiva il display LCD senza alterare il testo esistente sullo schermo.

scrollDisplayLeft()

Fa scorrere il testo sul display di uno spazio a sinistra.

scrollDisplayRight()

Fa scorrere il testo sul display di uno spazio a destra.

autoscroll()

Attiva lo scorrimento automatico. Quando nel display viene aggiunto del testo,
sposta i caratteri esistenti di uno spazio a sinistra oppure a destra, a seconda della
direzione corrente del testo.

noAutoscroll()

Disattiva la funzione di scorrimento automatico dellLCD.


leftToRight()

Imposta la direzione nella quale scorre il testo quando si attiva lo scorrimento


automatico, in questo caso da sinistra a destra.

rightToLeft()

Imposta la direzione nella quale scorre il testo quando si attiva lo scorrimento


automatico, in questo caso da destra a sinistra.

createChar()

Crea un carattere personalizzato di 5 8 pixel. Il carattere definito da un array di


byte, uno per riga.
Vengono utilizzati soltanto gli ultimi cinque bit meno significativi di ciascun byte.

SD
La libreria SD fornisce il supporto per leggere e scrivere schede di memoria flash SD,
sia a dimensione normale che micro (in termini di interfaccia e di funzioni sono identiche,
cambia soltanto la dimensione). La libreria si basa su sdfatlib di William Greiman.
Questa libreria tratta una scheda SD come se fosse un piccolo disco con filesystem
FAT16 o FAT32. Utilizza nomi di file corti (formato 8.3). I nomi di file passati alle funzioni
della libreria SD possono includere un percorso, con nomi di directory separati da barre
(come quelle di Linux, non le barre invertite che si utilizzano su MS-DOS o su Windows).
Per comunicare con la scheda SD si utilizza linterfaccia SPI. Su una scheda Arduino
standard, questa utilizza i pin digitali 11, 12 e 13. Come pin select si utilizza un ulteriore
pin, di solito il pin 10, oppure questo ruolo pu essere assegnato a un altro pin. Notate
che anche se per select si utilizza un altro pin, perch la libreria funzioni il pin SS (pin 10)
deve rimanere utilizzato come output.
La classe SD
La classe SD fornisce funzioni per accedere alla scheda SD e manipolare file e cartelle.
begin()

Inizializza la libreria SD e linterfaccia con la scheda SD. Largomento facoltativo


csPin definisce il pin da utilizzare come select. Lopzione predefinita il pin 10
(SD_CHIP_SELECT_PIN). Questa funzione deve essere chiamata prima che possano
essere utilizzate tutte le altre funzioni SD. Restituisce true se tutto avvenuto
correttamente, false in caso contrario.
exists()

Verifica la presenza di un file o di una directory sulla scheda SD. La stringa filepath
pu essere un FQPN (fully qualified path name). Restituisce true se il file o la
directory esiste, false in caso contrario.

mkdir()

Crea una directory sulla scheda SD. Crea anche tutte le directory intermedie
necessarie. Restituisce true se la directory viene creata correttamente, false in
caso contrario.

open()

Apre un file su una scheda SD, per leggerlo oppure scriverlo. Se non viene fornito
largomento mode, lopzione predefinita aprire il file per leggerlo. Restituisce un
oggetto File che pu essere verificato come un valore booleano. Se il file non pu
essere aperto, File produce false. Le modalit disponibili sono FILE_READ e
FILE_WRITE.

remove()

Elimina (rimuove) un file dalla scheda SD. filepath un FQPN. Restituisce true se
tutto avvenuto correttamente, false in caso contrario.

rmdir()

Elimina uneventuale cartella vuota da una scheda SD. Restituisce true se la


directory stata eliminata correttamente, oppure false se si verificato un errore
(per esempio se la directory non era vuota).

La classe File
La classe File fornisce funzioni per leggere e scrivere singoli file su una scheda SD. Gli
oggetti di tipo File sono creati dalla funzione SD.open():

Nelloggetto File esistono numerosi metodi per manipolare i contenuti di un file:


available()
Restituisce il numero di byte disponibili da leggere su un file.

close()

Chiude un file, assicurando che prima vengano scritti tutti i dati rimanenti.

flush()

Scrive nel file i dati rimanenti in un buffer. Non chiude il file.

peek()

Legge un byte in un file senza far avanzare il puntatore di dati interno. Le chiamate
successive a peek() restituiscono lo stesso byte.

position()

Restituisce la posizione corrente nel file a partire dalla quale verr letto o scritto il
prossimo byte.

print()

Scrive dati in un file che stato aperto per essere scritto. Accetta dati di tipo char,
byte (uint8_t), int, long o string. Pu anche accettare una base specificata. I tipi
validi di base sono BIN (binario), DEC (base 10), OCT (base 8) e HEX (base 16).
Restituisce il numero di byte scritti.

Nota: in questo esempio mostrata la stringa data.


println()

Scrive dati in un file che stato aperto per essere scritto, seguiti da una coppia di
caratteri ritorno a capo e nuova riga. Accetta dati di tipo char, byte (uint8_t), int, long
o string. Pu anche accettare una base specificata. I tipi validi di base sono BIN
(binario), DEC (base 10), OCT (base 8) e HEX (base 16). Restituisce il numero di byte
scritti.

seek()
Sposta il puntatore interno in una nuova posizione nel file. La posizione deve essere
compresa tra 0 e la dimensione del file inclusi. Restituisce true se tutto stato
eseguito correttamente, oppure false se si verifica un errore (si cerca oltre la fine
del file, per esempio).

size()

Restituisce la dimensione del file, in byte.

read()

Legge il byte successivo nel file, oppure restituisce un valore di -1 se non ci sono
dati disponibili.

write()

Scrive dati in un file. Accetta un unico byte, oppure un oggetto dati che pu essere
un byte, un carattere o una stringa. Largomento size definisce la quantit di dati da
scrivere sulla scheda SD. Restituisce il numero di byte scritti.

isDirectory()

Restituisce true se loggetto fname si riferisce a una directory, altrimenti restituisce


false.

openNextFile()

Apre la successiva cartella di file in una directory e restituisce una nuova istanza di
un oggetto File.

rewindDirectory()

Questa funzione, che si utilizza con openNextFile(), restituisce il primo file o la


prima sottocartella in una directory.

Servo
La libreria Servo una raccolta di funzioni per controllare servomotori, come quelli che
si utilizzano sugli aereini RC. Una volta creata unistanza della classe Servo, si utilizza la
funzione attach() per passare il numero di pin da utilizzare con il servo. Gli impulsi che
controllano un servo vengono generati in background. La classe si istanzia cos:

attach()

Associa un servomotore a un pin I/O. La seconda forma permette al chiamante di


specificare i valori minimo e massimo di tempo di scrittura in microsecondi.
Restituisce il numero del canale o 0 se la funzione non riesce nel suo intento.

write()

Imposta langolo del servo in gradi. Se il valore > 200 viene trattato come
unampiezza di impulso in microsecondi.

read()

Restituisce lultima ampiezza di impulso del servo scritta nella forma di un angolo
compreso tra 0 e 180 gradi.

writeMicroseconds()

Imposta lampiezza di impulso del servo in microsecondi.

readMicroseconds()

Restituisce lampiezza di impulso corrente di questo servo in microsecondi.

attached()

Restituisce true se loggetto servo stato associato a un servo fisico.

detach()

Impedisce a un oggetto servo associato di generare impulsi sul pin I/O che gli
stato assegnato.

SPI
La libreria SPI supporta lutilizzo del bus Serial Peripheral Interface (SPI) per la
comunicazione con periferiche compatibili con SPI, di solito chip con interfaccia SPI
integrata. Pu essere utilizzata anche per le comunicazioni tra due microcontroller.
La classe SPISettings serve a configurare la porta SPI. Gli argomenti sono combinati in
un unico oggetto SPISettings, che viene passato a SPI.beginTransaction().

Esempio:

beginTransaction()

Inizializza linterfaccia SPI usando le impostazioni definite in un oggetto SPISettings.

endTransaction()

Interrompe la comunicazione con linterfaccia SPI. Di solito viene chiamato dopo che
il pin select de-asserted per permettere ad altre librerie di utilizzare linterfaccia
SPI.

usingInterrupt()

Si utilizza quando le comunicazioni SPI devono avere luogo allinterno del contesto di
un interrupt.

begin()

Avvia la libreria SPI e inizializza linterfaccia SPI. Imposta i pin SCK, MOSI e SS sulla
modalit di output e imposta SCK e MOSI su low mentre SS high.

end()

Disattiva linterfaccia SPI ma non modifica le modalit dei pin (in o out).

transfer()

Trasferisce un byte sullinterfaccia SPI, inviando o ricevendo.

setBitOrder()

Imposta lordine dei bit shiftati verso linterfaccia SPI. Le due scelte sono LSBFIRST
(prima il bit meno significativo) e MSBFIRST (prima il bit pi significativo). Questa
funzione non deve essere utilizzata con progetti nuovi. Per configurare linterfaccia
SPI si deve utilizzare la funzione beginTransaction().

setClockDivider()

Imposta il divisore del clock SPI relativo al clock del sistema. Nel caso delle schede
Arduino che si basano su AVR, i divisori validi sono 2, 4, 8, 16, 32, 64, oppure 128.
Questa funzione non deve essere utilizzata con progetti nuovi. Per configurare
linterfaccia SPI si deve utilizzare la funzione beginTransaction().

setDataMode()

Imposta la polarit del clock e la fase dellinterfaccia SPI. Questa funzione non deve
essere utilizzata con progetti nuovi. Per configurare linterfaccia SPI si deve utilizzare
la funzione beginTransaction().

SoftwareSerial
La libreria SoftwareSerial implementa la comunicazione seriale software sul pin I/O
digitale di Arduino. In altre parole, si tratta di un bit-banger che emula uninterfaccia
seriale convenzionale e che si rivela utile quando sono necessarie pi interfacce seriali,
ma lUSART integrato nel microcontroller AVR assegnato a qualche altra funzione
(come uninterfaccia USB).
La libreria SoftwareSerial supporta interfacce seriali multiple, ciascuna con una velocit
di fino a 115.200 bit al secondo. Quando si utilizzano diverse istanze di SoftwareSerial,
si possono ricevere dati soltanto una alla volta. Il pin I/O utilizzato deve supportare gli
interrupt dei cambi di pin. SoftwareSerial fornisce un buffer di ricezione da 64 byte per
ciascuna istanza di uninterfaccia seriale.
Da utilizzare con altre operazioni I/O seriali si crea un oggetto di tipo SoftwareSerial. Il
costruttore della classe viene passato ai pin digitali da utilizzare per linput (rx) e per
loutput (tx).

Esempio:

available()

Restituisce il numero di byte che si trovano nel buffer seriale e che sono disponibili
per essere letti.
begin()

Imposta il baud rate (la velocit) dellinterfaccia seriale. Baud rate validi sono 300,
600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 57600 e 115200.

isListening()

Controlla linterfaccia seriale per vedere se sta ascoltando gli input. Restituisce true
se linterfaccia sta aspettando attivamente input, false in caso contrario.

overflow()

Se linput supera la dimensione di 64 byte del buffer di ricezione delloggetto


SoftwareSerial, viene impostato un flag. Chiamare la funzione overflow()
restituisce il flag. Se viene restituito true significa che si verificato un overflow. Per
cancellare il flag si deve chiamare la funzione overflow().

peek()

Restituisce il carattere pi vecchio del buffer dellinput seriale, ma senza eliminarlo.


Le chiamate successive restituiscono lo stesso carattere. Se nel buffer non ci sono
byte, peek() restituisce -1.

read()

Restituisce un carattere proveniente da buffer di ricezione e lo elimina. Di solito la


funzione read() si utilizza in un ciclo. Restituisce -1 se non ci sono dati disponibili.
Notate che soltanto unistanza di SoftwareSerial pu ricevere dati in arrivo in un
determinato momento. Per selezionare linterfaccia attiva si utilizza la funzione
listen().

print()

La funzione print() si comporta come la funzione Serial.print(): accetta tutti i tipi


di dati che accetterebbe Serial.print(), che comprendono i tipi char, byte
(uint8_t), int, long o string, e restituisce il numero di byte scritti.

println()

Identica alla funzione serial.print(), eccetto che per la coppia ritorno a


capo/nuova linea (carriage return/line feed, CR/LF) che aggiunge alla fine delloutput.
Restituisce il numero di byte scritti. Se non viene fornito nessun dato, semplicemente
emette un CR/LF.

listen()

Attiva il listening (la ricezione dei dati) in unistanza di SoftwareSerial. Soltanto


unistanza di un oggetto SoftwareSerial pu ricevere dati in un determinato
momento e loggetto di cui viene chiamata la funzione listen() diventa il listener
attivo. I dati che arrivano su altre istanze dellinterfaccia vengono eliminati.

write()

Trasmette dati dellinterfaccia seriale in forma di byte puri. Si comporta come la


funzione Serial.write(). Restituisce il numero di byte scritti.

Stepper
La libreria Stepper pu essere utilizzata per controllare motori passo-passo sia unipolari
che bipolari con lhardware adatto che gestisca la corrente necessaria.
La libreria Stepper ha due forme di costruttori, uno per i motori unipolari e uno per quelli
bipolari. Ciascuna crea una nuova istanza della classe Stepper. Viene chiamata allinizio
dello sketch, prima delle funzioni setup() e loop(). Largomento steps definisce il
numero di passi in una rivoluzione completa dellalbero di uscita del motore. Gli
argomenti pin1, pin2, pin3 e pin4 specificano i pin digitali da utilizzare.

Esempio:

setSpeed()

Imposta la velocit (la cadenza dei passi) in termini di RPM. Non fa s che il motore
giri, ma si limita a impostare la velocit da utilizzare quando viene chiamata la
funzione step().

step()

Chiede al motore di avanzare un determinato numero di passi. Un conteggio positivo


fa girare il motore in una direzione e uno negativo lo fa girare nella direzione
opposta.

TFT
La libreria TFT (thin-film transistor) display fornisce funzioni per disegnare testo,
immagini e forme in un display TFT. inclusa con le versioni 1.0.5 e successiva dellIDE
di Arduino. Questa libreria semplifica il processo di mostrare immagini grafiche su un
display. Si basa sulla libreria ST7735H di Adafruit, che si trova su GitHub
(http://bit.ly/ada-st7735). La libreria ST7735H si basa sulla libreria GFX di Adafruit,
disponibile anchessa su GitHub (http://bit.ly/ada-gfx).
La libreria TFT pensata per lavorare con interfacce che utilizzino le funzionalit di
comunicazione SPI dei microcontroller AVR. Se la shield TFT include uno slot per
scheda SD, la libreria SD pu essere utilizzata per leggere e scrivere dati utilizzando un
segnale select separato di Arduino. Per la comunicazione con lo schermo e la scheda
SD, la libreria TFT si basa sulla libreria SPI, che quindi deve essere anchessa inclusa in
tutti gli sketch che utilizzano la libreria TFT.
La classe TFT
Il costruttore della classe TFT disponibile in due forme. Una viene utilizzata quando si
utilizzano i pin SPI standard di Arduino (lhardware SPI) e la seconda forma permette di
specificare quali pin utilizzare:

Dove:
cs Pin select del chip
dc Selezione modalit comando o dati
rst Pin per il reset
mosi Pin utilizzato per MOSI se non si utilizza hardware SPI
sclk Pin utilizzato per il clock se non si utilizza hardware SPI
Esempio:

La versione Esplora della libreria TFT utilizza pin predefiniti. Non necessario fare
altro che istanziare loggetto TFT:

begin()

Si chiama per inizializzare i componenti della libreria TFT. Deve essere chiamato
prima di poter utilizzare qualsiasi altra funzione. Tipicamente viene chiamato nella
funzione setup() di uno sketch.

background()

Sovrascrive lintero schermo del display con un colore a tinta unita. Pu essere
utilizzato per cancellare il display. Notate che in realt lo schermo non pu mostrare
256 livelli unici per colore, ma che utilizza 5 bit per i colori blu e rosso e 6 bit per il
verde.

stroke()

Si chiama prima di disegnare sullo schermo e imposta il colore di linee e bordi.


Come la funzione background(), stroke() utilizza 5 bit per i colori blu e rosso e 6 bit
per il verde.

noStroke()

Elimina tutti i colori dei bordi.

fill()

Imposta il colore di riempimento di oggetti e testo sullo schermo. Come la funzione


stroke(), fill() utilizza 5 bit per i colori blu e rosso e 6 bit per il verde.

noFill()

Disattiva i riempimenti di colore per oggetti e testo.

setTextSize()

Imposta la dimensione del testo scritto da una chiamata alla funzione text(). La
dimensione predefinita del testo 1, cio 10 pixel. Ciascun aumento nella
dimensione del testo aumenta laltezza del testo sullo schermo di 10 pixel.

text()

Scrive testo sul display presso le coordinate specificate. Il colore del testo si
imposta chiamando la funzione fill() prima di chiamare text().
point()

Disegna un punto in una posizione specifica sullo schermo. Il colore del punto
quello specificato da una chiamata precedente alla funzione fill().

line()

Disegna una linea tra le coordinate iniziale e finale utilizzando il colore impostato
dalla funzione stroke().

rect()

Disegna un rettangolo che comincia in un punto in alto a sinistra (x, y) con unaltezza
e una larghezza specificate.

width()

Rivela la larghezza dello schermo TFT espressa in pixel.

height()

Rivela laltezza dello schermo TFT espressa in pixel.

circle()

Disegna un cerchio sul display con centro in (x, y) e raggio r.

image()

Disegna unimmagine caricata da una scheda SD sullo schermo in una posizione


specificata.

loadImage()

Crea unistanza di un oggetto PImage utilizzando il nome di file fornito. Il file


dellimmagine deve essere di tipo BMP a 24 bit e deve risiedere nella directory root
della scheda SD. Utilizza la funzione di PImage loadImage().

PImage
La classe PImage contiene funzioni per incapsulare e disegnare unimmagine bitmap in un
display TFT.
PImage.height()

Una volta che unimmagine stata incapsulata in un oggetto PImage, si pu chiedere


la sua altezza. Questa funzione restituisce laltezza nella forma di un valore di tipo int.
PImage.width()

Restituisce la larghezza delloggetto di unimmagine incapsulata nella forma di un


valore di tipo int.
PImage.isValid()

Restituisce il valore booleano true se loggetto dellimmagine contiene un file bitmap


valido, oppure false in caso contrario.

WiFi
La libreria WiFi fornisce ad Arduino la capacit di collegarsi a una rete wireless. Le
descrizioni offerte qui non definiscono tutte le funzioni disponibili nel dettaglio, dal
momento che molte di loro sono simili o identiche a quelle che si trovano nella libreria
Ethernet. Laiuto integrato delle versioni pi vecchie dellIDE di Arduino (che, purtroppo,
sembrano essere le uniche che si trovano per alcune distribuzioni di Linux mentre sto
scrivendo questo libro) non presenta le pagine di riferimento della libreria WiFi, mentre
le versioni pi recenti s. Il codice sorgente della libreria sembra essere installata con le
versioni pi vecchie dellIDE, o almeno lo sul mio sistema di sviluppo Kubuntu.
La libreria WiFi si utilizza con la libreria SPI per comunicare con il modulo WiFi e una
scheda di memoria SD opzionale. Un Arduino di tipo base (vedere Capitolo 4) comunica
con la shield WiFi utilizzando i pin SPI 10, 11, 12 e 13. Le schede di tipo Mega utilizzano
i pin 10, 50, 51 e 52. Inoltre, su una shield WiFi di Arduino, si utilizza il pin 7 come
segnale di handshake tra Arduino e la shield WiFi, e quindi non lo si deve utilizzare per
nessun altro scopo. Altre shield WiFi possono presentare gli stessi limiti.
La shield WiFi di Arduino pu fungere sia da server per accettare collegamenti in
entrata, sia da client per creare un collegamento con un server esistente. La libreria
mette a disposizione modalit di cifratura WEP e WPA2 Personal, ma non supporta la
cifratura WPA2 Enterprise. Inoltre, se un nodo di un server non trasmette il suo SSID
(Service Set Identifier), la shield WiFi non pu creare un collegamento.
Come la libreria Ethernet, la libreria WiFi formata da una raccolta di cinque classi
C++. Quasi tutte le classi ereditano dalle classi genitore, ma nella maggior parte delle
applicazioni non ci si deve preoccupare dei dettagli. Tuttavia, se avete bisogno di vedere
le definizioni di basso livello delle classi Client, Server, UDP e altre, le potete trovare
nella directory libraries/WiFi nel codice sorgente di Arduino. Questo elenco mostra le
cinque classi della libreria WiFi e le funzioni membro pubbliche di ciascuna di esse:
Classe WiFi
begin()
disconnect()
config()
setDNS()
SSID()
BSSID()
RSSI()
encryptionType()
scanNetworks()
getSocket()
macAddress()
Classe IPAddress
localIP()
subnetMask()
gatewayIP()
Classe Server
WiFiServer()
begin()
available()
write()
print()
println()
Classe Client
WiFiClient()
connected()
connect()
write()
print()
println()
available()
read()
flush()
stop()
Classe UDP
begin()

available()

beginPacket()
endPacket()

write()

parsePacket()

peek()

read()

flush()

stop()

remoteIP()

remotePort()

NOTA La shield WiFi di Arduino WiFi si basa sul chip HDG204 802.11b/g. Ma bisogna fare attenzione, perch altre
shield WiFi, come la shield WiFi di Adafruit basata sul chip WiFi TI CC3000, possono utilizzare una libreria diversa,
specifica per un determinato chip WiFi. Molte delle funzionalit dovrebbero essere simili a quelle descritte qui, ma ci
sono comunque alcune differenze da prendere in considerazione. La libreria Adafruit disponibile su GitHub
(http://bit.ly/ada-cc3000). Trovate maggiori dettagli sul sito web di Adafruit (http://bit.ly/ada-cc3000-wifi).

La classe WiFi
Ecco un riepilogo veloce delle classi WiFi. Trovate le descrizioni delle funzioni nella parte
dedicata alla libreria Ethernet.
La classe WiFi contiene funzioni per inizializzare la libreria e le impostazioni di rete. La
definizione della classe si trova nel file include WiFi.h.
La classe IPAddress
Come IPAddress della libreria Ethernet, la classe IPAddress della libreria WiFi funge da
contenitore per contenere informazioni sulla configurazione di rete.

La classe Server
La classe Server crea server che possono accettare collegamenti richiesti da client per
scambiare dati. Un client pu essere un altro Arduino con una shield WiFi, un computer
desktop, un computer portatile o qualsiasi altro dispositivo con funzionalit compatibili
con WiFi. Trovate le descrizioni di print() e println() in La classe Server:
EthernetServer a pagina 168.

La classe Client
La classe Client crea client WiFi che possono collegarsi a server per poter inviare e
ricevere dati. Un server pu essere un altro Arduino con una shield WiFi, un computer
desktop, un computer portatile o qualsiasi altro dispositivo con funzionalit compatibili
con WiFi. Trovate le descrizioni di print() e println() in La classe Server:
EthernetServer a pagina 168.

La classe UDP
La classe UDP permette di inviare e di ricevere messaggi brevi utilizzando il protocollo
UDP. A differenza di TCP/IP, che un protocollo di streaming (cio che non ha limiti
definiti di inizio e fine), UDP un protocollo di datagramma. In questo caso, ciascun
elemento di dati un singolo pacchetto, detto datagramma, e i dati devono entrare nei
limiti del pacchetto del datagramma. UDP non dotato di rilevamento degli errori, n
garantisce la consegna dei dati, ma, nel caso di pacchetti corti di dati non fondamentali,
o dove il software di livello superiore in grado di gestire cose come il rilevamento degli
errori e i nuovi tentativi, rappresenta un modo veloce e relativamente semplice di
spostare dati tra host.
Wire
La libreria Wire serve a comunicare con dispositivi di tipo TWI o I2C. Nei Capitoli 2 e 3
trovate ulteriori informazioni sulle funzionalit TWI dei microcontroller AVR. Il Capitolo 8
descrive alcune shield che utilizzano I2C per le comunicazioni con Arduino.
E qui di seguito trovate una tabella che definisce dove si trovano i pin TWI su vari tipi di
schede Arduino. Nel Capitolo 4 potete osservare i diagrammi dei pinout delle schede.

Scheda SDA SCL


Uno, Ethernet A4 A5
Mega2560 20 21
Leonardo 2 3

Il cuore della libreria Wire la classe TwoWire. Esempio:

begin()

Inizializza la libreria TWI e attiva linterfaccia I2C in modalit master oppure servant.
Se non specificato lindirizzo, per impostazione predefinita linterfaccia I2C entra in
modalit master.

requestFrom()

Utilizzata dal master dellinterfaccia per richiedere dati a un dispositivo servant. I


byte di dati sono ricavati con le funzioni available() e read(). Restituisce il numero
di byte di dati letti sul dispositivo.

beginTransmission()

D inizio a una trasmissione di dati a un dispositivo I2C servant presso lindirizzo


specificato. I dati sono messi in coda per la trasmissione utilizzando la funzione
write() e poi vengono effettivamente trasmessi utilizzando la funzione
endTransmission().

endTransmission()

Trasmette i byte che sono stati messi in coda da write() a un dispositivo servant e
quindi pone fine a una trasmissione che stata iniziata da beginTransmission().

write()

Scrive i dati forniti a una coda per la trasmissione da un dispositivo master a uno
servant, oppure da un dispositivo servant a uno master in risposta a una richiesta di
dati. Restituisce il numero di byte scritti nella cosa.

available()

Restituisce il numero di byte disponibili per la funzione read(). Chiamata da un


dispositivo master dopo una chiamata a requestFrom() e su un dispositivo servant
dopo un evento di ricezione di dati.

read()

Legge un byte che stato trasferito da master a servant o viceversa.

onReceive()

Registra la funzione da chiamare (una funzione handler) quando un dispositivo


servant riceve dati da un master.

onRequest()

Registra la funzione da chiamare quando un master richiede dati da un dispositivo


servant.

Esplora
La libreria Esplora di Arduino offre una serie di funzioni per interfacciarsi facilmente con i
sensori e gli attuatori della scheda Esplora per mezzo della classe Esplora. Trovare
maggiori informazioni sul pinout nel Capitolo 4.
I sensori disponibili sulla scheda sono:
Joystick analogico a due assi
Pulsante a pressione centrale del joystick
Quattro pulsanti a pressione
Microfono
Sensore di luminosit
Sensore di temperatura
Accelerometro a tre assi
Due connettori di input TinkerKit
Gli attuatori disponibili sulla scheda sono:
LED RGB (Red-Green-Blue) alta luminosit
Cicalino piezo
2 connettori di output TinkerKit output
Esplora()

Crea unistanza di un oggetto Esplora.

readSlider()

Restituisce un valore intero che corrisponde alla posizione corrente del controllo
cursore. Il valore pu essere compreso tra 0 e 1023.

readLightSensor()

Restituisce un valore intero che corrisponde alla quantit di luce che tocca il sensore
di luminosit della scheda Esplora.

readTemperature()

Restituisce un intero con segno con la temperatura corrente dellambiente espressa


in Fahrenheit oppure Celsius. Largomento scale accetta sia DEGREES_C sia
DEGREES_F. Gli intervalli di temperatura sono da 40C a 150C e da 40F a 302F.

readMicrophone()
Restituisce un valore intero che corrisponde alla quantit di rumore dambiente
rilevato dal microfono. Il valore restituito pu essere compreso tra 0 e 1023.

readJoystickSwitch()

Legge il pulsante del joystick e restituisce 0 oppure 1023. Unalternativa la funzione


read JoystickButton().

readJoystickButton()

Legge il pulsante del joystick e restituisce LOW oppure HIGH (premuto o non premuto).
Questa funzione si comporta esattamente come readJoystickSwitch(), ma
restituisce un valore consistente con la funzione readButton().

readJoystickX()

Restituisce la posizione sullasse x del joystick, nella forma di un valore compreso tra
512 e 512.

readJoystickY()

Restituisce la posizione sullasse y del joystick, nella forma di un valore compreso tra
512 e 512.

readAccelerometer()

Restituisce il valore corrente di un asse selezionato e i valori possibili per


largomento axis sono X_AXIS, Y_AXIS e Z_AXIS. Se il valore restituito 0, significa
che laccelerometro perpendicolare alla direzione della gravit, mentre valori
positivi o negativi indicano la direzione e la velocit dellaccelerazione.

readButton()

Legge lo stato corrente di un determinato pulsante della Esplora. Restituisce un


valore low (false) se il pulsante premuto, oppure un valore high (true) in caso
contrario.

writeRGB()

Scrive una serie di valori che definiscono i livelli di luminosit degli elementi rosso,
verde e blu del LED RGB della Esplora.

writeRed()

Accetta un argomento che definisce la luminosit del LED rosso con un intervallo che
va da 0 a 255.

writeGreen()

Accetta un argomento che definisce la luminosit del LED verde con un intervallo che
va da 0 a 255.

writeBlue()

Accetta un argomento che definisce la luminosit del LED blu con un intervallo che va
da 0 a 255.

readRed()

Restituisce lultimo valore utilizzato per impostare la luminosit del LED rosso.

readGreen()

Restituisce lultimo valore utilizzato per impostare la luminosit del LED verde.

readBlue()

Restituisce lultimo valore utilizzato per impostare la luminosit del LED blu.

tone()

Emette un tono con lannunciatore integrato sulla scheda Esplora a una frequenza
data. Se non fornito nessun argomento duration, il tono continua finch non viene
chiamata la funzione noTone(). Pu essere utilizzata soltanto una frequenza alla
volta. Notate che lutilizzo della funzione tone() interferisce con il controllo del livello
del LED rosso.

noTone()
Termina loutput del segnale a onde quadre dellannunciatore.

Le librerie USB
Le librerie USB permettono a un Arduino Leonardo o Micro di apparire come un mouse
e/o una tastiera agli occhi del computer host.

NOTA Se la libreria Mouse o Keyboard sempre attiva, programmare Arduino diventa difficile. Funzioni come
Mouse.move() e Keyboard.print() devono essere chiamate soltanto quando lhost pronto per gestirle. Un modo per
risolvere questo problema utilizzare un sistema di controllo oppure un interruttore fisico per controllare quando
Arduino deve emettere i messaggi mouse o keyboard.

Mouse
Le funzioni mouse permettono a una scheda Leonardo o Micro di controllare il
movimento del cursore su un computer host. La posizione del cursore riportata
sempre relativa alla sua posizione precedente: non assoluta.

Keyboard
Le funzioni keyboard permettono a una scheda Leonardo o Micro di inviare pressioni di
tasti a un computer host collegato.
Anche se con la libreria Keyboard non possibile inviare tutti i caratteri ASCII possibile,
e in particolare quelli che non vengono stampati, la libreria supporta lutilizzo dei tasti
modificatori.

I tasti modificatori cambiano il comportamento di un altro tasto quando vengono premuti


simultaneamente. La Tabella 7-1 elenca i tasti modificatori supportati dalla scheda
Leonardo.
Tabella 7-1 - I tasti modificatori della tastiera USB.

Valore Valore Valore


Tasto Tasto
esadecimale decimale esadecimale
KEY_LEFT_CTRL 0x80 128 KEY_PAGE_UP 0xD3
KEY_LEFT_SHIFT 0x81 129 KEY_PAGE_DOWN 0xD6
KEY_LEFT_ALT 0x82 130 KEY_HOME 0xD2
KEY_LEFT_GUI 0x83 131 KEY_END 0xD5
KEY_RIGHT_CTRL 0x84 132 KEY_CAPS_LOCK 0xC1
KEY_RIGHT_SHIFT 0x85 133 KEY_F1 0xC2
KEY_RIGHT_ALT 0x86 134 KEY_F2 0xC3
KEY_RIGHT_GUI 0x87 135 KEY_F3 0xC4
KEY_UP_ARROW 0xDA 218 KEY_F4 0xC5
KEY_DOWN_ARROW 0xD9 217 KEY_F5 0xC6
KEY_LEFT_ARROW 0xD8 216 KEY_F6 0xC7
KEY_RIGHT_ARROW 0xD7 215 KEY_F7 0xC8
KEY_BACKSPACE 0xB2 178 KEY_F8 0xC9
KEY_TAB 0xB3 179 KEY_F9 0xCA
KEY_RETURN 0xB0 176 KEY_F10 0xCB
KEY_ESC 0xB1 177 KEY_F11 0xCC
KEY_INSERT 0xD1 209 KEY_F12 0xCD

Altre librerie
Esistono molte altre librerie disponibili per le schede Arduino. Alcune sono state create
da individui, altre da societ che vendono e supportano hardware e accessori per
Arduino. Inoltre, alcuni distributori forniscono anche librerie o software di supporto per i
loro prodotti e questo codice spesso si trova cercandolo sul sito web adatto oppure su
eBay.
Le Tabelle dalla 7-2 alla 7-8 elencano una selezione di queste librerie, suddivise in
categorie. Le descrizioni sono necessariamente brevi: davvero impossibile descriverle
tutte in modo sufficiente da rendere loro giustizia mantenendo il libro in un formato
compatto. Trovate i link per maggiori dettagli su
http://www.arduino.cc/en/Reference/Libraries.
Tabella 7-2 - Comunicazione (reti e protocolli).

Libreria Descrizione
Messenger Per elaborare messaggi di testo provenienti dal computer
NewSoftSerial Una versione migliorata della libreria SoftwareSerial
Per controllare dispositivi (di Dallas Semiconductor) che
OneWire
utilizzano il protocollo One Wire
PS2Keyboard Per leggere caratteri provenienti da una tastiera PS2
Simple Message
Per inviare messaggi tra Arduino e il computer
System
Per inviare messaggi di testo o email utilizzando un telefono
SSerial2Mobile
cellulare (con comandi AT via SoftwareSerial)
Una libreria server web che si pu estendere (da utilizzare con
Webduino
la shield Ethernet di Arduino)
X10 Per inviare segnali X10 su linee di alimentazione AC
XBee Per comunicare con XBee in modalit API
Per controllare in remoto altre schede Arduino per mezzo di un
SerialControl
collegamento seriale

Tabella 7-3 - Percezione.

Libreria Descrizione
Capacitive Sensing Per convertire due o pi pin in sensori capacitivi
Per leggere input digitali con disturbo (per esempio provenienti
Debounce
da pulsanti)

Tabella 7-4 - Display e LED.

Libreria Descrizione
Classe di base con routine grafiche standard (di Adafruit
GFX
Industries)
Routine grafiche per LCD basate su chipset KS0108 o
GLCD
equivalente
Per controllare matrici di LED o display a 7 segmenti con un
LedControl
MAX7221 o un MAX7219
Unalternativa alla libreria Matrix per gestire diversi LED con
LedControl
chip Maxim
LedDisplay Per controllare un display di LED scorrevole HCMS-29xx
Matrix Libreria di base per manipolare matrici di LED
Per il controller LCD su dispositivi di tipo Nokia 55100 (di
PCD8544
Adafruit Industries)
Sprite Libreria di base per manipolare immagini sprite da utilizzare con
una matrice di LED
Per il controller LCD su uno schermo TFT 1,8, 128 160 pixel
ST7735
(di Adafruit Industries)

Tabella 7-5 - Audio e forme donda.

Libreria Descrizione
FFT Per analizzare la frequenza di audio o altri segnali analogici
Per generare onde quadre di frequenze audio sullo sfondo su
Tone
un pin del microcontroller

Tabella 7-6 - Motori e PWM.

Libreria Descrizione
Per controllare il TLC5940 IC, ununit PWM da 16 canali e 12
TLC5940
bit

Tabella 7-7 - Timing.

Libreria Descrizione
Una libreria per tenere traccia di data e ora correnti nel
DateTime
software
Metro Aiuta a temporizzare azioni a intervalli regolari
Utilizza linterrupt del timer 2 per lanciare unazione ogni N
MsTimer2
millisecondi

Tabella 7-8 - Utility.

Libreria Descrizione
PString Una classe leggera per stampare sui buffer
Streaming Una libreria che semplifica le dichiarazioni di stampa
8

Le shield

Una shield Arduino una scheda a circuito aggiuntiva progettata per lavorare con i
connettori che si trovano sulle schede Arduino standard come la Uno, la Duemilanove, la
Leonardo, oppure la Mega. Le shield sono dotate di pin che si interfacciano con Arduino
in modo che lalimentazione, gli I/O digitali, quelli analogici e cos via diventino disponibili
per la shield. Questo capitolo descrive alcune delle shield compatibili con Arduino che
esistono sul mercato, mentre il Capitolo 10 descrive il processo di creazione di una
shield personalizzata.
Esistono shield pensate per una vasta gamma di applicazioni, da schede essenziali per
la proptotipazione a controllori di motori, interfacce Ethernet, memorie flash SD e
display. Molte shield possono essere collegate una sopra laltra, permettendo a una
scheda Arduino di base di interfacciarsi contemporaneamente con due o pi shield.

NOTA Questo capitolo menziona molti distributori e produttori, ma non con lintenzione di consigliarne qualcuno in
particolare. Le shield mostrate qui semplicemente rappresentano quello che avete a disposizione e per ciascun tipo
probabilmente potete trovare distributori diversi che vendono lo stesso prodotto o uno equivalente. Potete sentirvi liberi
di acquistarle dove preferite.

Questo capitolo non assolutamente un elenco completo di tutti i vari tipi di shield che
avete a vostra disposizione. Esiste un settore di produzione a domicilio specializzato
nella creazione di nuove variazioni di shield esistenti e di tipi nuovi che non si sono mai
visti prima. La selezione di shield descritta qui ampiamente rappresentativa di quello
che esiste e qui trovate i link necessari se volete saperne di pi o magari acquistare una
shield o due. In alcuni casi, ho incluso informazioni pi dettagliate rispetto a quelle che
forniscono i distributori (o che non forniscono proprio, in alcuni casi), ma questo non
significa che io sia particolarmente affezionato a una shield in particolare.
Semplicemente, sono affezionato alla documentazione e quindi sono solito cercarla per
procedere con quello che voglio fare. Anche voi potete trovarvi nella situazione di
possedere una shield che sembra davvero utile ma per la quale non esiste quasi o del
tutto documentazione o per la quale esiste soltanto in cinese (o in qualche altra lingua
che magari non conoscete). Spero che questo capitolo vi aiuti a riempire alcuni di questi
vuoti, o almeno che vi offre una vaga idea di dove andare a cercare.

SUGGERIMENTO Alcune delle shield mostrate qui non sono pi disponibili presso i distributori originali, ma possono
essere acquistate da altre parti. Quasi tutti i distributori forniscono link attivi alla documentazione e quindi, se trovate
una shield che sembra simile alla vostra (dopo tutto si tratta di hardware open source), spesso riuscite a ottenere le
informazioni tecniche che vi servono.

Quando si cerca una shield, una cosa da ricordare che alcuni sembrano non avere
ben chiaro che cos una shield. Non un modulo con una riga di pin su un lato (come
quelli che vedremo nel Capitolo 9). Una shield una scheda con le caratteristiche fisiche
descritte in Le caratteristiche fisiche delle shield a pagina 221. Tutto il resto pu
essere considerato un modulo e i moduli possono collegarsi direttamente o meno ad
Arduino (di solito non si collegano semplicemente, ma hanno bisogno di fili elettrici di
qualche tipo che conducano lalimentazione e i segnali ai pin adatti sulla scheda
Arduino).

Le caratteristiche elettriche delle shield


Se confrontare i diagrammi dei pinout delle varie shield presentate in questo capitolo,
potete notare un modello regolare: le shield che utilizzano uninterfaccia a due fili
(linterfaccia TWI o I2C) utilizzano sempre i pin A4 e A5 di Arduino. Su una scheda di
tipo base (Diecimila, Duemilanove e Uno R2 o SMD), questi si trovano sul connettore
I/O analogico, mentre sul layout esteso delle schede pi recenti (Uno R3, Ethernet,
Leonardo), i segnali appaiono anche sulle estensioni dei pin-header (nellangolo in alto
accanto al connettore USB o RJ45). Una shield che utilizza I2C pu utilizzare una
qualsiasi delle serie di pin e potete dare per scontato che A4 e A5 non saranno
disponibili per altri usi senza intervenire con la programmazione.
Per lo stesso motivo, le shield che utilizzano linterfaccia SPI di solito utilizzano i pin D10,
D11, D12 e D13 (SS, MOSI, MISO e SCK, rispettivamente). Lutilizzo di D10 come pin
select opzionale e per questo scopo alcune shield utilizzano un pin digitale diverso.
Ricordate che con SPI, per poter accettare i dati provenienti dal dispositivo master,
ciascun dispositivo slave deve essere selezionato esplicitamente con un segnale
select. Le shield con pi di un dispositivo SPI collegato possono anche utilizzare pi di
un pin I/O digitale come segnale select.
Le shield che utilizzano UART (o USART, come lo chiama Atmel) di solito utilizzano i pin
D0 e D1 (Rx e Tx, rispettivamente, oppure RxD0 e TxD0 sulle schede Arduino di tipo
Mega). Alcune shield Bluetooth utilizzano linterfaccia UART per comunicare con un
modulo Bluetooth, come la shield di interfaccia RS-232 e la RS-485.
Poi esistono shield che utilizzano quasi tutti i pin di Arduino. La shield DIY multifunzione
descritta in Shield varie a pagina 273 funziona cos, ma dotata di pin per collegarsi a
segnali che non sono utilizzati specificamente sulla scheda (tre digitali e uno analogico,
in questo caso). In generale, potete tranquillamente dare per scontato che le shield di
estensione I/O utilizzano la maggior parte o tutti i pin disponibili di Arduino e che le shield
che supportano qualcosa come per esempio un display generalmente non sono dotate
di nessun punto di collegamento per accedere ai segnali che non si utilizzano. Per
questo motivo, questi tipi di shield di solito non possono accoglierne unaltra sopra di
esse e devono essere posizionate in cima a una pila di shield su Arduino.
Quasi tutte le shield non presentano circuiti estremamente complicati, ma sono cose
relativamente semplici basate su IC esistenti oppure su componenti di un qualche tipo.
Come le schede Arduino, essenzialmente sono contenitori per alcuni tipi di IC, rel e
cos via. Le caratteristiche elettriche di una shield sono quelle del chip o dei componenti
sui quali si basa. Questa semplicit quello che contribuisce a mantenere basso il costo
di una shield, mentre le funzionalit degli IC o dei componenti che utilizza sono quello
che la rende utile.
Infine, alcune shield possono mettere in un buffer i segnali diretti a o provenienti da
Arduino, utilizzando circuiti attivi oppure dispositivi come isolatori ottici o rel, ma la
maggior parte di loro serve semplicemente da posto per montare connettori o
componenti, come le shield di estensione mostrate in Shield di estensione I/O a pagina
226, che utilizzano connettori multipin. Le connessioni, che siano socket-header oppure
pin-header sono semplicemente estensioni dei pin di Arduino e non c niente che
prevenga dal rischio di collegare 12 volt a un input digitale da 5 V (o addirittura da 3,3
V) e convertire il microcontroller AVR di Arduino in un pezzo di carbone. Per questo,
necessario fare sempre attenzione al voltaggio e controllare i limiti di tensione del
microcontroller AVR.

Le caratteristiche fisiche delle shield


Dal punto di vista fisico, una tipica shield grande come una scheda Arduino di base (ne
trovate le dimensioni nel Capitolo 4) e pu presentare la stessa lunghezza di Arduino,
oppure essere pi lunga o pi corta. possibile creare una shield pi ampia di una
scheda Arduino di base, dal momento che lunico limite reale il fatto che i pin della
shield devono potersi allineare con i pin socket della scheda Arduino sottostante (ne
trovate posizioni e dimensioni nel Capitolo 4). Installare una shield non comporta
nientaltro che collegarla come mostra la Figura 8-1.
Figura 8-1 - Come si monta una shield su una scheda Arduino host.

Le schede Arduino pi recenti, che utilizzano il layout dei pin R3, sono dotate di due pin
socket al termine di ciascuna riga, che non sono utilizzate dalla shield. Questo non
importante, dal momento che queste prese extra o sono duplicati di pin esistenti oppure
non sono collegate. Nel caso delle schede Mega, la shield si monta come mostra la
Figura 4-20 nel Capitolo 4, dove la maggior parte dei pin della scheda Mega non sono
collegati alla shield e alcuni altri sono resi inaccessibili dalla PCB della shield
sottostante. Tutti i pin e i segnali di base sono a disposizione della shield.

SUGGERIMENTO Bisogna sempre controllare lisolamento tra i componenti della scheda Arduino di base e la PCB
della shield. In alcuni casi, un connettore USB o un jack RJ45 pu interferire con la shield e potenzialmente causare un
corto circuito.

A volte, potete riscontrare un problema con alcune parti della scheda Arduino che
toccano le tracce o le piazzole del circuito che si trovano sulla parte posteriore di una
shield. Per isolare il contatto potete utilizzare un pezzettino di nastro isolante o
addirittura un pezzo di carta spessa, ma il modo migliore di risolvere questo problema
utilizzare dei distanziatori o degli standoff per separare fisicamente le due schede.
Questi possono essere piccoli tubi di metallo o di nylon (di una lunghezza compresa tra
7/16 e 1/2 di pollice, circa 11/12 mm) con un foro centrale sufficiente per una vite a
testa tonda (che tipicamente di tipo 2-56 SAE, oppure di una dimensione simile). La
differenza tra uno standoff un distanziatore semplice: gli standoff hanno filettature
interne, i distanziatori no. Un distanziatore o uno standoff serve per alzare la scheda
superiore abbastanza da prevenire cortocircuiti, come mostra la Figura 9-3 nel Capitolo
9. Inoltre, permette di bloccare meccanicamente in modo solido due o pi schede.
Quando si montano una sopra laltra due o pi shield su un Arduino, si pu decidere di
utilizzare viti a testa tonda lunghe con distanziatori, oppure si pu scegliere di utilizzare
un tipo di standoff con proiezione di tipo vite su unestremit e un foro filettato sullaltra
estremit. Questi, noti anche come martinelli a vite, si trovano spesso sui PC e, se mai
avete assemblato il vostro computer a partire da zero, li avete gi visti. La Figura 8-2
mostra alcuni esempi dei tipi di distanziatori e di standoff disponibili. Questi componenti
possono essere fatti di nylon, allumino, acciaio inossidabile, ottone o plastica.

Figura 8-2 - Tipi di distanziatori e standoff.

I distanziatori possono anche essere ricavati da strisce ritagliate da PCB di


prototipazione e fatte scivolare tra i pin della scheda superiore. Questa tecnica non
serve molto per la connessione fisica delle schede, ma aggiunge spazio sufficiente per
prevenire collisioni.
Potete acquistare distanziatori e standoff presso vari distributori, come Amazon
(http://amazon.com/), McMaster-Carr (http://www.mcmaster.com/), Mouser
(http://www.mouser.com/) e Digi-Key (http://www.digikey.com/). Se per caso nella
vostra citt presente una ferramenta, qui vi potete trovare questi prodotti e altre cose
utili (come viti a testa tonda e dadi 1-72 o 2-56).
Montare diverse shield una sopra laltra
A volte, non ha senso utilizzare terminali pin socket estese per far stare una shield su
una pila. Se, per esempio, una shield ha un grande numero di connettori che richiedono
accesso verticale, semplicemente non c spazio sufficiente per montarvi sopra unaltra
shield. Ma a volte potete imbattervi in una shield che pu essere montata su unaltra ma
non dotata dei tipi di connettori corretti.
Di solito, per permettere a una shield di essere montata su unaltra, si utilizzano due
tecniche: socket con pin estesi oppure pin e socket spostati. Lapproccio dei pin estesi
permette alla shield di allinearsi verticalmente. Laltro design produce shield una sopra
laltra che sono spostate della distanza tra le righe di pin e di socket. Se le shield si
spostano tutte nello stesso modo, il risultato pu avere laspetto di una scala e i fori
delle viti di montaggio sulle schede non si allineano correttamente.
Luso di pin estesi richiede socket con pin lunghi per il montaggio su una PCB. I pin pi
lunghi sulla parte posteriore (quella delle saldature) della shield si inseriscono nei socket
di Arduino e unaltra shield pu essere montata in cima. La tecnica dello spostamento
utilizza pin-strip separate per collegare la shield a Arduino e socket-strip separate per
accettare unaltra shield. Queste vengono montate una di fianco allaltra, di solito pi
vicino possibile per ridurre al minimo lo spostamento tra le shield.

Shield Arduino comuni


I questo paragrafo vedremo alcuni dei tipi pi comuni di shield. Non assolutamente un
elenco esaustivo, dal momento che continuamente ne appaiono di nuove e ne vengono
abbandonate di vecchie o che altrimenti possono non essere pi disponibili. In questera
di prototipazione rapida, improvvise inversioni di tendenza e produzione a basso costo,
una shield pu apparire e poi scomparire soltanto pochi mesi dopo. Per rimanere al
passo con quello che esiste, potete consultare gli elenchi dei distributori cinesi su eBay
e quelli di Amazon.com, Adafruit, SparkFun, SainSmart e altri siti web. NellAppendice C
trovate fonti note di shield Arduino. La Tabella 8-2 che si trova al termine di questo
capitolo elenca i distributori e produttori dei quali parliamo qui.
Ecco un elenco che rappresenta un riferimento rapido delle shield descritte qui,
suddivise in categorie:
Input/output
Shield destensione I/O
Shield despansione I/O
Rel shield
Shield che trasportano il segnale
Memoria
Schede di memoria flash SD e microSD
Comunicazione
I/O seriale
MIDI
Ethernet
Bluetooth
USB
ZigBee
CAN
Prototipazione
Controllo del movimento
Controllo di motori passo-passo e DC
Controllo di PWM e servo
Display
Array di LED
Display di LED a 7 segmenti
Display LCD
Display TFT a colori
Shield per la strumentazione
Registrazione di dati
Analizzatore logico
ADC da 24 bit
ADC da 12 bit
Shield adattatore
Adattatori Nano
Adattatori morsettiera
Shield varie
Morsettiera/prototipazione
Shield multifunzione
In questo paragrafo, daremo anche una rapida occhiata ad alcune shield meno comuni
progettate per applicazioni specifiche: uninterfaccia di controllo di un incisore CNC,
uninterfaccia di controllo di una RepRap e un game controller FPGA.

Input/Output
Esistono shield input/output (I/O) che collegano vari pin I/O di Arduino ai connettori che
sono pi robusti dei pin del circuito della scheda Arduino (oppure, nel caso dellArduino
Nano, i pin sotto la scheda sono collegati a connettori tipo morsettiera su un contenitore
per la PCB della Nano).
Le shield I/O possono essere ampiamente classificate come shield destensione oppure
come shield despansione, anche se il termine shield despansione spesso viene
applicato a entrambi i tipi. Una shield destensione collega i pin I/O di un Arduino senza
alterarne i segnali: semplicemente utilizza tipi diversi di connettori. Una shield
despansione vera e propria, invece, utilizza componenti elettronici attivi per aumentare il
numero di canali I/O digitali discreti. Per comunicare con la scheda Arduino host, questi
tipi di shield utilizzano SPI o I2C.

Shield di estensione I/O


Questa categoria di shield si utilizza per condurre i segnali input/output dal chip AVR ai
connettori che sono pi robusti dei pin socket utilizzate sulle schede Arduino. Alcune
shield destensione I/O possono offrire un buffering attivo di qualche tipo, ma la maggior
parte si limitano a portare i segnali della scheda Arduino. A volte, vengono dette shield
despansione, ma non del tutto corretto, dal momento che si limitano a trasferire i
segnali esistenti da un connettore di Arduino a un altro sulla shield.
La shield per sensori di SainSmart (http://bit.ly/sainsmart-sensor-shield)
Si tratta di una shield che si pu montare con altre (notate lo spostamento tra le pin-
strip e le socket strip nella Figura 8-3). Gli I/O dellAVR sono portati fuori da socket
multi-pin, blocchi di pin-header e posizioni per due header da 10 pin adatti per
essere utilizzati con connettori con cavo a nastro di tipo IDC. fornito anche un
interruttore di reset. Questa shield pu essere utilizzata con qualsiasi scheda
Arduino con la configurazione di base dei pin, comprese le schede Mega.
Figura 8-3 - La shield despansione I/O di SainSmart (interfaccia per sensori).

La Figura 8-4 illustra i grandi connettori modulari sui bordi della PCB della shield.
Questi sono connettori multipin, a volte detti conntettori buckled, che si adattano
alle spine corrispondenti di tre e quattro pin. I cavi multiconduttori sono comuni e
possono essere trovati presso diversi rivenditori. Uno (diverso da SainSmart)
TrossenRobotics (http://bit.ly/trossen-robotgeek).
Figura 8-4 - Il layout dei pin e dei connettori della shield despansione I/O di SainSmart.

La shield per sensori di TinkerKit (http://bit.ly/tinkerkit-sensor)


Questa shield che si pu montare con altre (Figura 8-5) utilizza prese di pin con
terminali lunghi, 12 connettori da tre pin e due connettori da quattro pin. Tra i
connettori da quattro pin si trova un interruttore di reset.
Figura 8-5 - La shield despansione I/O di TinkerKit.

In origine, la shield per sensori di TinkerKit era stata progettata per lavorare con vari
moduli sensore e motore prodotti da TinkerKit, ma pu essere utilizzata come
qualsiasi altra shield destensione I/O. La Figura 8-6 mostra il layout dei connettori
sulla PCB. Questi utilizzano uno schema a tre fili come quello utilizzato sulla scheda
di SainSmart che abbiamo mostrato prima. Per maggiori dettagli sui moduli TinkerKit
progettati per essere utilizzati con questa shield, potete consultare il Capitolo 9.

Figura 8-6 - I connettori della shield despansione I/O di TinkerKit.


Anche se attualmente TinkerKit non attiva, i suoi prodotti si trovano ancora presso
Mouser (http://www.mouser.com/) e altri rivenditori. Le librerie software sono
disponibili su GitHub (https://github.com/TinkerKit).
La shield per sensori per Mega di TinkerKit (http://bit.ly/tinkerkitmega-sensor)
La shield per sensori per Mega di TinkerKit (Figura 8-7) progettata per collegare i
pin I/O addizionali delle schede Arduino Mega, Mega2650 o Mega ADK. Utilizza
prese di pin a terminali lunghi per permettere di montarle una sopra laltra e sulla
PCS fornito un interruttore di reset. Essenzialmente si tratta di una versione pi
grande della shield di TinkerKit descritta prima.

Figura 8-7 - La shield despansione I/O di TinkerKit per le schede Arduino di tipo Mega.

La shield Grove Base


Un sistema di moduli e di shield che sta guadagnando popolarit tra gli utenti di
Arduino sono i componenti Grove venduti da Seeed Studio. Si tratta di un ampia
variet di moduli da scegliere ed disponibile una scheda di base con integrata una
MCU ATMEGA328p compatibile con Arduino. La scheda, progettata da Linaro.com
(96Boards.org), mostrata nella Figura 8-8.
Figura 8-8 - La shield Grove Base.

Seeed Studio vende anche una shield despansione passiva (cio priva di MCU
integrata) per il sistema di moduli Grove, ma, anche se potete riuscire ancora a
trovarne qualcuna, non sono pi sviluppate. La shield Passive Seeed Studio Grove
Base mostrata nella Figura 8-9. Per ulteriori informazioni sulla serie di moduli
Grove e le shield di interfaccia compatibili, potete visitare la wiki di Seeed Studio
(http://bit.ly/seeed-grove).
Figura 8-9 - La shield Seeed Studio Passive Grove Base.

La shield despansione per sensori di CuteDigi (http://bit.ly/cutedigi)


Tecnicamente, si tratta di una shield destensione I/O, pi che di una shield
despansione vera e propria. Per portare i segnali delle schede Arduino di tipo Mega,
questa shield di CuteDigi (Figura 8-10) utilizza header di pin anzich connettori. Non
permette di montare su di essa unaltra shield, ma, vista la distribuzione verticale dei
pin sulla PCB, non avrebbe senso montare qualcosa su questa scheda. Le etichette
sulla PCB sono chiare e le funzioni ovvie. Questa shield interessante per il fatto
che include anche un header con pin ad angolo retto per collegarsi a un lettore di
schede flash di tipo SD e un header di pin da utilizzare con un modulo Bluetooth. I
connettori adottano lo stesso schema S-V-G (signal, V+, ground) che si trova su
altre shield destensione I/O.
Figura 8-10 - La scheda destensione per Mega di CuteDigi con le connessioni flash SD e Bluetooth.

Shield despansione I/O


A differenza delle shield destensione I/O elencate nel paragrafo precedente, una shield
despansione I/O offre ulteriori funzionalit I/O, di solito nella forma di I/O digitali discreti
(anche se alcune shield presentano capacit analoghe). Dal momento che queste shield
sono dotate di circuiti attivi oltre a vari connettori, sono pi care di quelle destensione. Il
grande vantaggio che offrono rappresentato dal fatto che mettono a disposizione
diversi canali I/O utilizzando soltanto una connessione I2C o SPI con la scheda Arduino
sottostante. Questo lascia i pin rimanenti di Arduino a disposizione per altre applicazioni.
La shield Centipede di Macetech (http://bit.ly/macetech-centipede)
La shield Centipede di Macetech (Figura 8-11) utilizza linterfaccia I2C di Arduino per
fornire 64 pin I/O digitali discreti a scopo generale. I pin sono organizzati in 4 gruppi
di 16 pin, con ciascun gruppo controllato da un chip di espansione I/O I2C. La Figura
8-12 mostra il layout dei pin I/O utilizzato sulla shield di Macetech. Ciascuno degli IC
MUX (multiplexer) controlla 16 pin, oppure un blocco di pin I/O. Notate come
organizzata la numerazione dei pin su ciascun blocco, con la numerazione avvolta
intorno al blocco.
Figura 8-11 - La shield despansione I/O Centipede di Macetech.

Figura 8-12 - Il layout dei pin della shield I/O Centipede di Macetech.

La shield despansione I/O di LinkSprite (http://bit.ly/linksprite)


Si tratta di una shield che si pu montare con altre e che utilizza un chip
despansione I/O I2C MCP23017 per fornire 16 ulteriori pin I/O digitali discreti
(Figura 8-13). Notate che questa shield progettata per utilizzare schede Arduino in
stile R3 e che utilizza gli ultimi due pin (9 e 10, SDA e SCL) del connettore esteso
che si trova sulle schede Uno R3 e Leonardo. I pin I/O espansi sono sistemati in due
serie di otto canali discreti, che si chiamano GPIOA e GPIOB. Come mostra la
Figura 8-14, questi sono posizionati accanto alle strisce di prese di pin I/O digitali.
Questo rende scomodo utilizzare questi pin se su questa montata unaltra shield,
per cui bisogna fare attenzione alle peculiarit di questo tipo. Se invece lunica
shield che si sta utilizzando, oppure quella che sta al di sopra di tutte le altre, non
dovrebbero esserci problemi.

Figura 8-13 - La shield despansione I/O a 16 canali di CuteDig.


Figura 8-14 - Il layout dei pin della shield despansione I/O a 16 canali di CuteDig.

La shield despansione I/O digitale e analogico di Numato (http://bit.ly/numato-


digitalanalog)
La shield despansione digitale e analogico di Numato (Figura 8-15) mette a
disposizione 28 ulteriori canali I/O digitali discreti e 16 input analogici utilizzando due
chip I/O I2C MCP23017 e un IC multiplexer analogico NXP 74HC4067 per i segnali
analogici.
Figura 8-15 - La shield despansione I/O digitale e analogico di Numato.

Come mostra la Figura 8-16, linterfaccia principale con Arduino linterfaccia I2C
sui pin A4 e A5. I pin interrupt dei chip MCP23017 sono anchessi collegati ai blocchi
di pin I/O digitali. I sei pin header al centro della scheda si utilizzano con blocchi di
jumper per selezionare gli indirizzi I2C dei due chip MCP23017.

Figura 8-16 - Il layout dei pin della shield despansione I/O di Numato.
Rel shield
Le rel shield sono disponibili con uno o pi rel. I rel utilizzati in queste shield possono
essere da 5 o da 10 ampere come quelli mostrati sulle shield elencate qui, oltre che i
rel reed dei package DIP.

NOTA Quando dovete scegliere una scheda rel, dovete fare attenzione a notare la valutazione massima della shield
suggerita dal rivenditore. I rel modulari che si utilizzano su una shield possono essere dotati di contatti nominalmente
per AC da 10 A a 120 V, ma i connettori e le tracce della PCB della shield PCB possono non essere indicati per questo
livello di teensione. Notate anche che non tutti i rivenditori riducono la capacit tenendo conto dei limiti dei connettori
delle PCB. Conviene prendersi un momento e controllare le specifiche del rel basandosi sul numero del componente
mostrato nelle foto o negli schemi del rivenditore. Pensateci due volte, prima di procurarvi una shield dove i numeri dei
componenti sono stati rimossi o nascosti in qualche altre modo (e questo vale per qualsiasi shield, non soltanto per le
rel shield).

La rel shield di DFRobot (http://bit.ly/dfrobot-relay)


Questa shield mostra come il fattore di forma di una shield pu essere modificato
per adattarla a componenti pi grandi. Nel caso della rel shield di DFRobot (Figura
8-17), i quattro rel sono montati su un componente espanso della PCB della shield.
I contatti dei rel hanno 3 A nominali a DC da 24 V o AC da 120 V, con una capacit
di tensione massima di 5 A. Si tratta di una shield che pu essere montata con altre,
anche se i pin I/O verticali possono rendere difficile utilizzare unaltra scheda sopra
questa.

Figura 8-17 - La rel shield di DFRobot.

La scheda utilizza una serie di jumper per portare i segnali digitali per i driver dei rel
e i pin di un modulo XBee, mostrato nella Figura 8-18. Tutti i pin digitali e analogici di
Arduino sono collegati in blocchi di pin header.

Figura 8-18 - Il layout della rel shield di DFRobot.

La rel shield di Numato (http://bit.ly/numato-relay)


Questa shield (Figura 8-19) utilizza due rel modulari a basso consumo con contatti
da 1 A ad AC 120 V e 2 A a DC 24 V. La shield di Numato utilizza i pin digitali di
Arduino 2 e 3. I terminali dei rel sono collegati a delle morsettiere. Si tratta di una
shield che pu essere impilata sulle altre.
Figura 8-19 - La rel shield di Numato.

La rel shield di Seeed Studio (http://bit.ly/seeedstudio-relay)


La rel shield di Seeed Studio (Figura 8-20) utilizza quattro rel con contatti da 10 A
ad AC 120 V. Utilizza i pin di output digitale di Arduino dal 4 al 7, uno per rel.
Ciascun rel dotato di un LED che ne indica lattivit. Si tratta di una shield che pu
essere montata con altre.

Figura 8-20 - La rel shield di Seeed Studio.

Shield che trasportano il segnale


Non ne esistono moltissime. Di solito, quelle che si trovano sono di due tipi: routing
passivo oppure routing MUX (multiplexer) attivo.
La patch shield di Adafruit (http://www.adafruit.com/products/256)
Una patch board una board dinterconnessione messa a disposizione da Adafruit e
mostrata nella Figura 8-21 permette di connettere i segnali tra quattro connettori di
tipo RJ45 (noti anche come connettori 8P8C) e la scheda Arduino sottostante
utilizzando fili patch corti inseriti in blocchi di pin socket.

Figura 8-21 - La patch shield di Adafruit.

NOTA Questo un kit, non una shield assemblata. La foto mostra come deve presentarsi la shield assemblata.

Lidea principale che sta dietro la patch shield portare determinati segnali a e da un
Arduino per mezzo di cavi Ethernet convenzionali a punti di connessione remoti,
come mostra la Figura 8-22. Il kit include quattro PCB satellite con jack 8P8C
(RJ45) e pin per collegarsi a una breadboard che non richiede saldature, un modulo
sensore, oppure unaltra scheda Arduino. Su questa shield o sulle schede satellite
non ci sono componenti attivi: si limitano semplicemente a trasportare segnali.
Figura 8-22 - Il layout e luso della patch shield di Adafruit.

La shield Go-Between di Mayhew Labs (http://bit.ly/mayhew-gobtw)


La shield Go-Between (Figura 8-23) utilizza una matrice di posizioni di jumper
saldabili per portare i segnali dallArduino di base o da una shield pi in basso a una
shield pi in alto. Pu rivelarsi utile quando volete mettere una sopra laltra due shield
che utilizzano gli stessi pin per le funzioni I/O. Se i pin della shield superiore possono
essere spostati su pin diversi sulla shield inferiore senza dover apportare modifiche,
questo risolve il problema. Tutto funzioner con una piccola modifica del software.

Figura 8-23 - La shield Go-Between di Mayhew Labs.

La Mux Shield II di Mayhew Labs (http://bit.ly/mayhew-mux)


La Mux Shield II (Figura 8-24) una shield attiva che supporta fino a 48 input o
output utilizzando tre chip multiplexer CD74HC4067 di Texas Instruments e tre circuiti
di output con registri a scorrimento. La scheda utilizza quattro dei pin digitali di
Arduino per controllare i chip MUX e i registri a scorrimento. I pin digitali predefiniti
sono il 2, il 4, il 6 e il 7. I pin A0, A1 e A2 di Arduino si utilizzano come input dei chip
MUX. Larray di piazzole 3 16 (Figura 8-25) pu essere utilizzato con pin header o
pin socket. Ciascun canale bidirezionale, nel senso che trasporta segnali a un
output comune oppure da un input comune. Ciascun chip MUX simile a un array di
interruttori, ciascuno con una leggera resistenza mentre chiuso e unimpedenza
molto alta quando aperto.

Figura 8-24 - La shield multiplexer attiva di Mayhew Labs (Mux II).


Figura 8-25 - I pin della shield multiplexer di Mayhew Labs.

La Mux Shield di Mayhew Labs (http://mayhewlabs.com/arduino-mux-shield)


Simile alla shield descritta prima, questa shield multiplexer attiva mette a
disposizione 48 linee I/O programmabili utilizzando tre chip MUX TI CD75HC4067
(vedere Figura 8-26). Inoltre, offre due grossi blocchi di pin socket header per
accedere ai segnali. I pin digitali di Arduino dal 2 al 5 si utilizzano per comunicare con
i chip MUX e i pin A0, A1 e A2 sono gli input analogici provenienti dai chip MUX. Si
tratta di una shield che pu essere montata con altre.
Figura 8-26 - La shield multiplexer attiva di Mayhew Labs (Mux).

Memoria
Senza dubbio, i formati di memoria flash SD e microSD rappresentano il modo pi
diffuso di aggiungere della memoria per i file ad Arduino. Alla memoria flash esterna si
accede per mezzo dellinterfaccia SPI e spesso, come funzionalit aggiuntiva sulle shield
che utilizzano SPI come funzione principale (Ethernet, WiFi, host USB, ecc.), si trova
una presa SD o microSD. La memoria flash rimovibile un modo comodo di registrare i
dati provenienti da un Arduino indipendente e poi successivamente caricarli nel proprio
PC e farci quello che si desidera.
Queste descrizioni non sono accompagnate da diagrammi, principalmente perch
linterfaccia SD o microSD di Arduino semplicemente uninterfaccia SPI. Una shield ha
il segnale select su un pin non comune. Questo pu creare un conflitto con il software
esistente.
La shield con scheda SD di Seeed Studio (http://bit.ly/seeedstudio-sd-card)
Progettata per schede SD di memoria flash a dimensione normale, questa shield
(mostrata nella Figura 8-27) pu essere facilmente utilizzata con schede microSD
con un adattatore. Per linterfaccia SPI si utilizzano i pin digitali di Arduino D4, D11,
D12 e D13. La shield, inoltre, collega i pin ICSP, I2C e UART ai connettori della
PCB. Si tratta di una shield che pu essere montata con altre.

Figura 8-27 - La shield con scheda di memoria SD di Seeed Studio.

La shield con scheda SD SHD-SD (http://bit.ly/shd-sd-sdcard)


Questa shield SD, illustrata nella Figura 8-28, presenta una piccola area di
prototipazione per aggiungere circuiti personalizzati. Pu accettare schede microSD
con un adattatore.
Figura 8-28 - La shield con scheda di memoria Short.

La shield utilizza i pin D10, D11, D12 e D13 di Arduino per linterfaccia SPI con la
memoria SD. Inoltre, utilizza i 3,3 V di DC di Arduino. Questa shield pi corta di
quelle convenzionali, con la sistemazione dei pin come un Arduino di base. Pu
essere montata con altre.
La shield microSD di SparkFun (http://bit.ly/sparkfun-microsd)
La shield microSD di SparkFun (Figura 8-29) accetta soltanto schede microSD.
Include unarea di prototipazione grande 12 per 13. Questa non ha pin socket o pin
header installati, ma li si pu ordinare separatamente. Utilizza i pin D10, D11, D12 e
D14 di Arduino.
Figura 8-29 - La shield microSD di SparkFun.

Comunicazione
Anche se una scheda Arduino pu essere dotata di uninterfaccia USB (come gran parte
di esse) con la possibilit di comportarsi come una porta seriale dal punto di vista del
sistema host, o di un jack Ethernet come quello che si trova sulle schede Arduino
Ethernet, un Arduino di base come un Uno o un Leonardo in realt non molto ben
equipaggiato per quanto riguarda le interfacce di comunicazione di dati plug-and-play.
possibile collegare chip di adattamento dei livelli e utilizzare lUART integrato oppure
scrivere un cosiddetto bit-banger per inviare dati seriali, ma a volte pi comodo
utilizzare qualcosa come uninterfaccia SPI con Arduino e lasciare che sia essa a
occuparsi degli invii e delle ricezioni seriali. Per altre forme di comunicazioni di dati pu
essere coinvolto lhardware esterno necessario e quindi definitivamente pi facile
utilizzare una shield pronta per luso.

I/O seriale e MIDI


Anche se perfino Ethernet pu essere considerato una forma di comunicazione di dati
seriali, qui I/O seriale si riferisce ai vecchi standard RS-232 e RS-485. Anche se sono
vecchi, sono onnipresenti. I PC pi vecchi sono dotati di connettori RS-232 (e anche
alcuni dei modelli pi nuovi ne hanno almeno uno) e RS-485 comune nei sistemi di
strumentazione, testing e misurazione distribuita.
La shield RS232 di CuteDigi (http://bit.ly/cutedigi-rs232)
La shield RS-232 (Figura 8-30) utilizza un IC MAX232 per eseguire ladattamento dei
livelli del segnale necessario per inviare e ricevere segnali compatibili con RS-232.
Per configurare linterfaccia seriale si utilizza una serie di jumper e per linterfaccia
seriale si possono utilizzare due qualsiasi dei pin digitali di Arduino da D0 a D7.
Installando le prese di pin fornite, diventa una shield che possibile montare con
altre.
Figura 8-30 - La shield RS232 di CuteDigi.

La shield RS-485 di CuteDigi (http://bit.ly/cutedigi-rs485)


La shield RS485 di CuteDigi (Figura 8-31) utilizza un chip MAX481CSA per fornire
linterfaccia elettrica RS485 utilizzando le porte Rx e Tx di Arduino (D2 e D3,
rispettivamente). Sulla PCB della shield fornita una posizione di montaggio per un
connettore DB-9 opzionale. Si tratta di una shield che pu essere montata con altre.
Figura 8-31 - La shield RS-485 di CuteDigi.

La shield MIDI di SparkFun (http://bit.ly/sparkfun-midi)


Il MIDI un venerabile protocollo seriale che esiste da oltre 30 anni. Tra le altre
cose, lo si utilizza per controllare sintetizzatori musicali, sequencer, drum machine e
mixer. Per inviare e ricevere messaggi relativi a eventi MIDI, la shield MIDI di
SparkFun (Figura 8-32) utilizza i pin USART di Arduino.

Figura 8-32 - La shield MIDI di SparkFun.


Per lI/O seriale MIDI, la shield MIDI utilizza i pin D0 e D1 (Rx e Tx, rispettivamente).
anche dotata di pulsanti su D2, D3 e D4; di LED collegati a D6 e D7; e di
potenziometri collegati a A0 e A1.

Ethernet
Le shield Ethernet sono molto diffuse e lIDE di Arduino gi dotata di una suite di
librerie Ethernet abbastanza completa (maggiori dettagli nel Capitolo 7). Fate attenzione
che la comunicazione tra la MCU AVR della scheda Arduino e il controller Ethernet della
shield utilizza linterfaccia SPI. LAVR non dotato di funzione DMA (direct memory
access), n in ogni caso di una memoria esterna per accedere direttamente.
Con le shield Ethernet che utilizzano SPI come interfaccia con Arduino, esiste un limite
ereditato sulla velocit alla quale possono spostarsi i dati tra la MCU AVR e il chip I/O
Ethernet e di conseguenza sulla velocit alla quale possono spostarsi i dati sul
collegamento Ethernet. Semplicemente non possibile ottenere velocit di dati pari a
100 Mb/s (100Base-T) con un processore che va 20 MHz utilizzando uninterfaccia SPI
e 10 Mb/s (10BASE-T) un obiettivo improbabile. Laspettativa pi realistica di 5
Mb/s. I dati vengono comunque inviati attraverso un livello fisico (lEthernet vero e
proprio) a 10 Mb/s, soltanto a passo di byte anzich come un flusso continuo. Tutto
dipende da quanto velocemente il software dellAVR pu assemblare i data in uscita e
inviarli al chip Ethernet. Quindi, anche se possibile creare un server web che stia in
una scatola piccola come quelle delle mentine, non pu andare molto veloce e non pu
gestire moltissime connessioni contemporaneamente.
Quello per cui realmente si distingue linterfaccia Ethernet quando viene utilizzata
come nodo finale di un sistema di controllo remoto o di sensori. Potete collegarla a
Internet, implementare una protezione per mezzo di password e utilizzarla per ricavare
dati da una posizione remota. Pu essere utilizzata per rimandare dati a un controller
centrale in un sistema industriale, oppure per rilevare temperatura, umidit e altri
parametri per un sistema di controllo HVAC (heating, ventilation and air conditioning)
come quello descritto nel Capitolo 12.
La shield Ethernet con lettore di schede microSD di Vetco (http://bit.ly/vetco-ethernet)
Questa shield Ethernet di Vetco (Figura 8-33) include anche un lettore di schede
microSD e un pulsante di reset. I pin digitali di Arduino D10, D11, D12 e D13 si
utilizzano per linterfaccia SPI utilizzata dal chip Ethernet WIZnet W5100 e per la
presa della scheda microSD. Si tratta di una shield che pu essere montata con
altre.
Figura 8-33 - La shield Ethernet di Vetco.

La shield Ethernet R3 con connettore microSD di Arduino (http://bit.ly/ethernet-r3)


La shield Ethernet ufficiale di Arduino include un lettore di schede microSD, un
pulsante di reset e tutti i componenti elettronici necessari per implementare
linterfaccia Ethernet (vedere Figura 8-34). Utilizza i pin digitali D10, D11, D12 e D13
dellinterfaccia SPI. Si tratta di una shield che pu essere montata con altre.

Figura 8-34 - La shield Ethernet di Arduino.


Bluetooth
Bluetooth una tecnologia di comunicazione wireless a basso consumo e a corto raggio
originariamente pensata per sostituire i cavi che scorrevano tra un computer e dispositivi
come stampanti, tastiere, mouse e cos via. Anche se la si utilizza ancora per queste
applicazioni, ha trovato uso in molti altri tipi di applicazioni basate sulla comunicazione.
Esistono diverse shield Bluetooth.
La shield Bluetooth (http://bit.ly/dx-bluetooth)
Questa shield gi assemblata con un modulo Bluetooth gi montato sulla PCB.
Notate che si tratta di una shield che pu essere montata con altre e che pi corta
delle tipiche shield. Lantenna il motivo dorato che emerge dallestremit del
modulo Bluetooth (vedere Figura 8-35). Utilizza i pin Rx e Tx (D2 e D3,
rispettivamente).

Figura 8-35 - La shield Bluetooth di DealeXtreme.

La shield Bluetooth di Seeed Studio (http://bit.ly/seeed-bluetooth)


Questa shield Bluetooth, compatta e che pu essere montata con altre (Figura 8-
36), utilizza i pin Rx e Tx di Arduino. Inoltre collega i pin dei segnali analogici e digitali
allinterfaccia con i moduli sensore.
Figura 8-36 - La shield Bluetooth compatta di Seeed Studio.

Il kit della shield wireless Bluetooth con modulo BT di ITEAD (http://bit.ly/itead-


bluetooth)
Questa shield (Figura 8-37) utilizza un modulo Bluetooth standard e include unarea
di prototipazione sulla PCB. una shield corta, nel senso che non occupa lintera
lunghezza di una scheda Arduino. Pu essere montata con altre.
Figura 8-37 - La shield Bluetooth con area di prototipazione di ITEAD.

La shield despansione Gravity:IO di DFRobot (http://bit.ly/dfrobot-gravityio)


Questa scheda multifunzione di DFRobot (Figura 8-38) combina funzionalit
destensione I/O con una serie di prese di pin per moduli wireless Bluetooth o
ZigBee. Non pu essere montata con altre.

Figura 8-38 - La shield multifunzione con Bluetooth di DFRobot.


USB
Una cosa che un Arduino da 8 bit non pu fare fungere da host USB per altri
dispositivi USB. Una host shield USB permette di collegare ad Arduino dispositivi USB
come tastiere, stampanti, alcuni strumenti di test e vari giocattoli.
La host shield USB di ITEAD (http://bit.ly/itead-usb)
Si tratta di una shield che pu essere montata con altre con funzionalit di host USB.
Inoltre fornisce i pin per i segnali digitali e analogici di Arduino e due posizioni da 10
pin sulla PCB per connettori o header di pin (vedere Figura 8-39). Si basa su un chip
MAX3421E con uninterfaccia SPI con Arduino.

Figura 8-39 - La host shield USB con connessioni I/O.

La host shield USB di Circuits@Home (http://bit.ly/circuitsathome-usb)


Questa shield (Figura 8-40) supporta la funzionalit USB 2.0 a piena velocit e
utilizza uninterfaccia SPI con un Arduino. I segnali digitali e analogici provenienti da
Arduino sono disponibili sulla PCB della shield e, con i corretti pin socket, pu essere
montata con altre. Utilizza un chip MAX3421E con uninterfaccia SPI con Arduino
utilizzando i pin D10, D11, D12 e D13. Non include gi pin socket o pin header.
Figura 8-40 - La host shield USB di Circuits@Home.

La host shield USB di Arduino (http://bit.ly/arduino-usb)


Come altre host shield USB, questa scheda utilizza il chip MAX3421E con
uninterfaccia SPI con Arduino utilizzando i pin D10, D11, D12 e D13. Connettori da
tre e quattro pin collegano le porte di input e di output che funzionano direttamente
con moduli TinkerKit (i moduli TinkerKit sono descritti nel Capitolo 9). Si tratta di una
shield che pu essere montata con altre (vedere Figura 8-41).

Figura 8-41 - La host shield USB di Arduino USB con connettori I/O.

ZigBee
ZigBee un noto protocollo wireless a basso consumo. Molte delle shield ZigBee per
Arduino esistenti utilizzano moduli XBee gi pronti, ma la maggior parte delle schede
possono accogliere qualsiasi modulo RF con il pinout corretto. Alcune sono disponibili
con un modulo XBee e altre senza. Un modulo XBee da 1 mW costa circa 25 $.
La shield wireless SD di Arduino (http://bit.ly/arduino-wireless)
Su questa shield ZigBee (Figura 8-42), sono fornite due prese di pin per un modulo
Digi XBee o qualsiasi altro modulo con una disposizione di pin compatibile. Questa
shield utilizza il pin D4 di Arduino come select e i pin D11, D12 e D13 per la
comunicazione SPI. Inoltre, il lettore microSD della shield utilizza linterfaccia SPI.

Figura 8-42 - La shield ZigBee di Arduino.

La shield XBee di SainSmart (http://bit.ly/sainsm-xbee)


Questa shield non include un modulo XBee, ma il layout dei pin accetta un modulo
XBee standard, oppure qualsiasi altro modulo con una disposizione di pin
compatibile. Notate che non c il lettore di microSD. Si tratta di una shield che pu
essere montata con altre con un offset (notate le posizioni degli header dei pin e
delle prese dei pin nella Figura 8-43).
Figura 8-43 - La shield ZigBee compatta di SainSmart.

La shield XBee di Seeed Studio (http://bit.ly/seeedst-xbee)


La shield XBee di Seeed Studio (Figura 8-44) presenta la posizione di montaggio
che ci si aspetta in un normale modulo XBee e fornisce anche unarea di
prototipazione. Questa shield utilizza i pin Rx e Tx di Arduino e anche un blocco di pin
per i jumper per portare i segnali Rx e Tx provenienti da Arduino al modulo wireless.

Figura 8-44 - La shield ZigBee di SainSmart con area di prototipazione.

CAN
Controller Area Network (CAN, noto anche come CAN bus), un segnale differenziale
parente dellRS-485 che si trova sui veicoli, nelle macchine industriali e in alcuni
equipaggiamenti militari. relativamente veloce (fino a 1 Mb/s), incorpora il rilevamento
della collisione dei segnali e degli errori e supporta nodi multipli. Si utilizza con
lautodiagnosi OBD-II integrata nei modelli pi recenti di automobili, veicoli elettrici e con
i sensori distribuiti nelle strumentazioni scientifiche ed integrato in alcune biciclette
molto sofisticate.
La shield CAN-BUS di Seeed Studio (http://bit.ly/seeed-canbus)
La shield di interfaccia CAN di Seeed Studio (Figura 8-45) utilizza un bus controller
CAN MCP2515 con uninterfaccia SPI e un chip ricetrasmettitore CAN MCP2551.
Per i segnali del bus CAN, sono forniti sia un blocco di terminali che un connettore
DB-9. Inoltre, la shield collega le comunicazioni I2C e UART provenienti da Arduino.
Il layout dei pin mostrato nella Figura 8-46.

Figura 8-45 - La shield CAN di Seeed Studio con connettori I/O ausiliari.
Figura 8-46 - Il layout dei pin della shield CAN di Seeed Studio con connettori I/O ausiliari.

La shield CAN-BUS di SparkFun (http://bit.ly/sparkfun-canbus)


Questa shield CAN di SparkFun (Figura 8-47) incorpora molte delle funzionalit che
si possono voler utilizzare quando si crea un dispositivo di lettura OBD-II e di cattura
dei dati. dotata di un connettore DB-9 per i segnali del bus CAN e anche di un
header da 4 pin che fornisce i segnali. Sono forniti punti di connessione per un
display LCD esterno e un modulo GPS EM406.
Figura 8-47 - La shield CAN di SparkFun con lettore microSD e joystick digitale.

Una funzionalit interessante un joystick binario da quattro posizioni e incorpora un


lettore di schede flash microSD. Il joystick collegato agli input analogici di Arduino.
Il chip CAN e la flash SD sono selezionati separatamente per mezzo dei pin digitali
D9 e D10. I pin D3, D4, D5 e A0 non sono utilizzati dalla shield. Il layout dei pin
mostrato nella Figura 8-48.
Figura 8-48 - Il layout dei pin I/O della shield CAN di SparkFun.

La shield CAN-BUS di LinkSprite (http://bit.ly/linksprite-can-bus)


Fisicamente, la shield CAN di LinkSprite (Figura 8-49) simile alla shield di Seeed.
dotata sia di un connettore DB-9 che di un blocco di terminali da due posizioni per i
segnali CAN. I pin D10, D11, D12 e D13 si utilizzano per linterfaccia SPI con un chip
CAN MCP2515.
Figura 8-49 - La shield CAN di LinkSprite.

Prototipazione
Se desiderate creare una scheda personalizzata, potete costruirne un prototipo (o
addirittura una shield definitiva) utilizzando una scheda shield di prototipazione. Non si
tratta dello stesso processo di creazione di una shield descritto nel Capitolo 10, che
coinvolge la progettazione di una PCB per una (possibile) produzione di massa. La
Figura 8-50 mostra una shield di prototipazione simile a quelle descritte in questo
paragrafo, con montati un sensore di temperatura e un rel. Un potenziometro
collegato ai pin +5 V, messa a terra e A0 (ingresso analogico 0) passati dalla scheda
Arduino sottostante. Il potenziometro controlla il punto di temperatura impostata.
Figura 8-50 - La shield di prototipazione con il sensore/controllo della temperatura.

Questo prototipo stato utilizzato per controllare una vecchia (e molto pericolosa) stufa
elettrica portatile, che utilizzava un termostato bimetallico e che sembrava non riuscire a
mantenere una temperatura superiore a +/ 15 gradi. Dal momento che il rel
nominalmente sostiene soltanto 10 ampere a 120 VAC e gli elementi della stufa 15
ampere, veniva utilizzato insieme a un trasformatore da 24 VAC per controllare un
contattore da 20 ampere. Funzionava abbastanza bene e manteneva il mio ufficio
relativamente caldo durante linverno. Ma, per sicurezza, ho deciso di aggiungervi un
sensore di inclinazione, un sensore di temperatura in uscita e un rilevatore del
movimento della ventola.
Le shield descritte in questo paragrafo non fanno altro che rappresentare quello che
avete a vostra disposizione e nessuna particolarmente complicata. Quello per cui
vengono utilizzati i pin di Arduino completamente nelle vostre mani (daltra parte, si
tratta di un prototipo) e quindi non c molto bisogno di diagrammi.
La proto shield stackable R3 di Adafruit (http://bit.ly/stackable-r3)
Questa shield (Figura 8-51) venduta nella forma di un kit, che significa una PCB
essenziale e un sacchetto di componenti. Non difficile da assemblare, ma
necessario saper saldare un po.

Figura 8-51 - Il kit della shield di prototipazione stackable di Adafruit.

La proto shield Mega di Adafruit (http://bit.ly/ada-mega-proto)


Questa shield di prototipazione che si pu montare con altre, che un altro kit di
Adafruit, include tutti i componenti che potete vedere nella Figura 8-52. Notate la
doppia riga di piazzole di saldatura per le connessioni lungo i lati della PCB. Questa
permette di saldare nelle prese dei pin da terminali corti per ottenere un accesso
facile ai segnali con un Arduino di tipo Mega sottostante.
Figura 8-52 - Il kit della shield di prototipazione Mega di Adafruit.

La proto shield assemblata per Arduino di CuteDigi (http://bit.ly/cutedigi-assembled)


Questa shield di prototipazione (Figura 8-53) viene venduta gi assemblata. Sulla
PCB inoltre dotata di prese di pin per accedere ai segnali di Arduino. Non una
shield che pu essere montata con altre.
Figura 8-53 - La shield di prototipazione di CuteDigi.

La proto shield assemblata per Arduino MEGA di CuteDigi (http://bit.ly/assembled-


mega)
Progettata per lavorare con un Arduino di tipo Mega, questa shield (Figura 8-54)
presenta anche una posizione di montaggio SOIC (small-outline) per un IC. Non
una shield che pu essere montata con altre.

Figura 8-54 - La shield di prototipazione Mega di CuteDigi.


La proto shield per Arduino con mini breadboard di CuteDigi (http://bit.ly/proto-bboard)
Questa shield, illustrata nella Figura 8-55, include una piccola breadboard che non
richiede saldature per permettervi di creare circuiti personalizzati.

Figura 8-55 - La shield di prototipazione con una breadboard di CuteDigi.

Creare una shield di prototipazione personalizzata


Potete montare una shield che funzioni utilizzando nientaltro che una PCB di
prototipazione e alcuni pin e connettori. La dimensione della PCB non realmente
importante, purch i pin si allineino con le prese della scheda Arduino.
Il kit della shield DIT di Adafruit
Se esistesse un premio per il kit della shield pi semplice, sicuramente questo
starebbe tra i primi a contenderselo. Questa shield, formata da una PCB di
prototipazione e quattro connettori di pin dai terminali lunghi (Figura 8-56), vi
permette di montarvi tutto quello che desiderate. Si rivela utile per prototipare un
nuovo progetto di shield, oppure soltanto per mettere rapidamente diverse cose
insieme ed ideale per utilizzare un modulo esistente di qualche tipo che non era
mai stato pensato per collegarsi con Arduino.
Figura 8-56 - Il kit della shield DIY di Adafruit.

Purtroppo il prodotto stato abbandonato da Adafruit, ma non vi serve altro che una
PCB di prototipazione (che si trovano facilmente presso vari rivenditori) e le prese
dei pin, che distribuiscono Adafruit e altri rivenditori. Dal momento che le piazzole dei
pin sulla scheda Arduino utilizzano la distanza standard di 0,1 pollici (2,54 mm),
facile creare qualcosa con componenti di prototipazione di base che possono
fungere da shield.

Controllo del movimento


Il controllo del movimento un argomento di grande interesse nel mondo di Arduino. Da
robot mobili programmabili a incisori CNC, da stampanti 3D a scanner laser e perfino
controlli automatici per seguire il sole per i pannelli solari e sculture cinetiche, Arduino
stato utilizzato per controllare motori DC, servomotori e motori passo-passo fin
dallinizio. Come potete immaginare, per ciascun tipo di motore esistono diverse shield e
questo non che un piccolo campionario di tutto quello che avete a disposizione.

Controllo di motori DC e passo-passo


Le shield per controllare i motori che si basano su un ponte H (un tipo di interruttore che
porta tensione allo stato solido) di solito possono essere utilizzate per controllare motori
DC del tipo a spazzole oppure motori passo-passo. Fondamentalmente, le shield di
questo tipo possono essere utilizzate per controllare qualsiasi carico DC induttivo,
compresi solenoidi e rel.
La shield Rugged Motor Driver (http://bit.ly/rugged_motor)
La shield Rugged Motor Driver di Rugged Circuits (Figura 8-57) pu gestire due
motori DC del tipo a spazzole oppure un motore passo-passo bipolare. valutato
per un massimo di 30 V a corrente di picco 2,8 A. La shield utilizza i pin D3, D11,
D12 e D13 per gli input enable (di attivazione) e di controllo della direzione. Gli input
enable possono essere gestiti con un segnale PWM per controllare in modo fluido un
motore DC. Sul sito web trovate maggiori dettagli sulla gestione della tensione e il
software.

Figura 8-57 - La shield Rugged Motor Driver.

La shield per gestire motori di SainSmart (http://bit.ly/sainsm-motor)


La shield per gestire motori di SainSmart (Figura 8-58) si basa su un driver IC
L293D da quattro canali. Pu gestire quattro motori DC del tipo a spazzole oppure
due motori passo-passo a un massimo di 10 V. dotato di terminali per una fonte di
alimentazione esterna. Sul sito web trovate maggiori dettagli sulla gestione della
tensione e il software.
Figura 8-58 - La shield di gestione dei motori L239D di SainSmart.

La shield per gestire motori di Arduino (http://bit.ly/arduino-motor)


La shield per gestire motori di Arduino.cc (Figura 8-59) si basa sul dual-driver IC
L298. La si pu utilizzare con rel, solenoidi, motori DC e motori passo-passo. Una
funzionalit interessante la sua capacit di misurare il consumo di corrente, che
pu rivelarsi utile per rilevare un motore in stallo. Notate, inoltre, che dotato di
connettori modulari che sono compatibili con vari moduli TinkerKit (descritti nel
Capitolo 9).
Figura 8-59 - La shield di gestione dei motori di Arduino.

Controllo di PWM e servomotori


I piccoli servomotori utilizzati nei modellini RC e nella robotica a piccola scala funzionano
posizionando unarmatura relativa a una serie di impulsi di controllo di lunghezza variabile
ma a frequenza costante. La lunghezza (i momenti attivi) degli impulsi determina
langolo di rotazione del servo. Una shield per PWM/servo pu essere utilizzata anche
per gestire un motore DC, per controllare con precisione la luminosit di uno o pi LED,
oppure per controllare un attuatore lineare.
La shield per PWM/Servo a 16 canali e 12 bit (http://bit.ly/ada-16-pwm)
Questa shield (Figura 8-60) utilizza un controller IC PWM PCA9685 a 16 canali con
uninterfaccia I2C. Ha la capacit di generare un segnale PWM unico e
programmabile su ciascun output e non richiede lattenzione costante di Arduino.
Figura 8-60 - La shield per PWM/servo con interfaccia I2C di Adafruit.

La shield per PWM/Servo a 27 canali di LinkSprite (http://bit.ly/linksprite-27-pwm)


Questa shield di LinkSprite (Figura 8-61) utilizza un microcontroller IC
STM32F103C8T6 per generare fino a 27 output PWM unici. Vale la pena
sottolineare che lSTM32F103C8T6 un dispositivo ARM Cortex-M3 RISC a 32 bit
con fino a 128 KB di memoria flash e 20 KB di SRAM. In realt, il microcontroller di
questa shield dal punto di vista delle capacit di calcolo pi potente dellAVR
dellArduino sulla quale montata. Comunica con Arduino utilizzando linterfaccia SPI.
Figura 8-61 - La shield per servo di LinkSprite.

La shield per PWM di SparkFun (http://bit.ly/sparkfun-pwm)


La shield per PWM di SparkFun (Figura 8-62) utilizza un TLC5940 IC ed in grado
di produrre 16 output PWM. Il TLC5940 in grado di gestire LED oppure servo
motori. Utilizza uninterfaccia seriale clocked di tipo SPI, ma riceve soltanto dati.
Trovate maggiori informazioni e librerie software presso SparkFun.
Figura 8-62 - La shield per PWM di SparkFun.

Display
Le shield con display per le schede Arduino possono contenere LED (light-emitting
diode), array di LED, un LCD (liquid-crystal display), oppure un display grafico a colori.
Alcune di queste shield utilizzano diversi output digitali di Arduino, mentre altre utilizzano
interfacce SPI o TWI (I2C). Qualunque cosa vogliate visualizzare, probabile che esista
una shield con display che faccia al caso vostro.

Gli array di LED


In s, un solo array di LED fa ridere, ma quando li si mette uno a fianco allaltro
possibile creare display rettangolari di vari colori. Per ulteriori informazioni sulle shield
elencate qui, potete consultare il sito web di ciascuna di esse:
La shield LoL di Adafruit, http://bit.ly/ada-lol (Figura 8-63)
Figura 8-63 - La shield con un array di 9 14 LED di Adafruit.

La shield SMD LoL di Solarbotics, http://bit.ly/solarbio-smd-lol (Figura 8-64)

Figura 8-64 - La shield con un array di 9 14 LED di Solarbotics.


La shield NeoPixel di Adafruit, http://bit.ly/ada-neo (Figura 8-65)

Figura 8-65 - La matrice di pixel con 40 LED RGB di Adafruit.

I display di LED a sette segmenti


I display di LED a 7 segmenti esistono praticamente da quando esistono i LED. Anche
se attualmente sono considerati abbastanza obsoleti, i display a 7 segmenti hanno
ancora delle carte da giocare, quando si ha bisogno di cifre grandi e luminose che si
possano vedere facilmente dallaltra parte di una stanza. Vi consiglio di guardare anche
la shield multifunzione elencata in Shield varie a pagina 273, dotata di display numerico
di LED a 4 cifre.
La shield di cifre 4 x 7 segmenti compatibile con Arduino, http://bit.ly/arduino-7seg
(Figura 8-66)
Figura 8-66 - La shield con display a 7 segmenti di Nootropic Design.

I display LCD
Molte shield LCD basate sui caratteri e a basso costo utilizzano display 16 2 (16
caratteri in 2 righe) con lettere bianche su schermo blu, lettere rosse su schermo nero,
oppure lettere nere su schermo verde. Esistono anche altre combinazioni, come
configurazioni 16 4 e 20 4. La maggior parte di questi tipi di shield si basano sul
controller LCD HD44780 di Hitachi o su qualcosa di simile.
Esistono anche display LCD che possono indirizzare pixel e mostrare bitmap. Alcuni di
questi, come il noto Nokia 5110, sono disponibili presso vari rivenditori e sono facili da
interfacciare con Arduino. Potete anche trovare display con risoluzioni di 128 64 e 160
128 pixel senza dover cercare troppo, ma non molti di questi sono disponibili nella
forma di una shield compatibile con Arduino. Nel Capitolo 9 trovate ulteriori informazioni
sui componenti display che non sono shield.
La shield con keypad LCD di SainSmart (http://bit.ly/sainsmart-keypad)
Si tratta di un design di shield LCD comune, mostrato nella Figura 8-67, che utilizza
un modulo display LCD 16 2 e il controller LCD HD44780 di Hitachi (il modulo
display disponibile separatamente e uno utilizzato nel generatore di segnale
descritto nel Capitolo 11 e nel termostato descritto nel Capitolo 12).
Figura 8-67 - La shield con keypad LCD 16 2 di SainSmart.

Questa shield LCD utilizza un driver del voltaggio per i cinque interruttori a pulsante,
in modo che la pressione di ciascun pulsante produca una tensione diversa. La
Figura 8-68 mostra come funziona. Il vantaggio offerto da questo approccio che gli
input dei cinque interruttori sono condotti attraverso un input analogico.
Figura 8-68 - Lo schema della shield LCD di SainSmart.

La shield con keypad LCD di DFRobot (http://bit.ly/dfrobot-keypad)


Questa simile alla shield LCD di SainSmart, a eccezione che per le connessioni dei
pin analogici con lArduino sottostante (vedere Figura 8-69). Secondo la
documentazione del rivenditore, i pin addizionali sono pensati soprattutto per
interfacciarsi con un modulo radio APC220 oppure con un modulo Bluetooth.
Figura 8-69 - La shield con keypad LCD 16 2 con pin analogici di DFRobot.

Il kit della shield LCD di Adafruit (http://bit.ly/adafruit-lcd)


Per controllare il display LCD, il kit della shield LCD 16 2 di Adafruit, mostrato
nella Figura 8-70, utilizza linterfaccia I2C e un expander IC I/O MCP232017
(utilizzato anche nel Capitolo 10). Questo fa s che la shield utilizzi soltanto due dei
pin di Arduino, A4 e A5, per linterfaccia I2C. LLCD e i pulsanti sono tutti collegati
allIC MCP23017 e non utilizzano un partitore resistivo. Notate che si tratta di un kit,
ma che non troppo difficile da assemblare.
Figura 8-70 - Il kit della shield LCD con display di 16 2 caratteri di Adafruit.

Il modulo Nokia LCD5110 con SD (http://bit.ly/nokia_lcd)


Questa shield, illustrata nella Figura 8-71, combina un display LCD Nokia 5110 con
un lettore di schede flash SD. Utilizza i pin D3, D4, D5, D5 e D7 per il display e i pin
D10, D11, D12 e D13 per la scheda SD. I pin D0, D1 e D2 restano disponibili per
altre applicazioni.

Figura 8-71 - La shield LCD Nokia 5110 di Elechouse.

A differenza dei display basati su 16 2 caratteri, il 5110 un LCD che supporta


immagini grafiche con unarea di visualizzazione di 48 84. Originariamente stato
creato per i telefoni cellulari e adesso tutte le unit che si trovano sono avanzi di
produzione. Alcuni possono presentare graffi o altri leggeri difetti. Dovete tenere
presente anche che, quando scompariranno, finir la loro storia. Quindi, non una
buona idea progettare un nuovo prodotto utilizzandoli, ma sono divertenti per giocarci
e sono relativamente economici.

I display TFT
I TFT LCD (thin-film transistor liquid crystal display), detti pi brevemente soltanto TFT,
sono un tipo di display comune che si trova nei monitor dei computer, nei display dei
registratori di cassa, nei telefoni cellulari, nei tablet e praticamente in tutto quello che
presenta un display grafico a colori. Una shield con TFT a colori per Arduino pu
mostrare migliaia di colori a risoluzioni come 240 320 pixel. Si trovano display pi
grandi, ma generalmente questi non ci stanno in una shield. Le shield TFT di solito sono
economiche: la maggior parte di loro utilizzano uninterfaccia SPI e alcune sono dotate di
uninterfaccia digitale parallela per la generazione di immagini ad alta velocit.
La touch shield TFT LCD da 2,4 di ITEAD (http://bit.ly/ITEAD-tft)
Questa shield, illustrata nella Figura 8-72, utilizza uninterfaccia digitale parallela con
Arduino. Sulla shield, utilizzata uninterfaccia a 8 bit con un TFT controller
S6D1121 e le funzioni touchscreen sono gestite dal chip TSC2046. Per informazioni
pi dettagliate, potete consultare il sito web del rivenditore.

Figura 8-72 - La shield TFT a colori da 2,4 pollici con touchscreen di ITEAD.

La touch shield TFT da 28 di Adafruit (http://bit.ly/ada-tft)


La shield TFT da 2,8 pollici di Adafruit (Figura 8-73) utilizza uninterfaccia SPI ad alta
velocit per il controller di display ILI9341 con un buffer di RAM video integrato e il
controller del touchscreen STMPE610. Incorpora anche un lettore di scheda flash
microSD. La shield utilizza i pin digitali di Arduino dal D8 al D13, il controller del
touchscreen utilizza il pin D8 e select del lettore microSD si trova sul pin D4.

Figura 8-73 - La shield TFT da 2,8 pollici di Adafruit con touchscreen resistivo.

Shield per la strumentazione


Anche se non ne esistono tante come nel caso di altri tipi di shield, si trovano shield per
la strumentazione. Queste includono shield per la registrazione dei dati, analizzatori
logici e convertitori analogo-digitale (A/D) di precisione. Strumentazione, in questo caso,
si riferisce alla possibilit di percepire e catturare dati dal mondo fisico, oppure di
generare un segnale analogico.
Non esistono molte shield con funzionalit integrate di cattura e conversione dei dati,
principalmente per via del fatto che la MCU AVR che si trova su Arduino ha gi gran
parte di queste funzioni nel chip. Il convertitore A/D (ADC) integrato delle MCU AVR
utilizzate con le schede Arduino ha una risoluzione di 10 bit, che d una risoluzione di
conversione di 1/1.024 per DN, o numero digitale. Se avete bisogno di una risoluzione
migliore (12, 16 o addirittura 24 bit, per esempio), dovete prendere in considerazione
qualche tipo di modulo o shield aggiuntivi.
La shield per la registrazione dei dati di Adafruit (http://bit.ly/1Tjlu5V)
La shield per la registrazione dei dati di Adafruit, mostrata nella Figura 8-74, include
un lettore di scheda flash SD e un chip real-time clock (RTC). LRTC pu essere
alimentato da una batteria, quando lalimentazione principale che proviene
dallArduino di base spenta. Per i circuiti personalizzati si utilizza una piccola griglia
di prototipazione. Non una shield che pu essere montata con altre.

Figura 8-74 - La shield per la registrazione dei dati di Adafruit assemblata.

La shield Ultimate GPS Logger di Adafruit (http://bit.ly/ada-gps)


Questa shield, mostrata nella Figura 8-75, incorpora un ricevitore GPS, oltre a un
lettore di flash SD e a un chip RTC. Loutput del GPS pu essere registrato
automaticamente nella scheda di memoria flash. Non una shield che pu essere
montata con altre.
Figura 8-75 - La shield per la registrazione dei dati GPS di Adafruit.

La shield analizzatore logico e generatore di segnale di HobbyLab


(http://www.arduinolab.us)
In realt, si tratta di un analizzatore logico indipendente su una shield. Controlla i
segnali di Arduino senza interferire con essi, cosa che si rivela utile per vedere che
cosa sta succedendo sui pin I/O. Oltre alla funzionalit dellanalizzatore logico,
include anche un decodificatore SPI, un decodificatore UART e un monitor da un filo.
Non comunica direttamente con Arduino, ma utilizza uninterfaccia USB per interagire
con un computer host. Si tratta di una shield che pu essere montata con altre
(vedere Figura 8-76).
Figura 8-76 - Lanalizzatore logico e generatore di segnale di HobbyLab.

La shield ADC da 16 canali e 24 bit di Iowa Scaled Engineering


(http://bit.ly/ardltc2499)
Questa shield incorpora un convertitore A/D da 24 bit e un riferimento di precisione
della tensione per ottenere le letture di diversi input differenziali o single-ended.
dotata anche di una EEPROM integrata per salvare e leggere dati di calibrazione e
configurazione. Comunica con Arduino per mezzo dellinterfaccia I2C (TWI). Si tratta
di una shield che pu essere montata con altre (vedere Figura 8-77).

Figura 8-77 - La shield di acquisizione dei dati ADC da 24 bit di Iowa Scaled Engineering.

La shield Power DAC di Visgence (http://bit.ly/power-dac)


Una funzione che manca alla MCU AVR e per estensione ad Arduino un
convertitore digitale-analogico (DAC) integrato. LADC interno dellAVR incorpora un
DAC da 10 bit, ma loutput non disponibile esternamente. Anche se le shield per
loutput audio sono facili da trovare, non sembra che ne esistano molte di puro output
DC DAC. La shield Power DAC di Visgence (Figura 8-78) fornisce tre canali di
output analogico con la possibilit di generare fino a 250 mA di tensione.

Figura 8-78 - La shield DAC da 12 bit di Visgence.

Shield adattatori
Una shield adattatore si utilizza come interfaccia fisica tra quelli che altrimenti sarebbero
due moduli fisicamente incompatibili. La differenza principale tra una shield adattatore e
una shield che trasporta il segnale (vedere Shield che trasportano il segnale a pagina
236), almeno per quando riguarda come sono organizzate le shield in questo capitolo,
che un adattatore pensato per fungere da interfaccia fisica. Una shield che trasporta il
segnale non si occupa delle differenze fisiche, ma soltanto dei segnali.
La shield di espansione per Arduino Nano di Tronixlabs Australia (http://bit.ly/exp-
nano)
Una scheda Nano presenta tutte le funzionalit dellArduino di base, pi grande, ma non
funziona con le shield convenzionali. Questa scheda, mostrata nella Figura 8-79, risolve
questo problema collegando i pin della Nano agli header dei pin e opzionalmente ai
connettori standard dei pin.
Figura 8-79 - La shield adattatore per la Nano di Tronixlabs.

La scheda di espansione I/O per Arduino Nano (eBay) (http://bit.ly/exp-nano-ebay)


Un altro esempio di adattatore per la scheda Nano (Figura 8-80). Questa si trova su
eBay, ma ne esistono anche altre simili.

Figura 8-80 - La scheda di espansione per Arduino Nano.


La shield per terminali a vite (http://bit.ly/screw-term)
Anche se tecnicamente non si tratta di una shield, di per s questi utili adattatori
permettono di collegare fili isolati fino a 18 AWG. Si trovano facilmente presso vari
rivenditori. Notate che questi componenti possono essere montati luno sullaltro
(vedere Figura 8-81).

Figura 8-81 - Gli adattatori dei terminali.

Shield varie
Questo paragrafo descrive alcune shield utili che non rientrano esattamente in categorie
definite. A me piace chiamarle wing shield perch permettono di creare collegamenti
pi ordinati e le shield multifunzione mostrate qui presentano una vasta gamma di utilizzi.
La Proto-ScrewShield (Wingshield) di Adafruit (http://bit.ly/ada-proto-screw)
La Wingshield, conosciuta anche come Proto-ScrewShield, una shield passiva con
due serie di blocchi di terminali in miniatura (vedere Figura 8-82). Se prevedete di
incorporare una scheda Arduino in un prodotto commerciale o in un laboratorio,
potete prendere in considerazione una shield come questa. Le viti del blocco di
terminali forniscono una connessione molto pi sicura e affidabile dei jumper dei pin.
Larea di prototipazione al centro della shield pu essere utilizzata per montare
moduli sensore, oppure pu contenere un circuito personalizzato. La shield include
un interruttore di reset e un LED. Inoltre, pu essere montata con altre. Attenzione
perch si tratta di un kit e quindi si presenta come una PCB e un sacchetto di
componenti. Assemblarlo non difficile, ma necessario saper saldare.
Figura 8-82 - La Wingshield di Adafruit.

La Screw ProtoShield di DFRobot (http://bit.ly/screw-protoshield)


Come la Wingshield di Adafruit, questa shield (Figura 8-83) fornisce terminali a vite
per ciascuno dei segnali provenienti da Arduino, ma gi completamente
assemblata. Inoltre si tratta di una shield che pu essere montata con altre e quindi
pu essere collocata sotto altre shield mantenendo la possibilit di accedere ai
blocchi di terminali.
Figura 8-83 - La shield con blocchi di terminali di DFRobot.

La shield multifunzione DIY di DealeXtreme (http://bit.ly/diy-multi)


Si tratta di una shield interessante, con un lettore di LED numerico da 4 cifre, un
punto di interfaccia per un modulo Bluetooth APC220, diversi interruttori a pulsante
collegati con i pin di Arduino A1, A2 e A3m, un interruttore di reset e un
potenziometro collegato allinput A0 (vedere Figura 8-84). Quattro LED sono
collegati ai pin digitali D10, D11, D12 e D13 e un header da 3 4 pin collega i pin
D5, D6, D9 e A5, oltre a +5 V e messa a terra. Purtroppo, questa shield anche
piuttosto mal documentata e riuscire a trovare qualche informazione utile pu
richiedere un po di ricerche. Potete trovare ulteriori informazioni sul forum di
HobbyComponents.com (http://bit.ly/dx-diy-hc). Inoltre, potete scaricare una
raccolta di sketch di esempio e uno schema da http://bit.ly/dx-diy-sketch. Notate che
i nomi delle directory nellarchivio ZIP sono tutti in cinese, ma la maggior parte degli
sketch presentano commenti in inglese.
Figura 8-84 - La scheda despansione della shield multifunzione DX DIY.

Lorganizzazione dei vari componenti della shield multifunzione mostrata nella


Figura 8-85. Notate che non si tratta di una shield che pu essere montata con altre
e la cosa ha senso, dal momento che montando unaltra shield sopra di essa si
renderebbe inutile il display LED.
Figura 8-85 - Le funzionalit principali della shield multifunzione.

Lo schema fornito per questa shield in un certo senso criptico e quindi ne ho


creato una versione alternativa, mostrata nella Figura 8-86. Notate che questa shield
utilizza tutti i pin di Arduino. La Tabella 8-1 elenca i pin di Arduino e mostra per che
cosa li utilizza la shield multifunzione.
Figura 8-86 - Lo schema della shield multifunzione.

Tabella 8-1 - Le funzioni dei pin della shield multifunzione di Arduino.

Pin Utilizzo
D0 Rx dal modulo wireless
D1 Tx al modulo wireless
D2 ID ricevuto
D3 Controllo dellannunciatore
D4 Blocco del display LED
D5 A D5 su blocco I/O
D6 A D6 su blocco I/O
D7 Clock del display LED
D8 Input di dati seriali del display LED
D9 A D9 su blocco I/O
D10 LED
D11 LED
D12 LED
D13 LED
A0 Cursore del potenziometro
A1 Interruttore S3
A2 Interruttore S2
A3 Interruttore S1
A4 Input del sensore di temperatura
A5 A5 su blocco I/O

Questa shield un buon esempio di quello che spesso si incontra con una nuova
shield. La documentazione pu essere ridotta al minimo e gran parte di essa pu
essere in una lingua che non capite (il cinese, in questo caso, ma anche linglese pi
essere difficile per alcuni utenti). Lo schema corretto, ma pu risultare difficile da
capire a una prima occhiata e non c una descrizione dettagliata del pinout (b, in
realt adesso s).

Shield di Arduino non comuni


Oltre alla vasta gamma di shield dalle I/O RS-232 a quelle per controllare PWM e
servo, esistono anche shield create per applicazioni specifiche. Alcune stampanti 3D
open source utilizzano una scheda Arduino come controller principale e le interfacce di
controllo, nella forma di shield, si trovano facilmente. Alcune di queste shield sono
pensate per le schede Arduino di tipo Mega e le loro dimensioni sono studiate di
conseguenza.
Altre shield non comuni non rientrano esattamente in nessuna delle categorie che
abbiamo visto in questo capitolo, ma sono comunque interessanti. Un esempio di questo
tipo di shield la Gameduino. Si tratta essenzialmente di un contenitore per un chip
FPGA (field-programmabile gate array) e pu essere utilizzata per altre applicazioni,
oltre che per i videogiochi.
La shield Qunqi CNC per Arduino V3 Engraver (http://bit.ly/qunqi-cnc)
Questa shield, illustrata nella Figura 8-87, non include moduli di gestione dei motori,
ma se ne trovano facilmente. Un tipico modulo driver il utilizza driver chip
microstepping A4988 DMOS di Allegro.
Figura 8-87 - La scheda despansione Qunqi A4988 driver CNC.

La shield SainSmart RepRap Arduino Mega Pololu (http://bit.ly/sainsmart-reprap)


Il costruttore di RepRap 3D (http://reprap.org/), pubblicizzato come la prima
macchina per scopi generali dellumanit capace di replicarsi da sola, un
costruttore compatto che pu creare componenti per altre macchine RepRap, oltre a
molte altre cose. Questa shield, mostrata nella Figura 8-88, pensata per sostituire
le parti elettroniche di un dispositivo di tipo RepRap e come processore utilizza un
Arduino di tipo Mega.

Figura 8-88 - La shield RAMPS 1.4 RepRap per stampanti 3D di SainSmart.

excamera Gameduino (http://bit.ly/excam-gameduino)


Questa shield utilizza un Xilinx FPGA (Figura 8-89) per controllare le immagini e i
suoni in una console di giochi fatta in casa. Come interfaccia con i controlli e per
dirigere i giochi si utilizza un Arduino. Gameduino open source, per cui tutti i
dettagli tecnici sono a disposizione di chiunque ed possibile riproporre il FPGA per
qualcosa di diverso dai giochi.

Figura 8-89 - La shield game controller excamera Gameduino.

Fonti
La Tabella 8-2 elenca i rivenditori e i produttori menzionati in questo capitolo.
Naturalmente ce ne sono molti altri non elencati qui, che sono comunque ottimi posti
dove cercare shield utili o innovative. Digitando Arduino shield nel campo di ricerca di
Google, ottenete circa 400.000 risultati e quindi, come vedete, non mancano i posti
dove cercare prodotti e informazioni. Il solo fatto che un rivenditore o un produttore non
sia menzionato qui non significa che non valga la pena di essere preso in
considerazione. Semplicemente, cercare di includere tutti in un mercato volatile come
questo, che propone tanti prodotti diversi, sarebbe come il supplizio di Sisifo.
Tabella 8-2 - Elenco di rivenditori e produttori di shield.

Nome URL
Adafruit www.adafruit.com
Arduino store.arduino.cc
Arduino Lab www.arduinolab.us
Circuits@Home www.circuitsathome.com
CuteDigi store.cutedigi.com
DFRobot www.dfrobot.com
DealeXtreme (DX) www.dx.com
Elecfreaks www.elecfreaks.com
Elechouse www.elechouse.com
excamera www.excamera.com
Iowa Scaled www.iascaled.com
Engineering
iMall imall.itead.cc
Macetech www.macetech.com/store/
Mayhew Labs www.mayhewlabs.com
Nootropic Design www.nootropicdesign.com
Numato www.numato.com
RobotShop www.robotshop.com
Rugged Circuits www.ruggedcircuits.com
SainSmart www.sainsmart.com
Seeed Studio www.seeedstudio.com
SparkFun www.sparkfun.com
Tindie www.tindie.com
Tronixlabs www.circuitsathome.com
Vetco www.vetco.net
9

Moduli e componenti I/O

Anche se molte delle shield disponibili per Arduino presentano moltissime funzioni
interessanti e utili gi integrate, non sono onnipotenti. N potrebbero esserlo, dal
momento che esiste una vasta gamma di tipi diversi di sensori, controlli e attuatori che
possono essere utilizzati con Arduino. Molti rivenditori offrono componenti sensore
aggiuntivi con una sola funzionalit e piccoli moduli PCB per Arduino. Questi includono
sensori di temperatura e umidit, rilevatori di vibrazioni, fotorivelatori, tastierini, joystick
e perfino laser a stato solido.
Quasi tutti i sensori, i controlli o gli attuatori che possono essere utilizzati con i
microcontroller possono essere utilizzati anche con Arduino. Presentano alcuni limiti per
quanto riguarda lalimentazione, a seconda del tipo di microcontroller che si trova su
Arduino (3,3 V o 5 V), ma per lo pi si tratta di un dettaglio di minore importanza che
pu essere risolto con alcuni semplici componenti elettronici e un alimentatore adeguato.
In questo capitolo vedremo sia moduli I/O sia singoli componenti. I moduli I/O sono
piccole PCB che eseguono una funzione specifica e utilizzano soltanto alcuni componenti
attivi o addirittura nessuno. Sono piccoli, circa della dimensione di un francobollo o
meno, e per i collegamenti utilizzano pin. Funzionano bene con jumper femmina-maschio
oppure femmina-femmina e, in alcuni casi, per collegarli a una shield creata esattamente
per questo scopo si possono utilizzare cavi speciali con diversi fili. Qui vedremo i
prodotti di KEYES, SainSmart e TinkerKit, principalmente perch sono ottimi
rappresentanti dei moduli in generale. Altri moduli che vale la pena prendere in
considerazione sono le serie di moduli e di shield Grove che si trovano presso Seeed
Studio e i moduli di TinyCircuits.
I singoli componenti I/O possono essere di vario tipo, da LED a display grafici, da
sensori meccanici come interruttori e rel reed a sensori di temperatura e umidit
indipendenti. Qui i sensori singoli sono trattati dopo i moduli intenzionalmente, perch
molti dei moduli utilizzano i componenti descritti l. Tra i vari paragrafi sono forniti i
riferimenti incrociati necessari.
Quasi tutti apprezziamo lordine e laffidabilit. Purtroppo, utilizzare gli onnipresenti
ponticelli per collegare moduli e altri componenti pu diventare rapidamente tutto tranne
che ordinato e i connettori da crimpare che si utilizzano sulle estremit dei ponticelli
tendono a rivelarsi troppo allentati per i pin dei moduli.
Anzich rassegnarsi a saldarli direttamente ai pin di un modulo, oppure a nascondere i
connettori dei jumper con una goccia di silicone per tenerli fermi al loro posto, si
possono utilizzare connettori modulari. Questi possono essere fatti su misura per
applicazioni specifiche utilizzando strumenti manuali semplici, oppure si pu decidere di
utilizzare un sistema come TinkerKit, Grove o TinyCircuits. Questo capitolo offre una
panoramica dei metodi per collegare moduli ad Arduino che permettono di non creare un
groviglio di ponticelli.

I moduli
I moduli sensore e I/O sono senza dubbio il modo pi comodo di collegare un sensore,
un interruttore, un rel, oppure un microfono ad Arduino e potervi fare esperimenti. La
Figura 9-1 mostra diversi tipi di modulo.

Figura 9-1 - Diversi tipi e dimensioni di modulo sensore.

Alla lunga, facile ritrovarsi con una grande quantit di moduli, alcuni dei quali pi utili di
altri. Vi suggerisco di cominciare con i kit di moduli pi grandi che vi possiate permettere
e poi scoprire quali utilizzate maggiormente. Di questi, vi conviene tenerne diversi a
portata di mano, mentre quelli che utilizzate di meno potete metterli da parte per
progetti futuri.
ATTENZIONE Le descrizioni che trovate online di come funzionano vari moduli non sono sempre corrette. Potrebbero
essere problemi di traduzione, ma a volte le descrizioni online dichiarano che quando attivo un modulo genera un
output high, quando in realt genera un output low. Prima di collegarlo a un circuito, vi conviene sempre controllare
bene come funziona un modulo con un multimetro digitale (DMM). La maggior parte dei moduli elencati in questo
paragrafo sono stati testati per determinare come funzionano davvero e le descrizioni offerte qui corrispondono a
queste scoperte. Detto questo, non posso affermare che tutti i moduli che possono assomigliare a quelli elencati in
questo capitolo si comportino nello stesso modo o presentino le stesse funzioni dei pin. In questangolo delluniverso, la
standardizzazione non ancora arrivata.

Per quanto riguarda gli schemi dei moduli elencati qui, be, in realt non ne esistono di
ufficiali che io sia riuscito a trovare. Diverse anime coraggiose su Internet si sono prese
la briga di creare le PCB di alcuni dei moduli. Ho cercato di raccogliere quelle che
riuscivo a trovare e di combinarle con i miei sforzi di ingegneria inversa. In alcuni casi, il
risultato uno schema completo e in altri ho soltanto voluto verificare che i pin
facessero veramente quello che diceva la documentazione disponibile (seppur minima).

I fattori di forma fisici


I moduli possono presentare diverse dimensioni, da 1,8 per 1,5 cm
(approssimativamente 3/4 per 9/16 pollici) a 4,2 per 1,7 cm (approssimativamente 1
11/16 per 5/8 pollici), mentre alcuni possono raggiungere i 3,4 per 2,5 cm
(approssimativamente 1 5/16 per 1 pollice), nel caso di un rel modulare da 5 V. La
Figura 9-2 mostra una gamma di dimensioni dei moduli. Notate che queste sono
dimensioni approssimative. Le dimensioni reali delle PCB possono variare di circa +/ 1
mm (0,04 pollici), a seconda di dove sono stati prodotti i moduli.

Figura 9-2 - Esempi di dimensioni di moduli che si trovano spesso.

Sulla PCB, molti moduli presentano dei fori di montaggio sufficienti per una vite a testa
tonda #2 (2,03 mm). Lequivalente metrico di solito una dimensione pari a M1.6 o
M1.8. La Figura 9-3 mostra due moduli montati uno sopra laltro utilizzando viti a testa
tonda da 2-56 e distanziatori di nylon. Si tratta di un sensore di temperatura da un filo
con un modulo interruttore a inclinazione al mercurio.

Figura 9-3 - Moduli montati utilizzati viti a testa tonda #2 e distanziatori.

Purtroppo, non tutti i moduli possono essere montati bene con altri. A volte, i fori di
montaggio non presentano la stessa distanza, oppure possono trovarsi nel posto
sbagliato sulla PCB e non permettere ai moduli di essere montati uno sopra laltro.
Alcuni moduli non sono dotati di fori di montaggio e quindi si deve sempre controllare
prima, per assicurarsi che sar possibile.

Le interfacce
I pinout che si utilizzano con i vari moduli PCB possono variare da un tipo allaltro e
quindi, a parte nel caso della serie TinkerKit, non esiste realmente uno standard. La
Figura 9-4 mostra alcune delle variazioni che potete aspettarvi di trovare.
Figura 9-4 - Configurazioni tipiche del pinout utilizzate con i moduli.

NOTA Anche se potete dare per scontato che i moduli dotati di tre o quattro pin sono compatibili con shield
destensione I/O con connettori modulari o i pin I/O organizzati in blocchi (come quelli descritti nel Capitolo 8), non
sempre cos. La compatibilit dei pin sui moduli e le shield garantita soltanto quando si collega una famiglia di
moduli a una shield progettata espressamente per lavorare con quei componenti. Ne un esempio TinkerKit, ma
soltanto quando si collegano moduli TinkerKit a una shield destensione TinkerKit. Prima di collegare un modulo,
conviene sempre controllarne i pin, per verificare le posizioni della tensione e del segnale.

Dal momento che lAVR un dispositivo piuttosto robusto, possibile collegare molti
sensori direttamente agli input di Arduino e anche alcuni dispositivi di output. I dispositivi
di output che hanno bisogno di pi alimentazione, come i laser a stato solido o i LED
RGB, in realt hanno bisogno di un driver di un qualche tipo per ottenere una tensione
superiore a quella che il chip AVR di Arduino in grado di fornire direttamente (ricordate
le specifiche descritte nel Capitolo 3).
Alcuni moduli di output sono dotati di uninterfaccia ad alta tensione integrata, ma altri
no. Per fornire con sicurezza la corrente necessaria a un dispositivo come un modulo
rel o LED laser, si pu utilizzare un circuito semplice, come quello mostrato nella Figura
9-5. Il valore di R nel circuito a destra nella Figura 9-5 viene determinato dal LED e dalla
quantit di corrente necessaria per il suo funzionamento. Purch la tensione non superi
quella tollerata dal transistor, dovrebbe funzionare bene.
Figura 9-5 - Un circuito di output per dispositivi ad alta tensione.

Unaltra opzione un IC per uno scopo speciale come il MAX4896, mostrato nella
Figura 9-6, che utilizza uninterfaccia SPI e un Arduino pu interfacciarsi direttamente
allIC. Anche se pensato per gestire piccoli rel, questo IC in grado di gestire LED
grandi con la stessa facilit.

Figura 9-6 - Un IC di gestione delloutput per diversi rel o altri carichi.

Dove trovare i moduli


La Tabella 9-1 suggerisce dove trovare moduli con una sola PCB e kit di sensori con 24,
36 o pi moduli. Se ne trovano anche su eBay e Amazon. La Figura 9-7 mostra una
valigetta di plastica con una serie completa di moduli (37 tipi diversi: lultimo settore
contiene due moduli diversi).
Tabella 9-1 - Un elenco parziale di rivenditori e produttori di moduli sensore e di output.

Nome URL
Adafruit www.adafruit.com
CuteDigi store.cutedigi.com
DealeXtreme (DX) www.dx.com
KEYES en.keyes-robot.com
SainSmart www.sainsmart.com
Seeed Studio www.seeedstudio.com
TinyCircuits www.tiny-circuits.com
Trossen Robotics www.trossenrobotics.com
Vetco www.vetco.net

Figura 9-7 - Una serie di moduli di input/output.

Quasi tutti i rivenditori elencati nella Tabella 9-1 vendono anche moduli singoli, oltre a
ponticelli, cavi di interconnessione e componenti di input e output. Potete comprare
praticamente tutti i moduli di cui avete bisogno in piccole quantit, anche se non tutti i
moduli presenti nei kit possono essere disponibili da acquistare individualmente.

Le descrizioni dei moduli


In questo paragrafo elencheremo i moduli di tre marche: KEYES, SainSmart e TinkerKit.
Le descrizioni sono, per necessit, brevi. Qui laccento posto soprattutto sulla forma
fisica e sulle connessioni elettriche dei moduli elencati nelle tabelle. I sensori a pagina
312 descrive i sensori componenti (cio i sensori che compongono il kit) in maggiore
dettaglio e, dove necessario, i moduli presentano riferimenti incrociati alle descrizioni
dettagliate.
Dopo aver lavorato con diversi moduli per un po, potete cominciare a notare che molti
dei moduli descritti qui utilizzano lo stesso circuito di base. Questo di solito consiste di
un comparatore LM393 e di un sensore di qualche tipo. In tutti i casi, un potenziometro
imposta la tensione di soglia e loutput dellLM393 collegato al pin del segnale del
modulo. I moduli KEYES con circuiti simili sono elencati nella Tabella 9-2 e i moduli
SainSmart con circuiti simili sono elencati nella Tabella 9-3.
Tabella 9-2 - I moduli KEYES con circuiti simili (Figura 9-8).

Modulo Nome
KY-025 Modulo interruttore reed
KY-026 Sensore di fiamma
KY-036 Sensore a contatto conduttivo
KY-037 Sensore con microfono sensibile
KY-038 Sensore con microfono

Tabella 9-3 - I moduli SainSmart con circuiti simili (Figura 9-8).

Modulo Nome
20-011-981 Sensore fotosensibile
20-011-982 Sensore di vibrazioni/shock
20-011-983 Sensore a effetto hall
20-011-984 Sensore di fiamma

La Figura 9-8 mostra una rappresentazione schematica e generica del circuito


comparatore LM393 utilizzato nei moduli elencati nella Tabella 9-2 e nella Tabella 9-3. I
valori esatti del componente possono variare leggermente, ma lo stesso circuito di base
viene utilizzato in diversi moduli. La differenza principale tra i moduli il sensore (fiamma
IR, microfono, LDR, ecc.).

Figura 9-8 - Circuito generico dei moduli con IC comparatore.

Il terminale DO (digital output) proviene direttamente dal comparatore. high quando


linput non invertente (+) maggiore di quello invertente (). Loutput del comparatore
diventa low se linput non invertente pi basso di quello invertente. Alcuni moduli
possono essere progettati con gli input per lIC del comparatore organizzati al contrario
rispetto a quello che si vede nella Figura 9-8, ma il principio di funzionamento lo
stesso.
La tensione sullinput non invertente impostata dal potenziometro. Questo costituisce
la met di un partitore di tensione che insieme al sensore e forse ad una resistenza
limitatrice di corrente, forma laltra met. Un secondo partitore di tensione serve ad
applicare circa la met del VCC +5 V allinput invertente, o circa 2,5 V. Questo linput
di riferimento. Il potenziometro si utilizza per impostare la tensione alla quale il
comparatore cambier il suo output, mentre il sensore cambia la sua resistenza in
risposta a qualche tipo di input.
Sullestremit delloutput del circuito, si utilizza una resistenza da 10K come pull-up sul
pin di output dellIC. LAO (analog output) il valore crudo fornito dal sensore presso
linput dellIC LM393 (in questo caso). Su questi moduli dotati di un solo output, soltanto
loutput del comparatore collegato al pin del terminale come il segnale DO. Un modulo
pu anche presentare un LED che indichi quando presente lalimentazione e qualche
altro LED che indichi quando loutput del comparatore low (diventa una fonte di
alimentazione per il LED).
Come tutto questo si relaziona con un sensore dipende da come il sensore risponde
allinput e per farsi unidea di come si comporta pu rendersi necessario fare qualche
esperimento. In molti casi, un sensore attivo rivela una resistenza diminuita, cosa che
far s che linput non invertente scenda al si sotto della tensione di riferimento sullinput
invertente. Quando questo accade, loutput del circuito comparatore mostrato nella
Figura 9-8 diventa low e il LED sulloutput dellIC diventa attivo (lIC funge da fonte di
alimentazione per il LED).
I circuiti comparatore che presentano un output low quando linput si trova in uno stato
attivo o al di sotto di una qualche soglia vengono detti circuiti active-low. In questi
circuiti, una tensione bassa sulloutput equivalente a una condizione true. I circuiti che
presentano un output high quando il sensore attivo o linput si trova al di sopra di una
qualche soglia vengono detti circuiti active-high. In un circuito active-high, un output high
equivalente a una condizione true. True e false in questo senso significano
semplicemente e rispettivamente che il sensore sta ricevendo input oppure no.
ATTENZIONE Vi conviene dedicare qualche istante, armati di un DMM (multimetro digitale) e di una lente di
ingrandimento, a esaminare con attenzione un modulo prima di collegarlo ad Arduino. Questo si rivela particolarmente
importante nel caso dei moduli molto economici, dove ho trovato che mancano parti o appaiono ponti di saldatura
(cortocircuiti) tra piazzole e pin di collegamento che non vanno da nessuna parte. Un modulo che ho esaminato aveva
un pezzo di filo, installato dalla fabbrica, saldato tra tracce collegate ai pin +5 V e messa a terra! Questo avrebbe
causato dei problemi. Il semplice fatto che un modulo sia dotato di pin per la messa a terra, +5 V e segnale non
significa che tutti i pin siano effettivamente utilizzati e nemmeno che i pin facciano quello che implicano i nomi che sono
stati loro assegnati. Una volta risolti tutti i problemi, i moduli tendono a funzionare bene (tutto sommato, sono formati
soltanto da una manciata di componenti). Se prendete appunti, pi tardi vi risparmierete qualche mal di testa.

Molti moduli comuni progettati dalla societ cinese Shenzhen KEYES DIY Robot Co.
Ltd. (conosciuta anche come semplicemente KEYES) sono venduti come singole unit
oppure riuniti in kit di moduli, di solito con 36 moduli circa per kit. Potete trovare anche
moduli che presentano le lettere HXJ. Funzionalmente, sono identici ai moduli KEYES,
ma il layout della PCB pu essere leggermente differente.
La Tabella 9-4 un elenco riassuntivo dei moduli KEYES descritti in questo paragrafo,
mentre la Tabella 9-7 contiene immagini, note e diagrammi del pinout, da KY-001 a KY-
040. Alcuni dei modelli mostrati sono KEYES e alcuni sono di altri rivenditori, ma sono
altrimenti identici (le unit HXJ, per esempio). Tutti condividono lo stesso pinout e le
stesse funzioni e spesso hanno lo stesso nome (KY-002, KY-027 e cos via). Notate che
i moduli KY-007, KY-014, KY-029 o KY-030 non esistono. Non ho idea del perch.
Tabella 9-4 - I moduli I/O KEYES pi diffusi.

Numero di componente Nome


KY-001 Sensore di temperatura
KY-002 Sensore di vibrazioni
Sensore di campo magnetico a
KY-003
effetto hall
KY-004 Pulsante
KY-005 Emettitore di infrarossi
KY-006 Cicalino passivo
KY-008 LED laser
KY-009 LED RGB a colori
KY-010 Interruttore ottico
KY-011 LED a 2 colori
KY-012 Cicalino attivo
KY-013 Sensore analogico di temperatura
KY-015 Sensore di temperatura e umidit
KY-016 LED RGB a 3 colori
KY-017 Interruttore a inclinazione al mercurio
KY-018 Modulo LDR
KY-019 Rel 5 V
KY-020 Interruttore a inclinazione
KY-021 Mini interruttore reed
KY-022 Sensore/ricevitore di infrarossi
KY-023 Joystick a 2 assi
KY-024 Sensore lineare a effetto hall
KY-025 Modulo interruttore reed
KY-026 Sensore di fiamma
KY-027 Modulo luce magica
KY-028 Sensore di temperatura
KY-031 Sensore di shock
KY-032 Sensore di prossimit IR
KY-033 Sensore IR per seguire una linea
LED a colori con lampeggiamento
KY-034
automatico
KY-035 Sensore magnetico a effetto hall
KY-036 Sensore di tocco
KY-037 Sensore con microfono sensibile
KY-038 Sensore con microfono
KY-039 Sensore del battito cardiaco con LED
KY-040 Encoder rotativo
Un altro produttore di moduli sensore SainSmart. La Tabella 9-5 un riepilogo di
quello che si pu trovare nella forma di kit di moduli di SainSmart e la Tabella 9-8
contiene immagini, note e diagrammi del pinout. Si tratta di un elenco rappresentativo,
dal momento che i contenuti dei kit possono variare. I moduli con un numero di
componente di SainSmart Part possono essere acquistati anche singolarmente e alcuni
di loro sono unici.
Tabella 9-5 - I moduli SainSmart disponibili nella forma di kit.

Numero di componente Nome


n/d Modulo rel
20-011-985 Sensore di tocco
Sensore di distanza a ultrasuoni
20-019-100
HC-SR04
20-011-984 Sensore di fiamma
Sensore di temperatura e umidit
20-011-986
relativa
n/d Cicalino attivo
20-011-982 Sensore di vibrazioni/shock
n/d Cicalino passivo
20-011-987 Sensore di tracking
20-011-983 Sensore a effetto hall
20-011-981 Sensore fotosensibile
n/d Ricevitore di infrarossi
20-011-944 Modulo joystick
20-011-946 Sensore dacqua

Infine, ci sono i moduli TinkerKit. La Tabella 9-6 un riepilogo e la Tabella 9-9 rivela i
dettagli su ciascuno dei moduli inclusi nel kit Pro. La serie di moduli TinkerKit
progettata per lavorare con la shield di interfaccia di TinkerKit (descritta nel Capitolo 8).
Anche se attualmente la societ TinkerKit non attiva, i suoi prodotti si trovano ancora
presso http://www.mouser.com), Newark/Element14 (http://www.newark.com) e altri. Le
librerie software si trovano su GitHub (https://github.com/TinkerKit). Una serie di
schede tecniche di base relative a questi moduli si trovano presso Mouser
(http://bit.ly/mouser-tinkerkit).
Tabella 9-6 - Riepilogo dei moduli TinkerKit.

Modulo Nome Modulo Nome


T000020 Modulo accelerometro T010020 Modulo mosfet
T000030 Modulo joystick T010110 Modulo LED ad alta intensit
T000070 Sensore a effetto hall T010111 Modulo LED blu 5 mm
T000090 Modulo LDR T010112 Modulo LED verde 5 mm
T000140 Modulo potenziometro rotativo T010113 Modulo LED giallo 5 mm
T000150 Modulo potenziometro lineare T010114 Modulo LED rosso 5 mm
T000180 Modulo pulsante T010115 Modulo LED blu 10 mm
T000190 Modulo inclinazione T010116 Modulo LED verde 10 mm
T000200 Modulo termistore T010117 Modulo LED giallo 10 mm
T000220 Modulo sensore di tocco T010118 Modulo LED rosso 10 mm

La Tabella 9-9 non mostra i diagrammi del pinout perch i moduli TinkerKit utilizzano tutti
un pinout standard. Lunica differenza tra i moduli tra i moduli discreti digitali (on/ off) e
analogici. Entrambi i tipi utilizzano lo stesso pinout di base mostrato nella Figura 9-9.

Figura 9-9 - Il connettore comune dei moduli TinkerKit.

I circuiti dei moduli TinkerKit gestiscono linterfaccia elettrica, che pu rilevare il livello,
amplificarlo e cos via. Quindi dovete tenere presente che, nel caso di molti dei moduli
TinkerKit, Arduino non comunica direttamente con il sensore, il LED, il controllo
dellinput, o il dispositivo di output, ma piuttosto con un circuito di interfaccia. Se girate
un modulo, potete controllarne la parte posteriore per vedere quale circuito vi
installato. Perfino i moduli LED hanno installato un transistor. Lobiettivo dei prodotti di
TinkerKit era creare qualcosa che fosse facile da collegare ad Arduino e relativamente
insensibile agli errori meno gravi e quindi alcune delle funzionalit di integrazione
dellinterfaccia di basso livello sono gi fornite.

I moduli KEYES
Tabella 9-7 - I moduli sensore e di output di tipo KEYES.

Numero del
Nome e descrizione Immagine Pinout
componente
Sensore di temperatura
Utilizza un IC del sensore di
KY-001
temperatura DS18B20 da un
solo filo in un package TO-92.
Sensore di vibrazioni
Un sensore di shock sigillato
chiude il circuito tra i pin GND e
signal. +5 V non sembra
KY-002
essere collegato, ma c una
posizione per una resistenza
sul lato inferiore della PCB.
Molto sensibile.
Sensore di campo magnetico
a effetto hall
Rileva la presenza di un campo
magnetico. Loutput il
collettore aperto di un
KY-003 transistor NPN nel dispositivo
A3144 a effetto hall. Loutput
collegato alla messa a terra
quando il sensore attivo. Non
si tratta di un sensore lineare,
mentre il KY-024 lo .
Pulsante
Un semplice interruttore a
KY-004
pulsante. Loutput diventa low
quando il pulsante premuto.
Emettitore di infrarossi
Un LED IR adatto per essere
utilizzato con un KY-022.
KY-005 Notate che si deve utilizzare
una resistenza esterna che
limiti la tensione. Sul modulo
testato, il pin GND non era
collegato.

Cicalino passivo
Si tratta di un piccolo
KY-006 altoparlante con un diaframma
metallico. Il pin +5 V non
utilizzato.
LED laser
Un LED laser 650 nm (rosso) a
bassa potenza (vedere Figura
9-51). La messa a terra
collegata allanodo, il segnale al
catodo. Il pin+5 V non
KY-008
utilizzato (ma collegato al
segnale per mezzo di una
resistenza da 10K sulla PCB).
Lunit ha bisogno di una
resistenza esterna che limiti la
tensione.
LED RGB a 3 colori
Utilizza un LED con output
simultanei rosso, verde o blu.
KY-009 Diversi moduli testati hanno
pinout diversi e quindi prima vi
conviene controllare come
collegato ciascun colore.
Interruttore ottico
Incorpora un interruttore ottico
(un LED e un fototransistor)
KY-010
per rilevare quando un oggetto
si trova nello spazio tra le due
sezioni verticali.
LED a 2 colori
Utilizza un LED capace di
emettere output verde o rosso
o entrambi
contemporaneamente. Si tratta
KY-011 di un componente con tre
terminali, che significa che i
LED interni condividono un
collegamento comune e che
ciascuno pu essere gestito in
modo indipendente.

Cicalino attivo
Genera un tono di unaltezza
KY-012
fissa quando gli si fornisce
alimentazione.

Sensore analogico di
temperatura
Come elemento attivo per
rilevare la temperatura, utilizza
KY-013
un termistore (vedere I
termistori a pagina 315). La
tensione di output varia in
funzione della temperatura.
Sensore di temperatura e
umidit
Utilizza un sensore di
temperatura e umidit DHT11.
KY-015
Trovate ulteriori informazioni su
questo componente in I
sensori DHT11 e DHT22 a
pagina 313.
LED RGB a 3 colori
Fondamentalmente uguale al
KY-009, ma utilizza un
KY-016
componente through-hole
anzich un dispositivo a
montaggio superficiale.
Interruttore a inclinazione al
mercurio
Rileva linclinazione su un asse
utilizzando una gocciolina di
mercurio in un tubo di vetro
(vedere I sensori di
inclinazione a un solo asse a
pagina 319). Per rilevare
KY-017 linclinazione su due assi, si
devono utilizzare due di questi
moduli. Il pin +5 V non
collegato al sensore, ma
collegato al pin signal per
mezzo di un LED e di una
resistenza da 680 ohm.

Modulo LDR
Un modulo LDR (light-
dependent resistor). La
KY-018 tensione di output varia quando
varia la quantit di luce che
colpisce lLDR (vedere Le
fotocellule a pagina 321).
Rel da 5 V
Un piccolo rel montato su
PCB (vedere I rel a pagina
KY-019
341) con un driver integrato per
interfacciarsi con un segnale di
controllo del livello logico.
Interruttore a inclinazione
Simile al KY-017, ma utilizza
KY-020
una pallina di metallo allinterno
di una piccola scatola.
Mini interruttore reed
Un interruttore reed racchiuso
KY-021 in un piccolo tubo di vetro che
si chiude in presenza di un
campo magnetico.
Sensore/ricevitore di
infrarossi
Un sensore a infrarossi 1838
come quelli che si utilizzano per
i telecomandi dei televisori e
KY-022 altri elettrodomestici. Opera ad
una frequenza portante di 37,9
kHz. La presenza del vettore di
IR fa s che loutput diventi
high.
Joystick a 2 assi
Contiene due potenziometri
montati ad angolo retto luno
KY-023
rispetto allaltro per rilevare il
movimento xy dellalbero
centrale.
Sensore lineare a effetto hall
Utilizza un sensore lineare
SS49E a effetto hall. Per
KY-024 regolare la sensibilit del
circuito, con un potenziometro
si utilizza un comparatore di
tensione LM393.

Modulo interruttore reed


Utilizza un interruttore reed e il
KY-025
circuito comparatore mostrato
nella Figura 9-8.

Sensore di fiamma
Utilizza un sensore ottimizzato
per lunghezze donda IR tra
KY-026
760 e 1100 nm. Il livello di
sensibilit impostato da un
potenziometro.
Modulo luce magica
A essere onesti, non capisco
bene per che cosa lo si
KY-027 dovrebbe utilizzare. Il KY-027
fondamentalmente un KY-017
con un LED su un circuito
separato.

Sensore di temperatura
Utilizza un termistore e un IC
comparatore per rilevare una
KY-028 soglia (vedere I termistori a
pagina 315). Il punto della
soglia impostato dal
potenziometro.
Sensore di shock (impatto)
KY-031 Rileva un impatto improvviso e
genera un output. Non rileva
linclinazione come il KY-002, il
KY-017 e il KY-020.

Sensore IR di prossimit
Utilizza il riflesso di una luce a
infrarossi per rilevare una
superficie o un ostacolo che si
trovano nei suoi pressi. La
KY-032 sensibilit impostata dal
potenziometro. Notate che
esistono almeno due varianti di
questo modulo. Controllate il
pinout prima di fornire
lalimentazione.
Sensore IR per seguire una
linea
Utilizza il riflesso di una luce a
infrarossi su una superficie per
rilevare la differenza tra luce e
oscurit. Generalmente lo si
utilizza per creare un robot che
KY-033 segua una linea scura su una
superficie bianca. La sensibilit
impostata dal potenziometro.
Fondamentalmente uguale al
KY-032 ma con il LED e il
sensore IR montati sulla parte
inferiore della PCB.

LED a colori con


lampeggiamento automatico
KY-034 Un LED lampeggia
automaticamente quando gli
viene fornita alimentazione.
Sensore magnetico a effetto
hall
KY-035 Simile al KY-003 ma con un
sensore lineare a effetto hall
SS49E.
Sensore di contatto
conduttivo
KY-036 Loutput cambia quando
qualcosa di conduttivo (come
un dito) tocca il piombo del
sensore.

Sensore con microfono


sensibile
Un microfono con una soglia
variabile. Il microfono pi
KY-037
grande (rispetto a quello del
modulo KY-038) dota questa
unit di un livello leggermente
maggiore di sensibilit.
Sensore con microfono
Un microfono con una soglia
variabile. Per via delle
KY-038 dimensioni pi ridotte del
microfono (rispetto a quello del
modulo KY-037), questo
modulo meno sensibile.
Sensore del battito cardiaco
con LED
Fondamentalmente, come lo
strumento molto diffuso negli
ospedali e negli studi medici
KY-039 che serve a misurare il ritmo
cardiaco dei pazienti. Per
rilevare le leggere variazioni di
luce di un LED che riflettono il
fluire del sangue in un dito, si
utilizza un fototransistor.

Encoder rotativo
Un encoder rotativo digitale e
continuo. Trovate maggiori
KY-040
informazioni su questi dispositivi
in Gli encoder rotativi digitali a
pagina 330.

I moduli SainSmart
Tabella 9-8 - I moduli sensore e di output di SainSmart.
Numero del
Nome e descrizione Immagine Pinout
componente

Modulo rel
Rel da 5 V con contatti da 10
A.

Sensore di distanza a
ultrasuoni HC-SR04
Utilizza un paio di trasduttori a
ultrasuoni per emettere un
segnale e quindi riceverne
20-019-100
leco. Il tempo trascorso tra la
prima emissione e leco
proporzionale alla distanza tra
il sensore e la superficie che
riflette il segnale.

Cicalino attivo
Emette un tono quando gli si
fornisce alimentazione.

Cicalino passivo
Risponde a un input di onde
quadre, che permette a questo
modulo di emettere un tono
programmabile.
Sensore a effetto hall
Utilizza un sensore lineare a
20-011-983 effetto hall. La soglia della
sensibilit impostata dal
piccolo potenziometro.
Ricevitore di infrarossi
Risponde agli impulsi
provenienti da un telecomando
per generare un segnale
digitale.
Sensore dacqua
Rileva la presenza dacqua
rispondendo ai cambiamenti
20-011-946 della conduttivit sulle dita
metalliche della PCB. Pu
essere utilizzato per rilevare
pioggia o spruzzi.

Sensore di tocco
20-011-985
Rileva il tocco di un dito

Sensore di fiamma
Risponde a IR tra 760 e 1100
20-011-984
nm. La sensibilit impostata
dal potenziometro.

Sensore di temperatura
Utilizza un IC per sensore di
temperatura da un filo
20-011-988
DS18B20 (vedere DS18B20
a pagina 312 in un package
TO-92.
Sensore di temperatura e
umidit relativa
Utilizza un sensore di
20-011-986 temperatura e umidit DHT11.
Trovate ulteriori informazioni su
questo componente nella
Figura 9-14.
Sensore di vibrazioni/shock
Percepisce movimenti
20-011-982 improvvisi (shock o vibrazioni)
con un sensore sigillato, simile
al KY-002 di KEYES.
Sensore per il tracking
Utilizza un LED IR LED e un
20-011-987
fotosensore per rilevare la
rilfettanza.
Sensore fotosensibile
Un circuito LDR di base
20-011-981 (vedere Le fotocellule a
pagina 321) con sensibilit
variabile.

Modulo joystick
Un joystick con potenziometro
20-011-944
lineare da due assi. Include
una grande manopola.

I moduli TinkerKit
Tabella 9-9 - I moduli I/O TinkerKit.

Numero del
Nome e descrizione Immagine
componente

Modulo accelerometro
T000020 Basato sullIC LIS344AL da tre assi.
Include due amplificatori di segnale.

Modulo joystick
T000030 Due potenziometri montati su una
sospensione cardanica da due assi.

Sensore a effetto hall


Emette un output relativo alla
T000070
tensione che dipende dalla potenza
di un campo magnetico locale.
Modulo LDR
LDR (light-dependent resistor) con
T000090 un amplificatore, emette come output
una tensione proporzionale al livello
della luce.

Modulo potenziometro rotativo


T000140 Potenziometro analogico rotativo da
4,7 kohm.

Modulo potenziometro lineare


T000150 Potenziometro analogico lineare
(slider) da 4,7 kohm.

Modulo pulsante
Semplice modulo pulsante,
T000180
normalmente aperto, che emette +5
V quando premuto.
Modulo inclinazione
T000190 Utilizza un semplice sensore di
inclinazione con una pallina metallica
interna.

Modulo termistore
Utilizza un termistore e un
T000200 amplificatore per emettere una
tensione proporzionale alla
temperatura.
Modulo sensore di tocco
Utilizza un controllo di tocco singolo
QT100A per produrre 5 V quando
T000220 viene toccato il sensore. La parte
tattile quella sulla parte superiore
della PCB, che nellimmagine appare
piatta.
Modulo rel
Incorpora un rel da 5 V con contatti
T010010
da 250 V 10 A, un transistor e un
blocco di terminali del tipo a vite.
Modulo mosfet
Passa fino a 24 V DC utilizzando un
T010020 MOSFET IRF520. Abbastanza
veloce da poter essere utilizzato con
PWM per il controllo di motori DC.
Modulo LED ad alta intensit
Fornisce cinque LED ad alta
luminosit. Richiede molta corrente e
T010110
quindi potete preferire utilizzarlo con
un T010020 e un alimentatore
esterno.

LED blu 5 mm
T010111 Un modulo semplice con un solo LED
blu da 5 mm.

Modulo LED verde 5 mm


Un modulo semplice con un solo LED
T010112
verde da 5 mm.
T010113 Modulo LED giallo 5 mm
Un modulo semplice con un solo LED
giallo da 5 mm.

Modulo LED rosso 5 mm


T010114 Un modulo semplice con un solo LED
rosso da 5 mm.

Modulo LED blu 10 mm


T010115 Un modulo semplice con un solo LED
blu grande 10 mm.

Modulo LED verde 10 mm


T010116 Un modulo semplice con un solo LED
verde grande 10 mm.

Modulo LED giallo 10 mm


T010117 Un modulo semplice con un solo LED
giallo grande 10 mm.

Modulo LED 10 rosso mm


T010118 Un modulo semplice con un solo LED
rosso grande 10 mm.

I moduli Grove
SeedStudio ha riunito un gran numero di moduli sotto il sistema di interconnessione
Grove. Dal punto di vista della funzionalit, molti di questi sono simili ai moduli messi a
disposizione da KEYES, SainSmart e TinkerKit. Altri sono prodotti unici della linea
Grove.
I moduli Grove sono categorizzati in sei gruppi: monitoraggio ambientale, rilevamento
del movimento, interfaccia utente, monitoraggio fisico, funzioni delle porte logiche e
controllo dellalimentazione. Tutti i moduli utilizzano uno schema di connessione
standardizzato che utilizza un connettore modulare da 4 pin con le linee per
alimentazione, messa a terra e segnale.
Come nel caso dei moduli TinkerKit, il vantaggio offerto dai moduli Grove che vi
evitano di dover fare delle prove per verificare (o scoprire) che cosa fanno realmente i
loro pin. Una shield che segue le convenzioni Grove (come le shield Grove che abbiamo
visto nel Capitolo 8) si collegano ai moduli sensore o attuatore Grove utilizzando un cavo
gi pronto. Inoltre, Seeed Studio vende cavi gi preparati per collegare i moduli a una
shield di interfaccia o di controllo.
Una funzionalit dei moduli Grove che io trovo molto affascinante linclusione di
linguette di montaggio nella PCB della maggior parte dei moduli. Questo permette di
lasciare lhardware di montaggio separato dai circuiti (cosa che non accade quando ci
sono fori di montaggio nel mezzo del layout della PCB) e i connettori modulari sono facili
da utilizzare. Un esempio di modulo Grove mostrato nella Figura 9-10.

Figura 9-10 - Un esempio di modulo Grove.

Mentre scrivevo questo libro, i moduli TinkerKit stavano sparendo, mentre i moduli
Grove sembravano essere in piena forma. Questo non significa che TinkerKit non
torner sulla scena o che Grove esister per sempre: nel mondo di Arduino le cose
cambiano molto in fretta. Come vi ho fatto notare in precedenza, questo capitolo e il
Capitolo 8 sono pensati per fornire esempi di quello che disponibile e non per indicare
riferimenti definitivi. Il mercato troppo volatile per permettere di farlo.
Se state cercando dei moduli che seguono una convenzione di un tipo o di un altro, vi
consiglio di dare unocchiata ai prodotti Grove. Se volete utilizzare una shield
despansione o di interfaccia diversa, potete creare dei cavi di interfaccia personalizzati
utilizzando shell, pin e prese gi pronti, come descritto in Costruire connettori
personalizzati a pagina 355. Trovate un elenco completo dei moduli attualmente
disponibili sulla wiki di Seeed Studio (http://bit.ly/seeed-grove).

Descrizioni di sensori e moduli


Il resto di questo capitolo descrive alcuni dei vari tipi di componenti, moduli e sensori
compatibili con Arduino esistenti attualmente. Dico alcuni dei perch, come nel caso
delle shield, appaiono continuamente nuovi sensori e moduli e alcuni tipi pi vecchi
spariscono se non c mercato sufficiente per giustificarne la produzione continua. Alcuni
moduli sono tipi piuttosto specializzati, come sensori di gas o controlli di corrente. Alcuni
sensori possono sparire quando vengono sostituiti da tipi pi moderni. Potete trovare
tutti i dispositivi descritti qui e molti altri facendo pochissima fatica, utilizzando Google,
consultando gli elenchi di Amazon.com oppure i siti web elencati in Fonti a pagina 357.
La Tabella 9-10 elenca i controlli, i sensori, gli attuatori, i display e i moduli descritti in
questo paragrafo. Sono organizzati in base a funzione, classe (input o output) e tipo
(dispositivo, componente o modulo). Ricordate che i componenti di ciascun modulo sono
disponibili anche come prodotti singoli e quindi potete creare i vostri moduli
personalizzati o incorporare i componenti in qualcosaltro.
Tabella 9-10 - Indice di sensori e moduli.

Funzione Classe Tipo Descrizione


Cicalino (annunciatore),
Audio Output Dispositivo
componenti e moduli
Audio Sensore Microfono Moduli pick-up audio (microfono)
Comunicazione I/O Modulo Moduli RF 315/433 MHz
Comunicazione I/O Modulo Moduli wireless APC220
Comunicazione I/O Modulo Ricetrasmittente WiFi ESP8266
Comunicazione I/O Modulo Modulo NRF24L01
Contatto Sensore Interruttore Moduli interruttore a contatto
Contatto Output Interruttore Rel e moduli rel
Controllo Input Dispositivo Tastierini numerici
Controllo Input Modulo Moduli joystick
Controllo Input Dispositivo Potenziometri
Display Output Modulo Moduli a 7 segmenti
Display LCD ERM1601SBS-2
Display Output Modulo
16 1
Display LCD ST7066 (HD44780)
Display Output Modulo
16 2
Display LCD ERC240128SBS-1
Display Output Modulo
240 128
Display TFT ST7735R 128
Display Output Modulo
160

Emissione di luce Output Display Display LED a 7segmenti


Emissione di luce Output Display Moduli matrice di LED
Emissione di luce Output Laser LED laser
Emissione di luce Output LED LED di un solo colore
Emissione di luce Output LED LED bicolori
Emissione di luce Output LED LED tricolori (RGB)
Rilevamento della
Sensore Photocell Moduli LDR
luce
Rilevamento della
Sensore Diode Moduli fotodiodo
luce
Rilevamento della
Sensore Transistor Moduli fototransistor
luce
Rilevamento IR Sensore IR Moduli sensore PIR
Magnetico Sensore Stato solido Moduli sensore a effetto hall
Magnetico Sensore Stato solido Moduli magnetometro
Umidit Sensore PCB Moduli sensore umidit del suolo
Movimento Output Attuatore Controllo motori DC
Movimento Output Attuatore Controllo servo
Movimento Output Attuatore Controllo motori passo-passo
Movimento Sensore Stato solido Moduli giroscopio
Movimento Sensore Stato solido Moduli accelerometro
Pressione Sensore Stato solido Moduli sensore barometrico
Moduli trasmettitore/ricevitore
Intervallo Sensore Modulo
laser
Intervallo Sensore Modulo Moduli sensore oggetto LED
Moduli misurazione della
Intervallo Sensore Modulo
distanza a ultrasuoni
Rotazione Sensore Controllo Moduli encoder rotativo digitale
Moduli generatore di forme
Segnale Output Modulo
donda
Moduli sensore di temperatura
Temperatura Sensore Stato solido
DS18B20
Moduli sensore temperatura e
Temperatura Sensore Modulo
umidit DHT11/DHT22
Moduli sensore di temperatura
Temperatura Sensore Modulo termistore

Moduli sensore di inclinazione un


Inclinazione Sensore Interruttore
solo asse
Moduli sensore di inclinazione
Inclinazione Sensore Interruttore
due assi
Tempo Supporto Modulo Moduli RTC DS1302
Tempo Supporto Modulo Moduli RTC DS1307
Tempo Supporto Modulo Moduli RTC DS3231
Tempo Supporto Modulo Moduli RTC PCF8563
Tensione Output Modulo Moduli DAC
Moduli sensore conduttivit
Acqua Sensore PCB
dellacqua

I sensori
Anche se possibile collegare molti sensori direttamente a un Arduino, i moduli come
quelli elencati nel paragrafo precedente sono definitivamente pi facili da gestire. Ma i
moduli possono non rappresentare una buona scelta se volete creare hardware
personalizzato per unapplicazione specifica. In quel caso, vi conviene utilizzare soltanto
il componente sensore e collocarlo esattamente dove necessario.
Un sensore sempre un dispositivo di input che acquisisce dati dallambiente fisico e li
converte in una forma che un microcontroller possa elaborare. Come implica il nome,
sentono qualcosa, dove quel qualcosa pu essere temperatura, umidit, campi
magnetici, luce visibile, calore, infrarossi, suono o movimento fisico.

I sensori di temperatura, umidit e pressione


Esistono diversi tipi di sensori ambientali che possono essere utilizzati con Arduino. Che
si tratti di semplici sensori di rilevamento dellacqua basati sulla continuit o di sensori
sensibili a temperatura e umidit, molto probabile che si trovi un sensore capace di
misurare quanto caldo o freddo o umido o secco lambiente.

DS18B20
Il DS18B20 un sensore di temperatura cosiddetto a un filo che restituisce al sensore
un flusso di dati binari che contiene la temperatura. La Figura 9-11 mostra un modulo
facile da trovare con un DS18B20, alcuni componenti passivi e un LED.
Figura 9-11 - Un tipico modulo DS18B20.

La Figura 9-12 mostra il modulo montato su una shield di prototipazione con un rel e un
potenziometro. Questo, a proposito, un semplice termostato digitale che stato
montato per sostituire il termostato elettromeccanico bimetallico ormai morto di una
piccola stufa elettrica portatile. Il termostato meccanico del vecchio stile non aveva mai
funzionato molto bene, ma con questa semplice sostituzione digitale fa il suo lavoro in
modo eccellente. La scheda Arduino cui si collega fornisce anche la possibilit di
registrare i dati relativi alla temperatura ed eseguire altre funzioni. Una stufa economica
di Internet delle Cose? Certo, perch no?
Figura 9-12 - Esempio di applicazione del modulo DS18B20.

I sensori DHT11 e DHT22


I sensori di temperatura e umidit DHT11 e DHT22 si presentano in package di plastica
con tre terminali, come mostra la Figura 9-13. Si trovano anche montati su una piccola
PCB, come mostra la Figura 9-14.

Figura 9-13 - Il package di DHT11.


Figura 9-14 - Il modulo DHT11/DHT22.

I sensori DHT11 e DHT22 presentano delle differenze per quanto riguarda la risoluzione
e la velocit dei dati seriali. Il DHT11 un dispositivo di base con una precisione di
rilevamento della temperatura di +/ 2 gradi C e una risoluzione dellumidit del +/ 5%
di umidit relativa. Ha un intervallo di funzionamento compreso tra il 20 e il 90% di
umidit relativa e 0 e 50 gradi C. Il DHT22 ha una risoluzione della temperatura di +/
0,2 gradi C e una capacit di percezione dellumidit relativa del +/ 1%, oltre a una
velocit superiore di dati seriali. Il DHT22 ha un intervallo di percezione pi ampio
rispetto al DHT11: da 40 a 80 gradi C e dallo 0 al 100% di umidit relativa. Il pinout del
DHT22 identico a quello del DHT11.
Sia il DHT11 che il DHT22 utilizzano un protocollo per le comunicazioni seriali a un filo e
non standard. Funziona adottando un approccio segnale-risposta. Il microcontroller
costringe la linea singola di segnale a rimanere low per un breve periodo di tempo e poi
le permette di diventare high (per mezzo di una resistenza pull-up, aggiunta
esternamente oppure presente sul modulo PCB). Il DHT11/ DHT22 risponde con 40 bit
di dati seriali, organizzati come cinque valori di dati da 8 bit, compreso un checksum di 8
bit.

I termistori
Un termistore una resistenza controllata dalla temperatura. Ne esistono con
coefficiente di temperatura negativo o positivo. Un dispositivo con coefficiente di
temperatura negativo (NTC, negative temperature coefficient) mostra una resistenza
inferiore quando aumenta la temperatura. Un dispositivo con coefficiente di temperatura
positivo (PTC, positive temperature coefficient) si comporta nel modo opposto. I
termistori NTC sono il tipo pi comune che si trova nei sensori e quelli del tipo PTC
spesso si utilizzano come limitatori di corrente di spunto.
La Figura 9-15 mostra un modo di collegare un termistore a un Arduino, ma attenzione
che la curva di risposta del termistore non lineare. Alcuni circuiti sostituiscono la
resistenza fissa con una sorgente di tensione costante.

Figura 9-15 - Un semplice termistore collegato a un Arduino.

Anche se possibile collegare un termistore direttamente a un Arduino, un modo pi


facile utilizzare un modulo che includa i componenti passivi necessari per creare un
partitore di tensione per il termistore, come il KY-028 mostrato nella Tabella 9-7. Potete
anche utilizzare il circuito amplificatore operazionale mostrato nella Figura 9-26 per
aumentare la sensibilit del termistore. Notate che, dal momento che la maggior parte
dei termistori utilizzati per rilevare la temperatura sono di tipo NTC, la tensione che
appare sullinput analogico di Arduino scende quando la temperature aumenta.

I sensori dacqua
Un sensore dacqua utile per molte applicazioni, da un sensore antiallagamento in una
cantina a un rilevatore di pioggia per una stazione meteorologica automatica. La Tabella
9-8 mostra un tipo di rilevatore dacqua disponibile presso SainSmart (il 20-011-946).
Questo sensore incorpora un transistor NPN che mantiene loutput low quando le sottili
tracce della PCB sono collegate da una goccia dacqua, o fondamentalmente qualsiasi
cosa abbastanza bagnata da far s che il transistor conduca la corrente.
La Figura 9-16 mostra lo schema di questo sensore. Come potete vedere, non
complicato e pu essere utilizzato praticamente con qualsiasi sonda o filo conduttivo. Se
collegate questo circuito a un paio di fili di acciaio e montate i fili in modo che stiano a
circa un centimetro (o 1/4 di pollice) di distanza dal pavimento della cantina, potete
utilizzarlo per azionare un allarme al piano di sopra quando lacqua comincia ad allagare
la cantina.

Figura 9-16 - Schema di un sensore dacqua.

I sensori di umidit del suolo


Nella sua forma pi semplice, un sensore di umidit del suolo a due poli realmente non
nientaltro che una sonda di conduttivit. La sonda configurata in modo che si comporti
come un componente di un semplice partitore di tensione e la tensione che appare
attraverso di esso sar una funzione della conduttivit del suolo tra le sonde. Potete
acquistare un kit composto da una sonda di umidit, un piccolo modulo di interfaccia e
un cavo da fornitori come SainSmart. La Figura 9-17 mostra tutti i tre componenti di un
kit del genere.
Figura 9-17 - Il kit della sonda per rilevare lumidit del suolo con il modulo di interfaccia.

Lo stesso effetto pu essere ottenuto utilizzando praticamente qualsiasi materiale


conduttivo per le sonde. Per un utilizzo prolungato, lacciaio inossidabile o delle barre di
carbonio potrebbero rappresentare una scelta migliore, nei posti dove la corrosione pu
essere un problema, e un amplificatore o un buffer di qualche tipo essenziale per
ottenere letture omogenee senza perdere troppa corrente nella sonda (cosa che pu
provocare alcuni effetti collaterali interessanti e anche contribuire alla corrosione degli
elettrodi della sonda).
Unaltra variazione del sensore di umidit del suolo, il Grove 101020008 di Seeed
Studio, mostrata nella Figura 9-18. Questo sensore include un transistor NPN
integrato sulla scheda per portare la caduta della tensione a un livello con il quale lADC
AVR di Arduino possa lavorare. Lo strato di rame sui poli di questa sonda stato
placcato con un sottile stato doro per resistere alla corrosione.

Figura 9-18 - Una sonda per lumidit del suolo.


Lo schema della sonda per lumidit del suolo mostrato nella Figura 9-19.
Essenzialmente, il circuito identico a quello utilizzato per il sensore dacqua, mostrato
nella Figura 9-16. Notate che questo design utilizza un connettore da quattro terminali
anzich la connessione con pin utilizzata sulla sonda nella Figura 9-17. Questo
certamente pi comodo, ma dovete fare attenzione a come sono collegati i terminali del
connettore.

Figura 9-19 - Schema della sonda per lumidit del suolo.

I sensori barometrici
Con un sensore di pressione barometrica, come quello mostrato nella Figura 9-20, e i
moduli DHT11 o DHT22 descritti prima (I sensori DHT11 e DHT22 a pagina 313), si
pu utilizzare un Arduino per costruire una stazione meteorologia compatta. Il sensore
mostrato qui si basa su un sensore MPL115A2 con uninterfaccia I2C.
Figura 9-20 - Un modulo sensore di pressione barometrica.

Questo specifico modulo non abbastanza preciso da poter essere utilizzato come un
altimetro, ma va bene per acquisire e registrare dati meteorologici. Altri moduli basati su
sensori come il MPL3115A2 o il BMP085 sono abbastanza precisi da poter essere
utilizzati come altimetri.

I sensori di inclinazione
Di solito, un sensore di inclinazione non niente pi che una piccola capsula sigillata con
una serie di contatti interni e una pallina di metallo o una perlina di mercurio al suo
interno. Se il dispositivo viene spostato dal suo orientamento neutro (perpendicolare
allattrazione gravitazionale), la pallina o la perlina si muovono e chiudono un circuito tra i
contatti. Il funzionamento identico a quello di un interruttore che si chiude.
Dovete tenere presente che un sensore di inclinazione non un sensore proporzionale.
inclinato oppure no e quindi dal punto di vista elettrico aperto oppure chiuso. Non ci
sono opzioni intermedie.

I sensori di inclinazione a un solo asse


La Figura 9-21 mostra un modulo con un sensore di inclinazione a perlina di mercurio, in
questo caso un KY-017. Questo modulo in particolare rileva linclinazione soltanto in una
direzione. Per rilevare linclinazione sulle due estremit di un asse, dovrete utilizzarne
due o pi.
Figura 9-21 - Un sensore di inclinazione a un solo asse.

I sensori di inclinazione a due assi


La chiave per utilizzare un sensore di inclinazione in modo efficace determinare la
posizione neutra su un determinato asse. Una volta che si sa questo, il sensore pu
essere orientato in modo che rilevi linclinazione su un determinato asse orizzontale. La
Figura 9-22 mostra due sensori di inclinazione su ununica base per rilevare linclinazione
sugli assi x e y. Notate che questa organizzazione rileva linclinazione soltanto in una
direzione (che sia verso lalto e verso il basso, a seconda di come sono montati).

Figura 9-22 - Un sensore di inclinazione a due assi.

Se volete rilevare linclinazione verso lalto o verso il basso su entrambi gli assi, dovete
organizzare quattro sensori di inclinazione con la giusta angolazione luno rispetto
allaltro. In questo modo, potete rilevare linclinazione su entrambe le direzioni +/ x e
+/ y. A differenza che nel caso dei giroscopi a stato solido (come quelli descritti in I
giroscopi a pagina 327), questo tipo di circuito non ha bisogno di un riferimento di
partenza e funziona sempre purch esista la gravit. La controindicazione che non ci
sono passaggi intermedi: i sensori di inclinazione sono on oppure off.

I sensori audio
Un microfono pu essere utilizzato in diversi modi interessanti. Un modo incorporare il
microfono in un sistema di sicurezza per rilevare rumori forti come un vetro che viene
rotto, qualcuno che d un calcio a una porta o il suono di uno sparo. Se abbastanza
sensibile, pu essere utilizzato perfino per rilevare passi.
Un microfono a contatto pu essere utilizzato per raccogliere dati diagnostici da un
motore a combustione interna o perfino a un motore elettrico mentre acceso. In
questo modo, possibile rilevare cuscinetti rumorosi e componenti allentati. Quando
combinato con un sensore ottico, un microfono omnidirezionale pu essere utilizzato per
costruire un rilevatore di fulmini (il tuono arriva circa 4 secondi dopo la luce per ciascun
miglio di distanza dallosservatore al fulmine).
Esistono piccoli moduli dotati di microfoni e un IC, come quello mostrato nella Figura 9-
23. Il minuscolo potenziometro serve a impostare la soglia del circuito. Questo modulo
utilizza un circuito simile a quello mostrato nella Figura 9-8. anche possibile collegare
un microfono direttamente a uno degli input analogici di un Arduino, anche se non si
ottiene nessun controllo sulla sua sensibilit. Per migliorarne la sensibilit si pu
utilizzare un semplice circuito amplificatore operazionale come quello mostrato nella
Figura 9-26.

Figura 9-23 - Un modulo pick-up audio.

I sensori di luminosit
I sensori per rilevare la luminosit esistono in una vasta gamma di stili e tipi. Alcuni,
come i sensori a infrarossi (IR), possono rilevare il calore. Altri rispondono agli IR
emessi dalle fiamme, altri alla luce visibile. Un sensore di luminosit pu utilizzare un
elemento resistivo che cambia la sua resistenza intrinseca in risposta alla quantit di
luce che lo tocca. Altri utilizzano un semiconduttore per fornire una sensibilit maggiore
e una risposta rapida.

Le fotocellule
Una fotocellula, nota anche come LDR (light-dependent resistor), esattamente quello
che dice il suo nome: un componente nel quale la resistenza cambia in funzione della
quantit di luce che lo colpisce. Quasi tutti hanno un aspetto simile a quello mostrato
nella Figura 9-24. Anche se questi dispositivi non sono tutti veloci come gli standard dei
fotodiodi o dei fototransistor, tutti sono abbastanza veloci da poter trasportare audio in
un fascio di luce modulato in ampiezza. Si rivelano utili come rilevatori del livello di luce
ambientale, semplici collegamenti con dati ottici codificati con impulsi a bassa velocit,
sensori guida perch un robot possa trovare una stazione di ricarica e rilevatori della
posizione del sole per una matrice di pannelli solari.

Figura 9-24 - Un tipico dispositivo LDR economico.

I fotodiodi
Anche se la maggior parte dei diodi sono dotati di un qualche grado di sensibilit alla
luce, per ottenere questo effetto serve un fotodiodo. Un fotodiodo, come suggerisce il
suo nome, un diodo che stato prodotto in modo che diventi conduttivo quando lo
colpisce la luce e un tipo comune di fotodiodo il diodo PIN. La I sta per lo strato di
materiale silicio intrinseco tra le parti di silicio P e N del diodo e questo strato di
materiale intrinseco rende un diodo PIN un ottimo rilevatore di luce. Dal momento che
rispondono molto velocemente, si rivelano utili per i collegamenti di comunicazione con
dati ottici e come sensori di posizione per meccanismi rotativi. I diodi PIN si trovano
anche in circuiti radio ad alta frequenza, dove fungono da interruttore. Per ulteriori
informazioni sui diodi e altri dispositivi a stato solido, potete consultare lAppendice D.
La Figura 9-25 mostra come si collega un fotodiodo ad Arduino. Notate che il diodo
polarizzato inversamente: in altre parole, normalmente non conduce lelettricit finch
non viene esposto alla luce. Questo circuito funziona bene con una fonte di luce
sufficientemente intensa, ma potrebbe trovare difficolt in caso di condizioni di
illuminazione scarse.

Figura 9-25 - La semplice connessione di un fotodiodo con Arduino.

Un modo per aumentarne la sensibilit utilizzare una amplificatore operazionale, come


mostra la Figura 9-26. In questo caso, si utilizza un amplificatore operazionale LM358
con un guadagno di circa 10 per fare in modo che la piccola tensione cambi quando il
diodo arriva a un livello che lADC di Arduino pu rilevare e convertire facilmente. Il
potenziometro imposta il guadagno del circuito, in modo che possa essere regolato per
adattarsi a una specifica applicazione. Questo circuito pu essere assemblato
facilmente su una piccola breadboard che non richiede saldature, oppure i componenti
possono essere montati su una PCB di prototipazione (spesso detta scheda millefiori)
per una sistemazione pi permanente.
Figura 9-26 - Il collegamento di un fotodiodo con un amplificatore operazionale.

Potete consultare la selezione di fotodiodi (e di amplificatori operazionali) disponibili


presso distributori di componenti elettronici come Digikey (http://www.digikey.com),
Mouser (http://www.mouser.com) e Newark/Element14 (http://www.newark.com).
Inoltre, molti fornitori di avanzi di magazzino hanno a portata di mano stock di fotodiodi.

I fototransistor
Come suggerisce il nome, un fototransistor risponde alla luce variando la quantit di
tensione che attraversa il dispositivo, proprio come farebbe altrimenti il terminale di input
di base. Il circuito mostrato nella Figura 9-8 funziona con un fototransistor. Alcuni moduli,
come il KY-039, si limitano a collegare i terminali del transistor ai pin del connettore
(potete eliminare il LED e utilizzare il modulo come modulo sensore fototransistor, a
proposito).
Potete espandere il circuito di base aggiungendo un amplificatore operazionale per un
maggiore guadagno. La Figura 9-27 mostra come si pu fare. Andranno bene
praticamente tutti i fototransistor NPN per giardinaggio, ma a me piace il BFH310,
soprattutto perch lho trovato a ottimo prezzo in un grande sacco di cose (cercate
presso un distributore di componenti elettronici come DigiKey o Mouser).
Figura 9-27 - Il circuito di un fototransistor con output sia analogici sia digitali.

Gli interruttori ottici comuni, come quello utilizzato nel modulo KY-010, utilizzano un
fototransistor per rilevare loutput di un LED. Quando qualcosa blocca la luce entrando
nello spazio vuoto del componente, il transistor smette di condurre la corrente. Anche gli
isolatori ottici (detti anche optoaccoppiatori o optoisolatori) utilizzano un LED e un
fototransistor per associale il segnale proveniente da un circuito allaltro senza bisogno
di un collegamento elettrico diretto. Potete costruire il vostro accoppiatore con un LED,
un fototransistor e un pezzo di tubo nero termoretraibile per coprire il tutto e proteggerlo
dalla luce diretta.

I sensori PIR
Un sensore PIR (passive infrared) misura la quantit di infrarossi nel suo campo visivo.
Si utilizzano spesso nei sistemi di sicurezza perch di solito sono in grado di rilevare
cambiamenti molto sottili nella luminosit IR ambientale di una stanza. Se il livello di IR
si discosta dalla linea base dellambiente (come quando un essere umano, con il suo
calore, entra nella stanza), il dispositivo emette un segnale. Un sensore PIR pu essere
utilizzato anche per ottenere una misurazione approssimativa della temperatura di
qualsiasi cosa si trovi nel campo visivo. La Figura 9-28 mostra un modulo PIR piuttosto
diffuso.
Figura 9-28 - Un rilevatore PIR.

Questo modulo in vendita per circa 2 $ presso Banggood (http://www.banggood.com)


e altri distributori. Utilizza tre connessioni: +5 V, messa a terra e output. Loutput diventa
high quando il sensore rileva un cambiamento negli IR dellambiente. Se combinate
questo con un sensore audio, come quello mostrato nella Figura 9-23, con il codice di
base per il sistema di sicurezza descritto nellEsempio 5-5, otterrete un sistema di
allarme anti intrusione perfetto.

I sensori magnetici
Una delle aree dove la tecnologia dei semiconduttori ha fatto considerevoli passi avanti
quella del rilevamento dei campi magnetici statici. Rilevare un campo magnetico che
oscilla, come quello prodotto da una molla, relativamente facile, dal momento che non
serve nientaltro che unaltra molla. Rilevare un campo magnetico statico, come quello
che circonda sempre una calamita o il campo magnetico della Terra, leggermente pi
difficile. Prima che venissero sviluppati i dispositivi elettronici, i sensori dei campi
magnetici spesso incorporavano calamite, molle, specchi e altri componenti. Una
normale bussola da campeggio un esempio di tecnologia vecchio stile e funziona
benissimo per andare a fare unescursione oppure per rilevare il campo magnetico
intorno a un filo che trasporta corrente continua diretta, ma utilizzarla per raccogliere
dati si rivelerebbe molto noioso. Oggigiorno, possibile costruire un rilevatore di campi
magnetici o una bussola elettronica senza parti mobili che si interfacci direttamente con
un microcontroller.

I sensori a effetto hall


Un sensore a effetto hall in grado di rilevare la presenza di un campo magnetico.
Alcuni tipi, come lA3144 utilizzato nel KY-003, sono pensati per essere dispositivi di tipo
on/off: che rilevano se il campo magnetico presente o meno. Altri tipi, come lSS49E,
sono tipi lineari, con un output analogico proporzionale relativo al campo magnetico
rilevato. Il KY-024 un esempio di un modulo con un sensore lineare a effetto hall. Sia
lA3144 che lSS49E hanno laspetto di piccoli transistor fatti di plastica e quindi qui non li
mostrer. Nel caso dellA3144 e dispositivi simili, potete collegarlo direttamente a un
Arduino, che essenzialmente quello che fa il modulo KY-003. Il modulo KY-024 utilizza
il circuito comparatore comune mostrato nella Figura 9-8.

I sensori magnetometro
Unaltra forma di sensore magnetico che pu rivelarsi utile con un Arduino una
bussola, come quella mostrata nella Figura 9-29. Questa unit di Adafruit utilizza un
magnetometro HMC5883L da tre assi e uninterfaccia I2C.

Figura 9-29 - Un modulo bussola con magnetometro.

I sensori di vibrazioni e shock


Di solito, i sensori di vibrazioni e shock si basano sul rilevamento del movimento in una
massa di qualche tipo. Questa massa pu essere un semplice braccio meccanico con
una piccola massa sullestremit e qualche contatto sistemato in modo che il braccio
chiuda un circuito con uno o con laltro quando si piega. Unaltra variazione potrebbe
utilizzare un sensore ottico che cambi il suo stato di output quando il braccio interrompe
un fascio di luce. Pu anche trattarsi di una massa scorrevole con contatti, sensori ottici
o perfino un sensore magnetico. Un altro tipo che viene utilizzato include un sensore
piezoelettrico per rilevare il movimento in una massa.
Un tipo molto economico di sensore di vibrazioni utilizza una piccola massa conduttiva in
un contenitore sigillato. Quando la massa si muove, si rompe e fa contatto con le
maniche conduttive che si trovano su ciascuna estremit del contenitore. Il KY-020 un
tipico modulo con un sensore di questo tipo.
Un sensore di shock simile a un sensore di vibrazioni, ma in alcuni casi i sensori di
shock sono progettati per rispondere a livelli di input specifici in termini di alcuni multipli
di g (1g = la forza di gravit della Terra a livello del mare). Il KY-031 un esempio di
modulo sensore di shock a basso costo.
Potete costruirvi un sensore di shock o di impatto utilizzando una pallina di metallo (una
BB andr bene), una molla (magari quella di una penna a sfera), un pezzettino di tubo di
plastica e qualche filo di basso calibro. La Figura 9-30 mostra come si assemblano tutti
i componenti.

Figura 9-30 - Un sensore di impatto o di shock fatto in casa.

Se avete bisogno di una maggiore precisione, potete trovare sensori di shock industriali
calibrati per livelli di forza specifici. Questi si utilizzano per esempio per testare gli
impatti delle automobili o la tolleranza agli impatti dei contenitori per inviare dispositivi
delicati. In ogni caso, non sono economici.

I sensori di movimento
La capacit di rilevare cambiamenti angolari della posizione a velocit variabili la
chiave per mantenere stabili le cose nello spazio tridimensionale. Molti quadricotteri (o
droni, come a volte vengono chiamati) incorporano qualche forma di rilevamento del
movimento su diversi assi per simulare il funzionamento di un vero giroscopio meccanico
o IMU (inertial management unit). Questi tipi di dispositivi sono diffusi anche presso gli
appassionati di aerei ed elicotteri RC e alcuni utenti avventurosi li hanno inseriti in
modellini di razzi per seguire e registrare il movimento del razzo durante il volo.
I recenti progressi della tecnologia e delle tecniche di produzione hanno permesso di
abbassare i prezzi di questi dispositivi a livelli impossibili da immaginare in passato. Un
giroscopio a stato solido o un accelerometro che prima costavano perfino 50 $ adesso
possono essere acquistati per circa 10 $. Per via del basso costo e del fatto che i
componenti IC sono package molto piccoli a montaggio superficiale a passo stretto, ha
pi senso acquistare un modulo piuttosto che cercare di assemblare qualcosa partendo
da zero, a meno che, naturalmente, non vogliate utilizzarlo come parte di qualcosa di pi
grande e non abbiate la capacit di utilizzare componenti a montaggio superficiale.

I giroscopi
Il termine giroscopio improprio quando lo si applica a dispositivi digitali di
rilevamento. A differenza dei giroscopi meccanici veri e propri, questi dispositivi sono pi
simili a sensori di velocit angolare pensati per rilevare il movimento intorno a un asse.
Non fanno riferimento per natura a una posizione di partenza inerziale come un
giroscopio vero e proprio. Un IMU pu farlo, ma la maggior parte dei dispositivi IMU
elettromeccanici sono oggetti grandi e pesanti con tre (o pi) giroscopi interni ad alta
velocit in cuscinetti a sfera di precisione con motori elettrici e sensori di posizione.
Tendono anche a essere molto, molto cari. Tuttavia, con un po di programmazione
intelligente e luso di accelerometri multiassiali (che vedremo tra poco) possibile
simulare unIMU. La Figura 9-31 mostra un modulo giroscopio da tre assi, venduto da
DealeXtreme, Banggood e altri distributori.
Figura 9-31 - Un modulo giroscopio da tre assi.

Gli accelerometri
Un accelerometro percepisce un cambiamento di velocit su un determinato asse
lineare. Quando laccelerometro si muove a una velocit costante, non rileva nessun
cambiamento, ma quando la velocit cambia per via dellaccelerazione o della
decelerazione, il sensore genera un output. Un accelerometro da tre assi rileva i
cambiamenti di velocit sugli assi x, y e z. La Figura 9-32 mostra un modulo
accelerometro da un solo asse economico, basato su MMA7361 e venduto da
DealeXtreme, ma moduli come questo si trovano anche presso Adafruit, SparkFun e
altri rivenditori.
Figura 9-32 - Un modulo accelerometro.

I sensori a contatto e di posizione


I sensori a contatto si trovano in applicazioni di ogni tipo, dalle macchine per
limbottigliamento delle bevande agli strumenti controllati dal computer in negozi di
macchine. I pulsanti sulle scatole di effetti come quelle che utilizzano i musicisti sono un
tipo di sensore a contatto. Ma, a prescindere da come sono fatti, i sensori a contatto
funzionano tutti in base allo stesso principio: o sono in contatto fisico con qualcosa,
oppure non lo sono.
I sensori di posizione, come suggerisce il loro nome, si utilizzano per rilevare la
posizione di qualcosa. A differenza dei sensori a contatto, di solito quelli di posizione
hanno la capacit di percepire il grado di vicinanza oppure una certa quantit di
rotazione angolare. Alcuni sensori di posizione utilizzano la luce riflessa, altri utilizzano il
suono e altri ancora incorporano un rotore progettato specificamente e un fascio di luce
per misurare il movimento angolare. Unaltra forma di sensore di posizione, detto
encoder assoluto, utilizza un disco di vetro interno con dei segni molto sottili per
determinare il grado preciso di rotazione di un albero. Gli encoder assoluti non sono
trattati qui.

Gli interruttori a contatto


Un interruttore a contatto pu essere semplice come un filo whisker fatto con una
bobina con un palo conduttivo nel centro, come quelli che si trovano nei piccoli insetti
robot che si vendono nei negozi di giocattoli. Quando il whisker si piega, la bobina entra
in contatto con il palo conduttivo e chiude il circuito. In altre parole, non altro che un
interruttore. La Figura 9-33 mostra unimmagine pi da vicino di questo tipo di sensore a
contatto.
Figura 9-33 - Un sensore a contatto con bobina whisker.

Allaltra estremit dello spettro ci sono i cosiddetti interruttori a scatto, come quello
montato su un modulo nella Figura 9-34. Questo un modulo sensore di impatto
Meeeno. Questi tipi di interruttori spesso si trovano in applicazioni come sensori di limiti
per oggetti di robotica o strumenti per macchine CNC (computer-numeric controlled).
Figura 9-34 - Un tipico interruttore a scatto.

Un pulsante pu anche fungere da sensore a contatto. Gli interruttori a pressione di


vecchio stile che si utilizzavano sulle automobili per accendere la luce allinterno del
veicolo quando la porta era aperta sono eccellenti sensori a contatto (anche se possono
richiedere una certa forza per attivarli, pi di quella che pu fornire un piccolo robot
tipico). Per rilevare il contatto fisico si possono utilizzare perfino una striscia di rame e
una vite, come mostra la Figura 9-35. Limportante che linterruttore chiuda (o apra) il
circuito, in modo che un Arduino possa accorgersene e rispondervi.

Figura 9-35 - Un semplice sensore a contatto fatto con una striscia di metallo.
Gli encoder rotativi digitali
Un encoder rotativo digitale, come le unit mostrate nella Figura 9-36, genera impulsi
oppure emette un valore numerico quando viene ruotato un albero. Anche il modulo KY-
040 utilizza un encoder rotativo. Alcuni encoder rotativi presentano sullalbero dei denti di
arresto in modo che loperatore possa notare dei lievi urti mentre lo gira. Nel caso di
applicazioni che non richiedono che qualcuno giri una manopola, lalbero si muove
liberamente e continuamente. Nel Capitolo 12 trovate un esempio di come si crea un
software per leggere un encoder rotativo come il KY-040.

Figura 9-36 - Gli encoder rotativi digitali.

I mouse vecchio stile dei computer utilizzavano una sfera di metallo rivestita anzich un
LED e due encoder rotativi per rilevare il movimento della sfera. Questi stanno
diventando rari, ma al loro interno presentano alcuni componenti interessanti. Se ne
smontate uno, notate le ruote di plastica con delle fessure a distanza uniforme. Quando
le ruote si muovono, il fascio di luce di un LED viene interrotto. Rilevando il ritmo degli
impulsi, il piccolo microcontroller contenuto nel mouse pu generare valori numerici che
indichino quanto lontano si spostato il mouse nelle direzioni x e y su una superficie. La
Figura 9-37 mostra la parte interna di un tipico mouse a sfera.
Figura 9-37 - Un mouse del vecchio stile con una sfera ed encoder rotativi.

In questo mouse in particolare, il LED sender e il fototransistor (o fotodiodo, forse) sono


due componenti separati. Altri modelli di questi vecchi mouse a sfera utilizzano
interruttori ottici, come quelli che si utilizzano nel modulo KY-010 mostrato nella Tabella
9-7. Le ruote dellinterruttore sono gestite da alberi in contatto con i lati della sfera di
metallo. Se mai avete utilizzato un mouse a sfera per un po di tempo, sapere che
occasionalmente dovete rimuovere la sfera e pulire tutto lo sporco che si accumulato
sullalbero (e anche sulla sfera). Le ruote dellinterruttore e i sensori ottici possono
essere rimossi e riutilizzati in qualcosaltro (francamente, le ruote dellinterruttore sono
probabilmente la parte pi utile di un mouse di questo tipo).

I trasmettitori/ricevitori laser
Il modulo mostrato nella Figura 9-38 un trasmettitore e ricevitore laser a corto raggio
progettato principalmente per rilevare ostacoli o svolgere qualsiasi altra operazione
dove si possa utilizzare la riflettanza per rilevare un oggetto. Pu essere utilizzato come
collegamento di dati, ma le ottiche dovrebbero essere perfezionate per raggiungere un
raggio significativo.
Figura 9-38 - Il rilevatore di oggetti laser a corto raggio.

I sensori di distanza
La capacit sia di rilevare un oggetto che di determinarne la distanza dal sensore una
funzione chiave in molte applicazioni di robotica. Un sensore di distanza di solito utilizza
la riflessione, che sia della luce, del suono o di onde radio nel caso di un radar. Qui
vedremo il suono e la luce, dal momento che i sensori radar tendono a essere piuttosto
costosi e funzionano meglio sulle grandi distanze. Per rilevare un corto raggio, vanno
bene sensori ottici o acustici, che sono molto economici.

I sensori di oggetti con LED


Un sensore di oggetti con LED funziona misurando la luce emessa da un LED (che sia
ottica o IR) e riflessa da una superficie. Questi dispositivi di solito hanno un LED IR e un
rilevatore situati uno a fianco allaltro, come nel modulo mostrato nella Figura 9-39. Non
misurano il tempo che impiega la luce a viaggiare dallemettitore e tornare al sensore,
perch a corto raggio la velocit della luce lo renderebbe estremamente difficile da
calcolare. Se volete misurare la distanza dalla Terra alla Luna utilizzando uno dei
retroriflettori lasciati dalle missioni Apollo, dovete utilizzare un laser a impulsi, un grande
telescopio e un buon timer ad alta precisione: Nel caso di Arduino, invece, un sensore
riflettente baster per evitare a un piccolo robot di andare a sbattere contro il muro o
per permettergli di seguire una linea sul pavimento.
Figura 9-39 - Il modulo sensore di oggetti riflettente.

I misuratori di distanza a ultrasuoni


Se siete abbastanza grandi, potete ricordare le vecchie fotocamere istantanee che
includevano un misuratore di distanza a ultrasuoni per mettere a fuoco automaticamente
il soggetto e scattare una fotografia che potevate guardare mentre si sviluppava. Il
misuratore di distanza di solito consisteva di un paio di sensori piezoelettrici, uno
collegato come emettitore e laltro come ricevitore. Lemettitore generava un breve
impulso di ultrasuoni e leco veniva rilevato dal ricevitore. Con questo tipo di misuratore
di distanza, il tempo tra loutput dellimpulso e il ritorno delleco determinato dalla
distanza di quello che stanno puntando i sensori. Questo funziona perch il suono si
muove con relativa lentezza e quindi ottenere il tempo trascorso tra limpulso e il ritorno
non una cosa particolarmente difficile da fare con una logica abbastanza veloce.
Oggigiorno, potete trovare un misuratore di distanza a ultrasuoni per pochi euro e lo
potete collegare a una scheda Arduino. Un esempio di un sensore a ultrasuoni facile da
trovare il modulo 20-019-100 mostrato nella Tabella 9-8.

Le comunicazioni
Esistono numerosi moduli per applicazioni basate sulle comunicazioni, da semplici
adattatori RS-232 a moduli trasmettitori/ricevitori di comunicazioni wireless e laser.

I moduli wireless APC220


I moduli ricetrasmittente APC220 funzionano tra i 418 e i 455 MHz. Un collegamento
digitale completo consiste di due moduli e un adattatore USB opzionale. Questo
permette a un modulo di collegarsi a un PC e allaltro di collegarsi a una scheda
Arduino. LAPC220 in grado di trasferire dati a 19.200 bit al secondo, con un raggio di
fino 1.000 metri. La shield multifunzione descritta in Shield varie a pagina 273 include
un punto di connessione per un modulo APC220, cos come la shield LCD 16 2 di
DFRobot (anchessa analizzata nel Capitolo 8). La Figura 9-40 mostra un paio di moduli
APC220.

Figura 9-40 - I moduli ricetrasmittente RF APC220 (immagine: DFRobot).

I moduli RF 315/433 MHz


Questi moduli, con un raggio di fino a 500 piedi (150 metri), sono alternative a basso
costo dellAPC220. Lo svantaggio che non sono ricetrasmittenti, ma si presentano
come una coppia di trasmettitore e ricevitore, come mostra la Figura 9-41. Sono
disponibili preimpostati su 315 MHz o 433 MHz. Notate che dovete aggiungervi la vostra
propria antenna.

Figura 9-41 - Il trasmettitore e ricevitore a 433 MHz.


La ricetrasmittente ESP8266
Questo modulo WiFi altamente integrato, mostrato nella Figura 9-42, supporta i
protocolli 802.11 b/g/n e utilizza uninterfaccia seriale per comunicare con un Arduino. La
MCU da 32 bit integrata nella scheda ha uno stack di protocolli di rete TCP/IP nel suo
firmware. Gestisce i dettagli di basso livello per stabilire e mantenere un collegamento
digitale e quindi lunica cosa che deve fare Arduino specificare un indirizzo con il quale
collegarsi, oppure aspettare che qualche altro modulo si colleghi con lui.

Figura 9-42 - Un modulo ricetrasmittente WiFi.

LNRF24L01
Il modulo NRF24L01, mostrato nella Figura 9-43, una ricetrasmittente a basso
consumo che lavora a 2,4 GHz con un raggio di circa 800 piedi (250 metri). Per
comunicare con Arduino utilizza uninterfaccia SPI. Questi moduli possono essere
acquistati per circa 3 $ da diversi rivenditori.
Figura 9-43 - La ricetrasmittente RF NRF24L01.

Ladattatore RS-232
I dispositivi MCU AVR che si utilizzano sulle schede Arduino hanno un UART (o USART,
se preferite adottare la terminologia di Atmel) integrato, ma che non genera segnali RS-
232 standard. Anzich costruire un convertitore personalizzato, il modulo adattatore RS-
232 fornisce il convertitore, lID e un connettore DB-9, come mostra la Figura 9-44. I pin
RxD e TxD della MCU si collegano direttamente al modulo.

Figura 9-44 - Il modulo adattatore RS-232.


Dispositivi e componenti di output
Un output proveniente da una scheda Arduino pu essere un LED, un servo motore, un
rel, oppure qualche altro modulo, componente o dispositivo che risponda a un segnale
o a un comando che venga dal microcontroller AVR di Arduino. Questo paragrafo
comincia con le fonti di luce, seguite dai rel, dai motori e dai servo. Parla anche delle
fonti di suono, come laltoparlante KY-006 che risponde agli impulsi e che appare nella
Tabella 9-7. I componenti relativi allinput e alloutput dellutente sono trattati in paragrafi
successivi.

Le fonti di luce
Le fonti di luce possono essere lampadine vecchio stile in una vasta gamma di tipi e
dimensioni, oppure LED, dispositivi a stato solido che si comportano come diodi ma
emettono un bagliore intenso quando li attraversa la corrente. In questo paragrafo ci
concentreremo sui LED, principalmente perch sono economici, durano a lungo e non
sempre hanno bisogno di un circuito per gestirli. Perfino una piccola lampadina a
incandescenza pu consumare una quantit significativa di corrente e tendere a
surriscaldarsi o a bruciarsi. Detto questo, non c ragione per cui non possiate utilizzare
lampadine a incandescenza: dovete soltanto prepararvi ad affrontare la complessit (e il
costo) di un ulteriore circuito e la necessit di sostituire occasionalmente una lampadina
bruciata.
I LED sono disponibili in una vasta gamma di stili, dimensioni e colori. Un microcontroller
AVR pu fornire dai 5 ai 10 mA necessari per gestire un LED, ma generalmente non
una buona idea collegare direttamente diversi LED oppure cercare di gestire qualcosa
come un modulo LED ad alto output. Per questo, il modo migliore di procedere con un
driver di qualche tipo. Le prossime immagini mostrano alcuni dei tipi di LED disponibili e
che si possono anche trovare gi montati sulle PCB dei moduli, come quelli mostrati
nella Tabella 9-7 e nella Tabella 9-9.

I LED a un solo colore


I LED a un solo colore possono avere dimensioni che vanno da minuscoli componenti a
montaggio superficiale, come il LED D13 della scheda Arduino, agli enormi dispositivi
utilizzati per applicazioni di illuminazione. La Figura 9-45 mostra una selezione di alcuni
dei vari tipi disponibili.
Figura 9-45 - Un comune LED di un solo colore.

I LED bicolori
Un LED bicolore fondamentalmente una coppia di LED montati in un unico package,
che generalmente si presenta come un LED normale con una connessione interna come
quella mostrata nella Figura 9-46. I LED interni sono collegati al contrario luno rispetto
allaltro. Quando la corrente fluisce in una direzione, uno dei LED si accende e quando la
corrente viene invertita si accende laltro.
Figura 9-46 - Le connessioni interne di un LED bicolore con due terminali.

Un altro tipo disponibile di LED bicolori utilizza tre terminali. Uno comune e gli altri due
si collegano ciascuno a uno dei chip del LED allinterno del package di plastica del
dispositivo.

I LED tricolori (RGB)


Un LED tricolore composto da tre chip separati in un unico package di plastica. La
Figura 9-47 mostra un componente a montaggio superficiale. possibile montarne un
gran numero in una serie su ununica PCB e diverse PCB possono essere montate una a
fianco allaltra per creare un grande display LED pieno di colori.
Figura 9-47 - Un LED tricolore a montaggio superficiale.

Un LED tricolore pu produrre unapprossimazione di qualsiasi colore visibile variando


lintensit`delloutput di ciascuno dei LED interni. Dal momento che le matrici dei LED (i
chip dei singoli LED) sono fisicamente separate, i colori si miscelano con un diffusore di
un qualche tipo. Dalla distanza pu sembrare convincente. LED RGB ad alta potenza e
alto output sono stati utilizzati per creare enormi display a colori, come quelli che si
vedono accanto agli edifici o nei grandi stadi sportivi.

Le matrici di LED
Una matrice di LED utile per una vasta gamma di applicazioni. Una matrice 8 8,
come quella mostrata nella Figura 9-48, pu essere utilizzata per mostrare lettere o
numeri. Se disponete diversi di questi moduli uno accanto allaltro, potete creare un
display con il testo che scorre.
Figura 9-48 - Una matrice di LED 8 8.

Notate che il modulo progettato in modo che rimanga soltanto pochissimo spazio tra i
LED e i bordi del modulo. Quando questi tipi di moduli matrice sono montati uno accanto
allaltro, la distanza tra lultima colonna o lultima riga su un modulo e la colonna o la riga
adiacente sul modulo successivo uguale alla distanza tra i LED che si trovano al
centro del modulo. Questo mantiene uniforme la distanza quando si utilizzano molti
moduli per creare display grandi.

I display LED a 7 segmenti


Il venerabile display a 7 segmenti esiste da molto tempo. Oltre a singoli LED, questa
stata la prima applicazione valida per la tecnologia a LED e prima della fine degli anni
70 i moduli display con cifre LED a 7 segmenti e alfanumerici cominciavano ad apparire
in applicazioni di ogni tipo. La Figura 9-49 mostra un tipico modulo display da 4 cifre.
Figura 9-49 - Un tipico display a 7 segmenti a 4 cifre.

Come nel caso del modulo matrice di LED mostrato nella Figura 9-48, la distanza sui
bordi di questo modulo inferiore, in modo che si possano montare diversi moduli uno
accanto allaltro. Con tre di questi componenti potete facilmente creare un display a
virgola mobile da 12 cifre.

I moduli LED a 7 segmenti


I moduli display a 7 segmenti sono disponibili con interfaccia I2C o SPI integrata. Il
modulo mostrato nella Figura 9-50 ne un esempio. Questo specifico modulo pu
essere acquistato presso Tindie (vedere Tabella 9-11). Esistono anche moduli con
diversi display e si trovano in rosso, verde, giallo e blu.
Figura 9-50 - Un modulo display a 7 segmenti con interfaccia SPI.

I laser
Alcuni tipi di fonti di luce con diodo sono anche i laser come quelli che si trovano nei
puntatori laser, mentre altri sono abbastanza potenti da tagliare la plastica o il legno. Un
laser a stato solido essenzialmente un LED con alcune modifiche interne per fargli
produrre una luce coerente. I LED laser sono disponibili con lunghezze donda di output
che vanno da infrarosso a blu. Senza questi dispositivi, cose come livelli laser per lavori
di costruzione, puntatori per docenti e istruttori, profilatori di superfici per la
modellazione 3D, riproduttori e registratori CD e DVD e alcuni tipi di strumenti da taglio
industriali non sarebbero possibili. Un tipico piccolo modulo LED laser mostrato nella
Figura 9-51 (si tratta di un KY-008).
Figura 9-51 - Un tipico LED laser rosso a bassa potenza.

Il LED laser pu essere acquistato come componente separato presso distributori di


elettronica.

I rel, i motori e i servo


Molti piccoli rel possono trasportare pi corrente per alimentare la bobina interna
rispetto a quanto non possa fare con sicurezza il microcontroller AVR della PCB di
Arduino. I motori e i servo sono esempi di dispositivi molto utili che spesso hanno
bisogno di un componente driver di qualche tipo che fornisca loro la corrente di cui
hanno bisogno per funzionare.

I rel
I rel esistono in una vasta gamma di dimensioni e forme, da piccoli package che
sembrano IC DIP da 14 pin a oggetti enormi per controllare grandi carichi in attrezzature
industriali. Nel caso della maggior parte delle applicazioni Arduino, sufficiente un
piccolo rel. Un piccolo rel pu gestire un rel pi grande, che a sua volta pu gestirne
uno ancora pi grande e cos via. Il KY-019 un esempio di un modulo rel che pu
essere collegato direttamente ad Arduino.
Il driver di un rel pu essere un semplice transistor 2N2222, oppure pu trattarsi di un
IC progettato specificamente per gestire la corrente e i picchi inversi incontrati con i
rel. Il circuito mostrato nella Figura 9-5, che abbiamo visto prima, utilizza un transistor
NPN per controllare un piccolo rel montato sulla PCB.
La Figura 9-52 mostra un modulo con quattro rel. La PCB include anche i transistor del
driver, le resistenze e i diodi necessari. Tutto quello che richiesto una sorgente di DC
5 V per gestire le bobine dei rel e segnali logici standard per controllarli.
Figura 9-52 - Un modulo rel con quattro rel montati sulla PCB.

Il controllo dei servo


Il termine servo di solito si riferisce a piccoli dispositivi simili a motori, anche se in
passato veniva utilizzato per riferirsi a ingombranti attuatori utilizzati per cose come
come il posizionamento di pistole su una nave militare o lesecuzione di calcoli analogici.
I tipici piccoli servo, come quelli mostrati nella Figura 9-53, si utilizzano nelle macchinine
e negli aereini radiocontrollati, oltre che nella robotica a livello di hobby.

Figura 9-53 - Una selezione di piccoli servo.


Anche se esistono delle shield da usare con i servo (vedere Capitolo 8), un
microcontroller AVR pu gestire questi dispositivi direttamente con i suoi output PWM.
Un servo come quelli mostrati nella Figura 9-53 ruota un albero di 180 gradi, con la
quantit della rotazione determinata dallampiezza dellimpulso e dalla frequenza di un
segnale di controllo.

Il controllo di motori DC
I motori DC di solito sono controllati con quello che viene detto circuito a ponte H e la
Figura 9-54 mostra un diagramma semplificato.

Figura 9-54 - Un ponte H semplificato.

Un ponte H pu essere utilizzato con DC continua o con un segnale PWM e, a seconda


di come gestito il motore, pu girare in un senso o nellaltro.
Non vi consiglio di costruire un circuito di controllo di un motore a partire da zero (a
meno che non vogliate davvero farlo, naturalmente). Una shield come quella mostrata
nella Figura 9-55 dotata di tutto il necessario per controllare un motore DC. Ha anche
un radiatore per dissipare il calore generato con grandi carichi di corrente. Questa
particolare shield di Seeed Studio (http://bit.ly/seeed-motor-v2). Notate che la shield
controlla due motori DC oppure un motore passo-passo.
Figura 9-55 - Una shield per controllare motori.

Il controllo di motori passo-passo


I motori passo-passo sono relativamente semplici da controllare, una volta che si
forniscono loro i necessari componenti elettronici per generare gli impulsi che facciano
girare lalbero. Un requisito la corrente e, anche se un IC come lULN2003A fornisce
tutto il necessario per gestire un piccolo motore passo-passo, non riesce a gestire
motori grandi che richiedono molta corrente. LULN2003A fondamentalmente soltanto
una serie di otto transistor Darlington e quindi Arduino deve occuparsi di tutto il timing
per gli impulsi del motore.
Esistono delle shield (vedere Capitolo 8) che contengono i circuiti per fino a quattro
motori passo-passo, insieme ai connettori necessari per collegarli in un modo
leggermente pi facile. Come nel caso dei motori DC, utilizzare qualcosa che gi
costruito molto pi facile che costruire qualcosa a partire da zero e, se considerate
anche il tempo necessario, probabilmente risulta anche pi economico.

Gli output dei segnali analogici


I segnali analogici sono i fenomeni ciclici continuamente variabili che spesso definiamo
suono, oltre a quei segnali oltre lintervallo udibile per gli esseri umani, come quelli radio.
Esistono diversi modi di utilizzare una scheda Arduino per produrre segnali analogici di
tipo onda sinusoidale, dei quali tutti richiedono qualche componente esterno aggiuntivo.
Un microcontroller AVR non incorpora un convertitore digitale-analogico (DAC) nel suo
design, per cui, se volete ottenere qualcosa di diverso da onde quadre da un output
PWM o del timer, avete bisogno di qualcosa per generare i segnali.

I cicalini
I cicalini possono essere oggetti semplici che emettono un tono ad altezza fissa quando
sono attivi, oppure possono essere leggermente pi sofisticati e generare un picco
programmabile. Il KY-006 e il KY-012 sono esempi di questi tipi di sorgenti audio.

I moduli DAC
Un modo di fornire ad Arduino la funzionalit digitale-analogico con un modulo DAC,
come lunit mostrata nella Figura 9-56. Questo prodotto in particolare di Adafruit e si
basa sullIC MCP4725, che un DAC a un solo canale da 12 bit con uninterfaccia I2C.

Figura 9-56 - Il modulo DAC basato su MCP4725.

Un DAC si rivela utile quando c bisogno di un segnale continuamente variabile, come


una tensione di controllo per qualche altro circuito o dispositivo. Un DAC pu essere
utilizzato anche per generare una forma donda come una rampa o unonda sinusoidale.
Con la velocit delle comunicazioni da 100 Kb/s della modalit standard I2C utilizzata
con i microcontroller AVR non possibile raggiungere la velocit di aggiornamento
possibile con tipi di interfaccia I2C pi rapidi, ma un DAC pu comunque generare una
rispettabile onda sinusoidale a bassa frequenza. Lo svantaggio che lAVR di solito non
sta facendo nientaltro che aggiornare il DAC per produrre forme donda.
I generatori di forme donda
Anche se possibile generare forme donda a bassa frequenza direttamente con una
scheda Arduino e un modulo DAC, per forme donda di qualit oltre a circa 1 kHz
necessario un altro circuito. Un dispositivo di questo tipo il modulo DDS (direct digital
synthesis) mostrato nella Figura 9-57.

Figura 9-57 - Il modulo DDS basato sullAD9850.

LIC AD9850 pu generare sia onde quadre che onde sinusoidali da 1 Hz a 40 MHz.
Potete scaricare la scheda tecnica dellAD9850 da Analog Devices (http://bit.ly/ad9850-
data). LAD9850 utilizza la sua propria interfaccia unica e pu essere controllata
utilizzando uninterfaccia parallela da 8 bit o una seriale. Esistono anche le librerie di
Arduino per il AD9850.

Linput dellutente
A volte necessario che un umano interagisca direttamente con un progetto di Arduino
e questo significa utilizzare pulsanti, manopole, tastierini e joystick. Oltre ai moduli
descritti in questo capitolo, potete acquistare anche i componenti singoli e montarli
come preferite.

I tastierini
Il termine tastierino di solito si riferisce a una serie di interruttori uno accanto allaltro
con etichette, di solito disposti in una griglia di 3 3, 3 4 o 4 4. Pu riferirsi anche a
un cosiddetto tastierino a membrana, che una serie di piccoli interruttori a membrana
su una PCB. Di solito i tasti sono contrassegnati con lettere e numeri, come gli esempi
mostrati nella Figura 9-58. I tastierini non devono per forza essere rettangolari, ma se
ne trovano in una vasta gamma di stili e layout. In effetti, la tastiera di un computer non
altro che un tastierino molto grande.

Figura 9-58 - Un assortimento di tastierini.

I joystick
I joystick di solito possono essere di due tipi: analogici continui oppure digitali discreti.
Un joystick analogico continuo, come quello mostrato nella Figura 9-59, utilizza due
potenziometri, ciascun collegato agli assi x e y. I valori letti dai potenziometri indicano
quanto lontano si spostato il joystick e in quale posizione si trova attualmente.
Figura 9-59 - Un modulo joystick analogico.

Un joystick digitale discreto utilizza piccoli interruttori o altri tipi di rilevatori per rilevare
quando stato spostato il joystick alla sua estensione massima in entrambe le direzioni,
x o y. Questi tipi di joystick venivano utilizzati con i primi giochi economici di fascia
consumer e i personal computer. Sono dispositivi tutto o niente, ma sono economici da
produrre e non presentano problemi con lo sporco e lusura che possono affliggere i
joystick analogici. Molte shield LCD incorporano un joystick discreto.

I potenziometri e gli encoder rotativi


Un potenziometro una resistenza variabile, di solito utilizzata per il controllo dellinput.
Un potenziometro pu essere utilizzato in un modulo dimmer per le luci, come controllo
del volume, come controllo dellinput per uno strumento di test, oppure come input per
una vasta gamma di circuiti analogici. I moduli TinkerKit T000140 e T000150 sono
esempi di potenziometri.
Un encoder rotativo, come quello mostrato prima nella Figura 9-36, pu anche essere
utilizzato come dispositivo di input dellutente. Anzich produrre una tensione variabile
che deve essere convertita in numeri digitali per poter essere utilizzata da un
microcontroller AVR, lencoder rotativo produce output digitale che pu essere utilizzato
direttamente.

Loutput dellutente
La capacit di mostrare informazioni a un utente vi permette di rendere il vostro
progetto veramente interattivo. Pu trattarsi di un semplice stato rivelato da LED,
oppure di messaggi complessi o di immagini su uno display LCD o TFT. Qualunque
forma prendano, i dispositivi di output offrono allutente un feedback immediato in
risposta agli input dei comandi.
Esiste una vasta gamma di display che possono essere utilizzati con Arduino. Le shield
display LCD descritte nel Capitolo 8 utilizzano gli stessi componenti, ma in una forma pi
comoda. Ci sono, comunque situazioni nelle quali una shield pu non risultare
appropriata e in questi casi un componente display LCD che pu essere montato in una
certa maniera pu rivelarsi una scelta migliore.
NOTA Altri esempi di display nella forma di shield per le schede Arduino sono descritti nel Capitolo 8. Assicuratevi di
leggerlo. A meno che non abbiate lassoluta necessit di utilizzare un display con i pin nudi, una shield una soluzione
molto pi facile.

I display di testo
Alcuni dei display solo testo pi comuni ed economici hanno da 1 a 4 righe, con ciascuna
riga capace di mostrare 8, 16, 20, 24, 32 o 40 caratteri. Naturalmente, man mano che
aumenta la densit del display, lo fa anche il prezzo. Un display da 1 riga e 8 caratteri
pu costare circa 2 $, mentre un display da 4 righe e 40 caratteri pu aggirarsi intorno
ai 18 $.

LERM1601SBS-2
Il display LCD ERM1601SBS-2 un display LCD 16 1 con caratteri bianchi su sfondo
blu. Nella Figura 9-60 mostrato un modulo tipico. Questi display utilizzano un chip
controller HD44780 o KS066 e retroilluminazione LED e questa unit in particolare costa
intorno ai 3 $. Trovate prodotti simili con lettere nere su sfondo giallo-verde e lettere
nere su sfondo bianco.
Figura 9-60 - Il modulo display ERM1601SBS-2.

LST7066 (HD44780)
Questo un display LCD 16 2 con una semplice interfaccia parallela che utilizza un
controller ST7066 o HD44780. Si tratta dello stesso componente che si trova sulle
shield display LCD di Adafruit, SparkFun, SainSmart e altri rivenditori. La Figura 9-61
mostra un esempio di questo tipo di display. Costa circa 10 $.

Figura 9-61 - Un display 16 2 che utilizza un controller HD44780 o ST7066.

Potete notare che lERM1601SBS-2 mostrato nella Figura 9-60 assomiglia molto al
display mostrato nella Figura 9-61. Questo perch entrambi utilizzano gli stessi IC per
gestire lLCD. Lunica grande differenza che uno ha un display da una sola riga e laltro
un display da due righe.
Altri tipi di display LCD sia non grafici che grafici si trovano presso vari rivenditori.
Occasionalmente, potete trovare avanzi di magazzino a prezzi molto bassi e, se
utilizzano un chip controller standard, di solito possono essere integrati facilmente in un
progetto di Arduino. Lo svantaggio che spesso questi display avanzati hanno simboli
speciali integrati e quindi potete ritrovarsi con un display molto economico ma con i
simboli di un forno a microonde o di un sistema di irrigazione del giardino che non vi
servono (o magari s).

I display grafici
I display grafici sono disponibili utilizzando tecnologie LCD, TFT o OLED in formati sia
monocromatici che a colori. I dispositivi TFT e OLED hanno un aspetto decisamente
migliore rispetto ai semplici LCD a matrice di punti, ma la bellezza ha un prezzo.

LERC240128SBS-1
Il display ERC240128SBS-1, mostrato nella Figura 9-62, un display LCD a matrice di
punti 240 128 con uninterfaccia parallela da 8 bit. Si trova presso BuyDisplay
(http://www.buydisplay.com).

Figura 9-62 - Un display TFT a colori 240 128.

LST7735R
Un esempio di un altro tipo di display lunit TFT 128 160 TFT venduta da Adafruit e
mostrata nella Figura 9-63. Questo display ha una dimensione diagonale di 1,8 pollici
(4,6 cm) e supporta una selezione di colori a 18 bit per un totale di 262.144 tonalit
diverse. Utilizza un controller ST7735R con uninterfaccia SPI e include perfino un lettore
di schede microSD sulla parte posteriore della PCB.
Figura 9-63 - Un modulo display TFT a colori da 1,8.

Funzioni di supporto
La maggior parte dei moduli forniscono funzioni di input o di output. Non molti hanno
funzioni che possono essere classificate come di supporto non-I/O. Quelli che lo fanno
generalmente ricadono nelle categorie di clock e timer.

I clock
Esistono diversi tipi di IC RTC (real-time clock), come il DS1302, il DS1307, il DS3231 e
il PCF8563. Tutti fanno fondamentalmente la stessa cosa: tengono traccia dellora e
della data. Alcuni hanno una EEPROM integrata e altri no. Alcuni utilizzano uninterfaccia
non standard, alcuni utilizzano SPI e altri utilizzano I2C. A parte le evidenti differenze di
interfaccia, le differenze principali riguardano ampiamente la precisione come funzione di
stabilit nel corso del tempo, di sensibilit alla temperatura, di consumo energetico e di
costo.
Quattro moduli RTC che si trovano spesso sono quelli basati sugli IC DS1302, DS1307,
DS3231 e PCF8563. I moduli di solito sono dotati di un supporto per una batteria a
bottone, spesso una CR2032 o una LIR2032. Test indipendenti hanno mostrato che la
DS3231 offre la maggiore stabilit generale a lungo termine, ma gli altri RTC si possono
utilizzare perfettamente. I moduli con cristalli esterni possono soffrire di deriva termica
indotta e tutti deviano di qualche grado nel corso di lunghi periodi di tempo.

Il modulo RTC DS1302


LIC RTC DS1302 (Figura 9-64) utilizza uninterfaccia seriale non standard. Non SPI,
ma clocked. Una linea trasporta i dati, una il segnale del clock e unaltra la linea
CE (chip enable). Questa quella che Maxim (prima Dallas Semiconductor) definisce
uninterfaccia a tre fili. La Figura 9-64 mostra un tipico modulo DS1302. Trovate
maggiori informazioni sul DS1302 su Maxim Integrated (http://bit.ly/maxim-ds1307).

Figura 9-64 - Un modulo RTC DS1302.

Il modulo RTC DS1307


LRTC DS1307 un dispositivo I2C. Non compatibile n dal punto di vista del codice
n dei pin con il DS1302, ma il risultato finale lo stesso. Trovate maggiori dettagli sulle
schede tecniche di Maxim (http://bit.ly/maxim-ds1307). La Figura 9-65 mostra un
modulo RTC DS1307 di Tronixlabs (http://tronixlabs.com).

Figura 9-65 - Un modulo RTC DS1307.

Il modulo RTC DS3231


Come il DS1307, lRTC DS3231 utilizza uninterfaccia I2C e dal punto di vista del codice
compatibile con il DS1307. La differenza principale la precisione. Il DS3231 utilizza
un cristallo interno e questo lo rende meno sensibile alla temperatura. La Figura 9-66
mostra un tipico modulo RTC DS3231.
Figura 9-66 - Un modulo RTC DS3231.

Il modulo RTC che utilizza PCF8563


Il PCF8563 un altro IC RTC con uninterfaccia I2C. un componente NXP
(http://www.nxp.com) e i suoi registri interni sono completamente diversi da quelli del
DS1307 o del DS3231 di Maxim. La Figura 9-67 mostra un tipico modulo basato sul
PCF8563.

Figura 9-67 - Un modulo RTC PCF8563.

I timer
Anche se la MCU AVR contiene un timer watchdog integrato, esistono moduli che
svolgono essenzialmente la stessa funzione. Una possibile applicazione per un watchdog
esterno (per essere pi precisi, un timer a conto alla rovescia resettabile), quando ha
senso che il segnale di reset del timer provenga da un dispositivo esterno anzich
dallAVR stesso. Prendete per esempio un meccanismo rotativo con un sensore
magnetico che emette un impulso per ciascuna rivoluzione dellalbero. Se gli impulsi
vengono utilizzati per resettare un timer watchdog esterno, questo pu rilevare quando il
meccanismo si guasta e smette di girare. Utilizzando un interrupt o semplicemente
monitorando lo stato del timer per il conto alla rovescia, la MCU pu rilevare la
condizione di guasto e agire di conseguenza.
Molti moduli timer esterni utilizzano un timer 555. Un MOSFET si utilizza per scaricare il
condensatore di temporizzazione e resettare il timer ogni volta che viene applicato un
impulso di reset. Alcuni altri moduli timer di rivenditori asiatici utilizzano una goccia nera
di resina epossidica per nascondere quello che sta facendo il timing sulla PCB. Io lo
eviterei, dal momento che non esiste un modo facile di sapere che cosa c dentro
senza distruggere lIC sotto la goccia.
Se siete interessati ai moduli timer esterni per il conto alla rovescia, vi suggerisco di
procurarvi una copia del libro di Howard Berlin The 555 Timer Applications Sourcebook
(vedere Appendice D). Ledizione originale del 1979 fuori stampa, ma potete ancora
trovarne delle copie su Amazon e ne esiste una versione pi recente, ma leggermente
diversa. La societ australiana Freetronics (http://www.freetronics.com.au) vende un
economico modulo timer watchdog basato su un time 555.

Le connessioni
Nel corso degli ultimi anni, nei metodi di interconnessione di moduli e shield ha
cominciato a emergere una tendenza, dove i connettori modulari stanno sostituendo i pin
e le prese che prima si trovavano sia su shield che su moduli. Detti spesso sistemi,
questi implicano una serie di moduli e qualche forma di shield di interfaccia che utilizzino
tutti gli stessi tipi di connettori e gli stessi pinout per tensione, segnale e messa a terra.
I moduli TinkerKit (elencati nella Tabella 9-9) sono soltanto un esempio di un sistema di
connessione dei moduli. Un altro la linea di moduli Grove e le shield di interfaccia
associate di Seeed Studio. Altre shield sono dotate di connettori da tre e quattro pin da
utilizzare con cavi gi pronti con i relativi connettori su ciascuna estremit, come il kit
della patch shield passiva mostrato nella Figura 8-21.

Lavorare con jumper nudi


Immaginate di prevedere di collegare in modo permanente un unico modulo a una
scheda Arduino (magari per integrarla da qualche parta e lasciare che faccia il suo
lavoro per molto tempo) e di non voler dedicare il tempo necessario per costruirvi un
connettore. Va benissimo: non c niente di male nellutilizzare jumper, purch eseguiate
alcuni semplici passaggi per rendere le connessioni fisicamente pi affidabili.
I terminali socket (o pin) a crimpare che si utilizzano nei jumper sono gli stessi terminali
che si utilizzano nei connettori modulari. La differenza che un ponticello ha soltanto un
terminale, mentre un connettore ne ha due o pi. Pi terminali da crimpare ci sono in un
connettore, pi robusto sar. Questo dovuto allattrito meccanico aumentato da diversi
terminali che lavorano tutti insieme nello stesso connettore.
Un unico ponticello pu spostarsi e flettersi e non offrire la stessa presa meccanica che
si ottiene con diversi terminali in un solo connettore. Un modo per ottenere una
connessione pi affidabile applicare una goccia di gomma di silicone (nota anche con il
nome della marca RTV) per fissare i connettori dei jumper sui pin del modulo. Pu non
rivelarsi una soluzione elegante o robusta come un connettore modulare, ma, a meno
che il modulo non stia lavorando in un ambiente ad alte vibrazioni con un veicolo RC o
uno strumento in una fabbrica, resister bene.
Per non esagerate con il silicone, perch magari in qualche momento vorrete togliere e
sostituire il modulo. La lama affilata di un rasoio pu tagliare la gomma di silicone, che
morbida, e non danneggiare il jumper (se prestate attenzione, naturalmente).

I sistemi di connessione dei moduli


In generale, una shield con connettori (che siano dello stile aperto utilizzato da TinkerKit
o del tipo chiuso utilizzato dai componenti Grove e altri) pu essere utilizzata anche pu
essere utilizzata o con jumper singoli oppure con socket-header crimpati, proprio,
proprio come le shield e i moduli con pin nudi. I connettori gi pronti rendono pi facile
collegare un modulo e non doversi preoccupare di come sono collegati i pin, purch il
modulo sia progettato per collegarsi a una determinata shield con gli stessi tipi di
connettori. Questo lapproccio che hanno adottato i moduli TinkerKit e Grove (maggiori
informazioni sui moduli Grove possono essere trovate sul sito web di Seeed Studio
[http://www.seeedstudio.com]).
Altri sistemi, come i moduli TinyDuino di TinyCircuits, utilizzano piccoli connettori multipin
a montaggio superficiale. La Figura 9-68 mostra alcuni esempi di questi tipi di moduli.
Anche se tecnicamente non si tratta di moduli come quelli descritti in questo capitolo,
questo approccio mostra soltanto uno dei molti modi di risolvere il problema
dellinterconnessione. TinyCircuits produce anche moduli sensore con lo stesso tipo di
connettore e hanno cavi destensione disponibili. Queste cose sono molto piccole
(guardate il connettore USB su una scheda Nano e poi confrontatela con la Figura 9-68)
e la prima cosa che mi saltata in mente quando le ho viste stata modellino di
razzo. Trovate maggiori informazioni sul sito web di TinyCircuits (https://www.tiny-
circuits.com).

Figura 9-68 - Esempi di moduli proposti da TinyCircuits.

I connettori sono il problema quando si utilizzano moduli e shield fatti per un determinato
sistema di interconnessione. Non esiste un unico standard tra tutte le diverse marche e
non c nessuna garanzia che un modulo fornito da un rivenditore si inserisca in una
shield di interfaccia prodotta da qualcun altro. Un modo per risolvere questo creare
sia la shield di interfaccia che una selezione di moduli con cui lavorare, che
esattamente quello che hanno deciso di fare i ragazzi che stanno dietro ai prodotti
TinkerKit. Quando prendere in considerazione un determinato modulo, prestate
attenzione al metodo di connessione che utilizza. Dovete anche prepararvi ad acquistare
ulteriori cavi e forse alcuni moduli di prototipazione, per interfacciavi con componenti non
fatti per un particolare sistema di connessione. Oppure potete scegliere di costruire i
vostri cavi personalizzati, come vedremo nel prossimo paragrafo.

Costruire connettori personalizzati


I connettori non soltanto sono pi facili da utilizzare, ma sono anche pi robusti e
affidabili dei jumper. Ma non disporre di connettori non necessariamente un male. Una
shield di interfaccia come quella di SainSmart mostrata nella Figura 8-3 ha i pin I/O
organizzati in file ordinate, con una distanza di 0,1 pollici (2,54 mm). Un connettore,
come quelli mostrati nella Figura 9-69, con la stessa distanza e fori per crimpare i
terminali corrisponder con i pin e creer una connessione solida.

Figura 9-69 - Pin e socket per terminali crimpati.

Le shell dei connettori e i terminali da crimpare esistono in una vasta gamma di stili. Le
shell, o alloggiamenti, sono di disponibili con posizioni per uno o pi terminali.
Occasionalmente, potete incontrare un ponticello con alloggiamenti di plastica da una
sola posizione su ciascuna estremit, anzich lisolamento termoretraibile che si utilizza
anchesso. Io preferisco le shell di plastica, anche se i jumper sono leggermente pi
cari.
Per coloro che vogliono semplicemente collegare uno o due moduli e non vogliono
preoccuparsi del fatto che i jumper si allentino e si scolleghino, lapproccio socket
header unalternativa che vale la pena considerare. Lo svantaggio che si deve
investire in una crimpatrice e in un paio di buone spellafili. La Figura 9-70 mostra una
crimpatrice e la Figura 9-71 mostra come funziona.

Figura 9-70 - Tipica crimpatrice di terminali.

Figura 9-71 - Come si collega a un filo un terminale crimpato.

La Figura 9-72 mostra una presa da tre posizioni collegata a un modulo sensore di
temperatura e umidit (un KY-015 di KEYES).
Figura 9-72 - Utilizzare un header da tre posizioni per collegare un modulo sensore.

Questa organizzazione permette al sensore di essere montato dove necessario e


collegato a una shield di interfaccia. Per assicurarsi che non si stacchi facilmente dal
modulo, si pu aggiungere una piccola quantit di silicone trasparente tra lalloggiamento
del connettore e la PCB del modulo.

Scegliere un metodo di connessione


Il compromesso si riduce allopzione di utilizzare connettori modulari e cavi gi pronti,
che sono affidabili e robusti ma richiedono una serie di componenti adatti, oppure quella
di creare le proprie connessioni, utilizzando ponticelli utilizzando jumper con terminali
socket a crimpare oppure creandosi da soli il socket-header per un determinato modulo.
Quale opzione scegliere dipende da quanta fatica volete fare per collegare moduli a una
scheda Arduino o a una shield e quanto chiuso volete che sia un particolare schema di
connessione.
Potete aver notato che non ho parlato di un altro possibile metodo di connessione dei
moduli: la saldatura. Questa sempre unopzione, ma, a meno che un modulo non sia
destinato a diventare una parte permanente di qualcosa, dovrebbe essere considerata
come lultima spiaggia. Saldando un modulo direttamente ai cavi o su una PCB si crea
una connessione solida, ma non facile da disfare e probabilmente brutta da vedere.
Significa anche se si disporr di un modulo in meno da utilizzare in altri progetti.
Detto questo, potete aver notato che nella Figura 9-12 il rel e moduli sensore di
temperatura sono saldati direttamente in una shield di prototipazione per il termostato
fatto con Arduino. Il motivo qui che il modulo non verr messo fuori servizio in tempi
brevi e dovr lavorare in un ambiente alquanto difficile, allinterno di una stufa elettrica,
con fluttuazioni termiche e le vibrazioni del ventilatore. Per questo, ho scelto di renderlo
relativamente permanente. Anche se a un certo punto potrei pentirmene, per adesso va
bene cos. Se vi si presenta loccasione, dovrete essere voi stessi a decidere se il
caso di saldare.

Fonti
Le fonti elencati nella Tabella 9-11 sono soltanto un esempio di alcune delle societ che
vendono componenti e moduli compatibili con Arduino. Sono soltanto quelli che ho avuto
occasione di conoscere e che ho potuto provare. Esistono molti altri rivenditori di cui non
sono a conoscenza, ma potete scoprirli da soli navigando su Internet. E non
dimenticatevi di eBay.
Tabella 9-11 - Fonti di componenti.

Distributore/Venditore URL Distributore/Venditore


Adafruit www.adafruit.com Mouser Electronics www.mous
Amazon www.amazon.com RobotShop www.robot
CuteDigi store.cutedigi.com SainSmart www.sains
DealeXtreme (DX) www.dx.com DFRobot www.dfrob
Seeed Studio www.seeedstudio.com Elecfreaks www.elecfr
SparkFun www.sparkfun.com Elechouse www.elech
Tindie www.tindie.com Freetronics www.freetr
Tinkersphere tinkersphere.com iMall imall.itead.
Tronixlabs tronixlabs.com ITEAD Studio store.itead
Trossen Robotics www.trossenrobotics.com KEYES en.keyes-ro

Riepilogo
Questo capitolo ha fornito un assaggio di alcuni dei vari moduli e componenti disponibili
per implementare funzioni di input e di output con Arduino (o praticamente con qualsiasi
microcontroller moderno). Come ho dichiarato in precedenza, potete trovare molte delle
funzionalit descritte qui su una shield, ma possono esserci occasioni nella quali una
shield non la scelta pi adatta. Con un Arduino Nano e alcuni sensori, componenti di
input e alcuni tipi di output, potete organizzare le cose in modo che siano ideali per i
vostri particolari requisiti.
Con un browser web e laccesso a Internet, potete trovare facilmente centinaia di
diversi componenti I/O che possono essere collegati ad Arduino, o perfino soltanto un
semplice IC AVR. Le fonti vanno da grandi distributori di elettronica, come DigiKey,
Mouser e Newark/Element14, a societ come Adafruit, SparkFun, SainSmart e
CuteDigi. Esistono anche distributori specializzati in componenti nuovi a basso costo e
surplus.
Quando si tratta di acquistare dei sensori per un progetto di Arduino, ecco alcuni punti
da tenere a mente:
1. Il dispositivo utilizza uninterfaccia semplice (digitale discreta, SPI, I2C, ecc.)?
2. Il dispositivo accompagnato da dati tecnici (o immediatamente disponibile)?
3. Esistono librerie software di Arduino?
A seconda del vostro livello di abilit con la programmazione, il punto 3 pu
rappresentare o meno un grosso problema per voi. Personalmente, ho messo molto di
pi laccento sui punti 1 e 2, soprattutto perch ho cose migliori da fare che lingegneria
inversa di uninterfaccia complessa di qualche cosa con davvero un bellaspetto che ho
comprato in offerta su eBay. Per me, ha pi senso per comprare una cosa non-cos-
bella e ottenere le informazioni tecniche di cui ho bisogno per installarla e farla
funzionare. La cosa pi importante trovare qualcosa che far il lavoro e a un prezzo
non superi il nostro budget.
10

Creare componenti personalizzati

Pi lavorate con dispositivi Arduino in generale e con il microcontroller AVR in


particolare, pi vi accorgete di quanto siano flessibili e versatili. Sembra che esista un
sensore o una shield per quasi qualsiasi applicazione possiate immaginare e
regolarmente appaiono nuove shield. Ciononostante, ci sono ancora alcune applicazioni
per le quali non esiste una shield. Pu succedere di passare ore online cercando invano
una shield con determinate funzionalit, soltanto per accorgersi, alla fine, che
semplicemente non esiste. In una situazione simile, fondamentalmente avete tre opzioni:
la prima arrendervi e cercare di trovare un altro modo di risolvere il problema, la
seconda trovare qualcuno che ve la costruisca (a pagamento, di solito) e la terza
progettare e costruirvi da soli la PCB. Questo capitolo descrive due progetti che
illustrano i passaggi necessari per creare una shield personalizzata e un dispositivo
compatibile con il software di Arduino.
Il primo progetto una shield, mostrata nella Figura 10-1, pensata per applicazioni di un
determinato tipo. La GreenShield, come la chiamo io, si basa su un fattore di forma
convenzionale. Utilizza componenti a montaggio superficiale in un layout che include
potenziometri, rel e LED.

Figura 10-1 - La GreenShield.


Quando viene associata a un Arduino, la GreenShield pu funzionare come un monitor
indipendente e come un controller per applicazioni di giardinaggio o agricoltura. Questa
shield pu anche fungere da base per stazioni meteorologiche automatiche, per
prevedere temporali, oppure come termostato (notate che un termostato
programmabile costruito utilizzando moduli e sensori gi pronti descritto nel Capitolo
12).
La seconda met di questo capitolo descrive lo Switchinator, un dispositivo basato su
AVR ATmega328 che non si appoggia al firmware del bootloader di Arduino, ma pu
essere comunque programmato con lIDE di Arduino e con un dispositivo di
programmazione ICSP. La PCB Switchinator mostrata nella Figura 10-2.

Figura 10-2 - Lo Switchinator.

Lo Switchinator pu controllare in remoto fino a 14 dispositivi DC come rel o LED ad


alto consumo, gestire 3 motori passo-passo unipolari, oppure controllare carichi AC
utilizzando rel a stato solido esterni. Utilizza uninterfaccia RS-232 e non richiede una
connessione con un PC host via USB.
Lo Switchinator incorpora tutti i componenti essenziali di un Arduino in una scheda con
un design personalizzato. Non dovremo preoccuparci delle dimensioni dei socket header
e delle considerazioni sul layout che richiedono le PCB delle shield: gli unici limiti per la
dimensione generale e la forma saranno quelli imposti dal design.
Con un po di pazienza e di pianificazione, potete facilmente creare una PCB
personalizzata che non assomigli affatto a un Arduino, ma offra la stessa facilit di
programmazione. E il bello che far esattamente quello per cui lo avete progettato e
in una forma fisica che risponde esattamente alle vostre esigenze.
Creare una PCB non particolarmente difficile, ma si tratta di unoperazione che
richiede alcune conoscenze di design delle PCB e di elettronica. Esistono strumenti
software gratuiti o a basso costo che servono a gestire la creazione del layout della
PCB e in realt procurarsi una scheda a circuito pronta piuttosto facile. I progetti
mostrati in questo capitolo richiederanno anche che sappiate saldare, specialmente nel
caso dei componenti a montaggio superficiale. Se avete gi esperienza in questi campi,
siete preparati. In caso contrario, imparare come creare uno schema, a lavorare con le
PCB, a utilizzare una saldatrice e a selezionare i componenti giusti pu rivelarsi
unesperienza divertente e appagante.
Per la PCB della shield, utilizzeremo lo strumento per la cattura degli schemi e il layout
della PCB Eagle, mentre per la PCB compatibile con Arduino utilizzeremo lo strumento
Fritzing. Entrambi sono strumenti molto diffusi e potenti. Inoltre sono gratuiti (in realt,
Fritzing gratuito e la versione entry-level di Eagle, con alcuni limiti, disponibile a
prezzo zero).
NOTA Quando create shield personalizzate o schede compatibili con Arduino, potete farvi un favore enorme
mantenendo un quaderno di appunti. Anche se non si tratta di nientaltro che di una raccolta di pagine stampate o
fotocopiate in un raccoglitore ad anelli, sarete contenti di averlo quando in futuro avrete bisogno di cercare alcune
informazioni per un progetto simile. Perch non salvarle semplicemente tutte sul disco del vostro PC? Perch rischiare
di perderle se il disco si danneggia senza un backup, o nella folla di dati se ci sono gi moltissime cose salvate sul
disco (questo a me succede pi spesso di quanto non ammetta). Inoltre, raccoglierle in un quaderno di appunti vi
permette di ritornarci in seguito e di annotarvi cose man mano che diventate pi esperti testando, costruendo e
utilizzando il vostro dispositivo. Le penne rosse non servono soltanto ai professori.

Questo capitolo propone inoltre un elenco di fonti dove trovare software, componenti e
PCB. Lunica cosa che ho dato per scontata che abbiate gi qualche esperienza con
lelettronica o che almeno vogliate fare un piccolo sforzo extra per impararne i concetti
fondamentali. Vi consiglio di dare unocchiata alla breve panoramica degli strumenti
nellAppendice A e certamente di sfogliare le letture suggerite nellAppendice D. Infine,
non dimenticate di approfittare degli articoli che si trovano su siti web come Hackaday
(http://hackaday.com/), Makezine (http://makezine.com/), Adafruit
(http://www.adafruit.com/), SparkFun (http://www.sparkfun.com/) e Instructables
(http://www.instructables.com/). Potete trovare anche tutorial video su YouTube. Molti
altri hanno percorso gli stessi sentieri prima di voi e molti di loro sono stati cos gentili
da documentare le loro avventure a vantaggio di altri.

NOTA Ricordate che, dal momento che in questo libro laccento posto principalmente sullhardware di Arduino e sui
relativi moduli, sensori e componenti, il software mostrato qui ha lunica intenzione di sottolineare i punti chiave e non di
presentare esempi completi e pronti da utilizzare. I codici completi dei software relativi a esempi e progetti si trova su
GitHub (https://www.github.com/ardnut).

Per cominciare
Nel caso di qualsiasi impresa, vale la pena dedicare una significativa quantit di tempo
alla pianificazione. Questo vale per i progetti di elettronica esattamente come per lo
sviluppo e limplementazione di software complesso, per la costruzione di una casa, per
la progettazione di unautomobile per le gare di Formula 1, oppure per la preparazione
di una spedizione nellArtico. Come dice un vecchio adagio: Fallire una pianificazione
pianificare di fallire.
Tutti i progetti, eccetto quelli pi banali, possono essere suddivisi in una serie di
passaggi. In generale, per creare un dispositivo elettronico sono necessari sette
passaggi fondamentali:
1. Definire
2. Pianificare
3. Progettare
4. Prototipare
5. Testare
6. Produrre
7. Collaudare
Alcuni progetti possono presentare meno passaggi e altri di pi, a seconda di che cosa
si costruisce. Ecco qualche dettaglio in pi su ciascun passaggio:
Definire
Nei termini dellingegneria formale, si riferisce alla fase di definizione dei requisiti, o,
pi correttamente, alla fase di definizione dei requisiti funzionali. Nei casi pi semplici,
sufficiente una breve descrizione di che cosa far il risultato finale del progetto e di
come sar utilizzato. Nei casi pi complessi, come per esempio quello di una shield
da utilizzare con un Arduino su un CubeSat, probabilmente diventa necessaria una
descrizione pi dettagliata. Ma, a prescindere dalla complessit, scriverlo pu
aiutare a tenere traccia dei passaggi che seguono e pu anche rivelare alcuni errori
e omissioni che altrimenti potrebbero passare inosservati fino a che non diventa
troppo tardi per apportare facilmente modifiche sostanziali. Infine, una buona idea
scrivere la definizione del progetto in modo che possa essere utilizzata come un
prototipo oppure un dispositivo finito. Se i requisiti funzionali non dichiarano in modo
chiaro che cosa deve fare il dispositivo in modo che qualcuno possa utilizzare questa
descrizione per testarlo, significa che in realt non si tratta di una buona serie di
requisiti e che non definisce molto bene il dispositivo o il sistema desiderato.
Scrivere requisiti funzionali pu sembrare noiosissimo, ma in realt si tratta di un
aspetto essenziale dellingegneria. Se non sapete dove volete andare, come potete
sapere quando ci arrivate? Un buon requisito, di qualsiasi tipo, deve avere quattro
caratteristiche essenziali: (1) deve essere in accordo con se stesso e con il design
complessivo, (2) deve essere coerente in modo da avere senso, (3) deve essere
conciso e non eccessivamente prolisso e (4) deve essere verificabile. Un requisito
funzionale che dichiara che Il dispositivo deve poter scaldare 100 millilitri dacqua in
un contenitore da 250 ml portandola a 100 gradi C in 5 minuti si pu testare, ma
una dichiarazione come Il dispositivo deve poter scaldare lacqua non lo (Quanto
calda? In quanto tempo? Quanta acqua?).
Pianificare
A volte la pianificazione e la definizione possono avere luogo nel corso dello stesso
passaggio, se il dispositivo qualcosa di relativamente semplice e facile da capire.
In ogni caso, per, il passaggio relativo alla pianificazione riguarda le informazioni
necessarie per il passaggio relativo alla progettazione e comporta lottenere pi
informazioni essenziali possibile in un unico posto (cose come le schede tecniche dei
componenti, dove reperire le parti, lidentificazione del design necessario e degli
strumenti software e cos via). Lidea arrivare al passaggio relativo alla
progettazione con tutto il necessario per prendere le decisioni giuste su che cosa
disponibile, quando pu volerci per procurarselo e come lo si utilizzer.
Il passaggio della pianificazione anche il momento in cui si formulano alcune timide
ipotesi su quanto si impiegher per completare ciascuno dei passaggi successivi:
progettazione, prototipazione, test, produzione e collaudo. Dico timide ipotesi
perch dopo aver raccolto pi informazioni possibile si dovrebbe avere qualche idea
di che cosa servir, ma queste sono soltanto ipotesi perch nessuno ha la sfera di
cristallo per vedere il futuro. Possono sempre presentarsi degli imprevisti e a volte il
completamento di alcuni aspetti del progetto pu richiedere pi tempo di quello che
si era pensato. Cos vanno le cose nel mondo reale. Questo anche il motivo per il
quale chi si occupa di project management da una vita moltiplica i tempi che stima
per un fattore di due o tre. meglio esagerare e finire il lavoro prima che
sottovalutare la quantit di tempo necessario e consegnarlo tardi.
Uno strumento di pianificazione si rivela utile sia per prevedere la tempistica in modo
realistico, sia come modo per valutare i progressi. Il mio strumento preferito per
pianificare in modo rapido e semplice il grafico temporale, detto anche diagramma
di Gantt. Questi possono essere diagrammi complicati creati utilizzando un software
di gestione dei progetti, oppure grafici semplici come quello mostrato nella Figura
10-3.

Figura 10-3 - Un grafico temporale di esempio.

Nel caso di molti progetti piccoli, i grafici elaborati non sono necessari e la
complessit aggiuntiva non altro che lavoro in pi. Le cose importanti sono che: (1)
nella pianificazione si tenga conto di tutti i compiti necessari, (2) il piano sia realistico
sia dal punto di vista del tempo che delle risorse e (3) il piano abbia un obiettivo e un
termine precisi. Unaltra cosa da notare sul semplice grafico temporale che alcuni
compiti cominciano prima che il precedente sia stato completato e il grafico non
mostra le dipendenze che indicherebbero un percorso critico. Io ho scoperto che, nel
caso di piccoli progetti che coinvolgono soltanto una o due persone, questa
programmazione sovrapposta riflette in modo pi realistico come avvengono
realmente le cose.
Progettare
Nel caso di un progetto hardware, il passaggio relativo alla progettazione quello
nel quale cominciano a emergere i diagrammi dei circuiti e prende forma il design di
della forma fisica. Tenendo sotto mano la definizione del progetto e le informazioni
sulla pianificazione, dovrebbe risultare chiaro che cosa necessario fare. Anche se,
quando si parla di progettazione, quasi tutti pensano alla definizione dei circuiti,
questo passaggio include altre attivit significative come la selezione dei componenti
in base a forma e dimensione, la valutazione del consumo elettrico dei componenti e
delle considerazioni ambientali (umidit, vibrazioni e temperatura) e magari anche
potenziali problemi di RFI (radio frequency interference).
Quando si progetta un nuovo dispositivo, si devono sempre effettuare delle scelte. A
volte, il motivo per preferire un metodo a un altro si riduce al costo e alla disponibilit
di componenti o materiali. Unaltra considerazione la funzionalit prevista, come nel
caso in cui un controllo di input deve poter eseguire pi di una funzione. Altre volte, la
scelta pu basarsi su fattori estetici, in particolare se non vi nessuna differenza di
costo se si sceglie un modo piuttosto che un altro. Infine, in alcuni casi soltanto una
questione di utilizzare qualcosa che noto e familiare, piuttosto che lavorare con
qualcosa che non si conosce. Questa non sempre la migliore ragione per operare
una scelta, ma succede abbastanza spesso.
Indipendentemente dal tipo di progetto (hardware, software, struttura o qualsiasi
altra cosa), di solito la fase di progettazione iterativa. Non realistico aspettarsi
che la progettazione riuscir al primo tentativo, a meno che non si tratti di qualcosa
di profondamente banale (e anche in quel caso non si pu essere sicuri). In realt, la
progettazione e la prototipazione (che vedremo tra poco) lavorano insieme per
identificare i potenziali problemi, elaborare soluzioni praticabili e perfezionare il
design. Questo comune in ingegneria e, anche se a volte irritante, literazione
una parte essenziale del perfezionamento della progettazione.
Prototipare
Per cose semplici, come shield I/O di base senza circuiti attivi, costruire un prototipo
pu non essere strettamente necessario (o addirittura possibile). In altri casi, si pu
utilizzare un prototipo per verificare il design e assicurarsi che si comporti secondo la
definizione creata allinizio del progetto. Per esempio, pu non essere una buona
idea saltare subito al layout di una PCB nel caso di un dispositivo che combina un
processore AVR, un display LCD, una ricetrasmittente Bluetooth, un accelerometro
multiassiale e una bussola elettronica, tutti sulla stessa PCB. Tutto pu funzionare al
primo tentativo, ma, se ci fossero piccoli problemi imprevisti, possono non diventare
apparenti finch la PCB non gi stata creata e pagata. Costruire e testare prima
un prototipo pu far risparmiare molti problemi e denaro pi avanti.
I problemi che si identificano con un prototipo influenzano il design per contribuire a
migliorarlo. In un caso estremo, il prototipo pu addirittura dimostrare che il design
iniziale sbagliato e deve essere rifatto da capo. Anche se questo fastidioso, non
un disastro (in realt, pi comune di quanto possiate pensare). Costruire un
centinaio di schede a circuito soltanto per scoprire che c un difetto di progettazione
fondamentale: questo un disastro. I prototipi, i test e le revisioni del design
possono evitare che questo succeda.

Modifiche e ancora modifiche


Durante il suo sviluppo, il generatore di segnale mostrato nel Capitolo 11 passato per diverse revisioni
principali. Il piano originale mirava alla possibilit di disporre di un controllo remoto di tutte le funzioni del
generatore attraverso uninterfaccia seriale RS-232 e una funzione di output parallela con una specifica
configurazione digitale. Il problema che su Arduino non ci sono abbastanza pin I/O on per far succedere tutto
questo senza ricorrere allutilizzo di shield di espansione I/O ed RS-232. Per risolvere questi problemi si
sarebbero potute utilizzare altre opzioni, come utilizzare un encoder rotativo, ma ogni alternativa proponeva delle
sfide. Lo strumento aveva comunque bisogno di pulsanti per alcune funzioni e lLCD stava cominciando a
diventare davvero piccolo in termini di spazio di visualizzazione disponibile. Quindi, anzich incorporare altra
complessit sia nellhardware che nel software, ho deciso di puntare alla semplicit. Il design che ne ha risultato
non utilizza interrupt nel software (non ce n bisogno), lLCD non troppo affollato di valori di dati criptici e sono
necessari soltanto due componenti PCB principali: la scheda Arduino e il modulo DDS. Il dispositivo finale offre
sufficienti funzionalit come generatore di segnale, anche se non dotato di un pattern output arbitrario o di un
controllo remoto.

Testare
Lessenza dei test semplice: Fa correttamente quello che deve fare e lo fa in
modo sicuro e affidabile come dovrebbe?. La definizione del progetto creata in via
preliminare il criterio che si utilizza per determinare se il dispositivo presenta le
funzionalit desiderate e mostra la sicurezza e laffidabilit richieste. Questi sono i
testi funzionali di base. Possono diventare molto pi complicati, ma, a meno che non
prevediate di inviare il vostro progetto nello spazio (o in fondo alloceano) o che il
dispositivo non debba controllare qualcosa che costerebbe moltissimo denaro se non
funziona a dovere (o danneggiare qualcosaltro, come per esempio esseri umani),
per il prototipo dovrebbero essere sufficienti i test funzionali di base.
Una parola sulle differenze tra corretto, sicuro e affidabile: il semplice fatto che
qualcosa si comporti nel modo corretto non significa che sia sicuro (sicuro pu anche
significare funziona senza rischi inaccettabili) e qualcosa che si comporta in un
modo sicuro non necessariamente corretto e nemmeno affidabile. Se un
dispositivo non si accende, pu essere considerato sicuro e affidabile (possiamo
essere certi che non fa niente), ma definitivamente non corretto. Infine, dire che un
dispositivo corretto e affidabile non implica automaticamente che sia sicuro. Un
utensile come una sega circolare palmare pu tagliare la legna in modo corretto e
affidabile, ma in modo corretto e affidabile potrebbe anche tagliare una mano con la
stessa facilit. Un dispositivo elettrico con un corto circuito interno emetter fumo in
modo affidabile (e forse anche qualche fiamma) quando gli si fornisce alimentazione,
ma il funzionamento generale non sar n sicuro n corretto.
Produrre
Dopo che il prototipo stato testato e ha dimostrato di avere un comportamento
corretto in accordo con i requisiti funzionali, il design pu passare alla fase della
produzione. Questo passaggio comporta la produzione di una PCB sulla quale
successivamente si montano le parti. Pu anche riferirsi allintegrazione dei moduli
pronti e dei cavi e fili associati in un contenitore o in un sistema pi ampio. In termini
di possibili ritardi, la produzione pu essere problematica. Un fornitore pu aver
esaurito un componente fondamentale, oppure, se si affidato lassemblaggio a
qualcuno, questa azienda pu avere dei problemi o un sovraccarico di lavoro. Le
parti personalizzate possono arrivare tardi per numerosi motivi.
Fortunatamente, se avete intenzione di produrre soltanto alcune unit di qualcosa e
vi occupate di tutta la produzione voi stessi, potete evitare molti di questi problemi
potenziali. Comunque, concedersi molto tempo non fa mai male. Andare di corsa in
ferramenta per comprare una scatola di viti a testa tonda 6-32 da 3/8 pollici richiede
del tempo e se non ce le hanno ce ne vuole ancora di pi per cercarle in un altro
negozio. Ovviamente, se avete eseguito i passaggi di progettazione e pianificazione
tenendo presente che cosa sarebbe stato necessario per la produzione, dovreste
disporre di tutti i componenti, le PCB, le viti, i dadi, bulloni, le rondelle, i connettori, i
fili, le staffe e la colla che vi servono.
Collaudare
Questo ultimo passaggio noto anche come test finale, dal momento che lultima
cosa da fare prima che il dispositivo si possa considerare pronto per lutilizzo o per
la distribuzione. Alcuni test funzionali di base sono gi stati svolti durante la fase di
prototipazione, ma adesso il momento di testare il prodotto finale. Questo non
affatto uno sforzo duplicato. Montare una parte sbagliata sulla PCB, o addirittura
installare una parte al contrario, davvero facile. Inoltre, a volte i circuiti della PCB si
comportano in modo diverso da quelli costruiti sulla scheda di prototipazione senza
saldature e quindi testare accuratamente il dispositivo assemblato sempre una
buona idea.
Il test di solito si svolge in due passaggi. Il primo passaggio verifica che il dispositivo
o il sistema si comporti nello stesso modo del prototipo. Lidea applicare gli stessi
test utilizzati con il prototipo per verificare che non sia cambiato niente.
Nellingegneria software, questo viene detto test di regressione. Il passaggio
successivo comporta ulteriori test per verificare che quello che si costruito funzioni
correttamente nella sua configurazione finale con I/O reali. Questo il motivo per cui
questo passaggio viene detto prova di collaudo e il punto principale rispondere alla
domanda: Il dispositivo o il sottosistema accettabile per lapplicazione per la quale
pensato?.

Le shield personalizzate
Fondamentalmente, esistono tre tipi principali di fattori di forma da considerare quando
si progetta una shield per Arduino. Si tratta dei layout dei pin di base, esteso e Mega.
Quello originale o di base (lR2), che si trova sulla Duemilanove, sullUno R2 e su altre
schede pi vecchie, pu essere considerato lo standard per il layout delle shield, ma
questo non significa che una shield non possa essere progettata in modo che utilizzi il
layout esteso (lR3) che si trova sui modelli pi recenti delle schede Uno e Leonardo. Le
shield possono essere progettate anche in modo che utilizzino tutti i pin di un Arduino in
stile Mega e non c motivo per cui una shield debba avere la stessa forma di un
Arduino. Alcune shield, come quelle dotate di rel o di grandi dissipatori, hanno un
fattore di forma fisico adatto ai loro componenti, anzich allArduino al quale sono
collegate.
Un approccio innovativo che ignora i limiti di dimensione creare una grande PCB con
una serie di pin sistemati in modo che un Arduino possa essere collegato in posizione
invertita. Questo potrebbe suonare strano, ma date unocchiata alla Figura 10-4. Qui
vedete la scheda di una fresatrice CNC Roland SRM-20. Trovate maggiori informazioni
su di essa sul blog infosyncratic.nl di Nadya Peek (http://bit.ly/open-hardware-footbath).

Figura 10-4 - Un Arduino invertito su una PCB grande (immagine di Nadya Peek).

Se volete progettare una shield da mettere in commercio, vi conviene utilizzare il layout


di base come modello, dal momento che funzioner anche con le schede Uno o
Leonardo, oltre che con le PCB di tipo Mega. Il Capitolo 4 descrive ciascuno di questi
tipi di scheda e fornisce le dimensioni e le informazioni sul pinout.
Le schede Arduino con un fattore di forma piccolo come la Nano, la Mini e la Micro sono
uniche, per il fatto che hanno tutti i loro pin I/O sulla parte inferiore della PCB, anzich
come un grande IC. Aggiungere una shield a una di queste schede comporta lutilizzo di
un adattatore, come quello mostrato nella Figura 10-5, per collegare i segnali ai pin
socket e collegare la PCB di una shield PCB.

Figura 10-5 - La PCB delladattatore di un Arduino Nano.

Nella Figura 10-5 potete notare che i pin socket sono state aggiunte alla PCB. Questo
stato un esperimento, per vedere come si sarebbe potuto fare per interfacciare
fisicamente una scheda Nano con una shield normale. Con un po di creativit,
possibile collegare una shield alla scheda, eccetto che per il fatto che la Nano troppo
elevata sui pin socket. Una soluzione potrebbe essere utilizzare estensioni per i pin della
shield, che non sono altro che socket header di estensione con eliminata una parte della
lunghezza dei pin. Una soluzione pi drastica potrebbe essere dissaldare gli header
esistenti della Nano e sostituirli con un tipo pi corto. Io consiglio lopzione
dellestensione dei pin. Questo capitolo non analizza i passaggi necessari per creare
questo tipo di adattatore.
Utilizzare qualcosa come un Arduino Nano, Mini o Micro con una shield in realt non ha
molto senso la maggior parte delle volte (anche se nel Capitolo 12 c un esempio dove
lo si fatto per una particolare applicazione). Ha senso trattare queste piccole PCB
come se fossero grandi circuiti integrati e utilizzarli come componenti su una PCB
grande.
Considerazioni fisiche
Dovete ricordare che sulla PCB della Duemilanove e probabilmente anche di altre
schede ci sono due condensatori a montaggio superficiale che possono urtare i pin extra
che si trovano sulla riga dellalimentazione e del connettore analogico di alcune shield
progettate per il layout R3 esteso. Anche alcune varianti della Uno presentano
componenti che urtano i pin delle shield.
Unaltra considerazione che il tipo di jack B USB che si trova sulle schede Duemilanove
e Uno pu fare corto circuito con la PCB delle shield. Anche il jack dellalimentazione DC
di queste schede pu interferire con la PCB delle shield. Anche se di plastica e non
far corto circuito con niente, pu impedire alla shield di collocarsi completamente. La
Figura 10-6 mostra questa situazione con una scheda Duemilanove e una shield
Ethernet.

Figura 10-6 - Una scheda Duemilanove con una shield.

Per questi motivi, conviene regolare la lunghezza della shield in modo che non
interferisca con lArduino sottostante, oppure progettare la posizione dei componenti
sulla PCB della shield in modo da lasciare vuote le zone di collisione. Nel prossimo
paragrafo, nel Capitolo 4 e nel Capitolo 8 trovate maggiori informazioni sulle dimensioni
delle PCB e su come si montano le shield luna sullaltra.
Quando si progetta una shield, si deve anche pensare a quello che non sar pi
accessibile sulla scheda Arduino sotto di essa e a che cosa vi si pu montare o meno.
Questo include il pulsante di reset, i LED a montaggio superficiale e il gruppo di pin
ICSP. Alcune shield risolvono questo semplicemente replicando il pinout della scheda
Arduino. Altre, come la maggior parte delle shield LCD, possono non replicare i pin di
Arduino sulla parte superiore della PCB della shield, ma a volte mettono a disposizione
un pulsante di reset. Nel caso di una shield LCD questo ha senso, naturalmente, dal
momento che in ogni caso si tratterebbe della shield al di sopra di tutte le altre.

Montare le shield una sopra laltra


Uno dei vantaggi offerti dal fattore di forma di Arduino la possibilit di montare diverse
shield una sopra laltra. Potete creare una pila che contiene una scheda Arduino di base
(una Uno, per esempio) con sopra una shield con lettore di schede di memoria SD,
seguita da una shield input/output di qualche tipo e quindi una shield con display LCD o
TFT al di sopra di tutto. In questo modo ottenete facilmente un semplice dispositivo di
logging dei dati.
Quello che pu essere montato sopra una shield dovrebbe essere sempre pensato
bene, che si tratti di unaltra shield o magari di un modulo sensore di un qualche tipo.
Quando si selezionano i componenti per una shield, si deve prendere in considerazione
laltezza delle varie parti. Se le parti sono troppo alte e non si pu collegare fisicamente
unaltra shield senza che interferisca con qualcosa, significa che quella shield dovr
sempre essere quella al di sopra di tutte.
Esistono fondamentalmente due modi di montare diverse shield luna sopra laltra: prese
sfalsate e header di pin e pin socket estese. Sfalsate, in questo contesto, significa che i
connettori superiori (le prese) sono leggermente spostati rispetto ai pin inferiori (gli
header dei pin), con gli header I/O digitale e alimentazione/analogico entrambi spostati
sul lato della stessa distanza.
Nella Figura 10-7 potete vedere una shield I/O modulare su una Duemilanove. Qui ci
sono alcune cose da notare. La prima che la shield I/O modulare utilizza lapproccio
dei connettori sfalsati e quindi il bordo non allineato verticalmente con la scheda
Arduino sottostante. Questo deve essere tenuto presente se il tutto deve essere
montato in una custodia di un qualche tipo che pu essere soggetta a colpi o vibrazioni
(pu non essere possibile fissare la shield con dadi e bulloni). La seconda cosa da
notare che la shield non collega i pin ICSP e quindi la funzionalit viene effettivamente
persa (cosa che pu rappresentare un grosso problema o meno). Infine, i pin dei
connettori sul bordo della shield al di sopra dellalimentatore dellArduino e del
connettore USB possono (e lo fanno) toccarsi e quindi necessario aggiungere uno
strato isolante di qualche tipo.
Figura 10-7 - Un esempio di shield sfalsata.

I connettori extended pin socket sono una variante comune sui connettori 0.1 (pollici)
dotati di un pin lungo che attraversa la PCB. Il pin sufficientemente lungo da creare
una connessione solida con una scheda sottostante e le prese dei connettori
permettono di montare unaltra scheda shield sopra e di allinearsi con la shield
sottostante. Questi si trovano su molte shield e dovete cercarli quando scegliete una
shield.
Una considerazione importante che riguarda il design delle shield luso dei pin di
Arduino, oltre alla possibilit di montarle una sopra laltra. I pin utilizzati da una shield
determinano che cosaltro si pu utilizzare con quella shield in una pila. Evitare luso
esclusivo dei pin SPI e I2C significa poter utilizzare altre shield in una pila, comprese
memorie flash SD e microSD, shield despansione I/O, Bluetooth, ZigBee, Ethernet e
GSM. In altre parole, meglio non riutilizzare i pin SPI o I2C a meno che il design della
shield non ne abbia assolutamente bisogno.
A volte potete trovare shield che secondo qualcuno sono unottima idea, ma che nella
pratica non sempre funzionano bene. Spesso le shield I/O sono dotate di diversi blocchi
di pin di connettori che diventano inaccessibili se vi si posiziona sopra unaltra shield.
Altre shield hanno piazzole di saldatura che interferiscono con i pin ICSP della PCB di
Arduino. Problemi come questi non sono infrequenti. Purtroppo, non sempre possibile
sapere in anticipo se ci sono difficolt con una shield e a volte lunico modo per sapere
se una determinata shield pu presentare problemi con il montaggio fisico acquistarla
e provarla.

Considerazioni elettriche
Se le vostre shield personalizzate non contengono altro che componenti passivi (cio,
connettori, interruttori, resistenze), probabilmente i requisiti relativi alla loro
alimentazione non rappresenteranno un problema. Se invece sono dotate di LED o di
altri circuiti attivi, conviene calcolare in anticipo di quanta alimentazione avranno bisogno
e da dove la prenderanno. Anche un dispositivo semplice come un LED consuma un po
di corrente e utilizzandone vari si rischia di sovraccaricare il processore AVR e di fare
danni. Come regola generale, se una shield contiene uno o pi rel o connettori per
collegare cose che possono richiedere pi di qualche milliamp luna, conviene
aggiungere un circuito o un IC driver di un qualche tipo. possibile alimentare una shield
con un alimentatore separato, ma a volte passare i segnali tra la scheda Arduino e la
shield pu rivelarsi difficile.
Se una shield ha il suo proprio alimentatore DC, si deve pensare anche alla messa a
terra. SullArduino di base ci sono tre prese per la messa a terra: due sul lato con gli
input analogici e una sul lato degli I/O digitali. Se utilizzate soltanto una delle prese della
messa a terra di Arduino per il riferimento della messa a terra del segnale di una shield,
potete evitare problemi potenziali con rumore indotto e loop di massa. Anche se queste
situazioni sono molto rare, rappresentano comunque una possibilit, in particolare nel
caso di shield che possono incorporare amplificatori operazionali ad alto guadagno o
circuiti ad alta frequenza. Applicare buone pratiche di design pu aiutare a evitare
problemi strani e difficili da diagnosticare nel futuro.

La shield personalizzata GreenShield


In questo paragrafo creeremo una shield personalizzata per illustrare i passaggi
necessari per progettare e produrre una shield per Arduino. La shield servir a
controllare lumidit, la temperatura, lilluminazione dellambiente e lumidit del suolo.
pensata principalmente per essere utilizzata in una serra, anche se, con una custodia
adeguata, qualche pannello solare e una ricetrasmittente wireless di qualche tipo pu
essere messa in un campo per controllare le rape (o qualsiasi altra cosa). Dal momento
che in alcune parti del mondo (tra le quali gli Stati Uniti orientali) lacqua scarseggia,
tenere docchio lumidit del suolo oltre alla temperatura e allumidit pu aiutare a
ridurre al minimo i tempi e i volumi di irrigazione mantenendo comunque in buona salute
le coltivazioni. Lagricoltore pu rimanere seduto in salotto e leggere rapidamente come
vanno le cose nel suo campo per mezzo di uno smartphone, di un tablet o di un PC
desktop.
Io la chiamo GreenShield, per ovvie ragioni, e i passaggi relativi a definizione e
progettazione sono combinati in un unico passaggio. Dal punto di vista fisico, la
GreenShield molto semplice e la sfida principale per il design dellhardware sar
riuscire a far stare alcuni componenti grandi (due rel e un DHT22) nella piccola PCB
della shield.

Obiettivi
Lobiettivo di questo progetto creare una shield che possa essere utilizzata come
monitor remoto che rilevi la temperatura, lumidit, lumidit del suolo e il livello di
illuminazione dellambiente. Basata sui limiti predefiniti degli input dei sensori, controller
due rel.
I rel possono essere utilizzati per controllare una valvola dellacqua e magari un
ventilatore o forse qualche luce per compensare nei giorni nuvolosi. Ha anche sei LED:
due per i punti dumidit alta e bassa, due per i livelli di umidit del suolo alto e basso e
un LED per indicare lattivit di ciascun rel.
Il software supporter un protocollo comando-risposta e manterr una tabella interna
delle funzioni automatiche dei rel mappate sui limiti e gli input dei sensori. In alternativa,
un computer host pu ottenere i risultati dei sensori su richiesta e controllare
direttamente i rel.

La definizione e la pianificazione
La shield incorporer una combinazione di sensore di temperatura e umidit DHT22, un
sensore LDR (light-dependent resistor, vedere Capitolo 9) per rilevare il livello di
luminosit dellambiente e un sonda per lumidit del suolo basata sulla conduttivit. Due
rel forniranno il comando automatico o su richiesta dei dispositivi o dei circuiti esterni.
Gli input dei sensori:
Temperatura
Umidit relativa
Umidit del suolo (relativa)
Livello di luminosit dellambiente
Controllo e output di stato:
Due rel di controllo, funzione del software definibile, capacit 10 A
Quattro LED che indichino i limiti dellumidit del suolo e dellumidit
Due LED che indichino lo stato dei rel
Interfaccia elettrica:
Morsettiera da due posizioni per linput della sonda di umidit
Morsettiera da due posizioni per la connessione degli LDR
Morsettiera da tre posizioni per rel (NC, C e NO)
+5 V DC fornita dalla scheda Arduino collegata
Interfaccia di controllo:
Protocollo comando-risposta, gestito dallhost di controllo
Risultati dei sensori disponibili su richiesta
Sostituzione dei rel da parte dellhost di controllo
Tutti i componenti saranno collocati su una shield standard di tipo base, con dimensioni
come quelle descritte nel Capitolo 4. La maggior parte dei componenti saranno del tipo
a montaggio superficiale, a eccezione delle morsettiere, dei rel e del sensore di
temperatura e umidit DHT22.

Il design
La GreenShield pensata per essere utilizzata senza un display n controlli utente. In
altre parole, questo dispositivo insieme a un Arduino funzioner come controller e come
sensore remoto autonomo. Pu essere collegato a un altro sistema informatico (un
computer che sia lhost principale) per ricevere parametri operativi, restituire i dati dei
sensori e sostituire lazione dei rel.
Autonomo in questo caso significa che la GreenShield potr azionare i rel
automaticamente quando si verificano determinate condizioni, come certi livelli di
umidit, di umidit del suolo o di illuminazione. Il software accetter comandi inviatigli da
un computer master per impostare i vari livelli di soglia e sostituire lazione dei rel.
Generer una risposta su richiesta che contenga il livello corrente di temperatura, di
umidit e di illuminazione e gli stati dei rel. Tutte le interazioni tra lhost di controllo e la
GreenShield Arduino saranno transazioni comando-risposta.
Il software della GreenShield sar sviluppato interamente con lIDE di Arduino. Il
computer host utilizzato per compilare e caricare il codice completo funger anche da
interfaccia per testare il codice in esecuzione su Arduino. Idealmente, si potrebbe
pensare di creare un programma di interfaccia personalizzato utilizzando qualcosa come
per esempio Python, o, in un ambiente Windows, un emulatore di terminale come
TeraTerm (https://ttssh2.osdn.jp/index.html.en). Include un eccellente ambiente di
scripting e ve lo consiglio vivamente.

Lo strumento per schemi e PCB Eagle


Per questo progetto, utilizzo lo strumento per schemi e PCB Eagle. Se non ve lo siete gi procurato, potete
scaricarlo da http://www.cadsoftusa.com/download-eagle. La maggior parte delle distribuzioni principali di Linux
ne hanno una versione pi vecchia disponibile nei loro repository di pacchetti. Sul sito web di CadSoft, i limiti
della versione gratuita di Eagle sono indicati come:
Larea utilizzabile della scheda limitata a 100 80 mm (4 3,2 pollici).
Si possono utilizzare soltanto due livelli di segnali (Top e Bottom).
Leditor di schemi pu creare soltanto due fogli.
Le dimensioni di base di Arduino sono approssimativamente 69 mm 53 mm e quindi non ci sono problemi se
si vuole utilizzare Eagle per una shield del tipo di base o esteso. Non pu essere utilizzato per creare una shield
per un Arduino con PCB di tipo Mega, per via dei limiti imposti alle dimensioni. Il limite dei due livelli di solito non
rappresenta un problema per la maggior parte dei design di shield, ma, in alcuni casi, le shield che elaborano
segnali video o RF possono avere bisogno di ulteriori livelli per la messa a terra e lalimentazione.
I ragazzi di SparkFun offrono alcuni tutorial online chiari e concisi che aiutano a installare e utilizzare il software
Eagle. Potete trovarli su http://bit.ly/sparkfun-eagle e http://bit.ly/sparkfun-using-eagle.
Potete ottenere anche i componenti libreria Eagle PCB sul repository GitHub
(https://github.com/sparkfun/SparkFun-Eagle-Libraries) di SparkFun. Ho scoperto che le librerie di SparkFun non
funzionavano con la versione del pacchetto di Eagle utilizzata da Kubuntu 12.04 (lultima versione di Eagle
disponibile la 5.12), ma la versione pi recente di CadSoft (la versione 7.4.0) si installa e funziona bene. Io ho
scelto la via pi corta e ho installato la 7.4.0 con la 5.12 gi installata, ho copiato il vecchio eseguibile di Eagle
che si trova in /usr/bin in eagle.old e ho creato un link simbolico in /usr/bin che puntasse alla versione pi recente
in /opt/eagle-7.4.0/bin.

Le funzionalit
La prima considerazione il design fisico della PCB della shield. Il diagramma a blocchi
mostrato nella Figura 10-8 propone una panoramica di quali tipi di funzioni presenter la
shield.

Figura 10-8 - Il diagramma a blocchi della GreenShield.

Notate che nella Figura 10-8 nessuna delle funzioni hardware interagisce direttamente. I
sensori, i LED e i rel sono soltanto estensioni delle funzionalit I/O di base di Arduino.
Il sensore di umidit/ temperatura montato sulla PCB, mentre volendo la fotocellula
(un LDR, light-dependent resistor) e la sonda dellumidit del suolo possono essere
posizionati fuori dalla scheda. Per le connessioni del sensore si utilizzano morsettiere in
miniatura, in modo che non sia necessario saldare n crimpare i connettori.
La GreenShield pensata per essere lultima (quella pi in alto) shield di una pila.
Questo dovuto ai rel e al sensore di temperatura/umidit, che sono tutti abbastanza
alti da non permettere di montarvi sopra unaltra shield.

Lhardware
Dal punto di vista dei circuiti, la GreenShield non molto complicata, come si pu
vedere nello schema mostrato nella Figura 10-9. Per gestire i LED di stato e i due rel,
si utilizza un ULN2003A. Per salvare nel buffer il livello di tensione proveniente dal
sensore di umidit del suolo e dellLDR per linput da inviare allADC dellAVR, si utilizza
un amplificatore operazionale duale. I sensori collegati agli input dellamplificatore
operazionale sono in realt resistenze variabili e con i due potenziometri dei trimmer
formano un divisore di tensione. I trimmer possono essere regolati in modo da ottenere
una risposta ottimale dallamplificatore operazionale senza spingerlo troppo a un
estremo o allaltro dal punto di vista della tensione.

Figura 10-9 - Lo schema della GreenShield.

La GreenShield stata progettata per permettere di estendere la pila di shield di


Arduino evitando i pin I/O digitali e analogici importanti. La Tabella 10-1 elenca i pin di
Arduino e le assegnazioni utilizzate per la GreenShield.
Tabella 10-1 - Lutilizzo dei pin di Arduino della GreenShield.

Pin Funzione Pin Funzione


D2 ULN2003A canale 1 D7 ULN2003A canale 6
D3 ULN2003A canale 2 D8 Input di dati DHT22
D4 ULN2003A canale 3 A0 Input sensore umidit del suolo
D5 ULN2003A canale 4 A1 Input sensore LDR

Notate che i pin SPI (D10, D11, D12 e D13) non sono utilizzati e quindi rimangono
disponibili per le shield SPI. Sono disponibili anche D0 e D1, se volete collegare
uninterfaccia RS-232 e dimenticarvi dellUSB. A4 e A5 sono disponibili per applicazioni
I2C.
Adesso che abbiamo uno schema, possiamo assemblare lelenco completo delle parti,
mostrato nella Tabella 10-2.
Tabella 10-2 - Lelenco delle parti della GreenShield.

Quantit Tipo Descrizione


2 SRD-05VDC-SL-C Songle 5A rel
1 DHT22 Sensore di umidit/temperatura
1 Generico Sensore LDR
1 SainSmart Sonda dellumidit del suolo
6 3 mm LED
1 LM358N Amplificatore operazionale
1 ULN2003A IC driver
6 1 kohm, 1/8 W Resistenza
4 2,2 kohm, 1/8 W Resistenza
2 3,3 kohm, 1/8 W Resistenza
2 10K trim Potenziometro montato sulla PCB
2 0,1 (2,54 mm) Morsettiera da 3 posizioni
2 0,1 (2,54 mm) Morsettiera da 2 posizioni
2 0,1 (2,54 mm) Socket header a 8 posizioni
2 0,1 (2,54 mm) Socket header a 6 posizioni
1 Personalizzato PCB della shield
Il software
Il software della GreenShield si basa su tre funzioni principali: linput del sensore,
lanalisi dei comandi e la generazione delloutput e la mappatura delle funzioni dei rel.
La prima funzione responsabile di ottenere dati da ciascuno dei quattro input dei
sensori (temperatura, umidit, umidit del suolo e livello di illuminazione dellambiente) e
di salvarne i valori perch li possano utilizzare altre parti del software. Le funzioni di
analisi dei comandi interpretano le stringhe di comando che provengono da un PC host e
generano risposte utilizzando il protocollo comando-risposta descritto qui. Le funzioni di
output controllano i rel basandosi sugli input dei sensori e sui limiti predefiniti dai vari
comandi.
Il protocollo comando-risposta utilizzato per le transazioni tra il computer e la
GreenShield per Arduino mostrato nella Tabella 10-3. Notate che la GreenShield
risponde soltanto allhost e non inizier mai una transazione per sua iniziativa.
Tabella 10-3 - Il protocollo comando-risposta della GreenShield (tutti i comandi).

Comando Risposta Descrizione


AN:n:? AN:n:val Ottiene lingresso analogico n in raw DN
GT:HMX GT:HMX:val Ottiene il valore max dellumidit
GT:HMN GT:HMN:val Ottiene il valore min dellumidit
GT:LMX GT:LMX:val Ottiene il valore max della luminosit
GT:LMN GT:LMN:val Ottiene il valore min dellumidit
GT:MMX GT:MMX:val Ottiene il valore max dellumidit del suolo
GT:MMN GT:MMN:val Ottiene il valore min dellumidit del suolo
GT:TMX GT:TMX:val Ottiene il valore max della temperatura
GT:TMN GT:TMN:val Ottiene il valore min della temperatura
HM:? HM:val Restituisce lumidit corrente
RY:n:? RY:n:n Restituisce lo status del rel n
RY:n:1 OK Imposta il rel n su ON
RY:n:0 OK Imposta il rel n su OFF
RY:A:1 OK Imposta tutti i rel su ON
RY:A:0 OK Imposta tutti i rel su OFF
RY:n:HMX OK Imposta il rel n su ON se umidit >= max
RY:n:HMN OK Imposta il rel n su ON se umidit <= min

RY:n:LMX OK
Imposta il rel n su ON se livello di luminosit >=
max
RY:n:LMN OK Imposta il rel n su ON se livello di luminosit <=
min

RY:n:MMX OK
Imposta il rel n su ON se umidit del suolo >=
max
RY:n:MMN OK Imposta il rel n su ON se umidit del suolo <= min
RY:n:TMX OK Imposta il rel n su ON se temperatura >= max
RY:n:TMN OK Imposta il rel n su ON se temperatura <= min
ST:HMX:val OK Imposta il valore max dellumidit
ST:HMN:val OK Imposta il valore min dellumidit
ST:LMX:val OK Imposta il valore max della luminosit
ST:LMN:val OK Imposta il valore min della luminosit
ST:MMX:val OK Imposta il valore max dellumidit del suolo
ST:MMN:val OK Imposta il valore min dellumidit del suolo
ST:TMX:val OK Imposta il valore max della temperatura
ST:TMN:val OK Imposta il valore min della temperatura
TM:? TM:val Restituisce la temperatura corrente

Potete utilizzare lo strumento del terminale seriale integrato nellIDE di Arduino, oppure
potete uscire dallIDE e collegarvi direttamente a una porta USB che utilizzi lArduino con
la GreenShield. Questo approccio pu essere utilizzato per creare unapplicazione di
interfaccia utente per configurare la GreenShield e controllare il suo funzionamento. In
pratica, lidea configurare il software della GreenShield su un Arduino e quindi lasciarlo
attivo senza prestargli attenzione.
I comandi per le query di stato
Il software della GreenShield mette a disposizione quattro comandi per le query, che
sono elencati nella Tabella 10-4. Questi comandi permettono a un host di controllo di
ottenere lo stato corrente on/off di ciascuno dei due rel, lultimo valore letto
dallLDR o dallingresso analogico del sensore di umidit del suolo e gli ultimi valori di
temperatura e umidit relativa ricavati dal sensore DHT22.
Tabella 10-4 - I comandi per le query della GreenShield.

Comando Risposta Descrizione


RY:n:? RS:n:n Restituisce lo stato del rel n
AN:n:? AN:n:val Ottiene lingresso analogico n in raw DN
TM:? TM:val Restituisce lultima temperatura DHT22
HM:? HM:val Restituisce lultima umidit DHT22

I comandi per gestire i rel


I rel della GreenShield possono essere controllati per mezzo di comandi software.
Quattro comandi di controllo dei rel permettono a un singolo rel di essere
impostato su on o su off, oppure entrambi i rel possono essere impostati su on o su
off contemporaneamente. La Tabella 10-5 elenca i comandi per gestire i rel.
Tabella 10-5 - I comandi per i rel della GreenShield.

Comando Risposta Descrizione


RY:n:1 OK Imposta il rel n su ON
RY:n:0 OK Imposta il rel n su OFF
RY:A:1 OK Imposta tutti i rel su ON
RY:A:0 OK Imposta tutti i rel su OFF

NOTA Notate che quando un rel viene impostato utilizzando uno di questi comandi, la mappatura precedente dei
setpoint viene eliminata. Per utilizzare di nuovo un rel con un setpoint, deve essere inviato alla GreenShield uno dei
comandi per i setpoint.

I comandi per mappare le azioni dei rel


Lattivazione di ciascuno dei due rel pu essere mappata su un punto specifico,
minimo o massimo, delle condizioni di umidit, illuminazione, umidit del suolo o
temperatura dellambiente. La Tabella 10-6 elenca i comandi per i setpoint dei rel.
Quando si mappa unazione su un rel, il comando di mappatura pi recente
sovrascrive quelli precedenti.
Tabella 10-6 - I comandi per i setpoint dei rel della GreenShield.

Comando Risposta Descrizione


RY:n:HMX OK Imposta il rel n su ON se umidit >= max
RY:n:HMN OK Imposta il rel n su ON se umidit <= min

RY:n:LMX OK
Imposta il rel n su ON se livello dellilluminazione
>= max

RY:n:LMN OK
Imposta il rel n su ON se livello dellilluminazione
<= min

RY:n:MMX OK
Imposta il rel n su ON se umidit del suolo >=
max
RY:n:MMN OK Imposta il rel n su ON se umidit del suolo =< min
RY:n:TMX OK Imposta il rel n su ON se temperatura >= max
RY:n:TMN OK Imposta il rel n su ON se temperatura <= min

I comandi per i setpoint


I setpoint minimo e massimo si definiscono utilizzando i comandi ST, elencati nella
Tabella 10-7. Il valore del setpoint pu essere restituito al PC host di controllo
utilizzando i comandi GT. I valori dei setpoint possono essere modificati in qualsiasi
momento.
Tabella 10-7 - I comandi per impostare i valori min/max della GreenShield.

Comando Risposta Descrizione


ST:HMX:val OK Imposta il valore massimo dellumidit
ST:HMN:val OK Imposta il valore minimo dellumidit
ST:LMX:val OK Imposta il valore massimo dellilluminazione
ST:LMN:val OK Imposta il valore minimo dellilluminazione
ST:MMX:val OK Imposta il valore massimo dellumidit del suolo
ST:MMN:val OK Imposta il valore minimo dellumidit del suolo
ST:TMX:val OK Imposta il valore massimo della temperatura
ST:TMN:val OK Imposta il valore minimo della temperatura
GT:HMX GT:HMX:val Ottiene il valore massimo dellumidit
GT:HMN GT:HMN:val Ottiene il valore minimo dellumidit
GT:LMX GT:LMX:val Ottiene il valore massimo dellilluminazione
GT:LMN GT:LMN:val Ottiene il valore minimo dellilluminazione
GT:MMX GT:MMX:val Ottiene il valore massimo dellumidit del suolo
GT:MMN GT:MMN:val Ottiene il valore minimo dellumidit del suolo
GT:TMX GT:TMX:val Ottiene il valore massimo della temperatura
GT:TMN GT:TMN:val Ottiene il valore minimo della temperatura

La mappatura delle funzioni dei rel associa un rel allinput di un sensore e una serie di
condizioni di cambiamento di stato nella forma di limiti superiori e inferiori. Un rel pu
essere attivato se il valore di un sensore va al di sopra o al di sotto di un limite
impostato dal sistema di controllo dellhost. Lassociazione dei rel non esclusiva, che
significa che entrambi i rel possono essere assegnati allo stesso input di un sensore e
alle stesse condizioni. Non avrebbe senso farlo, ma sarebbe possibile.
Anche se la GreenShield attualmente configurata per due rel, non ci sono limiti al
numero di rel che potrebbe utilizzare. Come si pu vedere nella Tabella 10-1, i pin I2C
(A4 e A5) sono disponibili e quindi si potrebbe utilizzare una shield despansione I/O
digitale I2C per collegare ulteriori dispositivi ad Arduino.

Il prototipo
Per creare il prototipo per questo progetto, io utilizzo una cosa che viene detta Duinokit
e che mostrata nella Figura 10-10. Questo oggetto intelligente dotato di una serie di
sensori, LED, interruttori e altri accessori oltre che di un Arduino Nano, tutto montato su
una grande PCB con molti socket header. Ha anche una posizione per collegare una
shield convenzionale (o una pila di shield). come una versione moderna dei vecchi kit
per progetti di elettronica all-in-one che in passato erano molto diffusi.

Figura 10-10 - Il Duinokit.

Un approccio altrettanto valido sarebbe assemblare tutti i componenti necessari di un kit


di sensori e praticamente un Arduino qualsiasi, ma il Duinokit mantiene le cose pulite e
ordinate e fornisce una comoda piattaforma di sviluppo da utilizzare per creare il
software mentre si aspetta che siano pronte la PCB e alcune delle altre parti. Il Duinokit
disponibile su http://duinokit.com e su Amazon.com.
Il Duinokit ha un sensore di temperatura/umidit DHT11, che una versione pi lenta e a
risoluzione pi bassa del DHT22 che si utilizzer con la GreenShield. Dal punto di vista
del software, il DHT11 e il DHT22 sono simili ma non identici. Il DHT22 utilizza una word
di dati (stringa di bit) diversa da quella del DHT11 per adeguarsi alla maggiore
precisione del sensore DHT22.
LLDR e il sensore di umidit del suolo utilizzano un amplificatore operazionale duale
LM358, con una met assegnata a ciascun input. Io ho collocato lLM358 sulla
breadboard che non richiede saldature fornita sullunica grande PCB del Duinokit.
Questa forniva anche un posto dove montare le resistenze e i due potenziometri da 10K
del Duinokit che servono da controlli per il trim delloffser di input.

Il software del prototipo


Il software sar sviluppato nella forma di prototipo e nella forma finale. Il primo
passaggio creare un software da utilizzare sul prototipo Duinokit che legger gli input
dei sensori, verificher che i circuiti dellamplificatore operazionale LM358 si comportino
come previsto ed eseguir alcuni test per determinare i limiti iniziali dellintervallo degli
input. Il passaggio successivo lo sviluppo del software finale che supporter il
protocollo comando-risposta definito in Il software a pagina 377 e la mappatura delle
funzioni dei rel. Lhardware vero e proprio della shield sar utilizzato per sviluppare il
software finale.
Il software del prototipo deve poter leggere i dati provenienti dagli input analogici e dal
sensore DHT11 integrato sulla scheda. Questo quello che sar utilizzato per testare il
prototipo, quando si stabiliscono gli intervalli di input iniziali. Loutput appare nella finestra
del serial monitor fornita dallIDE di Arduino. Il software per testare il prototipo fornito
nellEsempio 10-1 contenuto nel file di un unico sketch di nome gs_proto.ino.

Esempio 10-1 - Il software del prototipo dei sensori della GreenShield.


NOTA Le funzioni mostrate nellEsempio 10-1 per varie conversioni di temperatura e valori di punto di rugiada in realt
non sono necessari per la Greenshield. Li ho inclusi in questi esempi per leventualit nella quale voleste utilizzarli.

La funzione setup() si limita a inizializzare e ad aprire lI/O seriale, a impostare alcune


modalit dei pin e a cancellare le variabili globali dei risultati correnti dei dati. Ogni volta
che vengono chiamate le funzioni readDHT() e readAnalog(), ottengono i valori pi
recenti del DHT11 e degli input analogici e li inseriscono in queste variabili.
Il ciclo principale legge gli input analogici e il DHT11, formatta i dati e scrive i valori
correnti sul serial monitor USB. Non comunica con un computer host di controllo e non
esegue la mappatura dei setpoint di nessun rel. Il suo scopo ottenere e mostrare
continuamente i dati dei sensori.
Il prototipo utilizza una libreria open source per il DHT11. La versione finale utilizzer una
libreria personalizzata per il DHT22, che nel prototipo non necessaria. La libreria
DHT11 di George Hadjikyriacou, SimKard e Rob Tillaart disponibile presso lArduino
Playground (http://bit.ly/apg-dht11). Le funzioni Fahrenheit(), Kelvin(), dewPoint() e
dewPointFast() provengono dalla stessa fonte.

Testare il prototipo
Utilizzando il Duinokit, possiamo testare le varie funzioni di input dei sensori della
GreenShield e regolarne il funzionamento. Se ci fosse un problema con i circuiti (che
sar facile da risolvere, dal momento che sono molto semplici), questo sarebbe il
momento di trovarlo e risolverlo. Cercare di risolvere un problema su una PCB dopo
averla prodotta e caricata di parti pu rivelarsi davvero frustrante e c sempre il rischio
che qualcosa venga danneggiato durante il procedimento.
Nel caso della GreenShield, dobbiamo verificare che i sensori funzionino correttamente,
che il software riesca a ottenere valori sensibili per cose come il sensore di umidit del
suolo e lLDR e che il sensore di umidit/temperatura si comporti come previsto. Per
farlo, utilizzeremo un po di sabbia asciutta, acqua, un termometro digitale affidabile, un
frigorifero, un forno e una giornata di sole.
La prima cosa da controllare il sensore di umidit/temperatura. Utilizzando un
termometro esterno (in questo caso io ho utilizzato un termometro digitale con il sensore
sul terminale lungo), ho cominciato a leggere lambiente. Il passaggio successivo stato
mettere il Duinokit e il termometro in un frigorifero. Un piccolo PC portatile forniva
lalimentazione e mostrava la temperatura e il cavo USB era abbastanza sottile da
permettere alla porta del frigorifero di chiudersi completamente. Infine, il Duinokit e il
termometro sono stati collocati in un forno acceso e impostato su circa 140 F (60 C).
Con tre datapoint possiamo generare una curva calibrazione approssimativa per
compensare le variazioni del sensore di temperatura.
Testare la risposta dellumidit leggermente pi difficile, ma ottenere i risultati vicini
alle estremit dellintervallo utilizzabile non troppo complicato. Un breve soggiorno
nella sezione freezer del frigorifero esporr il sensore a unambiente dallumidit molto
bassa. I freezer sono secchi perch lumidit nellaria si condensa sulle molle allinterno
dello scompartimento. Questo quello che provoca il fenomeno del freezer burn, a
proposito, che si verifica quando il cibo non sigillato correttamente prima di essere
congelato. anche il principio che sta dietro la liofilizzazione, anche se di solito questa
avviene a temperature molto pi basse (circa 112 F o 80 C) e in una condizione
parzialmente di vuoto. Nel caso del freezer di una cucina, possiamo aspettarci di
riscontrare unumidit di circa il 5% o forse qualcosa in meno.

SUGGERIMENTO Un altro metodo la cosiddetta prova del sale. Questa tecnica utilizza sale saturato con acqua
per stabilire unumidit relativa costante in un ambiente ermetico. Potete leggere un modo per eseguire una
calibrazione con il sale sulla wiki Ambient Weather (http://bit.ly/wiki-aw). Se scegliete di eseguire questa prova, dovete
fare attenzione a non far cadere sale o acqua sui componenti dei circuiti. Questo potrebbe non risultare molto pratico
con un oggetto grande come il Duinokit, ma pu essere utilizzato con la Greenshield finale.

Una volta che abbiamo il risultato dellumidit bassa, il passaggio successivo bollire un
po dacqua sul fornello e utilizzare un piccolo ventilatore per dirigere il vapore sul
sensore. Il flusso di aria che ne risulta non sar completamente saturato, ma rientrer in
un intervallo di umidit compreso tra l80 e il 90%. Questi test verificano che il sensore
funziona, ma in realt non possiamo utilizzare i dati per nientaltro perch non abbiamo
riferimenti con i quali confrontarli. Se per caso avete a disposizione un sensore di
umidit preciso, vi conviene assolutamente utilizzarlo e creare una curva di calibrazione
come quella che stata creata per la temperatura.
Testare il sensore di umidit del suolo implica utilizzare un po di sabbia pulita e asciutta,
una bilancia e un po dacqua. Prima di tutto, prendete un bicchiere di vetro grande o una
ciotola di ceramica. Entrambi andranno bene: sceglietene uno con una capacit di circa
un litro. Non utilizzate una ciotola di metallo per questo test, perch la sonda di umidit
del suolo utilizza un flusso di corrente e una ciotola di metallo potrebbe creare un
risultato falso. Innanzitutto, pesate il contenitore e annotate questo valore, che vi servir
pi avanti. Quindi, misurate circa 225 grammi di sabbia nel contenitore. Rimettetelo sulla
bilancia e pesate di nuovo. Il peso della sabbia quello che mostra la bilancia meno il
peso del contenitore. Potete lasciare il contenitore sulla bilancia per il resto del test, se
volete.
Adesso inserite la sonde di umidit del suolo nella sabbia asciutta e annotate il risultato
mostrato sulloutput del serial monitor nellIDE di Arduino. Togliete il sensore e
aggiungere acqua finch il peso di circa un quarto superiore rispetto al peso originale
della sabbia pi il peso del contenitore. Lasciatelo l per un po per permettere allacqua
di filtrare nella sabbia. La sabbia deve notarsi umida al tocco, ma non deve risultare
bagnata o fangosa.
Reinserite il sensore e osservate loutput. Adesso la sabbia saturata per circa il 50%
e con questi due risultati, asciutto e umido, possiamo interpolare un punto intermedio,
che chiameremo il punto 25%.
Infine, c la fotocellula dellLDR. La risposta delle fotocellula, in realt, non molto
importante, ma conviene stabilire un punto per la luce bassa. Una giornata nuvolosa pu
rappresentare una buona occasione per usare la GreenShield per accendere qualche
luce ausiliaria, oppure la si pu utilizzare semplicemente per determinare la differenza
tra giorno e notte. Tutto quello che necessario per testare la fotocellula una stanza
interna a casa vostra (magari con le tende parzialmente chiuse e le luci spente), mentre
fuori fa una bella giornata di sole. La luce solare diretta rappresenta il livello di
illuminazione alla quale probabilmente sar esposta la fotocellula, mentre la stanza
interna a casa vostra grossomodo lequivalente del livello dellilluminazione di una
giornata grigia e nuvolosa. Dobbiamo registrare i dati del sensore di
temperatura/umidit, dellLDR e della sonda di umidit del suolo. Questi saranno i nostri
valori iniziali quando configureremo la GreenShield per la prima volta e, dal momento
che adesso sappiamo che cosa aspettarci, non dovremo tirare a indovinare i valori dei
setpoint minimo e massimo adeguati dai quali partire.

Il software finale
Il software del prototipo gestisce soltanto gli input dei sensori. La versione finale gestir
anche linterfaccia di controllo dellhost e la mappatura delle funzioni dei setpoint dei
rel. Questo implica lanalisi dei comandi di input, oltre al salvataggio dei dati e al
lookup.
Non ci sono visualizzazione delloutput, a parte i quattro LED di stato per gli intervalli di
umidit e temperatura, n input di controllo manuali. Una semplice interfaccia USB
seriale si utilizza per le transazioni comando-risposta tra la GreenShield Arduino e un
computer di controllo. Il volume del software fa s che si debbano interpretare i comandi
emessi dal PC host di controllo e poi che si applichi la mappatura dei setpoint ai rel.

Lorganizzazione del codice sorgente


La versione finale del codice sorgente della GreenShield contenuta in diversi file
sorgente o moduli. Quando lIDE di Arduino apre il file principale, GreenShield.ino, apre
anche gli altri file associati che si trovano nella stessa directory. I file secondari sono
inseriti in schede dellIDE, come mostra la Figura 10-11.

Figura 10-11 - LIDE di Arduino con i file della GreenShield caricati.

La Tabella 10-8 elenca i file della serie GreenShield. Due file sono condivisi da tutti i
moduli sorgente. Si tratta di gs.h e gs_gv.h. Le variabili globali definite in gs_gv.cpp,
che altrimenti si troverebbero allinizio di uno sketch convenzionale, sono compilati
separatamente e condivisi come necessario tra gli altri moduli.
Tabella 10-8 - I moduli del codice sorgente della GreenShield.

Modulo Funzione
GreenShield.ino Modulo principale che contiene setup() e loop()
gs_gv.cpp Variabili globali
gs_gv.h File include
gs.h Definizioni delle costanti (dichiarazioni #define)
gs_mapping.cpp Mappatura delle funzioni
gs_mapping.h File include
gs_parse.cpp Analisi dei comandi
gs_parse.h File include
gs_send.cpp Funzioni di invio dei dati (allhost)
gs_send.h File include

Organizzare un progetto in questo modo, rende pi facile concentrarsi soltanto su una


sezione alla volta senza dover cercare in tutte le righe del codice sorgente. Una volta
che la sezione principale fatta, si possono apportare modifiche negli altri moduli senza
interferire con il codice finito. Questo approccio aiuta anche a pensare al software da un
punto di vista modulare e questo a sua volta diventa pi facile da capire e pi facile da
mantenere.

La descrizione del software


La Figura 10-12 mostra il diagramma di flusso del ciclo principale del software. La
funzione loop() comincia con il blocco Start e continua finch Arduino non viene
spento. Notate che ci sono tre sezioni funzionali principali: input dei comandi ed
elaborazione delle risposte, acquisizione dei dati e test dei setpoint minimo/massimo.
Notate inoltre che il blocco etichettato come Setpoint Test unistanza di quattro
blocchi, uno per ciascuna coppia di setpoin min/max. Per mantenere le dimensioni del
diagramma entro i limiti del ragionevole, viene mostrata soltanto una sezione di test.
Figura 10-12 - Il diagramma di flusso della GreenShield.

Il file sorgente GreenShield.ino, mostrato nellEsempio 10-2, contiene le funzioni


setup() e loop(). Il software della GreenShield completo si trova su GitHub
(https://github.com/ardnut).

Esempio 10-2 - Il file sorgente principale della GreenShield.


LIDE di Arduino si basa sulle dichiarazioni #include per determinare quali moduli del
codice impostare. Anche se al livello pi alto non viene utilizzato direttamente dal modulo
un file sorgente, pu comunque essere incluso.
Il file delle definizioni globali gs.h, mostrato nellEsempio 10-3, definisce una serie di
costanti utilizzate dai moduli sorgente della GreenShield. Le dichiarazioni #define
producono un oggetto compilato pi piccolo, come si mostra in Le costanti a pagina
114.

Esempio 10-3 - Le definizioni globali della GreenShield.


NellEsempio 10-3, la definizione di MAXRY 2. Questo pu essere un valore pi grande
se presente lhardware per supportare ulteriori rel e gli output non devono essere
rel. Il file include gs_mapping.h, mostrato nellEsempio 10-4, dichiara le funzioni per
leggere il DHT22 e gli input analogici, per impostare lo stato on/off state di ciascun rel
(o di tutti i rel), per controllare i LED di stato e per eseguire una scansione delle
condizioni di risposta che controlleranno i rel nella funzione ScanMap().

Esempio 10-4 - Le funzioni di mappatura della GreenShield.


La funzione ScanMap() in gs_mapping.cpp, mostrata nellEsempio 10-5, viene eseguita
in ciascun ciclo della funzione loop() nel file sorgente principale GreenShield.ino. Valuta
gli input analogici confrontandoli con una serie di limiti configurabili e attiva oppure
disattiva i rel basandosi su queste condizioni.

Esempio 10-5 - Lo scanner della mappa di funzioni della GreenShield.


Il modulo sorgente gs_parse.cpp contiene una funzione principale, ParseCmd() e un paio
di funzioni di supporto (CntInt() e SendErr()). LEsempio 10-6 mostra i contenuti di
gs_parse.h.

Esempio 10-6 - Il file include con il modulo per il parsing della GreenShield.

Per adesso, la funzione ParseCmd() una delle funzioni pi lunghe del codice della
GreenShield. Utilizza un parser condizionale, veloce e discendente del tipo ad albero per
determinare il tipo di comando in arrivo e quindi estrae il codice della sottofunzione e
tutti i parametri. Questa funzione esegue anche qualsiasi comando immediato come
attivare o disattivare rel, restituire informazioni sullo stato dei rel e acquisire e
restituire dati analogici allhost di controllo o a un utente. Lesecuzione dei comandi
immediati avviene presso gli endpoint della struttura ad albero discendente.

La produzione
Fornire una descrizione passo a passo di come si creano schemi e schede a circuito
stampato va oltre lambito di questo libro. Questa una descrizione di alto livello dei
passaggi necessari per passare dallo schema al layout della PCB alla PCB finita. Per i
dettagli di basso livello, vi consiglio di leggere alcuni dei testi elencati nellAppendice D.
Cercando su Google CadSoft Eagle, troverete numerosi tutorial. Vi consiglio quelli di
SparkFun, Adafruit e, naturalmente, CadSoft (http://www.cadsoftusa.com/).
La versione di Eagle dello schema della Greenshield mostrata nella Figura 10-13.
Notate il blocco etichettato ARDUINO_R3_SHIELD. Questo viene dalla libreria delle
parti di SparkFun per Eagle ed pensato specificamente per creare shield. molto pi
comodo che calcolare il posizionamento degli header dei pin manualmente pi tardi o
durante la fase del layout della PCB.

Figura 10-13 - Lo schema della GreenShield (versione di Eagle).

Leditor di schemi di Eagle, come tutti gli strumenti simili, richiede un po di tempo per
poter essere utilizzato. Non sempre ovvio e intuitivo. Normalmente, per creare disegni
(compresi schemi) con una qualit sufficiente per la pubblicazione io utilizzo uno
strumento diverso, ma per creare una PCB utile disporre di un editor di schemi e di
uno strumento per il layout delle PCB che possa condividere dati. Per vedere la
differenza, potete confrontare la Figura 10-13 con la Figura 10-9. Lo strumento Eagle e
lo strumento di design Fritzing, utilizzato nel progetto Switchinator, sono in grado di
mantenere sincronizzati schemi e layout, mentre uno strumento grafico per disegni e
illustrazioni non ha questa capacit.
Quando create uno schema, dovete assicurarvi di aver selezionato la parte corretta. Per
esempio, il simbolo delle resistenze lo stesso, a prescindere dal fatto che si tratti di un
componente 0805 SMD (a montaggio superficiale) o di un componente through-hole da
1/4 di watt. A volte, trovare la parte giusta nella libreria delleditor di schemi pu risultare
difficile. Con Eagle, potete utilizzare caratteri wildcard per effettuare ricerche nella
libreria. Quando cercavo la parte ULN2003AD per la GreenShield, ho digitato *2003* e
ho trovato quello che stavo cercando nella categoria uln-udn. A volte necessario
andare online e cercare una parte che qualcuno pu aver gi creato. SparkFun, Adafruit
e altri hanno creato vaste librerie di parti che si possono scaricare gratuitamente.
Una volta che lo schema completo, si pu generare la PCB. Inizialmente, il layout della
PCB non altro che un mucchio di parti e di sottili linee di connessione (fili volanti,
come vengono detti a volte) che formano un nido di topo di fili. Il nido di topo mostra le
connessioni da punto a punto come definito nellelenco creato a partire dallo schema.
Il primo passaggio spostare tutte le parti nellarea della PCB e quindi organizzarle. Gli
obiettivi principali quando si sistemano le parti sono collocare i connettori nelle posizioni
desiderate, raggruppare le parti in base alla funzione e ridurre al minimo il numero di
occorrenze di linee del nido di topo che si incrociano, se necessario ruotando le parti.
Una volta che questo passaggio iniziale completo, molto pi facile cominciare a
creare le tracce che collegheranno le parti.
Potete scegliere di dirigere ciascuna traccia a mano, utilizzando i fili del nido di topo
come guida, oppure, se vi sentite fortunati, potete lasciare che se ne occupi un
autorouter. Eagle non dotato di un autorouter, ma io generalmente non lo utilizzo.
Lautorouting di solito un processo iterativo per cercare di ottenere un buon layout,
spostando e ruotando le parti e poi provandoci di nuovo. Dopo un po, nel caso di alcuni
design, diventa evidente che si fa prima a farlo manualmente.
In Eagle, non dovete posizionare manualmente una via (una via trasferisce una traccia
da un lato della PCB allaltra per mezzo di un foro placcato, da qui il nome). Se dovete
passare dalla parte superiore della PCB a quella inferiore (o viceversa), non dovete fare
altro che cambiare da un alto allaltro con il livello di selezione abbassato che si trova sul
lato sinistro della barra di strumenti per disegnare le tracce. Eagle aggiunge
automaticamente una via nella posizione e inverte il routing delle tracce sul lato
selezionato della PCB.
Il layout della PCB mostrato nella Figura 10-14. Il lato superiore (componente)
rossiccio e quello inferiore (saldatura) blu. Se per caso disponete della versione
stampata di questo libro, potete vedere che le tracce superiori sono grigie chiare e che
quelle inferiori sono grigie scure. I contorni dei componenti sono grigio chiaro.
Figura 10-14 - Il layout della PCB della GreenShield.

I file generati dallo strumento Eagle CAM (Computer Aided Manufacturing), detti file
Gerber, vengono utilizzati da chi produce PCB per creare le PCB vere e proprie. Per
caricare e visualizzare i file Gerber nella fase dellultimo controllo, io ho utilizzato lo
strumento Gerbv, che fa parte del pacchetto gEDA. Nella Figura 10-15 mostrata una
cattura della schermata di Gerbv.
Figura 10-15 - Il visore di file Gerber di Gerbv.

NOTA Per poter approfittare del servizio a basso costo per prototipare PCB, i contorni della scheda della GreenShield
sono stati squadrati per renderla un rettangolo. Pu sembrare un po strano, pero non ha conseguenze sul suo
funzionamento. Nelle foto non lo vedrete, ma originariamente il layout stato fatto utilizzando i contorni della shield di
Arduino. Convertire gli angoli in angoli retti ha richiesto circa 5 minuti ed stato fatto subito prima che il layout fosse
inviato per la sua produzione. Se fosse stato davvero importante, avrei potuto pagare un prezzo molto pi alto per gli
angoli arrotondati e il lavoro di ritaglio, oppure potrei aver utilizzato il mio router e aver fatto da solo. Ho scelto di lasciarla
semplicemente in forma rettangolare.

Ricevere la PCB finita richiede circa da 7 a 10 giorni. La Figura 10-16 mostra la PCB
come arrivata dal produttore.
Figura 10-16 - La PCB della GreenShield finita.

Dopo che le parti vengono saldate sulla PCB, conviene sempre dedicare qualche minuto
a esaminarne entrambi i lati per ispezionare le saldature e i cortocircuiti (detti ponti) tra
le piazzole e le tracce. Per farlo, io ho utilizzato una lente di ingrandimento standard da
gioielliere. La Figura 10-17 mostra come si presenta una GreenShield completamente
assemblata. Potete notare che per le connessioni con un Arduino sottostante o con
unaltra shield ho utilizzato header impilati. Anche se inserire unaltra shield sulla
GreenShield pu risultare scomodo (e io lo sconsiglio), volevo disporre di alcuni punti di
test e I/O rapidamente accessibili.
Figura 10-17 - La PCB della GreenShield riempita di componenti e pronta per luso.

Il collaudo finale
Le parti a montaggio superficiale presentano la loro serie unica di problemi potenziali.
Prima di fornire lalimentazione alla GreenShield, dobbiamo eseguire alcuni veloci
controlli per assicurarci che tutto sia collegato correttamente e che non ci siano
cortocircuiti sulla PCB:
Ispezione visiva
Esaminiamo attentamente i componenti delle PCB cercando ponti di saldature
(saldature che collegano due piazzole o tra una piazzola e una traccia). Esaminiamo
le resistenze per vedere se qualcuna ha unestremit che pu essere sollevata sulla
piazzola e non collegata. Questo pu accadere quando si utilizzano saldature
regolari e filo per saldare (io ho utilizzato pasta per saldare e uno strumento a
rifusione SMD ad aria calda). Guardiamo le piazzole degli IC (U1 e IC1) per
assicurarci che non ci siano ponti di saldatura tra loro.
Posizionamento dei componenti
Ci sono nove parti che possono essere montate accidentalmente al contrario.
Queste sono due IC, i LED e il modulo sensore DHT22. LIC dellamplificatore
operazionale pu avere un segno o un puntino che indica il pin 1, ma alcuni package
presentano un bordo smussato. Oltre a diverse lunghezze dei terminali, di solito i
LED hanno una piccola area piatta accanto alla connessione del catodo ().
Cortocircuiti
Utilizzando un DMM, preferibilmente con una funzione di test di continuit (la modalit
beeper), controlliamo ciascuna coppia di pin sullamplificatore operazionale LM358
(IC1) per evitare cortocircuiti. Nessuno dei pin deve fare cortocircuito con un altro
pin. Adesso controlliamo che la VCC sul pin 8 di IC1 sia legato ai 5 V sullheader di
pin. Inoltre, controlliamo che il pin 4 sia legato a uno dei pin della messa a terra
sullheader di pin.
Ripetiamo questa procedura per il driver ULN2003A (U1). Nessuno dei pin di input o
di output deve fare cortocircuito, il pin 8 deve essere legato alla messa a terra e il
pin 9 deve essere collegato allalimentazione da 5 V.
Sicurezza elettrica
Prima di collegare la GreenShield a una scheda Arduino, utilizziamo un DMM per
misurare la resistenza tra i pin +5 V e messa a terra sullheader di pin. Dovremmo
vedere un valore di non meno di 30 kohm, probabilmente pi alto. Se otteniamo un
risultato pari a di zero, significa che c un cortocircuito da qualche parte, che deve
essere trovato ed eliminato prima di cercare di fornire alimentazione alla
GreenShield.
Se la GreenShield appare accettabile dal punto di vista elettrico, possiamo montarla su
un Arduino e fornirle alimentazione. Allinizio, non deve essere attivo nessuno dei LED
della GreenShield (a meno che non ci sia qualche software gi caricato sullAVR di
Arduino che stia controllando i pin I/O digitali). I test funzionali includono quattro
passaggi fondamentali:
Test funzionale iniziale
La prima parte dei test funzionali richiede che si esegua nuovamente lo stesso test
che si era svolto con il prototipo per testare gli input analogici e il DHT22.
Carichiamo la versione del prototipo del software su Arduino e apriamo la finestra
del serial monitor dellIDE. Se tutto funziona correttamente, dovreste vedere una
visualizzazione che si ripete con la temperatura, lumidit e gli input analogici.
Test degli input analogici
Colleghiamo una resistenza da 470 ohm agli input dellLDR. Mentre osserviamo
loutput continuo, regoliamo R12 finch il valore non raggiunge lo zero. Questo
dimostra che questa parte del circuito sta funzionando correttamente. Adesso
ripetiamo il tutto con R8 per il sensore di umidit del suolo.
Test del DHT22
I risultati di output provenienti dal DHT22 devono essere quelli che vi aspettate in
base alla temperatura e allumidit locali. Possiamo utilizzare una fonte di aria calda
(un asciugacapelli, per esempio) per applicare aria tiepida (non calda!) sul DHT22 e
osservare la sua risposta.
Test funzionale del software
Adesso carichiamo la versione completa del software della GreenShield. Per questi
test possiamo utilizzare la finestra del serial monitor dellIDE di Arduino. Questa non
una serie di test completa, dal momento che ne abbiamo gi eseguiti alcuni prima
con il prototipo.
Con tutto il software della GreenShield caricato, dobbiamo vedere la parola OK
quando parte. La GreenShield non fornisce un prompt. Digitiamo il comando RY:0:?
e la risposta deve essere RY:0:0. Adesso digitiamo il comando RY:0:1. Il rel deve
fare un clic e il LED associato deve illuminarsi. Utilizzando il comando RY: 0:?
adesso otteniamo RY:0:1.
Dovremmo provare anche il resto dei comandi. Possiamo testare i limiti analogici
facendo cortocircuito oppure aprendo gli input analogici. Il DHT22 indipendente e
quindi non dobbiamo farci molto, ma possiamo impostarne i limiti molto vicini e
utilizzare una fonte di aria calda e un po di vapore di una pentola di acqua bollente
per verificare che i limiti di temperatura e umidit funzionaino come sperato.

Ammissione sui test


Quando ho assemblato la prima scheda GreenShield, non riuscivo a trovare un contenitore per il nuovo rel
Songle da 5 V che avevo acquistato. Ho cercato ovunque. Quindi ho preso un paio di rel blu da una scatola e li
ho saldati sulla PCB. Erano della forma giusta, del colore giusto e della marca giusta. Ma la tensione della
bobina non era quella giusta: 12 V DC invece di 5 V DC. Non capivo perch i rel non rispondevano ai comandi
del software, finch non ho guardato cosa cera scritto sui due rel e ho scoperto che cosa avevo fatto. Nel
frattempo, avevo trovato i rel da 5 V (erano giusto dove li avevo lasciati, ovviamente). Poco dopo, ho tolto i rel
da 12 V, ho installato le parti corrette da 5 V e i comandi di controllo dei rel e la mappatura delle funzioni hanno
funzionano come previsto.
Morale della favola: esaminare sempre le parti che si stanno installando, prima di saldarle sulla PCB.

Il funzionamento
Dal punto di vista fisico, la GreenShield semplice, ma dal punto di vista funzionale pu
essere complessa nei termini di come si integra nellambiente per il quale pensata. I
due principali input variabili, il livello dellilluminazione e quello dellumidit del suolo,
devono essere calibrati per una specifica serie di condizioni. Lintervallo dellLDR e della
sonda di umidit del suolo determina come si impostano i punti intermedi utilizzando i
potenziometri dei trimmer. Non tutti gli LDR sono uguali e ci sono differenze tra una
sonda di umidit del suolo formata soltanto da un paio di sonde e una che include un
transistor.
Ci sono due approcci di base per regolare la GreenShield: (1) calibrare la GreenShield
per intervalli noti utilizzando riferimenti di qualche tipo, oppure (2) regolare la
GreenShield per un ambiente specifico utilizzando una valutazione soggettiva (per
esempio: il suolo abbastanza umido?).
Lapproccio calibrato permette di specificare degli intervalli in base a dati puri e, se si
conosce lumidit del suolo ideale per esempio, per i pomodori, si pu utilizzare questi
valore una volta che si eseguita la calibrazione e calcolato come i risultati dellADC
corrispondono allumidit del suolo. Testare il prototipo a pagina 386 ha descritto le
procedure di base necessarie per calibrare la GreenShield per i livelli di umidit del
suolo e di illuminazione, ma come riferimento si pu anche utilizzare una cara
attrezzatura da laboratorio.
Lapproccio soggettivo molto pi facile e, dal momento che lobiettivo principale
evitare di uccidere le proprie piante, probabilmente diventa efficace soltanto dopo
qualche tentativo. Si possono regolare i potenziometri dei trimmer in modo che si
adattino ai valori massimo e minimo di una valutazione soggettiva di quello che sarebbe
accettabile.
Io vi suggerisco di fare qualche esperimento, per vedere quale approccio pi adatto
per la vostra applicazione. Vi suggerisco anche di prendervi il tempo necessario per
registrare i dati provenienti dalla GreenShield e costruire alcuni profili che potete
studiare per ottenere le risposte migliori in base alla vostra situazione.

Prossimi passaggi
La GreenShield piuttosto essenziale, a dire il vero, ma presenta una grande
potenzialit. Potete utilizzarla con una shield Bluetooth o addirittura con una shield
Ethernet e controllare in remoto le condizioni del suolo del vostro vaso di piante
preferite, di pomodori e orchidee in una serra, di un piccolo orto esterno, oppure di un
giardino in una colonia su Marte. Se collegate una normale valvola per sistemi di
irrigazione 24VAC a uno dei rel, potete rendere lirrigazione automatica. Potete
utilizzare laltro rel per attivare un ventilatore in una serra che produca un po di fresco,
oppure collegarlo a una stufa per mantenerla calda durante linverno. E, naturalmente,
potete sempre aggiungere un altro rel o due con un modulo rel esterno come quello
descritto nel Capitolo 9.
Potete utilizzare anche un shield microSD per montare la GreenShield su un albero in un
bosco e registrare dati per un periodo lungo (anche un pannello solare per mantenerla
attiva sarebbe una buona idea). Se vi aggiungete una shield WiFi o GSM, potete
lasciare diverse GreenShield in vari punti di una azienda agricola relativamente grande
per tenere sotto controllo le condizioni del suolo.

SUGGERIMENTO Attualmente, il software della GreenShield non salva i valori dei setpoint quando Arduino perde
lalimentazione. Un modo per aggirare questo problema utilizzare la EEPROM dellIC dellAVR. Trovate una
panoramica della libreria EEPROM nel Capitolo 7.

Design personalizzati compatibili con Arduino


Costruire una PCB compatibile con lhardware di Arduino facile. In effetti, i ragazzi di
Arduino forniscono perfino i file degli schemi e del layout della PCB da scaricare. Non
forniscono le maschere delle serigrafie, tuttavia, dal momento che sono protette da
copyright di Arduino.cc e non sono cedute sotto licenza aperta. Per la vostra scheda,
dovrete creare le vostre immagini personalizzate.
Anche se gran parte di quello di cui avrete bisogno per costruire una copia di un Arduino
o di una shield facile da trovare, in realt non risulta molto economico clonare il design
di un Arduino esistente (che sia una shield o una scheda MCU). A meno che non
possediate o abbiate accesso a un impianto di produzione di PCB e vi servano centinaia
o addirittura migliaia, di unit di un particolare tipo di scheda, difficile che riusciate a
trovare qualcosa di gi pronto a un prezzo unitario molto inferiore di quanto non vi
costerebbe costruirvele da soli.
Lapproccio personalizzato ha senso se i fattori di forma delle PCB esistenti e disponibili
non vanno bene per voi. Magari volete integrare un Arduino in un sistema pi grande,
oppure inserire una MCU AVR in una posizione unica e limitata come un aereo privo di
pilota o un robot. Se questo il vostro caso, potete decidere di creare una PCB
compatibile con il software. La vostra scheda non deve avere lo stesso aspetto di un
Arduino e non c motivo per cui debba essere compatibile con shield esistenti, a meno
che, naturalmente, non vogliate utilizzarla con una shield di unaltra marca.
Come abbiamo visto nel Capitolo 1, un dispositivo pu essere compatibile con il
software di Arduino senza essere compatibile con il suo hardware. Tutto quello che
serve un processore AVR adatto, il firmware del bootloader e le librerie di runtime di
Arduino. Perfino il firmware del bootloader facoltativo. In questo paragrafo,
progetteremo e costruiremo un controller di alimentazione DC basato su AVR adatto per
essere utilizzato con robusti rel, LED ad alto consumo e motori AC o DC.

Programmare un design personalizzato


Se desiderate utilizzare il bootloader di Arduino con un microcontroller AVR nuovo di
zecca, dovete installare il bootloader nella memoria flash integrata nel chip. Fatto
questo, potete trattare la vostra scheda personalizzata come se fosse un Arduino
qualsiasi. Gli strumenti e le procedure necessarie per caricare il codice eseguibile su
una MCU AVR sono descritte in Caricare codice eseguibile sullAVR a pagina 150 nel
Capitolo 6. In alternativa a installarvi il firmware del bootloader da soli, molti rivenditori
propongono dispositivi AVR con il bootloader di Arduino gi installato. Potete cercare su
Adafruit (https://www.adafruit.com/) e SparkFun (https://www.sparkfun.com/)gli IC
ATmega328 con il firmware del bootloader di Arduino preinstallato. Digitando
ATmega328 with Arduino bootloader nel campo di ricerca di Amazon.com o di eBay,
trovate numerosi elenchi.
Una volta installato il bootloader, potete utilizzare ladattatore USB-seriale o perfino
uninterfaccia seriale standard con un modulo RS-232 adatto come quello mostrato nella
Figura 10-26, oppure un breakout USB-seriale come il dispositivo di SparkFun mostrato
nella Figura 6-8. Nel caso di alcuni progetti, come lo Switchinator che vedremo nel
prossimo paragrafo, linterfaccia seriale non unopzione per programmare la MCU se
gi in uso, oppure se non utilizzato il bootloader. Questo significa che dovrete utilizzare
un programmatore ISP (ICSP) come lAtmel-ICE oppure lUSBtinyISP, entrambi i quali
sono descritti nel Capitolo 6.
Lo Switchinator
Il dispositivo descritto qui, che io chiamo Switchinator (in mancanza di una
denominazione migliore), un interruttore DC controllato in remoto da 14 canali con 4
canali di input analogico. Questa versione iniziale utilizza uninterfaccia RS-232 e un
semplice protocollo comando-risposta. Una possibile modifica per una versione futura
potrebbe essere utilizzare uninterfaccia RS-485 anzich la RS-232.

La definizione e la pianificazione
Lo Switchinator una PCB indipendente che pu utilizzare una semplice MCU
ATmega328 oppure ATmega328p senza il bootloader di Arduino. Pu utilizzare anche
una MCU con il firmware del bootloader installato con un programmatore seriale oppure
un convertitore USB-seriale. Per la programmazione, io ho scelto di utilizzare lIDE di
Arduino per compilare un USBtinyISP di Adafruit. Trovate maggiori informazioni sulla
programmazione della MCU nel Capitolo 6.
Ecco lhardware:
ATmega328
16 MHz sorgente di clock a cristalli
Interfaccia di programmazione ICSP
Alimentazione 5 V DC integrata (input da 9 a 12 V DC)
Input e output:
4 input analogici
14 output discreti digitali
Controllo dellinterfaccia:
Interfaccia host RS-232
Protocollo comando-risposta, gestita dallhost di controllo
Risultati analogici disponibili su richiesta
Output sostituito dallhost di controllo
Lo Switchinator fornisce 14 output discreti digitali e 4 input analogici e linterfaccia SPI
disponibile per mezzo di una serie di pin ICSP. Gli output discreti digitali e gli input
analogici sono terminati sul bordo della PCB utilizzando morsettiere a vite. Per la
comunicazione tra la scheda e un computer che funga da host di controllo per mezzo dei
pin D0 e D1 delle morsettiere della MCU si utilizza uninterfaccia RS-232.
La PCB un design al 100 per cento through-hole. Questo ne semplifica
lassemblaggio, al prezzo di una PCB pi grande e di un layout della PCB
potenzialmente pi difficile. La dimensione della PCB non superer la dimensione
rettangolare di 100 mm per 140 mm. Su ciascun angolo della PCB si trovano dei fori di
montaggio.
Gli output discreti digitali dello Switchinator possono essere utilizzati per gestire rel,
come il tipo utilizzato dalla GreenShield, oppure per controllare fino a tre motori passo-
passo unipolari utilizzando un circuito di base come quello mostrato nella Figura 10-18.

Figura 10-18 - Un ULN2003A collegato come driver di un motore passo-passo.

Gli output digitali dello Switchinator possono inoltre gestire LED ad alto consumo,
solenoidi o motori DC, come mostra la Figura 10-19.

Figura 10-19 - Un driver per motori DC ULN2003A.

Per sviluppare la versione iniziale del software, utilizzeremo un semplice prototipo


basato su un breadboard che non richiede saldature. Completeremo la versione finale
sullhardware finito.
Per il design dellhardware finale, per gli schemi e il layout della PCB utilizzer Fritzing.

Il design
Lo Switchinator una singola PCB, di dimensioni 124 96 mm, con quattro fori di
montaggio sugli angoli. La dimensione finale della scheda maggiore di quella che
sarebbe altrimenti possibile con un design a montaggio superficiale ( anche maggiore
rispetto ai limiti di dimensione impostati dalla versione gratuita dello strumento Eagle che
abbiamo utilizzato per la GreenShield).
Non presenta custodia n alimentazione, cosa che ne semplifica enormemente il design.
Lo Switchinator completamente autosufficiente e per funzionare richiede soltanto una
fonte di alimentazione DC esterna.

Le funzionalit
Lo Switchinator un dispositivo di output digitale con qualche funzionalit di input
analogico. Il suo scopo principale quello di commutare carichi DC, sia induttivi sia non
induttivi. Per decodificare gli input dei comandi e restituire dati di stato allhost di
controllo, utilizza una MCU AVR ATmega328.
Un ATmega328 utilizzato principalmente come decodificatore di comandi per
interfacciare gli I/O della PCB con un sistema host. Sebbene sia stato programmato per
comportarsi come un dispositivo I/O, pu essere programmato anche per eseguire
funzioni autonome basate sugli input analogici. Utilizzando un sensore lineare di
temperatura, come lLM35, lo Switchinator pu essere riprogrammato facilmente in
modo che funga da controller per camere di prove ambientali o per camere di
indurimento di resina epossidica.
Dal punto di vista dei circuiti, lo Switchinator composto da tre sezioni principali: la
MCU, gli I/O digitali e lalimentazione. La Figura 10-20 mostra un diagramma a blocchi
dello Switchinator.

Figura 10-20 - Un diagramma a blocchi dello Switchinator.

Gli output discreti digitali sono gestiti da IC ULN2003A. Sono forniti inoltre quattro input
analogici e il riferimento analogico e le tensioni AVCC possono essere forniti
dallalimentatore interno integrato sulla scheda oppure esternamente. Per selezionare le
sorgenti di tensione analogica, si utilizzano jumper.
Per monitorare e controllare lo Switchinator, si utilizza un semplice protocollo comando-
risposta comprensibile per gli umani.

Lhardware
Lo Switchinator avr 14 output digitali, ciascuno collegato agli output Darlington di una
coppia di IC driver ULN2003A. I driver ULN2003A sono dotati di sette canali per IC e
ciascun canale degli ULN2003A pu gestire fino a 300 mA o, in alcuni casi, di pi.
Per gestire le parti degli ULN2003A, si utilizzer un microchip MCP23017 I2C che
espande gli I/O digitali, soprattutto per evitare di utilizzate tutti i pin I/O digitali disponibili
della MCU AVR. Due dei pin I/O digitali dellAVR si utilizzano per linterfaccia seriale e
due dei pin analogici sono utilizzati per linterfaccia I2C con lIC MCP23017. I pin I/O
digitali non collegati non vengono utilizzati, ma rimangono disponibili per future
espansioni.
Uninterfaccia RS-232 viene implementata utilizzando un IC ricetrasmittente MAX232
TTL-to-RS232. Linterfaccia seriale servir a comunicare con il sistema host che si
comporter come controller master. Il controller master pu essere un PC, un Arduino,
oppure un controller programmabile di un qualche tipo con uninterfaccia RS-232. Per
linterfaccia seriale si utilizza un connettore DB-9. Questa non unimplementazione
completa di RS-232, ma soltanto dei segnali RxD e TxD. Lo Switchinator non dotato di
un connettore USB.
Gli output digitali e gli input analogici sono terminati utilizzando una morsettiera a vite da
3,5 mm (0,138 pollici, 138 mil). Inoltre, due jumper consentono input di tensione di V+
analogico e di riferimento analogico forniti esternamente per mezzo di una morsettiera.
Per lalimentazione DC si utilizza un connettore standard montato sulla PCB del tipo a
cilindro. Lalimentazione pu variare da 6 a 12 V DC (9 V ottimale). Per la regolazione
della tensione a 5 V sulla PCB, si utilizza un 7805 in un package TO-220. La Figura 10-
21 mostra lo schema creato da Fritzing.
Figura 10-21 - Schema dello Switchinator.

NOTA La notazione dello schema utilizzata nella Figura 10-21 illustra che cosa succede quando le parti di una libreria
di strumenti non seguono le stesse convenzioni di dimensioni e distanza. Questo un problema che si riscontra
spesso con gli strumenti open source, perch non tutte le parti possono aver seguito le stesse regole. Questo non
significa che non funzioner: soltanto che sembrer strano.

Lexpander degli I/O digitali MCP23017


LMCP23017 con uninterfaccia I2C e suo fratello, lMCP23S17 con uninterfaccia SPI, sono dispositivi controllati
da registri per dirigere segnali binari tra un dispositivo master e fino a 16 input o output digitali discreti. La
spiegazione del funzionamento interno dellMCP23017 vale anche per lMCP23S17.
Questi dispositivi si utilizzano nelle shield di espansione I/O come quelle descritte nel Capitolo 8 e
rappresentano un modo semplice di estendere le funzionalit I/O di una MCU. Utilizzando i pin di indirizzamento,
possibile collegare fino a 8 IC MCP23017 a una MCU AVR, ottenendo 128 canali di I/O digitali discreti.
Il comportamento dellMCP232017 definito dal contenuto di una serie di registri di controllo e di dati. Il master
pu leggere o impostare i valori dei registri in qualsiasi momento, per mezzo dellinterfaccia I2C o SPI. La Figura
10-22 mostra un diagramma a blocchi dellMCP23017. LMCP23S17 identico, eccetto che per lincorporazione
di uninterfaccia SPI al posto dellinterfaccia I2C.
Figura 10-22 - Lexpander I/O MCP23017.

LMCP23017 ha 22 registri interni organizzati in 11 coppie con un registro A per la porta GPIO con etichetta A e
un registro B per la porta B. La direzione delle porte (input o output) impostata con lapposito registro IODIRA o
IODIRB. La polarit delle porte (active high o active low) impostata con i registri IPOLA o IPOLB. GPINTENA e
GPINTENB attivano la generazione degli interrupt. GPPUA e GPPUB attivano i pull-up interni. Il segnale sui pin della
porta A o della porta B sono letti dati registri GPIOA o GPIOB. I registri OLATA e OLATB restituiscono gli stati dei blocchi
di uscita interni, che vengono impostati quando una porta si trova nella modalit di output e i dati vengono scritti
nei registri GPIOA o GPIOB. La Tabella 10-9 elenca la serie completa di registri. Notate che gli indirizzi dei registri
sono esadecimali (Addr = indirizzo nello spazio dei registri dellMCP23017) e POR/RST si traduce come reset
power-on o reset esterno.
Tabella 10-9 - I registri di controllo dellMCP23017 (IOCON.BANK = 0).

LMCP23017 ha altre funzionalit, delle quali tutte possono rivelarsi utili per determinate applicazioni. Per
applicazioni I/O digitali semplici, in realt lunica cosa che deve succedere che si devono leggere o scrivere i
registri GPIO. Trovate maggiori dettagli sui registri nella scheda tecnica dellMCP23017/MCP23S17
(http://bit.ly/micro-mcp).
Un altro aspetto dellMCP23017 come comunicare con esso. Per accedere ai registri interni, si utilizza un
protocollo a due fasi. Il primo passaggio inviare un byte di controllo e lindirizzo del registro al quale si desidera
accedere. Il secondo passaggio leggere o scrivere il registro. Il registro selezionato per ultimo rimarr attivo
finch non viene selezionato un nuovo registro con una coppia di byte di controlloindirizzo del registro.
Il byte di controllo lindirizzo a 7 bit dellMCP23017 con un bit R/W (read/write, lettura/scrittura). In un sistema
con un unico IC, questo deve essere sempre 0 per i bit A0, A1 e A2 con il sesto bit predefinito come 1, che
produce valori in byte di 0x20 se si tratta di unoperazione di scrittura e 0x21 se si stanno leggendo dati (il bit
lettura/scrittura lultimo bit significativo del byte di controllo).
Esistono diverse librerie per interagire con i dispositivi MCP23017 e MCP23S17 e scrivere una libreria
personalizzata non difficile. La porzione di codice mostrata nellEsempio 10-7 mostra come indirizzarsi al
registri di direzione I/O e al registro GPIOA come input utilizzando linterfaccia I2C e la libreria Wire.

Esempio 10-7 - Accedere ai registri IODIRA e GPIOA dellMCP23017.


Poich al momento dellaccensione o dopo un reset le porte I/O GP sono configurate come input per
impostazione predefinita (vedere la Tabella 10-9), il primo passaggio pu essere saltato. Per configurare la porta
come output, i bit IODIRA devono essere impostati su 0. Questo mostrato nella porzione di codice
dellEsempio 10-8.

Esempio 10-8 - Scrivere dati sulla porta di output.

Linterfaccia SPI dellMCP23S17 si comporta in un modo simile e volendo si possono utilizzare perfino i pin
dellindirizzo. Tutti gli altri comportamenti sono identici a quelli dellMCP23017. Le operazioni eseguite
dallMCP23017 sono veloci come gli I/O, I2C o SPI.

Per il clock della MCK dello Switchinator, ho utilizzato un cristallo da 16 MHz,


principalmente perch ne ho molti. Per lo Switchinator, loscillatore RC interno dellAVR
probabilmente va bene. Anche se il cristallo permette alla MCU di funzionare a una
determinata velocit, aggiunge anche alcune complicazioni con i fuse bit interni che la
MCU AVR utilizza per la configurazione interna. Come si leggono e come si impostano
spiegato in Impostare i fuse bit della MCU AVR per un cristallo da 16 MHz a pagina
420.
I quattro input analogici sono collegati a una coppia di morsettiere da quattro posizioni.
Le posizioni rimanenti sono utilizzate per V+, messa a terra e riferimento analogico
opzionale e input AVCC. I jumper JP10 e JP11 servono a selezionare fonti di tensione
esterne eliminandole dalla PCB.
Due dei pin digitali della MCU (D0 e D1) servono per linterfaccia RS-232 seriale. Tre
dei pin digitali (D11, D12 e D13) servono per linterfaccia di programmazione ICSP. Gli
altri pin digitali non sono assegnati. Quattro degli input analogici (A0, A1, A2 e A3) si
utilizzano come input analogici per scopi generali. I pin A4 e A5 si utilizzano per
linterfaccia I2C tra la MCU e lIC dellMCP23017. La Tabella 10-10 elenca le
assegnazioni dei pin dello Switchinator.
Tabella 10-10 - Lutilizzo dei pin nella MCU dello Switchinator.

Pin Funzione Pin Funzione Pin Funzione


Input analogico
D0 RxD per RS-232 D7 Non utilizzato A0 per impieghi
generici
Input analogico
D1 TxD per RS-232 D8 Non utilizzato A1 per impieghi
generici
Input analogico
D2 Non utilizzato D9 Non utilizzato A2 per impieghi
generici
Input analogico
D3 Non utilizzato D10 Non utilizzato A3 per impieghi
generici
D4 Non utilizzato D11 ICSP MOSI A4 I2C SCL
D5 Non utilizzato D12 ICSP MISO A5 I2C SDA

Basandoci sullo schema presentato nella Figura 10-21, possiamo generate un elenco
dettagliato di parti come mostra la Tabella 10-11.
Tabella 10-11 - Lelenco di parti dello Switchinator.

Quantit Descrizione Quantit Descrizione


2 Condensatore, 0,1 uF 4 LED rosso
2 Condensatore, 10 uf 1 LED verde
Resistenza 1 kohm, 5%, 1/4
2 Condensatore, 27 pF 5
W
Resistenza 10 kohm, 5%, 1/4
1 Condensatore, 0,001 uF 1
W
Resistenza 330 ohm, 5%, 1/4
4 Condensatore, 1 uF 1
W
1 Diodo 1N4001 1 Interruttore, pulsante tattile
MCU ATmega328, DIP da 28
1 Expander I/O MCP23017 I2C 1 pin

Ricetrasmittente MAX232
2 Dirver di output ULN2003A 1
RS232, DIP da 16 pin
Jack di alimentazione, 5,5 Regolatore di tensione 7805,
1 1
mm cilindrico TO-220
Pacchetto di connettori AVR Connettore DB9, montato
1 1
ISP, 2 3 pin sulla PCB, maschio
6 Morsettiera, passo 3,5 mm 1 Cristallo da 16 MHz
2 Header di jumper da 2 pin 1 PCB personalizzata

Il software
Come nel progetto della GreenShield, la parte pi complessa dello Switchinator in realt
il software. La Figura 10-23 mostra un diagramma a blocchi del software.

Figura 10-23 - Un diagramma a blocchi del software dello Switchinator.

Quando lo Switchinator in attesa di input di comandi, invia un unico carattere >


seguito da uno spazio. Le risposte sono precedute dal carattere < e da uno spazio,
seguiti dai dati della risposta. Lutilizzo dei caratteri > e < avviene principalmente per
comodit del software attivo sul sistema dellhost di controllo. Tutte le righe degli input e
degli output terminano con un carattere nuova riga (\n o 0x0A).
A ogni passaggio nel ciclo principale, vengono letti gli input analogici e vengono salvati i
valori. Questi sono restituiti allhost di controllo quando richiesto un risultato analogico,
che significa che saranno aggiornati al ritmo del ciclo principale.
Quindi, il software controlla se stanno arrivando dati seriali. Se ci sono dati nel buffer
degli input, viene chiamata la funzione di lettura degli input per leggere i caratteri finch
non viene trovata una nuova riga (il relativo carattere), il valore ASCII 10 (0x0A o \n).
Poi il parser estrae il comando dalla stringa, analizza i parametri ed esegue loperazione
richiesta.
Il controllo dello Switchinator avviene per mezzo di un semplice protocollo comando-
risposta. Per ogni comando o query inviata dallhost di controllo, lo Switchinator
risponde con ununica risposta. Lo Switchinator non inizia mai transazioni di
comunicazione con lhost di controllo. Il protocollo comando-risposta completo
mostrato nella Tabella 10-12.
Tabella 10-12 - Il protocollo comando-risposta dello Switchinator.

Formato
Comando Risposta Descrizione
in/out
A:n A:n:val Ottiene linput analogico n in raw DN Esadecimale
Esadecimale
R:nM R:n:val Legge lo stato delloutput n
(0 o 1)
W:n:val OK Scrive 0 o 1 sulloutput n Esadecimale

S:val OK
Imposta tutti gli output sul valore Esadecimale 4
esadecimale cifre

G:? G:val
Ottiene il valore esadecimale di tutti gli Esadecimale 4
output cifre

Il comando per impostare semplice e soltanto il comando W (write) utilizza due


parametri anzich uno solo. Tutti i valori di parametri e risposte sono nella notazione
esadecimale. Questo permette ai numeri delle porte digitali di essere cifre uniche
esadecimali, mentre i valori degli input analogici (il comando A) e i comandi per
impostare e ottenere in massa (S, o imposta tutte le porte, e G, ottieni tutte le porte,
rispettivamente) utilizzano valori esadecimali di quattro cifre. Le cifre 0 e 1
nominalmente sono nel formato esadecimale, ma nella notazione decimale sono uguali.
Il rilevamento degli errori gestito esaminando la stringa restituita dallo Switchinator. Se
i comandi A, R o G restituiscono la stringa inviata, si produce un errore. Se i comandi S o
W incontrano un errore, restituiscono la stringa originale. Se la loro azione va a buon fine,
viene restituita la stringa OK.

Numeri ottali ed esadecimali


Se sapete gi lavorare con le notazioni ottale ed esadecimale, potete saltare questo riquadro. In caso contrario,
ecco una breve storia che vi permetter di scoprire da dove vengono questi sistemi numerici per il software e
come funzionano.
Tempo fa, quando i computer occupavano intere stanze e generavano tanto calore che ci si poteva cuocere un
uovo, diventato rapidamente ovvio che gestire i numeri binari non avrebbe funzionato molto bene. E, dato che
le macchine erano intrinsecamente binarie, i valori decimali non si mappavano facilmente ai pattern di bit delle
luci del pannello di controllo o salvati nella memoria.
La soluzione stata rappresentare i valori numerici utilizzando una base numerica diversa da 2 o da 10. Il caso
che ci sono due sistemi di base che hanno una mappatura diretta con i valori binari: quello ottale (con base 8)
e quello esadecimale (con base 16).
Il sistema di numerazione ottale con base 8 si diffuso sui computer che per i dati e gli indirizzi utilizzavano
parole di 12, 24 o 36 bit, dal momento che il valore di ciascuna dimensione pu essere diviso esattamente per 3.
Una cifra ottale pu avere un valore compreso tra 0 e 7, per cui le cifre ottali si mappano ciascuna su tre bit. La
Tabella 10-13 mostra come funziona.

Tabella 10-13 - Il sistema di numeri ottali su un computer a 12 bit.


Decimale Binario Ottale Decimale Binario Ottale
0 000 000 000 000 0000 9 000 000 001 001 0011
1 000 000 000 001 0001 10 000 000 001 010 0012
2 000 000 000 010 0002 20 000 000 010 100 0024
3 000 000 000 011 0003 30 000 000 011 110 0036
4 000 000 000 100 0004 40 000 000 101 000 0050
5 000 000 000 101 0005 50 000 000 110 010 0062
6 000 000 000 110 0006 100 000 001 100 100 0144
7 000 000 000 111 0007 200 000 011 001 000 0310
8 000 000 001 000 0020 511 000 111 111 111 0777

I numeri ottali si trovano ancora nei moderni computer Unix e Linux, come i bit dei permessi dei file, ma altrimenti
oggigiorno sono rari. Nessuno utilizza pi computer da 12 o 24 bit per scopi generali, anche se alcuni gruppi di
ricerca hanno creato design di microprocessori da 24 bit per applicazioni specifiche e il dispositivo DSP (digital
signal processor) DSP56303 di Freescale pu essere utilizzato come una macchina da 24 bit.
Mentre le architetture dei computer passavano a dimensioni di dati e indirizzi che sono multipli di 4, il sistema
ottale diventava rapidamente obsoleto. La soluzione era il sistema esadecimale con base 16. Nel sistema di
numerazione esadecimale, ciascuna cifra pu rappresentare un valore compreso tra 0 e 15, o binario tra 0000 e
1111. In altre parole, ciascuna cifra esadecimale una pezzettino e due cifre esadecimali rappresentano un
byte di 8 bit.
Tuttavia, la notazione esadecimale presenta un problema. In numeri a base 10 non possono rappresentare
nessun valore maggiore di 9 con una sola cifra. Il valore 10 si scrive con due cifre. Durante gli anni 50, sono
stati proposti diversi schemi per cercare di risolvere il problema della notazione, alcuni dei quali oggi possono
sembrarci molto strani. Dopo qualche anno, hanno cominciato a prendere polvere e siamo finiti con 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, A, B, C, D, E ed F per i valori da 0 a 15. La Tabella 10-14 mostra la relazione tra i valori decimali,
binari ed esadecimali di una serie di numeri.

Tabella 10-14 - Il sistema di numerazione esadecimale su un computer a 16 bit.


Decimale Binario Esadecimale
0 0000 0000 0000 0000 0000
1 0000 0000 0000 0001 0001
2 0000 0000 0000 0010 0002
3 0000 0000 0000 0011 0003
4 0000 0000 0000 0100 0004
5 0000 0000 0000 0101 0005
6 0000 0000 0000 0110 0006
7 0000 0000 0000 0111 0007
8 0000 0000 0000 1000 0008
9 0000 0000 0000 1001 0009
10 0000 0000 0000 1010 000A
20 0000 0000 0001 0100 0014
30 0000 0000 0001 1110 001E
40 0000 0000 0010 1000 0028
50 0000 0000 0011 0010 0032
100 0000 0000 0110 0100 0064
200 0000 0000 1100 1000 00C8
255 0000 0000 1111 1111 00FF
511 0000 0001 1111 1111 01FF
4095 0000 1111 1111 1111 0FFF

Nel software, a volte vedrete valori esadecimali scritti come 0x3F in C e C++, 3Fh in linguaggio assembly, $3F in
Forth, oppure %3F in un URL. Un display LED numerico a sette segmenti pu gestire i valori esadecimali
modificando la visualizzazione di alcune delle cifre per ottenere simboli che si presentino come A, b, c, d, E e F,
come mostra la Figura 10-24.

Figura 10-24 - Una visualizzazione esadecimale con un normale a display LED a 7 segmenti.

Presto, diventato rapidamente evidente sia nel sistema di numerazione ottale che in quello esadecimale che ci
sono alcuni valori speciali, a volte detti numeri magici, che continuano ad apparire. Per esempio, nel sistema
esadecimale il valore 0xFF un byte con tutti i bit impostati su 1.
0x5A5A un pattern alternativo (binario 0101 1010 0101 1010) che a volte si utilizza come riempitivo per
controllare luso degli stack o per sovrascrivere un hard disk per cancellare dati salvati in precedenza. 0x7F
127, 0x1FF 511 e 0x3FF 1023. 0x3FF (1023) il valore massimo che pu produrre lADC da 10 bit dellAVR
ATmega328 e 0x1FF il punto intermedio del suo intervallo.
possibile eseguire calcoli sia con numeri ottali che esadecimali e nella programmazione in linguaggio
assembly spesso c bisogno di aggiungere o sottrarre valori di indirizzi esadecimali (per indirect jump o
istruzioni branch relative, per esempio). Eseguire calcoli come la moltiplicazione e la divisione con numeri
esadecimali possibile, ma richiede un po di pratica. A meno che non vogliate o abbiate bisogno di scrivere
molta programmazione a basso livello in linguaggio assembly, i calcoli esadecimali probabilmente sono
qualcosa che non dovrete aggiungere alle vostre capacit, ma per lavorare con i microcontroller dovete essere
capaci di tradurre da esadecimale a binario (e viceversa).
Il comando A accetta una sola cifra compresa tra 0 e 3 e i dati analogici sono il valore
vero e proprio restituito dallADC della MCU AVR. restituito come un valore
esadecimale da 1 a 3 cifre, con il valore massimo possibile pari a 0x3FF.
I comandi R e W hanno lo specifico numero di porta delloutput digitale nella forma di
ununica cifra esadecimale, che va da 0 a 0xF (15). I canali di output 7 e 0xF sono
utilizzati per i LED integrati sulla scheda; non sono collegati per mezzo dei driver
ULN2003A.
Nella Tabella 10-12 potete notare che per controllare o ottenere lo stato di pi di un
output si utilizzano i comandi S e G con un valore esadecimale. Con questo schema,
possiamo attivare (impostare sullo stato on) output non contigui o leggere lo stato di
tutti gli output.
Se, per esempio, volessimo impostare gli output 5, 6, 12 e 13 sullo stato on, dovremmo
inviare il valore 3060h, che in binario si traduce cos:

Ricordate che la numerazione dei canali parte da zero.

SUGGERIMENTO Inviare un valore esadecimale far s che lo stato degli output cambi per adattarsi al valore del
comando. Questo significa che se un output on e il valore del comando ha uno zero in quella posizione, diventer off.
Per impostare o cancellare un determinato output senza disturbare gli altri bit, si utilizza unoperazione lettura-modifica-
scrittura (legge i bit, modifica i dati, imposta i bit). Ecco come funziona il comando W.

Lultimo passaggio del ciclo trasferisce i bit dello stato delloutput digitale sullhardware.
Se non sono state applicate modifiche dal momento dellultimo aggiornamento, gli output
non faranno niente. Altrimenti, i bit che sono stati cambiati appariranno come modifiche
dello stato on oppure off degli output dellULN2003A.

Il prototipo
Il prototipo si concentra soprattutto sullinterfaccia RS-232 e sul protocollo di controllo
comando-risposta e quindi il suo hardware rappresentano principalmente da un
ATmega328 montato su una breadboard che non richiede saldature. In sostituzione del
MAX232 della scheda finale, si utilizza un modulo adattatore RS-232. La Figura 10-25
mostra il prototipo.
Figura 10-25 - Il prototipo dello Switchinator.

Il modulo RS-232 ununit autonoma con un IC MAX3232. Dal punto di vista


funzionale, questa parte equivalente al MAX232 utilizzato nello Switchinator.
Nominalmente, il MAX3232 una parte a 3,3 V, anche se tollera 5 V. anche
leggermente pi cara del MAX232. La Figura 10-26 mostra un ingrandimento del
modulo di interfaccia RS-232.

Figura 10-26 - Il modulo di interfaccia RS-232.


Questi moduli sono reperibili presso diversi rivenditori per un prezzo compreso tra i 3 $
e i 6 $. Cercando su Google arduino rs232 module oppure arduino rs232 converter,
si trovano numerosi risultati.
La maggior parte dei computer desktop sono ancora dotati di ununica porta RS-232 e
di un connettore DB-9 sul pannello posteriore, ma se possedete un modello pi recente
di PC portatile potete non avere a disposizione una porta seriale. Per aggirare questo
problema, potete utilizzare un adattatore USB-RS232. Questi hanno un prezzo che
oscilla tra i 4 $ e gli oltre 30 $ e alcuni tipi speciali costano anche di pi. Per maggiori
dettagli su RS-232 e sui connettori che utilizza, vi consiglio di leggere i miei libri Real
World Instrumentation with Python e Practical Electronics: Components and
Techniques (vedere Appendice D). Entrambi contengono paragrafi che trattano
specificamente RS-232, i connettori DB-9, gender changer e come collegare un DB-9
per permettere comunicazioni RxD/TxD senza segnali di handshaking.

Impostare i fuse bit della MCU AVR per un cristallo da 16 MHz


A differenza degli altri esempi mostrati in questo libro, lo Switchinator non una scheda Arduino. Pu essere
compatibile con il software se installato il bootloader, ma questo non obbligatorio. Fondamentalmente,
soltanto un design per una MCU AVR.
Questo significa che la MCU non preconfigurata come con una scheda Arduino. Un MCU nuova di Atmel girer
nella modalit RC clock utilizzando un oscillatore interno da circa 8 MHz. Se stato installato un bootloader,
sono impostati alcuni interruttori interni che indicano che stata riservata una parte dello spazio di memoria
flash. Inoltre, le MCU con firmware del bootloader precaricato di solito hanno i fuse bit impostati per un cristallo
esterno da 16 MHz, ma una parte nuova di zecca presenter soltanto la configurazione predefinita.
Per configurare la MCU in modo che possa utilizzare il cristallo da 16 MHz come la sua sorgente di clock
dobbiamo impostare i fuse bit. Per maggiori dettagli sui fuse bit utilizzati nelle MCU AVR, potete rileggere I fuse
bit a pagina 62 nel Capitolo 3. La fonte definitiva di informazioni , naturalmente, la scheda tecnica di Atmel della
MCU AVR che state utilizzando.
Se volete utilizzare la configurazione di Arduino per AVRDUDE (e avete un sistema Linux), ecco il comando che
vi serve per un ATmega328:

Per una parte ATmega328p dovete semplicemente cambiare il parametro relativo alla parte, cos:

Su un sistema Linux, se avete impostato i permessi per gli I/O USB, non dovete utilizzare sudo per eseguire
avrdude. Per ulteriori informazioni sulle opzioni a linea di comando e i comandi interattivi supportati da avrdude,
potete consultare il manuale online (http://bit.ly/avrdude-manual).
Lultimo passaggio informare il compilatore del fatto che adesso si utilizzano 16 MHz. Per farlo, si deve definire
F_CPU cos:

Di solito, questa riga viene aggiunta dallambiente di Arduino quando si lavora con una scheda Arduino
convenzionale, ma con una scheda target personalizzata pu diventare necessario specificare esplicitamente la
velocit del clock.
Le versioni per Windows e per Mac OS di AVRDUDE si comportano nella stesso modo che su Linux. In questo
tutorial (http://www.ladyada.net/learn/avr/setup-win.html) trovate ulteriori informazioni sulla versione per Windows
di AVRDUDE.
Il software del prototipo
Il software del prototipo essenzialmente uguale a quello della versione finale, soltanto
senza il codice per impostare gli output digitali per mezzo dellMCP23017. Lobiettivo
principale del prototipo limplementazione del protocollo comando-risposta. Gli stati
degli output sono rappresentati come in una word da 16 bit nel software.
Il software a pagina 423 contiene una descrizione dettagliata del software e quindi,
anzich presentarla qui e magari ripeterne delle parti successivamente, vi consiglio di
cercare l i dettagli. Il software viene compilato utilizzando lIDE di Arduino e quindi
caricato sulla MCU AVR utilizzando un dispositivo di interfaccia ICSP USBtinyISP di
Adafruit.
Per gestire la compilazione, io ho utilizzato lIDE di Arduino, ma ho disattivato il suo
editor interno nella finestra di dialogo Preferences. In questo modo, ho potuto utilizzare
un altro editor (per vivere scrivo software commerciale e scientifico e quindi ho
determinate preferenze in merito agli editor di testo: non sono un grande ammiratore
delleditor dellIDE di Arduino). La scheda stata impostata su Duemilanove with
ATmega328 e il programmatore su USBtinyISP.
Su un sistema Linux, lUSBtinyISP non utilizza una porta pseudo-seriale, ma comunica
direttamente con il sottosistema I/O USB sottostante. Cercare di eseguire lIDE di
Arduino con il programmatore allinizio produrr un errore di permessi. Potete eseguire
lIDE di Arduino utilizzando sudo, ma questo non un modo comodo di trasferire il vostro
codice. Per aggirare questo problema, dovete aggiungere una regola di accesso per l
handler udev. Basta creare un file in /etc/udev/rules.d di nome tinyusb.rules e
aggiungervi questa stringa:

Per farlo, io ho utilizzato vi e sudo:

Quindi, per rendere effettiva questa nuova regola, dobbiamo riavviare il sottosistema
udev:

Potete anche utilizzare qualche altro tipo di dispositivo di programmazione (perfino un


altro Arduino, come descritto nel Capitolo 6). Io ho un Atmel-ICE, ma alla fine non lho
utilizzato su Linux perch non disponevo dellultima versione di AVRDUDE ed ero troppo
pigro per costruirla e mettermi a giocherellare con i file di configurazione. Funziona con il
software AVR Studio di Atmel e quindi, se utilizzate Windows, potete decidere di
prendere questa strada. Sul mio sistema Linux il piccolo gadget di Adafruit funziona
bene.
Utilizzando licona per caricare della mia versione dellIDE, questo cerca di comincia a
trasferire utilizzando il metodo USB-seriale costruito nelle schede Arduino (e supportato
da un convertitore USB-seriale come quello menzionato prima). Questo non funzioner
con lUSBtinyISP e quindi utilizzo invece lopzione FileUpload Using Programmer.
Una cosa che ho notato che il software di trasferimento AVRDUDE lento a
cominciare, ma diventa veloce una volta che ha stabilito un link di comunicazione solido
con la MCU AVR. Potete vederlo sia nellIDE di Arduino sia eseguendo AVRDUDE dalla
linea di comando. Non dovete entrare in panico se sembra che tutto si blocchi: non
cos. Se si verifica un problema, alla fine AVRDUDE far timeout e vi dir che cosa
andato storto.

Testare il prototipo
Testare il prototipo facile e questo paragrafo descrive i test da eseguire
specificamente sul parser dei comandi. La possibilit di interagire correttamente con il
software dimostrer che la porzione di codice relativa allRS-232 funziona
correttamente. Si d per scontato che la ricetrasmittente RS-232 esterna funziona come
previsto.
Innanzitutto, vengono testati i comandi per loutput (OUT), lo stato (ST) e linput (AN). I
comandi OUT:A:1 e OUT:A:0 si utilizzano per impostare tutto on o tutto off. Lo stato di
ciascun output conservato nella memoria in modo che a questo punto non ci sia
bisogno di hardware per loutput.
Con il comando ST:n:?, il n parametro ununica cifra compresa tra 0 e 13 (D in
esadecimale). Notate che anche le forme dei comandi OUT:n:0 e OUT:n:1 utilizzano
ununica cifra. Se il software funziona correttamente, possibile impostare tutti gli
output su off (0) e quindi attivare e disattivare selettivamente un output qualsiasi da 0 a
13 senza alterare nessuno degli altri output.
Il comando per gli input analogici (AN) viene testato applicando una sorgente di tensione
variabile (soltanto da 0 a 5 V) ad A0 fino ad A3 e richiedendone il valore. Dal momento
che la tensione dellinput viene cambiata, devono cambiare anche i dati restituiti. Il valore
dellinput restituito nella forma di valore esadecimale da tre cifre. Il due bit pi
significativi sono sempre 0 (la MCU AVR ha soltanto un ADC da 10 bit).
I comandi SP:val e GP:? utilizzano un valore esadecimale da quattro cifre, come
descritto prima. Per testarlo, si devono impostare tutti gli output dispari su on e tutti gli
output con numerazione pari su off, quindi controllare gli stati di ciascuno utilizzando il
comando ST. Gli output con numerazione dispari saranno impostati su off e quelli pari su
on e gli stati dei bit degli output saranno di nuovo controllati utilizzando il comando ST.

Il software
Anche se possibile e spesso consigliabile creare una versione semplificata del
software da utilizzare con il prototipo, nel caso dello Switchinator prende vita come serie
di codici multifile. Il file principale , naturalmente, Switchinator.ino. Gli altri file della
serie contengono le definizioni globali, le variabili globali, il parser dei comandi, il
generatore di risposte e il codice di controllo degli I/O. Il modulo I/O, sw_io.cpp, non
necessario nella versione del prototipo del software.

Lorganizzazione del codice sorgente


Il codice sorgente Switchinator formato da otto file, o moduli, descritti nella Tabella
10-15. Il modulo principale, Switchinator.ino, contiene le funzioni setup() e loop(). Fa
anche riferimento ad altri moduli utilizzando dichiarazioni #include.
Tabella 10-15 - I moduli del codice sorgente dello Switchinator.

Modulo Funzione
Modulo principale che contiene
Switchinator.ino
setup() e loop()
Definizioni delle costanti (dichiarazioni
sw_defs.h
#define)

sw_gv.cpp Variabili globabali


sw_gv.h File include
sw_io.cpp Funzioni I/O hardware
sw_io.h File include
sw_parse.cpp Parsing dei comandi
sw_parse.h File include

Lelenco completo di tutti i file sorgente dello Switchinator disponibile su GitHub.

La descrizione del software


Come nel caso di qualsiasi programma Arduino, lazione comincia nello sketch
principale. I contenuti del file principale Switchinator.ino sono elencati nellEsempio 10-9.

Esempio 10-9 - Switchinator.ino.


La funzione setup() contiene le solite dichiarazioni di inizializzazione insieme al
messaggio di avvio iniziale. La funzione loop() aggiorna continuamente i bit delloutput e
controlla se ci sono dei comandi in arrivo da un sistema di host di controllo per mezzo
della funzione GetCommand() che si trova nel modulo SW_parse.cpp.
Tornando alla Figura 10-23, il blocco Get command string si riferisce alla funzione
GetCommand() che si trova nel modulo sw_parse.cpp, i blocchi di funzioni Parse e
Generate response sono contenuti nella funzione DecodeCommand() e Update digital
output bits si trova nella funzione SetDigBits() contenuta nel modulo sw_io.cpp. La
Figura 10-27 mostra come il buffer dello stato dei bit delloutput, gv_statebits, viene
utilizzato per contenere una rappresentazione interna dei bit delloutput. Tutte le funzioni
di modifica dei bit agiscono su gv_statebits, non sugli output digitali veri e propri.

Figura 10-27 - Il buffer virtuale di bit dello Switchinator in azione.

Notate che scrivere 0x00 sulla porta A oppure sulla porta B attiva anche il LED della
porta associato. Scrivere 0xFF su una delle porte ne disattiva il LED. I bit delloutput
sono aggiornati circa ogni 50 ms, se non presente un input seriale da analizzare e
decodificare.

La produzione
Per il design dellhardware, ho utilizzato lo strumento Fritzing. Si tratta di uno strumento
che offre una breadboard virtuale integrata, la possibilit di catturare schemi e di creare
layout di PCB e che facile da installare e relativamente facile da utilizzare. Fritzing ha
unampia e vivace base di utenti e molte parti precaricate nella sua libreria. E il bello
che gratuito. Alcune distribuzioni Linux possono avere una versione pi vecchia di
Fritzing nel loro repository, ma potete scaricare quella pi recente da
http://fritzing.org/home. Io ho utilizzato la versione 0.8.5 su un sistema Linux Kubuntu
14.04 LTS. Esistono versioni di Fritzing anche per Windows e Mac OS X.
In confronto ad altri strumenti con i quali ho lavorato nel corso degli anni, sono rimasto
piacevolmente sorpreso di quanto facile da utilizzare linterfaccia utente di Fritzing. A
essere onesti, non sono rimasto altrettanto impressionato dallautorouter, ma poi ho
visto autorouter high-end lottare con cose che pensavo che fossero facili. E il software
di autorouting molto difficile da programmare e quindi non mi aspettavo un miracolo.
Ho finito per creare il layout manualmente (e sono sicuro che si vede). Il DRC (design
rules check) ha funzionato bene e, anche se leditor di schemi presenta alcune
stranezze, anche quello era completamente usabile. La mia critica principale a Fritzing
rivolta alla libreria delle parti. Sembra che non tutte si trovino sulla stessa pagina,
quando si tratta di dimensioni dei simboli schematici, e quindi le parti di una libreria
aggiuntiva possono essere molto piccole, mentre quelle fornite da Fritzing presentano
simboli grandi e belli. Lo vedrete quando guarderete lo schema nella Figura 10-21. Il
risultato che, a meno che tutte le parti contenute in una libreria di strumenti (sia i
simboli che le impronte del layout) non rispettino gli stessi limiti di dimensionamento,
difficile ottenere linee o tracce perfettamente ortogonali senza dover giocare seriamente
con le funzioni di ridimensionamento e di aggancio della griglia.
Una volta che lo schema (mostrato nella Figura 10-21) completo, si pu cominciare a
creare il layout della PCB. La prima volta che appare il layout della PCB, non contiene
tracce, soltanto le linee a nido di topo che indicano quali pin sono collegati sulle parti.
Nella Figura 10-28 ho gi collocato i componenti dove credo che debbano andare e
Fritzing sta mostrando alcune delle linee a nido di topo. Facendo clic e tenendo premuto
il pulsante del mouse su un pin di una parte qualsiasi, vengono evidenziati in giallo tutti i
punti dove lo si pu collegare.
Figura 10-28 - La PCB dopo il posizionamento delle parti, ma prima del routing.

I componenti sono raggruppati in base alla funzione: lalimentazione si trova nella parte
in basso a sinistra della PCB; lMCP23017 e i due ULN2003A si trovano nella zona in
alto a sinistra; la MCU, il cristallo, il connettore ICSP e gli input analogici si trovano in
alto a destra; e linterfaccia seriale si trova in basso a destra nel layout.
Potete notare che ho invertito i simboli delle morsettiere degli input analogici per
semplificare il collegamento. Verranno comunque montate correttamente e, dal
momento che un prototipo di PCB come questo non ha una serigrafia sullo strato
superiore, non fa nessuna differenza.
Il routing delle tracce in alcuni casi piuttosto tortuoso, principalmente per via
dellutilizzo di parti through-hole. Per spostare le tracce tra le parti superiore e inferiore
della PCB si utilizzano vie, che aiutano a evitare collisioni. La Figura 10-29 mostra la
versione finale della PCB che stata inviata in produzione.
Figura 10-29 - La versione finale del layout della PCB dello Switchinator.

Prima di inviare i file Gerber, ho ricontrollato il design con lo strumento Gerbv (che
stato presentato prima con la GreenShield). Potete vedere una cattura dello schermo
nella Figura 10-30.

Figura 10-30 - La visualizzazione del layout della PCB su Gerbv.


Fortunatamente, la casa di produzione (Advanced Circuits) ha scoperto due piazzole
che erano quasi, ma non abbastanza, collegate. Sarebbe stato facile correggerle sul
tavolo da lavoro, ma sarebbe stato difficile riscontrarne i problemi. Per fortuna qualcuno
lo ha notato e ha controllato i layout.
Lo Switchinator una PCB through-hole e quindi assemblarla facile. La Figura 10-31
mostra la PCB prima che vi vengano installate le parti.

Figura 10-31 - La PCB dello Switchinator.

Le prime parti da saldare in posizione sono il jack DC e il regolatore 7805, insieme ai


componenti dellalimentazioni associati, che sono D1, C2, C3, C4 e C5. Notate che non
c C1 ( sparito in una revisione precedente). Per testare lalimentatore, abbiamo
bisogno di installare anche R5 e LED5. Una volta che sono installate queste parti,
possiamo collegarci a una presa da 9 a 12 V DC per mezzo del jack DC e verificare che
il regolatore stia producendo 5 volt DC sullanodo di LED5 (che deve illuminarsi).
Quindi installeremo il connettore RS-232, etichettato X1 nello schema; U2 (lIC
MAX232); e C9, C10, C11 e C12. Utilizzando la breadboard per prototipare, possiamo
collegare i segnali Rx e Tx dai pin 2 e 3 della MCU ai pin U1 2 e 3 sulla PCB. Quindi
eseguiamo il software gi sulla MCU AVR e verifichiamo che il nostro RS-232 integrato
stia funzionando correttamente. Ricordate di legare la messa a terra e lalimentazione 5
V DC dalla PCB alla breadboard (e di scollegare lalimentatore della breadboard,
naturalmente).
Con lalimentatore e linterfaccia RS-232 installati e funzionanti, adesso possiamo
installare U1 (la MCU), IC1, IC2 e IC3. Anche LED1, LED2, R1 e R2 possono essere
saldati al loro posto, insieme alle sei morsettiere. Quindi, installiamo il cristallo, C6, C7,
C8, R3, R4, R6, LED3 e LED4. Il pulsante di reset, S1 e il connettore ICSP sono le
ultime cose da montare sulla PCB.
La Figura 10-32 mostra la PCB finita con tutto installato e pronto per funzionare. La
tensione massima che possono fornire i driver dellULN2003A determinata
dallalimentatore e dalle valutazioni degli IC. La scheda tecnica dichiara che lULN2003A
capace di fornire circa 300 mA per canale, o circa 2,1 A per IC. In confronto,
lATmega328 e lMCP23017 trasportano pochissima corrente e quindi la preoccupazione
maggiore saranno sempre i dispositivi ULN2003A. Un alimentatore capace di fornire
almeno 5 A dovrebbe essere pi che sufficiente, se volete utilizzare lo Switchinator per
qualcosa come un piccolo strumento CNC o un controller di display di LED.

Figura 10-32 - Lo Switchinator completato.

Il collaudo
I test finali dello Switchinator completo sono ampiamente una ripetizione dei test eseguiti
sul prototipo. La grande differenza, adesso, che ci sono due driver ULN2003A e
uninterfaccia RS-232 integrata basata su un IC MAX232. Deve essere testato anche
lalimentatore, oltre agli input analogici.

Prossimi passaggi
Qui, non sono stati utilizzati tutti i pin I/O digitali discreti della MCU: rimangono disponibili
10 pin (6 dei quali capaci di output PWM). Io non li ho collegati per via dei limiti di spazio
della PCB, ma sarebbe possibile modificare la PCB in modo che possa accogliere un
paio di pin socket da sei posizioni. Questo, tuttavia, richiederebbe un utilizzo astuto di
vie per dirigere le tracce nel traffico intorno alla MCU.
Linterfaccia SPI disponibile sui pin D11, D12 e D13 e questi sono collegati al
connettore ICSP. Se selezionate un pin inutilizzato per la linea SS, potete collegare un
modulo SPI allo Switchinator. I pin analogici possono essere utilizzati come pin I/O
digitali facendovi riferimento come pin dal D14 al D19.
Potete aver notato che non ci sono fusibili n protezione degli input per gli input
analogici. Per vedere un esempio di protezione degli input analogici, potete andare nel
Capitolo 11 e guardare il circuito di input utilizzato per il generatore di segnale.

Fonti
Questo capitolo si mosso in un territorio molto ampio e ha compiuto un paio di salti.
Ecco alcune fonti che vi possono aiutare a gettare pi luce sugli argomenti che in questo
testo sono stati trattati soltanto brevemente:
Testi di riferimento
Esistono numerosi testi che parlano di tutti gli aspetti dellelettronica. Questi sono
quelli ai quali sono particolarmente affezionato e che hanno a che vedere
direttamente con il materiale trattato in questo capitolo (nellAppendice D trovate i
numeri ISBN e ulteriori testi raccommandati):
Jan Axelson, Making Printed Circuit Boards
Paul Horowitz e Winfield Hill, The Art of Electronics, 2 Edizione
J. M. Hughes, Practical Electronics: Components and Techniques
J. M. Hughes, Real World Instrumentation with Python
Simon Monk, Fritzing for Inventors
Matthew Scarpino, Designing Circuit Boards with EAGLE
Cattura degli schemi e layout delle PCB
Fritzing e Eagle non sono gli unici strumenti CAD per elettronica esistenti, ma sono
quelli che si incontrano pi spesso quando si scaricano schemi o layout di schede
creati e pubblicati online da altri. Fritzing gratuito e open source ed esistono molte
fonti per le definizioni delle parti oltre a quelle che include. facile da imparare e
facile da utilizzare e per i progetti Arduino una buona scelta.
La versione gratuita di Eagle ha tre funzionalit che si trovano nelle versioni
commerciali dello strumento e quindi presenta un chiaro percorso di aggiornamento
quando volete esplorare il mondo degli strumenti CAD/CAM professionali per
lelettronica. Ricordate soltanto che la versione gratuita di Eagle presenta alcuni limiti
e non pensata per essere utilizzata nelle situazioni nelle quali pensate di
guadagnare soldi per il vostro lavoro. Per quelle, dovrete acquistare una licenza
commerciale.
Alcune altre opzioni di strumenti CAD sono strumenti Linux open source come la
suite gEDA e KiCad, entrambi i quali hanno funzionalit comparabili a quelle dei
prodotti commerciali. Per ulteriori informazioni sugli strumenti menzionati qui, potete
visitare i loro siti web:
Eagle (http://www.cadsoftusa.com/download-eagle)
Fritzing (http://www.fritzing.org)
gEDA (http://www.geda-project.org)
KiCad (http://kicad-pcb.org)
Produttori di PCB
Esistono molte aziende che producono PCB e offrono prezzi bassi e tempi rapidi.
Cercate sul Web e, se per caso vivete in una grande area metropolitana,
assicuratevi anche di controllare quali servizi avete a disposizione localmente. Io ho
menzionato Advanced Circuits soprattutto perch ho una maggiore familiarit con
loro e non ho mai avuto problemi con il loro lavoro. Anche ragazzi di Fritzing.org
offrono un servizio di produzione di PCB (potete accedervi dallo strumento Fritzing):
Advanced Circuits (http://www.4pcb.com/bare-bones-pcbs)
Fritzing Fab (http://fab.fritzing.org/fritzing-fab)
Componenti
In questo libro, ho fatto riferimento a molte fonti diverse per tutto, da singoli
componenti a moduli e schede Arduino complete. Ecco alcune societ che possono
rappresentare dei punti di partenza da prendere in considerazione (ne trovate altre
nellAppendice C):
Adafruit (http://www.adafruit.com)
All Electronics (http://www.allelectronics.com)
DigiKey Electronics (http://www.digikey.com)
Mouser Electronics (http://www.mouser.com)
Newark/Element14 (http://www.newark.com)
SparkFun (http://www.sparkfun.com)
11

Progetto: un generatore di segnale


programmabile

Quasi tutti i laboratori di elettronica, che siano grandi o piccoli, hanno bisogno di
sorgenti di segnale. In alcuni casi, pu trattarsi di semplici generatori di onde sinusoidali
e in altre situazioni possono essere richiesti strumenti pi complessi come un generatore
di funzioni. Il generatore di segnale descritto in questo capitolo, mostrato nella Figura
11-1, capace di generare entrambi i tipi di output, ossia onde sinusoidali e quadre, fino
a 40 MHz.

Figura 11-1 - Un generatore di segnale DDS fatto in casa.

Ovviamente, perfettamente possibile anche acquistare un generatore di segnale. I


prezzi possono variare, a seconda dellintervallo di frequenza, delle caratteristiche e
delle funzionalit. Potete trovare kit di generatori di segnale e funzioni per prezzi che
vanno dai 6 $ ai 50 $, per un dispositivo come quello mostrato nella Figura 11-2. Allaltra
estremit della scala ci sono gli strumenti professionali che costano centinaia o migliaia
di euro o addirittura di pi (per esempio, 72.000 $ per un generatore di forme donda
arbitrarie multifunzione da 20 GHz usato).
Figura 11-2 - Il kit del generatore di funzioni FG085 (assemblato).

Anche se i kit vanno bene per generare forme donda, possono non disporre di tutte le
funzionalit o le caratteristiche che desiderate o delle quali avete bisogno. Dopo tutto,
sono stati concepiti da qualcun altro e questa persona pu avere una nozione diversa di
che cosa rende utile un generatore di segnale. Costruendovelo da soli, potete ottenere
esattamente quello che volete e potete modificarlo o espanderlo nel corso del tempo
man mano che cambiano le vostre necessit.
Una considerazione molto importante come viene generato il segnale. In altre parole, il
microcontroller sta facendo da solo tutto il lavoro, oppure delega il compito di generare
le forme donda a un IC dedicato sul circuito? Nel caso del generatore di funzioni FG085
mostrato nella Figura 11-2, come controller principale dello strumento si utilizza
ATmega168, per linterfaccia USB si utilizza un CP2101 e il segnale viene generato da
un ATmega48 e da un DAC che comprende una serie di resistenze. Questo approccio
non presenta nessun problema e permette al generatore di fare ben pi che
semplicemente generare onde sinusoidali e quadre: pu anche produrre forme donda
arbitrarie a partire da pattern di dati precaricati (cosa che pu rivelarsi molto utile). Lo
svantaggio, quando si utilizza un microcontroller per generale il segnale, che impone
un limite alla frequenza pi alta possibile che pu generare il dispositivo. Nel caso di
questo specifico generatore di funzioni, il limite si aggira sui 200 kHz. Non si tratta di un
difetto dellFG085, n di nessuno dei dispositivi che utilizzano un microcontroller in
questo modo: semplicemente un dato di fatto.
Un microcontroller pu girare soltanto a questa velocit e questa velocit massima del
clock impone un limite massimo rigido su quanto velocemente pu cambiare i suoi output
per creare un segnale ciclico. Nel caso di molte applicazioni, 200 kHz vanno bene, in
particolare nel mondo dei sensori e dei controlli incorporati. Come ho sottolineato prima,
di solito le cose non vanno molto rapidamente nel mondo reale, almeno nelle scale di
tempo in microsecondi dei microcontroller.
Se vogliamo andare oltre i 200 kHz, dobbiamo scegliere unaltra soluzione.
Fortunatamente, tutte le parti delle quali abbiamo bisogno per costruire un generatore di
segnale che possa generare onde sia sinusoidali che quadre fino a 40 MHz si trovano
facilmente come moduli compatibili con Arduino.
NOTA Trovate maggiori informazioni sullFG085 sul sito web JYE Tech (http://bit.ly/jye-fg085). Insisto che non sto
consigliando specificamente questo prodotto, ma che semplicemente ne possiedo uno che sta sul mio tavolo da lavoro
con altri dispositivi da provare. Possiedo anche altri generatori di segnale e di funzioni, alcuni interessanti e altri meno, e
tutti hanno un ruolo da giocare durante lo sviluppo e i testi di un nuovo design.

A dire la verit, adesso devo confessare che il generatore di segnale descritto in questo
capitolo finir per costare pi del dispositivo da 50 $ mostrato nella Figura 11-2. Ne
calcoleremo il costo totale quando creeremo lelenco completo delle parti in Il costo nel
dettaglio a pagina 470. Sarete voi stessi a dover decidere se il costo giustificato in
base al grado di controllo che avrete sul design e sul suo funzionamento e in base al
metodo di packaging che ho scelto. Per quanto mi riguarda, ne valeva la pena, ma nel
vostro caso potrebbe non essere cos.

NOTA Dovete ricordare che, dal momento che in questo libro lenfasi principale posta sullhardware di Arduino e sui
moduli, sensori e componenti correlati, il software qui mostrato con lunica intenzione +di sottolineare i punti chiave e
non per presentare esempi completi e pronti da eseguire. Il codice completo del software degli esempi e dei progetti si
trova su GitHub (https://www.github.com/ardnut).

Gli obiettivi del progetto


In questo progetto, le fasi di definizione e pianificazione (descritte nel Capitolo 10)
avvengono in un unico passaggio. Dal punto di vista fisico, il progetto non
specialmente complicato e quindi possiamo comprimere questi passaggi di sviluppo per
risparmiare fatica e procedere pi rapidamente. La parte pi complessa il software,
come accade spesso quando si lavora con componenti hardware modulari di
microcontroller.
Lobiettivo di questo progetto costruire un generatore di segnale adatto per essere
utilizzato come strumento di prova. Anche se perfettamente possibile utilizzare lI/O
digitale di un Arduino per generare onde quadre o impulsi, controllare un DAC di qualche
tipo, oppure utilizzare gli output PWM per creare una forma donda che simuli unonda
sinusoidale, lintervallo di frequenze di output limitato dalla velocit del microcontroller.
Esiste, tuttavia, un altro modo di utilizzare un Arduino per costruire un generatore di
segnale e che richiede un IC generatore di segnale dedicato: lAD9850.
LAD9850 un chip DDS (direct digital synthesis) che pu generare onde sia sinusoidali
che quadre. Pu essere programmato in modo che generi output da 0 a 40 MHz. Un
modulo AD9850 facilmente reperibile descritto nel Capitolo 9 e mostrato nella Figura
9-57. Dal momento che lAD9850 gestisce la generazione del segnale al posto di
Arduino, contemporaneamente possiamo utilizzare i cicli liberi della CPU per altre
funzioni. Laggiornamento di un display, il rilevamento dellingresso di controllo della
porta esterna e il monitoraggio degli input dei controlli del funzionamento sono soltanto
alcune delle cose che lArduino pu fare mentre controlla lIC DDS.
Questo significa anche che il generatore di segnale non ha bisogno di interrupt per
gestire gli interruttori di controllo. Dal momento che lAD9850 sempre attivo (eccetto
quando attiva la modalit gate), la MCU pu prendersi il tempo di interrogare i pulsanti
e non interferir con loutput del segnale.

La definizione e la pianificazione
Lobiettivo di questo progetto creare uno strumento di test portatile da utilizzare sul
tavolo da lavoro oppure in un ambiente simile. Sar alimentato da una presa da parete e
la custodia offrir spazio sufficiente per aggiungervi batterie in seguito, se lo si desidera.
Output del segnale:
Output di onde sinusoidali (sempre attivo), da 0 a 40 MHz, da 0 a 1 V P-P
Output di onde quadre (sempre attivo), da 0 a 40 MHz, da 0 a 5 V P-P
Input di controllo funzionale:
ingresso di controllo della porta esterna
Input di controllo della tensione per il funzionamento del VCO
Interfaccia utente e controlli:
Display LCD da due righe
Input select di frequenza (pulsanti)
Controlli del livello degli output del segnale output
Jack dellingresso della porta
Connettore BNC dellingresso CV
Accensione/spegnimento
Lintero progetto sar costruito in una custodia di plastica con maniglia per trasportarla,
come quella mostrata nella Figura 11-3. Il dispositivo sar alimentato da una presa sulla
parete con un output tra 9 e 12 V DC.

Figura 11-3 - La custodia portatile dello strumento.


Sul pannello frontale, il generatore di segnale incorporer un display LCD da due righe
che mostri la frequenza di output e lo stato, vari controlli di ingresso, ingresso CV
(Control Voltage) e la porta di ingresso e output sia di onde sinusoidali (1 V P-P) sia di
onde quadre (5 V P-P). Sul pannello posteriore ci sar un connettore DC cilindrico per
collegare un alimentatore esterno.
Lelenco delle parti iniziali di questo progetto fornito nella Tabella 11-1. Perfezioneremo
questo elenco di parti man mano che procediamo, ma vi offre unidea di quello che
utilizzeremo. Un primo elenco di parti di solito subisce una serie di modifiche tra il
momento del concepimento alla forma finale, alcune di minore importanza e altre
piuttosto drastiche. Questo fa parte del processo di perfezionamento.
Tabella 11-1 - Lelenco iniziale delle parti.

Quantit Descrizione Quantit Descrizione


1 Arduino Uno 3 Connettori BNC femmina
Jack a banana (per la porta
1 Modulo DDS AD9850 2
di ingresso)
Alimentatore da collegare
1 Shield di prototipazione 1
alla parete
1 Display LCD da due righe 1 Contenitore di plastica

Il design
Adesso che abbiamo definito gli obiettivi del design e un primo elenco di parti, possiamo
cominciare a perfezionare il design. Cominceremo con la funzionalit che abbiamo
pensato per definire che cosa far esattamente il dispositivo e i controlli e gli I/O
necessari per svolgere le funzioni previste.
Dopo esserci fatti unidea chiara di che cosa dovr fare il generatore di segnale,
possiamo dirigere la nostra attenzione alla custodia, dal momento che questa dove
verranno montate le parti e quello che alla fine determiner che cosa potremo utilizzare
per un display, gli input dei controlli e i connettori I/O. Qui, lobiettivo trovare un
equilibrio tra la necessit di una custodia robusta e compatta e le considerazioni relative
al costo e produzione.
Dal momento che il progetto utilizza soprattutto moduli precostruiti, non sono necessari
speciali design di circuiti n layout di PCB. I vari moduli e connettori del segnale
dovranno essere collegati e quindi dovremo saldare qualcosa, ma lo vedremo nel
passaggio relativo allassemblaggio.
Per gli input dei controlli del generatore di segnale, io ho scelto di utilizzare pulsanti,
anzich un encoder rotativo come nel caso del design di alcuni generatori di segnale
DDS che si trovano su vari siti web come Instructables (http://www.instructables.com/).
Il motivo il fatto che lencoder rotativo, anche se si rivela comodo per impostare
rapidamente un valore, in realt fa soltanto una cosa: misurare la quantit e la direzione
della rotazione. I pulsanti, invece, possono fare diverse cose, a seconda di come
vengono interpretati dal software nel contesto con altri controlli e dello stato dei
dispositivi che devono controllare.

Le funzionalit
Lo scopo principale di questo strumento generare un segnale a una frequenza
specifica compresa tra 0 e 40 MHz. LAD9850 incorpora un comparatore integrato che
si utilizza per creare unonda quadra simultanea. Londa sinusoidale un segnale da 1 V
P-P (peak-to-peak) quella quadra una da 5 V P-P. La frequenza di output
continuamente variabile da 0 a 40 MHz sotto il controllo di un Arduino Uno. La frequenza
di output pu essere variata esternamente dallapplicazione di un CV (control voltage) e
pu essere azionata (o gated) da un segnale esterno (che sia active high oppure active
low). La Figura 11-4 mostra un diagramma a blocchi dello strumento con tutti i
componenti identificati nella Tabella 11-1.

Figura 11-4 - Il diagramma a blocchi del generatore di segnale.

Il diagramma a blocchi della Figura 11-4 mostra tre componenti principali. LArduino
gestisce gli input dei controlli: quelli forniti dallutente cos come la porta di ingresso e
lingresso CV. Il display LCD mostra lo stato corrente dello strumento e il modulo DDS
genera gli output di onde sinusoidali e onde quadre.
Il diagramma a blocchi non offre dettagli di basso livello come i numeri e le polarit dei
pin. Questo non il suo scopo. Un diagramma a blocchi mostra in modo grafico come si
relazionano le cose luna con laltra dal punto di vista funzionale. Serve anche per
controllare se le ambizioni del design hanno superato le capacit dei componenti.
Ho organizzato la Figura 11-4 in modo che gli output stiano sulla destra e gli input dei
controlli sulla sinistra. Il grande simbolo circolare rappresenta un connettore di tipo BNC
per i cavi coassiali schermati, mentre quello pi piccolo rappresenta un jack del tipo a
banana.
Un display LCD da 2 righe e 16 caratteri mostrer la frequenza e lo stato correnti dei la
porta di ingresso e dellingresso CV. Una serie di pulsanti servir a regolare la frequenza
e il funzionamento degli input dei controlli esterni. Due potenziometri serviranno a
regolare il livello di output dei segnali di onde sinusoidali e quadre.

La custodia
Per questo progetto, ho scelto la custodia Bud Industries IP-6130, che mostrata nella
Figura 11-3. Questa custodia include una maniglia per trasportarla, che si pu anche
piegare in modo che funga da supporto quando lo strumento si trova sul tavolo da
lavoro, cosa che a volte si rivela molto utile. Potete scaricarne la scheda tecnica da
Mouser Electronics (http://bit.ly/mouser-ip-6130). La custodia costa circa 25 $, ma io
lho ritenuto un prezzo ragionevole da pagare per qualcosa che deve durare a lungo e
offrire un aspetto professionale. Le dimensioni di base sono mostrate nella Figura 11-5.
Per maggiori dettagli, potete consultare la scheda tecnica del prodotto.

Figura 11-5 - Le dimensioni della custodia portatile dello strumento.

Una cosa da notare che i pannelli anteriore e posteriore non sono perfettamente
rettangolari: sono pi stretti sul bordo superiore che su quello inferiore, per adattarsi alla
pendenza dei lati della custodia. Questo non un problema, ma importante notarlo
perch i pannelli anteriore e posteriore si monteranno correttamente soltanto in
unorientazione. Tagliare i fori dei pannelli soltanto per scoprire che sono al contrario non
sarebbe un disastro totale, ma potrebbe risultare imbarazzante (almeno per me). Le viti
che tengono insieme la met superiore con quella inferiore devono essere coperte con
gommini protettivi che si trovano sul fondo della custodia.
Notate anche che i pannelli anteriore e posteriore non presentano unaltezza sufficiente
per poter montare su un Arduino e una pila di shield direttamente allinterno dei pannelli.
Il modelloIP-6131 pi alto (3,54 pollici/8,99 cm), ma al suo interno rimarrebbe
moltissimo spazio verticale vuoto. Quindi, io ho deciso di montare lLCD, i connettori
input/output e i controlli sul pannello anteriore, collocare lArduino e il generatore DDS
sul fondo della custodia e montare il jack per lalimentazione esterna sul pannello
posteriore. Questa soluzione lascia allinterno spazio sufficiente per un alimentatore o
delle batterie (se dovessi decidere di includere una o entrambe queste cosa). La Figura
11-6 mostra il layout del pannello anteriore.

Figura 11-6 - Il layout del pannello anteriore del generatore di segnale.

Unaltra cosa da prendere in considerazione sono i pulsanti che si utilizzano come input
dei controlli. Un modulo con una serie di piccoli pulsanti con tappi quadrati di basso
profilo non una cosa che si trova facilmente in commercio. Nella maggior parte dei
casi, si tratta di assemblaggi personalizzati creati per un prodotti specifico. Dal
momento che non abbiamo intenzione di avventurarci in una produzione di massa, non
ha senso investire tempo e denaro per progettare e costruire un modulo personalizzato
con una serie di 3 2 interruttori e quindi quello che finir sul pannello anteriore potr
non assomigliare a quello che si vede nella Figura 11-6. Ma va bene lo stesso:
funzioner ugualmente, a prescindere quali pulsanti utilizzeremo.

Lo schema
Osservando la Figura 11-4, possiamo vedere che sembra che si stiano utilizzando quasi
tutti i pin disponibili su Arduino. Ed effettivamente cos, dal momento che non sono
assegnati soltanto i pin A4 e A5. Con lLCD, il DDS e gli interruttori di controllo collegati
verranno utilizzati tutti i pin I/O digitali discreti e per lI/O digitale dovranno essere
utilizzati anche alcuni degli input analogici. Questo mostrato nello schema della Figura
11-7.
Figura 11-7 - Lo schema del generatore di segnale.

La Tabella 11-2 elenca i pin di Arduino e le assegnazioni nel generatore di segnale.


Qualsiasi ulteriore espansione dellI/O dovr essere effettuata utilizzando shield con
uninterfaccia I2C per mezzo dei pin A4 e A5.
Tabella 11-2 - Lutilizzo dei pin di Arduino nel generatore di segnale.

Pin Funzione Pin Funzione Pin Funzione


D0 DDS FQ_UP D7 LCD E A0 Pulsante selezione
D1 DDS W_CLK D8 Range + pulsante A1 Pulsante modalit
D2 LCD D4 D9 Range pulsante A2 Porta di ingresso
D3 LCD D5 D10 Freq + pulsante A3 Ingresso CV
SDA per
D4 LCD D6 D11 Freq pulsante A4
espansione I/O
SCL per
D5 LCD D7 D12 DDS RST A5
espansione I/O

Il modulo DDS che voglio utilizzare per questo progetto mostrato nella Figura 9-57 del
Capitolo 9. Si trova presso diversi rivenditori, tra i quali DealeXtreme (http://bit.ly/dx-
ad9850), per circa 8 $. La Figura 11-8 mostra il diagramma del pinout del modulo.
Figura 11-8 - Il pinout del modulo DDS AD9850.

LAD9850 supporta sia linterfaccia binaria parallela che seriale. In questa applicazione,
lArduino comunicher con il modulo DDS utilizzando la modalit dellinterfaccia seriale.
Per i dati, questa modalit utilizza il pin D7 sul modulo DDS.
Il modulo LCD ha 16 posizioni di pin, da collegare alla messa a terra, allalimentazione e
ai dati e ai segnali di controllo degli IC controller dellLCD, che si trovano sul retro della
PCB sotto gocce di di resina epossidica nera. La Figura 11-9 mostra le definizioni dei
pin del modulo LCD.
Figura 11-9 - Il pinout del modulo LCD.

Il prototipo
Questo progetto utilizza componenti pronti per luso e per sviluppare il software si rivela
utile un prototipo costruito a partire dalle stesse shield e dagli stessi moduli. Se state
aspettando che vi arrivino le parti, potete procedere con il software con un prototipo che
funzioni in modo simile. Per questo progetto utilizzer una configurazione di prova che
consiste di un Arduino Uno montato su una base di legno, come mostra la Figura 11-10.
Figura 11-10 - Un prototipo di Arduino.

Nel prototipo utilizzo un Arduino Uno, una PCB con una serie 5 4 di pulsanti in
miniatura che includono anche 8 LED, una coppia di estensori di terminali a vite, una
shield di prototipazione con montato un modulo DDS e il modulo LCD che aggiungeremo
nello strumento finale. I pulsanti serviranno per gli input dei controlli del generatore di
segnale. I quattro rel mostrati nella Figura 11-10 non si utilizzano in questo progetto e
quindi non sono collegati. Le connessioni con Arduino sono identiche a quelle mostrate
nella Figura 11-7.

Gli input dei controlli e le modalit


Sul pannello anteriore ci sono sei pulsanti. La Tabella 11-3 mostra come sono assegnati
alle varie funzioni.
Tabella 11-3 - Le funzioni dei pulsanti di controllo del generatore di segnale.

Modalit:
Pulsante Modalit: Gate Modalit: CV
Frequenza
Freq Inc frequency Gate on CV enable
Freq Dec frequency Gate off CV disable
Intervallo Inc freq range Gate CV zero set
Range Dec freq range Gate CV zero reset

Il generatore di segnale ha tre modalit di input dei controlli. Nella Tabella 11-3
possiamo vedere che in realt ci sono 12 possibili input dei controlli, a seconda della
modalit. Il pulsante Select non mostrato, perch utilizzato come se fosse il tasto
Invio: premendo il pulsante Select, si uscir dalla modalit di input per i controlli gate o
CV e si riporter lo strumento alla normale modalit di funzionamento di intervallo e
frequenza.
Loutput delle forme donda sempre attivo, a meno che non venga bloccato dalla
modalit gate. La frequenza e lintervallo possono essere alterati in qualsiasi momento
quando lo strumento non si trova nella modalit gate. Premendo i pulsanti Freq + o Freq
e quindi rilasciandolo, si far s che la frequenza cambi di 1 Hz. Quando i pulsanti Freq
+ o Freq sono mantenuti premuti, il valore cambia per incrementi (o decrementi) di 10,
100 o 1.000 (a seconda del valore corrente) finch il pulsante non viene rilasciato.
Loutput della frequenza del generatore suddiviso in intervalli, ciascuna dei quali
abbraccia 10.000 Hz. Quindi se lintervallo 1 va da 0 a 9.999 Hz, lintervallo 2 andr da
10.000 a 19.999 Hz e cos via. Lutilizzo dei controlli dellintervallo non obbligatorio. La
ragione principale per includere questi controlli permettere ai controlli Freq + e Freq
di regolare loutput in incrementi maneggevoli allinterno di un determinato intervallo.
Altrimenti, lutente dovrebbe premere i pulsanti Freq + o Freq per un po per
raggiungere la frequenza desiderata. La frequenza di output viene aggiornata
continuamente e quindi non c bisogno di premere il pulsante Select.
Lintervallo pu essere un valore qualsiasi compreso tra 1 e 4.000. Se la frequenza
incrementata oltre il termine di un intervallo, il numero dellintervallo si incrementa
automaticamente. Se la frequenza viene decrementata al di sotto del valore minimo
dellintervallo attuale, il valore dellintervallo viene decrementato di 1. Lintervallo si
incrementer o decrementer automaticamente in passaggi di 10, 100 o 1.000, proprio
come linput dei controlli della frequenza.
Le impostazioni di CV e gate si modificano passando lo strumento nella modalit di input
dei controlli appropriata. Il pulsante Mode seleziona la modalit di input dei comandi e il
pulsante Select rende attiva limpostazione attuale e riporta lo strumento nella modalit
operativa normale.
Quando il gate attivo, il generatore non produce nessun output finch la condizione di
gate selezionata presente sul la porta di ingresso. I pulsanti Freq + e Freq si
utilizzano per attivare o disattivare il gate. I pulsanti Range + e Range selezionano la
modalit gate sense: rispettivamente, active high o active low.
Il CV (control voltage) input una tensione analogica compresa tra 0 e 5 V DC, dove
2,5 V il punto zero nominale (non si utilizzano tensioni negative). Nella modalit CV, i
pulsanti Freq + e Freq attivano o disattivano lingresso CV. Il punto zero pu essere
cambiato selezionando la modalit CV e premendo il pulsante Range +. Il pulsante
Range resetta il punto zero del CV sul valore predefinito di 2,5 V.
Una volta attivato, lingresso CV attivo finch non viene esplicitamente disattivato. Una
tensione di input al di sopra del punto zero far s che la frequenza di output aumenti,
mentre una tensione di input al di sotto punto zero far s che la frequenza di output si
riduca. Per impostare il punto zero, si applica la tensione desiderata allingresso CV e si
preme il pulsante Range +. Disattivando lingresso CV non si altera limpostazione del
punto zero.

La visualizzazione delloutput
Una grande sfida con qualcosa che utilizza un display minimo scoprire come utilizzarlo
in modo efficace per visualizzare le informazioni in una forma condensata. LLCD che
utilizziamo per il generatore di segnale ha due righe di posizioni indirizzabili con 16
caratteri ciascuna. La Figura 11-11 mostra come ho scelto di inserire le informazioni
essenziali sul display durante il funzionamento.

Figura 11-11 - Il layout del display del generatore di segnale.

Quando il generatore di segnale si trova in una modalit qualsiasi che non sia loutput
della frequenza, i due punti che seguono la lettera relativa alla modalit lampeggiano.
Quindi, se si trova nella modalit CV, lampeggiano i due punti dopo il carattere C e quelli
dopo il carattere G lampeggiano quando si trova nella modalit gate.
Premendo linterruttore Mode, si passa ciclicamente e ripetutamente tra Gate, CV e
input dei controlli off (funzionamento normale). Le funzioni C e G possono essere
alterate soltanto quando attiva la modalit di controllo associata. Una volta mostrato il
valore desiderato, il pulsante Select imposta loutput sulla configurazione visualizzata e
lo strumento riprende il funzionamento normale.
Il campo G (gate) mostrer X, +, oppure , a seconda dello stato della funzione gate. Il
simbolo + significa che il gate attivo su un input high, mentre il simbolo significa che il
gate risponder a un input low. X significa che la funzione gate disattivata. Le
impostazioni del gate diventeranno attive quando si premer il pulsante Select.
Il campo C (CV) moster X, 0, +, oppure . Mostrer + se la funzione CV attiva e la
tensione di controllo dellinput maggiore del punto zero, - se CV attiva e la tensione
di controllo inferiore al punto zero e 0 se CV attiva e la tensione di controllo uguale
al punto zero. I simboli 0, + e vengono aggiornati in tempo reale quando viene attivato
lingresso CV. X significa che lingresso CV disattivato. Le impostazioni del CV
diventeranno attive quando si premer il pulsante Select.
In molti sensi, questo un ritorno ai tempi quando molti dispositivi erano dotati di display
piccoli. Prima dellavvento dei display LCD e TFT ad alta risoluzione, si vedevano
spesso display piccoli come questo, se mai se ne utilizzava uno. Prima dellintroduzione
dei display LED alfanumerici, questo lo si sarebbe fatto utilizzando soltanto numerali e
interpretare alcuni di questi vecchi display era sicuramente difficile. Per fortuna, adesso
possiamo comprare piccoli ed economici componenti LCD alfanumerici, ma ancora
necessaria un po di creativit per il layout dei dati e un certo grado di interpretazione.

Il modulo DDS
Il modulo DDS AD9850 montato su una shield di prototipazione, come mostrato nella
Figura 11-12. Questo opzionale ed possibile montarlo semplicemente sul fondo della
custodia e utilizzare fili per collegarlo. Io, per, vi consiglio la shield, perch fornisce una
base robusta per il modulo e permette di utilizzare terminali a vite. Questo un modo
molto pi ordinato di creare le connessioni che non saldare ed molto pi affidabile che
collegare ponticelli.

Figura 11-12 - La shield di prototipazione del modulo DDS.

Tutta la shield DDS formata dalle parti elencate nella Tabella 11-4.
Tabella 11-4 - Lelenco delle parti della shield di prototipazione DDS.
Quantit Descrizione
Shield di prototipazione, Adafruit #51 o
1
equivalente
Morsettiera a vite da 8 posizioni e 0,1
1
pollici (2,54 mm)
1 Pin socket header da 6 posizioni
1 Modulo DDS AD9850

Gli input del modulo DDS sono collegati al pin socket da sei posizioni e gli output sono
collegati alla morsettiera da otto posizioni. Lalimentazione e la messa a terra sono
fornite dalla shield di prototipazione. I LED per adesso non sono utilizzati, ma uno pu
essere collegato allalimentazione e laltro allinput D7 (D13 sullArduino). La Figura 11-
13 mostra come i vari segnali e le varie linee dei moduli DDS si collegano sulla shield di
prototipazione.

Figura 11-13 - I segnali della shield di prototipazione DDS.

La morsettiera della PCB e il pin socket headerda sei posizioni si collegano sulla parte
inferiore della shield di prototipazione. Io ho utilizzato un filo da 28 AWG, ma va bene
qualsiasi filo tra i 24 e i 32 AWG. Per le connessioni tra i pin del modulo e la
morsettiera, non ho utilizzato cavi schermati, ma pu valere la pena farlo, specialmente
ad alte frequenze.
Per gli input dei controlli del DDS avrei preferito non utilizzare un socket header, ma,
vista la mancanza di spazio sulla shield di prototipazione, non rimanevano molte
alternative. Nellassemblaggio finale, ho utilizzato alcuni jumper esistenti e ho tagliato le
estremit che sarebbero andate nei terminali a vite per i segnali di controllo di Arduino.
Nella versione finale, questi fili verranno fissati al socket header con un po di gomma
siliconica trasparente.

Il software
Il software del generatore di segnale strutturato nel modo convenzionale per le
applicazioni di Arduino, con una funzione setup() e una funzione loop(). La funzione
setup() gestisce le modalit dei pin I/O e altre configurazioni, mentre la funzione loop()
gestisce gli input dei controlli e gli output del segnale. Il generatore di segnale si
discosta da uno sketch convenzionale per il modo nel quale organizzato. composto
di diversi file sorgente (sei in tutto) con file include (cio, header) associati.

Aumento di complessit e interfaccia


Anche se dal punto di vista concettuale questo progetto pu sembrare semplice, il software presenta un grado
sorprendentemente alto di complessit. Perch? Per via dellinterfaccia di controllo. Gli sviluppatori e gli
ingegneri software che lavorano regolarmente con software orientato alla GUI vi hanno molta familiarit, dal
momento che spesso il 70% o pi del codice dedicato soltanto alla gestione della GUI. Questo anche il
motivo per il quale le utility a linea di comando che si trovano sui sistemi Unix o Linux tendono a essere
funzionalmente potenti e allo stesso tempo molto compatte: non c il peso di una GUI con la quale lottare, ma
soltanto linterfaccia a linea di comando.
Anche le applicazioni con microcontroller vedono aumentare lesperienza dellinterfaccia quando deve essere
implementato del codice che permetta al sistema di interagire con un utente umano. Gli umani tendono a essere
lenti, disattenti e non molto bravi a ricordare e utilizzare codici di comando compatto o a interpretare risposte
criptiche. Per questo, alcune parti (spesso molte) del software della MCU devono essere dedicate alla creazione
di uninterfaccia utente con la quale possa interagire in modo effettivo un umano normale.
In alcuni design, questo si risolve eseguendo linterfaccia utente su un sistema host separato dove cose come la
memoria limitata e velocit ridotte del clock della CPU non sono un problema e quindi utilizzando un interfaccia
compatta ed efficiente per le macchine per passare comandi, parametri e dati di stato tra lhost e la MCU. Con
questo progetto, questo sempre stato un approccio possibile, ma linconveniente che limita la portabilit del
dispositivo della MCU, perch dipender sempre dal sistema host con linterfaccia utente. In alcune applicazioni,
questo non un grosso problema, come nel caso di dispositivi di controllo e rilevamento in remoto che si
trovano installati in luoghi permanenti, collegati a un computer di controllo centrale. Tuttavia, il generatore di
segnale che stiamo costruendo qui pensato per essere uno strumento di test portatile e quindi ha bisogno di
disporre almeno di uninterfaccia utente essenziale incorporata nel suo design.
La sfida quindi diventa trovare un modo per ottenere il massimo della funzionalit possibile con un numero
limitato di input dei controlli, inserire la massima quantit di informazioni utili in un display decisamente limitato e
fare tutto ci senza interferire con le operazioni principali dello strumento o senza consumare troppa della
memoria flash disponibile che il software non riesce a caricare nella MCU.

Il software per controllare il DDS in realt non fa altro che leggere la porta di ingresso o
lingresso CV e quindi scrivere i giusti dati di controllo sullIC DDS. La parte difficile
come mappare gli input dei controlli in modo che ci permettano di controllare come e
quando avvengono queste azioni. Come nel caso di qualsiasi altro dispositivo dotato di
microcontroller, il software che offre la funzionalit desiderata. Senza il software, non
altro che una massa di plastica, fili, schede a circuito e un po di silicio.

Lorganizzazione del codice sorgente


Il codice del generatore di segnale contenuto in diversi file sorgente. Quando lIDE di
Arduino apre il file principale, sig_gen.ino, apre anche gli altri file che si trovano nella
stessa directory. I file secondari sono collocati in schede dellIDE, come mostra la
Figura 11-14.

Figura 11-14 - LIDE di Arduino dopo aver caricato lo sketch sig_gen.ino.

Il codice del generatore di segnale strutturato in modo tale che le variabili globali si
trovino in un modulo di compilazione separato, sig_gen_gv.cpp. Anche lLCD, gli input
dei controlli, le funzioni CV (control voltage) e gate si trovano in moduli separati. La
Tabella 11-5 elenca i moduli sorgente e le loro rispettive funzioni.
Tabella 11-5 - I moduli del codice sorgente del generatore di segnale.

Modulo Funzione

sig_gen.ino Modulo principale che contiene setup() e


loop()

sig_gen.h Definizioni delle costanti (dichiarazioni


#define)
Elaborazione dellinput dei pulsanti di
sig_gen_control.cpp
controllo
sig_gen_control.h File include
sig_gen_cv.cpp Elaborazione dellingresso CV
sig_gen_cv.h File include
sig_gen_gate.cpp Elaborazione della porta di ingresso
sig_gen_gate.h File include
sig_gen_gv.cpp Variabili globali
sig_gen_gv.h File include
sig_gen_lcd.cpp Funzioni LCD
sig_gen_lcd.h File include

NOTA Notate che gli oggetti LCD e DDS si istanziano utilizzando loperatore C++ new nel file sig_gen_gv.cpp. Questo
possibile perch le variabili ancora degli oggetti, lcd e ddsdev, sono definite nel modulo delle variabili globali ed
esportate in sig_gen_gv.h. Perch questo funzioni, il modulo principale deve contenere le dichiarazioni include di
LiquidCrystal.h e DDS.h e le stesse dichiarazioni include devono apparire anche nel file delle variabili globali. Per via di
unirregolarit nel modo nel quale lIDE di Arduino gestisce le dichiarazioni di scoping e include, tutti i riferimenti a una
libreria esterna inclusi nel file di una scheda devono essere inclusi anche nel file principale. Notate anche che i moduli
ausiliari contengono la dichiarazione #include "Arduino.h" per permettersi luno allaltro di accedere allambiente di
Arduino. Loperatore new descritto nel riquadro Istanziare oggetti di classe con new a pagina 103 nel Capitolo 5.

La descrizione del software


Il codice del generatore di segnale abbastanza lungo e quindi, anzich provare a
elencarlo tutto qui, mi concentrer sulle sezioni principali e sui alcuni dei punti pi
importanti, utilizzando diagrammi di flusso e porzioni di codice. Vi suggerisco di
scaricarvi il codice sorgente da GitHub (https://github.com/ardnut) e di esaminarlo
mentre leggete questo testo.
Il modulo sig_gen.h una raccolta delle costanti #define utilizzate nel programma. Le
dichiarazioni #define permettono di fare riferimento a valori evitando di avere numeri
crudi che se ne vanno a spasso per il codice. Questo rende pi facile cambiare
qualcosa, come una posizione sullLCD o un ritardo di tempo utilizzato in diversi punti,
senza dover cercare ogni istanza del valore crudo. Applicando le modifiche
manualmente, facile mancarne una o due, mentre con il file #define possiamo
assicurarci che tutte assumeranno il valore desiderato. Possiamo, naturalmente,
utilizzare anche la dichiarazione C++ const, ma, come abbiamo visto nel Capitolo 5, le
dichiarazioni #define consumano meno memoria.
Il file sig_gen_gv.cpp contiene la dichiarazione delle variabili globali. I contenuti di
sig_gen_gv.cpp sono mostrati nellEsempio 11-1. Dal momento che sig_gen_gv.cpp
un codice sorgente eseguibile, pu contenere dichiarazioni di inizializzazione.

Esempio 11-1 - Le variabili globali.


Notate che sono presentati due metodi diversi di creare oggetti globali. Il primo utilizza
la dichiarazione new e il secondo utilizza lassegnazione dei puntatori. Dal punto di vista
della funzionalit, il risultato finale effettivamente lo stesso, ma lutilizzo della memoria
leggermente diverso.
Il file include sig_gen_gv.h contiene le dichiarazioni di esportazione. La dichiarazione
export dice al compilatore che queste variabili saranno utilizzate da altri moduli e quindi,
quando viene compilato un modulo che fa riferimento a una variabile dichiarata nel file
sig_gen_gv.h, vengono creati dei segnaposto. Il linker metter tutto insieme quando
verr costruita limmagine eseguibile finale.
Loutput del generatore di segnale controllato da una serie di variabili globali che
contengono la frequenza e i valori di intervallo correnti, oltre allo stato delle funzioni gate
e CV. Nei sistemi integrati, questo un approccio comune, specialmente in situazioni
dove disponibile moltissima RAM dove salvare grandi quantit di dati nello stack.
Anzich passare moltissimi argomenti alle funzioni, si utilizzano variabili globali come un
tipo di spazio di memoria condiviso. La chiave per utilizzare le variabili globali in modo
efficace applicare il pi possibile la regola scritto da uno, letto da molti. In un piccolo
sistema con soltanto un programma attivo, non molto frequente la situazione nella
quale una variabile modificata da due processi contemporaneamente, ma in
applicazioni multithreaded questa una possibilit reale.
Dal momento che stiamo utilizzando la struttura convenzionale setup() e loop()
proposta dallIDE di Arduino, la prima funzione importante che ci interessa start(). La
Figura 11-15 mostra un diagramma di flusso dettagliato di setup().
Figura 11-15 - Il diagramma di flusso della funzione setup().

La funzione setup() (Esempio 11-2) semplice. Inizializza loggetto LCD, mostra un


messaggio di avvio, inizializza gli input digitali dei pulsanti di controllo, fa apparire
Ready sullLCD e infine scrive i campi relativi alla frequenza, al gate, allintervallo e al
CV sullLCD. Questi non cambieranno per il resto del tempo durante il quale il
generatore di segnale rimarr attivo.

Esempio 11-2 - La funzione setup() del generatore di segnale.


Nelle funzioni TitleDisp1() e TitleDisp2() si utilizzano le chiamate a un ritardo per
rallentare le cose, in modo che il testo di avvio non lampeggi troppo rapidamente e
possa essere letto dallutente.
La funzione InitLCDFields(), che si trova nel file sig_gen_lcd.cpp e viene chiamata da
setup(), scrive i campi statici sullLCD dopo che avvenuta laccensione. Pu essere
chiamata diverse volte da diversi punti del codice, secondo necessit.
Il ciclo principale del software esegue quattro passaggi principali:
1. Controlla gli input dei pulsanti di controllo.
2. Controlla lingresso CV (se attivato).
3. Controlla la porta di ingresso (se attivato).
4. Aggiorna la frequenza di output.
I passaggi 1 e 2 comportano lanalisi delle stringhe dei comandi provenienti dal PC host
e la decodifica dei pulsanti di controllo in base alla modalit corrente. Questa la parte
pi complessa del software. I passaggi 2 e 3 si limitano a controllare gli input per
determinare che cosa cambia nelloutput, se avviene qualche modifica. Il passaggio 4
scrive i dati di controllo sullAD9850 dopo aver eseguito un semplice calcolo. La Figura
11-16 mostra un diagramma di flusso ad alto livello di loop().
Figura 11-16 - Un diagramma di flusso ad alto livello del generatore di segnale (funzione loop()).

Il codice sorgente della funzione loop(), elencato nellEsempio 11-3, appare semplice
perch tutte le funzionalit si trovano nei moduli ausiliari. Quando viene chiamata
ciascuna delle funzioni, imposta o legge le variabili globali.

Esempio 11-3 - La funzione loop() del generatore di segnale.


Loutput dei controlli sul modulo DDS lultima cosa che il ciclo principale esegue prima
di applicare un ritardo di MAIN_DLY millisecondi e ripartire. La frequenza di output, fval,
viene modificata dallingresso CV per mezzo di RunCV() se CV attivo e pu essere
impostata su on oppure su off dalla funzione RunGate() se quella modalit operativa
attiva. I dati del DDS vengono scritti dopo un numero DDS_LOAD_GO di iterazioni di loop()
per dare al modulo il tempo di elaborare i dati dei controlli provenienti da Arduino.
Lintervallo di aggiornamento della frequenza uguale a DDS_LOAD_GO volte MAIN_DLY
millisecondi. Se modifichiamo il valore di MAIN_DLY possiamo dover modificare anche
DDS_LOAD_GO.

Il file sorgente pi lungo sig_gen_control.cpp. Questo contiene il codice per rilevare


lattivit degli interruttori degli input dei controlli, per eseguire il debounce degli input
degli interruttori, per determinare se un pulsante tenuto premuto dallutente e
impostare la modalit degli input dei controlli
Dal punto di vista elettrico, gli interruttori tendono a rivelarsi rumorosi. Per compensare
questo, il generatore di segnale incorpora una semplice funzione di debounce, come
mostra lEsempio 11-4.

Esempio 11-4 - La funzione di debounce.


Lidea che sta dietro debounce() determinare se un interruttore ha mantenuto lo
stesso stato tra due campioni di input. In caso affermativo, linterruttore si considera
ancora in quello stato, altrimenti significa che si verificato un errore. Lintervallo di
tempo del test, DBDLY, definito in sig_gen.h e ha un valore iniziale pari a 10 ms.
Questo pu essere incrementato per migliorare laffidabilit del debounce, ma se lo si
aumenta troppo gli input dei controlli possono cominciare a rispondere con lentezza,
conseguenza che pu non essere desiderabile.
La funzione readControls() analizza i sei interruttori dei pulsanti di input. Se stato
premuto un interruttore, incrementa il valore di un conteggio ogni volta che loop()
chiama readControls(). Se il conteggio supera un valore predeterminato (definito come
HOLD_CNT in sig-gen.h), linput viene contrassegnato come ancora premuto impostando
la variabile globale btnhold su true. Ricordate che loop() viene eseguito ogni MAIN_DLY
millisecondi.
La funzione getFreq() gestisce la frequenza. Incrementa o decrementa
automaticamente la frequenza in passaggi di 10, 100 o 1.000 Hertz. Anche il valore
dellintervallo viene regolato automaticamente quando la frequenza supera un limite
impostato su RSTEP Hertz.
La funzione SetMode() cambia la modalit di controllo corrente dello strumento se il
pulsante Mode viene premuto e rilevato da readControls(). Passa in rassegna le tre
modalit di controllo (normale, gate e CV) finch il pulsante rimane premuto. Il
comportamento delle modalit gate e CV pu essere alterato soltanto quando attiva la
modalit corrispondente.
Il codice sorgente completo del generatore di segnale disponibile su GitHub
(https://github.com/ardnut), commentato e auspicabilmente facile da capire.

La libreria DDS
Con il codice sorgente del generatore di segnale, stata inclusa una semplice libreria
per il modulo DDS. Per installare la libreria DDS basta creare una directory di nome
DDS nella propria directory sketchbook/libraries e inserirvi DDS.cpp e DDS.h. La
libreria DDS apparir nella casella combinata delle librerie dopo il riavvio dellIDE (o
immediatamente nelle versioni pi recenti dellIDE). Potete notare che tra i file della
sottodirectory della libreria DDS non c nessun README, n nessun keywords.txt.
Questa classe cos semplice che non ne ho visto la necessit.
La libreria DDS utilizzata con il generatore di segnale illustra alcuni dei concetti della
creazione di librerie personalizzate che sono stati presentati nel Capitolo 5. Si tratta di
una classe semplice, che gestisce i calcoli necessari per creare il data word di controllo
utilizzato dallAD9850. Il file DDS.h, mostrato nellEsempio 11-5, contiene la definizione
della classe.

Esempio 11-5 - La classe DDS.

Dopo che loggetto DDS stato istanziato, se vogliamo migliorare la precisione del
generatore di segnale possiamo passarvi un coefficiente di calibrazione. Per vedere
come si calcola questo valore, potete consultare la scheda tecnica dellAD9850. In
questa classe, presenta semplicemente il valore predefinito 0.
Oltre al costruttore delloggetto e alla funzione calibrate(), lunico altro metodo
utilizzato dal codice al di fuori della classe la funzione setFrequency(). La frequenza
espressa in Hertz. La word di controllo calcolata viene spostata sullIC DDS un bit alla
volta.

I test
Dando per scontato che il prototipo sia collegato correttamente, dobbiamo riuscire a
compilare e a caricare il software su Arduino Uno. Allavvio, il display mostra DDS
Signal Gen e Initializing, seguito da Ready e quindi dai campi relativi ai dati.
Possiamo regolare i tempi di ritardo per fare in modo che il testo di avvio rimanga sul
display pi a lungo oppure eliminarlo completamente. Siete liberi di scegliere.
SUGGERIMENTO Quando il generatore di segnale collegato come mostrato nella Figura 11-7, si pu utilizzare la
libreria Serial. La libreria assume il controllo dei pin Rx e Tx (D0 e D1, rispettivamente) e li rende high. Questo confonde
il DDS 9850 e non genera nessun output. La libreria Serial va bene per il debug degli input dei controlli, che quello che
ho fatto, ma non deve essere istanziata quando collegato il DDS. Potete sempre modificare le assegnazioni dei pin
analogici e digitali in modo da utilizzare A4 e A5 per gli input degli interruttori dei controlli e liberare D0 e D1 per lI/O
seriale, ma in questo progetto io non ho visto la necessit di farlo. Linterfaccia USB funziona bene per caricare nuovo
software su Arduino, se necessario, anche con il modulo DDS collegato.

Il codice preconfigurato in modo che generi un output di 1.000 Hz quando viene


alimentato il prototipo. Questo pu essere un valore qualsiasi a vostra scelta che ricada
allinterno dellintervallo dellAD9850, ma io ho scelto 1.000 perch un valore che
posso vedere facilmente con un oscilloscopio.
NOTA Per controllare loutput del DDS, avrete bisogno di un oscilloscopio di qualche tipo e pi veloce meglio . Quelli
come gli economici oscilloscopi digitali Nano, da uno o due canali, di Seeed, che assomigliano a lettori MP3, in genere
non vanno oltre circa 1 MHz. Se volete controllare la frequenza pi alta dellintervallo dellIC DDS, vi serve qualcosa con
unampiezza di banda di almeno 100 MHz. Io tengo sempre sotto mano il mio piccolo Seeed DSO Nano per misurare i
circuiti lenti, ma quando devo lavorare oltre 1 MHz mi armo di qualcosa di pi robusto.

La prima cosa da controllare loutput a onde sinusoidali. Nella Figura 11-17 mostrata
londa sinusoidale da 1.000 Hz, che dovrebbe essere circa 1 V P-P. Il prototipo non
dotato dei controlli di livello delloutput che aggiungeremo nellunit finale e quindi, se non
vedete londa sinusoidale, dovete scollegare lunit e ricontrollare le connessioni.

Figura 11-17 - Un output a onde sinusoidale predefinita da 1 kHz.

Loutput a onde quadre avr la stessa frequenza di quello a onde sinusoidali, con
unampiezza di circa 5 V P-P (in realt, qualunque V+ sia). Loutput si presenter come
quello della Figura 11-18.
Figura 11-18 - Un output a onde quadre da 1 kHz.

Se sono presenti entrambi gli output, i test possono procedere con gli input dei controlli.
Gli input di frequenza e intervallo possono essere testati innanzitutto premendo i pulsanti
Freq + e Freq . La frequenza sul display deve cambiare di 1 Hz a ogni pressione del
pulsante. Adesso dobbiamo tenere premuto il pulsante Freq +. La frequenza deve
incrementarsi prima di 1, poi di 10, poi di 100 e infine di 1.000. Ci fermiamo a circa
15.000 e controlliamo loutput. Notate che il valore dellintervallo si incrementa
automaticamente quando la frequenza va oltre 9.999. Ripetiamo il tutto con il pulsante
Freq . Il valore dellintervallo si riduce man mano che decresce la frequenza.
Se premiamo il pulsante Range +, la frequenza si incrementa di 10.000 a ogni pressione
del pulsante. Cambiamo lintervallo su un valore pari a 4 e osserviamo loutput. Deve
essere di circa 40 kHz. Premiamo il pulsante Range e osserviamo il display. La
frequenza deve ridursi di 10.000 per ogni decremento nel valore dellintervallo.
Premiamo il pulsante Mode e teniamolo momentaneamente premuto finch i due punti
accanto al simbolo G non cominciano a lampeggiare. Adesso premiamo i pulsanti Freq +
e Freq per attivare e disattivare la porta di ingresso. Premiamo i pulsanti Range + e
Range per cambiare lo stato dellinput sense. Deve alternare tra + e . Premiamo il
pulsante Select per tornare al funzionamento normale.
Quando il gate attivo e non c nessuna porta di ingresso, loutput deve cessare.
Selezioniamo la modalit di input (active low) e osserviamo che loutput diventa attivo
ogni volta che un jumper collegato dalla porta di ingresso (A2 sulla Uno) alla messa a
terra. Quando ci troviamo nella modalit di input + (active high), loutput viene attivato
ogni volta che il jumper collegato a una sorgente di tensione positiva, ma cessa
quando linput A2 messo a terra. Disattiviamo la porta di ingresso entrando nella
modalit di controllo del gate e utilizzando il pulsante Freq per disattivare il
funzionamento del gate.
Per testare lingresso CV (A3 su Arduino), avremo bisogno di unalimentazione variabile
oppure di un alimentatore da 5 V e di un potenziometro da 10K e anche di un DMM,
mostrato nella Figura 11-19. Se il vostro oscilloscopio non dotato di una funzione di
visualizzazione della frequenza (come la maggior parte dei moderni strumenti DSO),
potete utilizzare un contatore di frequenza di qualche tipo.

Figura 11-19 - La configurazione della tensione degli input.

Attiviamo il CV utilizzando il pulsante Mode, ma non impostiamo il punto zero (lasciamolo


sul valore intermedio predefinito di circa 2,5 V). Premiamo il pulsante Select per tornare
al funzionamento normale. Applichiamo una tensione compresa tra 0 e 5 V, mentre
osserviamo loutput della frequenza. La frequenza deve decrescere quando lingresso
CV inferiore a 2,5 V e aumentare quando maggiore di 2,5 V. Osserviamo anche la
polarit del CV guardando lindicazione di polarit + e . Impostare il CV manualmente
sul punto zero quasi impossibile, ma possiamo vedere il display mostrare brevemente
uno 0 quando linput passa il valore zero.
Adesso regoliamo la tensione del CV per circa 2 V sul DMM. Passiamo lo strumento
nella modalit CV, attiviamo lingresso CV e premiamo il pulsante Range + per
impostare un nuovo valore zero. Il simbolo della polarit adesso deve essere 0 e tale
deve restare finch la tensione dellinput non cambia. Cambiamo la tensione dellinput e
osserviamo che la frequenza di output aumenta o diminuisce man mano che lingresso
CV va al di sopra o al di sotto del nuovo valore del punto zero. Al termine, utilizziamo i
pulsanti Mode e Freq per disattivare la funzione ingresso CV.
ATTENZIONE Non applicate pi di 5 V o una tensione negativa allingresso CV. Questo circuito un prototipo e non ha
nessuna protezione degli input. Superare lintervallo di input dellADC della MCU AVR pu distruggerlo. Quando
assembleremo lunit finale, la doteremo di un semplice circuito di protezione degli input.

Questo conclude i test funzionali essenziali. Se tutto funziona correttamente, adesso


un buon momento per fare esperimenti con il generatore di segnale per vedere come
risponde agli input dei controlli. anche un buon momento per impostare il ciclo di
lavoro delle onde quadre.
Sulla PCB del modulo DDS, sullestremit opposta rispetto a quella del modulo
oscillatore argentato, c un piccolo potenziometro. Impostiamone la frequenza su circa
10 kHz e, utilizzando un oscilloscopio, regoliamo londa quadra in modo che le porzioni
on e off abbiamo la stessa durata. Nellunit finale possiamo decidere di dissaldare
il potenziometro della PCB e di sostituirlo con un controllo montato sul pannello sulla
parte anteriore o posteriore del generatore di segnale.

Lassemblaggio finale
Se decidete di utilizzare la shield di prototipazione per il modulo DDS, vi suggerisco una
serie di estensori dei terminali a vite, come quelli mostrati in Shield adattatori a pagina
271 nel Capitolo 8. Questi non soltanto offrono collegamenti affidabili per i fili, ma
sollevano anche la shield DDS sulla scheda Arduino. In questo modo, rimane dello
spazio per quando dovete accedere al connettore ICSP. Potete anche utilizzare una
shield con terminali a vite, come il kit mostrato in Ridurre il costo a pagina 468.

Le resistenze pull-up
Sei resistenze da 2,2K montate in una parte della scheda perforata del prototipo
servono come pull-up per i sei interruttori dei pulsanti. Anche se la MCU AVR ha un
certo grado di funzionalit di pull-up, la serie di resistenze assicurano che ci sar una
tensione positiva per lavorare con gli interruttori. Significa anche che gli input degli
interruttori sono active low (input 0 V = on).
Dal punto di vista elettrico, il modulo pull-up molto semplice, come si pu vedere nello
schema mostrato nella Figura 11-20. Le sei resistenze sono collegate sulle linee del
segnale di ciascun interruttore degli input dei controlli e la connessione comune di tutte
le resistenze collegata a +5 V DC.
Figura 11-20 - Lo schema delle resistenze pull-up degli input dei controlli.

La scheda pull-up completa mostrata nella Figura 11-21. Lutilizzo delle morsettiere da
0,1 pollici consente collegamenti facili e connessioni affidabili. Inoltre, la Figura 11-21
mostra il modulo di protezione degli input e lArduino montato con la shield di
prototipazione DDS. A questo punto, sono stati collegati soltanto +5 V e la messa a
terra.

Figura 11-21 - La serie di pull-up e il modulo di protezione degli input.

La protezione degli input


Per costruire un semplice circuito di protezione degli input mostrato nella Figura 11-22,
ho utilizzato un piccolo modulo a scheda perforata. Lidea impedire a qualsiasi
tensione superiore a +5 V DC o inferiore a 0 V (cio, negativo) di entrare nelle porte di
ingresso o CV.

Figura 11-22 - Lo schema del circuito esterno di protezione degli input dei controlli.

Le resistenze da 470 ohm per limitare la tensione in serie con gli input possono produrre
un leggero abbassamento della tensione che appare sullinput dellADC dellAVR, ma,
dal momento che la porta si comporta come un input binario e che il CV un input
relativo, in realt non importa. I valori delle resistenze possono essere perfino
aumentati, se vi preoccupa il fatto che qualcuno dei diodi passi troppa corrente in una
situazione di sovratensione o sottotensione. Il modulo di protezione completo stato
mostrato nella Figura 11-21. Qui sono state utilizzate anche le morsettiere della PCB.

I componenti dello chassis


Il software pronto, tutte le parti sono a portata di mano e adesso venuto il momento
di mettere tutto allinterno della custodia. La parte pi complicata fare bene i fori nel
pannello anteriore. Per farlo, ho perforato e tagliato sulla parte posteriore del pannello
anteriore. Questo aiuta a tenere le cose ordinate e, se si producono graffi o tagli
perdendo il controllo di uno strumento, nessuno se ne accorger mai. Quindi, dobbiamo
montare lArduino e il modulo DDS sul fondo della custodia, seguiti dai connettori USB e
DC sul pannello posteriore. Infine viene il compito di collegare i controlli, i connettori e i
moduli luno allaltro nel modo corretto.
Prima si perforano e si tagliano i pannelli anteriore e posteriore. Il pannello anteriore ha
bisogno di un foro rettangolare per lLCD e di fori per gli interruttori e i connettori. Il
pannello posteriore ha un connettore di alimentazione DC montato sul pannello e un
potenziometro per il contrasto dellLCD. LUSB di Arduino non collegato al pannello
posteriore. Al connettore USB di Arduino si pu accedere dopo aver rimosso il
coperchio della custodia. La Figura 11-23 mostra i fori sul pannello anteriore mentre li si
sta aprendo con un piccolo trapano a colonna, anche se se ne pu utilizzare uno di
dimensioni normali. Potete anche utilizzare un trapano a mano, ma dovete fare
attenzione a segnare dove devono andare i fori, prendervela con calma e innanzitutto
aprire dei piccoli fori preliminari. Io ho trasferito le dimensioni del disegno (Figura 11-24)
con un righello e delle pinze e poi ho fatto i fori preliminari con un utensile rotante e una
piccola punta di trapano.

Figura 11-23 - Praticare i fori nel pannello anteriore.


Figura 11-24 - Il layout dei fori sul pannello anteriore del generatore di segnale.

La Figura 11-24 mostra il modello dei fori utilizzato per il pannello anteriore del
generatore di segnale. Per montare il modulo LCD, ho specificato fori #4 (2,79 mm), ma
potete utilizzare fori con un diametro inferiore, se sono posizionati con precisione. Il
pannello posteriore ha solo un connettore di alimentazione DC cilindrico e un
potenziometro per il contrasto dellLCD e questi possono essere montati come meglio
credete.
Anche se pu non essere necessario prendersi la briga di creare disegni dettagliati
come quelli che sono stati preparati per questo progetto, valgono per molto tempo. I
disegni della progettazione e della produzione sono registrazioni di quello che stato
fatto e assicurano che, se mai dovesse sorgere la necessit di costruire altri generatori
di segnale, non si dovr ripetere nessuno dei lavori di design a meno che non si
applichino modifiche drastiche.
LArduino Uno e la shield di prototipazione DDS sono montati sul fondo della custodia,
insieme alla serie di resistenze pull-up e al modulo di protezione degli input. Le posizioni
esatte non sono particolarmente importanti, ma lArduino non deve essere montato
vicino al pannello anteriore per aiutare a tenere i cavi ordinati. La Figura 11-21 mostra i
componenti interni montanti e pronti per essere collegati ai componenti sul pannello
anteriore.
Dopo aver montato i componenti interni e aver aperto i fori nel pannello anteriore, il
passaggio logico seguente montare i vari controlli e il modulo display LCD sul pannello
anteriore. Non dobbiamo dimenticarci di etichettare i controlli e i connettori.
SUGGERIMENTO Se prevedete di utilizzare unetichettatrice, potete stampare e applicare le varie etichette prima o
dopo aver montato i controlli. Tuttavia, se prevedete di utilizzare trasferelli o di dipingere le lettere sul pannello in qualche
modo (magari con una serigrafia), vi conviene farlo prima di montare le parti. Inoltre, quando utilizzate unetichettatrice
dovete assicurarvi di disporre del nastro appropriato per il dispositivo. Per esempio, alcuni modelli non sono dotati di
nastro bianco su nero. Dovete assicurarvi di trovare il nastro del quale avete bisogno, oppure dovete accontentarvi
delle opzioni disponibili, prima di decidere di utilizzare letichettatrice. Io ho utilizzato una stampante laser e etichette
adesive per stampare le lettere (bianco su nero) e poi ho ritagliato ciascuna di esse e le ho appiccicate sul pannello
anteriore.
sorprendente quanto velocemente la custodia pu cominciare a riempirsi una volta che
le parti sono al loro posto e che i fili corrono tra i vari componenti. La Figura 11-25
mostra come si presenta la parte interna del generatore di segnale appena prima di
chiuderlo con il coperchio. Notate che non mi sono preoccupato di aggiungere una
manopola sul potenziometro del contrasto montato sul pannello posteriore.

Figura 11-25 - Il generatore di segnale completo dal punto di vista elettrico.

NOTA Aspettate un attimo a montare il coperchio. Lasciate lo strumento aperto finch non avete completato il test
finale. Nessuno perfetto e possono verificarsi piccoli errori. Se lunit aperta, raggiungere e aggiustare un terminale
allentato o ricollegare un cavo molto pi facile.

Il modulo LCD si monta utilizzando quattro distanziatori di nylon con sotto i dadi. Io ho
saldato degli standard socket header standard sovrapponibili sulla PCB dellLCD da
davanti e poi ho ritagliato i terminali sul retro di circa 1/4 di pollice (6,5 mm), per
permettere ai socket header di essere premute sui pin. I fili saldati sugli header pin e
protetti dal termorestringente producono connettori fatti in casa decenti per il modulo
LCD. Potete vedere i connettori dellLCD nella Figura 11-25.
Per ordinare i cavi, ho utilizzato delle fascette di nylon e le morsettiere della PCB hanno
reso facilissimo creare le connessioni. Lunica parte che stata leggermente difficile
stato trovare un modo di trasformare in connettore linput dellalimentazione DC e il
controllo del contrasto dellLCD montati sul pannello posteriore. Alla fine, sono ricorso a
una morsettiera da sei posizioni con viti #6 (da 3,3 mm) e terminali crimpati.

Lalimentazione
Il generatore di segnale include un connettore cilindrico sul pannello posteriore per linput
dellalimentazione DC. Oltre al jack DC, ho acquistato anche le prese corrispondenti.
Questo significa che ho potuto selezionare un trasformatore da parete (adattatore DC)
con un output di tensione adatto, collegare la presa e sapere che corrispondeva
correttamente al connettore dellalimentazione. La tensione DC del connettore
posteriore condotta a una morsettiera, quindi allinterruttore dellalimentazione sul
pannello anteriore e infine a un connettore DC che si inserisce nella scheda Uno scheda.
Non ci sono fuse, dal momento che lalimentazione DC non condotta da nessuna parte
dove potrebbe trovare un percorso esterno diretto alla messa a terra, ma aggiungerne
uno non sarebbe difficile.
I ragazzi di Arduino, per un Arduino senza USB collegato, consigliano di utilizzare un
adattatore da 9 a 12 V DC. Con un adattatore da 5 V DC, c un forte calo nel
regolatore di tensione interno sulla PCB di Arduino e i terminali da 5 V daranno intorno ai
3,5 V. Io ho modificato un adattatore da 9 V DC esistente che avevo in una grande
scatola di surplus ( incredibile quanto rapidamente queste cose possono accumularsi
nel tempo). Potete trovare maggiori informazioni sugli adattatori DC SullArduino
Playground (http://bit.ly/apg-what-adapter).

I test finali e la chiusura


Adesso che tutto si trova nella custodia, che sono state applicate le etichette e che
stato caricato il software, il momento di sottoporre il generatore di segnale a un
collaudo finale. La procedura di test in realt soltanto un test di regressione ed
uguale ai test che abbiamo eseguito sul prototipo. Lo scopo principale verificare che
niente sia cambiato o abbia smesso di funzionare tra il prototipo e lunit finale.
Qualsiasi ulteriore test richieder attrezzature delle quali quasi nessuno dispone, come
un analizzatore di distorsione o un analizzatore di spettro. Se per caso conoscete
qualcuno che ne possiede uno o avete accesso a attrezzature di test di questo tipo, se
potete utilizzatele assolutamente. A seconda di come avete in mente di utilizzare il
vostro nuovo generatore di segnale, pu rivelarsi utile conoscere il livello di distorsione
armonica a varie frequenze ( costante, oppure cambia con la frequenza di output?) e
quanto armonicamente puro loutput a onde sinusoidali. Altra cose da investigare
possono essere i momenti di ascensione e di caduta delloutput a onde quadre,
limpedenza delloutput, la relazione hertz-tensione dellingresso CV, la stabilit a lungo
termine (cio, la frequenza non si mantiene stabile dopo lunghi periodi di tempo?) e i
tempi di riposta degli input dei controlli CV e gate.
Una volta completati i test finali, lultimo passaggio montare il coperchio. Non
dimenticate di mettere alcuni paracolpi adesivi di gomma sul fondo della custodia. Non
dovete ricoprirne le viti del coperchio. La Figura 11-26 mostra lo strumento finito in posa
sul mio tavolo da lavoro con un oscilloscopio USB digitale e un PC portatile.
Figura 11-26 - Il generatore di segnale finito e pronto per essere messo al lavoro.

Devo segnalarvi che la maniglia dello strumento che si vede nella n Figura 11-26
presenta qualcosa di strano. Io ho mantenuto corretta lorientazione alto-basso della
custodia, ma accidentalmente ho scambiato davanti e dietro. Non voglio mentire e dire
che lho fatto apposta, perch da parte mia stato sicuramente un errore, ma il fatto
che in realt funziona piuttosto bene. Normalmente, la maniglia sporge sul davanti
dellunit, quando questa in una posizione che non richiede supporto. Con la maniglia
al contrario, il generatore pu sempre rimanere in una posizione inclinata, ma adesso la
maniglia non occupa tanto spazio sul tavolo da lavoro. Sono stato fortunato. Gli errori
non sempre danno buoni risultati come in questo caso.

Ridurre il costo
Come descritto in questo capitolo, il generatore di segnale non un progetto
economico. Questo dovuto in parte al packaging scelto, ai connettori, ai controlli e a
ulteriori cose come gli estensori dei terminali a vite, la serie ausiliaria di pull-up e i moduli
di protezione degli input. Se per volete ridurne il costo, esistono alcuni modi per farlo e
ottenere comunque qualcosa di utile.
Ho visto alcuni cloni di Arduino per soli 15 $. Il modulo DDS una parte essenziale del
progetto e quindi ecco altri 10 $. Una shield di prototipazione con terminali a vite costa
circa 16 $, ma potete optare per una shield di prototipazione pi semplice,
semplicemente per disporre di un posto per il modulo DDS, per circa 10 $. Per ridurre
ulteriormente il costo, potete dimenticarvi completamente della custodia e accontentarvi
di una pila di shield su Arduino. Esistono diverse shield LCD dotate di pulsanti, come
quella mostrata in I display LCD a pagina 264 nel Capitolo 8 e queste costano circa 12
$ ciascuna. Di solito queste shield hanno soltanto quattro o cinque pulsanti a
disposizione per funzioni programmate e quindi potete avere bisogno di riprogettare
leggermente il software di interfaccia dei controlli per adattarlo a meno input dei
controlli.
Se non avete bisogno o interesse di disporre di un dispositivo indipendente, potete
eliminare i controlli dellLCD e i pulsanti e utilizzare lunit sotto il controllo di un computer
host soltanto con un Arduino e il modulo DDS. Si tratta di un tipo di dispositivo diverso
del quale non ho parlato in questo capitolo. Se cercate qualche idea di come
implementare uninterfaccia di controllo remota, potete dare unocchiata al software
presentato nel Capitolo 10 per i progetti della GreenShield e dello Switchinator.
Se avete una pila di schede formata da un Arduino, una shield di prototipazione per
fissare il modulo DDS e una shield LCD, laspetto sar simile a quello mostrato nella
Figura 11-27.

Figura 11-27 - Una versione a basso costo del generatore di segnale.

In questa configurazione, c un Arduino Leonardo, una shield di prototipazione con


terminali a vite di Adafruit con il modulo DDS montato e una shield LCD di SainSmart
con pulsanti. Sulla shield di prototipazione, stata installata una morsettiera da 0,1
pollici (2,54 mm) per i segnali provenienti dal modulo DDS, ma non ci sono connettori,
non ci sono potenziometri di controllo del livello delloutput e non ci sono contenitori.
Tenete presente che senza una custodia di protezione molto pi probabile che
succeda qualcosa di brutto se un cavo vagante o un cacciavite si imbatte nello stack di
schede mentre acceso e lo strumento non sar mai robusto come sarebbe in una
custodia costruita in modo solido.
Una versione a basso costo del generatore di segnale DDS pu farvi risparmiare circa
30 $ rispetto al prezzo della versione pi elaborata descritta in questo capitolo, che
significa che arriverebbe a costare circa 65 $ o meno acquistando in modo astuto. Pu
non valere la pena risparmiare 30 $ per creare qualcosa che non sia robusto e portatile
come dovrebbe, ma, come sempre, siete liberi di scegliere.

Il costo nel dettaglio


La Tabella 11-6 elenca i componenti principali utilizzati nel generatore di segnale. Il
costo totale non include cose come fili, saldature o fascette di nylon. Non include
nemmeno i costi di spedizione e, in alcuni casi, alcuni rivenditori non offrono spedizioni a
basso costo, ad esempio inviano un componente da 4,95 $ per 9 $ tramite UPS. In
futuro, ho deciso di evitare questo tipo di rivenditori il pi possibile, almeno finch non
imparano come inviare i prodotti. Molti rivenditori cinesi, invece, possono impiegare un
paio di settimane a recapitare le parti. Guardatevi in giro. eBay un buon posto dove
cominciare a cercare e, se non vi sentite sicuri su eBay, potete trovare offerte simili,
spesso proposte dagli stessi rivenditori, anche su Amazon.com.
Tabella 11-6 - Lelenco dei prezzi delle parti.

Prezzo Tot.
Quantit Articolo Fonte
unitario parz.
1 Custodia, Bud IP-6130 Mouser 25,40 25,40
1 Arduino Uno Adafruit 24,95 24,95
1 Modulo DDS DealeXtreme 7,99 7,99
1 Shield di prototipazione Adafruit 9,95 9,95
Adattatori terminali a
1 set Seeed Studio 7,50 7,50
vite
1 Display LCD, 16 2 Amazon/Uxcell 4,71 4,71
3 Connettori BNC All Electronics 1,25 3,75
2 Jack a banana Amazon 0,67 1,34
3 Potenziometro, 10K Amazon/Amico 1,28 3,84
1 Pulsante di accensione All Electronics 1,35 1,35
6 Pulsanti in miniatura All Electronics 0,60 3,60
Jack alimentazione DC
1 Parts Express 1,98 1,98
cilindrico
a Il totale parziale il costo totale di ciascuna riga di prodotti per una data quantit.

Come ho detto allinizio di questo capitolo, il generatore di segnale descritto qui pi


caro da costruire che molti dei kit esistenti. Ma di nuovo, farlo vi permette di ottenere il
controllo totale del vostro dispositivo e questo generer output a frequenze abbastanza
alte da rendersi utile per radioamatori e applicazioni digitali ad alta velocit.
Costo totale delle parti = 96,33 $
Nota: il costo totale non include fili, saldature, adesivi o il trasformatore da parete. I
prezzi erano esatti quando stato scritto questo libro, ma devono essere presi soltanto
come riferimento perch possono aver subito qualche variazione.
Comprando in modo accorto, sospetto che si possa abbassare il costo totale a circa 75
$, anche per questa versione completa. Avere a portata di mano una vasta raccolta di
parti, specialmente se le avete comprate in quantit, pu anche aiutare a ridurre i costi
di parti come connettori, interruttori e potenziometri. Infine, se per caso disponete di una
vecchia attrezzatura di prova che non funziona pi ma ha ancora la custodia in buono
stato, potete essere creativi e metterci dentro il generatore di segnale.

Fonti
La Tabella 11-7 elenca i distributori e i rivenditori presso i quali io ho acquistato le parti
del generatore di segnale (s, prendo nota di tutto questo, visto che si pu scaricare, e
anche voi dovreste prendere labitudine di conservare gli elenchi di tutte le ricevute e le
scatole, se non lo fate gi). Per ogni modulo o ogni parte ci sono numerose fonti: queste
sono soltanto quelle che ho utilizzato io quando ho effettuato i miei acquisti e possono
offrirvi unidea di dove cominciare a cercare.
Tabella 11-7 - Le fonti delle parti.

Distributore URL
Adafruit www.adafruit.com
All Electronics www.allelectronics.com
Amazon www.amazon.com
DealeXtreme
www.dx.com
(DX)
Mouser
www.mouser.com
Electronics
Parts Express www.parts-express.com
Seeed Studio www.seeedstudio.com
12

Progetto: un termostato intelligente

Forse avete sentito parlare dei cosiddetti termostati intelligenti (sospetto che molte
persone ne hanno visto almeno la pubblicit). Questi dispositivi sono un tipo di controller
digitale programmabile della temperatura e pu essere che ne abbiate perfino uno
installato a casa vostra. Alcuni permettono di cambiarne le impostazioni utilizzando
Bluetooth o qualche altro metodo di connessione wireless, insieme a unapplicazione
associata per smartphone o tablet. Altri offrono la possibilit di raccogliere dati e di
scaricarli via wireless, cosa che pu rivelarsi utile quando volete scoprire se state
consumando troppa energia per riscaldare o rinfrescare casa vostra. Ne esistono anche
alcuni, naturalmente, che non fanno niente pi di quello che facevano i vecchi modelli con
una bobina bimetallica, con lunica differenza che utilizzano un display LCD anzich una
manopola e qualche interruttore.

ATTENZIONE Se scegliete di costruire e utilizzare il termostato descritto in questo capitolo, lo fate a vostro rischio e
pericolo. Anche se utilizza circuiti a bassa tensione con un minimo rischio di prendere la scossa, c comunque il
rischio che danneggi il vostro sistema di riscaldamento o raffreddamento a causa di cicli energetici eccessivi o di
impostazioni della temperatura che superino i limiti di sicurezza del sistema (anche se la maggior parte di essi dispone
di una protezione incorporata). Per il vostro impianto di riscaldamento o di raffreddamento, vi conviene utilizzare
soltanto il circuito di controllo a bassa tensione. NON COLLEGATE IL VOSTRO TERMOSTATO PERSONALIZZATO A
CIRCUITI AD ALTA TENSIONE (110 V AC o superiore). Questo include raffreddatori evaporativi e stufe elettriche.

Gli antefatti
Esistono vari modi di migliorare un classico termostato a bobina bimetallica come quello
mostrato nella Figura 12-1. Questo tipo di dispositivo esiste da circa un secolo e utilizza
una bobina fatta di due diversi metalli, ciascuno con un coefficiente di espansione
termica diverso, in modo che quando la temperatura cambia la bobina si stringe o si
allenta leggermente.
Figura 12-1 - Un termostato elettromeccanico.

Questo movimento viene quindi utilizzato per unire alcuni contatti in modo da aprire o da
chiudere un circuito, oppure, in alcune versioni, un piccolo tubo di vetro sigillato che
contiene due contatti e una goccia di mercurio si sposta in modo che il mercurio riempia
il vuoto tra i contatti e completi il circuito (il modulo sensore di inclinazione KY-017
descritto nel Capitolo 9 utilizza questa stessa tecnica). Lazione di controllo on oppure
off: nel mezzo non c niente.
In questo capitolo, vedremo che cosa necessario per progettare, costruire e
programmare un termostato intelligente utilizzando soltanto schede Arduino gi pronte
per luso e componenti aggiuntivi facili da reperire. Ma, prima di immergerci in tutto
questo, dobbiamo cercare di capire che cos esattamente che desideriamo misurare e
controllare.

Panoramica dei sistemi HVAC


Lidea principale che sta dietro lalterazione della temperatura di una struttura
aggiungervi o togliervi calore. Oppure, per vederla in un altro modo, il freddo non altro
che lassenza del calore e quindi possiamo alterare la quantit di calore presente in un
sistema per raggiungere una determinata temperatura. Per aggiungere calore in un
ambiente possiamo aggiungere una caldaia di un qualche tipo (gas naturale, propano,
olio, legna o carbone), elementi elettrici oppure energia solare. In un sistema a pompa
di calore, il calore dellaria esterna viene estratto e reintrodotto nella struttura, che
simile a utilizzare ununit A/C in senso inverso. Per togliere calore da una struttura, lo si
deve estrarre utilizzando un sistema di refrigerazione che impieghi il ciclo di
condensazione ed evaporazione di un fluido refrigerante (ammoniaca, Freon o uno
qualsiasi dei numerosi refrigeranti moderni). Il calore interno viene assorbito dal fluido
refrigerante, che quindi lo trasferisce allesterno in un sistema a ciclo chiuso. Alcuni
sistemi di raffreddamento a grande scala utilizzano acqua refrigerata per ottenere lo
stesso risultato, ma gli impianti fisici (le attrezzature e le costruzioni dove alloggiarli)
tendono a essere grandi e cari da mantenere, per cui questi tipi di sistemi di solito si
trovano soltanto nelle universit, nei grandi uffici, negli ospedali e in altre strutture molto
grandi. I sistemi con acqua refrigerata di solito non vengono utilizzati in ambienti
residenziali, a meno che non si tratti di grandi condomini.
In molti ambienti residenziali, il riscaldamento e il raffreddamento sono gestiti da due
sistemi separati, ma in altri casi il riscaldamento e il condizionatore possono trovarsi
entrambi nella stessa grande cassa situata sul tetto o sul lato della casa. Una pompa di
calore in grado sia di riscaldare che di raffreddare, a seconda di come configurata
in un dato momento, e spesso si compone di due unit, una allinterno della casa e
unaltra allesterno. In ogni caso, in un termostato convenzionale ci sar solitamente un
interruttore per selezionare il funzionamento automatico o manuale del ventilatore e un
altro per selezionare la modalit (riscaldamento, raffreddamento, oppure spento). Una
manopola o una leva imposta la temperatura nominale, o il setpoint. Lintero sistema,
che include lunit di riscaldamento, lunit di raffreddamento e il termostato, pu essere
indicato come sistema HVAC (riscaldamento, ventilazione e condizionamento,
dallinglese heating, ventilation and air conditioning). (In realt, il termine HVAC si
incontra pi spesso quando si parla di grandi sistemi commerciali, ma io lo utilizzer qui
perch pi comodo che scrivere sistema di riscaldamento e aria condizionata). Con
la possibile eccezione di una funzione di ventilazione attiva a scambio di aria, un sistema
HVAC residenziale in grado di fare tutto quello che farebbe un sistema di grandi
dimensioni, soltanto a una scala pi piccola.
Una cosa importante da notare che la maggior parte dei sistemi HVAC possono
funzionare e funzionano come sistemi di circolazione a ciclo chiuso. In altre parole,
funzionano facendo circolare continuamente laria nella struttura. Anche se alcuni sistemi
possono avere la possibilit di attirare aria dallesterno oppure di scambiare laria tra
linterno e lesterno (la V in HVAC), alcuni no, e di conseguenza lodore della cena
bruciata di ieri sera tender a fermarsi per un po, prima di potersi finalmente dissipare.
Questo anche il motivo per il quale molte case hanno un odore diverso, unico di quella
di residenza. Da bambino notavo che destate, quando utilizzava il condizionatore,
linterno della casa di un vicino puzzava sempre di pollo fritto e quindi pensavo che gli
piacesse moltissimo. Non ho mai saputo quale fosse la vera origine di quellodore.

Concetti fondamentali del controllo della temperatura


Il controllo della temperatura implica il controllo dei sottosistemi che si occuperanno di
riscaldare o di raffreddare un ambiente per raggiungere una determinata temperatura
(setpoint). Nella maggior parte dei casi, si tratta di un tipo di funzionamento tutto-acceso
oppure tutto-spento: nella maggior parte dei sistemi HVAC residenziali non ci sono valori
intermedi di riscaldamento o raffreddamento. Dico nella maggior parte perch
possibile che qualcuno, da qualche parte, disponga di un sistema di riscaldamento
resistivo ad output variabile, ma io non ne ho ancora visto uno al di fuori di un laboratorio
o di un impianto industriale.
La natura tutto o niente dei sistemi HVAC fa che la temperatura interna reale non
riesca mai a raggiungere esattamente il setpoint, eccetto che per brevi periodi mentre
sta salendo o scendendo. Per esempio, immaginiamo che stiamo utilizzando il
condizionatore, con lobiettivo di raggiungere un setpoint di 72 F (22 C). Se
registriamo e tracciamo sia la temperatura interna che quella esterna nel corso di una
giornata, possiamo ottenere un grafico come quello mostrato nella Figura 12-2 (non si
tratta di dati reali, naturalmente: ha un mero scopo illustrativo).

Figura 12-2 - Il grafico della temperatura nel corso di una giornata.

Nella Figura 12-2, possiamo vedere se il condizionatore attivo perch la temperatura


interna scende. Durante le prime ore della giornata non si accende e non si spegne
spesso come pi tardi. Il calore dellesterno impiega del tempo a circolare nella struttura
e migliore lisolamento pi tempo impiega lo spazio interno a riscaldarsi. Pi tardi, nel
pomeriggio, il condizionatore lavora sodo per mantenere linterno alla temperatura
stabilita. Le cose non cominciano a rallentare fino alla sera tardi, quando scende la
temperatura allesterno.
Un controller con soli due stati, on oppure off, viene detto regolatore a isteresi, noto
anche come regolatore bang-bang. La quantit di isteresi nel regolatore determina
quanto spesso il riscaldamento o il condizionatore devono accendersi e per quanto
tempo. Potete immaginare listeresi come il ritardo tra il momento di accensione o di
spegnimento di un sistema, in base a un valore preimpostato in qualche punto nel
mezzo. Un esempio fisico di questo lo scatto di un raccoglitore ad anelli. Aprire e
richiudere gli anelli richiede un piccolo sforzo, ma una volta che sono aperti o chiusi gli
anelli rimangono in quello stato.
La Figura 12-2 una stima, ma rappresenta leffetto di un termostato convenzionale
sulla temperatura di una tipica struttura residenziale. Quando la temperatura interna
raggiunge circa i 73 F (22 C), il condizionatore si accende e rimane acceso finch la
temperatura non scende al di sotto dei 71 F (21 C). Questo significa che in questo
sistema ipotetico ci sono circa 2 gradi di isteresi. Questo intervallo viene detto banda di
isteresi (in realt, la banda di isteresi di questo sistema troppo ridotta e il
condizionatore si accende e si spegne troppo spesso pi tardi durante la giornata).
Ciascuna azione on/off del sistema HVAC viene detta ciclo. La Figura 12-3 mostra che
cosa succede quando la differenza tra i punti on e off diventa pi piccola (meno
intervallo tra Hmax e Hmin, che definisce la banda di isteresi). Il sistema riesce a
mantenere meglio la temperatura del setpoint con unisteresi pi stretta, ma al prezzo di
consumare un maggior numero di cicli. Idealmente, vogliamo rendere la banda di isteresi
pi ampia possibile, perch ogni volta che il riscaldamento o il condizionatore esegue un
ciclo, si avvicina di un passo in pi allusura e al rischio di guasto e ne risente anche la
bolletta elettrica.

Figura 12-3 - Leffetto dellisteresi.

Anche se dal punto di vista energetico una banda di isteresi di 5 pi efficiente e non
obera il sistema con tanti cicli come la banda di 3,5, significa anche che la temperatura
pu oscillare di 7 tra caldo e freddo (ricordate che questi grafici sono illustrativi e non
rappresentano dati reali).
Esistono diversi fattori che influenzano quanto spesso un sistema di riscaldamento o di
raffreddamento ripeter un ciclo e il pi ovvio quanto velocemente viene eliminato il
calore quando si utilizza il condizionatore, oppure quanto velocemente viene introdotto il
calore quando si utilizza il riscaldamento. Meno ovvi, ma altrettanto importanti, sono
fattori come lumidit e il flusso daria interno. Quando lumidit aumenta, laria trattiene
pi calore, cosa che pu aiutare quando si vuole riscaldare. Un condizionatore, inoltre,
funge da deumidificatore, dal momento che condensa ed elimina lumidit dellaria che
attraversa le bobine fredde del sistema e che laria secca fa evaporare il sudore pi
velocemente, cosa che ci permette di rinfrescarci pi in fretta. Laria stagnante (cio,
laria che non si muove a meno che non sia attivo il sistema HVAC) pu portare a punti
caldi o a punti freddi in una struttura ed possibile che il termostato finisca per
regolare soltanto una parte di uno spazio interno, se il resto dellaria non si muove.
Idealmente, un sistema di controllo della temperatura dovrebbe essere in grado di
rilevare la temperatura in tutte le parti di una struttura, ma nel mondo reale questo
spesso non avviene. Invariabilmente, ci sar una stanza che riceve i raggi diretti del sole
durante la giornata, mentre altre zone rimangono allombra, o magari una stanza dove
laria non circola bene. Quindi, anche se il termostato sta facendo il suo lavoro per
mantenere la temperatura nella zona immediatamente vicino a dove si trova al setpoint
desiderato, altre parti della struttura non saranno riscaldate o rinfrescate correttamente.
Semplicemente far muovere laria pu aiutare a evitare questo e anche controllare
lumidit aiuta a determinare quando il caso di accendere il ventilatore o di utilizzare il
riscaldamento o il condizionatore. Utilizzare semplicemente un ventilatore molto meno
caro che accendere il riscaldamento o il condizionatore.

Il controllo intelligente della temperatura


Lidea principale che sta dietro a un termostato intelligente ridurre la quantit di
energia che si spreca e ottenere una distribuzione della temperatura ancora pi
omogenea allinterno della struttura. Questo pu comportare lalterazione del tempo dei
cicli (cio, la regolazione dellisteresi), soltanto utilizzando il sistema quando c qualcuno
in casa, alterando il setpoint in base al momento della giornata e/o al giorno della
settimana e approfittando del ventilatore integrato nel sistema HVAC.
Alcune funzionalit comuni dei moderni termostati digitali commerciali sono i tempi di
ciclo regolabili, la modalit di commutazione riscaldamento/raffreddamento automatica e
la possibilit di programmazione giorno per giorno. Esamineremo brevemente queste
capacit per vedere quali hanno senso in un piccolo progetto come quello descritto qui.
I tempi di ciclo regolabili possono essere utilizzati per ridurre la frequenza dei cicli on/off
di riscaldamento o raffreddamento. Questo pu verificarsi quando la temperatura si
trova sul setpoint o molto vicino e varia abbastanza da far accendere il riscaldamento o
il condizionatore (A/C). Quello che fa, in realt, aumentare listeresi del sistema, in
modo che ci metta di pi a ripetere il ciclo quando la temperatura si aggira intorno al
setpoint, ma la quantit di isteresi ridotta quando la temperatura cambia rapidamente
in una direzione o nellaltra durante un breve periodo di tempo.
Lauto-commutazione permette al sistema di commutare tra raffreddamento e
riscaldamento come necessario. Se, per esempio, le giornate sono calde le e notti sono
fredde, il termostato passa automaticamente da raffreddamento a riscaldamento
durante la notte, per mantenere una temperatura interna media relativamente costante.
Il termostato di Arduino supporter lauto-commutazione e anche i tempi di ciclo
regolabili.
La programmazione dei profili unottima funzionalit dei termostati intelligenti. La
maggior parte dei termostati digitali programmabili hanno la capacit di programmare il
riscaldamento o il raffreddamento in giorni specifici della settimana, per cui se la vostra
casa vuota durante i giorni feriali possibile ridurre alcune spese dalla bolletta
elettrica non utilizzando il riscaldamento o il condizionatore quando non c nessuno in
casa a goderselo. Per lo stesso motivo, alcuni modelli consentono di abbassare
automaticamente il riscaldamento o il raffreddamento durante la notte, mentre i residenti
della casa dormono. Il nostro controller avr la possibilit di creare profili (a volte detti
anche programmi) per il giorno, per la notte e per il fine settimana.
Un termostato digitale pu essere confezionato in un elegante involucro dallaspetto
high-tech e un display numerico dietro plastica smerigliata, ma queste sono soltanto
caratteristiche che lo rendono pi desiderabile da acquistare. Pu anche essere
alloggiato in una normalissima custodia di plastica. Pu non sembrare cos appariscente
e high-tech come le unit che si trovano in commercio, ma questo non ha niente a che
vedere con la qualit del suo funzionamento o con la sua facilit duso. Per questo
progetto, possibile risparmiare tempo e denaro utilizzando una custodia a basso costo
e quello che ho deciso di utilizzare definitivamente economico.

Gli obiettivi del progetto


Lobiettivo principale di questo progetto quello di creare un sostituto per un normale
termostato residenziale. Online si trovano numerose descrizioni di progetti di termostati
basati su Arduino e questo progetto simile a molti di loro. Esistono moltissimi modi per
organizzare un Arduino, un sensore di temperatura, un semplice display e un rel o due.
Ci che rende questo progetto unico lincorporazione di un sensore di umidit e la
possibilit di utilizzare il ventilatore soltanto per far muovere laria e contribuire a
spostare laria fredda o calda dove serve, senza dover accendere il riscaldamento o il
condizionatore.
Il nostro termostato fatto con Arduino avr anche la possibilit di utilizzare i dati di
temperatura e umidit interne per determinare se deve regolare il tempo di ciclo. Vi
anche la possibilit di aggiungere un ulteriore sensore che legga la temperatura e
lumidit esterne. Infine, utilizzeremo i rel per collegarci al controllo 24VAC esistente
utilizzato dalla maggior parte dei sistemi HVAC residenziali negli Stati Uniti, e quindi non
c nessun pericolo di prendere la scossa e nessun rischio reale per il vostro impianto di
riscaldamento o di raffreddamento (almeno non dal punto di vista elettrico: tuttavia
possibile che i cicli siano troppo veloci e danneggino i componenti del compressore o la
resistenza di accensione).
Questo progetto molto semplice e richiede una quantit minima di parti e pochissime
saldature. In realt, le due sfide principali saranno trovare una buona custodia e
programmare il dispositivo.
Il termostato sar progettato in modo che sostituisca un termostato residenziale a
bassa tensione a quattro fili convenzionale. Non limitato ai sistemi a quattro fili,
tuttavia. Controllare soltanto una stufa o un condizionatore semplicemente questione di
non utilizzare tutte le uscite di controllo disponibili e di fare alcune piccole modifiche al
software.

La definizione e la pianificazione
Sulla base di quello che abbiamo visto finora, siamo in grado di identificare le
caratteristiche di base che vogliamo inserire nel nostro progetto. Queste comprendono
le funzioni gi fornite da un termostato a quattro fili convenzionale, pi alcune funzionalit
aggiuntive basate sullumidit:
Orologio in tempo reale
Sensore di umidit interna
Sensore di temperatura interna
Riscaldamento o raffreddamento automatico
Controllo automatico del ventilatore
Programmazione di sette giorni
Sotto molti punti di vista, la versione base del controller HVAC simile alle unit,
disponibili nelle grandi catene di negozi per la casa (e anche in alcuni piccoli negozi di
ferramenta locali), presso le case di distribuzione di sistemi HVAC e presso vari fornitori
online.
NOTA Questo progetto evita intenzionalmente di trattare direttamente con i circuiti di controllo ad alta tensione alternata
dei sistemi HVAC. pensato soltanto per sistemi a bassa tensione (24VAC). Lalta tensione AC pu danneggiare
lattrezzatura HVAC, bruciare la vostra casa e uccidervi (non necessariamente in questo ordine). Se avete bisogno di
questo tipo di sistema, vi conviene pensare di acquistare un controller commerciale con una certificazione di sicurezza
UL e CSA e chiamare un elettricista o un tecnico specializzato per installarlo.

Il controller utilizzer un Arduino Nano montato su una shield di prototipazione con


terminali a vite. Per tenere traccia di data e ora, utilizzeremo un modulo RTC (real-time
clock). Lo stack di PCB Arduino si monta sul coperchio della custodia. Monteremo un
modulo di quattro rel allinterno della custodia, sul pannello inferiore. Tutti i collegamenti
entreranno nella custodia attraverso un foro nella parte inferiore.
Il design
Il termostato fatto con Arduino destinato a sostituire un termostato standard a quattro
fili. Non adatto per sistemi con riscaldamento o raffreddamento multistadio o per
sistemi a pompa di calore. pi adatto per case vecchie con un termostato
convenzionale, come quello mostrato nella Figura 12-1.

Le funzionalit
Il termostato fatto con Arduino ha tre funzioni fondamentali: caldo, freddo e ventilatore.
La Figura 12-4 illustra un diagramma a blocchi con i componenti principali. Il segreto del
successo sta nel modo in cui queste funzioni di base sono utilizzate per ottenere il
funzionamento pi efficiente.

Figura 12-4 - Il diagramma a blocchi del termostato fatto con Arduino.

Per varie funzioni, come limpostazione della temperatura, lalternarsi dei giorni della
settimana e cos via, utilizzeremo un encoder rotativo. La shield LCD dotata anche di
una serie di pulsanti, ma non li utilizzeremo.
Molti sistemi HVAC pi vecchi presentano soltanto quattro fili, mentre alcuni sistemi pi
recenti hanno anche cavi di alimentazione ausiliari. Se disponibile e se nella custodia
montato anche un piccolo alimentatore, il termostato fatto con Arduino pu utilizzare
questa fonte AC. Per questa versione del termostato, utilizzeremo una fonte di
alimentazione esterna da parete. Idealmente, sarebbe meglio condurre la corrente dai
cavi dellHVAC, ma molti vecchi sistemi non dispongono di una linea 24VAC di riserva.
La Figura 12-5 mostra come un tipico termostato pi vecchio pu essere collegato
internamente. Gli esatti dettagli interni, naturalmente, variano da un tipo allaltro, ma
lidea di base la stessa.

Figura 12-5 - Un tipico circuito interno di un vecchio termostato.

Una cosa fondamentale da notare in questo tipo di termostato vecchio stile che il
ventilatore collegato in modo che sia sempre acceso quando acceso il
riscaldamento o il raffreddamento. Utilizzare il condizionatore o la stufa senza il
ventilatore non una buona idea. In alcuni sistemi, il ventilatore del riscaldamento
separato dalla quello del condizionatore e si accende soltanto quando la temperatura
interna della stufa raggiunge un determinato livello.

La custodia
Per la custodia ho scelto una scatola di derivazione di plastica con un coperchio
rimovibile, adatto per essere montato sulla parete, come mostrato nella Figura 12-6.
Dopo qualche rifinitura, la scatola verr dipinta con un colore neutro per migliorarne
laspetto.
Figura 12-6 - La custodia del termostato fatto con Arduino.

S, la custodia davvero brutta. Non possono negarlo. Ma, in questo progetto, la


preoccupazione principale era poterlo montare sulla parete e disporre di spazio interno
sufficiente per i componenti. Le linguette di montaggio laterali saranno rimosse e il
coperchio anteriore sar levigato e lucidato, rifiniture che contribuiranno a migliorare il
suo aspetto.
I controlli sono semplici, con soltanto un display LCD e un encoder rotativo. Tutto star
comodamente sul coperchio anteriore. Il layout previsto del pannello anteriore
mostrato nella Figura 12-8.
Figura 12-7 - Lo schema del termostato fatto con Arduino.
Figura 12-8 - Il layout del pannello frontale del termostato fatto con Arduino.

Il modulo rel sar montato sul fondo della custodia e i fili esistenti del termostato
entreranno attraverso un foro nel fondo della custodia. Il modulo RTC sar montato
allinterno della custodia e il DHT22 sar collegato alla parte inferiore in modo da
rimanere esposto allambiente circostante. Io ho scelto di montare il DHT22 in questo
modo, piuttosto che metterlo dentro, perch non avevo voglia di praticare una serie di
fori nella custodia per permettere allaria di fluire. Unalternativa potrebbe essere quella
di aprire un solo foro quadrato, abbastanza grande per il DHT22, in modo che lo si
possa montare allinterno ma che abbia comunque accesso allaria esterna. Fisseremo il
termostato alla parete con quattro viti.

Lo schema
Tra il prototipo e lunit finale non ci sar nessuna differenza significativa, per cui esiste
solo una versione dello schema. Dal punto di vista elettrico, il prototipo identico al
termostato finale, ma utilizza una scheda Arduino Uno piuttosto che una Nano (la MCU
AVR la stessa su entrambi), soprattutto perch questo quello che montato sul
prototipo.
Notate che sono utilizzati tutti i pin della MCU. Linterfaccia di programmazione di
Arduino, per mezzo di D0 e D1, condivisa con lencoder rotativo. Finch lencoder
rotativo non sar in uso, questo non creer conflitti.
Potete inoltre notare che gli input analogici sono stati utilizzati come pin I/O digitali.
Questo del tutto normale e, se tornate al Capitolo 2 e al Capitolo 3, potete vedere
come la porta dellAtmega328 utilizzata per linput analogico (la porta C) anche una
porta I/O standard discreta digitale. Facendo riferimento ai pin da D14 a D19, possiamo
accedervi come a qualsiasi altro pin I/O digitale. Naturalmente, gli input analogici adesso
non sono disponibili, ma il termostato non utilizza nessun input analogico (a eccezione
del pin A0, utilizzato dalla shield LCD) e quindi questo non un problema.
SUGGERIMENTO Il semplice fatto che la convenzione di Arduino sia quella di assegnare funzionalit come linput
analogico a determinati pin non significa che i pin non possano essere utilizzati per qualcosaltro. Questo soltanto il
modo in cui i ragazzi di Arduino.cc hanno deciso di assegnare loro un nome. Dal momento che una scheda Arduino
un breakout per la MCU, senza niente tra i pin della scheda e lIC vero e proprio della MCU, quello che realmente
determina ci che un pin pu o non pu fare la MCU, non le etichette sulla PCB.

Il software
Questo un progetto con un software molto intenso, ma la maggior parte di esso
dedicato allinterfaccia utente e al profilo attivo. La logica di controllo del funzionamento
del termostato non poi cos complessa.

NOTA Dovete ricordare che, dal momento che laccento principale di questo libro posto sullhardware Arduino e sui
relativi moduli, sensori e componenti, il software mostrato qui ha il solo scopo di mettere in evidenza i punti chiave e
non di presentare esempi completi pronti per essere eseguiti. I codici completi dei software degli esempi e dei progetti
si trovano su GitHub (https://www.github.com/ardnut).

A ogni iterazione, il ciclo principale del software controller linput dellutente proveniente
dallencoder rotativo, aggiorner i dati di temperatura e umidit correnti e determiner
se il display deve passare a unaltra schermata, ad altre impostazioni o modificare i
valori. Per catturare gli input dellencoder rotativo, vengono utilizzati gestori degli
interrupt. Nella Figura 12-9 mostrata una versione di alto livello del diagramma a
blocchi del software.
Figura 12-9 - Il diagramma a blocchi del software del termostato fatto con Arduino.

I principali blocchi funzionali nella Figura 12-9 danno unindicazione di che cosa
aspettarsi in termini di codice sorgente. Oltre al file principale Thermostat.ino, ci
saranno moduli sorgente per gestire gli input dellutente utilizzando interrupt, per
programmare gli orari (diurno, serale o fine settimana) e per aggiornare il display.
La prima cosa che controlla il ciclo linterruttore (SW, switch) sullencoder rotativo.
Questo il segnale che indica che lutente vuole fare qualcosa. Linterruttore a pulsante
dellencoder rotativo viene utilizzato per spostarsi tra le schermate e tra i campi di una
schermata. Il tipo di azione determinato da quanto tempo tenuto premuto
linterruttore.
I gestori degli interrupt per linterruttore dellencoder rotativo e gli input A/B impostano
flag nel modulo delle variabili globali. Il ciclo principale li esamina per determinare quale
azione di aggiornamento del display eseguire, se necessario. I gestori degli interrupt
non vengono mostrati nella Figura 12-9. Li vedremo in Il software a pagina 496.
Il blocco con letichetta Heat/cool/fan control la logica di controllo vera e propria del
termostato. Come ho detto in precedenza, questo un regolatore di isteresi a stati
discreti, noto anche come regolatore bang-bang. La Figura 12-10 mostra la relazione
tra la temperatura, il tempo e lintervallo di isteresi in un formato temporale per un
sistema A/C. Per il riscaldamento, il funzionamento semplicemente linverso.

Figura 12-10 - Tempo, temperatura e intervallo di isteresi.

Nella Figura 12-11 mostrato un altro modo di rappresentare questo. Questo grafico
mostra listeresi come una funzione della temperatura. Il messaggio di entrambi i tipi di
grafici lo stesso: un sistema di controllo bang-bang (come un termostato) associato a
un attuatore on/off (la stufa o il condizionatore) non possono mai mantenere con
precisione una specifica temperatura. Il sistema si trover sempre in un qualche punto
tra le estremit superiori e inferiori dellintervallo di isteresi.
Figura 12-11 - Leffetto dellisteresi sulla risposta del sistema di controllo.

In un sistema reale, la velocit alla quale la temperatura aumenta o diminuisce


dipender dalla velocit con cui il calore viene introdotto o estratto dal sistema e
dallefficienza con la quale il riscaldamento o il raffreddamento possono aggiungere o
eliminare calore. Il risultato che i tempi di riscaldamento e di raffreddamento non
saranno quasi mai gli stessi, anche se sia dalla Figura 12-10 che dalla Figura 12-11
potrebbe sembrare che lo siano.
La logica di controllo del termostato mostrata nella Figura 12-12. Notate che il
riscaldamento e il raffreddamento sono semplicemente operazioni inverse. In un
termostato elettromeccanico vecchio stile, il termine H (isteresi) viene stabilito
utilizzando una vite di fissaggio sul gruppo della bobina bimetallica. Nel software, se
vogliamo possiamo impostarlo dinamicamente.
Figura 12-12 - La logica di controllo del termostato per riscaldamento e raffreddamento.

Gli input/output dellutente


Linput dei controlli costituito da un unico encoder rotativo. Questo pu sembrare
strano, ma un encoder ha integrato anche un interruttore che si attiva quando lutente
preme la manopola. Linterruttore viene utilizzato per passare tra le varie configurazioni
sul display (o schermate, come le chiamo io). Ciascuna schermata contiene campi che
mostrano dati o impostazioni e lencoder rotativo viene utilizzato anche per spostarsi tra
i campi di ciascuna schermata. La durata della pressione del pulsante dellencoder
rotativo determina quale azione deve eseguire il software. Una pressione breve
rappresenta una selezione, mentre una pressione lunga chiede al software di passare
alla schermata successiva.
Il display lo stesso tipo di LCD 16 2 che abbiamo utilizzato con il generatore di
segnale nel Capitolo 11. In questo progetto, gi montato su una shield. Questo
semplifica i collegamenti interni. La retroilluminazione dellLCD non attivata, a meno
che non siano attivi gli input dei controlli. I piccoli interruttori a pulsante della shield LCD
non vengono utilizzati, ma potrebbero esserlo, se volete aprire ulteriori fori sul pannello
anteriore e trovare delle estensioni di qualche tipo che un utente possa premere. Io ho
scelto di ignorarli.
Normalmente, appaiono due schermate principali che si alternano quando non sono attivi
gli input dei controlli. La prima mostra la temperatura corrente, il setpoint, la modalit
operativa e il profilo attivo (se ce n uno). La seconda schermata mostra la data e lora
correnti. La Figura 12-13 mostra le schermate durante il funzionamento normale. I
simboli ^, v e servono rispettivamente a indicare se un risultato sta salendo,
scendendo o se sta rimanendo stabile, in relazione a quello precedente.
I campi mostrati nella Figura 12-13 sono definiti nella Tabella 12-1. Nella seconda
schermata, il campo END mostra lora nella quale sar terminato il profilo corrente.

Figura 12-13 - Le schermate del funzionamento normale.

Tabella 12-1 - Le definizioni dei campi della schermata normale.

Campo Scopo
T Temperatura interna corrente, in gradi (F o C)
E Temperatura esterna (se attivata)
H Umidit
Modalit: A (automatica), H (caldo), C (freddo), F (ventilatore) o X
M
(spento)
P Profilo: D (giorno), N (notte), W (weekend) o X (nessuna)

Le schermate mostrate nella Figura 12-13 sono puramente informative e non


presentano campi modificabili. La temperatura pu essere espressa in gradi Celsius
oppure in gradi Fahrenheit. Limpostazione predefinita Fahrenheit. Per lora, io ho
scelto di utilizzare il formato a 24 ore, ma pu essere modificato per utilizzare il formato
a 12 ore (AM/PM) senza troppa fatica.
La schermata delle impostazioni, mostrata nella Figura 12-14, permette allutente di
attivare o di visualizzare il profilo e, se il profilo disattivato, lutente pu regolare
manualmente il setpoint della temperatura, la scala della temperatura, listeresi e la
modalit operativa.
Figura 12-14 - La schermata delle impostazioni.

La schermata delle impostazioni il punto di controllo principale del termostato.


organizzata intenzionalmente in modo che appaia soltanto quando viene invocata
esplicitamente da un utente. I campi utilizzati nella schermata delle impostazioni sono
elencati nella Tabella 12-2.
Tabella 12-2 - Le definizioni dei campi della schermata delle impostazioni.

Campo Scopo
S Setpoint della temperatura
C Intervallo del ciclo (isteresi, in gradi)
F F o C per la scala della temperatura
O Tempo di override
Modalit: A (automatica), H (caldo), C (freddo), F (ventilatore) o X
M
(spento)
P Profilo: D (giorno), N (notte), W (weekend) o X (nessuno)

La forma principale di controllo predeterminato per il termostato sono i profili definiti


dallutente. I profili si definiscono nella schermata mostrata nella Figura 12-15.

Figura 12-15 - La schermata di modifica dei profili.

Ci sono profili per il giorno, per la notte e per i fine settimana, che sono etichettati
rispettivamente D, N e W. Ruotando lencoder quando selezionata la schermata di
modifica dei profili, si selezionano in sequenza i tre profili. Ciascun profilo ha unora di
inizio e unora di fine. Nel caso del profilo del weekend (W), lora di inizio predefinita
venerd a mezzanotte e lora di fine la mezzanotte di domenica. Se lora di fine di un
profilo si sovrappone allora di inizio di un altro, lora di fine del profilo precedente prende
sempre la precedenza. I campi utilizzati nella schermata di modifica dei profili sono
elencati nella Tabella 12-3.
Tabella 12-3 - Le definizioni dei campi della schermata di modifica dei profili.

Campo Scopo
P Profilo: D, N, W
B Ora di inizio
E Ora di fine
S Setpoint della temperatura
C Intervallo del ciclo (isteresi)
Modalit: A (automatica), H (caldo), C (freddo), F (ventilatore) o X
M
(spento)

Per navigare tra le schermate e i campi necessario abituarsi un po, ma, utilizzando la
durata della pressione del pulsante dellencoder rotativo e una struttura ad albero, un
utente pi navigare nelle schermate e nei campi principali senza perdersi. La Figura 12-
16 mostra come rispondono le schermate e i campi a pressioni lunghe o corte. La
Figura 12-17 mostra tutte e quattro le schermate in ununica vista. Questa dovrebbe
aiutare a visualizzare con maggiore facilit come sono organizzate le schermate. Una
pressione lunga del pulsante definita come di 1 secondo o pi. Una pressione breve
del pulsante di 500 ms o meno. Per controllare la durata della pressione del pulsante,
il software utilizza un interrupt e un contatore.
Figura 12-16 - La schermata del termostato e la navigazione dei campi.
Figura 12-17 - Le quattro schermate utilizzate dal termostato.

Loutput dei controlli


Loutput dei controlli consiste di un modulo con quattro rel SPDT indipendenti.
Incorpora i driver dei rel e le morsettiere della PCB, per cui collegarlo ai fili esistenti
del termostato semplice, come si pu vedere nella Figura 12-18. La linea comune
passa per il quarto (in basso a sinistra nel diagramma) rel.
Figura 12-18 - Il prototipo del termostato fatto con Arduino.

Nel diagramma a blocchi della Figura 12-4, noterete che la linea comune proveniente dal
sistema HVAC esistente passa anche per uno dei rel. Questa una misura di
sicurezza. Se il termostato perde lalimentazione, il rel con la linea comune cade e
nessuna delle altre funzioni dellHVAC pu essere attivata. Tutte le linee di tensione di
controllo esterne dellHVAC, compreso il ritorno comune, sono collegate ai terminali C e
NO (comune e normalmente aperto) dei rel.

Il prototipo
Il prototipo per questo progetto formato da un Arduino Uno, una coppia di estensione
delle morsettiere e una shield LCD. Questi sono essenzialmente gli stessi componenti
che confezioneremo nella custodia pi tardi (la scheda Nano e la scheda Uno utilizzano
la stessa MCU ATmega328).
Sto riutilizzando lArduino integrato che abbiamo utilizzato nel Capitolo 11 per il
generatore di segnale, ma potrei anche aver utilizzato il Duinokit introdotto nel Capitolo
10. Io ho scelto di assegnare alla scheda unaltra missione perch sufficientemente
piccola da poter essere montata sulla parete accanto al termostato esistente durante i
test. Il prototipo mostrato nella Figura 12-18.
Il prototipo utilizza una serie di parti leggermente diversa, ma equivalente dal punto di
vista elettrico, rispetto allunit finale. La shield LCD la stessa che utilizzer lunit
finale, ma la scheda Arduino una Uno laddove lunit finale utilizzer una Nano. Nella
Figura 12-18 potete vedere lencoder rotativo, il modulo RTC e il sensore DHT22 sulla
piccola breadboard che non richiede saldature. Lelenco delle parti del prototipo
fornito nella Tabella 12-4.
Tabella 12-4 - Lelenco delle parti del prototipo del termostato.

Quantit Descrizione
1 Arduino Uno (o equivalente)
1 Shield display LCD 16 2
1 Modulo real-time clock DS1302
Serie di adattatori per i terminali a
1
vite
1 Modulo con quattro rel
Sensore di temperatura/umidit
1
DHT22
Modulo encoder rotativo KEYES
1
KY-040

Il sensore DHT22
Per rilevare la temperatura e lumidit, utilizzeremo il dispositivo DHT22, che lo stesso
dispositivo che abbiamo utilizzato con la GreenShield nel Capitolo 10. Nella versione
finale, collegheremo il sensore DHT22 a un Arduino Nano, con terminali a vite. Il pinout
del DHT22 mostrato nella Figura 12-19.

Figura 12-19 - Il pinout del sensore DHT22.


Sulla linea dei dati, utilizzeremo una pull-up da 1 kohm, come consiglia la scheda tecnica
(che si trova presso Adafruit (http://www.adafruit.com/), SparkFun
(http://www.sparkfun.com/) e altri). Nel prototipo, il DHT22 sar collegato utilizzando
una piccola breadboard che non richiede saldature su una base di legno, come si pu
vedere nella Figura 12-18.

Lencoder rotativo
Il principale (e unico) input di controllo un modulo KEYES KY-040 (nel Capitolo 9
trovate maggiori informazioni sui moduli KEYES) con un encoder rotativo Bonatech,
simile a un Alps EC11. Il modulo mostrato nella Figura 12-20 e il pinout mostrato
nella Figura 12-21.

Figura 12-20 - Il modulo encoder rotativo.

Figura 12-21 - Le funzioni dei pin del modulo encoder rotativo.

Il circuito del modulo encoder rotativo semplice, come mostra la Figura 12-22.
Lencoder contiene un interruttore interno che si attiva quando si preme lalbero e le tre
linee del segnale utilizzano resistenze pull-up da 10K. I pin etichettati CLK e DT
corrispondono ai segnali A e B (rispettivamente) che si trovano nella maggior parte degli
esempi software e delle descrizioni di encoder rotativi semplici.

Figura 12-22 - Lo schema del modulo encoder rotativo.

Linterruttore integrato nellencoder rotativo si utilizza per passare da una schermata


allaltra del display e anche per vari elementi delle schermate che possono essere
modificati dallutente. Questo e lencoder rotativo vero e proprio sono gli unici due input
di controllo. Linterruttore interno normalmente aperto.

Il modulo real-time clock


Per poter determinare quale profilo utilizzare, il termostato deve poter tenere traccia del
tempo. Per questo scopo, utilizziamo un modulo RTC (real-time clock) basato su un IC
DS1302. Il modulo RTC in realt non niente pi che un carrier per lIC DS1302, un
cristallo e una batteria. La Figura 12-23 mostra uno schema del modulo RTC. Il pinout
molto intuitivo.

Figura 12-23 - Lo schema del modulo RTC.


SullArduino Playground (http://bit.ly/apg-ds1302rtc) disponibile una libreria per il
DS1302. Il termostato utilizzer questa, anzich creare una nuova libreria a partire da
zero.

La shield LCD
La shield LCD, che potete vedere nella Figura 12-18 e che descritta nel Capitolo 8,
una shield comune che si trova facilmente. Si tratta della parte che utilizza pi pin I/O
digitali della scheda Nano. In questa applicazione, la shield stata scelta perch
incorpora un potenziometro per il contrasto e un transistor per controllare la
retroilluminazione del display. Inoltre, si collega direttamente allArduino sottostante,
eliminando collegamenti come quelli che abbiamo utilizzato nel generatore di segnale nel
Capitolo 11.

Il software
Il software del termostato semplice e, come la maggior parte dei software integrati,
progettato per girare continuamente con un ciclo principale. A differenza di altri esempi
presentati fino a questo punto, per gestire lencoder rotativo il termostato utilizza
interrupt. Implementare un gestore di interrupt con un Arduino non particolarmente
difficile e per adesso gli interrupt sono il modo migliore di gestire gli eventi asincroni del
mondo reale.

Lorganizzazione del codice sorgente


Come nel caso di altri progetti di questo libro, il codice sorgente organizzato come una
serie di file sorgente (vedere Tabella 12-5). Questi includono il modulo principale con le
funzioni setup() e loop(), un modulo per le variabili globali e la logica per controllare le
funzioni dellHVAC in accordo con programmi di riscaldamento e/o raffreddamento
definiti dallutente. Il modulo display prende in prestito del lavoro gi eseguito per il
generatore di segnale nel Capitolo 11 e il modulo dellinterfaccia, tstat_iface.cpp, include
anche il gestore di interrupt per lencoder rotativo.
Tabella 12-5 - I moduli di codice sorgente del termostato.

Modulo Funzione
Thermostat.ino Modulo principale che contiene setup() e loop()
tstat.h Definizioni delle costanti (dichiarazioni #define)
tstat_ctrl.cpp Logica di controllo dellHVAC
tstat_ctrl.h File include
tstat_gv.cpp Variabili globali
tstat_gv.h File include
tstat_iface.cpp Elaborazione degli input di controllo
tstat_iface.h File include
tstat_lcd.cpp Funzioni LCD
tstat_lcd.h File include
tstat_util.cpp Funzioni utility
tstat_util.h File include

La descrizione del software


Il software pu essere suddiviso in tre sezioni funzionali: interfaccia utente, logica di
controllo e gestione del display. Le funzioni dellinterfaccia utente, contenute nel modulo
sorgente tstat_iface.cpp, forniscono la funzionalit di lettura dellencoder rotativo e di
navigazione nelle schermate del display. tstat_lcd.cpp contiene le funzioni per gestire il
display LCD. Il modulo sorgente tstat_ctrl.cpp fornisce la funzionalit per rilevare
temperatura e umidit per mezzo del sensore DHT22, la logica del controller e i
programmi definiti dallutente.
In questo progetto si utilizzano varie librerie per lRTC DS1302, lencoder rotativo, le
funzioni di data e ora e la periferica timer 1 dellAVR. Queste sono elencate nella Tabella
12-6. Questo uno degli aspetti positivi di lavorare con Arduino: se avete bisogno di
una libreria per utilizzare un determinato modulo, sensore o shield, molto probabilmente
qualcuno, da qualche parte, si preso il tempo di crearla e quindi non dovrete farlo voi.
Tabella 12-6 - Le librerie esterne utilizzate con il termostato.

Nome Funzione Autore


Time Funzioni relative al tempo Michael Margolis
DS1302RTC Classe RTC Timur Maksimov
ClickEncoder Classe encoder rotativo Peter Dannegger
TimerOne Classe timer 1 Lex Talionis

Queste librerie si trovano sullArduino Playground (http://playground.arduino.cc/) e su


GitHub (http://www.github.com/). Vi conviene leggere la documentazione inclusa e il
codice sorgente, per riuscire a capire meglio che cosa fa il codice e come configurarlo
se necessario. La libreria DHT22 la stessa che abbiamo usato con la GreenShield nel
Capitolo 10.
Il file tstat.h contiene le definizioni globali utilizzate da altri moduli. Questi seguono le
assegnazioni dei pin mostrare nella Figura 12-7, illustrate nellEsempio 12-1.

Esempio 12-1 - Le definizioni I/O di tstat.h.


La funzione setup() che si trova in Thermostat.ino, mostrata nellEsempio 12-2,
inizializza lLCD, fa apparire alcuni messaggi di avvio, controlla il modulo RTC e mostra
la prima schermata.

Esempio 12-2 - La funzione setup().


La funzione loop() che si trova in Thermostat.ino non complicata, come potete
vedere nellEsempio 12-3. La maggior parte del lavoro ha luogo quando in uso
lencoder rotativo e quando il software sta ricavando i dati relativi a temperatura e
umidit ed eseguendo le funzioni di controllo contenute in tstat_ctrl.cpp.

Esempio 12-3 - La funzione loop() principale del termostato.

Quando lencoder non in uso, il display alternate tra le schermate 1 e 2, che mostrano
rispettivamente le condizioni attuali e lo stato operativo e data e ora. Quando lencoder
viene utilizzato, il flag input_active viene impostato su true e rimane true finch
lutente non ritorna nella schermata 1 premendo la manopola dellencoder per attivarne
linterruttore. Notate che il controllo del sistema ancora attivo mentre le schermate
degli input sono in uso.

I test
I test sono un procedimento di tre passaggi e questo paragrafo vale sia per il prototipo
che per lunit finale. Il primo passaggio implica limpostazione della data e dellora
nellRTC. Per farlo, basta passare alla schermata di configurazione di data e ora
utilizzando il pulsante dellencoder. Dopo essere tornati nel display principale, si devono
vedere lora e la data corrette. Il passaggio successivo consiste nellimpostazione della
temperatura desiderata, lintervallo di isteresi (il parametro C sul display) e la modalit
operativa. Io ho cominciato verificando che possa attivare manualmente il ventilatore del
sistema e poi ho inserito il setpoint della temperatura e ho impostato la modalit. Vi
conviene guardare il display e verificare che il sistema interrompa il riscaldamento o il
raffreddamento quando raggiunge una temperatura uguale al setpoint pi o meno met
dellintervallo del ciclo (isteresi).
Infine, possiamo passare in rassegna i vari profili e impostarne ciascuno nel modo che
consideriamo pi adatto per la nostra situazione. Ricordate che un conflitto tra lora di
fine di un profilo e quella dinizio di un altro si risolve rispettando lora di fine del profilo
precedente e non quella dinizio del successivo.
Vi conviene tenere docchio il funzionamento del termostato per un periodo di circa un
paio di settimane. Probabilmente richieder qualche perfezionamento, per stabilire le
ore e i setpoint ideali per ottenere il funzionamento pi efficiente. Se avete costruito una
GreenShield, potete utilizzarla per registrare la temperatura e lumidit e catturare i dati
delle prestazioni del termostato. Per interrogare la GreenShield a intervalli regolari e
raccogliere dati, un semplice script Python andr benissimo.

La versione finale
La versione finale del termostato diversa da quella del prototipo sotto alcuni aspetti
fisici, ma altrimenti identica in termini di funzioni e collegamenti del segnale. Le tre
differenze principali sono lutilizzo della scheda Nano, un semplice modulo LCD anzich
una shield LCD e una custodia dove montare il tutto. Lelenco delle parti della versione
finale del termostato fornito nella Tabella 12-7.
Tabella 12-7 - Lelenco delle parti della versione finale del termostato.

Quantit Descrizione
1 Arduino Nano (o equivalente)
Scheda di prototipazione con
1
terminali a vite
1 Modulo display LCD 16 2
1 Modulo con quattro rel
Sensore di temperatura/umidit
1
DHT22
1 Modulo encoder rotativo KEYES
KY-040
1 Modulo real-time clock
1 Custodia di plastica

Lassemblaggio
Lassemblaggio finale consiste principalmente in montare i componenti e inserire il tutto
nella custodia. Ma, prima, io ho apportato alcune modifiche alla custodia. Ho grattato via
le lettere dal coperchio superiore, ho rimosso le linguette di montaggio dai lati e ho
aperto dei fori per il display e per lencoder rotativo. Ho aperto dei fori anche sul fondo
della custodia, per montare le viti e la stufa esistente e i fili per controllare il
condizionatore. Poi, dopo aver fatto tutto questo, ho dipinto la custodia di un colore
neutro in sfumatura davorio.
Ho utilizzato una shield di prototipazione con terminali a vite per fissare la scheda Nano
e ho collegato i pin della Nano ai terminali e ai corretti pin header. La Figura 12-24
mostra la vista dallalto della shield di prototipazione della Nano, con la shield LCD,
lencoder rotativo e il modulo RTC. Il modulo RTC sar montato allinterno della
custodia.

Figura 12-24 - La scheda di prototipazione della Nano e altri componenti.

Dal momento che ho scelto di tenere tutti i collegamenti sul lato superiore della shield di
prototipazione, il lato inferiore della shield non presenta altro che piazzole di saldatura.
Ho utilizzato il filo isolato a trefolo pi sottile che avevo a mia disposizione (28 AWG a 7
trefoli) senza dover ricorrere a filo per wire-wrap. Il filo solido da 30 AWG con
isolamento Kynar ideale per la costruzione wire-wrap, ma meno adatto nel nostro
caso.
Il grande vantaggio offerto dalla shield di prototipazione con terminali a vite la facilit
con i quali i fili da e altri componenti possono essere collegati ai terminali. Nel caso del
termostato, questo include il sensore DHT22, il modulo real-time clock, il modulo rel e
lencoder rotativo.
La Figura 12-25 mostra come si presentava la custodia dopo le modifiche. La shield
LCD shield e lencoder rotativo sono gi montati. Quello che non si vede il sensore
DHT22, che montato sulla parte esterna del fondo della custodia. Potete notare anche
che le viti del coperchio non sono installate.

Figura 12-25 - La custodia del termostato quasi finita.

Il piccolo foro in alto a sinistra nella finestra dellLCD un foro di accesso per il
potenziometro della shield LCD che serve a regolare il contrasto del display. Come
ultimissimo passaggio, procederemo a ritagliare un po il bordo della finestra dellLCD e
anche un coperchio di plastica trasparente pu essere una buona idea. S, sembra
scappato da un ambiente industriale, ma, come ho detto prima, il modo in cui si
presenta non ha conseguenza sul modo in cui funziona. La manopola dorata c (se
potete vedere limmagine a colori) perch era lunica manopola che avevo a
disposizione.
Il modulo con quattro rel si monta sul fondo della custodia. Il modulo RTC si monta su
un lato interiore della scatola. La Figura 11-25 mostra come sono organizzate le cose
nella custodia. I collegamenti esistenti dellHVAC sono collegati per mezzo di un foro di
accesso sul fondo della custodia. Notate che il foro spostato verticalmente rispetto al
centro, per lasciare spazio al modulo rel.
Tutto un po giusto, a dire il vero, ma ci sta. Sono necessari ancora diversi passaggi
prima di chiudere e rilassarsi:
1. Trovare le posizioni delle viti di montaggio sulla parete e fare i buchi.
2. Estrarre i fili di controllo esistenti dellHVAC attraverso il foro sul fondo e montare
la custodia sulla parete.
3. Collegare i fili dellHVAC al modulo rel.
4. Collegare lalimentazione e controllare il display.
5. Mettere il coperchio alla custodia.
Dando per scontato che il software sia gi caricato sulla scheda Nano, il termostato
adesso deve funzionare. Non ha un interruttore di accensione e quindi comincia a
funzionare non appena si collega lalimentatore. La retroilluminazione del display deve
rimanere attiva per 15 secondi dopo che si fornita lalimentazione e quindi potete
dover girare leggermente la manopola dellencoder se ha fatto timeout e si spenta.
Figura 12-26 - I componenti interni del termostato.

La custodia dotata di una guarnizione in gomma, che potete utilizzare se pensate che
sia necessario. Io lho utilizzata semplicemente perch consente una perfetta aderenza
del coperchio e offre un po pi di spazio allinterno per i componenti, ma non mi
preoccupa il fatto che la pioggia possa entrare nellunit.

I test e il funzionamento
Per eseguire i test, dobbiamo utilizzare lencoder per vedere tutte le schermate del
display e verificare che il rilevamento dellinterruttore lungo e corto funzioni
correttamente. Dovremo impostare di nuovo i parametri, dal momento che caricare il
software non carica la EEPROM, ma soltanto la memoria flash dei programmi. Se
lunit installata sembra funzionare correttamente, potete cominciare a configurarla per il
vostro particolare ambiente e in base alle vostre preferenze.
Vi suggerisco di cominciare con qualcosa di semplice, come per esempio limitarvi a
controllare il riscaldamento e il raffreddamento. Dopo che sarete soddisfatti del fatto
che lunit sta funzionando come dovrebbe, potete decidere di impostare i profili
giorno/notte e vedere come funzionano. Man mano che acquisite una maggiore
esperienza con lunit, potete incorporarvi le impostazioni di umidit e tempo del ciclo.
Perch funzioni nel modo ideale, un dispositivo come questo richiede una certa quantit
di regolazioni e quindi si integrer in modo efficace nel vostro ambiente.
Il secondo DHT22
Potete ricordare dalla Figura 12-4 che c un input per un secondo sensore DHT22. Io ho scelto di lasciarlo stare
per la prima iterazione di questa unit, in modo da potermi concentrare sulle funzionalit essenziali. Dal punto di
vista elettrico, incorporare linput di un secondo DHT22 semplice, ma introduce un nuovo livello di complessit
nel software. Il motivo che con una secondo sensore il termostato deve non soltanto monitorare lambiente
interno, ma adesso deve anche tener conto di quello esterno (cose come la differenza tra la temperatura interna
e quella esterna, la velocit di cambiamento in ogni determinato momento e la perdita o laumento di calore
stimato per via di pareti e finestre). Con un po di fatica e una buona programmazione, il termostato pu cercare
di equilibrare i vari fattori e arrivare al profilo di riscaldamento e raffreddamento ottimale. Pu suonare molto
interessante, ma non facile.
Come nel caso di tutti i software mostrati in questo libro, il codice sorgente del termostato disponibile su
GitHub (https://www.github.com/ardnut). Occasionalmente, pubblicher aggiornamenti del termostato e degli altri
progetti di esempio.

Il costo nel dettaglio


Uno degli obiettivi di questo progetto era utilizzare il pi possibile schede e moduli gi
pronti. Questo non soltanto permette di risparmiare tempo e fatica, ma aiuta anche a
mantenere bassi i costi (le PCB personalizzate non sono economiche). Dal punto di vista
della costruzione, questo progetto ha richiesto molta meno fatica rispetto al generatore
di segnale del Capitolo 11. La Tabella 12-8 elenca i componenti principali.
Tabella 12-8 - Lelenco dei prezzi dei componenti del termostato.

Prezzo Tot.
Quantit Articolo Fonte
unitario parz.
14,00
1 Arduino Nano SainSmart 14,00 $
$
Shield di prototipazione con 15,00
1 Adafruit 15,00 $
terminali a vite $
1 Modulo RTC DealeXtreme 2,00 $ 2,00 $
1 Modulo encoder rotativo Various 6,00 $ 6,00 $
10,00
1 Shield display LCD SainSmart 10,00 $
$
20,00
2 Sensori DHT22 Adafruit 10,00 $
$
1 Modulo con quattro rel SainSmart 7,00 $ 7,00 $
1 Custodia elettrica Home Depot 7,00 $ 7,00 $
a Il totale parziale il costo totale di ciascun articolo per una data quantit.

Costo totale delle parti = 81,00 $


Notate che i moduli KEYES, come lencoder rotativo KY-040, spesso si trovano in kit di
moduli. Possono essere acquistati come articoli singoli presso rivenditori su eBay e
Amazon, ma scegliere uno dei kit risulta pi economico.
Come nel caso degli altri progetti di esempio presentati in questo libro, probabilmente
potete trovare prezzi migliori di quelli mostrati nella Tabella 12-8 cercando in giro e
trovando offerte speciali. Ho visto schede tipo Nano vendute per soli 5 $ e sensori
DHT22 con prezzi tra i 7 $ e gli 8 $.

Prossimi passaggi
Questo progetto un esempio dei limiti che potete incontrare quando create dispositivi
complessi utilizzando soltanto shield e moduli gi pronti. Se dovessi creare la Versione 2
del termostato, costruirei una PCB personalizzata che contenga tutto su una sola
scheda. Come la GreenShield del Capitolo 10, sarebbe dotata di rel integrati e vi
includerei anche un alimentatore.
Questo design anche un ottimo candidato per un multiplexer I/O come il MPC23017
che abbiamo utilizzato nella PCB dello Switchinator nel Capitolo 10. Il display LCD pu
essere controllato con un MPC23017. Adafruit vende una versione della shield display
con un MPC23S17, che la versione SPI dellIC.
Inoltre, utilizzerei parti a montaggio superficiale per tutto eccetto forse per i rel, il
DHT22 e le morsettiere. Penso che la dimensione dei rel possa essere leggermente
ridotta, magari anche con parti a montaggio superficiale, dal momento che in realt non
devono gestire molta corrente sui contatti. Con un design attento e parti ben
selezionate, la dimensione dellintera PCB pu essere ridotta in modo significativo.
Alcune funzionalit desiderabili che semplicemente non ci stanno sul design attuale sono
uninterfaccia Bluetooth o WiFi, un lettore di schede flash microSD per registrare dati a
lungo termine e magari qualche ulteriore LED per il pannello anteriore. Cos com, il
termostato fatto con Arduino quasi un dispositivo IoT (Internet of Things), ma per
diventarlo del tutto richiede qualche modifica e qualche miglioramento. Di tutte le cose
pubblicizzate come dispositivi IoT, un termostato pu avere molto senso. Non sono
convinto che lasciare che la caffettiera o il forno a microonde parlino con il frigorifero sia
una buona idea.

Fonti
La Tabella 12-9 elenca i distributori e i rivenditori presso i quali io ho acquistato i
componenti del termostato. Come nel caso di tutti i progetti di esempio presentati in
questo libro, la maggior parte dei componenti si trovano presso varie fonti. Queste sono
semplicemente quelle che ho utilizzato quando ho effettuato i miei acquisti.
Tabella 12-9 - Le fonti delle parti.

Distributore URL
Adafruit www.adafruit.com
DealeXtreme (DX) www.dx.com
DFRobot www.dfrobot.com
SainSmart www.sainsmart.com

Ho trovato la custodia nel settore di elettricit del negozio Home Depot della mia zona,
ma potete trovare custodie elettriche simili presso qualsiasi ferramenta ben fornita.
13

Il modellino di lanciarazzi: lo studio di un


design

Questo capitolo diverso dai tre capitoli precedenti. Invece di utilizzare un progetto di
esempio (o diversi progetti, nel caso del Capitolo 10) per illustrare come si applicano in
applicazioni reali i concetti, gli strumenti e i componenti descritti nei capitoli precedenti,
questo capitolo illustra come eseguire lo studio di un design. Non costruiremo niente di
concreto, ma definiremo alcuni approcci possibili, identificheremo gli strumenti e i
componenti pi adatti e valuteremo i compromessi di design. Questo tipo di attivit di
ingegneria pu essere applicato non soltanto ai modellini di lanciarazzi, ma a qualsiasi
progetto di design con Arduino che presenti un grado qualunque di complessit.

NOTA Ricordate che, dal momento che in questo libro lenfasi principale posta sullhardware e sui relativi moduli,
sensori e componenti di Arduino, il software mostrato qui serve esclusivamente a sottolineare i punti chiave e non a
presentare esempi pronti per luso. Il codice completo del software relativo a esempi e progetti si trova su GitHub
(https://www.github.com/ardnut).

Panoramica
Un lanciarazzi controllato da Arduino unapplicazione interessante per diverse ragioni.
Innanzitutto, molto estensibile e lo si pu portare fino al punto che si vuole (e si pu),
entro i limiti imposti dallhardware di Arduino. In secondo luogo, dal punto di vista fisico il
lanciarazzi pu essere qualsiasi cosa: da una piccola scatola di plastica con un
interruttore e un LED a una console con cifre digitali e uno o due interruttori. Terzo, il
lanciarazzi pu supportare una vasta gamma di funzioni, al di l semplicemente della
possibilit di applicare corrente a un accenditore. Pu essere collegato per mezzo di
WiFi o di Bluetooth, avere la possibilit di controllare laccenditore continuamente,
generare una voce sintetica che annunci il conto alla rovescia e lo stato del lancio, input
di sicurezza e perfino la capacit di scollegare lalimentazione da un razzo prima del
lancio per mantenere le batterie completamente cariche. Quanta (o quanta poca) fatica
volete fare dipende dai vostri obiettivi, dalle vostre capacit e dalla vostra disponibilit
economica.
Prima di arrivare alla fine di questo capitolo, dovete essere diventati capaci di prendere
decisioni coscienti su quale hardware acquistare, su quanto deve essere difficile il
software da scrivere e su come anticipare il livello di impegno che richieder un
determinato design. Utilizzando il materiale presentato nei capitoli precedenti, dovete
riuscire a creare un elenco di componenti e a farvi unidea di quanto coster il design e
di quanto sar difficile da costruire. Dovete essere anche in grado di creare un
diagramma a blocchi preliminare e un diagramma di flusso del software del vostro
design. Una volta fatto tutto questo, non rimarr che procurarvi i componenti,
assemblarli e quindi creare e caricare il software per farli funzionare.

SUGGERIMENTO Prima di mettervi a costruire qualcosa del genere, dovete assicurarvi di aver capito bene le
considerazioni sulla sicurezza che implicano oggetti come un lanciarazzi. La National Association of Rocketry (NAR) e
la Tripoli Rocketry Association hanno pubblicato delle linee guida per maneggiare e lanciare in modo sicuro i
lanciarazzi. Inoltre, in molti stati esistono delle regole di base che riguardano dove e quando si possono effettuare lanci
e che cosa definisce un lanciarazzi.

Il ciclo del design


Quando progettiamo qualcosa con un grado anche solo moderato di complessit, raro
che non ci ritroviamo a ritornare a un passaggio precedente del processo per effettuare
modifiche o cercare alternative. A volte questo pu significare perfino buttare il design
originale e ricominciare da capo. Non infrequente. Il design un processo iterativo e,
man mano che avanza, diventa evidente quello che allinizio non lo era. Anticipare tutto a
priori praticamente impossibile.
Il processo di design segue la struttura generale che abbiamo presentato nel Capitolo
10. Cominciamo con una serie di obiettivi. Poi miglioriamo gli obiettivi per creare i
requisiti funzionali. Grazie ai requisiti funzionali possiamo identificare i tipi di hardware e
di software che soddisferanno i requisiti. Quindi analizziamo i dettagli dei componenti e
delle tecniche che abbiamo selezionato per valutarne lidoneit. La Figura 13-1 mostra
come funziona il ciclo del design.
Figura 13-1 - Il ciclo del design.

Alla fine di ciascun passaggio, ci fermeremo e analizzeremo quello che abbiamo fatto
fino a quel punto. Se ci fosse un problema, questo sarebbe il momento per decidere
come risolverlo. A seconda del tipo e della gravit del problema, possiamo decidere di
tornare indietro e rivedere il passaggio precedente, oppure possiamo decidere di
rinunciare a qualcosa che non sia essenziale e procedere riducendo le nostre
aspettative. Possiamo anche riscontrare dei problemi durante lo svolgimento di un
passaggio in particolare. Immaginiamo, per esempio, di aver scoperto che una
determinata shield, un sensore o un modulo semplicemente non si trovano e non
possiamo costruircelo da soli. In questo caso, dovremmo fermarci, tornare indietro e
vedere che cosa ci ha portato a quella decisione allinizio e se possiamo cambiarla per
adattarci alla situazione attuale.
In alcuni casi, pu non essere necessario costruire un vero prototipo. Questo spesso il
caso quando il design consiste principalmente di moduli gi pronti, come in molti design
basati su Arduino. A me piace costruire prototipi con piattaforme di prototipazione che
ho creato o acquistato, come il Duinokit e una breadboard che non richiede saldature
che abbiamo visto nel Capitolo 10, oppure lArduino integrato che abbiamo utilizzato nei
Capitoli 11 e 12. Questo mi permette di collegare le cose senza dover ricorrere a
saldare fili e aprire fori, ottenendo comunque le stesse funzionalit che presenterebbe
lunit finita. In alcuni progetti di design, potete accorgervi che potete saltare il
passaggio relativo alla prototipazione, ma dovete sapere che, se si presenta un
problema nel design finale, affrontarlo pu risultate costoso e richiedere molto tempo.
NOTA In una situazione reale, il costo che comporta risolvere un difetto del design oppure dellimplementazione, che
sia hardware o software, aumenta man mano che il progetto avanza lungo i passaggi mostrati nella Figura 13-1. In altre
parole, molto pi economico risolvere un requisito funzionale non valido che riscrivere un software difettoso oppure
affrontare un flusso di design dellhardware. Allo stesso modo, pi facile e meno costoso affrontare un problema in un
design che sta per entrare in produzione. Per questo i prototipi sono cos diffusi.

Gli obiettivi
Il primo passaggio per un design decidere quali obiettivi deve poter raggiungere.
Allinizio possiamo non disporre di tutti i dettagli, ma dobbiamo poter essere capaci di
deciderne le caratteristiche fondamentali, anche se al principio sono soltanto alcune.
Lelenco di obiettivi pu allungarsi nel corso del tempo, a volte radicalmente. In effetti,
mantenere gli obiettivi del design in linea con la realt spesso diventa una sfida,
specialmente quando chi definisce gli obiettivi non la stessa persona che dovr
costruire il design finale. Fortunatamente, questo non il nostro caso. Finch
manterremo il nostro entusiasmo e il nostro ottimismo in linea con la realt, staremo
andando bene.
Quando definite un elenco di obiettivi, vi consiglio di organizzarlo in base alla loro
importanza. In altre parole, dobbiamo mettere le caratteristiche imprescindibili allinizio
dellelenco e quelle che solo servono ad aggiungere dettagli alla fine. Questo ci
permetter di eliminare elementi dallelenco se il livello di fatica, costo o tempo dovesse
superare i limiti accettabili, senza perdere la funzionalit essenziale di quello che stiamo
cercando di costruire.
Ecco il mio elenco di obiettivi prioritari per un lanciarazzi automatico:
1. Il controller del lanciarazzi deve incorporare un timer per il conto alla rovescia con
intervalli programmabili (5, 10, 15, 30 e 60 secondi).
2. Il conto alla rovescia deve poter essere interrotto in qualsiasi momento per diversi
motivi (che spiegher tra poco).
3. Il controller del lanciarazzi deve essere dotato di un interruttore di interblocco di
sicurezza. Il lanciarazzi non inizier il conteggio n attiver gli accenditori a meno
che linterblocco di sicurezza non si trovi nella posizione on.
4. Il timer del contro alla rovescia deve essere attivato premendo un interruttore a
pressione.
5. Il timer del contro alla rovescia non deve attivarsi a meno che un interruttore di
sicurezza non venga sbloccato prima di premere il pulsante di avvio del conto alla
rovescia e durante lintera durata del conto. Questo pu essere un ciondolo
portatile o una piccola scatola e deve essere separato dallinterruttore che avvia il
conto.
6. Se linterruttore di sicurezza viene rilasciato prima del lancio, il conto alla rovescia
si deve interrompere e il controller deve entrare in una modalit di sicurezza (con i
circuiti dellaccenditore disattivati e messi a terra).
7. Il lanciarazzi deve essere in grado di alimentare diversi accenditori
contemporaneamente. Due il numero minimo, ma se possibile possono essere
fino a otto.
8. Ciascun accenditore deve poter essere monitorato indipendentemente da tutti gli
altri, per poter rilevare problemi di continuit dei circuiti prima del lancio.
9. Uninterruzione di continuit in uno qualsiasi degli accenditori deve interrompere il
lancio (la stessa risposta di quando si sblocca prima del tempo linterruttore di
sicurezza).
10. Il controller deve utilizzare un LED che lampeggia per tener traccia del conto alla
rovescia in secondi. Altri indicatori LED devono mostrare lo stato del controller
(caricato, conto alla rovescia in corso, interruzione di sicurezza o difetto degli
accenditori).
Gli obiettivi secondari sono questi:
1. Un display LED a 7 segmenti deve mostrare il conto alla rovescia.
2. Un display LED a 7 segmenti deve mostrare lora corrente.
3. Un LCD 16 2 deve mostrare i dati di stato del sistema e i messaggi di errore.
4. Tutti i componenti devono essere montati in un contenitore di basso profilo con un
coperchio inclinato.
E questi sono gli obiettivi facoltativi:
1. Il controller del lanciarazzi deve avere la capacit di attivare dispositivi esterni in
determinati momenti della sequenza del conto alla rovescia, come scollegare la
messa a terra, lanciare sirene di avvertimento e attivare componenti elettronici
integrati sulla scheda (fotocamera e cos via).
2. Il controller deve essere dotato di un connettore per collegare un display a 7
segmenti perch si possa mostrare un evento a un gruppo di persone.
3. Il controller deve incorporare la possibilit di generare una voce sintetica che
annunci il conto alla rovescia e lo stato.
4. Uninterfaccia Bluetooth deve poter essere utilizzata per collegarsi a un sistema
remoto di controllo delle condizioni meteorologiche (da utilizzarsi principalmente
per rilevare la velocit del vento nella zona del lancio). Se lo si utilizza, il sistema
deve anche potersi interrompere in caso di velocit del vento eccessiva e indicarlo
al direttore del lancio (lutente).
Questo un elenco piuttosto vasto e ambizioso, a dire la verit. Raggiungere gli obiettivi
principali non sembra troppo difficile, che quello che deve succedere con gli obiettivi
principali. Gli obiettivi secondari sono un pu pi complicati e quelli facoltativi, sebbene
siano intriganti, possono gravare sulla resistenza della costruzione (oltre a comportare
una spesa maggiore).

Selezionare e definire i requisiti funzionali


Il modo in cui ho scritto gli obiettivi ci permette di passare direttamente ai requisiti
funzionali con un breve passaggio. Un requisito deve essere chiaro, conciso, coerente e
verificabile e in alcuni casi gli obiettivi sono definiti come requisiti, in modo che sia pi
facile per voi.
La grande questione adesso : quanti degli obiettivi possiamo confermare e trasformare
in requisiti funzionali? Per poter rispondere a questa domanda, dobbiamo utilizzare un
sistema di punteggio di qualche tipo per determinare quanto ciascun obiettivo sar
difficile, caro e necessario da raggiungere.
Cominceremo dagli obiettivi principali. La Tabella 13-1 mostra un elenco di obiettivi
principali con le mie migliori valutazioni in relazione a difficolt, spesa e necessit
complessive. Ciascun aspetto valutato in base a una scala da 1 a 5, dove 1 la
valutazione pi bassa e 5 la pi alta.
Tabella 13-1 - La valutazione degli obiettivi principali.

Obiettivo Difficolt Costo Necessit


1.1 2 2 2
1.2 3 2 5
1.3 3 2 5
1.4 2 2 4
1.5 2 3 5
1.6 2 1 5
1.7 3 3 3
1.8 4 3 5
1.9 3 2 5
1.10 3 2 2
Da qui possiamo concludere che, se necessario, lobiettivo 1.1, il timer del conto alla
rovescia programmabile, pu essere sostituito da un conteggio fisso di 10 o 15 secondi.
Risulta anche evidente che lobiettivo 1.10, le luci lampeggianti, pu ricadere nella
categoria dei capricci, o degli obiettivi secondari, e se necessario pu essere omesso
(anche se probabilmente vorremo mantenere almeno il LED del conto alla rovescia
perch ci faccia sapere che sta succedendo qualcosa).
Possiamo fare lo stesso per gli obiettivi secondari e facoltativi, come mostra la Tabella
13-2.
Tabella 13-2 - La valutazione degli obiettivi secondari e facoltativi.

Obiettivo Difficolt Costo Necessit


2.1 3 3 2
2.2 3 3 2
2.3 3 3 2
2.4 3 3 2
3.1 4 4 1
3.2 4 3 1
3.3 4 4 1
3.4 4 4 1

Potete notare che tra la Tabella 13-1 e la Tabella 13-2 emerge un pattern interessante.
Gli obiettivi principali sono tutti relativamente poco cari e facili da implementare. Inoltre,
con le eccezioni di 1.1 e 1.10, sono tutti necessari. Nella Tabella 13-2 vediamo che, man
mano che crescono la spesa e la difficolt, decresce la necessit. Nessuno degli
obiettivi facoltativi necessario, anche se tutti sarebbero molto divertenti da
implementare.
No ho organizzato gli obiettivi intenzionalmente quando li ho scritti, ma mi sono venuti in
questordine. Immagino che possa essere il risultato del fatto che faccio cose di questo
genere da diversi anni, ma in ogni caso a voi converr organizzare i vostri obiettivi
innanzitutto sulla base della necessit e poi sulla base di costo o difficolt, a seconda di
che cosa pi importante per voi: se il denaro o il tempo.
Si deve arrivare a un compromesso. Se qualcosa necessario ma anche caro,
dobbiamo eliminare qualcosa che non sia necessario per non elevare il costo del
progetto, oppure possiamo decidere di investire pi denaro per raggiungere entrambi gli
obiettivi? In alcuni casi, come quando ci tocca scegliere tra obiettivi principali e obiettivi
facoltativi, la decisione chiara. Il risultato finale pu non essere entusiasmante come
sarebbe stato altrimenti, ma nemmeno potremo andare in bancarotta per ottenerlo.
Lancer comunque bene i razzi. Quando invece dobbiamo scegliere tra due obiettivi
principali, con lo stesso livello di necessit e lo stesso costo, come gli obiettivi 1.1 e
1.10, la scelta pu dipendere da quanto sono difficili gli obiettivi. In questo caso,
probabilmente installare un interruttore rotativo per selezionare la durata del conto alla
rovescia sarebbe pi facile che aprire dei buchi per dei LED, collegarli e installarli e poi
creare il software necessario per controllarli.
Per amor di continuit con lanalisi del design, immaginiamo di voler mantenere tutti gli
obiettivi in modo da poter vedere come influenzeranno il design e la selezione dei
componenti nei prossimi passaggi. La Tabella 13-3 elenca i requisiti funzionali derivati
dagli obiettivi.
Tabella 13-3 - I requisiti funzionali del lanciarazzi.

Req Descrizione
Il controller del lanciarazzi deve incorporare un timer per il conto alla
1.1 rovescia. Quando questo arriva a zero, viene/vengono attivato/i l/gli
accenditore/i.
Il timer del conto alla rovescia deve avere tre durate programmabili di 5, 10,
1.1.1
15, 30 e 60 secondi.
Le durate del conto alla rovescia devono essere selezionate utilizzando un
1.1.2
interruttore rotativo da cinque posizioni.
Se la durata del conto alla rovescia viene cambiata a met strada, il conto
1.1.3
alla rovescia si deve interrompere.
Il conto alla rovescia deve poter essere interrotto in qualsiasi momento per
1.2
diverse ragioni (spiegate tra poco).
Il conto alla rovescia deve essere interrotto se un circuito di un accenditore
1.2.1
che dovrebbe essere chiuso aperto (vedere 1.7.1 e 1.9.1).
Il conto alla rovescia deve essere interrotto se la durata del conto cambia
1.2.2
mentre attivo il conto alla rovescia.
Il conto alla rovescia deve essere interrotto se linterruttore di sicurezza
1.2.3
viene rilasciato durante il conto.
Il controller del lanciarazzi deve essere dotato di un interruttore di interblocco
1.3
di sicurezza a inserimento.
Il lanciarazzi non deve attivare il conteggio o attivare gli accenditori a meno
1.3.1
che linterruttore di sicurezza non si trovi nella posizione on.
Il conto alla rovescia deve interrompersi se linterruttore di sicurezza
1.3.2
impostato su off durante il conto alla rovescia.
Il timer del conto alla rovescia deve essere attivato premendo un interruttore
1.4
a pressione.
1.4.1 Per attivare il conto alla rovescia si deve utilizzare un pulsante di lancio.
Il pulsante di lancio non deve poter funzionare a meno che linterruttore range
1.4.2
safety non sia attivato.
Il lanciarazzi deve utilizzare un interruttore range safety per controllare il
1.5
conto alla rovescia e il lancio.
Il conto alla rovescia del lancio non pu avanzare a meno che un interruttore
1.5.1 di sicurezza non venga disattivato prima della pressione del pulsante di
lancio.
Linterruttore range safety deve essere attivato manualmente durante lintera
1.5.2
durata del conto alla rovescia.
Linterruttore range safety pu essere un ciondolo portatile o una piccola
1.5.3
scatola e deve essere dotato di almeno 10 piedi (3 m) di cavo elettrico.
Se il conto alla rovescia viene interrotto per qualsiasi ragione, il lanciarazzi
1.6
deve entrare nella modalit di sicurezza.
Nella modalit di sicurezza, tutte le linee degli accenditori devono essere
1.6.1
disattivate e messe a terra.
Per uscire dalla modalit di sicurezza deve essere necessario disarmare il
1.6.2
lanciarazzi utilizzando linterruttore di sicurezza.
Il lanciarazzi deve essere in grado di attivare diversi accenditori
1.7
contemporaneamente.
1.7.1 Il lanciarazzi deve poter supportare fino a sei circuiti attivi degli accenditori.
Per selezionare il numero di circuiti attivi degli accenditori si deve utilizzare un
1.7.2
interruttore rotativo.
Ciascun accenditore deve poter essere monitorato indipendentemente dagli
1.8
altri per poter rilevare problemi di continuit dei circuiti prima del lancio.
Ciascun circuito degli accenditori deve avere continuit per permettere di
1.8.1
verificare che laccenditore sia collegato.
La corrente utilizzata per determinare la continuit non deve eccedere i 250
1.8.2
uA su ciascun circuito degli accenditori.
La mancanza di continuit di uno qualsiasi degli accenditori deve
1.9
interrompere il timer del conto alla rovescia.
Il conto alla rovescia non deve iniziare se uno qualsiasi dei circuiti degli
1.9.1
accenditori non ha continuit.
Il conto alla rovescia si deve interrompere se uno qualsiasi dei circuiti attivi
1.9.2
degli accenditori perde continuit durante il conto.
Il lanciarazzi deve utilizzare dei LED per indicare i circuiti attivi e pronti
1.9.3 (vedere 1.1.2).

Il controller deve utilizzare dei LED per indicare il conto alla rovescia e lo
1.10
stato.
Un LED lampeggiante deve tener traccia del conto alla rovescia in secondi,
1.10.1
un lampeggiamento al secondo.
Una serie di LED deve mostrare lo stato attivo e la continuit dei circuiti degli
1.10.2
accenditori.
1.10.3 Un LED deve indicare lo stato attivo dellinterruttore range safety.
1.10.4 Un LED deve indicare un range safety abort.
1.10.5 Un LED deve indicare lo stato dellinterblocco di sicurezza.
Un LED lampeggiante deve indicare quando il lanciarazzi si trova nella
1.10.6
modalit di sicurezza dopo uninterruzione.
2.1 Un display LED a 7 segmenti deve mostrare il conto alla rovescia.
Un display LED rosso da 2 cifre e a 7 segmenti deve mostrare il conto alla
2.1.1
rovescia.
Il conto alla rovescia deve mostrare dei trattini dopo che un lancio avvenuto
2.1.2
correttamente.
2.1.3 In caso di interruzione, il display deve mostrare la parola Abort.
2.2 Un display LED a 7 segmenti deve mostrare lora corrente.
Un display LED giallo da 4 cifre e a 7 segmenti con formato OO:MM deve
2.2.1
mostrare lora corrente.
Il display dellora deve poter essere configurato utilizzando un pulsante sul
2.2.2
pannello anteriore del lanciarazzi.
2.2.3 Il display dellora deve essere nel formato da 24 ore.
Un display LCD 16 2 deve mostrare i dati relativi allo stato del sistema e i
2.3
messaggi di errore.
2.3.1 Un display LCD 16 2 deve mostrare i messaggi di stato e i problemi.
Il display LCD deve anche poter mostrare messaggi provenienti da sorgenti
2.3.2
esterne come una stazione meteorologica remota.
Tutti i componenti devono essere montati in uno chassis di basso profilo con
2.4
coperchio inclinato.
Per contenere il lanciarazzi deve essere utilizzato uno chassis di metallo di
2.4.1
basso profilo.
Lo chassis deve essere almeno largo 14 pollici e profondo 10 pollici (35,5
2.4.2 25,5 cm), con unaltezza di 1,5 pollici nella parte anteriore e di 3 pollici in
quella posteriore (3,8 7,6 cm).

Il controller del lanciarazzi deve avere la possibilit di attivare dispositivi


3.1
esterni in determinati momenti del conto alla rovescia.
3.1.1 Il controller deve essere capace di attivare dispositivi esterni per mezzo di
rel in punti del conto alla rovescia che definisce lutente.
I punti dazione devono poter essere impostati utilizzando un collegamento
3.1.2
USB con lArduino sul lanciarazzi.
Il controller deve essere dotato di un connettore per collegare un grande
3.2
display a 7 segmenti per mostrare un evento a un gruppo di persone.
I segnali diretti al display interno da due cifre del conto alla rovescia devono
3.2.1
essere duplicati a un connettore sulla parte posteriore dello chassis.
I segnali del display esterno devono essere controllati da un IC ad alta
3.2.2
tensione che fornisca corrente sufficiente.
Il controller deve incorporare la possibilit di generare una voce sintetica che
3.3
annunci il conto alla rovescia e lo stato.
Il lanciarazzi deve incorporare una shield di sintesi vocale per produrre una
3.3.1
voce che si possa capire.
3.3.2 Loutput della voce deve poter essere definito dallutente.
Per collegare una stazione meteorologica remota, si deve utilizzare un
3.4
interfaccia Bluetooth.
Lutente deve poter definire un limite massimo per la velocit del vento. Se la
3.4.1
velocit del vento lo supera, il lancio si deve interrompere automaticamente.
Un LED sul pannello anteriore deve indicare che il lancio stato interrotto
3.4.2
per via di uneccessiva velocit del vento.

Ho cercato di mantenere una relazione uno-a-uno con gli obiettivi elencati in precedenza,
ma c qualche deviazione, principalmente per evitare la ridondanza.

SUGGERIMENTO Il design utilizza un interruttore range safety che deve essere tenuto premuto (attivo) durante il
conto alla rovescia. Questa una funzionalit di sicurezza essenziale. Nella pratica, devono essere coinvolte due
persone: un direttore del lancio e un addetto alla sicurezza. E a questultimo che tocca interrompere il lancio se
qualcosa non come dovrebbe essere prima dellaccensione (per esempio, c troppo vento o gente nella zona di
lancio).

Creare il design preliminare


Adesso che abbiamo definito i requisiti funzionali, possiamo vedere alcuni ovvi criteri di
design. Sappiamo che avremo bisogno di due interruttori rotativi, di un display LCD, di
due display a 7 segmenti, di un orologio in tempo reale di un qualche tipo, di un ciondolo
o di una scatolina con un interruttore a pulsante (linterruttore range safety), di alcuni
connettori sul pannello posteriore, di alcuni rel e di veri LED di diversi colori.
Per farci unidea migliore di che cosa sar coinvolto nel design, possiamo creare un
diagramma a blocchi preliminare come quello mostrato nella Figura 13-2. Osservando il
diagramma a blocchi, notiamo immediatamente che qualcosa come un Arduino Uno non
sarebbe in grado di gestire tutti gli I/O necessari. Dobbiamo quindi orientarci su un
Mega2560. Possiamo anche decidere di utilizzare pi di un Arduino che si suddividano il
carico.

Figura 13-2 - Il diagramma a blocchi preliminare del lanciarazzi.

La Figura 13-3 una versione pi raffinata del diagramma a blocchi. Notiamo che
utilizza un Uno per la sintesi vocale, un altro per il Bluetooth e un Mega2560 per le
funzioni di controllo principali. La MCU ATmega2560 utilizzata nel Mega2560 dotata di
diverse interfacce USART, per cui ciascuna delle schede Uno pu disporre del suo
proprio canale di comunicazione dedicato.
Figura 13-3 - Il diagramma a blocchi perfezionato del lanciarazzi.

Nella Figura 13-3, diverse delle interfacce per i moduli esterni sono state perfezionate e
assegnate come tipi I2C. Inoltre, sono state identificate le porte I/O digitali (DIO). Per
gestire i rel e i 12 LED di stato degli accenditori, stato scelto un expander I/O (simile
a quello che abbiamo utilizzato nello Switchinator nel Capitolo 10).

Costruire o acquistare
A un certo punto, quando ci si avventura in progetti moderatamente complessi, diventa necessario scendere a
compromessi per decidere se acquistare un modulo hardware gi pronto oppure progettarne e costruirne uno
tagliato su misura per i requisiti specifici del design. Questa decisione pu risultare difficile e non riguarda
soltanto i costi.
Un componente o un modulo COTS (commercial off-the-shelf) pu essere dotato o meno di tutte le funzionalit
delle quali abbiamo bisogno per il nostro design. Pu disporre delle funzioni corrette, ma dei connettori sbagliati,
o viceversa. Pu essere della dimensione sbagliata, oppure soltanto leggermente fuori misura su un lato o
sullaltro. Pu perfino richiedere una tensione diversa da quella di tutti gli altri componenti del design e richiedere
ulteriori circuiti per adattarlo.Quindi, ha senso adattare il design del componente COTS, oppure sarebbe meglio
costruire un componente personalizzato che sia esattamente quello di cui abbiamo bisogno? Se la modifica
richiesta dal modulo minima, probabilmente conviene semplicemente adattarlo, piuttosto che spendere tempo
e denaro per un design personalizzato. Se invece il problema pi serio, come le dimensioni fisiche o funzioni
non necessarie che produrranno conflitti, ha molto pi senso costruire il componente a partire da un design
pulito e mantenerlo coerente con il resto dei componenti.
Se non siete sicuri, di solito la decisione emerge valutando il costo e il tempo necessario per utilizzare il
componente COTS e confrontandoli con quelli necessari per costruire una parte personalizzata. Se continua a
essere difficile, per decidere per che cosa votare si possono utilizzare altri criteri: di quanto controllo abbiamo
realmente bisogno sulla produzione e sulle funzioni interne del componente in questione? Se stiamo costruendo
un prodotto commerciale e c la possibilit che il modulo COTS che vogliamo utilizzare venga abbandonato
mentre il nostro prodotto ancora in produzione, ci conviene decidere di costruircelo da soli. Analogamente, se
abbiamo bisogno di visibilit sul funzionamento interno del componente COTS ma per noi una scatola nera,
ci conviene decidere di costruirne una versione personalizzata.

La fattibilit del design


Quindi, quanto realistico il design che ci venuto in mente? Abbastanza? S, senza
dubbio. eccessivo? Forse. Adesso il momento di tornare indietro e di rivedere il
design preliminare con occhio critico, disposti a rinunciare a tutte le funzionalit meno
necessarie e pi frivole senza rimorsi e senza rimpianti.

Le funzionalit accessorie
In ingegneria, per descrivere funzionalit che in realt non contribuiscono al funzionamento di un sistema, ma
aggiungono soltanto un po di sale sul prodotto finale, spesso si utilizza lespressione inglese bells and
whistles. Un esempio pu essere un display TFT a colori su una macchina per il caff. Aiuta realmente il
dispositivo a fare il caff pi buono? No, naturalmente no. Si presenta elegante e high-tech in cucina? S, ed
per questo che l ed per questo saremmo disposti a pagare la macchina del caff un po di pi.
Considerate questo: le automobili moderne sono piene di accessori. Tutto quello che necessario in una
macchina in realt sono soltanto quattro ruote, un motore, qualche sedile e delle finestre per proteggere i
passeggeri da pioggia, vento e polvere. In realt, nessuno ha bisogno di un sound system da 10 altoparlanti, di
un telefono cellulare in vivavoce, di un sistema di navigazione e di sedili elettrici da varie posizioni soltanto per
andare a fare la spesa, giusto? Unautomobile essenziale senza tutti questi accessori pu essere brutta da
vedere, ma vi porter lo stesso dove volete o dove dovete andare. Inoltre, questa automobile semplice e brutta
probabilmente star ancora funzionando mentre laltra piena di accessori passer il suo tempo presso la
concessionaria nel reparto dedicato alle riparazioni.
La conclusione che le cose pi semplici non soltanto sono meno care, ma tendono anche a essere pi
affidabili, perch contengono meno componenti che si possono rompere. Quindi, quando rivediamo la fattibilit di
un design, importante prestare attenzione a ben pi che soltanto alla sua fattibilit tecnica. Dobbiamo
controllare anche gli accessori che in realt non contribuiscono al funzionamento del dispositivo, ma possono
contribuire al fatto che smetta presto di funzionare.

La fattibilit una valutazione relativa. In altre parole, fattibile in relazione a cosa?


Alcune cose possono non essere fattibili per qualcuno che lavora sul tavolo della cucina
ed esserlo perfettamente per unaltra persona che ha accesso a tutto il negozio.
Il budget disponibile unaltra questione importante, dal momento che rappresenta un
limite. Una persona con poca disponibilit economica e poco tempo non pu sperare di
ottenere lo stesso di qualcun altro dotato di una generosa quantit di denaro da
spendere e molto tempo libero. Dal momento che io solo soltanto una persona con poco
tempo libero e soltanto una piccola quantit di risparmi a mia disposizione, devo essere
prudente rispetto a quanto posso ottenere e a quanto velocemente posso aspettarmi di
ottenerlo.
E sono sicuro di non essere il solo.
Quando valuto la fattibilit di un design e delle sue funzionalit, mi piace utilizzare questi
cinque criteri:
La funzionalit o il design ha senso dal punto di vista funzionale?
Ha senso dal punto di vista del costo?
C qualche componente che pu essere difficile da trovare?
La funzionalit o il design presenta qualche aspetto che non sicuro? Pu essere
assemblato, programmato e testato da una sola persona in un periodo di tempo
ragionevole?
Se la risposta anche solo a una di queste domande no, o addirittura forse, significa
che il componente o la funzionalit del design in questione deve essere candidata
alleliminazione.
Il design del lanciarazzi, come rappresentato nella Figura 13-3, sarebbe davvero una
cosa meravigliosa, ma non credo che sia qualcosa che io possa aspettarmi di portare a
termine in un periodo di tempo ragionevole. Il miglior approccio potrebbe essere
mantenerlo semplice (pi semplice possibile, comunque) e creare un design che possa
essere espanso in futuro.
Per via del modo nel quale abbiamo organizzato gli obiettivi del lanciarazzi, ridurre il
design piuttosto facile. I requisiti funzionali di livello 3 definiscono cose che richiedono
sia molto tempo che molto denaro. Inoltre, non contribuiscono in nessun modo
essenziale alla funzionalit chiave del lanciarazzi, che naturalmente lanciare modellini
di razzi. Per questo, ho deciso di designare tutti i requisiti funzionali di livello 3 come
funzionalit opzionali da aggiungere in eventuali future implementazioni.
Chiameremo il lanciarazzi essenziale, che formato dai requisiti funzionali di livello 1 e di
livello 2, la versione Fase I. Possiamo fare riferimento al design esteso come versione
Fase II. Anche se stiamo pensando al design della Fase I, possiamo cercare gi dei
modi per semplificare ulteriormente il design senza sacrificare nessuna delle funzionalit
necessarie.
Per esempio, nella Figura 13-3 c un expander I/O. Che cos? Pu essere qualcosa
come una shield despansione I/O Centipede, descritta nel Capitolo 8. La Centipede ha
64 linee I/O digitali e quindi una di queste pu facilmente gestire i LED di stato degli
accenditori, i 4 LED di stato del sistema e i 2 interruttori rotativi.
Possiamo ulteriormente semplificare il cablaggio utilizzando il pi possibile SPI e I2C.
LRTC, lLCD 16 2 e lexpander I/O sono tutti disponibili con interfacce I2C e moduli
display a 7 segmenti per il conto e i display dellora sono disponibili con interfacce SPI.
Il diagramma a blocchi rivisto per la Fase I mostrato nella Figura 13-4.
Figura 13-4 - Il diagramma a blocchi della Fase I.

Io ho scelto di lasciare i rel per il controllo del lancio collegati ai pin I/O digitali discreti
della Mega2560, anzich guidarli per lexpander I/O. In questo modo, non c niente tra i
rel del lancio e lArduino che li controlla. Probabilmente non far una grande differenza,
ma elimina una potenziale fonte di guasto dalla pista di controllo principale del
lanciarazzi.
Lo stesso ragionamento il motivo per il quale lavvio del conto, linterruttore range
safety e quello per armare il sistema sono collegati direttamente allArduino. Inoltre,
collegando gli interruttori direttamente potremmo approfittare della capacit di interrupt
dei pin della MCU AVR, se volessimo.
Il diagramma mostrato nella Figura 13-4 quello che utilizzeremo per procedere. A un
certo punto del futuro, potrebbe diventare fattibile provare la Fase II, ma per il momento
no. Rimarr l, in attesa del momento nel quale potr tradursi in realt.

Lelenco preliminare dei componenti


Con un design preliminare sotto mano per la versione Fase I, disponiamo di abbastanza
informazioni da poter assemblare un elenco preliminare di parti. Riguardando i requisiti
funzionali e contando il numero di volte nel quale sono menzionati vari tipi di controlli e di
funzioni, possiamo farci una prima idea delle quantit che ci serviranno.
Lelenco preliminare dei componenti non include cose come le PCB del prototipo per
fare il patching del cablaggio e montare piccole morsettiere (come quelle mostrate nel
Capitolo 11). Questi requisiti possono essere scoperti e documentati quando viene il
momento di collegare il tutto in ununit funzionante, che sia un prototipo o la versione
finale.
Tabella 13-4 - Lelenco preliminare dei componenti del lanciarazzi.

Quantit Descrizione
1 Arduino Mega2560
Display LED a 7 segmenti e 2
1
cifre
1 Shield con terminali a vite Mega
Display LED a 7 segmenti da 4
1
cifre per lora
1 Shield display LCD
1 Interruttore Keyed
1 Modulo RTC (Real-time clock)
1 Grande interruttore a pressione
2 Moduli con quattro rel
Chassis di metallo con coperchio
1
inclinato

Il prototipo
Come abbiamo visto prima, un prototipo serve per diversi scopi importanti. Prima di
tutto, permette di lavorare con il design e con i suoi componenti in una forma flessibile e
facile da modificare. Se un modulo o un sensore non funziona come pensavamo che
funzionasse, nel prototipo molto pi facile cambiarlo di quanto non sarebbe aprire
ulteriori fori in uno chassis di metallo. Secondo, nel caso di design che richiedono una
PCB personalizzata (o due o tre), ci sar un lasso di tempo tra il momento in cui si invia
il progetto della PCB e quello in qui arrivano le schede finite e si pu iniziare il
montaggio. Se stiamo costruendo un prototipo, questo lasso di tempo pu essere
sfruttato lavorando sul software o sulla documentazione, oppure su entrambi. Infine, in
alcuni casi possiamo avere a disposizione gi tutto quello che ci serve per il prototipo e
portarlo al punto nel quale pu servire come sostituto del prodotto finale relativamente
semplice. La Figura 13-5 mostra un semplice prototipo con un Arduino Mega2560
costruito a partire da alcune sezioni tagliate da una tavola di pino.
Figura 13-5 - Il prototipo della Mega2560.

I prototipi possono definitivamente far risparmiare molto tempo ed evitare molti


problemi, ma, come ho detto prima, a volte questo passaggio pu essere saltato. Nel
caso del modellino di lanciarazzi, abbiamo un design che dal punto di vista fisico non
eccessivamente complesso, non ci sono PCB personalizzate da progettare e tutti i
componenti sono componenti COTS ben noti.
Se volete, potete certamente costruire un prototipo. Se prevedete di incorporare gli
obiettivi facoltativi, un prototipo probabilmente una buona idea. Potete montare tutte le
parti su una scheda grande e assicurarvi che tutto funzioni come vi aspettate, prima di
inserirlo in una custodia di metallo. Un tagliere da cucina probabilmente presenter le
giuste dimensioni. Questo, a proposito, da dove viene il termine breadboard, nel
caso ve lo siate mai chiesto. Montare schede Arduino, morsettiere e altre cose di vario
genere su una scheda fa parte di una lunga tradizione che risale ai tempi della radio
allinizio del XX secolo. Coloro che sperimentavano con la radio utilizzavano
letteralmente taglieri per il pane, come quelli che si trovano nelle cucine, come base per
i terminali, gli zoccoli delle valvole e altri componenti. A volte attaccavano uno schema
sul tagliere, per offrire al costruttore qualcosa da seguire. Molte delle prime radio erano
fatte principalmente di legno e la base per i componenti non era molto diversa dalle
breadboard che si utilizzavano per prototipare e testare le radio ai loro inizi.
Ma anche se le breadboard hanno un passato storico, per questo studio di design dar
per scontato che passeremo direttamente allunit finale (per esempi di prototipi, potete
consultare i tre capitoli precedenti). Per il lanciarazzi abbiamo una buona serie di
requisiti funzionali Fase I e sappiamo quali componenti principali ci serviranno. Quindi,
possiamo passare allhardware finale e al design del software.
Il design finale
Il design finale dove applichiamo i requisiti funzionali, insieme a quello che abbiamo
imparato dal prototipo (se ne abbiamo creato uno), per arrivare a un design che
descrive come deve apparire il dispositivo finito e come deve funzionare. Idealmente,
deve comportarsi esattamente come il prototipo e il software deve essere lo stesso o
quasi uguale.

Gli aspetti elettrici


Lo schema mostrato nella Figura 13-6 illustra tutti i circuiti del lanciarazzi eccetto quello
per controllare la continuit degli accenditori, che mostrato nella Figura 13-7. Notate
che lRTC, il display LCD e la shield despansione I/O utilizzano tutti linterfaccia I2C. I
due display a 7 segmenti utilizzano linterfaccia SPI. Soltanto i rel utilizzano output
discreti digitali.

Figura 13-6 - Lo schema finale della Fase I.


Figura 13-7 - I circuiti di controllo della continuit degli accenditori.

Un tipico accenditore per modellini di razzi richiede circa 0,5 A o pi per laccensione.
Per determinare se il circuito dellaccenditore aperto o chiuso misurando la tensione
nel punto etichettato come sense, possiamo utilizzare un circuito come quello mostrato
nella Figura 13-7. La questione principale rilevare lo stato aperto o chiuso
dellaccenditore senza applicare abbastanza corrente da causarne laccensione. Con
questo circuito, nellaccenditore scorrono soltanto circa 2 mA e il diodo Zener da 4,9 V
impedisce alla tensione per il lancio completo di tornare negli input analogici di Arduino.

NOTA Sono stati ideati altri circuiti di controllo della continuit degli accenditori, alcuni pi complessi di altri (sembra
che esista una serie di piccole attivit domestiche che si dedicano a creare controller di lanciarazzi e circuiti per testare
la continuit dei modellini di razzi). Se volete saperne di pi, una fonte di informazioni lo studio dettagliato di tecniche
di test di continuit degli accenditori (http://bit.ly/brohm-igniter) di J. R. Brohm.

Nello schema mostrato nella Figura 13-6, sei circuiti di continuit sono collegati a sei
input analogici della Mega2560 con etichetta Igniter Continuity Sense. Per questo, vi
suggerisco che i sei circuiti identici siano costruiti utilizzando una scheda di
prototipazione e alcune morsettiere da 0,1 pollici (2,54 mm), analogamente a quello che
abbiamo fatto per la protezione degli input nel Capitolo 11. Per collegare gli accenditori
al controller del lanciarazzi possiamo utilizzare alcuni morsetti come quelli del tipo che si
utilizza per collegare gli altoparlanti agli stereo di alta gamma. Vi suggerisco anche di
utilizzare questi morsetti per collegare una batteria esterna. Se volete aggiungere delle
batterie nello chassis del controller del lanciarazzi, potete utilizzare unulteriore coppia di
morsetti per collegare le batterie interne ai circuiti dellaccenditore. Questo vi
permetter di scegliere quale sorgente di alimentazione utilizzare, a seconda del numero
di circuiti degli accenditori che saranno attivi. Nella Figura 13-8 mostrato come si
collegano i circuiti per controllare la continuit degli accenditori con i morsetti degli
accenditori.

Figura 13-8 - Collegare i circuiti per rilevare gli accenditori.

Lidea che sta dietro ai 12 LED collegati allexpander I/O ed etichettati come Igniter
Continuity Indicators e Igniter Select Indicators nella Figura 13-6 mostrare quanti
circuiti degli accenditori sono attivi e in quale stato si trovano in un dato momento.
Questo determinato dallinterruttore rotativo da sei posizioni S6, con le impostazioni 1,
2, 3, 4, 5 e 6. Il LED di continuit corrispondenti si illumineranno per indicare che gli
accenditori selezionati sono collegati e pronti. Dopo il lancio, i LED di continuit devono
essere spenti e devono rimanere accesi soltanto i LED della selezione attiva.
La Figura 13-9 mostra una vista diversa del collegamento, con unenfasi sugli output
dellaccenditore, i moduli a scheda perforata per i circuiti dei LED e pull-up e
lalimentazione DC che collega i vari moduli. Notate che le singole linee di segnale per
I2C, SPI e le funzioni DIO e AIN non sono mostrate. Invece, la notazione dei bus, che
consiste di una barra con un numero, utilizzata per indicare quanti segnali discreti sono
chiamati in causa. Negli schemi non sono mostrate neanche cose come le morsettiere
per lalimentazione e la messa a terra.
Figura 13-9 - Diagramma di collegamento dello chassis.

Un punto interessante nella Figura 13-9 luso di uno dei rel sul secondo modulo rel
come interruttore di sicurezza per laccensione. A meno che il rel non sia attivo, gli
accenditori non ricevono alimentazione. Notate anche che ci sono quattro moduli a
scheda perforata utilizzati per fissare i circuiti di rilevamento della continuit degli
accenditori e resistenze pull-up per vari LED e interruttori. Lutilizzo delle morsettiere
pitch da 0,1 pollici (2,54 mm) rende i cablaggi del sistema molto pi facili delle saldature
e inoltre questi, se necessario, in futuro possono essere rimossi e sostituiti.
Con gli schemi sotto mano, adesso possiamo creare un elenco dettagliato di
componenti come quello della Tabella 13-5.
Tabella 13-5 - Lelenco di parti del lanciarazzi finale.

Quantit Descrizione
1 Arduino Mega2560
1 Grande interruttore a pressione
1 Shield Mega con terminali a vite
8 Morsetti rossi
8 Morsetti neri
1 Shield display LCD
1 Modulo RTC (Real-time clock)
1 Jack da 3,5 mm (circuito singolo)
2 Moduli da quattro rel
1 Supporto per le batterie, sei celle D
1 Display LED a 7 segmenti da 2 cifre
1 Chassis di metallo con coperchio inclinato
Display LED a 7 segmenti da 4 cifre per
1
lora
1 Interruttore Keyed

Gli aspetti fisici


Vi consiglio di costruire il lanciarazzi in uno chassis di metallo inclinato. Anche se a
quanto pare questo specifico contenitore non pi disponibile, pu andarne bene un
altro simile a quello mostrato nel disegno della Figura 13-10. Questo il disegno di un
vecchio chassis che si trova nel mio laboratorio da tempo e dal quale molto tempo fa ho
estratto i componenti elettronici che conteneva. Lo chassis un design di due parti che
largo 14 pollici (35,6 cm), profondo 10 pollici (25,4 cm) e alto 1,5 pollici (3,8 cm)
davanti e 2,75 pollici (7 cm) dietro. dotato anche di uno scaffale piatto da 3,5 pollici
(8,9 cm) in alto nella parte posteriore del coperchio. Attualmente troppo brutto per
fotografarlo e quindi vi basti un disegno.

Figura 13-10 - Lo chassis candidato per il lanciarazzi.

Non uno chassis allultimo grido, assolutamente. soltanto una cosa che avevo a
portata di mano. Voi potete disporre di qualcosa di altrettanto adatto, oppure potete
aver accesso a un outlet di surplus di componenti elettronici. Se questo il vostro caso,
potete acquistare uno chassis carino e simile a questo presso diversi distributori. Potete
aspettarvi di pagarlo tra i 30 $ e i 50 $.
Dopo aver scelto la custodia, il prossimo passaggio decidere il layout del pannello
anteriore e dove posizionare le schede e i connettori. Con uno chassis come quello
mostrato nella Figura 13-10, vi consiglio di montare il pi possibile allinterno del pannello
superiore. Il motivo principale evitare di far correre fili tra le schede e i controlli nel
pannello superiore. Dal momento che la parte posteriore dello chassis non altro che la
continuazione di quello superiore, non dovete preoccuparvi di scollegare le cose se
dovete rimuovere il pannello superiore per prendere qualcosa al suo interno.
La Figura 13-11 mostra un layout per il pannello. Questo soltanto un modo di farlo e
potete optare per unorganizzazione diversa. La shield despansione I/O ha moltissimi
punti I/O (64 in tutto) e quindi rimane disponibile moltissimo spazio per crescere.

Figura 13-11 - Un esempio di layout del pannello dei controlli del lanciarazzi.

Di nuovo, vi consiglio di montare tutti i componenti allinterno del coperchio, eccetto


forse le eventuali batterie. Questo rende pi facile assemblare e testare il lanciarazzi
senza dover anche trascinare la base e una serie di fili per collegare i componenti
superiori e inferiori. Lo svantaggio che alla fine vi ritroverete con le teste delle viti sul
pannello anteriore, ma potete sempre dipingerle oppure utilizzare viti a testa piatta (se il
metallo del pannello abbastanza spesso).
Se dovessi realmente costruirlo (e dovrei, visto che ci ho lavorato tanto), monterei la
Mega2560 e la shield I/O sotto la sezione piatta della parte superiore dello chassis.
Questo uno spazio ampio 3,5 pollici (8,9 cm), pi che abbastanza per accogliere un
Arduino (o due) senza interferire con i controlli e i display sul pannello anteriore.
Un modo per avere tutto sistemato dove vogliamo creare un mockup utilizzando
modelli di varie schede e moduli fatti di cartone o di materiale a nucleo di schiuma con
qualche etichetta adesiva. Possiamo ritagliare delle forme con le stesse dimensioni delle
parti reali e utilizzare alcune etichette adesive rotonde come segnaposto per gli
interruttori e i LED. Quindi possiamo sistemare i modelli su un pezzo di carta con un
contorno rettangolare come quello del pannello per cercare la sistemazione ottimale. Io
lo farei come se fossi dotati di vista a raggi X e stessi guardando attraverso il pannello.
In questo modo, non dovrei girare le cose mentalmente per visualizzare dove devono
andare i LED e i display LCD, oppure dove devono essere posizionati i LED e gli
interruttori. Possiamo prendere le misure direttamente sul mockup e creare uno schema
di produzione come quello mostrato nel Capitolo 11 (naturalmente, se per caso siete
appassionati di strumenti CAD, potete semplicemente saltare dritto allo schema di
produzione e saltare il passaggio dei modelli).
Potete anche decidere di collegare il connettore USB della Mega2560 al connettore di
tipo B montato sul pannello posteriore. Questo pu essere utilizzato per aggiornare il
software, catturare dati operativi durante i lanci, o perfino fungere da display in tempo
reale che pu essere inviato in unaula perch tutti lo possano vedere.

Il software
Nel caso di uno studio di design come questo, per lo pi il software soltanto qualche
suggerimento e qualche diagramma a blocchi. Lo scopo principale determinare il livello
complessivo di sforzo in relazione al numero di funzioni supportate dal software. Se
progettato e implementato rispettando i requisiti funzionali, dobbiamo poter mappare la
funzionalit del software direttamente sui requisiti. Inoltre, non dovremmo avere
funzionalit che non sono definite nei requisiti. Nellindustria, specialmente quella
aerospaziale, questo considerato un male, dal momento che la funzionalit del
software senza un requisito previo una funzionalit che non potr essere
completamente testata, se mai potr esserlo del tutto. E il software non testato
rischioso.
Dal momento che questo un tipico design di tipo Arduino, le funzioni setup() e loop()
risiederanno in un modulo principale. Avremo bisogno anche di una selezione di variabili
globali che contengano i vari dati di stato e ora. La funzione loop() dovr eseguire una
serie di operazioni continue, come monitorare gli interruttori per armare il sistema e
azionare il lancio, accendere e spegnere i LED quando necessario e gestire il conto alla
rovescia monitorando linterruttore range safety durante il conto. La Figura 13-12 mostra
le azioni di cui si occupa il ciclo principale.
Figura 13-12 - Le operazioni del ciclo principale.

Nel punto 1 del diagramma, il ciclo comincia a leggere gli interruttori rotativi (select
dellaccenditore e select dellora del conto). Se lora del conto cambiata rispetto
allultima volta in cui stato letto linterruttore e il conto attivo (cio, si sta preparando
un lancio), il lanciarazzi interromper il conto, disarmer il sistema ed entrer nello stato
abort.
Nel punto 2, il software controlla linterruttore che arma il lanciarazzi. Se nelliterazione
precedente del ciclo era spento, ma adesso acceso, viene impostato il flag arm del
sistema e viene attivato il rel che alimenta il lancio (vedere Figura 13-9). Se questo flag
true, controlliamo se in corso un conto. In caso affermativo, non leggiamo
linterruttore di avvio del lancio (punto 3). Altrimenti, controlliamo se lutente ha premuto il
pulsante di lancio. Se cos, impostiamo lo stato del lancio su true (on) e facciamo
partire il contro.
Quello che contenuto nel lato destro della Figura 13-12 attivo soltanto se il sistema
si trova nello stato di lancio ed in corso un conto. Nel punto 4, avviene un controllo per
verificare che linterruttore range safety non sia premuto (on). Se no, interrompiamo il
sistema e lo passiamo nella modalit di sicurezza.
Il punto 5 dove avviene lazione vera e propria. Quando il conto arriva a zero, vengono
attivati i rel del lancio che corrispondono ai circuiti di accensione selezionati. I rel sono
mantenuti in uno stato on per 2 secondi e poi rilasciati. Probabilmente questo non il
modo migliore di fare questo. Sarebbe meglio controllare lo stato degli accenditori e
disattivare i rel una volta che sono aperti tutti gli accenditori. Il ritardo di tempo
sarebbe un tempo massimo permesso prima di dichiarare un guasto.
Nel punto 6, il lancio avvenuto correttamente oppure il razzo ancora (si spera) al suo
posto. In ogni caso, il sistema viene riportato in uno stato di standby, i rel vengono
spenti e il rel principale viene disattivato. Vi suggerirei anche di disarmare il sistema, in
modo che lutente possa disattivare linterruttore e riattivarlo di nuovo per tornare ad
armare il lanciarazzi.
La lettura degli input degli interruttori, limpostazione degli stati dei LED, la lettura
dellRTC e il controllo dei rel possono avvenire molto rapidamente. In questo design,
non sembra che siano necessari interrupt. Detto questo, potete decidere di aggiungerne
uno per linterruttore range safety. Ecco perch stato collegato direttamente alla
Mega2560 anzich per mezzo dellexpander I/O.
Linterruttore range safety pu essere utilizzato per azionare un interrupt che disattivi il
rel di alimentazione degli accenditori (rel 3, modulo rel 2) nel momento in cui viene
rilasciato linterruttore. Quindi, anche se la MCU impiega poche decine di millisecondi a
leggere lo stato dellinterruttore e risponde passando il sistema in uno stato di blocco,
agli accenditori dei motori dei razzi lalimentazione sar gi stata tagliata.
LLCD pu essere utilizzato per mostrare messaggi durante il ciclo. Sarebbe ideale
vedere lo stato della corrente e ricevere dei messaggi se si produce un guasto. Non
sarebbe particolarmente utile ripetere lora o il conto con lLCD. Questo non farebbe che
aggiungere latenza (cio, un ritardo nellesecuzione) nel ciclo principale.
Quando scriviamo il software, la nostra guida principale devono essere i requisiti
funzionali. Queste sono cose che il software deve supportare per poter soddisfare i
requisiti e di conseguenza raggiungere gli obiettivi del progetto. Se volete vedere degli
esempi di modi per organizzare il software in moduli, potete rileggere i Capitoli 10, 11 e
12.
Nella Figura 13-12, possiamo vedere che ci sono diverse possibilit per ulteriori moduli.
Lo stato e laggiornamento degli accenditori una, cos come laggiornamento della
visualizzazione dellRTC e dellora. La sezione del ciclo dedicata al lancio (tutto quello
che compreso tra il punto 4 e il punto 6) un altro possibile candidato per un modulo
a s stante. Il modulo RTC, lLCD, i display LED e lexpander I/O molto probabilmente
avranno classi definite, ma per le funzioni del ciclo principale pu non essere
particolarmente necessario utilizzare classi. Non sono complesse, davvero
Dal momento che questa unanalisi del design e non un design completo, lascer il
software qui. Se volete proseguire e creare il vostro lanciarazzi, vi consiglio di guardare
gli esempi forniti dai tre capitoli precedenti. Con questa analisi del design come punto di
partenza, non dovreste avere molte difficolt a lavorare sui dettagli rimanenti.
Non possiamo realmente definire una stima dei tempi perch non abbiamo modo di
sapere chi scriver il software. Persone diverse lavorano a ritmi diversi: quello che per
una persona richiede unora per essere scritto in forma di codice, per unaltra persona
pu richiedere mezza giornata. Quindi, per farvi unidea di quanta fatica pu richiedere il
software, vi consiglio di provare a scrivere un po di codice di prova con una breadboard
o un prototipo non dedicato (come abbiamo visto nei capitoli precedenti) per fare
qualcosa con lRTC o lLCD. Una volta che vi siete fatti unidea generale di quanto tempo
richiede, potete moltiplicarlo per il numero di funzioni uniche contenute nel design del
software e poi moltiplicare quel numero per due. Il risultato dovrebbe avvicinarsi alla
quantit di tempo del quale avrete bisogno e, se riuscite a completare il software prima,
tanto meglio.

I test e il funzionamento
Una pianificazione dei test sempre una buona idea. Fortunatamente, il lanciarazzi
relativamente facile da testare, dal momento che fondamentalmente soltanto input di
interruttori e output di rel. Potete simulare la continuit degli accenditori semplicemente
collegando un jumper tra le coppie di morsetti degli output degli accenditori e un circuito
aperto semplicemente la mancanza di un jumper.
Se esaminate i requisiti funzionali, potete vedere che sono tutti verificabili. In altre
parole, se ruotate la manopola di selezione dei circuiti degli accenditori dovete vedere i
LED attivi accendersi in sequenza dall1 al 6. Se i morsetti sono collegati per simulare gli
accenditori, deve essere accesa anche la luce ICC GO. Armate il sistema e poi
premete e tenere premuto linterruttore range safety e vedrete accendersi la luce
Safety GO. Se avviate il conto e poi scollegate uno qualsiasi degli accenditori attivi,
cambiate il numero dei circuiti degli accenditori oppure la durata del conto quando in
corso, oppure se rilasciate linterruttore range safety, il sistema deve fermare il conto ed
entrare nello stato di blocco.
Fate attenzione a non lasciare che il conto arrivi a zero, se state utilizzando jumper sui
morsetti per simulare gli accenditori. Quando i rel si chiudono, tutta la corrente della
batteria scorrer attraverso i jumper. Questo pu far sciogliere i ponticelli o danneggiare
i rel, oppure entrambe le cose. Un miglior approccio per eseguire i test pu essere
utilizzare fusibili che si possono sostituire o addirittura accenditori veri e propri montati
su una base di legno. Potete ance riuscire a utilizzare piccole lampadine a
incandescenza con una tensione corretta, ammesso che siano dotate di una resistenza
bassa fredda (non illuminate). Un tipico accenditore circa 0,5 ohm.

Analisi dei costi


Il costo finale del lanciarazzi dipende da dove acquistate le parti e se riuscite a trovare
offerte. Uno dei costi principali rappresentato dallo chassis, che pu arrivare a 30 $.
Potete decidere di costruire uno chassis di legno che misura 1 per 1 pollice (2,5 per 2,5
cm) e un truciolato di 1/4 di pollice (0,6 cm), ma questo immaginando che disponiate
degli strumenti di falegnameria necessari. Dopo aver acquistato i materiali e averli
aggiunti nel calcolo del tempo, potete scoprire che risultava pi economico comprare
uno chassis.
Basandoci sullelenco finale delle parti mostrato nella Tabella 13-5, il costo totale della
versione Fase I probabilmente si aggirer sui 125 $, 25 $ pi 25 $ meno. Le funzionalit
della Fase II possono facilmente far salire il costo fino a 300 $, ma probabilmente
potete riuscire a contenerlo acquistando in modo astuto e cercando offerte.

Potrebbero piacerti anche