Documenti di Didattica
Documenti di Professioni
Documenti di Cultura
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.
RY:n:LMX OK
Imposta il rel n su ON se livello di luminosit >=
max
RY:n:LMN OK Imposta il rel n su ON se livello di luminosit <=
min
RY:n:MMX OK
Imposta il rel n su ON se umidit del suolo >=
max
RY:n:MMN OK Imposta il rel n su ON se umidit del suolo <= min
RY:n:TMX OK Imposta il rel n su ON se temperatura >= max
RY:n:TMN OK Imposta il rel n su ON se temperatura <= min
ST:HMX:val OK Imposta il valore max dellumidit
ST:HMN:val OK Imposta il valore min dellumidit
ST:LMX:val OK Imposta il valore max della luminosit
ST:LMN:val OK Imposta il valore min della luminosit
ST:MMX:val OK Imposta il valore max dellumidit del suolo
ST:MMN:val OK Imposta il valore min dellumidit del suolo
ST:TMX:val OK Imposta il valore max della temperatura
ST:TMN:val OK Imposta il valore min della temperatura
TM:? TM:val Restituisce la temperatura corrente
Potete utilizzare lo strumento del terminale seriale integrato nellIDE di Arduino, oppure
potete uscire dallIDE e collegarvi direttamente a una porta USB che utilizzi lArduino con
la GreenShield. Questo approccio pu essere utilizzato per creare unapplicazione di
interfaccia utente per configurare la GreenShield e controllare il suo funzionamento. In
pratica, lidea configurare il software della GreenShield su un Arduino e quindi lasciarlo
attivo senza prestargli attenzione.
I comandi per le query di stato
Il software della GreenShield mette a disposizione quattro comandi per le query, che
sono elencati nella Tabella 10-4. Questi comandi permettono a un host di controllo di
ottenere lo stato corrente on/off di ciascuno dei due rel, lultimo valore letto
dallLDR o dallingresso analogico del sensore di umidit del suolo e gli ultimi valori di
temperatura e umidit relativa ricavati dal sensore DHT22.
Tabella 10-4 - I comandi per le query della GreenShield.
NOTA Notate che quando un rel viene impostato utilizzando uno di questi comandi, la mappatura precedente dei
setpoint viene eliminata. Per utilizzare di nuovo un rel con un setpoint, deve essere inviato alla GreenShield uno dei
comandi per i setpoint.
RY:n:LMX OK
Imposta il rel n su ON se livello dellilluminazione
>= max
RY:n:LMN OK
Imposta il rel n su ON se livello dellilluminazione
<= min
RY:n:MMX OK
Imposta il rel n su ON se umidit del suolo >=
max
RY:n:MMN OK Imposta il rel n su ON se umidit del suolo =< min
RY:n:TMX OK Imposta il rel n su ON se temperatura >= max
RY:n:TMN OK Imposta il rel n su ON se temperatura <= min
La mappatura delle funzioni dei rel associa un rel allinput di un sensore e una serie di
condizioni di cambiamento di stato nella forma di limiti superiori e inferiori. Un rel pu
essere attivato se il valore di un sensore va al di sopra o al di sotto di un limite
impostato dal sistema di controllo dellhost. Lassociazione dei rel non esclusiva, che
significa che entrambi i rel possono essere assegnati allo stesso input di un sensore e
alle stesse condizioni. Non avrebbe senso farlo, ma sarebbe possibile.
Anche se la GreenShield attualmente configurata per due rel, non ci sono limiti al
numero di rel che potrebbe utilizzare. Come si pu vedere nella Tabella 10-1, i pin I2C
(A4 e A5) sono disponibili e quindi si potrebbe utilizzare una shield despansione I/O
digitale I2C per collegare ulteriori dispositivi ad Arduino.
Il prototipo
Per creare il prototipo per questo progetto, io utilizzo una cosa che viene detta Duinokit
e che mostrata nella Figura 10-10. Questo oggetto intelligente dotato di una serie di
sensori, LED, interruttori e altri accessori oltre che di un Arduino Nano, tutto montato su
una grande PCB con molti socket header. Ha anche una posizione per collegare una
shield convenzionale (o una pila di shield). come una versione moderna dei vecchi kit
per progetti di elettronica all-in-one che in passato erano molto diffusi.
Testare il prototipo
Utilizzando il Duinokit, possiamo testare le varie funzioni di input dei sensori della
GreenShield e regolarne il funzionamento. Se ci fosse un problema con i circuiti (che
sar facile da risolvere, dal momento che sono molto semplici), questo sarebbe il
momento di trovarlo e risolverlo. Cercare di risolvere un problema su una PCB dopo
averla prodotta e caricata di parti pu rivelarsi davvero frustrante e c sempre il rischio
che qualcosa venga danneggiato durante il procedimento.
Nel caso della GreenShield, dobbiamo verificare che i sensori funzionino correttamente,
che il software riesca a ottenere valori sensibili per cose come il sensore di umidit del
suolo e lLDR e che il sensore di umidit/temperatura si comporti come previsto. Per
farlo, utilizzeremo un po di sabbia asciutta, acqua, un termometro digitale affidabile, un
frigorifero, un forno e una giornata di sole.
La prima cosa da controllare il sensore di umidit/temperatura. Utilizzando un
termometro esterno (in questo caso io ho utilizzato un termometro digitale con il sensore
sul terminale lungo), ho cominciato a leggere lambiente. Il passaggio successivo stato
mettere il Duinokit e il termometro in un frigorifero. Un piccolo PC portatile forniva
lalimentazione e mostrava la temperatura e il cavo USB era abbastanza sottile da
permettere alla porta del frigorifero di chiudersi completamente. Infine, il Duinokit e il
termometro sono stati collocati in un forno acceso e impostato su circa 140 F (60 C).
Con tre datapoint possiamo generare una curva calibrazione approssimativa per
compensare le variazioni del sensore di temperatura.
Testare la risposta dellumidit leggermente pi difficile, ma ottenere i risultati vicini
alle estremit dellintervallo utilizzabile non troppo complicato. Un breve soggiorno
nella sezione freezer del frigorifero esporr il sensore a unambiente dallumidit molto
bassa. I freezer sono secchi perch lumidit nellaria si condensa sulle molle allinterno
dello scompartimento. Questo quello che provoca il fenomeno del freezer burn, a
proposito, che si verifica quando il cibo non sigillato correttamente prima di essere
congelato. anche il principio che sta dietro la liofilizzazione, anche se di solito questa
avviene a temperature molto pi basse (circa 112 F o 80 C) e in una condizione
parzialmente di vuoto. Nel caso del freezer di una cucina, possiamo aspettarci di
riscontrare unumidit di circa il 5% o forse qualcosa in meno.
SUGGERIMENTO Un altro metodo la cosiddetta prova del sale. Questa tecnica utilizza sale saturato con acqua
per stabilire unumidit relativa costante in un ambiente ermetico. Potete leggere un modo per eseguire una
calibrazione con il sale sulla wiki Ambient Weather (http://bit.ly/wiki-aw). Se scegliete di eseguire questa prova, dovete
fare attenzione a non far cadere sale o acqua sui componenti dei circuiti. Questo potrebbe non risultare molto pratico
con un oggetto grande come il Duinokit, ma pu essere utilizzato con la Greenshield finale.
Una volta che abbiamo il risultato dellumidit bassa, il passaggio successivo bollire un
po dacqua sul fornello e utilizzare un piccolo ventilatore per dirigere il vapore sul
sensore. Il flusso di aria che ne risulta non sar completamente saturato, ma rientrer in
un intervallo di umidit compreso tra l80 e il 90%. Questi test verificano che il sensore
funziona, ma in realt non possiamo utilizzare i dati per nientaltro perch non abbiamo
riferimenti con i quali confrontarli. Se per caso avete a disposizione un sensore di
umidit preciso, vi conviene assolutamente utilizzarlo e creare una curva di calibrazione
come quella che stata creata per la temperatura.
Testare il sensore di umidit del suolo implica utilizzare un po di sabbia pulita e asciutta,
una bilancia e un po dacqua. Prima di tutto, prendete un bicchiere di vetro grande o una
ciotola di ceramica. Entrambi andranno bene: sceglietene uno con una capacit di circa
un litro. Non utilizzate una ciotola di metallo per questo test, perch la sonda di umidit
del suolo utilizza un flusso di corrente e una ciotola di metallo potrebbe creare un
risultato falso. Innanzitutto, pesate il contenitore e annotate questo valore, che vi servir
pi avanti. Quindi, misurate circa 225 grammi di sabbia nel contenitore. Rimettetelo sulla
bilancia e pesate di nuovo. Il peso della sabbia quello che mostra la bilancia meno il
peso del contenitore. Potete lasciare il contenitore sulla bilancia per il resto del test, se
volete.
Adesso inserite la sonde di umidit del suolo nella sabbia asciutta e annotate il risultato
mostrato sulloutput del serial monitor nellIDE di Arduino. Togliete il sensore e
aggiungere acqua finch il peso di circa un quarto superiore rispetto al peso originale
della sabbia pi il peso del contenitore. Lasciatelo l per un po per permettere allacqua
di filtrare nella sabbia. La sabbia deve notarsi umida al tocco, ma non deve risultare
bagnata o fangosa.
Reinserite il sensore e osservate loutput. Adesso la sabbia saturata per circa il 50%
e con questi due risultati, asciutto e umido, possiamo interpolare un punto intermedio,
che chiameremo il punto 25%.
Infine, c la fotocellula dellLDR. La risposta delle fotocellula, in realt, non molto
importante, ma conviene stabilire un punto per la luce bassa. Una giornata nuvolosa pu
rappresentare una buona occasione per usare la GreenShield per accendere qualche
luce ausiliaria, oppure la si pu utilizzare semplicemente per determinare la differenza
tra giorno e notte. Tutto quello che necessario per testare la fotocellula una stanza
interna a casa vostra (magari con le tende parzialmente chiuse e le luci spente), mentre
fuori fa una bella giornata di sole. La luce solare diretta rappresenta il livello di
illuminazione alla quale probabilmente sar esposta la fotocellula, mentre la stanza
interna a casa vostra grossomodo lequivalente del livello dellilluminazione di una
giornata grigia e nuvolosa. Dobbiamo registrare i dati del sensore di
temperatura/umidit, dellLDR e della sonda di umidit del suolo. Questi saranno i nostri
valori iniziali quando configureremo la GreenShield per la prima volta e, dal momento
che adesso sappiamo che cosa aspettarci, non dovremo tirare a indovinare i valori dei
setpoint minimo e massimo adeguati dai quali partire.
Il software finale
Il software del prototipo gestisce soltanto gli input dei sensori. La versione finale gestir
anche linterfaccia di controllo dellhost e la mappatura delle funzioni dei setpoint dei
rel. Questo implica lanalisi dei comandi di input, oltre al salvataggio dei dati e al
lookup.
Non ci sono visualizzazione delloutput, a parte i quattro LED di stato per gli intervalli di
umidit e temperatura, n input di controllo manuali. Una semplice interfaccia USB
seriale si utilizza per le transazioni comando-risposta tra la GreenShield Arduino e un
computer di controllo. Il volume del software fa s che si debbano interpretare i comandi
emessi dal PC host di controllo e poi che si applichi la mappatura dei setpoint ai rel.
La Tabella 10-8 elenca i file della serie GreenShield. Due file sono condivisi da tutti i
moduli sorgente. Si tratta di gs.h e gs_gv.h. Le variabili globali definite in gs_gv.cpp,
che altrimenti si troverebbero allinizio di uno sketch convenzionale, sono compilati
separatamente e condivisi come necessario tra gli altri moduli.
Tabella 10-8 - I moduli del codice sorgente della GreenShield.
Modulo Funzione
GreenShield.ino Modulo principale che contiene setup() e loop()
gs_gv.cpp Variabili globali
gs_gv.h File include
gs.h Definizioni delle costanti (dichiarazioni #define)
gs_mapping.cpp Mappatura delle funzioni
gs_mapping.h File include
gs_parse.cpp Analisi dei comandi
gs_parse.h File include
gs_send.cpp Funzioni di invio dei dati (allhost)
gs_send.h File include
Esempio 10-6 - Il file include con il modulo per il parsing della GreenShield.
Per adesso, la funzione ParseCmd() una delle funzioni pi lunghe del codice della
GreenShield. Utilizza un parser condizionale, veloce e discendente del tipo ad albero per
determinare il tipo di comando in arrivo e quindi estrae il codice della sottofunzione e
tutti i parametri. Questa funzione esegue anche qualsiasi comando immediato come
attivare o disattivare rel, restituire informazioni sullo stato dei rel e acquisire e
restituire dati analogici allhost di controllo o a un utente. Lesecuzione dei comandi
immediati avviene presso gli endpoint della struttura ad albero discendente.
La produzione
Fornire una descrizione passo a passo di come si creano schemi e schede a circuito
stampato va oltre lambito di questo libro. Questa una descrizione di alto livello dei
passaggi necessari per passare dallo schema al layout della PCB alla PCB finita. Per i
dettagli di basso livello, vi consiglio di leggere alcuni dei testi elencati nellAppendice D.
Cercando su Google CadSoft Eagle, troverete numerosi tutorial. Vi consiglio quelli di
SparkFun, Adafruit e, naturalmente, CadSoft (http://www.cadsoftusa.com/).
La versione di Eagle dello schema della Greenshield mostrata nella Figura 10-13.
Notate il blocco etichettato ARDUINO_R3_SHIELD. Questo viene dalla libreria delle
parti di SparkFun per Eagle ed pensato specificamente per creare shield. molto pi
comodo che calcolare il posizionamento degli header dei pin manualmente pi tardi o
durante la fase del layout della PCB.
Leditor di schemi di Eagle, come tutti gli strumenti simili, richiede un po di tempo per
poter essere utilizzato. Non sempre ovvio e intuitivo. Normalmente, per creare disegni
(compresi schemi) con una qualit sufficiente per la pubblicazione io utilizzo uno
strumento diverso, ma per creare una PCB utile disporre di un editor di schemi e di
uno strumento per il layout delle PCB che possa condividere dati. Per vedere la
differenza, potete confrontare la Figura 10-13 con la Figura 10-9. Lo strumento Eagle e
lo strumento di design Fritzing, utilizzato nel progetto Switchinator, sono in grado di
mantenere sincronizzati schemi e layout, mentre uno strumento grafico per disegni e
illustrazioni non ha questa capacit.
Quando create uno schema, dovete assicurarvi di aver selezionato la parte corretta. Per
esempio, il simbolo delle resistenze lo stesso, a prescindere dal fatto che si tratti di un
componente 0805 SMD (a montaggio superficiale) o di un componente through-hole da
1/4 di watt. A volte, trovare la parte giusta nella libreria delleditor di schemi pu risultare
difficile. Con Eagle, potete utilizzare caratteri wildcard per effettuare ricerche nella
libreria. Quando cercavo la parte ULN2003AD per la GreenShield, ho digitato *2003* e
ho trovato quello che stavo cercando nella categoria uln-udn. A volte necessario
andare online e cercare una parte che qualcuno pu aver gi creato. SparkFun, Adafruit
e altri hanno creato vaste librerie di parti che si possono scaricare gratuitamente.
Una volta che lo schema completo, si pu generare la PCB. Inizialmente, il layout della
PCB non altro che un mucchio di parti e di sottili linee di connessione (fili volanti,
come vengono detti a volte) che formano un nido di topo di fili. Il nido di topo mostra le
connessioni da punto a punto come definito nellelenco creato a partire dallo schema.
Il primo passaggio spostare tutte le parti nellarea della PCB e quindi organizzarle. Gli
obiettivi principali quando si sistemano le parti sono collocare i connettori nelle posizioni
desiderate, raggruppare le parti in base alla funzione e ridurre al minimo il numero di
occorrenze di linee del nido di topo che si incrociano, se necessario ruotando le parti.
Una volta che questo passaggio iniziale completo, molto pi facile cominciare a
creare le tracce che collegheranno le parti.
Potete scegliere di dirigere ciascuna traccia a mano, utilizzando i fili del nido di topo
come guida, oppure, se vi sentite fortunati, potete lasciare che se ne occupi un
autorouter. Eagle non dotato di un autorouter, ma io generalmente non lo utilizzo.
Lautorouting di solito un processo iterativo per cercare di ottenere un buon layout,
spostando e ruotando le parti e poi provandoci di nuovo. Dopo un po, nel caso di alcuni
design, diventa evidente che si fa prima a farlo manualmente.
In Eagle, non dovete posizionare manualmente una via (una via trasferisce una traccia
da un lato della PCB allaltra per mezzo di un foro placcato, da qui il nome). Se dovete
passare dalla parte superiore della PCB a quella inferiore (o viceversa), non dovete fare
altro che cambiare da un alto allaltro con il livello di selezione abbassato che si trova sul
lato sinistro della barra di strumenti per disegnare le tracce. Eagle aggiunge
automaticamente una via nella posizione e inverte il routing delle tracce sul lato
selezionato della PCB.
Il layout della PCB mostrato nella Figura 10-14. Il lato superiore (componente)
rossiccio e quello inferiore (saldatura) blu. Se per caso disponete della versione
stampata di questo libro, potete vedere che le tracce superiori sono grigie chiare e che
quelle inferiori sono grigie scure. I contorni dei componenti sono grigio chiaro.
Figura 10-14 - Il layout della PCB della GreenShield.
I file generati dallo strumento Eagle CAM (Computer Aided Manufacturing), detti file
Gerber, vengono utilizzati da chi produce PCB per creare le PCB vere e proprie. Per
caricare e visualizzare i file Gerber nella fase dellultimo controllo, io ho utilizzato lo
strumento Gerbv, che fa parte del pacchetto gEDA. Nella Figura 10-15 mostrata una
cattura della schermata di Gerbv.
Figura 10-15 - Il visore di file Gerber di Gerbv.
NOTA Per poter approfittare del servizio a basso costo per prototipare PCB, i contorni della scheda della GreenShield
sono stati squadrati per renderla un rettangolo. Pu sembrare un po strano, pero non ha conseguenze sul suo
funzionamento. Nelle foto non lo vedrete, ma originariamente il layout stato fatto utilizzando i contorni della shield di
Arduino. Convertire gli angoli in angoli retti ha richiesto circa 5 minuti ed stato fatto subito prima che il layout fosse
inviato per la sua produzione. Se fosse stato davvero importante, avrei potuto pagare un prezzo molto pi alto per gli
angoli arrotondati e il lavoro di ritaglio, oppure potrei aver utilizzato il mio router e aver fatto da solo. Ho scelto di lasciarla
semplicemente in forma rettangolare.
Ricevere la PCB finita richiede circa da 7 a 10 giorni. La Figura 10-16 mostra la PCB
come arrivata dal produttore.
Figura 10-16 - La PCB della GreenShield finita.
Dopo che le parti vengono saldate sulla PCB, conviene sempre dedicare qualche minuto
a esaminarne entrambi i lati per ispezionare le saldature e i cortocircuiti (detti ponti) tra
le piazzole e le tracce. Per farlo, io ho utilizzato una lente di ingrandimento standard da
gioielliere. La Figura 10-17 mostra come si presenta una GreenShield completamente
assemblata. Potete notare che per le connessioni con un Arduino sottostante o con
unaltra shield ho utilizzato header impilati. Anche se inserire unaltra shield sulla
GreenShield pu risultare scomodo (e io lo sconsiglio), volevo disporre di alcuni punti di
test e I/O rapidamente accessibili.
Figura 10-17 - La PCB della GreenShield riempita di componenti e pronta per luso.
Il collaudo finale
Le parti a montaggio superficiale presentano la loro serie unica di problemi potenziali.
Prima di fornire lalimentazione alla GreenShield, dobbiamo eseguire alcuni veloci
controlli per assicurarci che tutto sia collegato correttamente e che non ci siano
cortocircuiti sulla PCB:
Ispezione visiva
Esaminiamo attentamente i componenti delle PCB cercando ponti di saldature
(saldature che collegano due piazzole o tra una piazzola e una traccia). Esaminiamo
le resistenze per vedere se qualcuna ha unestremit che pu essere sollevata sulla
piazzola e non collegata. Questo pu accadere quando si utilizzano saldature
regolari e filo per saldare (io ho utilizzato pasta per saldare e uno strumento a
rifusione SMD ad aria calda). Guardiamo le piazzole degli IC (U1 e IC1) per
assicurarci che non ci siano ponti di saldatura tra loro.
Posizionamento dei componenti
Ci sono nove parti che possono essere montate accidentalmente al contrario.
Queste sono due IC, i LED e il modulo sensore DHT22. LIC dellamplificatore
operazionale pu avere un segno o un puntino che indica il pin 1, ma alcuni package
presentano un bordo smussato. Oltre a diverse lunghezze dei terminali, di solito i
LED hanno una piccola area piatta accanto alla connessione del catodo ().
Cortocircuiti
Utilizzando un DMM, preferibilmente con una funzione di test di continuit (la modalit
beeper), controlliamo ciascuna coppia di pin sullamplificatore operazionale LM358
(IC1) per evitare cortocircuiti. Nessuno dei pin deve fare cortocircuito con un altro
pin. Adesso controlliamo che la VCC sul pin 8 di IC1 sia legato ai 5 V sullheader di
pin. Inoltre, controlliamo che il pin 4 sia legato a uno dei pin della messa a terra
sullheader di pin.
Ripetiamo questa procedura per il driver ULN2003A (U1). Nessuno dei pin di input o
di output deve fare cortocircuito, il pin 8 deve essere legato alla messa a terra e il
pin 9 deve essere collegato allalimentazione da 5 V.
Sicurezza elettrica
Prima di collegare la GreenShield a una scheda Arduino, utilizziamo un DMM per
misurare la resistenza tra i pin +5 V e messa a terra sullheader di pin. Dovremmo
vedere un valore di non meno di 30 kohm, probabilmente pi alto. Se otteniamo un
risultato pari a di zero, significa che c un cortocircuito da qualche parte, che deve
essere trovato ed eliminato prima di cercare di fornire alimentazione alla
GreenShield.
Se la GreenShield appare accettabile dal punto di vista elettrico, possiamo montarla su
un Arduino e fornirle alimentazione. Allinizio, non deve essere attivo nessuno dei LED
della GreenShield (a meno che non ci sia qualche software gi caricato sullAVR di
Arduino che stia controllando i pin I/O digitali). I test funzionali includono quattro
passaggi fondamentali:
Test funzionale iniziale
La prima parte dei test funzionali richiede che si esegua nuovamente lo stesso test
che si era svolto con il prototipo per testare gli input analogici e il DHT22.
Carichiamo la versione del prototipo del software su Arduino e apriamo la finestra
del serial monitor dellIDE. Se tutto funziona correttamente, dovreste vedere una
visualizzazione che si ripete con la temperatura, lumidit e gli input analogici.
Test degli input analogici
Colleghiamo una resistenza da 470 ohm agli input dellLDR. Mentre osserviamo
loutput continuo, regoliamo R12 finch il valore non raggiunge lo zero. Questo
dimostra che questa parte del circuito sta funzionando correttamente. Adesso
ripetiamo il tutto con R8 per il sensore di umidit del suolo.
Test del DHT22
I risultati di output provenienti dal DHT22 devono essere quelli che vi aspettate in
base alla temperatura e allumidit locali. Possiamo utilizzare una fonte di aria calda
(un asciugacapelli, per esempio) per applicare aria tiepida (non calda!) sul DHT22 e
osservare la sua risposta.
Test funzionale del software
Adesso carichiamo la versione completa del software della GreenShield. Per questi
test possiamo utilizzare la finestra del serial monitor dellIDE di Arduino. Questa non
una serie di test completa, dal momento che ne abbiamo gi eseguiti alcuni prima
con il prototipo.
Con tutto il software della GreenShield caricato, dobbiamo vedere la parola OK
quando parte. La GreenShield non fornisce un prompt. Digitiamo il comando RY:0:?
e la risposta deve essere RY:0:0. Adesso digitiamo il comando RY:0:1. Il rel deve
fare un clic e il LED associato deve illuminarsi. Utilizzando il comando RY: 0:?
adesso otteniamo RY:0:1.
Dovremmo provare anche il resto dei comandi. Possiamo testare i limiti analogici
facendo cortocircuito oppure aprendo gli input analogici. Il DHT22 indipendente e
quindi non dobbiamo farci molto, ma possiamo impostarne i limiti molto vicini e
utilizzare una fonte di aria calda e un po di vapore di una pentola di acqua bollente
per verificare che i limiti di temperatura e umidit funzionaino come sperato.
Il funzionamento
Dal punto di vista fisico, la GreenShield semplice, ma dal punto di vista funzionale pu
essere complessa nei termini di come si integra nellambiente per il quale pensata. I
due principali input variabili, il livello dellilluminazione e quello dellumidit del suolo,
devono essere calibrati per una specifica serie di condizioni. Lintervallo dellLDR e della
sonda di umidit del suolo determina come si impostano i punti intermedi utilizzando i
potenziometri dei trimmer. Non tutti gli LDR sono uguali e ci sono differenze tra una
sonda di umidit del suolo formata soltanto da un paio di sonde e una che include un
transistor.
Ci sono due approcci di base per regolare la GreenShield: (1) calibrare la GreenShield
per intervalli noti utilizzando riferimenti di qualche tipo, oppure (2) regolare la
GreenShield per un ambiente specifico utilizzando una valutazione soggettiva (per
esempio: il suolo abbastanza umido?).
Lapproccio calibrato permette di specificare degli intervalli in base a dati puri e, se si
conosce lumidit del suolo ideale per esempio, per i pomodori, si pu utilizzare questi
valore una volta che si eseguita la calibrazione e calcolato come i risultati dellADC
corrispondono allumidit del suolo. Testare il prototipo a pagina 386 ha descritto le
procedure di base necessarie per calibrare la GreenShield per i livelli di umidit del
suolo e di illuminazione, ma come riferimento si pu anche utilizzare una cara
attrezzatura da laboratorio.
Lapproccio soggettivo molto pi facile e, dal momento che lobiettivo principale
evitare di uccidere le proprie piante, probabilmente diventa efficace soltanto dopo
qualche tentativo. Si possono regolare i potenziometri dei trimmer in modo che si
adattino ai valori massimo e minimo di una valutazione soggettiva di quello che sarebbe
accettabile.
Io vi suggerisco di fare qualche esperimento, per vedere quale approccio pi adatto
per la vostra applicazione. Vi suggerisco anche di prendervi il tempo necessario per
registrare i dati provenienti dalla GreenShield e costruire alcuni profili che potete
studiare per ottenere le risposte migliori in base alla vostra situazione.
Prossimi passaggi
La GreenShield piuttosto essenziale, a dire il vero, ma presenta una grande
potenzialit. Potete utilizzarla con una shield Bluetooth o addirittura con una shield
Ethernet e controllare in remoto le condizioni del suolo del vostro vaso di piante
preferite, di pomodori e orchidee in una serra, di un piccolo orto esterno, oppure di un
giardino in una colonia su Marte. Se collegate una normale valvola per sistemi di
irrigazione 24VAC a uno dei rel, potete rendere lirrigazione automatica. Potete
utilizzare laltro rel per attivare un ventilatore in una serra che produca un po di fresco,
oppure collegarlo a una stufa per mantenerla calda durante linverno. E, naturalmente,
potete sempre aggiungere un altro rel o due con un modulo rel esterno come quello
descritto nel Capitolo 9.
Potete utilizzare anche un shield microSD per montare la GreenShield su un albero in un
bosco e registrare dati per un periodo lungo (anche un pannello solare per mantenerla
attiva sarebbe una buona idea). Se vi aggiungete una shield WiFi o GSM, potete
lasciare diverse GreenShield in vari punti di una azienda agricola relativamente grande
per tenere sotto controllo le condizioni del suolo.
SUGGERIMENTO Attualmente, il software della GreenShield non salva i valori dei setpoint quando Arduino perde
lalimentazione. Un modo per aggirare questo problema utilizzare la EEPROM dellIC dellAVR. Trovate una
panoramica della libreria EEPROM nel Capitolo 7.
La definizione e la pianificazione
Lo Switchinator una PCB indipendente che pu utilizzare una semplice MCU
ATmega328 oppure ATmega328p senza il bootloader di Arduino. Pu utilizzare anche
una MCU con il firmware del bootloader installato con un programmatore seriale oppure
un convertitore USB-seriale. Per la programmazione, io ho scelto di utilizzare lIDE di
Arduino per compilare un USBtinyISP di Adafruit. Trovate maggiori informazioni sulla
programmazione della MCU nel Capitolo 6.
Ecco lhardware:
ATmega328
16 MHz sorgente di clock a cristalli
Interfaccia di programmazione ICSP
Alimentazione 5 V DC integrata (input da 9 a 12 V DC)
Input e output:
4 input analogici
14 output discreti digitali
Controllo dellinterfaccia:
Interfaccia host RS-232
Protocollo comando-risposta, gestita dallhost di controllo
Risultati analogici disponibili su richiesta
Output sostituito dallhost di controllo
Lo Switchinator fornisce 14 output discreti digitali e 4 input analogici e linterfaccia SPI
disponibile per mezzo di una serie di pin ICSP. Gli output discreti digitali e gli input
analogici sono terminati sul bordo della PCB utilizzando morsettiere a vite. Per la
comunicazione tra la scheda e un computer che funga da host di controllo per mezzo dei
pin D0 e D1 delle morsettiere della MCU si utilizza uninterfaccia RS-232.
La PCB un design al 100 per cento through-hole. Questo ne semplifica
lassemblaggio, al prezzo di una PCB pi grande e di un layout della PCB
potenzialmente pi difficile. La dimensione della PCB non superer la dimensione
rettangolare di 100 mm per 140 mm. Su ciascun angolo della PCB si trovano dei fori di
montaggio.
Gli output discreti digitali dello Switchinator possono essere utilizzati per gestire rel,
come il tipo utilizzato dalla GreenShield, oppure per controllare fino a tre motori passo-
passo unipolari utilizzando un circuito di base come quello mostrato nella Figura 10-18.
Gli output digitali dello Switchinator possono inoltre gestire LED ad alto consumo,
solenoidi o motori DC, come mostra la Figura 10-19.
Il design
Lo Switchinator una singola PCB, di dimensioni 124 96 mm, con quattro fori di
montaggio sugli angoli. La dimensione finale della scheda maggiore di quella che
sarebbe altrimenti possibile con un design a montaggio superficiale ( anche maggiore
rispetto ai limiti di dimensione impostati dalla versione gratuita dello strumento Eagle che
abbiamo utilizzato per la GreenShield).
Non presenta custodia n alimentazione, cosa che ne semplifica enormemente il design.
Lo Switchinator completamente autosufficiente e per funzionare richiede soltanto una
fonte di alimentazione DC esterna.
Le funzionalit
Lo Switchinator un dispositivo di output digitale con qualche funzionalit di input
analogico. Il suo scopo principale quello di commutare carichi DC, sia induttivi sia non
induttivi. Per decodificare gli input dei comandi e restituire dati di stato allhost di
controllo, utilizza una MCU AVR ATmega328.
Un ATmega328 utilizzato principalmente come decodificatore di comandi per
interfacciare gli I/O della PCB con un sistema host. Sebbene sia stato programmato per
comportarsi come un dispositivo I/O, pu essere programmato anche per eseguire
funzioni autonome basate sugli input analogici. Utilizzando un sensore lineare di
temperatura, come lLM35, lo Switchinator pu essere riprogrammato facilmente in
modo che funga da controller per camere di prove ambientali o per camere di
indurimento di resina epossidica.
Dal punto di vista dei circuiti, lo Switchinator composto da tre sezioni principali: la
MCU, gli I/O digitali e lalimentazione. La Figura 10-20 mostra un diagramma a blocchi
dello Switchinator.
Gli output discreti digitali sono gestiti da IC ULN2003A. Sono forniti inoltre quattro input
analogici e il riferimento analogico e le tensioni AVCC possono essere forniti
dallalimentatore interno integrato sulla scheda oppure esternamente. Per selezionare le
sorgenti di tensione analogica, si utilizzano jumper.
Per monitorare e controllare lo Switchinator, si utilizza un semplice protocollo comando-
risposta comprensibile per gli umani.
Lhardware
Lo Switchinator avr 14 output digitali, ciascuno collegato agli output Darlington di una
coppia di IC driver ULN2003A. I driver ULN2003A sono dotati di sette canali per IC e
ciascun canale degli ULN2003A pu gestire fino a 300 mA o, in alcuni casi, di pi.
Per gestire le parti degli ULN2003A, si utilizzer un microchip MCP23017 I2C che
espande gli I/O digitali, soprattutto per evitare di utilizzate tutti i pin I/O digitali disponibili
della MCU AVR. Due dei pin I/O digitali dellAVR si utilizzano per linterfaccia seriale e
due dei pin analogici sono utilizzati per linterfaccia I2C con lIC MCP23017. I pin I/O
digitali non collegati non vengono utilizzati, ma rimangono disponibili per future
espansioni.
Uninterfaccia RS-232 viene implementata utilizzando un IC ricetrasmittente MAX232
TTL-to-RS232. Linterfaccia seriale servir a comunicare con il sistema host che si
comporter come controller master. Il controller master pu essere un PC, un Arduino,
oppure un controller programmabile di un qualche tipo con uninterfaccia RS-232. Per
linterfaccia seriale si utilizza un connettore DB-9. Questa non unimplementazione
completa di RS-232, ma soltanto dei segnali RxD e TxD. Lo Switchinator non dotato di
un connettore USB.
Gli output digitali e gli input analogici sono terminati utilizzando una morsettiera a vite da
3,5 mm (0,138 pollici, 138 mil). Inoltre, due jumper consentono input di tensione di V+
analogico e di riferimento analogico forniti esternamente per mezzo di una morsettiera.
Per lalimentazione DC si utilizza un connettore standard montato sulla PCB del tipo a
cilindro. Lalimentazione pu variare da 6 a 12 V DC (9 V ottimale). Per la regolazione
della tensione a 5 V sulla PCB, si utilizza un 7805 in un package TO-220. La Figura 10-
21 mostra lo schema creato da Fritzing.
Figura 10-21 - Schema dello Switchinator.
NOTA La notazione dello schema utilizzata nella Figura 10-21 illustra che cosa succede quando le parti di una libreria
di strumenti non seguono le stesse convenzioni di dimensioni e distanza. Questo un problema che si riscontra
spesso con gli strumenti open source, perch non tutte le parti possono aver seguito le stesse regole. Questo non
significa che non funzioner: soltanto che sembrer strano.
LMCP23017 ha 22 registri interni organizzati in 11 coppie con un registro A per la porta GPIO con etichetta A e
un registro B per la porta B. La direzione delle porte (input o output) impostata con lapposito registro IODIRA o
IODIRB. La polarit delle porte (active high o active low) impostata con i registri IPOLA o IPOLB. GPINTENA e
GPINTENB attivano la generazione degli interrupt. GPPUA e GPPUB attivano i pull-up interni. Il segnale sui pin della
porta A o della porta B sono letti dati registri GPIOA o GPIOB. I registri OLATA e OLATB restituiscono gli stati dei blocchi
di uscita interni, che vengono impostati quando una porta si trova nella modalit di output e i dati vengono scritti
nei registri GPIOA o GPIOB. La Tabella 10-9 elenca la serie completa di registri. Notate che gli indirizzi dei registri
sono esadecimali (Addr = indirizzo nello spazio dei registri dellMCP23017) e POR/RST si traduce come reset
power-on o reset esterno.
Tabella 10-9 - I registri di controllo dellMCP23017 (IOCON.BANK = 0).
LMCP23017 ha altre funzionalit, delle quali tutte possono rivelarsi utili per determinate applicazioni. Per
applicazioni I/O digitali semplici, in realt lunica cosa che deve succedere che si devono leggere o scrivere i
registri GPIO. Trovate maggiori dettagli sui registri nella scheda tecnica dellMCP23017/MCP23S17
(http://bit.ly/micro-mcp).
Un altro aspetto dellMCP23017 come comunicare con esso. Per accedere ai registri interni, si utilizza un
protocollo a due fasi. Il primo passaggio inviare un byte di controllo e lindirizzo del registro al quale si desidera
accedere. Il secondo passaggio leggere o scrivere il registro. Il registro selezionato per ultimo rimarr attivo
finch non viene selezionato un nuovo registro con una coppia di byte di controlloindirizzo del registro.
Il byte di controllo lindirizzo a 7 bit dellMCP23017 con un bit R/W (read/write, lettura/scrittura). In un sistema
con un unico IC, questo deve essere sempre 0 per i bit A0, A1 e A2 con il sesto bit predefinito come 1, che
produce valori in byte di 0x20 se si tratta di unoperazione di scrittura e 0x21 se si stanno leggendo dati (il bit
lettura/scrittura lultimo bit significativo del byte di controllo).
Esistono diverse librerie per interagire con i dispositivi MCP23017 e MCP23S17 e scrivere una libreria
personalizzata non difficile. La porzione di codice mostrata nellEsempio 10-7 mostra come indirizzarsi al
registri di direzione I/O e al registro GPIOA come input utilizzando linterfaccia I2C e la libreria Wire.
Linterfaccia SPI dellMCP23S17 si comporta in un modo simile e volendo si possono utilizzare perfino i pin
dellindirizzo. Tutti gli altri comportamenti sono identici a quelli dellMCP23017. Le operazioni eseguite
dallMCP23017 sono veloci come gli I/O, I2C o SPI.
Basandoci sullo schema presentato nella Figura 10-21, possiamo generate un elenco
dettagliato di parti come mostra la Tabella 10-11.
Tabella 10-11 - Lelenco di parti dello Switchinator.
Ricetrasmittente MAX232
2 Dirver di output ULN2003A 1
RS232, DIP da 16 pin
Jack di alimentazione, 5,5 Regolatore di tensione 7805,
1 1
mm cilindrico TO-220
Pacchetto di connettori AVR Connettore DB9, montato
1 1
ISP, 2 3 pin sulla PCB, maschio
6 Morsettiera, passo 3,5 mm 1 Cristallo da 16 MHz
2 Header di jumper da 2 pin 1 PCB personalizzata
Il software
Come nel progetto della GreenShield, la parte pi complessa dello Switchinator in realt
il software. La Figura 10-23 mostra un diagramma a blocchi del software.
Formato
Comando Risposta Descrizione
in/out
A:n A:n:val Ottiene linput analogico n in raw DN Esadecimale
Esadecimale
R:nM R:n:val Legge lo stato delloutput n
(0 o 1)
W:n:val OK Scrive 0 o 1 sulloutput n Esadecimale
S:val OK
Imposta tutti gli output sul valore Esadecimale 4
esadecimale cifre
G:? G:val
Ottiene il valore esadecimale di tutti gli Esadecimale 4
output cifre
I numeri ottali si trovano ancora nei moderni computer Unix e Linux, come i bit dei permessi dei file, ma altrimenti
oggigiorno sono rari. Nessuno utilizza pi computer da 12 o 24 bit per scopi generali, anche se alcuni gruppi di
ricerca hanno creato design di microprocessori da 24 bit per applicazioni specifiche e il dispositivo DSP (digital
signal processor) DSP56303 di Freescale pu essere utilizzato come una macchina da 24 bit.
Mentre le architetture dei computer passavano a dimensioni di dati e indirizzi che sono multipli di 4, il sistema
ottale diventava rapidamente obsoleto. La soluzione era il sistema esadecimale con base 16. Nel sistema di
numerazione esadecimale, ciascuna cifra pu rappresentare un valore compreso tra 0 e 15, o binario tra 0000 e
1111. In altre parole, ciascuna cifra esadecimale una pezzettino e due cifre esadecimali rappresentano un
byte di 8 bit.
Tuttavia, la notazione esadecimale presenta un problema. In numeri a base 10 non possono rappresentare
nessun valore maggiore di 9 con una sola cifra. Il valore 10 si scrive con due cifre. Durante gli anni 50, sono
stati proposti diversi schemi per cercare di risolvere il problema della notazione, alcuni dei quali oggi possono
sembrarci molto strani. Dopo qualche anno, hanno cominciato a prendere polvere e siamo finiti con 0, 1, 2, 3, 4,
5, 6, 7, 8, 9, A, B, C, D, E ed F per i valori da 0 a 15. La Tabella 10-14 mostra la relazione tra i valori decimali,
binari ed esadecimali di una serie di numeri.
Nel software, a volte vedrete valori esadecimali scritti come 0x3F in C e C++, 3Fh in linguaggio assembly, $3F in
Forth, oppure %3F in un URL. Un display LED numerico a sette segmenti pu gestire i valori esadecimali
modificando la visualizzazione di alcune delle cifre per ottenere simboli che si presentino come A, b, c, d, E e F,
come mostra la Figura 10-24.
Figura 10-24 - Una visualizzazione esadecimale con un normale a display LED a 7 segmenti.
Presto, diventato rapidamente evidente sia nel sistema di numerazione ottale che in quello esadecimale che ci
sono alcuni valori speciali, a volte detti numeri magici, che continuano ad apparire. Per esempio, nel sistema
esadecimale il valore 0xFF un byte con tutti i bit impostati su 1.
0x5A5A un pattern alternativo (binario 0101 1010 0101 1010) che a volte si utilizza come riempitivo per
controllare luso degli stack o per sovrascrivere un hard disk per cancellare dati salvati in precedenza. 0x7F
127, 0x1FF 511 e 0x3FF 1023. 0x3FF (1023) il valore massimo che pu produrre lADC da 10 bit dellAVR
ATmega328 e 0x1FF il punto intermedio del suo intervallo.
possibile eseguire calcoli sia con numeri ottali che esadecimali e nella programmazione in linguaggio
assembly spesso c bisogno di aggiungere o sottrarre valori di indirizzi esadecimali (per indirect jump o
istruzioni branch relative, per esempio). Eseguire calcoli come la moltiplicazione e la divisione con numeri
esadecimali possibile, ma richiede un po di pratica. A meno che non vogliate o abbiate bisogno di scrivere
molta programmazione a basso livello in linguaggio assembly, i calcoli esadecimali probabilmente sono
qualcosa che non dovrete aggiungere alle vostre capacit, ma per lavorare con i microcontroller dovete essere
capaci di tradurre da esadecimale a binario (e viceversa).
Il comando A accetta una sola cifra compresa tra 0 e 3 e i dati analogici sono il valore
vero e proprio restituito dallADC della MCU AVR. restituito come un valore
esadecimale da 1 a 3 cifre, con il valore massimo possibile pari a 0x3FF.
I comandi R e W hanno lo specifico numero di porta delloutput digitale nella forma di
ununica cifra esadecimale, che va da 0 a 0xF (15). I canali di output 7 e 0xF sono
utilizzati per i LED integrati sulla scheda; non sono collegati per mezzo dei driver
ULN2003A.
Nella Tabella 10-12 potete notare che per controllare o ottenere lo stato di pi di un
output si utilizzano i comandi S e G con un valore esadecimale. Con questo schema,
possiamo attivare (impostare sullo stato on) output non contigui o leggere lo stato di
tutti gli output.
Se, per esempio, volessimo impostare gli output 5, 6, 12 e 13 sullo stato on, dovremmo
inviare il valore 3060h, che in binario si traduce cos:
SUGGERIMENTO Inviare un valore esadecimale far s che lo stato degli output cambi per adattarsi al valore del
comando. Questo significa che se un output on e il valore del comando ha uno zero in quella posizione, diventer off.
Per impostare o cancellare un determinato output senza disturbare gli altri bit, si utilizza unoperazione lettura-modifica-
scrittura (legge i bit, modifica i dati, imposta i bit). Ecco come funziona il comando W.
Lultimo passaggio del ciclo trasferisce i bit dello stato delloutput digitale sullhardware.
Se non sono state applicate modifiche dal momento dellultimo aggiornamento, gli output
non faranno niente. Altrimenti, i bit che sono stati cambiati appariranno come modifiche
dello stato on oppure off degli output dellULN2003A.
Il prototipo
Il prototipo si concentra soprattutto sullinterfaccia RS-232 e sul protocollo di controllo
comando-risposta e quindi il suo hardware rappresentano principalmente da un
ATmega328 montato su una breadboard che non richiede saldature. In sostituzione del
MAX232 della scheda finale, si utilizza un modulo adattatore RS-232. La Figura 10-25
mostra il prototipo.
Figura 10-25 - Il prototipo dello Switchinator.
Per una parte ATmega328p dovete semplicemente cambiare il parametro relativo alla parte, cos:
Su un sistema Linux, se avete impostato i permessi per gli I/O USB, non dovete utilizzare sudo per eseguire
avrdude. Per ulteriori informazioni sulle opzioni a linea di comando e i comandi interattivi supportati da avrdude,
potete consultare il manuale online (http://bit.ly/avrdude-manual).
Lultimo passaggio informare il compilatore del fatto che adesso si utilizzano 16 MHz. Per farlo, si deve definire
F_CPU cos:
Di solito, questa riga viene aggiunta dallambiente di Arduino quando si lavora con una scheda Arduino
convenzionale, ma con una scheda target personalizzata pu diventare necessario specificare esplicitamente la
velocit del clock.
Le versioni per Windows e per Mac OS di AVRDUDE si comportano nella stesso modo che su Linux. In questo
tutorial (http://www.ladyada.net/learn/avr/setup-win.html) trovate ulteriori informazioni sulla versione per Windows
di AVRDUDE.
Il software del prototipo
Il software del prototipo essenzialmente uguale a quello della versione finale, soltanto
senza il codice per impostare gli output digitali per mezzo dellMCP23017. Lobiettivo
principale del prototipo limplementazione del protocollo comando-risposta. Gli stati
degli output sono rappresentati come in una word da 16 bit nel software.
Il software a pagina 423 contiene una descrizione dettagliata del software e quindi,
anzich presentarla qui e magari ripeterne delle parti successivamente, vi consiglio di
cercare l i dettagli. Il software viene compilato utilizzando lIDE di Arduino e quindi
caricato sulla MCU AVR utilizzando un dispositivo di interfaccia ICSP USBtinyISP di
Adafruit.
Per gestire la compilazione, io ho utilizzato lIDE di Arduino, ma ho disattivato il suo
editor interno nella finestra di dialogo Preferences. In questo modo, ho potuto utilizzare
un altro editor (per vivere scrivo software commerciale e scientifico e quindi ho
determinate preferenze in merito agli editor di testo: non sono un grande ammiratore
delleditor dellIDE di Arduino). La scheda stata impostata su Duemilanove with
ATmega328 e il programmatore su USBtinyISP.
Su un sistema Linux, lUSBtinyISP non utilizza una porta pseudo-seriale, ma comunica
direttamente con il sottosistema I/O USB sottostante. Cercare di eseguire lIDE di
Arduino con il programmatore allinizio produrr un errore di permessi. Potete eseguire
lIDE di Arduino utilizzando sudo, ma questo non un modo comodo di trasferire il vostro
codice. Per aggirare questo problema, dovete aggiungere una regola di accesso per l
handler udev. Basta creare un file in /etc/udev/rules.d di nome tinyusb.rules e
aggiungervi questa stringa:
Quindi, per rendere effettiva questa nuova regola, dobbiamo riavviare il sottosistema
udev:
Testare il prototipo
Testare il prototipo facile e questo paragrafo descrive i test da eseguire
specificamente sul parser dei comandi. La possibilit di interagire correttamente con il
software dimostrer che la porzione di codice relativa allRS-232 funziona
correttamente. Si d per scontato che la ricetrasmittente RS-232 esterna funziona come
previsto.
Innanzitutto, vengono testati i comandi per loutput (OUT), lo stato (ST) e linput (AN). I
comandi OUT:A:1 e OUT:A:0 si utilizzano per impostare tutto on o tutto off. Lo stato di
ciascun output conservato nella memoria in modo che a questo punto non ci sia
bisogno di hardware per loutput.
Con il comando ST:n:?, il n parametro ununica cifra compresa tra 0 e 13 (D in
esadecimale). Notate che anche le forme dei comandi OUT:n:0 e OUT:n:1 utilizzano
ununica cifra. Se il software funziona correttamente, possibile impostare tutti gli
output su off (0) e quindi attivare e disattivare selettivamente un output qualsiasi da 0 a
13 senza alterare nessuno degli altri output.
Il comando per gli input analogici (AN) viene testato applicando una sorgente di tensione
variabile (soltanto da 0 a 5 V) ad A0 fino ad A3 e richiedendone il valore. Dal momento
che la tensione dellinput viene cambiata, devono cambiare anche i dati restituiti. Il valore
dellinput restituito nella forma di valore esadecimale da tre cifre. Il due bit pi
significativi sono sempre 0 (la MCU AVR ha soltanto un ADC da 10 bit).
I comandi SP:val e GP:? utilizzano un valore esadecimale da quattro cifre, come
descritto prima. Per testarlo, si devono impostare tutti gli output dispari su on e tutti gli
output con numerazione pari su off, quindi controllare gli stati di ciascuno utilizzando il
comando ST. Gli output con numerazione dispari saranno impostati su off e quelli pari su
on e gli stati dei bit degli output saranno di nuovo controllati utilizzando il comando ST.
Il software
Anche se possibile e spesso consigliabile creare una versione semplificata del
software da utilizzare con il prototipo, nel caso dello Switchinator prende vita come serie
di codici multifile. Il file principale , naturalmente, Switchinator.ino. Gli altri file della
serie contengono le definizioni globali, le variabili globali, il parser dei comandi, il
generatore di risposte e il codice di controllo degli I/O. Il modulo I/O, sw_io.cpp, non
necessario nella versione del prototipo del software.
Modulo Funzione
Modulo principale che contiene
Switchinator.ino
setup() e loop()
Definizioni delle costanti (dichiarazioni
sw_defs.h
#define)
Notate che scrivere 0x00 sulla porta A oppure sulla porta B attiva anche il LED della
porta associato. Scrivere 0xFF su una delle porte ne disattiva il LED. I bit delloutput
sono aggiornati circa ogni 50 ms, se non presente un input seriale da analizzare e
decodificare.
La produzione
Per il design dellhardware, ho utilizzato lo strumento Fritzing. Si tratta di uno strumento
che offre una breadboard virtuale integrata, la possibilit di catturare schemi e di creare
layout di PCB e che facile da installare e relativamente facile da utilizzare. Fritzing ha
unampia e vivace base di utenti e molte parti precaricate nella sua libreria. E il bello
che gratuito. Alcune distribuzioni Linux possono avere una versione pi vecchia di
Fritzing nel loro repository, ma potete scaricare quella pi recente da
http://fritzing.org/home. Io ho utilizzato la versione 0.8.5 su un sistema Linux Kubuntu
14.04 LTS. Esistono versioni di Fritzing anche per Windows e Mac OS X.
In confronto ad altri strumenti con i quali ho lavorato nel corso degli anni, sono rimasto
piacevolmente sorpreso di quanto facile da utilizzare linterfaccia utente di Fritzing. A
essere onesti, non sono rimasto altrettanto impressionato dallautorouter, ma poi ho
visto autorouter high-end lottare con cose che pensavo che fossero facili. E il software
di autorouting molto difficile da programmare e quindi non mi aspettavo un miracolo.
Ho finito per creare il layout manualmente (e sono sicuro che si vede). Il DRC (design
rules check) ha funzionato bene e, anche se leditor di schemi presenta alcune
stranezze, anche quello era completamente usabile. La mia critica principale a Fritzing
rivolta alla libreria delle parti. Sembra che non tutte si trovino sulla stessa pagina,
quando si tratta di dimensioni dei simboli schematici, e quindi le parti di una libreria
aggiuntiva possono essere molto piccole, mentre quelle fornite da Fritzing presentano
simboli grandi e belli. Lo vedrete quando guarderete lo schema nella Figura 10-21. Il
risultato che, a meno che tutte le parti contenute in una libreria di strumenti (sia i
simboli che le impronte del layout) non rispettino gli stessi limiti di dimensionamento,
difficile ottenere linee o tracce perfettamente ortogonali senza dover giocare seriamente
con le funzioni di ridimensionamento e di aggancio della griglia.
Una volta che lo schema (mostrato nella Figura 10-21) completo, si pu cominciare a
creare il layout della PCB. La prima volta che appare il layout della PCB, non contiene
tracce, soltanto le linee a nido di topo che indicano quali pin sono collegati sulle parti.
Nella Figura 10-28 ho gi collocato i componenti dove credo che debbano andare e
Fritzing sta mostrando alcune delle linee a nido di topo. Facendo clic e tenendo premuto
il pulsante del mouse su un pin di una parte qualsiasi, vengono evidenziati in giallo tutti i
punti dove lo si pu collegare.
Figura 10-28 - La PCB dopo il posizionamento delle parti, ma prima del routing.
I componenti sono raggruppati in base alla funzione: lalimentazione si trova nella parte
in basso a sinistra della PCB; lMCP23017 e i due ULN2003A si trovano nella zona in
alto a sinistra; la MCU, il cristallo, il connettore ICSP e gli input analogici si trovano in
alto a destra; e linterfaccia seriale si trova in basso a destra nel layout.
Potete notare che ho invertito i simboli delle morsettiere degli input analogici per
semplificare il collegamento. Verranno comunque montate correttamente e, dal
momento che un prototipo di PCB come questo non ha una serigrafia sullo strato
superiore, non fa nessuna differenza.
Il routing delle tracce in alcuni casi piuttosto tortuoso, principalmente per via
dellutilizzo di parti through-hole. Per spostare le tracce tra le parti superiore e inferiore
della PCB si utilizzano vie, che aiutano a evitare collisioni. La Figura 10-29 mostra la
versione finale della PCB che stata inviata in produzione.
Figura 10-29 - La versione finale del layout della PCB dello Switchinator.
Prima di inviare i file Gerber, ho ricontrollato il design con lo strumento Gerbv (che
stato presentato prima con la GreenShield). Potete vedere una cattura dello schermo
nella Figura 10-30.
Il collaudo
I test finali dello Switchinator completo sono ampiamente una ripetizione dei test eseguiti
sul prototipo. La grande differenza, adesso, che ci sono due driver ULN2003A e
uninterfaccia RS-232 integrata basata su un IC MAX232. Deve essere testato anche
lalimentatore, oltre agli input analogici.
Prossimi passaggi
Qui, non sono stati utilizzati tutti i pin I/O digitali discreti della MCU: rimangono disponibili
10 pin (6 dei quali capaci di output PWM). Io non li ho collegati per via dei limiti di spazio
della PCB, ma sarebbe possibile modificare la PCB in modo che possa accogliere un
paio di pin socket da sei posizioni. Questo, tuttavia, richiederebbe un utilizzo astuto di
vie per dirigere le tracce nel traffico intorno alla MCU.
Linterfaccia SPI disponibile sui pin D11, D12 e D13 e questi sono collegati al
connettore ICSP. Se selezionate un pin inutilizzato per la linea SS, potete collegare un
modulo SPI allo Switchinator. I pin analogici possono essere utilizzati come pin I/O
digitali facendovi riferimento come pin dal D14 al D19.
Potete aver notato che non ci sono fusibili n protezione degli input per gli input
analogici. Per vedere un esempio di protezione degli input analogici, potete andare nel
Capitolo 11 e guardare il circuito di input utilizzato per il generatore di segnale.
Fonti
Questo capitolo si mosso in un territorio molto ampio e ha compiuto un paio di salti.
Ecco alcune fonti che vi possono aiutare a gettare pi luce sugli argomenti che in questo
testo sono stati trattati soltanto brevemente:
Testi di riferimento
Esistono numerosi testi che parlano di tutti gli aspetti dellelettronica. Questi sono
quelli ai quali sono particolarmente affezionato e che hanno a che vedere
direttamente con il materiale trattato in questo capitolo (nellAppendice D trovate i
numeri ISBN e ulteriori testi raccommandati):
Jan Axelson, Making Printed Circuit Boards
Paul Horowitz e Winfield Hill, The Art of Electronics, 2 Edizione
J. M. Hughes, Practical Electronics: Components and Techniques
J. M. Hughes, Real World Instrumentation with Python
Simon Monk, Fritzing for Inventors
Matthew Scarpino, Designing Circuit Boards with EAGLE
Cattura degli schemi e layout delle PCB
Fritzing e Eagle non sono gli unici strumenti CAD per elettronica esistenti, ma sono
quelli che si incontrano pi spesso quando si scaricano schemi o layout di schede
creati e pubblicati online da altri. Fritzing gratuito e open source ed esistono molte
fonti per le definizioni delle parti oltre a quelle che include. facile da imparare e
facile da utilizzare e per i progetti Arduino una buona scelta.
La versione gratuita di Eagle ha tre funzionalit che si trovano nelle versioni
commerciali dello strumento e quindi presenta un chiaro percorso di aggiornamento
quando volete esplorare il mondo degli strumenti CAD/CAM professionali per
lelettronica. Ricordate soltanto che la versione gratuita di Eagle presenta alcuni limiti
e non pensata per essere utilizzata nelle situazioni nelle quali pensate di
guadagnare soldi per il vostro lavoro. Per quelle, dovrete acquistare una licenza
commerciale.
Alcune altre opzioni di strumenti CAD sono strumenti Linux open source come la
suite gEDA e KiCad, entrambi i quali hanno funzionalit comparabili a quelle dei
prodotti commerciali. Per ulteriori informazioni sugli strumenti menzionati qui, potete
visitare i loro siti web:
Eagle (http://www.cadsoftusa.com/download-eagle)
Fritzing (http://www.fritzing.org)
gEDA (http://www.geda-project.org)
KiCad (http://kicad-pcb.org)
Produttori di PCB
Esistono molte aziende che producono PCB e offrono prezzi bassi e tempi rapidi.
Cercate sul Web e, se per caso vivete in una grande area metropolitana,
assicuratevi anche di controllare quali servizi avete a disposizione localmente. Io ho
menzionato Advanced Circuits soprattutto perch ho una maggiore familiarit con
loro e non ho mai avuto problemi con il loro lavoro. Anche ragazzi di Fritzing.org
offrono un servizio di produzione di PCB (potete accedervi dallo strumento Fritzing):
Advanced Circuits (http://www.4pcb.com/bare-bones-pcbs)
Fritzing Fab (http://fab.fritzing.org/fritzing-fab)
Componenti
In questo libro, ho fatto riferimento a molte fonti diverse per tutto, da singoli
componenti a moduli e schede Arduino complete. Ecco alcune societ che possono
rappresentare dei punti di partenza da prendere in considerazione (ne trovate altre
nellAppendice C):
Adafruit (http://www.adafruit.com)
All Electronics (http://www.allelectronics.com)
DigiKey Electronics (http://www.digikey.com)
Mouser Electronics (http://www.mouser.com)
Newark/Element14 (http://www.newark.com)
SparkFun (http://www.sparkfun.com)
11
Quasi tutti i laboratori di elettronica, che siano grandi o piccoli, hanno bisogno di
sorgenti di segnale. In alcuni casi, pu trattarsi di semplici generatori di onde sinusoidali
e in altre situazioni possono essere richiesti strumenti pi complessi come un generatore
di funzioni. Il generatore di segnale descritto in questo capitolo, mostrato nella Figura
11-1, capace di generare entrambi i tipi di output, ossia onde sinusoidali e quadre, fino
a 40 MHz.
Anche se i kit vanno bene per generare forme donda, possono non disporre di tutte le
funzionalit o le caratteristiche che desiderate o delle quali avete bisogno. Dopo tutto,
sono stati concepiti da qualcun altro e questa persona pu avere una nozione diversa di
che cosa rende utile un generatore di segnale. Costruendovelo da soli, potete ottenere
esattamente quello che volete e potete modificarlo o espanderlo nel corso del tempo
man mano che cambiano le vostre necessit.
Una considerazione molto importante come viene generato il segnale. In altre parole, il
microcontroller sta facendo da solo tutto il lavoro, oppure delega il compito di generare
le forme donda a un IC dedicato sul circuito? Nel caso del generatore di funzioni FG085
mostrato nella Figura 11-2, come controller principale dello strumento si utilizza
ATmega168, per linterfaccia USB si utilizza un CP2101 e il segnale viene generato da
un ATmega48 e da un DAC che comprende una serie di resistenze. Questo approccio
non presenta nessun problema e permette al generatore di fare ben pi che
semplicemente generare onde sinusoidali e quadre: pu anche produrre forme donda
arbitrarie a partire da pattern di dati precaricati (cosa che pu rivelarsi molto utile). Lo
svantaggio, quando si utilizza un microcontroller per generale il segnale, che impone
un limite alla frequenza pi alta possibile che pu generare il dispositivo. Nel caso di
questo specifico generatore di funzioni, il limite si aggira sui 200 kHz. Non si tratta di un
difetto dellFG085, n di nessuno dei dispositivi che utilizzano un microcontroller in
questo modo: semplicemente un dato di fatto.
Un microcontroller pu girare soltanto a questa velocit e questa velocit massima del
clock impone un limite massimo rigido su quanto velocemente pu cambiare i suoi output
per creare un segnale ciclico. Nel caso di molte applicazioni, 200 kHz vanno bene, in
particolare nel mondo dei sensori e dei controlli incorporati. Come ho sottolineato prima,
di solito le cose non vanno molto rapidamente nel mondo reale, almeno nelle scale di
tempo in microsecondi dei microcontroller.
Se vogliamo andare oltre i 200 kHz, dobbiamo scegliere unaltra soluzione.
Fortunatamente, tutte le parti delle quali abbiamo bisogno per costruire un generatore di
segnale che possa generare onde sia sinusoidali che quadre fino a 40 MHz si trovano
facilmente come moduli compatibili con Arduino.
NOTA Trovate maggiori informazioni sullFG085 sul sito web JYE Tech (http://bit.ly/jye-fg085). Insisto che non sto
consigliando specificamente questo prodotto, ma che semplicemente ne possiedo uno che sta sul mio tavolo da lavoro
con altri dispositivi da provare. Possiedo anche altri generatori di segnale e di funzioni, alcuni interessanti e altri meno, e
tutti hanno un ruolo da giocare durante lo sviluppo e i testi di un nuovo design.
A dire la verit, adesso devo confessare che il generatore di segnale descritto in questo
capitolo finir per costare pi del dispositivo da 50 $ mostrato nella Figura 11-2. Ne
calcoleremo il costo totale quando creeremo lelenco completo delle parti in Il costo nel
dettaglio a pagina 470. Sarete voi stessi a dover decidere se il costo giustificato in
base al grado di controllo che avrete sul design e sul suo funzionamento e in base al
metodo di packaging che ho scelto. Per quanto mi riguarda, ne valeva la pena, ma nel
vostro caso potrebbe non essere cos.
NOTA Dovete ricordare che, dal momento che in questo libro lenfasi principale posta sullhardware di Arduino e sui
moduli, sensori e componenti correlati, il software qui mostrato con lunica intenzione +di sottolineare i punti chiave e
non per presentare esempi completi e pronti da eseguire. Il codice completo del software degli esempi e dei progetti si
trova su GitHub (https://www.github.com/ardnut).
La definizione e la pianificazione
Lobiettivo di questo progetto creare uno strumento di test portatile da utilizzare sul
tavolo da lavoro oppure in un ambiente simile. Sar alimentato da una presa da parete e
la custodia offrir spazio sufficiente per aggiungervi batterie in seguito, se lo si desidera.
Output del segnale:
Output di onde sinusoidali (sempre attivo), da 0 a 40 MHz, da 0 a 1 V P-P
Output di onde quadre (sempre attivo), da 0 a 40 MHz, da 0 a 5 V P-P
Input di controllo funzionale:
ingresso di controllo della porta esterna
Input di controllo della tensione per il funzionamento del VCO
Interfaccia utente e controlli:
Display LCD da due righe
Input select di frequenza (pulsanti)
Controlli del livello degli output del segnale output
Jack dellingresso della porta
Connettore BNC dellingresso CV
Accensione/spegnimento
Lintero progetto sar costruito in una custodia di plastica con maniglia per trasportarla,
come quella mostrata nella Figura 11-3. Il dispositivo sar alimentato da una presa sulla
parete con un output tra 9 e 12 V DC.
Il design
Adesso che abbiamo definito gli obiettivi del design e un primo elenco di parti, possiamo
cominciare a perfezionare il design. Cominceremo con la funzionalit che abbiamo
pensato per definire che cosa far esattamente il dispositivo e i controlli e gli I/O
necessari per svolgere le funzioni previste.
Dopo esserci fatti unidea chiara di che cosa dovr fare il generatore di segnale,
possiamo dirigere la nostra attenzione alla custodia, dal momento che questa dove
verranno montate le parti e quello che alla fine determiner che cosa potremo utilizzare
per un display, gli input dei controlli e i connettori I/O. Qui, lobiettivo trovare un
equilibrio tra la necessit di una custodia robusta e compatta e le considerazioni relative
al costo e produzione.
Dal momento che il progetto utilizza soprattutto moduli precostruiti, non sono necessari
speciali design di circuiti n layout di PCB. I vari moduli e connettori del segnale
dovranno essere collegati e quindi dovremo saldare qualcosa, ma lo vedremo nel
passaggio relativo allassemblaggio.
Per gli input dei controlli del generatore di segnale, io ho scelto di utilizzare pulsanti,
anzich un encoder rotativo come nel caso del design di alcuni generatori di segnale
DDS che si trovano su vari siti web come Instructables (http://www.instructables.com/).
Il motivo il fatto che lencoder rotativo, anche se si rivela comodo per impostare
rapidamente un valore, in realt fa soltanto una cosa: misurare la quantit e la direzione
della rotazione. I pulsanti, invece, possono fare diverse cose, a seconda di come
vengono interpretati dal software nel contesto con altri controlli e dello stato dei
dispositivi che devono controllare.
Le funzionalit
Lo scopo principale di questo strumento generare un segnale a una frequenza
specifica compresa tra 0 e 40 MHz. LAD9850 incorpora un comparatore integrato che
si utilizza per creare unonda quadra simultanea. Londa sinusoidale un segnale da 1 V
P-P (peak-to-peak) quella quadra una da 5 V P-P. La frequenza di output
continuamente variabile da 0 a 40 MHz sotto il controllo di un Arduino Uno. La frequenza
di output pu essere variata esternamente dallapplicazione di un CV (control voltage) e
pu essere azionata (o gated) da un segnale esterno (che sia active high oppure active
low). La Figura 11-4 mostra un diagramma a blocchi dello strumento con tutti i
componenti identificati nella Tabella 11-1.
Il diagramma a blocchi della Figura 11-4 mostra tre componenti principali. LArduino
gestisce gli input dei controlli: quelli forniti dallutente cos come la porta di ingresso e
lingresso CV. Il display LCD mostra lo stato corrente dello strumento e il modulo DDS
genera gli output di onde sinusoidali e onde quadre.
Il diagramma a blocchi non offre dettagli di basso livello come i numeri e le polarit dei
pin. Questo non il suo scopo. Un diagramma a blocchi mostra in modo grafico come si
relazionano le cose luna con laltra dal punto di vista funzionale. Serve anche per
controllare se le ambizioni del design hanno superato le capacit dei componenti.
Ho organizzato la Figura 11-4 in modo che gli output stiano sulla destra e gli input dei
controlli sulla sinistra. Il grande simbolo circolare rappresenta un connettore di tipo BNC
per i cavi coassiali schermati, mentre quello pi piccolo rappresenta un jack del tipo a
banana.
Un display LCD da 2 righe e 16 caratteri mostrer la frequenza e lo stato correnti dei la
porta di ingresso e dellingresso CV. Una serie di pulsanti servir a regolare la frequenza
e il funzionamento degli input dei controlli esterni. Due potenziometri serviranno a
regolare il livello di output dei segnali di onde sinusoidali e quadre.
La custodia
Per questo progetto, ho scelto la custodia Bud Industries IP-6130, che mostrata nella
Figura 11-3. Questa custodia include una maniglia per trasportarla, che si pu anche
piegare in modo che funga da supporto quando lo strumento si trova sul tavolo da
lavoro, cosa che a volte si rivela molto utile. Potete scaricarne la scheda tecnica da
Mouser Electronics (http://bit.ly/mouser-ip-6130). La custodia costa circa 25 $, ma io
lho ritenuto un prezzo ragionevole da pagare per qualcosa che deve durare a lungo e
offrire un aspetto professionale. Le dimensioni di base sono mostrate nella Figura 11-5.
Per maggiori dettagli, potete consultare la scheda tecnica del prodotto.
Una cosa da notare che i pannelli anteriore e posteriore non sono perfettamente
rettangolari: sono pi stretti sul bordo superiore che su quello inferiore, per adattarsi alla
pendenza dei lati della custodia. Questo non un problema, ma importante notarlo
perch i pannelli anteriore e posteriore si monteranno correttamente soltanto in
unorientazione. Tagliare i fori dei pannelli soltanto per scoprire che sono al contrario non
sarebbe un disastro totale, ma potrebbe risultare imbarazzante (almeno per me). Le viti
che tengono insieme la met superiore con quella inferiore devono essere coperte con
gommini protettivi che si trovano sul fondo della custodia.
Notate anche che i pannelli anteriore e posteriore non presentano unaltezza sufficiente
per poter montare su un Arduino e una pila di shield direttamente allinterno dei pannelli.
Il modelloIP-6131 pi alto (3,54 pollici/8,99 cm), ma al suo interno rimarrebbe
moltissimo spazio verticale vuoto. Quindi, io ho deciso di montare lLCD, i connettori
input/output e i controlli sul pannello anteriore, collocare lArduino e il generatore DDS
sul fondo della custodia e montare il jack per lalimentazione esterna sul pannello
posteriore. Questa soluzione lascia allinterno spazio sufficiente per un alimentatore o
delle batterie (se dovessi decidere di includere una o entrambe queste cosa). La Figura
11-6 mostra il layout del pannello anteriore.
Unaltra cosa da prendere in considerazione sono i pulsanti che si utilizzano come input
dei controlli. Un modulo con una serie di piccoli pulsanti con tappi quadrati di basso
profilo non una cosa che si trova facilmente in commercio. Nella maggior parte dei
casi, si tratta di assemblaggi personalizzati creati per un prodotti specifico. Dal
momento che non abbiamo intenzione di avventurarci in una produzione di massa, non
ha senso investire tempo e denaro per progettare e costruire un modulo personalizzato
con una serie di 3 2 interruttori e quindi quello che finir sul pannello anteriore potr
non assomigliare a quello che si vede nella Figura 11-6. Ma va bene lo stesso:
funzioner ugualmente, a prescindere quali pulsanti utilizzeremo.
Lo schema
Osservando la Figura 11-4, possiamo vedere che sembra che si stiano utilizzando quasi
tutti i pin disponibili su Arduino. Ed effettivamente cos, dal momento che non sono
assegnati soltanto i pin A4 e A5. Con lLCD, il DDS e gli interruttori di controllo collegati
verranno utilizzati tutti i pin I/O digitali discreti e per lI/O digitale dovranno essere
utilizzati anche alcuni degli input analogici. Questo mostrato nello schema della Figura
11-7.
Figura 11-7 - Lo schema del generatore di segnale.
Il modulo DDS che voglio utilizzare per questo progetto mostrato nella Figura 9-57 del
Capitolo 9. Si trova presso diversi rivenditori, tra i quali DealeXtreme (http://bit.ly/dx-
ad9850), per circa 8 $. La Figura 11-8 mostra il diagramma del pinout del modulo.
Figura 11-8 - Il pinout del modulo DDS AD9850.
LAD9850 supporta sia linterfaccia binaria parallela che seriale. In questa applicazione,
lArduino comunicher con il modulo DDS utilizzando la modalit dellinterfaccia seriale.
Per i dati, questa modalit utilizza il pin D7 sul modulo DDS.
Il modulo LCD ha 16 posizioni di pin, da collegare alla messa a terra, allalimentazione e
ai dati e ai segnali di controllo degli IC controller dellLCD, che si trovano sul retro della
PCB sotto gocce di di resina epossidica nera. La Figura 11-9 mostra le definizioni dei
pin del modulo LCD.
Figura 11-9 - Il pinout del modulo LCD.
Il prototipo
Questo progetto utilizza componenti pronti per luso e per sviluppare il software si rivela
utile un prototipo costruito a partire dalle stesse shield e dagli stessi moduli. Se state
aspettando che vi arrivino le parti, potete procedere con il software con un prototipo che
funzioni in modo simile. Per questo progetto utilizzer una configurazione di prova che
consiste di un Arduino Uno montato su una base di legno, come mostra la Figura 11-10.
Figura 11-10 - Un prototipo di Arduino.
Nel prototipo utilizzo un Arduino Uno, una PCB con una serie 5 4 di pulsanti in
miniatura che includono anche 8 LED, una coppia di estensori di terminali a vite, una
shield di prototipazione con montato un modulo DDS e il modulo LCD che aggiungeremo
nello strumento finale. I pulsanti serviranno per gli input dei controlli del generatore di
segnale. I quattro rel mostrati nella Figura 11-10 non si utilizzano in questo progetto e
quindi non sono collegati. Le connessioni con Arduino sono identiche a quelle mostrate
nella Figura 11-7.
Modalit:
Pulsante Modalit: Gate Modalit: CV
Frequenza
Freq Inc frequency Gate on CV enable
Freq Dec frequency Gate off CV disable
Intervallo Inc freq range Gate CV zero set
Range Dec freq range Gate CV zero reset
Il generatore di segnale ha tre modalit di input dei controlli. Nella Tabella 11-3
possiamo vedere che in realt ci sono 12 possibili input dei controlli, a seconda della
modalit. Il pulsante Select non mostrato, perch utilizzato come se fosse il tasto
Invio: premendo il pulsante Select, si uscir dalla modalit di input per i controlli gate o
CV e si riporter lo strumento alla normale modalit di funzionamento di intervallo e
frequenza.
Loutput delle forme donda sempre attivo, a meno che non venga bloccato dalla
modalit gate. La frequenza e lintervallo possono essere alterati in qualsiasi momento
quando lo strumento non si trova nella modalit gate. Premendo i pulsanti Freq + o Freq
e quindi rilasciandolo, si far s che la frequenza cambi di 1 Hz. Quando i pulsanti Freq
+ o Freq sono mantenuti premuti, il valore cambia per incrementi (o decrementi) di 10,
100 o 1.000 (a seconda del valore corrente) finch il pulsante non viene rilasciato.
Loutput della frequenza del generatore suddiviso in intervalli, ciascuna dei quali
abbraccia 10.000 Hz. Quindi se lintervallo 1 va da 0 a 9.999 Hz, lintervallo 2 andr da
10.000 a 19.999 Hz e cos via. Lutilizzo dei controlli dellintervallo non obbligatorio. La
ragione principale per includere questi controlli permettere ai controlli Freq + e Freq
di regolare loutput in incrementi maneggevoli allinterno di un determinato intervallo.
Altrimenti, lutente dovrebbe premere i pulsanti Freq + o Freq per un po per
raggiungere la frequenza desiderata. La frequenza di output viene aggiornata
continuamente e quindi non c bisogno di premere il pulsante Select.
Lintervallo pu essere un valore qualsiasi compreso tra 1 e 4.000. Se la frequenza
incrementata oltre il termine di un intervallo, il numero dellintervallo si incrementa
automaticamente. Se la frequenza viene decrementata al di sotto del valore minimo
dellintervallo attuale, il valore dellintervallo viene decrementato di 1. Lintervallo si
incrementer o decrementer automaticamente in passaggi di 10, 100 o 1.000, proprio
come linput dei controlli della frequenza.
Le impostazioni di CV e gate si modificano passando lo strumento nella modalit di input
dei controlli appropriata. Il pulsante Mode seleziona la modalit di input dei comandi e il
pulsante Select rende attiva limpostazione attuale e riporta lo strumento nella modalit
operativa normale.
Quando il gate attivo, il generatore non produce nessun output finch la condizione di
gate selezionata presente sul la porta di ingresso. I pulsanti Freq + e Freq si
utilizzano per attivare o disattivare il gate. I pulsanti Range + e Range selezionano la
modalit gate sense: rispettivamente, active high o active low.
Il CV (control voltage) input una tensione analogica compresa tra 0 e 5 V DC, dove
2,5 V il punto zero nominale (non si utilizzano tensioni negative). Nella modalit CV, i
pulsanti Freq + e Freq attivano o disattivano lingresso CV. Il punto zero pu essere
cambiato selezionando la modalit CV e premendo il pulsante Range +. Il pulsante
Range resetta il punto zero del CV sul valore predefinito di 2,5 V.
Una volta attivato, lingresso CV attivo finch non viene esplicitamente disattivato. Una
tensione di input al di sopra del punto zero far s che la frequenza di output aumenti,
mentre una tensione di input al di sotto punto zero far s che la frequenza di output si
riduca. Per impostare il punto zero, si applica la tensione desiderata allingresso CV e si
preme il pulsante Range +. Disattivando lingresso CV non si altera limpostazione del
punto zero.
La visualizzazione delloutput
Una grande sfida con qualcosa che utilizza un display minimo scoprire come utilizzarlo
in modo efficace per visualizzare le informazioni in una forma condensata. LLCD che
utilizziamo per il generatore di segnale ha due righe di posizioni indirizzabili con 16
caratteri ciascuna. La Figura 11-11 mostra come ho scelto di inserire le informazioni
essenziali sul display durante il funzionamento.
Quando il generatore di segnale si trova in una modalit qualsiasi che non sia loutput
della frequenza, i due punti che seguono la lettera relativa alla modalit lampeggiano.
Quindi, se si trova nella modalit CV, lampeggiano i due punti dopo il carattere C e quelli
dopo il carattere G lampeggiano quando si trova nella modalit gate.
Premendo linterruttore Mode, si passa ciclicamente e ripetutamente tra Gate, CV e
input dei controlli off (funzionamento normale). Le funzioni C e G possono essere
alterate soltanto quando attiva la modalit di controllo associata. Una volta mostrato il
valore desiderato, il pulsante Select imposta loutput sulla configurazione visualizzata e
lo strumento riprende il funzionamento normale.
Il campo G (gate) mostrer X, +, oppure , a seconda dello stato della funzione gate. Il
simbolo + significa che il gate attivo su un input high, mentre il simbolo significa che il
gate risponder a un input low. X significa che la funzione gate disattivata. Le
impostazioni del gate diventeranno attive quando si premer il pulsante Select.
Il campo C (CV) moster X, 0, +, oppure . Mostrer + se la funzione CV attiva e la
tensione di controllo dellinput maggiore del punto zero, - se CV attiva e la tensione
di controllo inferiore al punto zero e 0 se CV attiva e la tensione di controllo uguale
al punto zero. I simboli 0, + e vengono aggiornati in tempo reale quando viene attivato
lingresso CV. X significa che lingresso CV disattivato. Le impostazioni del CV
diventeranno attive quando si premer il pulsante Select.
In molti sensi, questo un ritorno ai tempi quando molti dispositivi erano dotati di display
piccoli. Prima dellavvento dei display LCD e TFT ad alta risoluzione, si vedevano
spesso display piccoli come questo, se mai se ne utilizzava uno. Prima dellintroduzione
dei display LED alfanumerici, questo lo si sarebbe fatto utilizzando soltanto numerali e
interpretare alcuni di questi vecchi display era sicuramente difficile. Per fortuna, adesso
possiamo comprare piccoli ed economici componenti LCD alfanumerici, ma ancora
necessaria un po di creativit per il layout dei dati e un certo grado di interpretazione.
Il modulo DDS
Il modulo DDS AD9850 montato su una shield di prototipazione, come mostrato nella
Figura 11-12. Questo opzionale ed possibile montarlo semplicemente sul fondo della
custodia e utilizzare fili per collegarlo. Io, per, vi consiglio la shield, perch fornisce una
base robusta per il modulo e permette di utilizzare terminali a vite. Questo un modo
molto pi ordinato di creare le connessioni che non saldare ed molto pi affidabile che
collegare ponticelli.
Tutta la shield DDS formata dalle parti elencate nella Tabella 11-4.
Tabella 11-4 - Lelenco delle parti della shield di prototipazione DDS.
Quantit Descrizione
Shield di prototipazione, Adafruit #51 o
1
equivalente
Morsettiera a vite da 8 posizioni e 0,1
1
pollici (2,54 mm)
1 Pin socket header da 6 posizioni
1 Modulo DDS AD9850
Gli input del modulo DDS sono collegati al pin socket da sei posizioni e gli output sono
collegati alla morsettiera da otto posizioni. Lalimentazione e la messa a terra sono
fornite dalla shield di prototipazione. I LED per adesso non sono utilizzati, ma uno pu
essere collegato allalimentazione e laltro allinput D7 (D13 sullArduino). La Figura 11-
13 mostra come i vari segnali e le varie linee dei moduli DDS si collegano sulla shield di
prototipazione.
La morsettiera della PCB e il pin socket headerda sei posizioni si collegano sulla parte
inferiore della shield di prototipazione. Io ho utilizzato un filo da 28 AWG, ma va bene
qualsiasi filo tra i 24 e i 32 AWG. Per le connessioni tra i pin del modulo e la
morsettiera, non ho utilizzato cavi schermati, ma pu valere la pena farlo, specialmente
ad alte frequenze.
Per gli input dei controlli del DDS avrei preferito non utilizzare un socket header, ma,
vista la mancanza di spazio sulla shield di prototipazione, non rimanevano molte
alternative. Nellassemblaggio finale, ho utilizzato alcuni jumper esistenti e ho tagliato le
estremit che sarebbero andate nei terminali a vite per i segnali di controllo di Arduino.
Nella versione finale, questi fili verranno fissati al socket header con un po di gomma
siliconica trasparente.
Il software
Il software del generatore di segnale strutturato nel modo convenzionale per le
applicazioni di Arduino, con una funzione setup() e una funzione loop(). La funzione
setup() gestisce le modalit dei pin I/O e altre configurazioni, mentre la funzione loop()
gestisce gli input dei controlli e gli output del segnale. Il generatore di segnale si
discosta da uno sketch convenzionale per il modo nel quale organizzato. composto
di diversi file sorgente (sei in tutto) con file include (cio, header) associati.
Il software per controllare il DDS in realt non fa altro che leggere la porta di ingresso o
lingresso CV e quindi scrivere i giusti dati di controllo sullIC DDS. La parte difficile
come mappare gli input dei controlli in modo che ci permettano di controllare come e
quando avvengono queste azioni. Come nel caso di qualsiasi altro dispositivo dotato di
microcontroller, il software che offre la funzionalit desiderata. Senza il software, non
altro che una massa di plastica, fili, schede a circuito e un po di silicio.
Il codice del generatore di segnale strutturato in modo tale che le variabili globali si
trovino in un modulo di compilazione separato, sig_gen_gv.cpp. Anche lLCD, gli input
dei controlli, le funzioni CV (control voltage) e gate si trovano in moduli separati. La
Tabella 11-5 elenca i moduli sorgente e le loro rispettive funzioni.
Tabella 11-5 - I moduli del codice sorgente del generatore di segnale.
Modulo Funzione
NOTA Notate che gli oggetti LCD e DDS si istanziano utilizzando loperatore C++ new nel file sig_gen_gv.cpp. Questo
possibile perch le variabili ancora degli oggetti, lcd e ddsdev, sono definite nel modulo delle variabili globali ed
esportate in sig_gen_gv.h. Perch questo funzioni, il modulo principale deve contenere le dichiarazioni include di
LiquidCrystal.h e DDS.h e le stesse dichiarazioni include devono apparire anche nel file delle variabili globali. Per via di
unirregolarit nel modo nel quale lIDE di Arduino gestisce le dichiarazioni di scoping e include, tutti i riferimenti a una
libreria esterna inclusi nel file di una scheda devono essere inclusi anche nel file principale. Notate anche che i moduli
ausiliari contengono la dichiarazione #include "Arduino.h" per permettersi luno allaltro di accedere allambiente di
Arduino. Loperatore new descritto nel riquadro Istanziare oggetti di classe con new a pagina 103 nel Capitolo 5.
Il codice sorgente della funzione loop(), elencato nellEsempio 11-3, appare semplice
perch tutte le funzionalit si trovano nei moduli ausiliari. Quando viene chiamata
ciascuna delle funzioni, imposta o legge le variabili globali.
La libreria DDS
Con il codice sorgente del generatore di segnale, stata inclusa una semplice libreria
per il modulo DDS. Per installare la libreria DDS basta creare una directory di nome
DDS nella propria directory sketchbook/libraries e inserirvi DDS.cpp e DDS.h. La
libreria DDS apparir nella casella combinata delle librerie dopo il riavvio dellIDE (o
immediatamente nelle versioni pi recenti dellIDE). Potete notare che tra i file della
sottodirectory della libreria DDS non c nessun README, n nessun keywords.txt.
Questa classe cos semplice che non ne ho visto la necessit.
La libreria DDS utilizzata con il generatore di segnale illustra alcuni dei concetti della
creazione di librerie personalizzate che sono stati presentati nel Capitolo 5. Si tratta di
una classe semplice, che gestisce i calcoli necessari per creare il data word di controllo
utilizzato dallAD9850. Il file DDS.h, mostrato nellEsempio 11-5, contiene la definizione
della classe.
Dopo che loggetto DDS stato istanziato, se vogliamo migliorare la precisione del
generatore di segnale possiamo passarvi un coefficiente di calibrazione. Per vedere
come si calcola questo valore, potete consultare la scheda tecnica dellAD9850. In
questa classe, presenta semplicemente il valore predefinito 0.
Oltre al costruttore delloggetto e alla funzione calibrate(), lunico altro metodo
utilizzato dal codice al di fuori della classe la funzione setFrequency(). La frequenza
espressa in Hertz. La word di controllo calcolata viene spostata sullIC DDS un bit alla
volta.
I test
Dando per scontato che il prototipo sia collegato correttamente, dobbiamo riuscire a
compilare e a caricare il software su Arduino Uno. Allavvio, il display mostra DDS
Signal Gen e Initializing, seguito da Ready e quindi dai campi relativi ai dati.
Possiamo regolare i tempi di ritardo per fare in modo che il testo di avvio rimanga sul
display pi a lungo oppure eliminarlo completamente. Siete liberi di scegliere.
SUGGERIMENTO Quando il generatore di segnale collegato come mostrato nella Figura 11-7, si pu utilizzare la
libreria Serial. La libreria assume il controllo dei pin Rx e Tx (D0 e D1, rispettivamente) e li rende high. Questo confonde
il DDS 9850 e non genera nessun output. La libreria Serial va bene per il debug degli input dei controlli, che quello che
ho fatto, ma non deve essere istanziata quando collegato il DDS. Potete sempre modificare le assegnazioni dei pin
analogici e digitali in modo da utilizzare A4 e A5 per gli input degli interruttori dei controlli e liberare D0 e D1 per lI/O
seriale, ma in questo progetto io non ho visto la necessit di farlo. Linterfaccia USB funziona bene per caricare nuovo
software su Arduino, se necessario, anche con il modulo DDS collegato.
La prima cosa da controllare loutput a onde sinusoidali. Nella Figura 11-17 mostrata
londa sinusoidale da 1.000 Hz, che dovrebbe essere circa 1 V P-P. Il prototipo non
dotato dei controlli di livello delloutput che aggiungeremo nellunit finale e quindi, se non
vedete londa sinusoidale, dovete scollegare lunit e ricontrollare le connessioni.
Loutput a onde quadre avr la stessa frequenza di quello a onde sinusoidali, con
unampiezza di circa 5 V P-P (in realt, qualunque V+ sia). Loutput si presenter come
quello della Figura 11-18.
Figura 11-18 - Un output a onde quadre da 1 kHz.
Se sono presenti entrambi gli output, i test possono procedere con gli input dei controlli.
Gli input di frequenza e intervallo possono essere testati innanzitutto premendo i pulsanti
Freq + e Freq . La frequenza sul display deve cambiare di 1 Hz a ogni pressione del
pulsante. Adesso dobbiamo tenere premuto il pulsante Freq +. La frequenza deve
incrementarsi prima di 1, poi di 10, poi di 100 e infine di 1.000. Ci fermiamo a circa
15.000 e controlliamo loutput. Notate che il valore dellintervallo si incrementa
automaticamente quando la frequenza va oltre 9.999. Ripetiamo il tutto con il pulsante
Freq . Il valore dellintervallo si riduce man mano che decresce la frequenza.
Se premiamo il pulsante Range +, la frequenza si incrementa di 10.000 a ogni pressione
del pulsante. Cambiamo lintervallo su un valore pari a 4 e osserviamo loutput. Deve
essere di circa 40 kHz. Premiamo il pulsante Range e osserviamo il display. La
frequenza deve ridursi di 10.000 per ogni decremento nel valore dellintervallo.
Premiamo il pulsante Mode e teniamolo momentaneamente premuto finch i due punti
accanto al simbolo G non cominciano a lampeggiare. Adesso premiamo i pulsanti Freq +
e Freq per attivare e disattivare la porta di ingresso. Premiamo i pulsanti Range + e
Range per cambiare lo stato dellinput sense. Deve alternare tra + e . Premiamo il
pulsante Select per tornare al funzionamento normale.
Quando il gate attivo e non c nessuna porta di ingresso, loutput deve cessare.
Selezioniamo la modalit di input (active low) e osserviamo che loutput diventa attivo
ogni volta che un jumper collegato dalla porta di ingresso (A2 sulla Uno) alla messa a
terra. Quando ci troviamo nella modalit di input + (active high), loutput viene attivato
ogni volta che il jumper collegato a una sorgente di tensione positiva, ma cessa
quando linput A2 messo a terra. Disattiviamo la porta di ingresso entrando nella
modalit di controllo del gate e utilizzando il pulsante Freq per disattivare il
funzionamento del gate.
Per testare lingresso CV (A3 su Arduino), avremo bisogno di unalimentazione variabile
oppure di un alimentatore da 5 V e di un potenziometro da 10K e anche di un DMM,
mostrato nella Figura 11-19. Se il vostro oscilloscopio non dotato di una funzione di
visualizzazione della frequenza (come la maggior parte dei moderni strumenti DSO),
potete utilizzare un contatore di frequenza di qualche tipo.
Lassemblaggio finale
Se decidete di utilizzare la shield di prototipazione per il modulo DDS, vi suggerisco una
serie di estensori dei terminali a vite, come quelli mostrati in Shield adattatori a pagina
271 nel Capitolo 8. Questi non soltanto offrono collegamenti affidabili per i fili, ma
sollevano anche la shield DDS sulla scheda Arduino. In questo modo, rimane dello
spazio per quando dovete accedere al connettore ICSP. Potete anche utilizzare una
shield con terminali a vite, come il kit mostrato in Ridurre il costo a pagina 468.
Le resistenze pull-up
Sei resistenze da 2,2K montate in una parte della scheda perforata del prototipo
servono come pull-up per i sei interruttori dei pulsanti. Anche se la MCU AVR ha un
certo grado di funzionalit di pull-up, la serie di resistenze assicurano che ci sar una
tensione positiva per lavorare con gli interruttori. Significa anche che gli input degli
interruttori sono active low (input 0 V = on).
Dal punto di vista elettrico, il modulo pull-up molto semplice, come si pu vedere nello
schema mostrato nella Figura 11-20. Le sei resistenze sono collegate sulle linee del
segnale di ciascun interruttore degli input dei controlli e la connessione comune di tutte
le resistenze collegata a +5 V DC.
Figura 11-20 - Lo schema delle resistenze pull-up degli input dei controlli.
La scheda pull-up completa mostrata nella Figura 11-21. Lutilizzo delle morsettiere da
0,1 pollici consente collegamenti facili e connessioni affidabili. Inoltre, la Figura 11-21
mostra il modulo di protezione degli input e lArduino montato con la shield di
prototipazione DDS. A questo punto, sono stati collegati soltanto +5 V e la messa a
terra.
Figura 11-22 - Lo schema del circuito esterno di protezione degli input dei controlli.
Le resistenze da 470 ohm per limitare la tensione in serie con gli input possono produrre
un leggero abbassamento della tensione che appare sullinput dellADC dellAVR, ma,
dal momento che la porta si comporta come un input binario e che il CV un input
relativo, in realt non importa. I valori delle resistenze possono essere perfino
aumentati, se vi preoccupa il fatto che qualcuno dei diodi passi troppa corrente in una
situazione di sovratensione o sottotensione. Il modulo di protezione completo stato
mostrato nella Figura 11-21. Qui sono state utilizzate anche le morsettiere della PCB.
La Figura 11-24 mostra il modello dei fori utilizzato per il pannello anteriore del
generatore di segnale. Per montare il modulo LCD, ho specificato fori #4 (2,79 mm), ma
potete utilizzare fori con un diametro inferiore, se sono posizionati con precisione. Il
pannello posteriore ha solo un connettore di alimentazione DC cilindrico e un
potenziometro per il contrasto dellLCD e questi possono essere montati come meglio
credete.
Anche se pu non essere necessario prendersi la briga di creare disegni dettagliati
come quelli che sono stati preparati per questo progetto, valgono per molto tempo. I
disegni della progettazione e della produzione sono registrazioni di quello che stato
fatto e assicurano che, se mai dovesse sorgere la necessit di costruire altri generatori
di segnale, non si dovr ripetere nessuno dei lavori di design a meno che non si
applichino modifiche drastiche.
LArduino Uno e la shield di prototipazione DDS sono montati sul fondo della custodia,
insieme alla serie di resistenze pull-up e al modulo di protezione degli input. Le posizioni
esatte non sono particolarmente importanti, ma lArduino non deve essere montato
vicino al pannello anteriore per aiutare a tenere i cavi ordinati. La Figura 11-21 mostra i
componenti interni montanti e pronti per essere collegati ai componenti sul pannello
anteriore.
Dopo aver montato i componenti interni e aver aperto i fori nel pannello anteriore, il
passaggio logico seguente montare i vari controlli e il modulo display LCD sul pannello
anteriore. Non dobbiamo dimenticarci di etichettare i controlli e i connettori.
SUGGERIMENTO Se prevedete di utilizzare unetichettatrice, potete stampare e applicare le varie etichette prima o
dopo aver montato i controlli. Tuttavia, se prevedete di utilizzare trasferelli o di dipingere le lettere sul pannello in qualche
modo (magari con una serigrafia), vi conviene farlo prima di montare le parti. Inoltre, quando utilizzate unetichettatrice
dovete assicurarvi di disporre del nastro appropriato per il dispositivo. Per esempio, alcuni modelli non sono dotati di
nastro bianco su nero. Dovete assicurarvi di trovare il nastro del quale avete bisogno, oppure dovete accontentarvi
delle opzioni disponibili, prima di decidere di utilizzare letichettatrice. Io ho utilizzato una stampante laser e etichette
adesive per stampare le lettere (bianco su nero) e poi ho ritagliato ciascuna di esse e le ho appiccicate sul pannello
anteriore.
sorprendente quanto velocemente la custodia pu cominciare a riempirsi una volta che
le parti sono al loro posto e che i fili corrono tra i vari componenti. La Figura 11-25
mostra come si presenta la parte interna del generatore di segnale appena prima di
chiuderlo con il coperchio. Notate che non mi sono preoccupato di aggiungere una
manopola sul potenziometro del contrasto montato sul pannello posteriore.
NOTA Aspettate un attimo a montare il coperchio. Lasciate lo strumento aperto finch non avete completato il test
finale. Nessuno perfetto e possono verificarsi piccoli errori. Se lunit aperta, raggiungere e aggiustare un terminale
allentato o ricollegare un cavo molto pi facile.
Il modulo LCD si monta utilizzando quattro distanziatori di nylon con sotto i dadi. Io ho
saldato degli standard socket header standard sovrapponibili sulla PCB dellLCD da
davanti e poi ho ritagliato i terminali sul retro di circa 1/4 di pollice (6,5 mm), per
permettere ai socket header di essere premute sui pin. I fili saldati sugli header pin e
protetti dal termorestringente producono connettori fatti in casa decenti per il modulo
LCD. Potete vedere i connettori dellLCD nella Figura 11-25.
Per ordinare i cavi, ho utilizzato delle fascette di nylon e le morsettiere della PCB hanno
reso facilissimo creare le connessioni. Lunica parte che stata leggermente difficile
stato trovare un modo di trasformare in connettore linput dellalimentazione DC e il
controllo del contrasto dellLCD montati sul pannello posteriore. Alla fine, sono ricorso a
una morsettiera da sei posizioni con viti #6 (da 3,3 mm) e terminali crimpati.
Lalimentazione
Il generatore di segnale include un connettore cilindrico sul pannello posteriore per linput
dellalimentazione DC. Oltre al jack DC, ho acquistato anche le prese corrispondenti.
Questo significa che ho potuto selezionare un trasformatore da parete (adattatore DC)
con un output di tensione adatto, collegare la presa e sapere che corrispondeva
correttamente al connettore dellalimentazione. La tensione DC del connettore
posteriore condotta a una morsettiera, quindi allinterruttore dellalimentazione sul
pannello anteriore e infine a un connettore DC che si inserisce nella scheda Uno scheda.
Non ci sono fuse, dal momento che lalimentazione DC non condotta da nessuna parte
dove potrebbe trovare un percorso esterno diretto alla messa a terra, ma aggiungerne
uno non sarebbe difficile.
I ragazzi di Arduino, per un Arduino senza USB collegato, consigliano di utilizzare un
adattatore da 9 a 12 V DC. Con un adattatore da 5 V DC, c un forte calo nel
regolatore di tensione interno sulla PCB di Arduino e i terminali da 5 V daranno intorno ai
3,5 V. Io ho modificato un adattatore da 9 V DC esistente che avevo in una grande
scatola di surplus ( incredibile quanto rapidamente queste cose possono accumularsi
nel tempo). Potete trovare maggiori informazioni sugli adattatori DC SullArduino
Playground (http://bit.ly/apg-what-adapter).
Devo segnalarvi che la maniglia dello strumento che si vede nella n Figura 11-26
presenta qualcosa di strano. Io ho mantenuto corretta lorientazione alto-basso della
custodia, ma accidentalmente ho scambiato davanti e dietro. Non voglio mentire e dire
che lho fatto apposta, perch da parte mia stato sicuramente un errore, ma il fatto
che in realt funziona piuttosto bene. Normalmente, la maniglia sporge sul davanti
dellunit, quando questa in una posizione che non richiede supporto. Con la maniglia
al contrario, il generatore pu sempre rimanere in una posizione inclinata, ma adesso la
maniglia non occupa tanto spazio sul tavolo da lavoro. Sono stato fortunato. Gli errori
non sempre danno buoni risultati come in questo caso.
Ridurre il costo
Come descritto in questo capitolo, il generatore di segnale non un progetto
economico. Questo dovuto in parte al packaging scelto, ai connettori, ai controlli e a
ulteriori cose come gli estensori dei terminali a vite, la serie ausiliaria di pull-up e i moduli
di protezione degli input. Se per volete ridurne il costo, esistono alcuni modi per farlo e
ottenere comunque qualcosa di utile.
Ho visto alcuni cloni di Arduino per soli 15 $. Il modulo DDS una parte essenziale del
progetto e quindi ecco altri 10 $. Una shield di prototipazione con terminali a vite costa
circa 16 $, ma potete optare per una shield di prototipazione pi semplice,
semplicemente per disporre di un posto per il modulo DDS, per circa 10 $. Per ridurre
ulteriormente il costo, potete dimenticarvi completamente della custodia e accontentarvi
di una pila di shield su Arduino. Esistono diverse shield LCD dotate di pulsanti, come
quella mostrata in I display LCD a pagina 264 nel Capitolo 8 e queste costano circa 12
$ ciascuna. Di solito queste shield hanno soltanto quattro o cinque pulsanti a
disposizione per funzioni programmate e quindi potete avere bisogno di riprogettare
leggermente il software di interfaccia dei controlli per adattarlo a meno input dei
controlli.
Se non avete bisogno o interesse di disporre di un dispositivo indipendente, potete
eliminare i controlli dellLCD e i pulsanti e utilizzare lunit sotto il controllo di un computer
host soltanto con un Arduino e il modulo DDS. Si tratta di un tipo di dispositivo diverso
del quale non ho parlato in questo capitolo. Se cercate qualche idea di come
implementare uninterfaccia di controllo remota, potete dare unocchiata al software
presentato nel Capitolo 10 per i progetti della GreenShield e dello Switchinator.
Se avete una pila di schede formata da un Arduino, una shield di prototipazione per
fissare il modulo DDS e una shield LCD, laspetto sar simile a quello mostrato nella
Figura 11-27.
Prezzo Tot.
Quantit Articolo Fonte
unitario parz.
1 Custodia, Bud IP-6130 Mouser 25,40 25,40
1 Arduino Uno Adafruit 24,95 24,95
1 Modulo DDS DealeXtreme 7,99 7,99
1 Shield di prototipazione Adafruit 9,95 9,95
Adattatori terminali a
1 set Seeed Studio 7,50 7,50
vite
1 Display LCD, 16 2 Amazon/Uxcell 4,71 4,71
3 Connettori BNC All Electronics 1,25 3,75
2 Jack a banana Amazon 0,67 1,34
3 Potenziometro, 10K Amazon/Amico 1,28 3,84
1 Pulsante di accensione All Electronics 1,35 1,35
6 Pulsanti in miniatura All Electronics 0,60 3,60
Jack alimentazione DC
1 Parts Express 1,98 1,98
cilindrico
a Il totale parziale il costo totale di ciascuna riga di prodotti per una data quantit.
Fonti
La Tabella 11-7 elenca i distributori e i rivenditori presso i quali io ho acquistato le parti
del generatore di segnale (s, prendo nota di tutto questo, visto che si pu scaricare, e
anche voi dovreste prendere labitudine di conservare gli elenchi di tutte le ricevute e le
scatole, se non lo fate gi). Per ogni modulo o ogni parte ci sono numerose fonti: queste
sono soltanto quelle che ho utilizzato io quando ho effettuato i miei acquisti e possono
offrirvi unidea di dove cominciare a cercare.
Tabella 11-7 - Le fonti delle parti.
Distributore URL
Adafruit www.adafruit.com
All Electronics www.allelectronics.com
Amazon www.amazon.com
DealeXtreme
www.dx.com
(DX)
Mouser
www.mouser.com
Electronics
Parts Express www.parts-express.com
Seeed Studio www.seeedstudio.com
12
Forse avete sentito parlare dei cosiddetti termostati intelligenti (sospetto che molte
persone ne hanno visto almeno la pubblicit). Questi dispositivi sono un tipo di controller
digitale programmabile della temperatura e pu essere che ne abbiate perfino uno
installato a casa vostra. Alcuni permettono di cambiarne le impostazioni utilizzando
Bluetooth o qualche altro metodo di connessione wireless, insieme a unapplicazione
associata per smartphone o tablet. Altri offrono la possibilit di raccogliere dati e di
scaricarli via wireless, cosa che pu rivelarsi utile quando volete scoprire se state
consumando troppa energia per riscaldare o rinfrescare casa vostra. Ne esistono anche
alcuni, naturalmente, che non fanno niente pi di quello che facevano i vecchi modelli con
una bobina bimetallica, con lunica differenza che utilizzano un display LCD anzich una
manopola e qualche interruttore.
ATTENZIONE Se scegliete di costruire e utilizzare il termostato descritto in questo capitolo, lo fate a vostro rischio e
pericolo. Anche se utilizza circuiti a bassa tensione con un minimo rischio di prendere la scossa, c comunque il
rischio che danneggi il vostro sistema di riscaldamento o raffreddamento a causa di cicli energetici eccessivi o di
impostazioni della temperatura che superino i limiti di sicurezza del sistema (anche se la maggior parte di essi dispone
di una protezione incorporata). Per il vostro impianto di riscaldamento o di raffreddamento, vi conviene utilizzare
soltanto il circuito di controllo a bassa tensione. NON COLLEGATE IL VOSTRO TERMOSTATO PERSONALIZZATO A
CIRCUITI AD ALTA TENSIONE (110 V AC o superiore). Questo include raffreddatori evaporativi e stufe elettriche.
Gli antefatti
Esistono vari modi di migliorare un classico termostato a bobina bimetallica come quello
mostrato nella Figura 12-1. Questo tipo di dispositivo esiste da circa un secolo e utilizza
una bobina fatta di due diversi metalli, ciascuno con un coefficiente di espansione
termica diverso, in modo che quando la temperatura cambia la bobina si stringe o si
allenta leggermente.
Figura 12-1 - Un termostato elettromeccanico.
Questo movimento viene quindi utilizzato per unire alcuni contatti in modo da aprire o da
chiudere un circuito, oppure, in alcune versioni, un piccolo tubo di vetro sigillato che
contiene due contatti e una goccia di mercurio si sposta in modo che il mercurio riempia
il vuoto tra i contatti e completi il circuito (il modulo sensore di inclinazione KY-017
descritto nel Capitolo 9 utilizza questa stessa tecnica). Lazione di controllo on oppure
off: nel mezzo non c niente.
In questo capitolo, vedremo che cosa necessario per progettare, costruire e
programmare un termostato intelligente utilizzando soltanto schede Arduino gi pronte
per luso e componenti aggiuntivi facili da reperire. Ma, prima di immergerci in tutto
questo, dobbiamo cercare di capire che cos esattamente che desideriamo misurare e
controllare.
Anche se dal punto di vista energetico una banda di isteresi di 5 pi efficiente e non
obera il sistema con tanti cicli come la banda di 3,5, significa anche che la temperatura
pu oscillare di 7 tra caldo e freddo (ricordate che questi grafici sono illustrativi e non
rappresentano dati reali).
Esistono diversi fattori che influenzano quanto spesso un sistema di riscaldamento o di
raffreddamento ripeter un ciclo e il pi ovvio quanto velocemente viene eliminato il
calore quando si utilizza il condizionatore, oppure quanto velocemente viene introdotto il
calore quando si utilizza il riscaldamento. Meno ovvi, ma altrettanto importanti, sono
fattori come lumidit e il flusso daria interno. Quando lumidit aumenta, laria trattiene
pi calore, cosa che pu aiutare quando si vuole riscaldare. Un condizionatore, inoltre,
funge da deumidificatore, dal momento che condensa ed elimina lumidit dellaria che
attraversa le bobine fredde del sistema e che laria secca fa evaporare il sudore pi
velocemente, cosa che ci permette di rinfrescarci pi in fretta. Laria stagnante (cio,
laria che non si muove a meno che non sia attivo il sistema HVAC) pu portare a punti
caldi o a punti freddi in una struttura ed possibile che il termostato finisca per
regolare soltanto una parte di uno spazio interno, se il resto dellaria non si muove.
Idealmente, un sistema di controllo della temperatura dovrebbe essere in grado di
rilevare la temperatura in tutte le parti di una struttura, ma nel mondo reale questo
spesso non avviene. Invariabilmente, ci sar una stanza che riceve i raggi diretti del sole
durante la giornata, mentre altre zone rimangono allombra, o magari una stanza dove
laria non circola bene. Quindi, anche se il termostato sta facendo il suo lavoro per
mantenere la temperatura nella zona immediatamente vicino a dove si trova al setpoint
desiderato, altre parti della struttura non saranno riscaldate o rinfrescate correttamente.
Semplicemente far muovere laria pu aiutare a evitare questo e anche controllare
lumidit aiuta a determinare quando il caso di accendere il ventilatore o di utilizzare il
riscaldamento o il condizionatore. Utilizzare semplicemente un ventilatore molto meno
caro che accendere il riscaldamento o il condizionatore.
La definizione e la pianificazione
Sulla base di quello che abbiamo visto finora, siamo in grado di identificare le
caratteristiche di base che vogliamo inserire nel nostro progetto. Queste comprendono
le funzioni gi fornite da un termostato a quattro fili convenzionale, pi alcune funzionalit
aggiuntive basate sullumidit:
Orologio in tempo reale
Sensore di umidit interna
Sensore di temperatura interna
Riscaldamento o raffreddamento automatico
Controllo automatico del ventilatore
Programmazione di sette giorni
Sotto molti punti di vista, la versione base del controller HVAC simile alle unit,
disponibili nelle grandi catene di negozi per la casa (e anche in alcuni piccoli negozi di
ferramenta locali), presso le case di distribuzione di sistemi HVAC e presso vari fornitori
online.
NOTA Questo progetto evita intenzionalmente di trattare direttamente con i circuiti di controllo ad alta tensione alternata
dei sistemi HVAC. pensato soltanto per sistemi a bassa tensione (24VAC). Lalta tensione AC pu danneggiare
lattrezzatura HVAC, bruciare la vostra casa e uccidervi (non necessariamente in questo ordine). Se avete bisogno di
questo tipo di sistema, vi conviene pensare di acquistare un controller commerciale con una certificazione di sicurezza
UL e CSA e chiamare un elettricista o un tecnico specializzato per installarlo.
Le funzionalit
Il termostato fatto con Arduino ha tre funzioni fondamentali: caldo, freddo e ventilatore.
La Figura 12-4 illustra un diagramma a blocchi con i componenti principali. Il segreto del
successo sta nel modo in cui queste funzioni di base sono utilizzate per ottenere il
funzionamento pi efficiente.
Per varie funzioni, come limpostazione della temperatura, lalternarsi dei giorni della
settimana e cos via, utilizzeremo un encoder rotativo. La shield LCD dotata anche di
una serie di pulsanti, ma non li utilizzeremo.
Molti sistemi HVAC pi vecchi presentano soltanto quattro fili, mentre alcuni sistemi pi
recenti hanno anche cavi di alimentazione ausiliari. Se disponibile e se nella custodia
montato anche un piccolo alimentatore, il termostato fatto con Arduino pu utilizzare
questa fonte AC. Per questa versione del termostato, utilizzeremo una fonte di
alimentazione esterna da parete. Idealmente, sarebbe meglio condurre la corrente dai
cavi dellHVAC, ma molti vecchi sistemi non dispongono di una linea 24VAC di riserva.
La Figura 12-5 mostra come un tipico termostato pi vecchio pu essere collegato
internamente. Gli esatti dettagli interni, naturalmente, variano da un tipo allaltro, ma
lidea di base la stessa.
Una cosa fondamentale da notare in questo tipo di termostato vecchio stile che il
ventilatore collegato in modo che sia sempre acceso quando acceso il
riscaldamento o il raffreddamento. Utilizzare il condizionatore o la stufa senza il
ventilatore non una buona idea. In alcuni sistemi, il ventilatore del riscaldamento
separato dalla quello del condizionatore e si accende soltanto quando la temperatura
interna della stufa raggiunge un determinato livello.
La custodia
Per la custodia ho scelto una scatola di derivazione di plastica con un coperchio
rimovibile, adatto per essere montato sulla parete, come mostrato nella Figura 12-6.
Dopo qualche rifinitura, la scatola verr dipinta con un colore neutro per migliorarne
laspetto.
Figura 12-6 - La custodia del termostato fatto con Arduino.
Il modulo rel sar montato sul fondo della custodia e i fili esistenti del termostato
entreranno attraverso un foro nel fondo della custodia. Il modulo RTC sar montato
allinterno della custodia e il DHT22 sar collegato alla parte inferiore in modo da
rimanere esposto allambiente circostante. Io ho scelto di montare il DHT22 in questo
modo, piuttosto che metterlo dentro, perch non avevo voglia di praticare una serie di
fori nella custodia per permettere allaria di fluire. Unalternativa potrebbe essere quella
di aprire un solo foro quadrato, abbastanza grande per il DHT22, in modo che lo si
possa montare allinterno ma che abbia comunque accesso allaria esterna. Fisseremo il
termostato alla parete con quattro viti.
Lo schema
Tra il prototipo e lunit finale non ci sar nessuna differenza significativa, per cui esiste
solo una versione dello schema. Dal punto di vista elettrico, il prototipo identico al
termostato finale, ma utilizza una scheda Arduino Uno piuttosto che una Nano (la MCU
AVR la stessa su entrambi), soprattutto perch questo quello che montato sul
prototipo.
Notate che sono utilizzati tutti i pin della MCU. Linterfaccia di programmazione di
Arduino, per mezzo di D0 e D1, condivisa con lencoder rotativo. Finch lencoder
rotativo non sar in uso, questo non creer conflitti.
Potete inoltre notare che gli input analogici sono stati utilizzati come pin I/O digitali.
Questo del tutto normale e, se tornate al Capitolo 2 e al Capitolo 3, potete vedere
come la porta dellAtmega328 utilizzata per linput analogico (la porta C) anche una
porta I/O standard discreta digitale. Facendo riferimento ai pin da D14 a D19, possiamo
accedervi come a qualsiasi altro pin I/O digitale. Naturalmente, gli input analogici adesso
non sono disponibili, ma il termostato non utilizza nessun input analogico (a eccezione
del pin A0, utilizzato dalla shield LCD) e quindi questo non un problema.
SUGGERIMENTO Il semplice fatto che la convenzione di Arduino sia quella di assegnare funzionalit come linput
analogico a determinati pin non significa che i pin non possano essere utilizzati per qualcosaltro. Questo soltanto il
modo in cui i ragazzi di Arduino.cc hanno deciso di assegnare loro un nome. Dal momento che una scheda Arduino
un breakout per la MCU, senza niente tra i pin della scheda e lIC vero e proprio della MCU, quello che realmente
determina ci che un pin pu o non pu fare la MCU, non le etichette sulla PCB.
Il software
Questo un progetto con un software molto intenso, ma la maggior parte di esso
dedicato allinterfaccia utente e al profilo attivo. La logica di controllo del funzionamento
del termostato non poi cos complessa.
NOTA Dovete ricordare che, dal momento che laccento principale di questo libro posto sullhardware Arduino e sui
relativi moduli, sensori e componenti, il software mostrato qui ha il solo scopo di mettere in evidenza i punti chiave e
non di presentare esempi completi pronti per essere eseguiti. I codici completi dei software degli esempi e dei progetti
si trovano su GitHub (https://www.github.com/ardnut).
A ogni iterazione, il ciclo principale del software controller linput dellutente proveniente
dallencoder rotativo, aggiorner i dati di temperatura e umidit correnti e determiner
se il display deve passare a unaltra schermata, ad altre impostazioni o modificare i
valori. Per catturare gli input dellencoder rotativo, vengono utilizzati gestori degli
interrupt. Nella Figura 12-9 mostrata una versione di alto livello del diagramma a
blocchi del software.
Figura 12-9 - Il diagramma a blocchi del software del termostato fatto con Arduino.
I principali blocchi funzionali nella Figura 12-9 danno unindicazione di che cosa
aspettarsi in termini di codice sorgente. Oltre al file principale Thermostat.ino, ci
saranno moduli sorgente per gestire gli input dellutente utilizzando interrupt, per
programmare gli orari (diurno, serale o fine settimana) e per aggiornare il display.
La prima cosa che controlla il ciclo linterruttore (SW, switch) sullencoder rotativo.
Questo il segnale che indica che lutente vuole fare qualcosa. Linterruttore a pulsante
dellencoder rotativo viene utilizzato per spostarsi tra le schermate e tra i campi di una
schermata. Il tipo di azione determinato da quanto tempo tenuto premuto
linterruttore.
I gestori degli interrupt per linterruttore dellencoder rotativo e gli input A/B impostano
flag nel modulo delle variabili globali. Il ciclo principale li esamina per determinare quale
azione di aggiornamento del display eseguire, se necessario. I gestori degli interrupt
non vengono mostrati nella Figura 12-9. Li vedremo in Il software a pagina 496.
Il blocco con letichetta Heat/cool/fan control la logica di controllo vera e propria del
termostato. Come ho detto in precedenza, questo un regolatore di isteresi a stati
discreti, noto anche come regolatore bang-bang. La Figura 12-10 mostra la relazione
tra la temperatura, il tempo e lintervallo di isteresi in un formato temporale per un
sistema A/C. Per il riscaldamento, il funzionamento semplicemente linverso.
Nella Figura 12-11 mostrato un altro modo di rappresentare questo. Questo grafico
mostra listeresi come una funzione della temperatura. Il messaggio di entrambi i tipi di
grafici lo stesso: un sistema di controllo bang-bang (come un termostato) associato a
un attuatore on/off (la stufa o il condizionatore) non possono mai mantenere con
precisione una specifica temperatura. Il sistema si trover sempre in un qualche punto
tra le estremit superiori e inferiori dellintervallo di isteresi.
Figura 12-11 - Leffetto dellisteresi sulla risposta del sistema di controllo.
Campo Scopo
T Temperatura interna corrente, in gradi (F o C)
E Temperatura esterna (se attivata)
H Umidit
Modalit: A (automatica), H (caldo), C (freddo), F (ventilatore) o X
M
(spento)
P Profilo: D (giorno), N (notte), W (weekend) o X (nessuna)
Campo Scopo
S Setpoint della temperatura
C Intervallo del ciclo (isteresi, in gradi)
F F o C per la scala della temperatura
O Tempo di override
Modalit: A (automatica), H (caldo), C (freddo), F (ventilatore) o X
M
(spento)
P Profilo: D (giorno), N (notte), W (weekend) o X (nessuno)
Ci sono profili per il giorno, per la notte e per i fine settimana, che sono etichettati
rispettivamente D, N e W. Ruotando lencoder quando selezionata la schermata di
modifica dei profili, si selezionano in sequenza i tre profili. Ciascun profilo ha unora di
inizio e unora di fine. Nel caso del profilo del weekend (W), lora di inizio predefinita
venerd a mezzanotte e lora di fine la mezzanotte di domenica. Se lora di fine di un
profilo si sovrappone allora di inizio di un altro, lora di fine del profilo precedente prende
sempre la precedenza. I campi utilizzati nella schermata di modifica dei profili sono
elencati nella Tabella 12-3.
Tabella 12-3 - Le definizioni dei campi della schermata di modifica dei profili.
Campo Scopo
P Profilo: D, N, W
B Ora di inizio
E Ora di fine
S Setpoint della temperatura
C Intervallo del ciclo (isteresi)
Modalit: A (automatica), H (caldo), C (freddo), F (ventilatore) o X
M
(spento)
Per navigare tra le schermate e i campi necessario abituarsi un po, ma, utilizzando la
durata della pressione del pulsante dellencoder rotativo e una struttura ad albero, un
utente pi navigare nelle schermate e nei campi principali senza perdersi. La Figura 12-
16 mostra come rispondono le schermate e i campi a pressioni lunghe o corte. La
Figura 12-17 mostra tutte e quattro le schermate in ununica vista. Questa dovrebbe
aiutare a visualizzare con maggiore facilit come sono organizzate le schermate. Una
pressione lunga del pulsante definita come di 1 secondo o pi. Una pressione breve
del pulsante di 500 ms o meno. Per controllare la durata della pressione del pulsante,
il software utilizza un interrupt e un contatore.
Figura 12-16 - La schermata del termostato e la navigazione dei campi.
Figura 12-17 - Le quattro schermate utilizzate dal termostato.
Nel diagramma a blocchi della Figura 12-4, noterete che la linea comune proveniente dal
sistema HVAC esistente passa anche per uno dei rel. Questa una misura di
sicurezza. Se il termostato perde lalimentazione, il rel con la linea comune cade e
nessuna delle altre funzioni dellHVAC pu essere attivata. Tutte le linee di tensione di
controllo esterne dellHVAC, compreso il ritorno comune, sono collegate ai terminali C e
NO (comune e normalmente aperto) dei rel.
Il prototipo
Il prototipo per questo progetto formato da un Arduino Uno, una coppia di estensione
delle morsettiere e una shield LCD. Questi sono essenzialmente gli stessi componenti
che confezioneremo nella custodia pi tardi (la scheda Nano e la scheda Uno utilizzano
la stessa MCU ATmega328).
Sto riutilizzando lArduino integrato che abbiamo utilizzato nel Capitolo 11 per il
generatore di segnale, ma potrei anche aver utilizzato il Duinokit introdotto nel Capitolo
10. Io ho scelto di assegnare alla scheda unaltra missione perch sufficientemente
piccola da poter essere montata sulla parete accanto al termostato esistente durante i
test. Il prototipo mostrato nella Figura 12-18.
Il prototipo utilizza una serie di parti leggermente diversa, ma equivalente dal punto di
vista elettrico, rispetto allunit finale. La shield LCD la stessa che utilizzer lunit
finale, ma la scheda Arduino una Uno laddove lunit finale utilizzer una Nano. Nella
Figura 12-18 potete vedere lencoder rotativo, il modulo RTC e il sensore DHT22 sulla
piccola breadboard che non richiede saldature. Lelenco delle parti del prototipo
fornito nella Tabella 12-4.
Tabella 12-4 - Lelenco delle parti del prototipo del termostato.
Quantit Descrizione
1 Arduino Uno (o equivalente)
1 Shield display LCD 16 2
1 Modulo real-time clock DS1302
Serie di adattatori per i terminali a
1
vite
1 Modulo con quattro rel
Sensore di temperatura/umidit
1
DHT22
Modulo encoder rotativo KEYES
1
KY-040
Il sensore DHT22
Per rilevare la temperatura e lumidit, utilizzeremo il dispositivo DHT22, che lo stesso
dispositivo che abbiamo utilizzato con la GreenShield nel Capitolo 10. Nella versione
finale, collegheremo il sensore DHT22 a un Arduino Nano, con terminali a vite. Il pinout
del DHT22 mostrato nella Figura 12-19.
Lencoder rotativo
Il principale (e unico) input di controllo un modulo KEYES KY-040 (nel Capitolo 9
trovate maggiori informazioni sui moduli KEYES) con un encoder rotativo Bonatech,
simile a un Alps EC11. Il modulo mostrato nella Figura 12-20 e il pinout mostrato
nella Figura 12-21.
Il circuito del modulo encoder rotativo semplice, come mostra la Figura 12-22.
Lencoder contiene un interruttore interno che si attiva quando si preme lalbero e le tre
linee del segnale utilizzano resistenze pull-up da 10K. I pin etichettati CLK e DT
corrispondono ai segnali A e B (rispettivamente) che si trovano nella maggior parte degli
esempi software e delle descrizioni di encoder rotativi semplici.
La shield LCD
La shield LCD, che potete vedere nella Figura 12-18 e che descritta nel Capitolo 8,
una shield comune che si trova facilmente. Si tratta della parte che utilizza pi pin I/O
digitali della scheda Nano. In questa applicazione, la shield stata scelta perch
incorpora un potenziometro per il contrasto e un transistor per controllare la
retroilluminazione del display. Inoltre, si collega direttamente allArduino sottostante,
eliminando collegamenti come quelli che abbiamo utilizzato nel generatore di segnale nel
Capitolo 11.
Il software
Il software del termostato semplice e, come la maggior parte dei software integrati,
progettato per girare continuamente con un ciclo principale. A differenza di altri esempi
presentati fino a questo punto, per gestire lencoder rotativo il termostato utilizza
interrupt. Implementare un gestore di interrupt con un Arduino non particolarmente
difficile e per adesso gli interrupt sono il modo migliore di gestire gli eventi asincroni del
mondo reale.
Modulo Funzione
Thermostat.ino Modulo principale che contiene setup() e loop()
tstat.h Definizioni delle costanti (dichiarazioni #define)
tstat_ctrl.cpp Logica di controllo dellHVAC
tstat_ctrl.h File include
tstat_gv.cpp Variabili globali
tstat_gv.h File include
tstat_iface.cpp Elaborazione degli input di controllo
tstat_iface.h File include
tstat_lcd.cpp Funzioni LCD
tstat_lcd.h File include
tstat_util.cpp Funzioni utility
tstat_util.h File include
Quando lencoder non in uso, il display alternate tra le schermate 1 e 2, che mostrano
rispettivamente le condizioni attuali e lo stato operativo e data e ora. Quando lencoder
viene utilizzato, il flag input_active viene impostato su true e rimane true finch
lutente non ritorna nella schermata 1 premendo la manopola dellencoder per attivarne
linterruttore. Notate che il controllo del sistema ancora attivo mentre le schermate
degli input sono in uso.
I test
I test sono un procedimento di tre passaggi e questo paragrafo vale sia per il prototipo
che per lunit finale. Il primo passaggio implica limpostazione della data e dellora
nellRTC. Per farlo, basta passare alla schermata di configurazione di data e ora
utilizzando il pulsante dellencoder. Dopo essere tornati nel display principale, si devono
vedere lora e la data corrette. Il passaggio successivo consiste nellimpostazione della
temperatura desiderata, lintervallo di isteresi (il parametro C sul display) e la modalit
operativa. Io ho cominciato verificando che possa attivare manualmente il ventilatore del
sistema e poi ho inserito il setpoint della temperatura e ho impostato la modalit. Vi
conviene guardare il display e verificare che il sistema interrompa il riscaldamento o il
raffreddamento quando raggiunge una temperatura uguale al setpoint pi o meno met
dellintervallo del ciclo (isteresi).
Infine, possiamo passare in rassegna i vari profili e impostarne ciascuno nel modo che
consideriamo pi adatto per la nostra situazione. Ricordate che un conflitto tra lora di
fine di un profilo e quella dinizio di un altro si risolve rispettando lora di fine del profilo
precedente e non quella dinizio del successivo.
Vi conviene tenere docchio il funzionamento del termostato per un periodo di circa un
paio di settimane. Probabilmente richieder qualche perfezionamento, per stabilire le
ore e i setpoint ideali per ottenere il funzionamento pi efficiente. Se avete costruito una
GreenShield, potete utilizzarla per registrare la temperatura e lumidit e catturare i dati
delle prestazioni del termostato. Per interrogare la GreenShield a intervalli regolari e
raccogliere dati, un semplice script Python andr benissimo.
La versione finale
La versione finale del termostato diversa da quella del prototipo sotto alcuni aspetti
fisici, ma altrimenti identica in termini di funzioni e collegamenti del segnale. Le tre
differenze principali sono lutilizzo della scheda Nano, un semplice modulo LCD anzich
una shield LCD e una custodia dove montare il tutto. Lelenco delle parti della versione
finale del termostato fornito nella Tabella 12-7.
Tabella 12-7 - Lelenco delle parti della versione finale del termostato.
Quantit Descrizione
1 Arduino Nano (o equivalente)
Scheda di prototipazione con
1
terminali a vite
1 Modulo display LCD 16 2
1 Modulo con quattro rel
Sensore di temperatura/umidit
1
DHT22
1 Modulo encoder rotativo KEYES
KY-040
1 Modulo real-time clock
1 Custodia di plastica
Lassemblaggio
Lassemblaggio finale consiste principalmente in montare i componenti e inserire il tutto
nella custodia. Ma, prima, io ho apportato alcune modifiche alla custodia. Ho grattato via
le lettere dal coperchio superiore, ho rimosso le linguette di montaggio dai lati e ho
aperto dei fori per il display e per lencoder rotativo. Ho aperto dei fori anche sul fondo
della custodia, per montare le viti e la stufa esistente e i fili per controllare il
condizionatore. Poi, dopo aver fatto tutto questo, ho dipinto la custodia di un colore
neutro in sfumatura davorio.
Ho utilizzato una shield di prototipazione con terminali a vite per fissare la scheda Nano
e ho collegato i pin della Nano ai terminali e ai corretti pin header. La Figura 12-24
mostra la vista dallalto della shield di prototipazione della Nano, con la shield LCD,
lencoder rotativo e il modulo RTC. Il modulo RTC sar montato allinterno della
custodia.
Dal momento che ho scelto di tenere tutti i collegamenti sul lato superiore della shield di
prototipazione, il lato inferiore della shield non presenta altro che piazzole di saldatura.
Ho utilizzato il filo isolato a trefolo pi sottile che avevo a mia disposizione (28 AWG a 7
trefoli) senza dover ricorrere a filo per wire-wrap. Il filo solido da 30 AWG con
isolamento Kynar ideale per la costruzione wire-wrap, ma meno adatto nel nostro
caso.
Il grande vantaggio offerto dalla shield di prototipazione con terminali a vite la facilit
con i quali i fili da e altri componenti possono essere collegati ai terminali. Nel caso del
termostato, questo include il sensore DHT22, il modulo real-time clock, il modulo rel e
lencoder rotativo.
La Figura 12-25 mostra come si presentava la custodia dopo le modifiche. La shield
LCD shield e lencoder rotativo sono gi montati. Quello che non si vede il sensore
DHT22, che montato sulla parte esterna del fondo della custodia. Potete notare anche
che le viti del coperchio non sono installate.
Il piccolo foro in alto a sinistra nella finestra dellLCD un foro di accesso per il
potenziometro della shield LCD che serve a regolare il contrasto del display. Come
ultimissimo passaggio, procederemo a ritagliare un po il bordo della finestra dellLCD e
anche un coperchio di plastica trasparente pu essere una buona idea. S, sembra
scappato da un ambiente industriale, ma, come ho detto prima, il modo in cui si
presenta non ha conseguenza sul modo in cui funziona. La manopola dorata c (se
potete vedere limmagine a colori) perch era lunica manopola che avevo a
disposizione.
Il modulo con quattro rel si monta sul fondo della custodia. Il modulo RTC si monta su
un lato interiore della scatola. La Figura 11-25 mostra come sono organizzate le cose
nella custodia. I collegamenti esistenti dellHVAC sono collegati per mezzo di un foro di
accesso sul fondo della custodia. Notate che il foro spostato verticalmente rispetto al
centro, per lasciare spazio al modulo rel.
Tutto un po giusto, a dire il vero, ma ci sta. Sono necessari ancora diversi passaggi
prima di chiudere e rilassarsi:
1. Trovare le posizioni delle viti di montaggio sulla parete e fare i buchi.
2. Estrarre i fili di controllo esistenti dellHVAC attraverso il foro sul fondo e montare
la custodia sulla parete.
3. Collegare i fili dellHVAC al modulo rel.
4. Collegare lalimentazione e controllare il display.
5. Mettere il coperchio alla custodia.
Dando per scontato che il software sia gi caricato sulla scheda Nano, il termostato
adesso deve funzionare. Non ha un interruttore di accensione e quindi comincia a
funzionare non appena si collega lalimentatore. La retroilluminazione del display deve
rimanere attiva per 15 secondi dopo che si fornita lalimentazione e quindi potete
dover girare leggermente la manopola dellencoder se ha fatto timeout e si spenta.
Figura 12-26 - I componenti interni del termostato.
La custodia dotata di una guarnizione in gomma, che potete utilizzare se pensate che
sia necessario. Io lho utilizzata semplicemente perch consente una perfetta aderenza
del coperchio e offre un po pi di spazio allinterno per i componenti, ma non mi
preoccupa il fatto che la pioggia possa entrare nellunit.
I test e il funzionamento
Per eseguire i test, dobbiamo utilizzare lencoder per vedere tutte le schermate del
display e verificare che il rilevamento dellinterruttore lungo e corto funzioni
correttamente. Dovremo impostare di nuovo i parametri, dal momento che caricare il
software non carica la EEPROM, ma soltanto la memoria flash dei programmi. Se
lunit installata sembra funzionare correttamente, potete cominciare a configurarla per il
vostro particolare ambiente e in base alle vostre preferenze.
Vi suggerisco di cominciare con qualcosa di semplice, come per esempio limitarvi a
controllare il riscaldamento e il raffreddamento. Dopo che sarete soddisfatti del fatto
che lunit sta funzionando come dovrebbe, potete decidere di impostare i profili
giorno/notte e vedere come funzionano. Man mano che acquisite una maggiore
esperienza con lunit, potete incorporarvi le impostazioni di umidit e tempo del ciclo.
Perch funzioni nel modo ideale, un dispositivo come questo richiede una certa quantit
di regolazioni e quindi si integrer in modo efficace nel vostro ambiente.
Il secondo DHT22
Potete ricordare dalla Figura 12-4 che c un input per un secondo sensore DHT22. Io ho scelto di lasciarlo stare
per la prima iterazione di questa unit, in modo da potermi concentrare sulle funzionalit essenziali. Dal punto di
vista elettrico, incorporare linput di un secondo DHT22 semplice, ma introduce un nuovo livello di complessit
nel software. Il motivo che con una secondo sensore il termostato deve non soltanto monitorare lambiente
interno, ma adesso deve anche tener conto di quello esterno (cose come la differenza tra la temperatura interna
e quella esterna, la velocit di cambiamento in ogni determinato momento e la perdita o laumento di calore
stimato per via di pareti e finestre). Con un po di fatica e una buona programmazione, il termostato pu cercare
di equilibrare i vari fattori e arrivare al profilo di riscaldamento e raffreddamento ottimale. Pu suonare molto
interessante, ma non facile.
Come nel caso di tutti i software mostrati in questo libro, il codice sorgente del termostato disponibile su
GitHub (https://www.github.com/ardnut). Occasionalmente, pubblicher aggiornamenti del termostato e degli altri
progetti di esempio.
Prezzo Tot.
Quantit Articolo Fonte
unitario parz.
14,00
1 Arduino Nano SainSmart 14,00 $
$
Shield di prototipazione con 15,00
1 Adafruit 15,00 $
terminali a vite $
1 Modulo RTC DealeXtreme 2,00 $ 2,00 $
1 Modulo encoder rotativo Various 6,00 $ 6,00 $
10,00
1 Shield display LCD SainSmart 10,00 $
$
20,00
2 Sensori DHT22 Adafruit 10,00 $
$
1 Modulo con quattro rel SainSmart 7,00 $ 7,00 $
1 Custodia elettrica Home Depot 7,00 $ 7,00 $
a Il totale parziale il costo totale di ciascun articolo per una data quantit.
Prossimi passaggi
Questo progetto un esempio dei limiti che potete incontrare quando create dispositivi
complessi utilizzando soltanto shield e moduli gi pronti. Se dovessi creare la Versione 2
del termostato, costruirei una PCB personalizzata che contenga tutto su una sola
scheda. Come la GreenShield del Capitolo 10, sarebbe dotata di rel integrati e vi
includerei anche un alimentatore.
Questo design anche un ottimo candidato per un multiplexer I/O come il MPC23017
che abbiamo utilizzato nella PCB dello Switchinator nel Capitolo 10. Il display LCD pu
essere controllato con un MPC23017. Adafruit vende una versione della shield display
con un MPC23S17, che la versione SPI dellIC.
Inoltre, utilizzerei parti a montaggio superficiale per tutto eccetto forse per i rel, il
DHT22 e le morsettiere. Penso che la dimensione dei rel possa essere leggermente
ridotta, magari anche con parti a montaggio superficiale, dal momento che in realt non
devono gestire molta corrente sui contatti. Con un design attento e parti ben
selezionate, la dimensione dellintera PCB pu essere ridotta in modo significativo.
Alcune funzionalit desiderabili che semplicemente non ci stanno sul design attuale sono
uninterfaccia Bluetooth o WiFi, un lettore di schede flash microSD per registrare dati a
lungo termine e magari qualche ulteriore LED per il pannello anteriore. Cos com, il
termostato fatto con Arduino quasi un dispositivo IoT (Internet of Things), ma per
diventarlo del tutto richiede qualche modifica e qualche miglioramento. Di tutte le cose
pubblicizzate come dispositivi IoT, un termostato pu avere molto senso. Non sono
convinto che lasciare che la caffettiera o il forno a microonde parlino con il frigorifero sia
una buona idea.
Fonti
La Tabella 12-9 elenca i distributori e i rivenditori presso i quali io ho acquistato i
componenti del termostato. Come nel caso di tutti i progetti di esempio presentati in
questo libro, la maggior parte dei componenti si trovano presso varie fonti. Queste sono
semplicemente quelle che ho utilizzato quando ho effettuato i miei acquisti.
Tabella 12-9 - Le fonti delle parti.
Distributore URL
Adafruit www.adafruit.com
DealeXtreme (DX) www.dx.com
DFRobot www.dfrobot.com
SainSmart www.sainsmart.com
Ho trovato la custodia nel settore di elettricit del negozio Home Depot della mia zona,
ma potete trovare custodie elettriche simili presso qualsiasi ferramenta ben fornita.
13
Questo capitolo diverso dai tre capitoli precedenti. Invece di utilizzare un progetto di
esempio (o diversi progetti, nel caso del Capitolo 10) per illustrare come si applicano in
applicazioni reali i concetti, gli strumenti e i componenti descritti nei capitoli precedenti,
questo capitolo illustra come eseguire lo studio di un design. Non costruiremo niente di
concreto, ma definiremo alcuni approcci possibili, identificheremo gli strumenti e i
componenti pi adatti e valuteremo i compromessi di design. Questo tipo di attivit di
ingegneria pu essere applicato non soltanto ai modellini di lanciarazzi, ma a qualsiasi
progetto di design con Arduino che presenti un grado qualunque di complessit.
NOTA Ricordate che, dal momento che in questo libro lenfasi principale posta sullhardware e sui relativi moduli,
sensori e componenti di Arduino, il software mostrato qui serve esclusivamente a sottolineare i punti chiave e non a
presentare esempi pronti per luso. Il codice completo del software relativo a esempi e progetti si trova su GitHub
(https://www.github.com/ardnut).
Panoramica
Un lanciarazzi controllato da Arduino unapplicazione interessante per diverse ragioni.
Innanzitutto, molto estensibile e lo si pu portare fino al punto che si vuole (e si pu),
entro i limiti imposti dallhardware di Arduino. In secondo luogo, dal punto di vista fisico il
lanciarazzi pu essere qualsiasi cosa: da una piccola scatola di plastica con un
interruttore e un LED a una console con cifre digitali e uno o due interruttori. Terzo, il
lanciarazzi pu supportare una vasta gamma di funzioni, al di l semplicemente della
possibilit di applicare corrente a un accenditore. Pu essere collegato per mezzo di
WiFi o di Bluetooth, avere la possibilit di controllare laccenditore continuamente,
generare una voce sintetica che annunci il conto alla rovescia e lo stato del lancio, input
di sicurezza e perfino la capacit di scollegare lalimentazione da un razzo prima del
lancio per mantenere le batterie completamente cariche. Quanta (o quanta poca) fatica
volete fare dipende dai vostri obiettivi, dalle vostre capacit e dalla vostra disponibilit
economica.
Prima di arrivare alla fine di questo capitolo, dovete essere diventati capaci di prendere
decisioni coscienti su quale hardware acquistare, su quanto deve essere difficile il
software da scrivere e su come anticipare il livello di impegno che richieder un
determinato design. Utilizzando il materiale presentato nei capitoli precedenti, dovete
riuscire a creare un elenco di componenti e a farvi unidea di quanto coster il design e
di quanto sar difficile da costruire. Dovete essere anche in grado di creare un
diagramma a blocchi preliminare e un diagramma di flusso del software del vostro
design. Una volta fatto tutto questo, non rimarr che procurarvi i componenti,
assemblarli e quindi creare e caricare il software per farli funzionare.
SUGGERIMENTO Prima di mettervi a costruire qualcosa del genere, dovete assicurarvi di aver capito bene le
considerazioni sulla sicurezza che implicano oggetti come un lanciarazzi. La National Association of Rocketry (NAR) e
la Tripoli Rocketry Association hanno pubblicato delle linee guida per maneggiare e lanciare in modo sicuro i
lanciarazzi. Inoltre, in molti stati esistono delle regole di base che riguardano dove e quando si possono effettuare lanci
e che cosa definisce un lanciarazzi.
Alla fine di ciascun passaggio, ci fermeremo e analizzeremo quello che abbiamo fatto
fino a quel punto. Se ci fosse un problema, questo sarebbe il momento per decidere
come risolverlo. A seconda del tipo e della gravit del problema, possiamo decidere di
tornare indietro e rivedere il passaggio precedente, oppure possiamo decidere di
rinunciare a qualcosa che non sia essenziale e procedere riducendo le nostre
aspettative. Possiamo anche riscontrare dei problemi durante lo svolgimento di un
passaggio in particolare. Immaginiamo, per esempio, di aver scoperto che una
determinata shield, un sensore o un modulo semplicemente non si trovano e non
possiamo costruircelo da soli. In questo caso, dovremmo fermarci, tornare indietro e
vedere che cosa ci ha portato a quella decisione allinizio e se possiamo cambiarla per
adattarci alla situazione attuale.
In alcuni casi, pu non essere necessario costruire un vero prototipo. Questo spesso il
caso quando il design consiste principalmente di moduli gi pronti, come in molti design
basati su Arduino. A me piace costruire prototipi con piattaforme di prototipazione che
ho creato o acquistato, come il Duinokit e una breadboard che non richiede saldature
che abbiamo visto nel Capitolo 10, oppure lArduino integrato che abbiamo utilizzato nei
Capitoli 11 e 12. Questo mi permette di collegare le cose senza dover ricorrere a
saldare fili e aprire fori, ottenendo comunque le stesse funzionalit che presenterebbe
lunit finita. In alcuni progetti di design, potete accorgervi che potete saltare il
passaggio relativo alla prototipazione, ma dovete sapere che, se si presenta un
problema nel design finale, affrontarlo pu risultate costoso e richiedere molto tempo.
NOTA In una situazione reale, il costo che comporta risolvere un difetto del design oppure dellimplementazione, che
sia hardware o software, aumenta man mano che il progetto avanza lungo i passaggi mostrati nella Figura 13-1. In altre
parole, molto pi economico risolvere un requisito funzionale non valido che riscrivere un software difettoso oppure
affrontare un flusso di design dellhardware. Allo stesso modo, pi facile e meno costoso affrontare un problema in un
design che sta per entrare in produzione. Per questo i prototipi sono cos diffusi.
Gli obiettivi
Il primo passaggio per un design decidere quali obiettivi deve poter raggiungere.
Allinizio possiamo non disporre di tutti i dettagli, ma dobbiamo poter essere capaci di
deciderne le caratteristiche fondamentali, anche se al principio sono soltanto alcune.
Lelenco di obiettivi pu allungarsi nel corso del tempo, a volte radicalmente. In effetti,
mantenere gli obiettivi del design in linea con la realt spesso diventa una sfida,
specialmente quando chi definisce gli obiettivi non la stessa persona che dovr
costruire il design finale. Fortunatamente, questo non il nostro caso. Finch
manterremo il nostro entusiasmo e il nostro ottimismo in linea con la realt, staremo
andando bene.
Quando definite un elenco di obiettivi, vi consiglio di organizzarlo in base alla loro
importanza. In altre parole, dobbiamo mettere le caratteristiche imprescindibili allinizio
dellelenco e quelle che solo servono ad aggiungere dettagli alla fine. Questo ci
permetter di eliminare elementi dallelenco se il livello di fatica, costo o tempo dovesse
superare i limiti accettabili, senza perdere la funzionalit essenziale di quello che stiamo
cercando di costruire.
Ecco il mio elenco di obiettivi prioritari per un lanciarazzi automatico:
1. Il controller del lanciarazzi deve incorporare un timer per il conto alla rovescia con
intervalli programmabili (5, 10, 15, 30 e 60 secondi).
2. Il conto alla rovescia deve poter essere interrotto in qualsiasi momento per diversi
motivi (che spiegher tra poco).
3. Il controller del lanciarazzi deve essere dotato di un interruttore di interblocco di
sicurezza. Il lanciarazzi non inizier il conteggio n attiver gli accenditori a meno
che linterblocco di sicurezza non si trovi nella posizione on.
4. Il timer del contro alla rovescia deve essere attivato premendo un interruttore a
pressione.
5. Il timer del contro alla rovescia non deve attivarsi a meno che un interruttore di
sicurezza non venga sbloccato prima di premere il pulsante di avvio del conto alla
rovescia e durante lintera durata del conto. Questo pu essere un ciondolo
portatile o una piccola scatola e deve essere separato dallinterruttore che avvia il
conto.
6. Se linterruttore di sicurezza viene rilasciato prima del lancio, il conto alla rovescia
si deve interrompere e il controller deve entrare in una modalit di sicurezza (con i
circuiti dellaccenditore disattivati e messi a terra).
7. Il lanciarazzi deve essere in grado di alimentare diversi accenditori
contemporaneamente. Due il numero minimo, ma se possibile possono essere
fino a otto.
8. Ciascun accenditore deve poter essere monitorato indipendentemente da tutti gli
altri, per poter rilevare problemi di continuit dei circuiti prima del lancio.
9. Uninterruzione di continuit in uno qualsiasi degli accenditori deve interrompere il
lancio (la stessa risposta di quando si sblocca prima del tempo linterruttore di
sicurezza).
10. Il controller deve utilizzare un LED che lampeggia per tener traccia del conto alla
rovescia in secondi. Altri indicatori LED devono mostrare lo stato del controller
(caricato, conto alla rovescia in corso, interruzione di sicurezza o difetto degli
accenditori).
Gli obiettivi secondari sono questi:
1. Un display LED a 7 segmenti deve mostrare il conto alla rovescia.
2. Un display LED a 7 segmenti deve mostrare lora corrente.
3. Un LCD 16 2 deve mostrare i dati di stato del sistema e i messaggi di errore.
4. Tutti i componenti devono essere montati in un contenitore di basso profilo con un
coperchio inclinato.
E questi sono gli obiettivi facoltativi:
1. Il controller del lanciarazzi deve avere la capacit di attivare dispositivi esterni in
determinati momenti della sequenza del conto alla rovescia, come scollegare la
messa a terra, lanciare sirene di avvertimento e attivare componenti elettronici
integrati sulla scheda (fotocamera e cos via).
2. Il controller deve essere dotato di un connettore per collegare un display a 7
segmenti perch si possa mostrare un evento a un gruppo di persone.
3. Il controller deve incorporare la possibilit di generare una voce sintetica che
annunci il conto alla rovescia e lo stato.
4. Uninterfaccia Bluetooth deve poter essere utilizzata per collegarsi a un sistema
remoto di controllo delle condizioni meteorologiche (da utilizzarsi principalmente
per rilevare la velocit del vento nella zona del lancio). Se lo si utilizza, il sistema
deve anche potersi interrompere in caso di velocit del vento eccessiva e indicarlo
al direttore del lancio (lutente).
Questo un elenco piuttosto vasto e ambizioso, a dire la verit. Raggiungere gli obiettivi
principali non sembra troppo difficile, che quello che deve succedere con gli obiettivi
principali. Gli obiettivi secondari sono un pu pi complicati e quelli facoltativi, sebbene
siano intriganti, possono gravare sulla resistenza della costruzione (oltre a comportare
una spesa maggiore).
Potete notare che tra la Tabella 13-1 e la Tabella 13-2 emerge un pattern interessante.
Gli obiettivi principali sono tutti relativamente poco cari e facili da implementare. Inoltre,
con le eccezioni di 1.1 e 1.10, sono tutti necessari. Nella Tabella 13-2 vediamo che, man
mano che crescono la spesa e la difficolt, decresce la necessit. Nessuno degli
obiettivi facoltativi necessario, anche se tutti sarebbero molto divertenti da
implementare.
No ho organizzato gli obiettivi intenzionalmente quando li ho scritti, ma mi sono venuti in
questordine. Immagino che possa essere il risultato del fatto che faccio cose di questo
genere da diversi anni, ma in ogni caso a voi converr organizzare i vostri obiettivi
innanzitutto sulla base della necessit e poi sulla base di costo o difficolt, a seconda di
che cosa pi importante per voi: se il denaro o il tempo.
Si deve arrivare a un compromesso. Se qualcosa necessario ma anche caro,
dobbiamo eliminare qualcosa che non sia necessario per non elevare il costo del
progetto, oppure possiamo decidere di investire pi denaro per raggiungere entrambi gli
obiettivi? In alcuni casi, come quando ci tocca scegliere tra obiettivi principali e obiettivi
facoltativi, la decisione chiara. Il risultato finale pu non essere entusiasmante come
sarebbe stato altrimenti, ma nemmeno potremo andare in bancarotta per ottenerlo.
Lancer comunque bene i razzi. Quando invece dobbiamo scegliere tra due obiettivi
principali, con lo stesso livello di necessit e lo stesso costo, come gli obiettivi 1.1 e
1.10, la scelta pu dipendere da quanto sono difficili gli obiettivi. In questo caso,
probabilmente installare un interruttore rotativo per selezionare la durata del conto alla
rovescia sarebbe pi facile che aprire dei buchi per dei LED, collegarli e installarli e poi
creare il software necessario per controllarli.
Per amor di continuit con lanalisi del design, immaginiamo di voler mantenere tutti gli
obiettivi in modo da poter vedere come influenzeranno il design e la selezione dei
componenti nei prossimi passaggi. La Tabella 13-3 elenca i requisiti funzionali derivati
dagli obiettivi.
Tabella 13-3 - I requisiti funzionali del lanciarazzi.
Req Descrizione
Il controller del lanciarazzi deve incorporare un timer per il conto alla
1.1 rovescia. Quando questo arriva a zero, viene/vengono attivato/i l/gli
accenditore/i.
Il timer del conto alla rovescia deve avere tre durate programmabili di 5, 10,
1.1.1
15, 30 e 60 secondi.
Le durate del conto alla rovescia devono essere selezionate utilizzando un
1.1.2
interruttore rotativo da cinque posizioni.
Se la durata del conto alla rovescia viene cambiata a met strada, il conto
1.1.3
alla rovescia si deve interrompere.
Il conto alla rovescia deve poter essere interrotto in qualsiasi momento per
1.2
diverse ragioni (spiegate tra poco).
Il conto alla rovescia deve essere interrotto se un circuito di un accenditore
1.2.1
che dovrebbe essere chiuso aperto (vedere 1.7.1 e 1.9.1).
Il conto alla rovescia deve essere interrotto se la durata del conto cambia
1.2.2
mentre attivo il conto alla rovescia.
Il conto alla rovescia deve essere interrotto se linterruttore di sicurezza
1.2.3
viene rilasciato durante il conto.
Il controller del lanciarazzi deve essere dotato di un interruttore di interblocco
1.3
di sicurezza a inserimento.
Il lanciarazzi non deve attivare il conteggio o attivare gli accenditori a meno
1.3.1
che linterruttore di sicurezza non si trovi nella posizione on.
Il conto alla rovescia deve interrompersi se linterruttore di sicurezza
1.3.2
impostato su off durante il conto alla rovescia.
Il timer del conto alla rovescia deve essere attivato premendo un interruttore
1.4
a pressione.
1.4.1 Per attivare il conto alla rovescia si deve utilizzare un pulsante di lancio.
Il pulsante di lancio non deve poter funzionare a meno che linterruttore range
1.4.2
safety non sia attivato.
Il lanciarazzi deve utilizzare un interruttore range safety per controllare il
1.5
conto alla rovescia e il lancio.
Il conto alla rovescia del lancio non pu avanzare a meno che un interruttore
1.5.1 di sicurezza non venga disattivato prima della pressione del pulsante di
lancio.
Linterruttore range safety deve essere attivato manualmente durante lintera
1.5.2
durata del conto alla rovescia.
Linterruttore range safety pu essere un ciondolo portatile o una piccola
1.5.3
scatola e deve essere dotato di almeno 10 piedi (3 m) di cavo elettrico.
Se il conto alla rovescia viene interrotto per qualsiasi ragione, il lanciarazzi
1.6
deve entrare nella modalit di sicurezza.
Nella modalit di sicurezza, tutte le linee degli accenditori devono essere
1.6.1
disattivate e messe a terra.
Per uscire dalla modalit di sicurezza deve essere necessario disarmare il
1.6.2
lanciarazzi utilizzando linterruttore di sicurezza.
Il lanciarazzi deve essere in grado di attivare diversi accenditori
1.7
contemporaneamente.
1.7.1 Il lanciarazzi deve poter supportare fino a sei circuiti attivi degli accenditori.
Per selezionare il numero di circuiti attivi degli accenditori si deve utilizzare un
1.7.2
interruttore rotativo.
Ciascun accenditore deve poter essere monitorato indipendentemente dagli
1.8
altri per poter rilevare problemi di continuit dei circuiti prima del lancio.
Ciascun circuito degli accenditori deve avere continuit per permettere di
1.8.1
verificare che laccenditore sia collegato.
La corrente utilizzata per determinare la continuit non deve eccedere i 250
1.8.2
uA su ciascun circuito degli accenditori.
La mancanza di continuit di uno qualsiasi degli accenditori deve
1.9
interrompere il timer del conto alla rovescia.
Il conto alla rovescia non deve iniziare se uno qualsiasi dei circuiti degli
1.9.1
accenditori non ha continuit.
Il conto alla rovescia si deve interrompere se uno qualsiasi dei circuiti attivi
1.9.2
degli accenditori perde continuit durante il conto.
Il lanciarazzi deve utilizzare dei LED per indicare i circuiti attivi e pronti
1.9.3 (vedere 1.1.2).
Il controller deve utilizzare dei LED per indicare il conto alla rovescia e lo
1.10
stato.
Un LED lampeggiante deve tener traccia del conto alla rovescia in secondi,
1.10.1
un lampeggiamento al secondo.
Una serie di LED deve mostrare lo stato attivo e la continuit dei circuiti degli
1.10.2
accenditori.
1.10.3 Un LED deve indicare lo stato attivo dellinterruttore range safety.
1.10.4 Un LED deve indicare un range safety abort.
1.10.5 Un LED deve indicare lo stato dellinterblocco di sicurezza.
Un LED lampeggiante deve indicare quando il lanciarazzi si trova nella
1.10.6
modalit di sicurezza dopo uninterruzione.
2.1 Un display LED a 7 segmenti deve mostrare il conto alla rovescia.
Un display LED rosso da 2 cifre e a 7 segmenti deve mostrare il conto alla
2.1.1
rovescia.
Il conto alla rovescia deve mostrare dei trattini dopo che un lancio avvenuto
2.1.2
correttamente.
2.1.3 In caso di interruzione, il display deve mostrare la parola Abort.
2.2 Un display LED a 7 segmenti deve mostrare lora corrente.
Un display LED giallo da 4 cifre e a 7 segmenti con formato OO:MM deve
2.2.1
mostrare lora corrente.
Il display dellora deve poter essere configurato utilizzando un pulsante sul
2.2.2
pannello anteriore del lanciarazzi.
2.2.3 Il display dellora deve essere nel formato da 24 ore.
Un display LCD 16 2 deve mostrare i dati relativi allo stato del sistema e i
2.3
messaggi di errore.
2.3.1 Un display LCD 16 2 deve mostrare i messaggi di stato e i problemi.
Il display LCD deve anche poter mostrare messaggi provenienti da sorgenti
2.3.2
esterne come una stazione meteorologica remota.
Tutti i componenti devono essere montati in uno chassis di basso profilo con
2.4
coperchio inclinato.
Per contenere il lanciarazzi deve essere utilizzato uno chassis di metallo di
2.4.1
basso profilo.
Lo chassis deve essere almeno largo 14 pollici e profondo 10 pollici (35,5
2.4.2 25,5 cm), con unaltezza di 1,5 pollici nella parte anteriore e di 3 pollici in
quella posteriore (3,8 7,6 cm).
Ho cercato di mantenere una relazione uno-a-uno con gli obiettivi elencati in precedenza,
ma c qualche deviazione, principalmente per evitare la ridondanza.
SUGGERIMENTO Il design utilizza un interruttore range safety che deve essere tenuto premuto (attivo) durante il
conto alla rovescia. Questa una funzionalit di sicurezza essenziale. Nella pratica, devono essere coinvolte due
persone: un direttore del lancio e un addetto alla sicurezza. E a questultimo che tocca interrompere il lancio se
qualcosa non come dovrebbe essere prima dellaccensione (per esempio, c troppo vento o gente nella zona di
lancio).
La Figura 13-3 una versione pi raffinata del diagramma a blocchi. Notiamo che
utilizza un Uno per la sintesi vocale, un altro per il Bluetooth e un Mega2560 per le
funzioni di controllo principali. La MCU ATmega2560 utilizzata nel Mega2560 dotata di
diverse interfacce USART, per cui ciascuna delle schede Uno pu disporre del suo
proprio canale di comunicazione dedicato.
Figura 13-3 - Il diagramma a blocchi perfezionato del lanciarazzi.
Nella Figura 13-3, diverse delle interfacce per i moduli esterni sono state perfezionate e
assegnate come tipi I2C. Inoltre, sono state identificate le porte I/O digitali (DIO). Per
gestire i rel e i 12 LED di stato degli accenditori, stato scelto un expander I/O (simile
a quello che abbiamo utilizzato nello Switchinator nel Capitolo 10).
Costruire o acquistare
A un certo punto, quando ci si avventura in progetti moderatamente complessi, diventa necessario scendere a
compromessi per decidere se acquistare un modulo hardware gi pronto oppure progettarne e costruirne uno
tagliato su misura per i requisiti specifici del design. Questa decisione pu risultare difficile e non riguarda
soltanto i costi.
Un componente o un modulo COTS (commercial off-the-shelf) pu essere dotato o meno di tutte le funzionalit
delle quali abbiamo bisogno per il nostro design. Pu disporre delle funzioni corrette, ma dei connettori sbagliati,
o viceversa. Pu essere della dimensione sbagliata, oppure soltanto leggermente fuori misura su un lato o
sullaltro. Pu perfino richiedere una tensione diversa da quella di tutti gli altri componenti del design e richiedere
ulteriori circuiti per adattarlo.Quindi, ha senso adattare il design del componente COTS, oppure sarebbe meglio
costruire un componente personalizzato che sia esattamente quello di cui abbiamo bisogno? Se la modifica
richiesta dal modulo minima, probabilmente conviene semplicemente adattarlo, piuttosto che spendere tempo
e denaro per un design personalizzato. Se invece il problema pi serio, come le dimensioni fisiche o funzioni
non necessarie che produrranno conflitti, ha molto pi senso costruire il componente a partire da un design
pulito e mantenerlo coerente con il resto dei componenti.
Se non siete sicuri, di solito la decisione emerge valutando il costo e il tempo necessario per utilizzare il
componente COTS e confrontandoli con quelli necessari per costruire una parte personalizzata. Se continua a
essere difficile, per decidere per che cosa votare si possono utilizzare altri criteri: di quanto controllo abbiamo
realmente bisogno sulla produzione e sulle funzioni interne del componente in questione? Se stiamo costruendo
un prodotto commerciale e c la possibilit che il modulo COTS che vogliamo utilizzare venga abbandonato
mentre il nostro prodotto ancora in produzione, ci conviene decidere di costruircelo da soli. Analogamente, se
abbiamo bisogno di visibilit sul funzionamento interno del componente COTS ma per noi una scatola nera,
ci conviene decidere di costruirne una versione personalizzata.
Le funzionalit accessorie
In ingegneria, per descrivere funzionalit che in realt non contribuiscono al funzionamento di un sistema, ma
aggiungono soltanto un po di sale sul prodotto finale, spesso si utilizza lespressione inglese bells and
whistles. Un esempio pu essere un display TFT a colori su una macchina per il caff. Aiuta realmente il
dispositivo a fare il caff pi buono? No, naturalmente no. Si presenta elegante e high-tech in cucina? S, ed
per questo che l ed per questo saremmo disposti a pagare la macchina del caff un po di pi.
Considerate questo: le automobili moderne sono piene di accessori. Tutto quello che necessario in una
macchina in realt sono soltanto quattro ruote, un motore, qualche sedile e delle finestre per proteggere i
passeggeri da pioggia, vento e polvere. In realt, nessuno ha bisogno di un sound system da 10 altoparlanti, di
un telefono cellulare in vivavoce, di un sistema di navigazione e di sedili elettrici da varie posizioni soltanto per
andare a fare la spesa, giusto? Unautomobile essenziale senza tutti questi accessori pu essere brutta da
vedere, ma vi porter lo stesso dove volete o dove dovete andare. Inoltre, questa automobile semplice e brutta
probabilmente star ancora funzionando mentre laltra piena di accessori passer il suo tempo presso la
concessionaria nel reparto dedicato alle riparazioni.
La conclusione che le cose pi semplici non soltanto sono meno care, ma tendono anche a essere pi
affidabili, perch contengono meno componenti che si possono rompere. Quindi, quando rivediamo la fattibilit di
un design, importante prestare attenzione a ben pi che soltanto alla sua fattibilit tecnica. Dobbiamo
controllare anche gli accessori che in realt non contribuiscono al funzionamento del dispositivo, ma possono
contribuire al fatto che smetta presto di funzionare.
Io ho scelto di lasciare i rel per il controllo del lancio collegati ai pin I/O digitali discreti
della Mega2560, anzich guidarli per lexpander I/O. In questo modo, non c niente tra i
rel del lancio e lArduino che li controlla. Probabilmente non far una grande differenza,
ma elimina una potenziale fonte di guasto dalla pista di controllo principale del
lanciarazzi.
Lo stesso ragionamento il motivo per il quale lavvio del conto, linterruttore range
safety e quello per armare il sistema sono collegati direttamente allArduino. Inoltre,
collegando gli interruttori direttamente potremmo approfittare della capacit di interrupt
dei pin della MCU AVR, se volessimo.
Il diagramma mostrato nella Figura 13-4 quello che utilizzeremo per procedere. A un
certo punto del futuro, potrebbe diventare fattibile provare la Fase II, ma per il momento
no. Rimarr l, in attesa del momento nel quale potr tradursi in realt.
Quantit Descrizione
1 Arduino Mega2560
Display LED a 7 segmenti e 2
1
cifre
1 Shield con terminali a vite Mega
Display LED a 7 segmenti da 4
1
cifre per lora
1 Shield display LCD
1 Interruttore Keyed
1 Modulo RTC (Real-time clock)
1 Grande interruttore a pressione
2 Moduli con quattro rel
Chassis di metallo con coperchio
1
inclinato
Il prototipo
Come abbiamo visto prima, un prototipo serve per diversi scopi importanti. Prima di
tutto, permette di lavorare con il design e con i suoi componenti in una forma flessibile e
facile da modificare. Se un modulo o un sensore non funziona come pensavamo che
funzionasse, nel prototipo molto pi facile cambiarlo di quanto non sarebbe aprire
ulteriori fori in uno chassis di metallo. Secondo, nel caso di design che richiedono una
PCB personalizzata (o due o tre), ci sar un lasso di tempo tra il momento in cui si invia
il progetto della PCB e quello in qui arrivano le schede finite e si pu iniziare il
montaggio. Se stiamo costruendo un prototipo, questo lasso di tempo pu essere
sfruttato lavorando sul software o sulla documentazione, oppure su entrambi. Infine, in
alcuni casi possiamo avere a disposizione gi tutto quello che ci serve per il prototipo e
portarlo al punto nel quale pu servire come sostituto del prodotto finale relativamente
semplice. La Figura 13-5 mostra un semplice prototipo con un Arduino Mega2560
costruito a partire da alcune sezioni tagliate da una tavola di pino.
Figura 13-5 - Il prototipo della Mega2560.
Un tipico accenditore per modellini di razzi richiede circa 0,5 A o pi per laccensione.
Per determinare se il circuito dellaccenditore aperto o chiuso misurando la tensione
nel punto etichettato come sense, possiamo utilizzare un circuito come quello mostrato
nella Figura 13-7. La questione principale rilevare lo stato aperto o chiuso
dellaccenditore senza applicare abbastanza corrente da causarne laccensione. Con
questo circuito, nellaccenditore scorrono soltanto circa 2 mA e il diodo Zener da 4,9 V
impedisce alla tensione per il lancio completo di tornare negli input analogici di Arduino.
NOTA Sono stati ideati altri circuiti di controllo della continuit degli accenditori, alcuni pi complessi di altri (sembra
che esista una serie di piccole attivit domestiche che si dedicano a creare controller di lanciarazzi e circuiti per testare
la continuit dei modellini di razzi). Se volete saperne di pi, una fonte di informazioni lo studio dettagliato di tecniche
di test di continuit degli accenditori (http://bit.ly/brohm-igniter) di J. R. Brohm.
Nello schema mostrato nella Figura 13-6, sei circuiti di continuit sono collegati a sei
input analogici della Mega2560 con etichetta Igniter Continuity Sense. Per questo, vi
suggerisco che i sei circuiti identici siano costruiti utilizzando una scheda di
prototipazione e alcune morsettiere da 0,1 pollici (2,54 mm), analogamente a quello che
abbiamo fatto per la protezione degli input nel Capitolo 11. Per collegare gli accenditori
al controller del lanciarazzi possiamo utilizzare alcuni morsetti come quelli del tipo che si
utilizza per collegare gli altoparlanti agli stereo di alta gamma. Vi suggerisco anche di
utilizzare questi morsetti per collegare una batteria esterna. Se volete aggiungere delle
batterie nello chassis del controller del lanciarazzi, potete utilizzare unulteriore coppia di
morsetti per collegare le batterie interne ai circuiti dellaccenditore. Questo vi
permetter di scegliere quale sorgente di alimentazione utilizzare, a seconda del numero
di circuiti degli accenditori che saranno attivi. Nella Figura 13-8 mostrato come si
collegano i circuiti per controllare la continuit degli accenditori con i morsetti degli
accenditori.
Lidea che sta dietro ai 12 LED collegati allexpander I/O ed etichettati come Igniter
Continuity Indicators e Igniter Select Indicators nella Figura 13-6 mostrare quanti
circuiti degli accenditori sono attivi e in quale stato si trovano in un dato momento.
Questo determinato dallinterruttore rotativo da sei posizioni S6, con le impostazioni 1,
2, 3, 4, 5 e 6. Il LED di continuit corrispondenti si illumineranno per indicare che gli
accenditori selezionati sono collegati e pronti. Dopo il lancio, i LED di continuit devono
essere spenti e devono rimanere accesi soltanto i LED della selezione attiva.
La Figura 13-9 mostra una vista diversa del collegamento, con unenfasi sugli output
dellaccenditore, i moduli a scheda perforata per i circuiti dei LED e pull-up e
lalimentazione DC che collega i vari moduli. Notate che le singole linee di segnale per
I2C, SPI e le funzioni DIO e AIN non sono mostrate. Invece, la notazione dei bus, che
consiste di una barra con un numero, utilizzata per indicare quanti segnali discreti sono
chiamati in causa. Negli schemi non sono mostrate neanche cose come le morsettiere
per lalimentazione e la messa a terra.
Figura 13-9 - Diagramma di collegamento dello chassis.
Un punto interessante nella Figura 13-9 luso di uno dei rel sul secondo modulo rel
come interruttore di sicurezza per laccensione. A meno che il rel non sia attivo, gli
accenditori non ricevono alimentazione. Notate anche che ci sono quattro moduli a
scheda perforata utilizzati per fissare i circuiti di rilevamento della continuit degli
accenditori e resistenze pull-up per vari LED e interruttori. Lutilizzo delle morsettiere
pitch da 0,1 pollici (2,54 mm) rende i cablaggi del sistema molto pi facili delle saldature
e inoltre questi, se necessario, in futuro possono essere rimossi e sostituiti.
Con gli schemi sotto mano, adesso possiamo creare un elenco dettagliato di
componenti come quello della Tabella 13-5.
Tabella 13-5 - Lelenco di parti del lanciarazzi finale.
Quantit Descrizione
1 Arduino Mega2560
1 Grande interruttore a pressione
1 Shield Mega con terminali a vite
8 Morsetti rossi
8 Morsetti neri
1 Shield display LCD
1 Modulo RTC (Real-time clock)
1 Jack da 3,5 mm (circuito singolo)
2 Moduli da quattro rel
1 Supporto per le batterie, sei celle D
1 Display LED a 7 segmenti da 2 cifre
1 Chassis di metallo con coperchio inclinato
Display LED a 7 segmenti da 4 cifre per
1
lora
1 Interruttore Keyed
Non uno chassis allultimo grido, assolutamente. soltanto una cosa che avevo a
portata di mano. Voi potete disporre di qualcosa di altrettanto adatto, oppure potete
aver accesso a un outlet di surplus di componenti elettronici. Se questo il vostro caso,
potete acquistare uno chassis carino e simile a questo presso diversi distributori. Potete
aspettarvi di pagarlo tra i 30 $ e i 50 $.
Dopo aver scelto la custodia, il prossimo passaggio decidere il layout del pannello
anteriore e dove posizionare le schede e i connettori. Con uno chassis come quello
mostrato nella Figura 13-10, vi consiglio di montare il pi possibile allinterno del pannello
superiore. Il motivo principale evitare di far correre fili tra le schede e i controlli nel
pannello superiore. Dal momento che la parte posteriore dello chassis non altro che la
continuazione di quello superiore, non dovete preoccuparvi di scollegare le cose se
dovete rimuovere il pannello superiore per prendere qualcosa al suo interno.
La Figura 13-11 mostra un layout per il pannello. Questo soltanto un modo di farlo e
potete optare per unorganizzazione diversa. La shield despansione I/O ha moltissimi
punti I/O (64 in tutto) e quindi rimane disponibile moltissimo spazio per crescere.
Figura 13-11 - Un esempio di layout del pannello dei controlli del lanciarazzi.
Il software
Nel caso di uno studio di design come questo, per lo pi il software soltanto qualche
suggerimento e qualche diagramma a blocchi. Lo scopo principale determinare il livello
complessivo di sforzo in relazione al numero di funzioni supportate dal software. Se
progettato e implementato rispettando i requisiti funzionali, dobbiamo poter mappare la
funzionalit del software direttamente sui requisiti. Inoltre, non dovremmo avere
funzionalit che non sono definite nei requisiti. Nellindustria, specialmente quella
aerospaziale, questo considerato un male, dal momento che la funzionalit del
software senza un requisito previo una funzionalit che non potr essere
completamente testata, se mai potr esserlo del tutto. E il software non testato
rischioso.
Dal momento che questo un tipico design di tipo Arduino, le funzioni setup() e loop()
risiederanno in un modulo principale. Avremo bisogno anche di una selezione di variabili
globali che contengano i vari dati di stato e ora. La funzione loop() dovr eseguire una
serie di operazioni continue, come monitorare gli interruttori per armare il sistema e
azionare il lancio, accendere e spegnere i LED quando necessario e gestire il conto alla
rovescia monitorando linterruttore range safety durante il conto. La Figura 13-12 mostra
le azioni di cui si occupa il ciclo principale.
Figura 13-12 - Le operazioni del ciclo principale.
Nel punto 1 del diagramma, il ciclo comincia a leggere gli interruttori rotativi (select
dellaccenditore e select dellora del conto). Se lora del conto cambiata rispetto
allultima volta in cui stato letto linterruttore e il conto attivo (cio, si sta preparando
un lancio), il lanciarazzi interromper il conto, disarmer il sistema ed entrer nello stato
abort.
Nel punto 2, il software controlla linterruttore che arma il lanciarazzi. Se nelliterazione
precedente del ciclo era spento, ma adesso acceso, viene impostato il flag arm del
sistema e viene attivato il rel che alimenta il lancio (vedere Figura 13-9). Se questo flag
true, controlliamo se in corso un conto. In caso affermativo, non leggiamo
linterruttore di avvio del lancio (punto 3). Altrimenti, controlliamo se lutente ha premuto il
pulsante di lancio. Se cos, impostiamo lo stato del lancio su true (on) e facciamo
partire il contro.
Quello che contenuto nel lato destro della Figura 13-12 attivo soltanto se il sistema
si trova nello stato di lancio ed in corso un conto. Nel punto 4, avviene un controllo per
verificare che linterruttore range safety non sia premuto (on). Se no, interrompiamo il
sistema e lo passiamo nella modalit di sicurezza.
Il punto 5 dove avviene lazione vera e propria. Quando il conto arriva a zero, vengono
attivati i rel del lancio che corrispondono ai circuiti di accensione selezionati. I rel sono
mantenuti in uno stato on per 2 secondi e poi rilasciati. Probabilmente questo non il
modo migliore di fare questo. Sarebbe meglio controllare lo stato degli accenditori e
disattivare i rel una volta che sono aperti tutti gli accenditori. Il ritardo di tempo
sarebbe un tempo massimo permesso prima di dichiarare un guasto.
Nel punto 6, il lancio avvenuto correttamente oppure il razzo ancora (si spera) al suo
posto. In ogni caso, il sistema viene riportato in uno stato di standby, i rel vengono
spenti e il rel principale viene disattivato. Vi suggerirei anche di disarmare il sistema, in
modo che lutente possa disattivare linterruttore e riattivarlo di nuovo per tornare ad
armare il lanciarazzi.
La lettura degli input degli interruttori, limpostazione degli stati dei LED, la lettura
dellRTC e il controllo dei rel possono avvenire molto rapidamente. In questo design,
non sembra che siano necessari interrupt. Detto questo, potete decidere di aggiungerne
uno per linterruttore range safety. Ecco perch stato collegato direttamente alla
Mega2560 anzich per mezzo dellexpander I/O.
Linterruttore range safety pu essere utilizzato per azionare un interrupt che disattivi il
rel di alimentazione degli accenditori (rel 3, modulo rel 2) nel momento in cui viene
rilasciato linterruttore. Quindi, anche se la MCU impiega poche decine di millisecondi a
leggere lo stato dellinterruttore e risponde passando il sistema in uno stato di blocco,
agli accenditori dei motori dei razzi lalimentazione sar gi stata tagliata.
LLCD pu essere utilizzato per mostrare messaggi durante il ciclo. Sarebbe ideale
vedere lo stato della corrente e ricevere dei messaggi se si produce un guasto. Non
sarebbe particolarmente utile ripetere lora o il conto con lLCD. Questo non farebbe che
aggiungere latenza (cio, un ritardo nellesecuzione) nel ciclo principale.
Quando scriviamo il software, la nostra guida principale devono essere i requisiti
funzionali. Queste sono cose che il software deve supportare per poter soddisfare i
requisiti e di conseguenza raggiungere gli obiettivi del progetto. Se volete vedere degli
esempi di modi per organizzare il software in moduli, potete rileggere i Capitoli 10, 11 e
12.
Nella Figura 13-12, possiamo vedere che ci sono diverse possibilit per ulteriori moduli.
Lo stato e laggiornamento degli accenditori una, cos come laggiornamento della
visualizzazione dellRTC e dellora. La sezione del ciclo dedicata al lancio (tutto quello
che compreso tra il punto 4 e il punto 6) un altro possibile candidato per un modulo
a s stante. Il modulo RTC, lLCD, i display LED e lexpander I/O molto probabilmente
avranno classi definite, ma per le funzioni del ciclo principale pu non essere
particolarmente necessario utilizzare classi. Non sono complesse, davvero
Dal momento che questa unanalisi del design e non un design completo, lascer il
software qui. Se volete proseguire e creare il vostro lanciarazzi, vi consiglio di guardare
gli esempi forniti dai tre capitoli precedenti. Con questa analisi del design come punto di
partenza, non dovreste avere molte difficolt a lavorare sui dettagli rimanenti.
Non possiamo realmente definire una stima dei tempi perch non abbiamo modo di
sapere chi scriver il software. Persone diverse lavorano a ritmi diversi: quello che per
una persona richiede unora per essere scritto in forma di codice, per unaltra persona
pu richiedere mezza giornata. Quindi, per farvi unidea di quanta fatica pu richiedere il
software, vi consiglio di provare a scrivere un po di codice di prova con una breadboard
o un prototipo non dedicato (come abbiamo visto nei capitoli precedenti) per fare
qualcosa con lRTC o lLCD. Una volta che vi siete fatti unidea generale di quanto tempo
richiede, potete moltiplicarlo per il numero di funzioni uniche contenute nel design del
software e poi moltiplicare quel numero per due. Il risultato dovrebbe avvicinarsi alla
quantit di tempo del quale avrete bisogno e, se riuscite a completare il software prima,
tanto meglio.
I test e il funzionamento
Una pianificazione dei test sempre una buona idea. Fortunatamente, il lanciarazzi
relativamente facile da testare, dal momento che fondamentalmente soltanto input di
interruttori e output di rel. Potete simulare la continuit degli accenditori semplicemente
collegando un jumper tra le coppie di morsetti degli output degli accenditori e un circuito
aperto semplicemente la mancanza di un jumper.
Se esaminate i requisiti funzionali, potete vedere che sono tutti verificabili. In altre
parole, se ruotate la manopola di selezione dei circuiti degli accenditori dovete vedere i
LED attivi accendersi in sequenza dall1 al 6. Se i morsetti sono collegati per simulare gli
accenditori, deve essere accesa anche la luce ICC GO. Armate il sistema e poi
premete e tenere premuto linterruttore range safety e vedrete accendersi la luce
Safety GO. Se avviate il conto e poi scollegate uno qualsiasi degli accenditori attivi,
cambiate il numero dei circuiti degli accenditori oppure la durata del conto quando in
corso, oppure se rilasciate linterruttore range safety, il sistema deve fermare il conto ed
entrare nello stato di blocco.
Fate attenzione a non lasciare che il conto arrivi a zero, se state utilizzando jumper sui
morsetti per simulare gli accenditori. Quando i rel si chiudono, tutta la corrente della
batteria scorrer attraverso i jumper. Questo pu far sciogliere i ponticelli o danneggiare
i rel, oppure entrambe le cose. Un miglior approccio per eseguire i test pu essere
utilizzare fusibili che si possono sostituire o addirittura accenditori veri e propri montati
su una base di legno. Potete ance riuscire a utilizzare piccole lampadine a
incandescenza con una tensione corretta, ammesso che siano dotate di una resistenza
bassa fredda (non illuminate). Un tipico accenditore circa 0,5 ohm.