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
Arduino per tecnici, ingegneri e maker
Titolo originale: Arduino: A Technical Reference
di J. M. Hughes
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
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 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
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).
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.
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.
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.
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.
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.
Diecimila 2007
Duemilanove 2008
Ethernet 2011
Leonardo 2012
Mega 2009
Nano 2008
Mini 2008
Fio 2010
Micro 2012
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.
Kit clone
Diavolino compatibile con il USA
layout di Arduino
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.
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.
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.
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).
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.
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.
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 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.
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.
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.
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.
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.
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.
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.
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.
Figura 3-2 - Le funzioni dei pin del package DIP del microcontroller ATmega168/328.
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.
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.
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.
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)
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.
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.
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 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.
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).
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.
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
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
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.
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().
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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).
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.
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.
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.
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.
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.
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.
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:
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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).
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:
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.
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:
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.
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 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.
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.
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.
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.
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.
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.
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()
write()
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()
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[]
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()
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()
available()
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()
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()
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).
write()
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.
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()
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()
endPacket()
Invia un pacchetto UDP creato dalla funzione write() allhost remoto specificato
dalla funzione beginPacket().
parsePacket()
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()
remoteIP()
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 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()
blinkVersion()
Fa lampeggiare la versione del protocollo sul pin 13 (il LED integrato sulla scheda
Arduino).
printFirmwareVersion()
setFirmwareVersion()
Imposta il nome e la versione del firmware utilizzando il nome di file dello sketch,
meno lestensione.
Inviare messaggi
sendAnalog()
sendDigitalPort()
sendString()
sendString()
Invia una stringa al computer host utilizzando un tipo di comando personalizzato.
sendSysex()
Ricevere messaggi
available()
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()
detach()
Tipi di messaggi
Una funzione pu essere associata a un tipo specifico di messaggio. Firmata mette a
disposizione questi tipi di messaggi:
ANALOG_MESSAGE
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():
shutdown()
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()
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()
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()
La classe GSM_SMS
Questa classe fornisce la possibilit di inviare e ricevere messaggi SMS (Short
Message Service).
beginSMS()
ready()
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()
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()
print()
peek()
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()
connect()
beginWrite()
write()
endWrite()
connected()
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()
flush()
Elimina tutti i dati attualmente in attesa nel buffer e resetta il conteggio dei dati
disponibili riportandolo a zero.
stop()
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()
beginWrite()
endWrite()
read()
available()
stop()
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()
La classe GSMScanner
La classe GSMScanner fornisce funzioni per ottenere informazioni diagnostiche sul
network e sulloperatore.
begin()
getCurrentCarrier()
getSignalStrength()
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()
isPIN()
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()
checkReg()
getPINUsed()
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()
setBand()
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()
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()
home()
Posiziona il cursore in alto a sinistra sullLCD. Non cancella lLCD: per farlo si deve
utilizzare la funzione clear().
setCursor()
write()
print()
cursor()
blink()
noBlink()
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()
scrollDisplayLeft()
scrollDisplayRight()
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()
rightToLeft()
createChar()
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()
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()
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():
close()
Chiude un file, assicurando che prima vengano scritti tutti i dati rimanenti.
flush()
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.
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()
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()
openNextFile()
Apre la successiva cartella di file in una directory e restituisce una nuova istanza di
un oggetto File.
rewindDirectory()
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()
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()
readMicroseconds()
attached()
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()
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()
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()
peek()
read()
print()
println()
listen()
write()
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()
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()
noStroke()
fill()
noFill()
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()
height()
circle()
image()
loadImage()
PImage
La classe PImage contiene funzioni per incapsulare e disegnare unimmagine bitmap in un
display TFT.
PImage.height()
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.
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()
beginTransmission()
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()
read()
onReceive()
onRequest()
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()
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()
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()
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()
readButton()
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.
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
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)
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)
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
Libreria Descrizione
Per controllare il TLC5940 IC, ununit PWM da 16 canali e 12
TLC5940
bit
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
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 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.
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.
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.
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-7 - La shield despansione I/O di TinkerKit per le schede Arduino di tipo Mega.
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.
Figura 8-12 - Il layout dei pin della shield I/O Centipede di Macetech.
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 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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
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.
Figura 8-73 - La shield TFT da 2,8 pollici di Adafruit con touchscreen resistivo.
Figura 8-77 - La shield di acquisizione dei dati ADC da 24 bit di Iowa Scaled Engineering.
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.
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.
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).
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
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.
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).
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.
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.
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
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.
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
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
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.
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.
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.
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.
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.
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.
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.
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.
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).
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.
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 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.
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.
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.
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.
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.
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.
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.
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 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.
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.
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.
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.
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.
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.
Le comunicazioni
Esistono numerosi moduli per applicazioni basate sulle comunicazioni, da semplici
adattatori RS-232 a moduli trasmettitori/ricevitori di comunicazioni wireless e laser.
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.
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 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.
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.
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 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.
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 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.
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.
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.
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.
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 $.
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).
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.
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.
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.
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.
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.
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.
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
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.
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.
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).
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.
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.
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.
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.
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.
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.
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.