Per i principianti Arduino è un punto di partenza ideale che non richiede una profonda preparazione tecnica. Ma se siete ingegneri oppure maker che intendono utilizzare Arduino per prototipare il vostro innovativo prodotto hardware, dovete sapere con precisione come e perché funziona. Questo manuale tecnico descrive i dettagli di funzionamento interno ed esterno di questa piattaforma di prototipazione elettronica open source. Qui troverete informazioni sui microcontroller AVR, sulle librerie di Arduino, sulle shield, sui moduli e su altri componenti. I capitoli finali sono dedicati a progetti reali e avanzati che mettono in luce idee specifiche che potete utilizzare in altre applicazioni, fra i quali, oltre alle molte possibilità descritte su come personalizzare i componenti, troviamo un generatore di segnale programmabile e il design di un termostato intelligente.
J. M. Hughes è un ingegnere di sistemi integrati con più di 30 anni di esperienza in elettronica, sistemi aerospaziali e programmazione di applicazioni scientifiche. È stato il responsabile del surface imaging software sul Phoenix Mars Lander e ha fatto parte del team che ha sviluppato un innovativo interferometro laser eterodino per calibrare il controllo della posizione degli specchi sul telescopio spaziale James Webb.
Arduino per tecnici, ingegneri e maker
J. M. Hughes
Arduino per tecnici, ingegneri e maker Titolo originale: Arduino: A Technical Reference di J. M. Hughes
Authorized Italian translation of the English edition © John Hughes This translation is published and sold by permission of O’Reilly Media, Inc., the owner of all rights to publish and sell the same. Copyright per l’edizione italiana: © 2016 Tecniche Nuove S.p.A., via Eritrea 21, 20157 Milano Redazione: tel. 0239090258 e-mail:
[email protected] Vendite: tel. 0239090440, fax 0239090335 e-mail:
[email protected] http://www.tecnichenuove.com
ISBN: ISBN (PDF): ISBN (E-PUB):
978-88-481-3178-0 978-88-481-3179-7 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 dell’editore All rights reserved. No part of this book shall be reproduced, stored in a retrieval system, or transmitted, by any means, electronic, mechanical photocopying, recording or otherwise without written permission from the publisher
Traduzione: Barbara Sansone Questo libro è disponibile e acquistabile in versione digitale su www.tecnichenuove.com.
Sommario
Prefazione Capitolo 1 - La famiglia di Arduino Una breve storia Tipi di dispositivi Arduino Gallerie di Arduino I dispositivi compatibili con Arduino I dispositivi compatibili con l’hardware I dispositivi compatibili con il software Le convenzioni per la nomenclatura di Arduino Che cosa posso fare con Arduino? Per maggiori informazioni
Capitolo 2 - Il microcontroller AVR La storia L’architettura interna La memoria interna Le funzioni periferiche I registri di controllo Le porte I/O digitali I timer/contatori da 8 bit I timer/contatori da 16 bit Il prescaler del timer/contatore Il comparatore analogico Il convertitore analogico-digitale Gli I/O seriali L’USART La SPI La TWI Gli interrupt Caratteristiche elettriche Per ulteriori informazioni
Capitolo 3 - I microcontroller AVR specifici per Arduino L’ATmega168/328 La memoria Le caratteristiche I package (contenitori) Le porte Le funzioni dei pin Gli input del comparatore analogico Gli input analogici Le interfacce seriali Gli I/O del timer/clock Gli interrupt esterni Le assegnazioni dei pin di Arduino
Le caratteristiche elettriche fondamentali L’ATmega1280/ATmega2560 La memoria Le caratteristiche I package Le porte Le funzioni dei pin Gli input del comparatore analogico Gli input analogici Le interfacce seriali Gli I/O del timer/clock Gli interrupt esterni Le assegnazioni dei pin di Arduino Le caratteristiche elettriche L’ATmega32U4 La memoria Le caratteristiche I package Le porte Le funzioni dei pin Gli input del comparatore analogico Gli input analogici Le interfacce seriali Gli I/O del timer/clock Gli interrupt esterni L’interfaccia USB 2.0 Le caratteristiche elettriche Le assegnazioni dei pin di Arduino I fuse bit Per ulteriori informazioni
Capitolo 4 - I dettagli tecnici di Arduino Caratteristiche e funzionalità di Arduino Le interfacce USB di Arduino Le dimensioni fisiche di Arduino I tipi di PCB Arduino di base I tipi di PCB Arduino con fattore di forma Mega I tipi di PCB Arduino con fattore di forma piccolo I tipi di PCB per scopi speciali Le configurazioni del pinout di Arduino Il layout dei pin dell’Arduino di base Il layout dei pin esteso di base Il layout dei pin sulla serie Mega I layout non standard Per ulteriori informazioni
Capitolo 5 - Programmare Arduino e i microcontroller AVR Il cross-compiling dei microcontroller I bootloader L’ambiente IDE di Arduino Installare l’IDE di Arduino Configurare l’IDE di Arduino Eseguire il cross-compiling con l’IDE di Arduino L’immagine eseguibile di Arduino Il processo di creazione del software di Arduino Le schede degli sketch L’architettura software di Arduino Il supporto del runtime: la funzione main() Uno sketch di esempio
Le costanti Le variabili globali Le librerie Utilizzare le librerie negli sketch Aggiungere una libreria nell’IDE di Arduino Creare librerie personalizzate Il codice sorgente di Arduino
Capitolo 6 - La vita senza l’IDE di Arduino Le alternative all’IDE PlatformIO Ino La toolchain di AVR Installare la toolchain make avr-gcc binutils avr-libc Costruire programmi C o C++ a partire da zero Compilare con avr-gcc o avr-g++ Diversi file sorgente e make Il linguaggio assembly di AVR Il modello di programmazione AVR Creare programmi in linguaggio assembly per AVR Le fonti del linguaggio assembly per AVR Caricare codice eseguibile sull’AVR La programmazione in-system Programmare con il bootloader Caricare senza il bootloader JTAG AVRDUDE Utilizzare un Arduino come un ISP L’azione del bootloader Sostituire il bootloader Riepilogo
Capitolo 7 - Le librerie di Arduino I componenti delle librerie Altre librerie
Capitolo 8 - Le shield Le caratteristiche elettriche delle shield Le caratteristiche fisiche delle shield Montare diverse shield una sopra l’altra Shield Arduino comuni Input/Output Shield di estensione I/O Shield d’espansione I/O Relè shield Shield che trasportano il segnale Memoria Comunicazione I/O seriale e MIDI Ethernet Bluetooth USB ZigBee CAN Prototipazione
Creare una shield di prototipazione personalizzata Controllo del movimento Controllo di motori DC e passo-passo Controllo di PWM e servomotori Display Shield per la strumentazione Shield adattatori Shield varie Shield di Arduino non comuni Fonti
Capitolo 9 - Moduli e componenti I/O I moduli I fattori di forma fisici Le interfacce Dove trovare i moduli Le descrizioni dei moduli I moduli TinkerKit I moduli Grove Descrizioni di sensori e moduli I sensori I sensori di temperatura, umidità e pressione I sensori di inclinazione I sensori audio I sensori di luminosità I sensori magnetici I sensori di vibrazioni e shock I sensori di movimento I sensori a contatto e di posizione I sensori di distanza Le comunicazioni I moduli wireless APC220 I moduli RF 315/433 MHz La ricetrasmittente ESP8266 Dispositivi e componenti di output Le fonti di luce I relè, i motori e i servo Gli output dei segnali analogici L’input dell’utente I tastierini I joystick I potenziometri e gli encoder rotativi L’output dell’utente I display di testo I display grafici Funzioni di supporto I clock I timer Le connessioni Lavorare con ponticelli nudi I sistemi di connessione dei moduli Costruire connettori personalizzati Scegliere un metodo di connessione Fonti Riepilogo
Capitolo 10 - Creare componenti personalizzati Per cominciare Le shield personalizzate
Considerazioni fisiche Montare le shield una sopra l’altra Considerazioni elettriche La shield personalizzata GreenShield Obiettivi La definizione e la pianificazione Il design Il collaudo finale Il funzionamento Prossimi passaggi Design personalizzati compatibili con Arduino Programmare un design personalizzato Lo Switchinator La definizione e la pianificazione Il design Il prototipo Il software La produzione Il collaudo Prossimi passaggi Fonti
Capitolo 11 - Progetto: un generatore di segnale programmabile Gli obiettivi del progetto La definizione e la pianificazione Il design Le funzionalità La custodia Lo schema Il prototipo Gli input dei controlli e le modalità La visualizzazione dell’output Il modulo DDS Il software L’organizzazione del codice sorgente La descrizione del software La libreria DDS I test L’assemblaggio finale Le resistenze pull-up La protezione degli input I componenti dello chassis L’alimentazione I test finali e la chiusura Ridurre il costo Il costo nel dettaglio Fonti
Capitolo 12 - Progetto: un termostato intelligente Gli antefatti Panoramica dei sistemi HVAC Concetti fondamentali del controllo della temperatura Il controllo intelligente della temperatura Gli obiettivi del progetto La definizione e la pianificazione Il design Le funzionalità La custodia Lo schema
Il software Gli input/output dell’utente L’output dei controlli Il prototipo Il sensore DHT22 L’encoder rotativo Il modulo real-time clock La shield LCD Il software L’organizzazione del codice sorgente La descrizione del software I test La versione finale L’assemblaggio I test e il funzionamento Il costo nel dettaglio Prossimi passaggi Fonti
Capitolo 13 - Il modellino di lanciarazzi: lo studio di un design Panoramica Il ciclo del design Gli obiettivi Selezionare e definire i requisiti funzionali Creare il design preliminare La fattibilità del design L’elenco preliminare dei componenti Il prototipo Il design finale Gli aspetti elettrici Gli aspetti fisici Il software I test e il funzionamento Analisi dei costi
Prefazione
Quando fu introdotto nel 2005, Arduino diventò immediatamente uno dei progetti di hardware open source più di successo del mondo (alcuni direbbero quello più di successo). Schede dal design aperto rilasciate dal team di Arduino cominciarono a essere prodotte in vari paesi del mondo, come Italia, Brasile, Cina, Paesi Bassi, India e Stati Uniti. È possibile acquistare una scheda compatibile con Arduino pienamente funzionante per circa 15 € e l’ambiente di sviluppo di Arduino è disponibile per essere scaricato immediatamente e del tutto gratuitamente. Arduino, che all’inizio si basava sulla famiglia di microcontroller AVR da 8 bit (l’AVR di per sé è un dispositivo interessante con una storia altrettanto interessante), si è poi spostato nel regno dei 32 bit, con l’aggiunta del modello Due con processore ARM, del Yún con un modulo sulla scheda che utilizza la versione OpenWrt di Linux e con l’imminente modello Zero. Le schede Arduino possono essere utilizzate per molti scopi diversi, dall’interattività 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 dall’inizio degli anni ’80: ho cominciato con il 6502, il 6800 e l’8051 e poi sono passato all’8086, allo Z80, l’80186 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. Nient’altro che qualche foglio di carta con un manifesto di quello che conteneva la scatola e l’URL 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 all’inizio 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 un’inclinazione 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 (O’Reilly) 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. L’AVR è 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 l’utilizzo della scheda. Eliminando tutta la difficoltà dei dettagli tecnici e semplificando il processo di sviluppo, Arduino invita l’utente 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 capacità1. 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 l’ingegneria 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 d’oltreoceano 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 sull’interfaccia 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 l’accesso 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 O’Reilly) e di tenerlo a portata di mano, insieme ad altri testi di riferimento sulla programmazione e l’elettronica (troverete altri consigli nell’Appendice D).
Che cos’è questo libro Questo libro è un manuale da leggere o da consultare. Ho cercato di organizzarlo in modo da permettervi di trovare rapidamente e facilmente quello che cercate. Ogni volta che è stato possibile vi ho incluso le fonti delle mie informazioni, mentre le intuizioni che sono emerse dalla mie ricerche personali sono contrassegnate come tali.
Che cosa non è questo libro Questo libro non è un tutorial. Questo non è il suo scopo principale. Qui non ho incluso i concetti fondamentali dell’elettronica, né vi troverete una descrizione del dialetto del linguaggio C++ che si utilizza per creare i cosiddetti “sketch” per programmare un Arduino. Esistono già degli eccellenti tutorial che trattano la teoria generale dell’elettronica e della programmazione e li segnalerò al lettore come punti di partenza per prendere confidenza con questi argomenti. Questo libro non è neppure una guida ufficiale di Arduino e dei prodotti del team di Arduino. Si basa su informazioni raccolte da diverse fonti, alcune meno note di altre, insieme ai miei appunti e commenti personali basati sulle mie esperienze con Arduino. Pertanto, sono l’unico responsabile di eventuali errori e omissioni.
La terminologia Le distinzioni tra processori, microprocessori e microcontroller è sorta a un certo punto all’inizio degli anni ’80, quando i produttori cercavano di distinguere i loro prodotti basandosi sulla dimensione e la quantità di circuiti esterni necessari perché i dispositivi facessero qualcosa di utile. Per poter risultare utili, i processori completi più comuni e quelli più piccoli come quelli che generalmente si montano sui computer portatili richiedono alcuni componenti esterni (alcuni ne richiedono parecchi). Un microcontroller, invece, ha già integrato tutto il necessario per fare il suo lavoro. Inoltre, un
microprocessore di solito supporta una memoria esterna, mentre microcontroller può offrire soltanto un supporto limitato (o non offrirlo del tutto) a una memoria ulteriore rispetto a quella che si trova già sul chip. In questo libro, utilizzerò i termini “microcontroller” e “processore” in maniera intercambiabile. Anche se “microcontroller” può essere considerato un termine tecnicamente più corretto, nella mia mente è comunque un processore di dati, anche se una versione più ridotta rispetto alle enormi macchine con le quali lavoravo in un passato ormai lontano. Tutti essenzialmente fanno la stessa cosa, soltanto a scale e velocità di elaborazioni diverse.
Che cosa c’è in questo libro Il Capitolo 1 presenta una breve storia di Arduino nelle sue varie forme. Presenta anche i microcontroller AVR utilizzati sulle schede Arduino e mostra le differenze tra prodotti basati su Arduino e compatibili con il suo software e hardware. Il microcontroller Atmel AVR è il protagonista del Capitolo 2. Questo vuole essere una panoramica di quello che in realtà è un dispositivo molto sofisticato e quindi questo capitolo offre uno sguardo rapido sulle caratteristiche principali, come la logica del timer, il comparatore analogico, l’input analogico, l’interfaccia SPI e altri sottosistemi primari del chip. Il Capitolo 3 offre uno sguardo più da vicino sui microcontroller AVR utilizzati sulle schede Arduino, cioè i dispositivi ATmega168/328, ATmega1280/2560 e ATmega32U4. Riprende la panoramica presentata nel Capitolo 2 e propone alcuni ulteriori dettagli di basso livello come l’architettura interna, le caratteristiche elettriche e i pinout del chip. Il Capitolo 4 parla delle caratteristiche fisiche e delle funzioni dell’interfaccia di varie schede Arduino. Queste comprendono i tipi di interfaccia USB, le dimensioni del circuito stampato (PCB, printed circuit board) e i diagrammi dei pinout della scheda. Quello che rende Arduino davvero unico è il suo ambiente di programmazione e questo è l’argomento del Capitolo 5. Questo capitolo definisce il concetto di sketch di Arduino e spiega come si utilizzano il linguaggi C e C++ per creare sketch. Presenta il bootloader di Arduino e la funzione main() di Arduino. Questo capitolo descrive anche come si scarica il codice sorgente di Arduino e come si fa a vedere come si presenta dietro le quinte. Il Capitolo 6 descrive la toolchain AVR-GCC e presenta le tecniche per programmare una scheda Arduino senza utilizzare l’IDE di Arduino. Parla anche dei makefile e include una breve panoramica della programmazione con i linguaggi assembly. Il capitolo passa poi agli strumenti disponibili per caricare il codice su un AVR. Il Capitolo 7 è dedicato alle librerie standard fornite con l’IDE di Arduino. L’IDE di Arduino include numerose librerie e ne vengono continuamente aggiunte di ulteriori. Se
volete sapere se esiste il modulo di una libreria per un determinato sensore o per una specifica operazione, questo è un ottimo punto di partenza. Il Capitolo 8 presenta i vari tipi di shield disponibili per Arduino. Descrive molti dei tipi più comuni, come memorie flash, prototipazione, input/output, Ethernet, Bluetooth, ZigBee, controllo dei servomotori, controllo dei motori passo-passo, schermi di LED e schermi LCD. Spiega anche come si utilizzano diverse shield contemporaneamente e offre alcuni trucchi e suggerimenti per ottenere il massimo da una shield. Il Capitolo 9 descrive alcuni dei vari componenti aggiuntivi disponibili che possono essere utilizzati con Arduino. Questi includono sensori, moduli relè, tastierini numerici e altri elementi che non sono specifici di Arduino, ma che funzionano bene con questa scheda. Per molti degli elementi descritti vengono offerti i dati e gli schermi dei pinout elettrici. A volte semplicemente non è possibile trovare facilmente una shield che serve a fare quello che desideriamo. Il Capitolo 10 descrive i passaggi necessari per crearne una personalizzata. Descrive anche come si utilizza un microcontroller AVR senza una scheda a circuito come Arduino, ma utilizzando comunque l’IDE di Arduino. I Capitoli 11, 12 e 13 mostrano alcuni progetti che illustrano le capacità dei microcontroller AVR e delle schede Arduino. Sono pensati per dimostrare come può essere applicato Arduino in diverse situazioni, non come guide per imparare a costruire una scheda o un dispositivo. Tuttavia, se vi sentite ispirati potete costruire da voi uno qualsiasi degli elementi descritti, che poi vi possono servire come punti di partenza per i vostri progetti personali. La descrizione di ciascun progetto di esempio include la teoria del funzionamento, schemi, un elenco dettagliato dei componenti, i layout delle PCB (se necessario) e una panoramica del software necessario per far funzionare il tutto. Dal momento che questo libro pone l’accento soprattutto sull’hardware di Arduino e sui relativi moduli, sensori e componenti, il software mostrato è pensato soltanto per sottolineare i punti chiave: il mio obiettivo non era presentare esempi completi e pronti per l’utilizzo. I codici completi dei software relativi agli esempi e ai progetti si trovano su GitHub (https://www.github.com/ardnut). Il Capitolo 11 descrive un generatore di segnale semplice e programmabile, un dispositivo pratico da tenere a portata di mano quando si lavora con circuiti elettronici. Con questo progetto, potete generare impulsi a vari cicli di lavoro, emettere una sequenza di impulsi in risposta a un input che la lanci, generare onde sinusoidali e creare anche modelli programmabili di impulsi. Il Capitolo 12 parla della progettazione e della costruzione di un termostato “intelligente”, ideale da utilizzare con un sistema HVAC (riscaldamento, ventilazione e condizionamento dell’aria - heating, ventilation and air conditioning) domestico. Invece di pagare per qualcosa di già costruito e sigillato in un contenitore di plastica, potete costruirvene uno da soli e programmarlo in modo che si comporti esattamente nel modo che desiderate. Vi mostrerò come aggiungervi più di un unico sensore di temperatura: le funzionalità comprendono diversi sensori di temperatura e umidità e l’utilizzo del
ventilatore del vostro sistema HVAC per creare un ambiente confortevole senza bisogno di utilizzare il compressore o di accendere il riscaldamento. Nel Capitolo 13 vedremo come si costruisce un modellino automatico di lanciarazzi con un sequenziatore programmabile e un sistema di controllo automatico. Anche se non disponete di un modellino di lanciarazzi, questo progetto descrive delle tecniche che potete applicare a molti tipi di processi controllati, che sia in una linea di produzione oppure in un dispositivo che gestisce materiale robotico in un laboratorio. L’Appendice A è una panoramica degli strumenti e degli accessori di base dei quali potete aver bisogno se volete andare oltre le schede a circuito e i moduli già pronti. L’Appendice B è una raccolta dei registri di controllo dei microcontroller ATmega168/328, ATmega1280/2560 e ATmega32U4. L’Appendice C è un elenco riepilogativo dei distributori e produttori dei prodotti Arduino e compatibili menzionati in questo libro. Non è affatto esaustivo, ma spero che vi risulterà sufficiente per riuscire a trovare quello che vi serve. L’Appendice D elenca alcuni dei libri consigliati che parlano non soltanto di Arduino, ma anche della programmazione in C e C++ e dell’elettronica in generale. Infine, l’Appendice E è un riepilogo di alcuni degli strumenti di sviluppo software Arduino e AVR facili da trovare. ATTENZIONE Le appendici sono disponibili in lingua originale http://www.tecnichenuove.com/libri/arduino-per-tecnici-ingegneri-e-maker.
in
formato
PDF
all’indirizzo
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 l’essere 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 un’immagine può apparire una determinata marca o modello, questo non significa che si tratti dell’unico 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 l’unico responsabile di eventuali
errori o omissioni in queste figure.
Convenzioni utilizzate in questo libro In questo libro si utilizzano le seguenti convenzioni tipografiche: Corsivo Indica termini nuovi, URL, indirizzi email, nomi di file ed estensioni di file. Monospaziato
Si utilizza per i codici dei programmi e anche all’interno dei paragrafi per riferirsi a elementi dei programmi come nomi di variabili o di funzioni, database, tipi di dati, variabili d’ambiente, dichiarazioni e parole chiave. Monospaziato corsivo
Indica testi che devono essere sostituiti da valori forniti dall’utente o da valori determinati dal contesto.
Come contattarci Per inviare all’editore 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. L’indirizzo della pagina è: http://bit.ly/arduino-a-technical-reference. Per domande tecniche o commenti sul libro, inviate un’email a:
[email protected].
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 O’Reilly per avermi offerto l’opportunità 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 (O’Reilly), 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 l’obiettivo 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 un’occhiata 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 l’eccezione della Yún, il Capitolo 4 descriverà le caratteristiche fisiche delle varie schede Arduino ufficiali presentate in questo capitolo.
Una breve storia Nel 2005, basandosi sul lavoro di Hernando Barragán (il creatore di Wiring), Massimo Banzi e David Cuartielles hanno creato Arduino, un dispositivo programmabile e facile da utilizzare per progetti di design interattivo, presso l’Interaction Design Institute Ivrea a Ivrea, in Italia. David Mellis ha svilupppato il software di Arduino, che si basa su Wiring. Presto, Gianluca Martino e Tom Igoe si sono uniti al progetto e loro cinque sono conosciuti come i fondatori originali di Arduino. Quello che volevano ottenere era un dispositivo che fosse semplice, facile da collegare a varie cose (come relè, motori e sensori) e semplice da programmare. Volevano anche che fosse economico, dal momento che è noto che studenti e artisti non dispongono di grossi risparmi. Quindi hanno scelto la famiglia AVR di microcontroller da 8 bit (MCU o µC) di Atmel e hanno progettato una scheda a circuito indipendente con connessioni facili da utilizzare, hanno scritto il firmware del bootloader del microcontroller e hanno raccolto il tutto in un semplice IDE (ambiente di sviluppo integrato) che utilizzasse programmi di nome “sketch”. Il risultato è stato Arduino. Da allora, Arduino è cresciuto in varie direzioni: alcune versioni sono diventate più piccole dell’originale, mentre altre più grosse. Ciascuna di esse è pensata per una
specifica nicchia. L’elemento comune tra tutte è la libreria di runtime AVR-GCC di Arduino, che viene fornita con l’ambiente di sviluppo di Arduino, e il firmware del bootloader sulla scheda, che è già precaricato sul microcontroller di tutte le schede Arduino. La famiglia di schede Arduino utilizza processori sviluppati dall’Atmel Corporation di San Jose, in California. Quasi tutti i design di Arduino utilizzano la serie di microcontroller AVR da 8 bit. L’eccezione principale è rappresentata dal Due, con il suo processore ARM Cortex-M3 da 32 bit. In questo libro non parleremo del Due, dal momento che è radicalmente diverso dai dispositivi AVR in molti modi fondamentali e realmente merita una descrizione separata e dedicata a lui e ai microcontroller simili basati sul design ARM Cortex-M3. Anche se la scheda Arduino è, come dichiara il team di Arduino, semplicemente una scheda di sviluppo Atmel AVR di base, quello che fa la differenza è l’ambiente software di Arduino. Questo rappresenta l’esperienza comune di tutti gli utenti di Arduino e la pietra angolare del concetto che ne sta alla base. Nel Capitolo 5 vedremo l’IDE di Arduino, le librerie fornite con l’IDE e il bootloader. Nel Capitolo 6 descriveremo il processo di creazione del software su una MCU AVR senza utilizzare l’IDE di Arduino.
Tipi di dispositivi Arduino Nel corso degli anni, i designer di Arduino.cc hanno sviluppato diversi design della scheda. La prima scheda Arduino che è stata ampiamente distribuita, la Diecimila, è stata rilasciata nel 2007 e dal suo rilascio iniziale la famiglia di Arduino si è sviluppata in modo da approfittare dei vari tipi di dispositivi Atmel MCU AVR. Il Due, rilasciato nel 2012, è il primo Arduino a utilizzare un processore ARM Cortex-M3 da 32 bit e provoca una rottura con il resto della famiglia per quanto riguarda la potenza di elaborazione e la configurazione del pinout sulla scheda. Anche altre schede, come la LilyPad e la Nano, non presentano lo stesso pinout degli altri membri della famiglia e sono pensate per una gamma diversa di applicazioni: cose da indossare nel caso del LilyPad, dispositivi palmari nel caso della Esplora e oggetti molto piccoli nel caso del Mini, del Micro e del Nano. Ogni anno che passa appaiono nuovi tipi di schede Arduino, per cui l’elenco presentato qui potrebbe non risultare più aggiornato quando lo leggerete. Le versioni più recenti sono dotate di processori più avanzati con molta più memoria e funzionalità input/output (I/O) migliorate, ma per lo più utilizzano gli stessi pinout e funzionano con le schede aggiuntive già esistenti, dette shield, e con vari componenti aggiuntivi come sensori, relè e attuatori. La Tabella 1-1 elenca i tipi di Arduino che sono apparsi a partire dal 2005. Sulle versioni più recenti di Arduino funzioneranno anche la maggior parte degli sketch creati per i modelli più vecchi, magari con meno regolazioni e librerie più nuove, mentre gli sketch scritti per le versioni più recenti possono funzionare o meno sui modelli più vecchi.
Tabella 1-1 - Timeline dei prodotti Arduino.
Scheda
Anno
Microcontroller
Scheda
Anno
Microcontroller
Diecimila
2007
ATmega168V
Mega 2560
2010
ATmega2560
LilyPad
2007
ATmega168V/ATmega328V
Uno
2010
ATmega328P
Nano
2008
ATmega328/ATmega168
Ethernet
2011
ATmega328
Mini
2008
ATmega168
Mega ADK
2011
ATmega2560
Mini Pro
2008
ATmega328
Leonardo
2012
ATmega32U4
Duemilanove
2008
ATmega168/ATmega328
Esplora
2012
ATmega32U4
Mega
2009
ATmega1280
Micro
2012
ATmega32U4
Fio
2010
ATmega328P
Yún
2013
ATmega32U4 + Linino
La Tabella 1-1 non è una guida per l’acquisto, ma il suo scopo è offrire un certo contesto storico di Arduino. Come potete vedere, negli anni 2007 e 2008 abbiamo visto l’introduzione del LilyPad, delle schede dal fattore forma più ridotto come la Nano, la Mini e la Mini Pro, e l’introduzione 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 l’alimentazione, soprattutto il switchover automatico tra l’alimentazione 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 l’Arduino Robot, che è una PCB con motori e ruote collegate. Una delle schede più recenti nella famiglia di Arduino è la Yún, 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 dell’aspetto OpenWrt della Yún, ma fondamentalmente la parte Arduino è semplicemente un Arduino standard (un Leonardo, per essere specifici). Se volete sapere si più sulla scheda Yún, 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 all’inizio era prodotta con un microcontroller e successivamente con l’altro 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à, l’ATmega168 e l’ATmega328 sono identici, ma l’ATmega328 è dotato di più memoria interna.
Le ultime aggiunte nella famiglia di Arduino, la Leonardo, la Esplora, la Micro e la Yún, utilizzano tutte l’ATmega32U4. Questo, pur essendo simile all’ATmega328, prensenta anche un componente integrato che è l’interfaccia USB-seriale e che elimina uno dei circuiti integrati (IC, integrated circuit) che si trovano sulle schede come la Uno e la Duemilanove. Inoltre, l’interfaccia di programmazione si comporta in modo leggermente differente con le schede che utilizzano l’ATmega32U4, ma per la maggior parte degli utenti questo dovrebbe risultare ampiamente trasparente. Il Capitolo 2 descriverà il funzionamento generale dei microcontroller AVR, il Capitolo 3 contiene le descrizioni dei tipi specifici di MCU AVR che si trovano sui dispositivi Arduino e il Capitolo 4 offrirà le descrizioni delle principali schede a circuito Arduino e le definizioni dei loro pinout.
Gallerie di Arduino Le Tabelle dalla 1-1 alla 1-5 mostrano alcuni dei vari tipi di schede Arduino, sia del passato che del presente. Non li includono tutti, dal momento che periodicamente vengono aggiunti nuovi tipi o aggiornamenti a quelli esistenti. Le immagini che seguono mostrano la vasta gamma di forme fisiche e applicazioni pensate per Arduino. Dal punto di vista fisico, un Arduino non è una scheda a circuito grande. Le schede di base, la cui disposizione fisica dei pin di solito è pensata per le schede aggiuntive (dette shield e descritte nel Capitolo 8), misurano 2,1 per 2,7 pollici (53,3 per 68,6 mm). La Figura 1-1 mostra una selezione di schede Arduino con accanto un righello, mentre la Figura 1-2 mostra una scheda Nano montata su una breadboard che non richiede saldature.
Figura 1-1 - Le dimensioni relative delle schede Arduino.
Figura 1-2 - Una scheda Arduino Nano su una breadboard che non richiede saldature.
Il Capitolo 4 contiene disegni di riferimento con le dimensioni e le definizioni dei pin della maggior parte delle schede Arduino più comuni. Notate che, pur essendo molto piccola, una scheda come la Nano ha tutte le stesse capacità della Duemilanove, eccetto per i comodi pin socket e il normale connettore USB (tipo B). È ideale per applicazioni dove non deve essere disturbata dopo la sua installazione e dove sono necessarie le sue dimensioni ridotte. Alcune applicazioni che vengono subito in mente sono dispositivi autonomi di raccolta di dati ambientali (stazioni meteorologiche autonome a energia solare oppure boe per raccogliere dati negli oceani, per esempio), timing e raccolta di dati per modellini di razzi, sistemi di sicurezza e magari perfino una caffettiera “intelligente”. Tabella 1-2 - Il layout delle schede Arduino di base.
Tipo
Anno di introduzione Diecimila
2007
Duemilanove
2008
Uno (versione R3)
2010
Ethernet
2011
Leonardo
2012
Tabella 1-3 - Il layout delle schede Arduino Mega.
Tipo
Anno di introduzione Mega
2009
Mega 2560
2009
Mega ADK
2011
Tabella 1-4 - Le schede Arduino con un fattore di forma ridotto.
Tipo
Anno di introduzione Nano
2008
Mini
2008
Fio
2010
Micro
2012
Tabella 1-5 - Le schede Arduino con un fattore di forma speciale.
Tipo
Anno di introduzione
LilyPad
2007
Esplora
2012
I dispositivi compatibili con Arduino Oltre ai vari tipi di schede progettati o approvati da Arduino.cc, esistono molti dispositivi che sono compatibili con il suo hardware oppure con il suo software. Quello che rende questi dispositivi compatibili con Arduino è il fatto che incorporino il bootloader di Arduino (oppure qualcosa che funzioni in modo simile) e che possano essere programmati con l’IDE di Arduino selezionando il tipo giusto di scheda Arduino compatibile nella casella combinata dell’IDE.
I dispositivi compatibili con l’hardware Un dispositivo compatibile con l’hardware di Arduino è un dispositivo dove i vari pin I/O della scheda sono stati disposti in modo da corrispondere a uno dei fattori di forma di Arduino esistenti. Una scheda compatibile con hardware (di solito) può accettare una qualsiasi delle shield e dei moduli aggiuntivi creati per le schede Arduino ufficiali. Il motivo che sta dietro è spiegato in “Le convenzioni per la nomenclatura di Arduino” a pagina 10. Nella maggior parte dei casi, le schede compatibili con l’hardware hanno un aspetto molto simile a quello delle schede Arduino, a eccezione che per il fatto che non presentano il logo e la serigrafia ufficiali di Arduino. Altri prodotti compatibili con l’hardware possono non assomigliare affatto alle tipiche schede Arduino, ma offrire i pin socket nella disposizione corretta per permettere di utilizzare una shield standard per Arduino. Alcuni prodotti compatibili con l’hardware includono ulteriori connessioni, come la versione SainSmart della Uno con ulteriori connettori per le funzioni I/O. La Tabella 16 elenca alcuni cloni di Arduino e alcune schede compatibili che sono disponibili. Ne esistono molti altri, rispetto a quelli mostrati qui, ma questi dovrebbero bastare a farvi un’idea di quello che avete a vostra disposizione. Tabella 1-6 - I dispositivi compatibili con l’hardware di Arduino.
Nome
Tipo
Origine
SainSmart UNO
Clone dell’UNO
Cina
SainSmart Mega2560
Clone del Mega 2560
Cina
Brasuino
Simile alla Uno, con piccole modifiche
Brasile
Kit clone
Diavolino
compatibile con il layout di Arduino
USA
Notate che il Diavolino è un kit e richiede montaggio.
I dispositivi compatibili con il software Esistono molte schede compatibili con il software di Arduino. Queste utilizzano il bootloader e l’ambiente di sviluppo di Arduino, ma non presentano un fattore di forma fisico completamente compatibile con Arduino. I dispositivi compatibili con il software possono essere programmati con gli strumenti di sviluppo di Arduino, ma possono utilizzare disposizioni diverse dei pin I/O, oppure magari utilizzare alcuni altri tipi di connettori anziché i pin socket che si trovano sulle normali schede Arduino. I circuiti personalizzati basati su microcontroller AVR e costruiti in un dispositivo o sistema più grande possono ricadere nella categoria dei dispositivi compatibili con il software se nel microcontroller è installato il bootloader di Arduino. Il cuore di Arduino sono il processore e il bootloader preinstallato. Utilizzando questa definizione, si potrebbe avere soltanto un ATmega AVR IC con il firmware di Arduino caricato. Si potrebbe quindi utilizzarlo con una breadboard che non richiede saldature e l’ambiente di sviluppo di Arduino. Presso diverse fonti è possibile acquistare MCU AVR IC con il codice del bootloader pecaricato, oppure è possibile farsene uno da soli. Nel Capitolo 5 vedremo i passaggi necessari per caricare il firmware del bootloader di Arduino su una MCU AVR. È interessante notare che alcune delle schede Arduino, come la Mini, la Micro, la Nano, la LilyPad e la Esplora, non sono compatibili con l’hardware nel senso che non utilizzano il layout di connessioni I/O “standard”. Non possono essere utilizzate direttamente con una shield convenzionale, ma sono comunque schede Arduino e sono supportate dall’IDE di Arduino. Un esempio di dispositivo compatibile con il software di Arduino è la scheda Boarduino di Adafruit Industries. Questa scheda è progettata per essere montata su una breadbord senza saldature standard, come un IC completo da 40 pin. È disponibile in due stili: DC e USB. La versione DC non dispone di un chip USB integrato e quindi per programmarla è necessario un adattatore USB esterno. Un altro esempio di scheda compatibile con il software è la Dragonfly di Circuit Monkey, che utilizza connettori standard tipo Molex anziché i pin e i socket utilizzate sulle schede Arduino convenzionali. È pensata per ambienti ad alta vibrazione, come gli UAV (unmanned aerial vehicles) e la robotica. La scheda Raspduino è pensata per essere montata su una scheda Raspberry Pi e funziona in modo equivalente all’Arduino Leonardo. Questo produce una combinazione equivalente alla Yún, ma non esattamente uguale. Ciascuna configurazione ha i suoi punti di forza e i suoi punti di debolezza. La Tabella 1-7 elenca alcune schede compatibili
con il software di Arduino. Tabella 1-7 - I dispositivi compatibili con il software di Arduino.
Nome
Descrizione
Origine
Boarduino DC
Progettata per adattarsi a una breadboard che non richiede saldature
USA
Boarduino USB
Progettata per adattarsi a una breadboard che non richiede saldature
USA
Dragonfly
Utilizza connettori di tipo Molex per I/O
USA
Raspduino
Progettata per adattarsi su una scheda Raspberry Pi
Paesi Bassi
Quella presentata non è che una piccola selezione delle varie schede che sono disponibili. Dal momento che il microcontroller AVR è facile da integrare in un design, viene utilizzato in numerose applicazioni. Con il firmware del bootloader di Arduino, programmare un dispositivo è diventato davvero molto più semplice e le possibilità di design sono innumerevoli.
Le convenzioni per la nomenclatura di Arduino Nonostante il design dei circuiti e il software di Arduino siano open source, il team di Arduino ha riservato l’utilizzo del termine “Arduino” ai suoi design e il logo di Arduino è un marchio registrato. Per questo motivo, a volte troverete cose che si comportano e si presentano come dispositivi Arduino ufficiali, ma che non presentano la marca Arduino e che non sono state prodotte dal team di Arduino. Alcune di loro nel nome del prodotto contengono i suffissi “-duino” o “-ino”, come Freeduino, Funduino, Diavolino, Youduino e così via. Alcune, come le schede di SainSmart, utilizzano proprio il nome del modello (Uno e Mega2560, per esempio). NOTA Mentre scrivevo questo libro era in corso una disputa tra la società creata dai fondatori originali (Arduino LLC) e un’altra società avviata da uno dei fondatori originali (Arduino SRL). Di conseguenza, Arduino LLC utilizza il marchio
registrato Arduino negli Stati Uniti e Genuino altrove.
Occasionalmente, alcuni producono una scheda che dichiara di essere Arduino, ma in realtà non è che una copia che utilizza il marchio registrato di Arduino senza permesso. Anche la serigrafia utilizzata per aggiungere il logo e altre informazioni sulle schede Arduino ufficiali è protetta da copyright e il team di Arduino non la rilascia con il file del layout delle PCB. Sul suo blog, Massimo Banzi ha una sezione (http://www.massimobanzi.com/) dedicata esattamente a queste schede non autorizzate e il suo esame delle copie palesi e spudorate è a dir poco interessante. Vi basta cercare il tag “hall of shame”. Qui il concetto fondamentale è che chiunque è benvenuto se vuole copiare gli schemi, il codice del bootloader e l’IDE di Arduino, e utilizzarli per creare una versione personalizzata di Arduino. Dopo tutto, si tratta di un progetto open source. Quello che non è consentito è chiamarlo Arduino oppure utilizzare l’immagine di Arduino.cc senza permesso.
Che cosa posso fare con Arduino? Oltre alla possibilità di programmare facilmente offerta dall’IDE di Arduino, l’altra caratteristica importante di Arduino è la potenza e la capacità del microcontroller AVR sul quale si basa. Con una manciata di shield aggiuntive facili da reperire (descritte nel Capitolo 8) e una vesta selezione di sensori e attuatori a basso prezzo (che saranno descritti nel dettaglio nel Capitolo 9), c’è davvero ben poco che non si possa fare con Arduino, a condizione che si tengano a mente alcuni limiti fondamentali. Il primo limite è la memoria. L’MCU AVR non offre molta memoria dove salvare programmazione e variabili e molti dei componenti AVR non permettono di aggiungerne di ulteriori. Detto questo, i tipi ATmega32 e ATmega128 possono utilizzare memoria esterna, ma poi le funzioni I/O di questi pin cessano di essere immediatamente disponibili. Le schede Arduino non sono state progettate per accogliere memoria esterna, dal momento che nel progetto di base si è dato per scontato che il chip AVR di per sé avrebbe offerto gli I/O necessari e l’utente vi avrebbe eseguito un programma relativamente corto. L’Arduino non è stato pensato come alternativa a un sistema informatico completo con gigabyte di RAM e un hard disk (HDD, hard disk drive). Esistono alcuni computer economici, basati su Intel e con un un’unica scheda, che corrispondono a questa descrizione, ma che non starebbero dentro a una scatoletta di mentine, a un pezzo di tubo PVC attaccato a un palo o a un albero, a un piccolo robot, o in una sezione di un modellino di lanciarazzi. Arduino sì. Il secondo limite è la velocità. La velocità di clock della CPU di Arduino di solito è compresa tra 8 e 20 MHz (nel Capitolo 4 troverete un confronto dettagliato dei tipi di dispositivi AVR di Arduino). Anche se può sembrare lento, dobbiamo tenere presente due fattori chiave: il primo è che l’AVR è il design di un RISC (reduced instruction set computer) molto efficiente e il secondo è che le cose nel mondo reale in genere non
avvengono molto velocemente dal punto di vista di un microcontroller. Per esempio, quanto spesso un termostato cosiddetto intelligente deve campionare la temperatura in una casa o in un ufficio? Una volta al secondo è probabilmente un’esagerazione e una volta ogni 5 o perfino10 secondi andrà benissimo. Quanto spesso un robot deve emettere un impulso a ultrasuoni per determinare se davanti c’è un ostacolo? Un impulso ogni 100 ms probabilmente è più che sufficiente (a meno che il robot non proceda molto, molto rapidamente). Quindi, nel caso di un Arduino a 16 MHz (come il Leonardo, per esempio), tra gli impulsi del sensore si produrranno circa 1.000.000 o più di tick del clock della CPU, a seconda di cos’altro sta facendo la CPU con gli impulsi. Dato che in un uno o due cicli del clock un AVR può eseguire molte istruzioni, tra ciascun impulso del sensore a ultrasuoni e l’altro rimane disponibile molta attività della CPU. Il terzo limite principale è l’alimentazione elettrica. Dal momento che l’hardware di Arduino in realtà non è altro che una PCB su cui risiede un IC AVR, tra il microcontroller e il mondo esterno non c’è un buffer. Se non facciamo attenzione a non far scorrere più corrente di quella che il dispositivo può gestire, rischiamo rapidamente di bruciare un AVR (in altre parole, di surriscaldare l’IC e distruggerlo). Dobbiamo tenere presente anche il voltaggio, dal momento che alcuni tipi di AVR hanno I/O da 3,3 V, mentre altri sopportano 5 V. Collegare un TTL (transistor-transistor logic) da 5 V a un dispositivo da 3,3 V di solito provoca danni all’hardware e così si rischia di bruciarlo. Tenendo in mente i limiti che abbiamo appena descritto, ecco alcune possibili applicazioni per Arduino: •
Monitoraggio nel mondo reale – Stazione meteorologica automatica – Rilevatore di fulmini – Monitoraggio del sole per pannelli solari – Monitor di radiazioni in background – Rilevatore automatico di fauna selvatica – Sistema di sicurezza domestico o aziendale
•
Controllo a piccola scala – Piccoli robot – Modellini di razzi – Modellini di aerei – UAV quadrirotori – CNC semplice per piccole machine – Automazione a piccola scala – Serra automatica
– Acquario automatico – Robot porta campioni da laboratorio – Camera termica di precisione – Sistema di test automatizzato elettronico •
Performance artistica – Controllo dinamico dell’illuminazione – Controllo dinamico della sonorizzazione – Strutture cinematiche – Opere che reagiscano al pubblico
Nei Capitoli 11, 12 e 13 vedremo applicazioni come un termostato intelligente, un generatore di segnale programmabile e un sistema di controllo automatico per lanciare razzi che vi aiuti a realizzare le vostre aspirazioni suborbitali. E questi non sono che la punta dell’iceberg. Le possibilità sono vaste e sono limitate soltanto dalla vostra immaginazione. Se non cercate di chiedere ad Arduino di fare qualcosa che dovrebbe fare un computer completo, potete integrarlo in applicazioni interessanti di ogni tipo, che è esattamente quello che avevano in mente i ragazzi di Arduino.cc.
Per maggiori informazioni Le schede elencate in questo capitolo non sono che una breve selezione di tutte quelle disponibili e anche la storia Arduino è molto più ricca di dettagli. Se digitate “Arduino” nel campo di ricerca di Google, otterrete migliaia di risultati da esplorare. Il sito ufficiale di Arduino si trova su http://www.arduino.cc. Il blog di Massimo Banzi si trova su http://www.massimobanzi.com. Inoltre, trovate i link di altri siti e libri consigliati nelle Appendici.
2 Il microcontroller AVR
Dal momento che un Arduino basato su AVR in realtà è soltanto una piattaforma fisica per un microcontroller AVR (cioè, una scheda breakout), le caratteristiche elettriche di Arduino sono essenzialmente quelle di un dispositivo AVR sulla PCB. Capire i dettagli di basso livello di un Arduino significa in realtà capire il dispositivo AVR che ne sta alla base. Da questo punto di vista, questo capitolo presenta materiale di ampia applicazione che consiste nelle descrizioni di alto livello delle funzioni principali utilizzate dalla famiglia AVR. Questo comprende la CPU dell’AVR e le cosiddette funzioni periferiche come timer, contatori, la logica dell’interfaccia seriale, convertitori analogodigitale (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 un’architettura 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 dell’AVR, 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 l’utente e note applicative.
La storia Il microcontroller AVR ha preso vita all’inizio 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 un’architettura 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. L’AVR è 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 l’architettura 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 l’archiviazione 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.
L’architettura 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 dell’AVR che si trova sui dispositivi AVR da 8 bit. La Figura 2-2 mostra un diagramma a blocchi generico e di alto livello di un dispositivo AVR. Il suo scopo non è rappresentare un dispositivo AVR specifico, ma soltanto un AVR in generale.
Figura 2-1 - Il diagramma a blocchi della CPU dell’AVR.
Figura 2-2 - Il diagramma a blocchi di un microcontroller AVR.
Le funzioni periferiche sono controllate dalla CPU per mezzo di un bus di dati interno ad alta velocità. I registri di controllo (separati dai registri della CPU) si utilizzano per configurare l’operazione 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, l’ATTINY13-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 dell’oscillatore, input dell’interrupt, segnali dell’SPI, 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. All’altra estremità dello spettro ci sono i componenti AVR come l’ATmega649, 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 un’interfaccia LCD integrata. La serie di componenti AVR32 è formata da processori AVR da 32 bit con fino a 256K di memoria flash, 32K di RAM, un’unità 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 l’ATmega649 o l’AVR32, 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 l’AVR viene spento. La SRAM è volatile e i suoi contenuti vengono persi quando l’AVR perde l’alimentazione.
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 nell’IC 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 l’ATmega168 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 nell’Appendice B. Sono descritti nel dettaglio anche nella documentazione messa a disposizione direttamente da Atmel. Perfino un componente AVR modesto come l’ATmega168 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 dell’ATmega168 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 l’input positivo del comparatore analogico interno dell’AVR (AIN0), oppure come l’output di un circuito logico del comparatore del timer (l’output Timer/Counter0 corrisponde ad A), che può essere utilizzato per generare un segnale PWM (Pulse Width Modulation).
Le porte I/O digitali Per comunicare con il mondo esterno, i microcontroller AVR utilizzano porte I/O bidirezionali. Una porta è un registro da 8 bit nel quale alcuni o tutti i bit sono collegati ai pin fisici del dispositivo AVR. Tipi diversi di dispositivi AVR hanno diversi numeri di porte, che vanno da una sola sull’ATTINY13-20SQ alle nove dell’ATmega649. Le porte sono etichettate come A, B, C e così via. Ciascun pin di una porta è controllato dalla logica interna che gestisce la direzione del segnale, lo stato di una resistenza pull-up interna, il timing e altre funzioni. Potete osservarne un semplice schema nella Figura 2-3. Il Px che appare nella Figura 2-3 si riferisce al bit/pin x (da 0 a 7) della porta. Trovate una descrizione dettagliata della logica delle porte sugli AVR nella documentazione tecnica di AVR.
Figura 2-3 - Il diagramma a blocchi delle porte I/O dei dispositivi AVR.
Per via della logica sofisticata che si utilizza per controllare le funzionalità, le porte AVR possono eseguire diverse funzioni, alcune delle quali simultaneamente. Quando una porta viene configurata come output, è comunque possibile leggervi dati e un output può essere utilizzato per azionare un interrupt (come vedremo in “Gli interrupt” a pagina 26).
I timer/contatori da 8 bit Sui microcontroller AVR, sono disponibili due forme di timer/contatori da 8 bit. Nel primo tipo, l’input 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 nell’Appendice B e descritti nel dettaglio nella documentazione tecnica di Atmel.
Figura 2-4 - Il diagramma a blocchi del timer/contatore dei dispositivi AVR.
Il modulo Timer/Counter0 di una funzione periferica timer/contatore da 8 bit di un dispositivo AVR è un timer e/o contatore a scopo generale che è dotato di due circuiti di confronto degli output indipendenti con quattro modalità operative. Le modalità operative del timer/contatore sono:
Modalità normale Si tratta della modalità operativa più semplice del timer/contatore. Il conteggio si incrementa sempre e il contatore non viene azzerato quando raggiunge il suo valore massimo da 8 bit. Quando questo avviene, il contatore va in overflow e ritorna a zero. Quando il contatore torna a zero, viene impostato il Timer/Counter Overflow Flag (TOV0). Il flag TOV0 può essere visto come un nono bit, ma viene soltanto impostato, e non azzerato, dall’overflow del timer. L’interrupt dell’overflow del timer azzera automaticamente il bit del flag dell’overflow e può essere utilizzato per incrementare un secondo contatore, basato sul software, nella memoria. Un nuovo valore del contatore può essere scritto sul registro TCNT0 in qualsiasi momento.
Modalità CTC (Clear Timer on Compare) Nella modalità Clear Timer on Compare, il registro OCR0A viene utilizzato per manipolare la risoluzione del contatore definendo il suo valore massimo. Questo permette di ottenere un grande controllo della frequenza di output del compare match e aiuta a semplificare il conteggio di eventi esterni.
Modalità Fast PWM La modalità fast pulse width modulation supporta la generazione di forme d’onda PWM ad alta frequenza.
Modalità Phase correct PWM
La modalità phase correct PWM offre l’opzione di generare forme d’onda PWM ad alta risoluzione a correzione di fase. Inoltre, alcuni dispositivi AVR contengono un timer/contatore da 8 bit con la capacità di agire in modo asincrono utilizzando input di clock esterni (i pin di input del clock TOSC1 e TOSC2). Dal punto di vista funzionale è equivalente al circuito del timer/contatore sincrono da 8 bit descritto prima.
I timer/contatori da 16 bit Il timer/contatore da 16 bit è simile alla versione da 8 bit, ma con un intervallo di conteggio più esteso. È pura logica da 16 bit, che permette la generazione di PWM da 16 bit a periodo variabile. Il modulo è dotato anche di due circuiti di confronto degli output indipendenti, di registri di confronto degli output con doppio buffer e di un circuito di cattura degli input con eliminazione del disturbo. Oltre che per la generazione di PWM, il timer/contatore da 16 bit può essere utilizzato per catturare eventi esterni ad alta risoluzione, per generare frequenze e per misurare il timing dei segnali. Ha la capacità di generare quattro diversi interrupt (TOV1, OCF1A, OCF1B e ICF1).
Il prescaler del timer/contatore In un dispositivo AVR, uno o più contatori possono condividere la stessa logica del prescaler, ma con impostazioni diverse. Il prescaler è essenzialmente un circuito divisore che genera un derivato del clock I/O del sistema a f/8, f/64, f/256, oppure f/1024, che vengono detti tap. Un timer/contatore può utilizzare il tap f/64, mentre un altro può utilizzare il tap f/1024. L’utilizzo di un prescaler permettere di estendere l’intervallo di un timer/contatore in modo che si avvicini maggiormente al ritmo al quale si verifica un evento esterno e inoltre aumenta la distanza tra l’overflow e il reset del timer/contatore.
Il comparatore analogico Il comparatore analogico di un microcontroller AVR si utilizza per confrontare le tensioni di ingresso sui pin AIN0 e AIN1. Anche se AIN0 è definito come l’input 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 dell’input di uno dei moduli timer/contatore e può anche generare un interrupt specifico per il comparatore. L’evento 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. L’input del comparatore analogico può anche essere configurato in modo che l’input AIN1 possa essere confrontato con il riferimento di tensione bandgap interno, oppure AIN0 può essere confrontato con l’output del multiplexer ADC (e la sua tensione è ancora a disposizione dell’input dell’ADC). 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 l’inversione dell’input 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 dell’AVR, 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 sull’ADC è 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 dell’AVR.
Figura 2-6 - Il diagramma a blocchi del convertitore analogico-digitale di un dispositivo AVR.
Notate che nella Figura 2-6 l’AVR 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 sull’ADC da 10 bit di un dispositivo AVR in modalità free-running, anche se continua a mantenere la piena risoluzione, è di circa 65 microsecondi (µs) per campione.
Gli I/O seriali L’ATmega168 offre principalmente tre forme di interfaccia seriale: seriale
sincrona/asincrona, SPI master/slave sincrona e un’interfaccia a due fili orientata al byte simile allo standard I2C (Inter-Integrated Circuit) di Philips.
L’USART Un componente diffuso su molti componenti AVR è l’USART (Universal Synchronous/Asynchronous Receiver-Transmitter) integrato, detto anche UART (Universal Asynchronous Receiver-Transmitter). Questa funzione può essere usata per implementare un’interfaccia 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. L’USART 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 dell’AVR.
Figura 2-7 - Il diagramma a blocchi dell’USART di un dispositivo AVR.
La SPI La logica periferica SPI dell’AVR 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 dall’USART. 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. L’interfaccia 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 dell’interfaccia 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 l’interrupt. 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 l’ATmega168. Per altri tipi di microcontroller, potete consultare l’Appendice A oppure la documentazione ufficiale di Atmel (http://www.atmel.com/designsupport/documentation/). L’ATmega168 è 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é l’input rimane low. Anche i pin I/O dell’ATmega168 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 l’interrupt relativo ai cambiamenti della porta è attivato. Quando un pin qualsiasi compreso tra PCINT0 e PCINT7 cambia, aziona l’interrupt PCI0. pin compresi tra PCINT8 e PCINT14 azionano PCI1 e quelli compresi tra PCINT16 e PCTIN23 azionano l’interrupt PCI2. I registri PCMSK0, PCMSK1 e PCMSK2 controllano quali pin contribuiscono agli interrupt dei cambiamenti dei pin. Quando si verifica l’attivazione di un interrupt, la CPU salta in una posizione in una tabella vettoriale della memoria, che è stata assegnata a quel particolare interrupt. L’indirizzo contiene un’istruzione jump (RJMP) che dirige al blocco di codice vero e proprio di quell’interrupt. Quando il codice dell’interrupt è terminato, l’esecuzione ritorna al punto del programma originale dove si era verificato l’interrupt. La Figura 2-10 mostra come si utilizza la tabella vettoriale degli interrupt per passare all’esecuzione del blocco di codice dell’interrupt e poi restituire il controllo al programma principale una volta terminato il codice dell’interrupt.
Figura 2-10 - I vettori degli interrupt sui dispositivi AVR (ATmega168/328).
L’ATmega168, 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 sull’ATmega168.
Vettore
Indirizzo
Sorgente
Definizione
Pin esterno, accensione, calo di tensione e watchdog
1
0x0000
RESET
2
0x0002
INT0
Richiesta 0 di interrupt esterno
3
0x0004
INT1
Richiesta 1 di interrupt esterno
4
0x0006
PCINT0
Richiesta 0 di interrupt cambio di pin
5
0x0008
PCINT1
Richiesta 1 di interrupt cambio di pin
6
0x000A
PCINT2
Richiesta 2 di interrupt cambio di pin
7
0x000C
WDT
8
0x000E
TIMER2
COMPA Confronto corrispondenza Timer/Counter2 A
9
0x0010
TIMER2
COMPB Confronto corrispondenza Timer/Counter2 B
10
0x0012
TIMER2
OVF overflow Timer/Counter2
11
0x0014
TIMER1
CAPT Cattura di eventi Timer/Counter1
12
0x0016
TIMER1
COMPA Confronto corrispondenza Timer/Counter1 A
13
0x0018
TIMER1
COMPB Confronto corrispondenza Timer/Counter1 B
14
0x001A
TIMER1
OVF Overflow Timer/Counter1
15
0x001C
TIMER0
COMPA Timer/Counter0 corrispondenza A
16
0x001E
TIMER0
COMPB Timer/Counter0 corrispondenza B
17
0x0020
TIMER0
OVF Overflow Timer/Counter1
18
0x0022
SPI, STC
SPI Trasferimento seriale completato
19
0x0024
USART, RX
USART, Rx completo
20
0x0026
USART, UDRE
USART, registro dati vuoto
21
0x0028
USART, TX
USART, Tx completo
22
0x002A
ADC
23
0x002C
EE READY
24
0x002E
ANALOG COMP
Interrupt watchdog di time-out
Conversione ADC completata EEPROM pronta Comparatore analogico
25
0x0030
TWI
26
0x0032
SPM READY
Interfaccia a due fili seriale Programma di memorizzazione pronto
Il timer watchdog L’AVR 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 un’azione 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. L’ATmega32U4 può utilizzare una tensione di alimentazione da 2,7 a 5,5 V DC. Il consumo di corrente di un dispositivo AVR varia a seconda del tipo di dispositivo, dello stato attivo o disattivo (sleep) del microcontroller e della velocità del clock. I valori delle linee di prodotti ATmega e XMEGA oscillano tra 0,55 mA ai 30 mA. Il consumo di corrente complessivo dipende anche dalla quantità di corrente che scorre attraverso i pin I/O. Il Capitolo 3 elenca i valori specifici relativi ai microcontroller ATmega168, ATmega328, ATmega1280, ATmega2560 e ATmega32U4.
Per ulteriori informazioni Il Capitolo 3 descrive i pinout utilizzati sui tre tipi di MCU AVR che si trovano sulle schede Arduino, mentre il Capitolo 4 mostra come i pin delle MCU AVR sono mappati sui pin I/O delle varie schede Arduino. Ciascuna delle varie MCU AVR possono avere diverse combinazioni di funzioni periferiche interne e, in alcuni casi, la funzionalità può variare leggermente a seconda del tipo. La fonte migliore di informazioni relative alle MCU AVR è il sito web di Atmel
(http://www.atmel.com).
3 I microcontroller AVR specifici per Arduino
Questo capitolo presenta le descrizioni tecniche dei tipi di componenti AVR che si utilizzano nei modelli di Arduino basati sui dispositivi AVR da 8 bit. Il suo scopo è rappresentare la continuazione delle descrizioni funzionali presentate nel Capitolo 2 rispetto ai microcontroller AVR in generale, ma prestando particolare attenzione ai microcontroller ATmega168/328, ATmega1280/2560 e ATmega32U4. Dal punto di vista di qualcuno che programmi un Arduino con l’IDE, il microcontroller è un’astrazione 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 nell’ADC integrato è semplice. Gli indirizzi interni dei registri di controllo e i loro bit di controllo sono predefiniti, in modo che l’autore 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 un’interfaccia USB integrata, che elimina la necessità di un secondo componente per gestire le comunicazioni USB. Tutti i dispositivi utilizzano la stessa serie di istruzioni delle CPU. Tabella 3-1 - I microcontroller AVR utilizzati nei prodotti Arduino.
Microcontroller
Flash
Pin I/O (max)
Note
ATmega168
16K
23
clock 20 MHz
ATmega168V
16K
23
clock 10 MHz
ATmega328
32K
23
clock 20 MHz
ATmega328P
32K
23
clock 20 MHz, picoPower
ATmega328V
32K
23
clock 10 MHz
ATmega1280
128K
86
clock 16 MHz
ATmega2560
256K
86
clock 16 MHz
ATmega32U4
32K
26
clock 16 MHz
Questo livello intrinseco di compatibilità fa sì che i programmi scritti per un Arduino Diecimila possano essere compilati ed eseguiti senza modifica su una Uno. La differenza principale tra una scheda Diecimila e una Uno è che una utilizza l’ATmega168 e l’altra si basa sull’ATmega328P. Come potete osservare nella Tabella 3-1, l’ATmega328P ha il doppio di memoria flash integrata rispetto all’ATmega168. Pertanto, i programmi scritti per una scheda Uno possono non essere retrocompatibili con una Diecimila, se il codice è stato progettato per essere utilizzato con una quantità di memoria superiore.
L’ATmega168/328 L’ATmega168 e l’ATmega328 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 L’ATmega328 ha una quantità di memoria di ogni tipo doppia rispetto all’ATmega168, come mostra la Tabella 3-2. A parte questo, i due componenti sono identici. Tabella 3-2 - La memoria integrata dell’ATmega168/328.
Memoria programma flash EEPROM RAM
ATmega168
ATmega328
16 KB
32 KB
512 byte
1 KB
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) L’ATmega168 e l’ATmega384 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 dell’ATmega168.
Le porte L’ATmega168/328 è dotato di tre porte designate come B, C e D. Le porte B e D sono porte da 8 bit. La porta C ha a sua disposizione sei pin che possono essere utilizzati come input ADC. Inoltre, PC4 e PC5 sono collegati alla logica della TWI e offrono segnali SCL e SDA compatibili con I2C (clock e dati). Notate anche che di solito PC6 viene utilizzato come input per il RESET. Sui componenti non c’è PC7. E notate ancora che sul componente ATmega168/328 non c’è Porta A. Ciascuna porta offre I/O digitali bidirezionali e discreti con resistenze pull-up programmabili interne. Gli stati on/off delle resistenze pull-up si selezionano per mezzo dei bit dei registri di controllo dei pin specifici delle porte. I buffer di output delle porte hanno funzionalità di trasmissione simmetriche con capacità sink e source. Come input, i pin delle porte che sono resi esternamente low forniscono corrente se le resistenze pull-up interne sono attivate. I pin delle porte sono passati in una modalità a tre stati (alta impedenza) quando diventa attiva una condizione di reset, anche se il clock non è attivo.
Le funzioni dei pin La Figura 3-2 mostra le funzioni dei pin del package DIP da 28 pin. Per maggiori
informazioni sui pinout dei contenitori a montaggio superficiale potete consultare la documentazione di Atmel (http://bit.ly/atmel-docs).
Figura 3-2 - Le funzioni dei pin del package DIP del microcontroller ATmega168/328.
Gli input del comparatore analogico La Figura 3-3 mostra le posizioni dei pin AIN0 e AIN1 sull’ATmega168 o sull’ATmega328 in un package PDIP. Notate che AIN0 condivide un pin con l’output del timer/contatore OC0A (PD6). Quindi, se PD6 viene utilizzato come output PWM, non può essere utilizzato come input AIN0 a meno che non venga riconfigurato ogni volta che deve cambiare la sua funzione.
Figura 3-3 - I pin di input del comparatore analogico sul microcontroller ATmega168/328.
Gli input analogici A eccezione che per i pin SCL e SDA che si utilizzano per le comunicazioni seriali della TWI, i pin dell’input analogico possono essere utilizzati come I/O digitali discreti oppure come input analogici senza conflitti con altre funzioni periferiche dell’AVR. La Figura 3-4 mostra i pin del package PDIP di un ATmega168 utilizzati per gli input analogici.
Figura 3-4 - I pin di input ADC del microcontroller ATmega168/328.
Le interfacce seriali La Figura 3-5 mostra i pin I/O di un ATmega168 (package PDIP) utilizzati dalle funzioni dell’interfaccia seriale. Dal momento che nessuna delle funzioni seriali condivide i pin delle porte, è possibile utilizzarne tutte e tre le forme senza conflitti sulle porte.
Figura 3-5 - I pin I/O seriali del microcontroller ATmega168/328.
Gli I/O del timer/clock La logica del timer/contatore interno di un AVR ATmega168/328 è complessa e questo è dimostrato dall’assegnazione dei pin del chip, mostrata nella Figura 3-6. Notate che i pin OCxn (OC0A, OC0B, OC1A, OC1B, OC2A e OC2B) sono disponibili come output PWM e così è come appaiono etichettati sulle schede Arduino. Notate anche che T1 e OSC0B condividono lo stesso pin (PD5), ma altrimenti gli output compatibili con PWM possono essere utilizzati senza conflitti con altre funzioni del timer/contatore.
Figura 3-6 - I pin del timer/contatore del microcontroller ATmega168/328.
Gli interrupt esterni I pin PD2 e PD3 della porta D sono pensati espressamente per essere utilizzati come input per gli interrupt esterni. Anche qualunque pin compreso tra i pin PCINT0 e PCINT23 può essere utilizzato come input per gli interrupt esterni senza interferire con altre funzioni assegnate (per una panoramica di come possono essere utilizzati questi interrupt, vedere “Gli interrupt” a pagina 26). La Figura 3-7 mostra gli input per gli interrupt esterni disponibili sui dispositivi ATmega168/328.
Figura 3-7 - I pin degli input per gli interrupt sui microcontroller ATmega168/328.
Le assegnazioni dei pin di Arduino Le schede Diecimila, Duemilanove, Uno ed Ethernet utilizzano fondamentalmente lo stesso layout della scheda (descritto nel Capitolo 4), come mostra la Figura 3-8. Per i pin socket header, queste schede Arduino utilizzano una nomenclatura basata sulle funzioni dei pin dell’ATmega168 o dell’ATmega328 installati sulla PCB. L’enfasi è posta soprattutto sulle funzioni che si utilizzano più spesso, cioè gli I/O digitali discreti, gli input analogici e le funzioni di output PWM dei microcontroller AVR.
Figura 3-8 - Le etichette dei pin Arduino sull’ATmega168/328.
Le caratteristiche elettriche fondamentali La Tabella 3-3 mostra alcune delle caratteristiche elettriche fondamentali dei microcontroller ATmega168/328, sottolineandone il consumo energetico. Tabella 3-3 - Il consumo energetico dell’ATmega168/328.
Dispositivo
Parametro Corrente di alimentazione
ATmega168
Modalità risparmio energetico
Condizione
VCC
Tipico
Max
Attivo 8 MHz
5 V
4,2 mA
12 mA
Inattivo 8 MHz
5 V
0,9 mA
5,5 mA
32 MHz TOSC
1,8 V
0,75 uA
32 MHz TOSC
5 V
0,83 uA
Modalità spegnimento
Corrente di alimentazione ATmega328
Modalità risparmio energetico Modalità spegnimento
WDT attivato
3 V
4,1 uA
15 uA
WDT disattivato
3 V
0,1 uA
2 uA
Attivo 8 MHz
5 V
5,2 mA
12 mA
Inattivo 8 MHz
5 V
1,2 mA
5,5 mA
32 MHz TOSC
1,8 V
0,8 uA
32 MHz TOSC
5 V
0,9 uA
WDT attivato
3 V
4,2 uA
15 uA
WDT disattivato
3 V
0,1 uA
2 uA
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.
L’ATmega1280/ATmega2560 Come nel caso dell’ATmega168/328, la differenza principale tra l’ATmega1280 e l’ATmega2560 è 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 dell’interno 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 L’ATmega2560 è dotato del doppio di ciascun tipo di memoria rispetto all’ATmega1280 e di otto volte più memoria flash rispetto all’MCU dell’ATmega328. La memoria disponibile è mostrata nella Tabella 3-4. A parte questo, l’ATmega1280 e l’ATmega2560 con gli stessi tipi di package sono identici. Tabella 3-4 - La memoria integrata dell’ATmega1280/2560.
ATmega1280
ATmega2560
128 KB
256 KB
EEPROM
4 KB
4 KB
RAM
8 KB
8 KB
Memoria programma flash
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 dell’ATmega1280/2560.
Le porte Le versioni da 100 pin dell’ATmega1280 e dell’ATmega2560 sono dotate di 11 porte, etichettate da A a L. Notate che la porta I non c’è, dal momento che la lettera I potrebbe essere confusa con il numerale 1. Le porte A, B, C, D ed E sono porte da 8 bit bidirezionali. La porta B ha capacità di trasmissione migliori delle altre porte. Le porte F e K si utilizzano come input del convertitore A/D interno, ma possono fungere anche da porte bidirezionali. La porta G è una porta da 6 bit e le porte H, J e L sono interfacce bidirezionali da 8 bit. Ciascuna porta mette a disposizione I/O digitali discreti con resistenze pull-up interne programmabili. Gli stati on/off delle resistenze pull-up si selezionano per mezzo dei bit del registro di controllo dei pin della porta. I buffer di output delle porte hanno funzionalità di trasmissione simmetriche con capacità sink e source. Come input, i pin delle porte che sono resi esternamente low forniscono corrente se le resistenze pull-up interne sono attivate. I pin delle porte sono passati in una modalità a tre stati (alta impedenza) quando diventa attiva una condizione di reset.
Le funzioni dei pin I diagrammi mostrati in questo paragrafo si riferiscono alla versione da 100 pin dei dispositivi ATmega1280/2560. Per ulteriori dettagli sui componenti BGA e da 64 pin, potete consultare la documentazione tecnica di Atmel.
Gli input del comparatore analogico Come i dispositivi ATmega168/328, più piccoli, i componenti ATmega1280/2560 sono dotati di due input del comparatore analogico, come indicato nel dettaglio nella Tabella
3-5 e mostrato nella Figura 3-11. Tabella 3-5 - Gli input del comparatore analogico.
Pin
Porta
Funzione
4
PE2
AIN0
5
PE3
AIN1
Figura 3-11 - I pin degli input del comparatore analogico dell’ATmega1280/2560.
Gli input analogici I dispositivi ATmega1280/2560 supportano fino a 16 input del convertitore A/D. Questi si trovano sulle porte F e K e sul package da 100 pin sono collegati ai pin dal 82 a 97 (vedere Tabella 3-6). Tabella 3-6 - Gli input analogici.
Pin
Porta
Funzione
Pin
Porta
Funzione
82
PK7
ADC15
90
PF7
ADC7
83
PK6
ADC14
91
PF6
ADC6
84
PK5
ADC13
92
PF5
ADC5
85
PK4
ADC12
93
PF4
ADC4
86
PK3
ADC11
94
PF3
ADC3
87
PK2
ADC10
95
PF2
ADC2
88
PK1
ADC9
96
PF1
ADC1
89
PK0
ADC8
97
PF0
ADC0
Anche la porta F ha funzioni alternate TCK, TMS, TDI e TDO e i pin della porta K sono collegati agli interrupt da PCINT16 a PCINT23. Le posizioni fisiche dei pin sono mostrate nella Figura 3-12.
Figura 3-12 - I pin degli input ADC dell’ATmega1280/2560.
Le interfacce seriali I dispositivi ATmega1280/2560 sono dotati di quattro funzioni USART interne. Queste si presentano nella forma di quattro coppie di pin, delle quali una funge da TXD e l’altra da RXD. Sui package da 100 pin, l’interfaccia SPI è disponibile sulla porta B sui pin dal 19 al 22. L’interfaccia 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 313 mostra le posizioni dei pin I/O seriali sul package da 100 pin. Tabella 3-7 - USART 0.
Pin
Porta
Funzione
2
PE0
RXD0
3
PE1
TXD0
Tabella 3-8 - USART 1.
Pin
Porta
Funzione
45
PD2
RXD1
46
PD3
TXD1
Tabella 3-9 - USART 2.
Pin
Porta
Funzione
12
PH0
RXD2
13
PH1
TXD2
Tabella 3-10 - USART 4.
Pin
Porta
Funzione
63
PJ0
RXD3
64
PJ1
TXD3
Tabella 3-11 - SPI.
Pin
Porta
Funzione
19
PB0
SS (active low)
20
PB1
SCK
21
PB2
MOSI
22
PB3
MISO
Tabella 3-12 - TWI.
Pin
Porta
Funzione
43
PD0
SCL
44
PD1
SDA
Figura 3-13 - I pin I/O seriali dell’ATmega1280/2560.
Gli I/O del timer/clock Nel dispositivo ATmega1280/2560 ci sono cinque funzioni timer/contatore, come mostra la Figura 3-14.
Figura 3-14 - I pin del timer/contatore sull’ATmega1280/2560.
La Tabella 3-13 ne elenca i pin. Notate che non c’e il pin T2. Tabella 3-13 - I pin del timer/contatore dell’Atmega1280/2560.
Pin
Porta
Funzione
Pin
Porta
Funzione
1
PG5
OC0B
50
PD7
T0
5
PE3
OC3A
15
PH3
OC4A
6
PE4
OC3B
16
PH4
OC4B
7
PE5
OC3C
17
PH5
OC4C
8
PE6
T3
18
PH6
OC2B
9
PE7
ICP3
27
PH7
T4
23
PB4
OC2A
35
PL0
ICP4
24
PB5
OC1A
36
PL1
ICP5
25
PB6
OC1B
37
PL2
T5
26
PB7
OC0A/OC1C
38
PL3
OC5A
47
PD4
ICP1
39
PL4
OC5B
49
PD6
T1
40
PL5
OC5C
Gli interrupt esterni I dispositivi ATmega1280/2560 supportano otto input per gli interrupt esterni, oltre alle funzioni di interrupt disponibili sulle porte B, J e K. I pin sono elencati nella Tabella 3-14. Tabella 3-14 - I pin degli interrupt sull’ATmega 1280/2560.
Pin
Porta
Funzione
Pin
Porta
Funzione
6
PE4
INT4
43
PD0
INT0
7
PE5
INT5
44
PD1
INT1
8
PE6
INT6
45
PD2
INT2
9
PE7
INT7
46
PD3
INT3
Le assegnazioni dei pin di Arduino Le schede Arduino Mega e Mega2560 utilizzano il layout della scheda descritto nel Capitolo 4. Per quanto riguarda i pin socket header, queste schede Arduino utilizzano una nomenclatura basata sulle funzioni dei pin dell’ATmega1280 o dell’ATmega2650 installati sulla PCB. L’enfasi è posta soprattutto sulle funzioni che si utilizzano più spesso, cioè gli I/O digitali discreti, gli input analogici e le funzioni di output PWM dei
microcontroller AVR. La Tabella 3-15 elenca i pin della Mega o Mega2560 e le connessioni al dispositivo AVR ATmega1280/2560 sulla scheda. Le funzioni racchiuse tra parentesi sono i pin di indirizzamento della memoria esterna e la tilde (~) serve a indicare un segnale activelow (true quando low). A differenza delle schede Arduino più piccole, le schede Mega sono in grado di utilizzare SRAM esterna. Tabella 3-15 - Le assegnazioni dei pin su Arduino Mega e Mega2560.
Pin sulla scheda Mega
N° pin sul chip
Funzione
Pin sulla scheda Mega
N° pin sul chip
Funzione
0
2
RXD0
35
55
I/O (A10)
1
3
TXD0
36
54
I/O (A9)
2
5
OC3B [PWM]
37
53
I/O (A8)
3
6
OC3C [PWM]
38
50
T0
4
1
OC0B [PWM]
39
70
I/O (ALE)
5
4
OC3A [PWM]
40
52
I/O (~RD)
6
15
OC4A [PWM]
41
51
I/O (~WR)
7
16
OC4B [PWM]
42
42
PL7
8
17
OC4C [PWM]
43
41
PL6
9
18
OC2B [PWM]
44
40
OC5C [PWM]
10
23
OC2A [PWM]
45
39
OC5B [PWM]
11
24
OC1A [PWM]
46
38
OC5A [PWM]
12
25
OC1B [PWM]
47
37
T5
13
26
OC0A [PWM]
48
36
ICP5
14
64
TXD3
49
35
ICP4
15
63
RXD3
50
22
MISO
16
13
TXD2
51
21
MOSI
17
12
RXD2
52
20
SCK
18
46
TXD1
53
19
~SS
19
45
RXD1
54
97
A0 (ingresso analogico)
20
44
SDA
55
96
A1 (ingresso analogico)
21
43
SCL
56
95
A2 (ingresso analogico)
22
78
I/O (AD0)
57
94
A3 (ingresso analogico)
23
77
I/O (AD1)
58
93
A4 (ingresso analogico)
24
76
I/O (AD2)
59
92
A5 (ingresso analogico)
25
75
I/O (AD3)
60
91
A6 (ingresso analogico)
26
74
I/O (AD4)
61
90
A7 (ingresso analogico)
27
73
I/O (AD5)
62
89
A8 (ingresso analogico)
28
72
I/O (AD6)
63
88
A9 (ingresso analogico)
87
A10 (ingresso analogico)
86
A11 (ingresso analogico)
85
A12 (ingresso analogico)
84
A13 (ingresso analogico)
29
30
31
32
71
60
59
58
I/O (AD7)
I/O (A15)
I/O (A14)
I/O (A13)
64
65
66
67
33
34
57
56
I/O (A12)
68
I/O (A11)
69
83
82
A14 (ingresso analogico) A15 (ingresso analogico)
Figura 3-15 - I pin degli input degli interrupt sull’ATmega1280/2560.
Notate che i pin dal 22 al 37 e i pin 39, 40 e 41 possono essere utilizzati per accedere alla memoria esterna. Altrimenti, possono essere utilizzati come singoli pin I/O digitali.
Le caratteristiche elettriche La Tabella 3-16 mostra alcune delle caratteristiche elettriche fondamentali dei microcontroller ATmega1280/2560, sottolineandone il consumo energetico. Tabella 3-16 - Il consumo energetico dell’ATmega1280/2560.
Dispositivo
Parametro
Condizione
VCC
Tipico
Max
ATmega1280
Corrente di alimentazione
Attivo 8 MHz
5 V
10 mA
14 mA
ATmega2560
Corrente di alimentazione
Inattivo 8 MHz
5 V
2,7 mA
4 mA
WDT attivato
15 uA
entrambi
Modalità risparmio energetico
WDT disattivato
3 V 3 V
1 se si è verificato un errore. Nella modalità sincrona, hangCall() restituisce 1 se si risponde alla chiamata e 0 in caso contrario.
retrieveCallingNumber()
Ricava il numero che chiama e lo inserisce in un buffer. Il buffer dell’argomento è un puntatore a un buffer di caratteri e bufsize è la dimensione del buffer, espressa in byte. Il buffer deve essere sufficientemente grande da contenere almeno 10
caratteri. Nella modalità asincrona, retrieveCallingNumber() restituisce 0 se l’ultimo comando è ancora in esecuzione, 1 se è stato eseguito correttamente e >1 se si è verificato un errore. Nella modalità sincrona, retrieveCallingNumber() restituisce 1 se il numero è stato acquisito correttamente e 0 in caso contrario.
La classe GSM_SMS Questa classe fornisce la possibilità di inviare e ricevere messaggi SMS (Short Message Service). beginSMS()
Definisce il numero di telefono per ricevere un messaggio SMS. Il numero di telefono è un array di caratteri. Nella modalità asincrona, la funzione restituisce 0 se l’ultimo comando è ancora attivo, 1 se è stato eseguito correttamente e un valore >1 se si è verificato un errore. Nella modalità sincrona, la funzione restituisce 1 se il comando precedente è stato eseguito correttamente e 0 in caso contrario.
ready()
Restituisce lo stato dell’ultimo comando GSM SMS. Nella modalità asincrona, ready() restituisce 0 se l’ultimo comando è ancora attivo, 1 se è stato eseguito correttamente e un valore >1 se si è verificato un errore. Nella modalità sincrona, la funzione restituisce 1 se il comando precedente è stato eseguito correttamente e 0 in caso contrario.
endSMS()
Si utilizza per informare il modem del fatto che il messaggio è completo e pronto per essere inviato. Nella modalità asincrona, la funzione restituisce 0 se è ancora in esecuzione, 1 se è stato eseguito correttamente e >1 se si è verificato un errore. Nella modalità sincrona, restituisce 1 se è stato eseguito correttamente e 0 in caso contrario.
available()
Se un messaggio SMS è disponibile per essere letto, questa funzione restituisce il numero di caratteri che contiene. Se non è disponibile nessun messaggio, restituisce 0.
remoteNumber()
Estrae il numero di telefono remoto da un messaggio SMS in arrivo e lo restituisce in un array di caratteri. L’argomento size definisce la dimensione massima dell’array passato a remoteNumber(). Nella modalità asincrona, la funzione restituisce 0 se è ancora in esecuzione, 1 se è stato eseguito correttamente e >1 se si è verificato un errore. Nella modalità sincrona, la funzione restituisce 1 se è stato eseguito correttamente, 0 in caso contrario.
read()
Legge un byte (un carattere) da un messaggio SMS. Restituisce il byte nella forma di un numero intero, oppure -1 se non ci sono dati disponibili.
write()
Scrive un carattere in dimensione di byte in un messaggio SMS.
print()
Scrive un array di caratteri in un messaggio SMS. Restituisce il numero di byte che è riuscito a scrivere.
peek()
Restituisce il byte (un carattere) disponibile successivo di un messaggio SMS, senza eliminare il carattere, oppure -1 se non ci sono dati disponibili.
flush()
Cancella dal modem tutti i messaggi inviati dopo che sono stati inviati tutti i caratteri in uscita.
La classe GPRS GPRS è la classe di base di tutte le funzioni GPRS. Questo include le funzioni client e
server per Internet. Questa classe è inoltre responsabile di includere i file coinvolti con la comunicazione TCP. attachGPRS()
Si collega con un determinato APN (access point name) per iniziare comunicazioni GPRS. I provider di reti cellulari dispongono di APN che fungono da ponti tra la rete
cellulare e Internet. Restituisce una di queste stringhe: ERROR, IDLE, CONNECTING, GSM_READY, GPRS_READY, TRANSPARENT_CONNECTED.
La classe GSMClient Questa classe crea client che possono collegarsi a server e inviare e ricevere dati. ready()
Restituisce lo stato dell’ultimo comando. Nella modalità asincrona, la funzione restituisce 0 se è ancora in esecuzione, 1 se è stato eseguito correttamente e >1 se si è verificato un errore. Nella modalità sincrona, la funzione restituisce 1 se è stato eseguito correttamente e 0 in caso contrario.
connect()
Si collega a porta specifica di un indirizzo IP specificato. Restituisce true se il collegamento è avvenuto correttamente, oppure false in caso contrario.
beginWrite()
Inizia un’operazione di scrittura sul server collegato.
write()
Scrive dati su un server collegato. Restituisce il numero di byte scritti.
endWrite()
Smette di scrivere dati su un server collegato.
connected()
Restituisce lo stato del collegamento di un client. Notate che un client si considera collegato se la connessione è stata chiusa ma nel buffer ci sono dati che non sono stati ancora letti. Restituisce true se il client è collegato, oppure false in caso contrario.
read()
Legge il byte di dati successivo e disponibile proveniente dal server con il quale è collegato il client. Restituisce il byte successivo, oppure -1 se non ci sono dati disponibili.
available()
Restituisce il numero di byte provenienti dal server collegato e che sono in attesa di essere letti.
peek()
Restituisce il byte successivo e disponibile di un messaggio in arrivo senza eliminarlo dal buffer. Le chiamate successive a peek() si limitano a restituire lo stesso byte.
flush()
Elimina tutti i dati attualmente in attesa nel buffer e resetta il conteggio dei dati disponibili riportandolo a zero.
stop()
Forza la disconnessione dal server.
La classe GSMServer La classe GSMServer crea server che possono inviare dati a client collegati e riceverne da essi. Implementa funzionalità server di rete, simili a quelli delle librerie Ethernet e WiFi. Notate che alcuni operatori di rete non ammettono connessioni di rete in entrata provenienti dall’esterno delle loro reti. ready()
Restituisce lo stato dell’ultimo comando. Nella modalità asincrona, questa funzione restituisce 0 se è ancora in esecuzione, 1 se è stato eseguito correttamente e >1 se si è verificato un errore. Nella modalità sincrona, la funzione restituisce 1 se è stato eseguito correttamente e 0 in caso contrario.
beginWrite()
Inizia un’operazione di scrittura su tutti i client collegati.
write()
Scrive dati sui client collegati. Restituisce il numero di byte scritti.
endWrite()
Interrompe la scrittura dei dati sui client collegati.
read()
Legge il byte successivo disponibile, proveniente da un client collegato. Restituisce il byte letto, oppure -1 se non ci sono dati disponibili.
available()
Rimane in attesa di richieste di collegamento da parte dei client. Restituisce il numero di client collegati.
stop()
Fa in modo che il server smetta di aspettare le richieste di collegamento dei client.
La classe GSMModem La classe GSMModem mette a disposizione funzioni diagnostiche di supporto per i modem GSM interni. begin()
Controlla lo stato del modem e lo riavvia. Questa funzione deve essere chiamata prima di chiamare getIMEI(). Restituisce 1 se il modem funziona correttamente, oppure un errore in caso contrario.
getIMEI()
Chiede al modem di ricavare il suo numero IMEI (International Mobile Equipment Identifier). Il numero IMEI viene restituito in forma di stringa. Questa funzione deve essere chiamata soltanto dopo una chiamata a begin().
La classe GSMScanner
La classe GSMScanner fornisce funzioni per ottenere informazioni diagnostiche sul network e sull’operatore. begin()
Resetta il modem. Restituisce 1 se il modem sta funzionando correttamente, un codice di errore in caso contrario.
getCurrentCarrier()
Restituisce il nome dell’attuale network server provider (l’operatore) in forma di stringa.
getSignalStrength()
Restituisce la potenza relativa di segnale del collegamento di rete in forma di stringa, con cifre ASCII da 0 a 31 (31 indica che la potenza è > 51 dBm), oppure 99 se non viene rilevato nessun segnale.
readNetworks()
Cerca operatori di rete disponibili. Restituisce una stringa che contiene l’elenco degli operatori rilevati.
La classe GSMPIN La classe GSMPIN contiene funzioni utility per comunicare con la scheda SIM. begin()
Resetta il modem. Restituisce 1 se il modem sta funzionando correttamente, un codice di errore in caso contrario.
isPIN()
Esamina la scheda SIM per determinare se è bloccata con un PIN o meno. Restituisce 0 se il blocco per mezzo del PIN è disattivato, 1 se il blocco è attivato, -1 se è attivato il blocco per mezzo del PUK e -2 se si è verificato un errore.
checkPIN()
Invia un PIN alla scheda SIM per determinare se è valido o meno. Restituisce 0 se il PIN è valido e -1 se non lo è.
checkPUK()
Invia un codice PUK alla scheda SIM per determinare se è valido e stabilisce una nuovo codice PIN. Restituisce 0 se tutto è avvenuto correttamente e -1 in caso contrario.
changePIN()
Cambia il codice PIN di una scheda SIM dopo aver verificato che il vecchio PIN sia valido.
switchPIN()
Cambia lo stato di blocco per mezzo del PIN.
checkReg()
Cerca di determinare se il modem è registrato in una rete GSM/GPRS. Restituisce 0 se il modem è registrato, 1 se il modem è in roaming e -1 se si è verificato un errore.
getPINUsed()
Cerca di determinare se si sta utilizzando il blocco del PIN. Restituisce true se è attivato e false in caso contrario.
setPINUsed()
Imposta lo stato del blocco del PIN. Se l’argomento è true, il PIN è bloccato; se è false, è sbloccato.
La classe GSMBand La classe GSMBand fornisce informazioni sulla banda di frequenza alla quale si collega il modem. Esistono anche metodi per impostare la banda. begin()
Resetta il modem. Restituisce 1 se il modem sta funzionando correttamente, un codice di errore in caso contrario.
getBand()
Restituisce la banda di frequenza che sta attualmente utilizzando il modem per collegarsi.
setBand()
Imposta la banda di frequenza che che deve utilizzare il modem.
LiquidCrystal Questa classe permette a una scheda Arduino di controllare un modulo LCD (liquid crystal display). È pensata specificamente per LCD che si basano sul chipset Hitachi HD44780 (o compatibile), che si trova sulla maggior parte degli LCD basati sul testo. La libreria supporta la modalità di interfaccia sia a 4 che a 8 bit e utilizza anche tre dei pin di Arduino per le linee di controllo RS (register select), clock enable e R/W (read/write, lettura/scrittura). LiquidCrystal()
Crea un’istanza di un oggetto di classe LiquidCrystal. Le diverse forme della classe permettono di adattarla a diversi metodi di interfaccia LCD.
Dove: rs rw enable d0 .. d7
Il pin di Arduino collegato al pin RS dell’LCD Il pin di Arduino collegato al pin RW dell’LCD Il pin di Arduino collegato al pin enable dell’LCD I pin di Arduino collegati ai pin dati dell’LCD
L’utilizzo dei segnali d4, d5, d6 e d7 è facoltativo. Se vengono utilizzate soltanto quattro linee digitali, questi possono essere omessi. Esempio:
begin()
Inizializza l’interfaccia sul controller LCD del modulo LCD. Gli argomenti specificano la larghezza e l’altezza dell’LCD. La dimensione predefinita dei caratteri è 5 × 8 pixel.
Questa funzione deve essere chiamata prima che possa essere utilizzata qualsiasi altra funzione della libreria LCD.
clear()
Cancella gli schermi LCD e riporta il cursore nell’angolo in alto a sinistra.
home()
Posiziona il cursore in alto a sinistra sull’LCD. Non cancella l’LCD: per farlo si deve utilizzare la funzione clear().
setCursor()
Posiziona il cursore nel punto specificato dagli argomenti column e row.
write()
Scrive un byte (char) di dati sull’LCD. Restituisce il numero di byte scritti.
print()
Questa funzione in realtà fa parte del codice standard di runtime AVR-GCC di Arduino ed è overloaded in modo che possa accettare dati di diversi tipi. Il file Print.h, che si trova in hardware/arduino/avr/cores/arduino/Print.h, definisce queste forme della funzione print():
cursor()
Attiva il cursore, un carattere di sottolineatura, nella posizione dove verrà scritto il carattere successivo sullo schermo LCD.
noCursor()
Disattiva il cursore, in realtà nascondendolo. Non ha conseguenze sulla posizione dove apparirà il carattere successivo.
blink()
Fa apparire un cursore lampeggiante.
noBlink()
Disattiva il cursore lampeggiante.
display()
Attiva l’LCD, se prima era stato disattivato con la funzione noDisplay(). Ripristina il cursore e tutto il testo che prima era visibile o che può essere stato aggiunto, cancellato o modificato a partire dal momento in cui il display è stato disattivato.
noDisplay()
Disattiva il display LCD senza alterare il testo esistente sullo schermo.
scrollDisplayLeft()
Fa scorrere il testo sul display di uno spazio a sinistra.
scrollDisplayRight()
Fa scorrere il testo sul display di uno spazio a destra.
autoscroll()
Attiva lo scorrimento automatico. Quando nel display viene aggiunto del testo, sposta i caratteri esistenti di uno spazio a sinistra oppure a destra, a seconda della direzione corrente del testo.
noAutoscroll()
Disattiva la funzione di scorrimento automatico dell’LCD.
leftToRight()
Imposta la direzione nella quale scorre il testo quando si attiva lo scorrimento automatico, in questo caso da sinistra a destra.
rightToLeft()
Imposta la direzione nella quale scorre il testo quando si attiva lo scorrimento automatico, in questo caso da destra a sinistra.
createChar()
Crea un carattere personalizzato di 5 × 8 pixel. Il carattere è definito da un array di byte, uno per riga. Vengono utilizzati soltanto gli ultimi cinque bit meno significativi di ciascun byte.
SD La libreria SD fornisce il supporto per leggere e scrivere schede di memoria flash SD, sia a dimensione normale che micro (in termini di interfaccia e di funzioni sono identiche, cambia soltanto la dimensione). La libreria si basa su sdfatlib di William Greiman. Questa libreria tratta una scheda SD come se fosse un piccolo disco con filesystem FAT16 o FAT32. Utilizza nomi di file corti (formato 8.3). I nomi di file passati alle funzioni della libreria SD possono includere un percorso, con nomi di directory separati da barre (come quelle di Linux, non le barre invertite che si utilizzano su MS-DOS o su Windows). Per comunicare con la scheda SD si utilizza l’interfaccia SPI. Su una scheda Arduino standard, questa utilizza i pin digitali 11, 12 e 13. Come pin select si utilizza un ulteriore pin, di solito il pin 10, oppure questo ruolo può essere assegnato a un altro pin. Notate che anche se per select si utilizza un altro pin, perché la libreria funzioni il pin SS (pin 10) deve rimanere utilizzato come output. La classe SD La classe SD fornisce funzioni per accedere alla scheda SD e manipolare file e cartelle. begin()
Inizializza la libreria SD e l’interfaccia con la scheda SD. L’argomento facoltativo csPin definisce il pin da utilizzare come select. L’opzione predefinita è il pin 10 (SD_CHIP_SELECT_PIN). Questa funzione deve essere chiamata prima che possano essere utilizzate tutte le altre funzioni SD. Restituisce true se tutto è avvenuto correttamente, false in caso contrario.
exists()
Verifica la presenza di un file o di una directory sulla scheda SD. La stringa filepath può essere un FQPN (fully qualified path name). Restituisce true se il file o la directory esiste, false in caso contrario.
mkdir()
Crea una directory sulla scheda SD. Crea anche tutte le directory intermedie necessarie. Restituisce true se la directory viene creata correttamente, false in caso contrario.
open()
Apre un file su una scheda SD, per leggerlo oppure scriverlo. Se non viene fornito l’argomento mode, l’opzione predefinita è aprire il file per leggerlo. Restituisce un oggetto File che può essere verificato come un valore booleano. Se il file non può essere aperto, File produce false. Le modalità disponibili sono FILE_READ e FILE_WRITE.
remove()
Elimina (rimuove) un file dalla scheda SD. filepath è un FQPN. Restituisce true se tutto è avvenuto correttamente, false in caso contrario.
rmdir()
Elimina un’eventuale cartella vuota da una scheda SD. Restituisce true se la directory è stata eliminata correttamente, oppure false se si è verificato un errore (per esempio se la directory non era vuota).
La classe File La classe File fornisce funzioni per leggere e scrivere singoli file su una scheda SD. Gli oggetti di tipo File sono creati dalla funzione SD.open():
Nell’oggetto File esistono numerosi metodi per manipolare i contenuti di un file: available()
Restituisce il numero di byte disponibili da leggere su un file.
close()
Chiude un file, assicurando che prima vengano scritti tutti i dati rimanenti.
flush()
Scrive nel file i dati rimanenti in un buffer. Non chiude il file.
peek()
Legge un byte in un file senza far avanzare il puntatore di dati interno. Le chiamate successive a peek() restituiscono lo stesso byte.
position()
Restituisce la posizione corrente nel file a partire dalla quale verrà letto o scritto il prossimo byte.
print()
Scrive dati in un file che è stato aperto per essere scritto. Accetta dati di tipo char, byte (uint8_t), int, long o string. Può anche accettare una base specificata. I tipi validi di base sono BIN (binario), DEC (base 10), OCT (base 8) e HEX (base 16). Restituisce il numero di byte scritti.
Nota: in questo esempio è mostrata la stringa data. println()
Scrive dati in un file che è stato aperto per essere scritto, seguiti da una coppia di caratteri ritorno a capo e nuova riga. Accetta dati di tipo char, byte (uint8_t), int, long o string. Può anche accettare una base specificata. I tipi validi di base sono BIN (binario), DEC (base 10), OCT (base 8) e HEX (base 16). Restituisce il numero di byte scritti.
seek()
Sposta il puntatore interno in una nuova posizione nel file. La posizione deve essere compresa tra 0 e la dimensione del file inclusi. Restituisce true se tutto è stato eseguito correttamente, oppure false se si verifica un errore (si cerca oltre la fine del file, per esempio).
size()
Restituisce la dimensione del file, in byte.
read()
Legge il byte successivo nel file, oppure restituisce un valore di -1 se non ci sono dati disponibili.
write()
Scrive dati in un file. Accetta un unico byte, oppure un oggetto dati che può essere un byte, un carattere o una stringa. L’argomento size definisce la quantità di dati da scrivere sulla scheda SD. Restituisce il numero di byte scritti.
isDirectory()
Restituisce true se l’oggetto fname si riferisce a una directory, altrimenti restituisce false.
openNextFile()
Apre la successiva cartella di file in una directory e restituisce una nuova istanza di un oggetto File.
rewindDirectory()
Questa funzione, che si utilizza con openNextFile(), restituisce il primo file o la prima sottocartella in una directory.
Servo La libreria Servo è una raccolta di funzioni per controllare servomotori, come quelli che si utilizzano sugli aereini RC. Una volta creata un’istanza della classe Servo, si utilizza la
funzione attach() per passare il numero di pin da utilizzare con il servo. Gli impulsi che controllano un servo vengono generati in background. La classe si istanzia così:
attach()
Associa un servomotore a un pin I/O. La seconda forma permette al chiamante di specificare i valori minimo e massimo di tempo di scrittura in microsecondi. Restituisce il numero del canale o 0 se la funzione non riesce nel suo intento.
write()
Imposta l’angolo del servo in gradi. Se il valore è > un’ampiezza di impulso in microsecondi.
200
viene trattato come
read()
Restituisce l’ultima ampiezza di impulso del servo scritta nella forma di un angolo compreso tra 0 e 180 gradi.
writeMicroseconds()
Imposta l’ampiezza di impulso del servo in microsecondi.
readMicroseconds()
Restituisce l’ampiezza di impulso corrente di questo servo in microsecondi.
attached()
Restituisce true se l’oggetto servo è stato associato a un servo fisico.
detach()
Impedisce a un oggetto servo associato di generare impulsi sul pin I/O che gli è stato assegnato.
SPI La libreria SPI supporta l’utilizzo del bus Serial Peripheral Interface (SPI) per la
comunicazione con periferiche compatibili con SPI, di solito chip con interfaccia SPI integrata. Può essere utilizzata anche per le comunicazioni tra due microcontroller. La classe SPISettings serve a configurare la porta SPI. Gli argomenti sono combinati in un unico oggetto SPISettings, che viene passato a SPI.beginTransaction().
Esempio:
beginTransaction()
Inizializza l’interfaccia SPI usando le impostazioni definite in un oggetto SPISettings.
endTransaction()
Interrompe la comunicazione con l’interfaccia SPI. Di solito viene chiamato dopo che il pin select è de-asserted per permettere ad altre librerie di utilizzare l’interfaccia SPI.
usingInterrupt()
Si utilizza quando le comunicazioni SPI devono avere luogo all’interno del contesto di un interrupt.
begin()
Avvia la libreria SPI e inizializza l’interfaccia SPI. Imposta i pin SCK, MOSI e SS sulla modalità di output e imposta SCK e MOSI su low mentre SS è high.
end()
Disattiva l’interfaccia SPI ma non modifica le modalità dei pin (in o out).
transfer()
Trasferisce un byte sull’interfaccia SPI, inviando o ricevendo.
setBitOrder()
Imposta l’ordine dei bit shiftati verso l’interfaccia 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 l’interfaccia 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 l’interfaccia SPI si deve utilizzare la funzione beginTransaction().
setDataMode()
Imposta la polarità del clock e la fase dell’interfaccia SPI. Questa funzione non deve essere utilizzata con progetti nuovi. Per configurare l’interfaccia 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 un’interfaccia seriale convenzionale e che si rivela utile quando sono necessarie più interfacce seriali, ma l’USART integrato nel microcontroller AVR è assegnato a qualche altra funzione (come un’interfaccia 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 un’interfaccia 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 l’input (rx) e per l’output (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à) dell’interfaccia seriale. Baud rate validi sono 300, 600, 1200, 2400, 4800, 9600, 14400, 19200, 28800, 31250, 57600 e 115200.
isListening()
Controlla l’interfaccia seriale per vedere se sta ascoltando gli input. Restituisce true se l’interfaccia sta aspettando attivamente input, false in caso contrario.
overflow()
Se l’input supera la dimensione di 64 byte del buffer di ricezione dell’oggetto SoftwareSerial, viene impostato un flag. Chiamare la funzione overflow() restituisce il flag. Se viene restituito true significa che si è verificato un overflow. Per cancellare il flag si deve chiamare la funzione overflow().
peek()
Restituisce il carattere più vecchio del buffer dell’input seriale, ma senza eliminarlo. Le chiamate successive restituiscono lo stesso carattere. Se nel buffer non ci sono byte, peek() restituisce -1.
read()
Restituisce un carattere proveniente da buffer di ricezione e lo elimina. Di solito la funzione read() si utilizza in un ciclo. Restituisce -1 se non ci sono dati disponibili. Notate che soltanto un’istanza di SoftwareSerial può ricevere dati in arrivo in un determinato momento. Per selezionare l’interfaccia attiva si utilizza la funzione listen().
print()
La funzione print() si comporta come la funzione Serial.print(): accetta tutti i tipi di dati che accetterebbe Serial.print(), che comprendono i tipi char, byte (uint8_t), int, long o string, e restituisce il numero di byte scritti.
println()
Identica alla funzione
serial.print(),
eccetto che per la coppia ritorno a
capo/nuova linea (carriage return/line feed, CR/LF) che aggiunge alla fine dell’output. Restituisce il numero di byte scritti. Se non viene fornito nessun dato, semplicemente emette un CR/LF.
listen()
Attiva il listening (la ricezione dei dati) in un’istanza di SoftwareSerial. Soltanto un’istanza di un oggetto SoftwareSerial può ricevere dati in un determinato momento e l’oggetto di cui viene chiamata la funzione listen() diventa il listener attivo. I dati che arrivano su altre istanze dell’interfaccia vengono eliminati.
write()
Trasmette dati dell’interfaccia seriale in forma di byte puri. Si comporta come la funzione Serial.write(). Restituisce il numero di byte scritti.
Stepper La libreria Stepper può essere utilizzata per controllare motori passo-passo sia unipolari che bipolari con l’hardware 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 all’inizio dello sketch, prima delle funzioni setup() e loop(). L’argomento steps definisce il numero di passi in una rivoluzione completa dell’albero di uscita del motore. Gli argomenti pin1, pin2, pin3 e pin4 specificano i pin digitali da utilizzare.
Esempio:
setSpeed()
Imposta la velocità (la cadenza dei passi) in termini di RPM. Non fa sì che il motore giri, ma si limita a impostare la velocità da utilizzare quando viene chiamata la funzione step().
step()
Chiede al motore di avanzare un determinato numero di passi. Un conteggio positivo fa girare il motore in una direzione e uno negativo lo fa girare nella direzione
opposta.
TFT La libreria TFT (thin-film transistor) display fornisce funzioni per disegnare testo, immagini e forme in un display TFT. È inclusa con le versioni 1.0.5 e successiva dell’IDE 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 anch’essa 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 anch’essa 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 (l’hardware SPI) e la seconda forma permette di specificare quali pin utilizzare:
Dove: cs dc rst mosi sclk
Pin select del chip Selezione modalità comando o dati Pin per il reset Pin utilizzato per MOSI se non si utilizza hardware SPI 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 l’oggetto 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 l’intero schermo del display con un colore a tinta unita. Può essere utilizzato per cancellare il display. Notate che in realtà lo schermo non può mostrare 256 livelli unici per colore, ma che utilizza 5 bit per i colori blu e rosso e 6 bit per il verde.
stroke()
Si chiama prima di disegnare sullo schermo e imposta il colore di linee e bordi. Come la funzione background(), stroke() utilizza 5 bit per i colori blu e rosso e 6 bit per il verde.
noStroke()
Elimina tutti i colori dei bordi.
fill()
Imposta il colore di riempimento di oggetti e testo sullo schermo. Come la funzione stroke(), fill() utilizza 5 bit per i colori blu e rosso e 6 bit per il verde.
noFill()
Disattiva i riempimenti di colore per oggetti e testo.
setTextSize()
Imposta la dimensione del testo scritto da una chiamata alla funzione text(). La dimensione predefinita del testo è 1, cioè 10 pixel. Ciascun aumento nella dimensione del testo aumenta l’altezza 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 un’altezza e una larghezza specificate.
width()
Rivela la larghezza dello schermo TFT espressa in pixel.
height()
Rivela l’altezza dello schermo TFT espressa in pixel.
circle()
Disegna un cerchio sul display con centro in (x, y) e raggio r.
image()
Disegna un’immagine caricata da una scheda SD sullo schermo in una posizione specificata.
loadImage()
Crea un’istanza di un oggetto PImage utilizzando il nome di file fornito. Il file dell’immagine deve essere di tipo BMP a 24 bit e deve risiedere nella directory root della scheda SD. Utilizza la funzione di PImage loadImage().
PImage
La classe PImage contiene funzioni per incapsulare e disegnare un’immagine bitmap in un display TFT. PImage.height()
Una volta che un’immagine è stata incapsulata in un oggetto PImage, si può chiedere la sua altezza. Questa funzione restituisce l’altezza nella forma di un valore di tipo int. PImage.width()
Restituisce la larghezza dell’oggetto di un’immagine incapsulata nella forma di un valore di tipo int. PImage.isValid()
Restituisce il valore booleano true se l’oggetto dell’immagine contiene un file bitmap valido, oppure false in caso contrario.
WiFi La libreria WiFi fornisce ad Arduino la capacità di collegarsi a una rete wireless. Le descrizioni offerte qui non definiscono tutte le funzioni disponibili nel dettaglio, dal momento che molte di loro sono simili o identiche a quelle che si trovano nella libreria Ethernet. L’aiuto integrato delle versioni più vecchie dell’IDE 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 dell’IDE, o almeno lo è sul mio sistema di sviluppo Kubuntu. La libreria WiFi si utilizza con la libreria SPI per comunicare con il modulo WiFi e una scheda di memoria SD opzionale. Un Arduino di tipo base (vedere Capitolo 4) comunica con la shield WiFi utilizzando i pin SPI 10, 11, 12 e 13. Le schede di tipo Mega utilizzano i pin 10, 50, 51 e 52. Inoltre, su una shield WiFi di Arduino, si utilizza il pin 7 come segnale di handshake tra Arduino e la shield WiFi, e quindi non lo si deve utilizzare per nessun altro scopo. Altre shield WiFi possono presentare gli stessi limiti. La shield WiFi di Arduino può fungere sia da server per accettare collegamenti in entrata, sia da client per creare un collegamento con un server esistente. La libreria mette a disposizione modalità di cifratura WEP e WPA2 Personal, ma non supporta la cifratura WPA2 Enterprise. Inoltre, se un nodo di un server non trasmette il suo SSID (Service Set Identifier), la shield WiFi non può creare un collegamento. Come la libreria Ethernet, la libreria WiFi è formata da una raccolta di cinque classi C++. Quasi tutte le classi ereditano dalle classi genitore, ma nella maggior parte delle applicazioni non ci si deve preoccupare dei dettagli. Tuttavia, se avete bisogno di vedere le definizioni di basso livello delle classi Client, Server, UDP e altre, le potete trovare nella directory libraries/WiFi nel codice sorgente di Arduino. Questo elenco mostra le cinque classi della libreria WiFi e le funzioni membro pubbliche di ciascuna di esse: •
Classe WiFi begin()
•
– disconnect() – config() – setDNS() – SSID() – BSSID() – RSSI() – encryptionType() – scanNetworks() – getSocket() – macAddress() Classe IPAddress
•
– localIP() – subnetMask() – gatewayIP() Classe Server
•
– WiFiServer() – begin() – available() – write() – print() – println() Classe Client
•
– WiFiClient() – connected() – connect() – write() – print() – println() – available() – read() – flush() – stop() Classe UDP – – –
begin() available() beginPacket()
– – – – – – – – –
endPacket() write() parsePacket() peek() read() flush() stop() remoteIP() remotePort()
NOTA La shield WiFi di Arduino WiFi si basa sul chip HDG204 802.11b/g. Ma bisogna fare attenzione, perché altre shield WiFi, come la shield WiFi di Adafruit basata sul chip WiFi TI CC3000, possono utilizzare una libreria diversa, specifica per un determinato chip WiFi. Molte delle funzionalità dovrebbero essere simili a quelle descritte qui, ma ci sono comunque alcune differenze da prendere in considerazione. La libreria Adafruit è disponibile su GitHub (http://bit.ly/ada-cc3000). Trovate maggiori dettagli sul sito web di Adafruit (http://bit.ly/ada-cc3000-wifi).
La classe WiFi Ecco un riepilogo veloce delle classi WiFi. Trovate le descrizioni delle funzioni nella parte dedicata alla libreria Ethernet. La classe WiFi contiene funzioni per inizializzare la libreria e le impostazioni di rete. La definizione della classe si trova nel file include WiFi.h.
La classe IPAddress Come IPAddress della libreria Ethernet, la classe IPAddress della libreria WiFi funge da contenitore per contenere informazioni sulla configurazione di rete.
La classe Server La classe Server crea server che possono accettare collegamenti richiesti da client per scambiare dati. Un client può essere un altro Arduino con una shield WiFi, un computer desktop, un computer portatile o qualsiasi altro dispositivo con funzionalità compatibili con WiFi. Trovate le descrizioni di print() e println() in “La classe Server: EthernetServer” a pagina 168.
La classe Client La classe Client crea client WiFi che possono collegarsi a server per poter inviare e ricevere dati. Un server può essere un altro Arduino con una shield WiFi, un computer desktop, un computer portatile o qualsiasi altro dispositivo con funzionalità compatibili con WiFi. Trovate le descrizioni di print() e println() in “La classe Server:
EthernetServer” a pagina 168.
La classe UDP La classe UDP permette di inviare e di ricevere messaggi brevi utilizzando il protocollo UDP. A differenza di TCP/IP, che è un protocollo di streaming (cioè che non ha limiti definiti di inizio e fine), UDP è un protocollo di datagramma. In questo caso, ciascun elemento di dati è un singolo pacchetto, detto datagramma, e i dati devono entrare nei limiti del pacchetto del datagramma. UDP non è dotato di rilevamento degli errori, né garantisce la consegna dei dati, ma, nel caso di pacchetti corti di dati non fondamentali, o dove il software di livello superiore è in grado di gestire cose come il rilevamento degli errori e i nuovi tentativi, rappresenta un modo veloce e relativamente semplice di spostare dati tra host.
Wire La libreria Wire serve a comunicare con dispositivi di tipo TWI o I2C. Nei Capitoli 2 e 3 trovate ulteriori informazioni sulle funzionalità TWI dei microcontroller AVR. Il Capitolo 8 descrive alcune shield che utilizzano I2C per le comunicazioni con Arduino. E qui di seguito trovate una tabella che definisce dove si trovano i pin TWI su vari tipi di schede Arduino. Nel Capitolo 4 potete osservare i diagrammi dei pinout delle schede. Scheda
SDA SCL
Uno, Ethernet
A4
A5
Mega2560
20
21
Leonardo
2
3
Il cuore della libreria Wire è la classe TwoWire. Esempio:
begin()
Inizializza la libreria TWI e attiva l’interfaccia I2C in modalità master oppure servant. Se non è specificato l’indirizzo, per impostazione predefinita l’interfaccia I2C entra in modalità master.
requestFrom()
Utilizzata dal master dell’interfaccia per richiedere dati a un dispositivo servant. I byte di dati sono ricavati con le funzioni available() e read(). Restituisce il numero di byte di dati letti sul dispositivo.
beginTransmission()
Dà inizio a una trasmissione di dati a un dispositivo I2C servant presso l’indirizzo specificato. I dati sono messi in coda per la trasmissione utilizzando la funzione
write() e poi vengono endTransmission().
effettivamente trasmessi utilizzando la funzione
endTransmission()
Trasmette i byte che sono stati messi in coda da write() a un dispositivo servant e quindi pone fine a una trasmissione che è stata iniziata da beginTransmission().
write()
Scrive i dati forniti a una coda per la trasmissione da un dispositivo master a uno servant, oppure da un dispositivo servant a uno master in risposta a una richiesta di dati. Restituisce il numero di byte scritti nella cosa.
available()
Restituisce il numero di byte disponibili per la funzione read(). Chiamata da un dispositivo master dopo una chiamata a requestFrom() e su un dispositivo servant dopo un evento di ricezione di dati.
read()
Legge un byte che è stato trasferito da master a servant o viceversa.
onReceive()
Registra la funzione da chiamare (una funzione handler) quando un dispositivo servant riceve dati da un master.
onRequest()
Registra la funzione da chiamare quando un master richiede dati da un dispositivo servant.
Esplora La libreria Esplora di Arduino offre una serie di funzioni per interfacciarsi facilmente con i
sensori e gli attuatori della scheda Esplora per mezzo della classe Esplora. Trovare maggiori informazioni sul pinout nel Capitolo 4. I sensori disponibili sulla scheda sono: •
Joystick analogico a due assi
•
Pulsante a pressione centrale del joystick
•
Quattro pulsanti a pressione
•
Microfono
•
Sensore di luminosità
•
Sensore di temperatura
•
Accelerometro a tre assi
•
Due connettori di input TinkerKit
Gli attuatori disponibili sulla scheda sono: •
LED RGB (Red-Green-Blue) alta luminosità
•
Cicalino piezo
•
2 connettori di output TinkerKit output
Esplora()
Crea un’istanza di un oggetto Esplora.
readSlider()
Restituisce un valore intero che corrisponde alla posizione corrente del controllo cursore. Il valore può essere compreso tra 0 e 1023.
readLightSensor()
Restituisce un valore intero che corrisponde alla quantità di luce che tocca il sensore di luminosità della scheda Esplora.
readTemperature()
Restituisce un intero con segno con la temperatura corrente dell’ambiente espressa in Fahrenheit oppure Celsius. L’argomento scale accetta sia DEGREES_C sia DEGREES_F. Gli intervalli di temperatura sono da –40C a 150C e da –40F a 302F.
readMicrophone()
Restituisce un valore intero che corrisponde alla quantità di rumore d’ambiente rilevato dal microfono. Il valore restituito può essere compreso tra 0 e 1023.
readJoystickSwitch()
Legge il pulsante del joystick e restituisce 0 oppure 1023. Un’alternativa è la funzione read JoystickButton().
readJoystickButton()
Legge il pulsante del joystick e restituisce LOW oppure HIGH (premuto o non premuto). Questa funzione si comporta esattamente come readJoystickSwitch(), ma restituisce un valore consistente con la funzione readButton().
readJoystickX()
Restituisce la posizione sull’asse x del joystick, nella forma di un valore compreso tra –512 e 512.
readJoystickY()
Restituisce la posizione sull’asse y del joystick, nella forma di un valore compreso tra –512 e 512.
readAccelerometer()
Restituisce il valore corrente di un asse selezionato e i valori possibili per l’argomento axis sono X_AXIS, Y_AXIS e Z_AXIS. Se il valore restituito è 0, significa che l’accelerometro è perpendicolare alla direzione della gravità, mentre valori positivi o negativi indicano la direzione e la velocità dell’accelerazione.
readButton()
Legge lo stato corrente di un determinato pulsante della Esplora. Restituisce un valore low (false) se il pulsante è premuto, oppure un valore high (true) in caso contrario.
writeRGB()
Scrive una serie di valori che definiscono i livelli di luminosità degli elementi rosso,
verde e blu del LED RGB della Esplora.
writeRed()
Accetta un argomento che definisce la luminosità del LED rosso con un intervallo che va da 0 a 255.
writeGreen()
Accetta un argomento che definisce la luminosità del LED verde con un intervallo che va da 0 a 255.
writeBlue()
Accetta un argomento che definisce la luminosità del LED blu con un intervallo che va da 0 a 255.
readRed()
Restituisce l’ultimo valore utilizzato per impostare la luminosità del LED rosso.
readGreen()
Restituisce l’ultimo valore utilizzato per impostare la luminosità del LED verde.
readBlue()
Restituisce l’ultimo valore utilizzato per impostare la luminosità del LED blu.
tone()
Emette un tono con l’annunciatore 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 l’utilizzo della funzione tone() interferisce con il controllo del livello del LED rosso.
noTone()
Termina l’output del segnale a onde quadre dell’annunciatore.
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 l’host è 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 l’utilizzo dei tasti modificatori.
I tasti modificatori cambiano il comportamento di un altro tasto quando vengono premuti simultaneamente. La Tabella 7-1 elenca i tasti modificatori supportati dalla scheda Leonardo. Tabella 7-1 - I tasti modificatori della tastiera USB.
Tasto
Valore esadecimale
Valore decimale
Tasto
Valore esadecimale
KEY_LEFT_CTRL
0x80
128
KEY_PAGE_UP
0xD3
KEY_LEFT_SHIFT
0x81
129
KEY_PAGE_DOWN
0xD6
KEY_LEFT_ALT
0x82
130
KEY_HOME
0xD2
KEY_LEFT_GUI
0x83
131
KEY_END
0xD5
KEY_RIGHT_CTRL
0x84
132
KEY_CAPS_LOCK
0xC1
KEY_RIGHT_SHIFT
0x85
133
KEY_F1
0xC2
KEY_RIGHT_ALT
0x86
134
KEY_F2
0xC3
KEY_RIGHT_GUI
0x87
135
KEY_F3
0xC4
KEY_UP_ARROW
0xDA
218
KEY_F4
0xC5
KEY_DOWN_ARROW
0xD9
217
KEY_F5
0xC6
KEY_LEFT_ARROW
0xD8
216
KEY_F6
0xC7
KEY_RIGHT_ARROW
0xD7
215
KEY_F7
0xC8
KEY_BACKSPACE
0xB2
178
KEY_F8
0xC9
KEY_TAB
0xB3
179
KEY_F9
0xCA
KEY_RETURN
0xB0
176
KEY_F10
0xCB
KEY_ESC
0xB1
177
KEY_F11
0xCC
KEY_INSERT
0xD1
209
KEY_F12
0xCD
Altre librerie Esistono molte altre librerie disponibili per le schede Arduino. Alcune sono state create da individui, altre da società che vendono e supportano hardware e accessori per Arduino. Inoltre, alcuni distributori forniscono anche librerie o software di supporto per i loro prodotti e questo codice spesso si trova cercandolo sul sito web adatto oppure su eBay. Le Tabelle dalla 7-2 alla 7-8 elencano una selezione di queste librerie, suddivise in categorie. Le descrizioni sono necessariamente brevi: è davvero impossibile descriverle tutte in modo sufficiente da rendere loro giustizia mantenendo il libro in un formato compatto. Trovate i link per maggiori dettagli su http://www.arduino.cc/en/Reference/Libraries. Tabella 7-2 - Comunicazione (reti e protocolli).
Libreria
Descrizione
Messenger
Per elaborare messaggi di testo provenienti dal computer
NewSoftSerial
Una versione migliorata della libreria SoftwareSerial
OneWire
Per controllare dispositivi (di Dallas Semiconductor) che utilizzano il protocollo One Wire
PS2Keyboard
Per leggere caratteri provenienti da una tastiera PS2
Simple Message System
Per inviare messaggi tra Arduino e il computer
SSerial2Mobile
Per inviare messaggi di testo o email utilizzando un telefono cellulare (con comandi AT via SoftwareSerial)
Webduino
Una libreria server web che si può estendere (da utilizzare con la shield Ethernet di Arduino)
X10
Per inviare segnali X10 su linee di alimentazione AC
XBee
Per comunicare con XBee in modalità API
SerialControl
Per controllare in remoto altre schede Arduino per mezzo di un collegamento seriale
Tabella 7-3 - Percezione.
Libreria
Descrizione
Capacitive Sensing
Per convertire due o più pin in sensori capacitivi
Debounce
Per leggere input digitali con disturbo (per esempio provenienti da pulsanti)
Tabella 7-4 - Display e LED.
Libreria
Descrizione
GFX
Classe di base con routine grafiche standard (di Adafruit Industries)
GLCD
Routine grafiche per LCD basate su chipset KS0108 o equivalente
LedControl
Per controllare matrici di LED o display a 7 segmenti con un MAX7221 o un MAX7219
LedControl
Un’alternativa alla libreria Matrix per gestire diversi LED con chip Maxim
LedDisplay
Per controllare un display di LED scorrevole HCMS-29xx
Matrix
Libreria di base per manipolare matrici di LED
PCD8544
Per il controller LCD su dispositivi di tipo Nokia 55100 (di Adafruit Industries)
Sprite ST7735
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 (di Adafruit Industries)
Tabella 7-5 - Audio e forme d’onda.
Libreria
Descrizione
FFT
Per analizzare la frequenza di audio o altri segnali analogici
Tone
Per generare onde quadre di frequenze audio sullo sfondo su un pin del microcontroller
Tabella 7-6 - Motori e PWM.
Libreria TLC5940
Descrizione Per controllare il TLC5940 IC, un’unità PWM da 16 canali e 12 bit
Tabella 7-7 - Timing.
Libreria
Descrizione
DateTime
Una libreria per tenere traccia di data e ora correnti nel software
Metro
Aiuta a temporizzare azioni a intervalli regolari
MsTimer2
Utilizza l’interrupt del timer 2 per lanciare un’azione ogni N millisecondi
Tabella 7-8 - Utility.
Libreria
Descrizione
PString
Una classe leggera per stampare sui buffer
Streaming
Una libreria che semplifica le dichiarazioni di stampa
8 Le shield
Una shield Arduino è una scheda a circuito aggiuntiva progettata per lavorare con i connettori che si trovano sulle schede Arduino standard come la Uno, la Duemilanove, la Leonardo, oppure la Mega. Le shield sono dotate di pin che si interfacciano con Arduino in modo che l’alimentazione, 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 l’altra, 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 l’intenzione 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 l’alimentazione e i segnali ai pin adatti sulla scheda Arduino).
Le caratteristiche elettriche delle shield Se confrontare i diagrammi dei pinout delle varie shield presentate in questo capitolo, potete notare un modello regolare: le shield che utilizzano un’interfaccia a due fili (l’interfaccia TWI o I2C) utilizzano sempre i pin A4 e A5 di Arduino. Su una scheda di tipo base (Diecimila, Duemilanove e Uno R2 o SMD), questi si trovano sul connettore I/O analogico, mentre sul layout esteso delle schede più recenti (Uno R3, Ethernet, Leonardo), i segnali appaiono anche sulle estensioni dei pin-header (nell’angolo in alto accanto al connettore USB o RJ45). Una shield che utilizza I2C può utilizzare una qualsiasi delle serie di pin e potete dare per scontato che A4 e A5 non saranno disponibili per altri usi senza intervenire con la programmazione. Per lo stesso motivo, le shield che utilizzano l’interfaccia SPI di solito utilizzano i pin D10, D11, D12 e D13 (SS, MOSI, MISO e SCK, rispettivamente). L’utilizzo di D10 come pin select è opzionale e per questo scopo alcune shield utilizzano un pin digitale diverso. Ricordate che con SPI, per poter accettare i dati provenienti dal dispositivo master, ciascun dispositivo “slave” deve essere selezionato esplicitamente con un segnale select. Le shield con più di un dispositivo SPI collegato possono anche utilizzare più di un pin I/O digitale come segnale select. Le shield che utilizzano UART (o USART, come lo chiama Atmel) di solito utilizzano i pin D0 e D1 (Rx e Tx, rispettivamente, oppure RxD0 e TxD0 sulle schede Arduino di tipo Mega). Alcune shield Bluetooth utilizzano l’interfaccia UART per comunicare con un modulo Bluetooth, come la shield di interfaccia RS-232 e la RS-485. Poi esistono shield che utilizzano quasi tutti i pin di Arduino. La shield DIY multifunzione descritta in “Shield varie” a pagina 273 funziona così, ma è dotata di pin per collegarsi a segnali che non sono utilizzati specificamente sulla scheda (tre digitali e uno analogico, in questo caso). In generale, potete tranquillamente dare per scontato che le shield di estensione I/O utilizzano la maggior parte o tutti i pin disponibili di Arduino e che le shield che supportano qualcosa come per esempio un display generalmente non sono dotate di nessun punto di collegamento per accedere ai segnali che non si utilizzano. Per questo motivo, questi tipi di shield di solito non possono accoglierne un’altra sopra di esse e devono essere posizionate in cima a una pila di shield su Arduino.
Quasi tutte le shield non presentano circuiti estremamente complicati, ma sono cose relativamente semplici basate su IC esistenti oppure su componenti di un qualche tipo. Come le schede Arduino, essenzialmente sono contenitori per alcuni tipi di IC, relè e così via. Le caratteristiche elettriche di una shield sono quelle del chip o dei componenti sui quali si basa. Questa semplicità è quello che contribuisce a mantenere basso il costo di una shield, mentre le funzionalità degli IC o dei componenti che utilizza sono quello che la rende utile. Infine, alcune shield possono mettere in un buffer i segnali diretti a o provenienti da Arduino, utilizzando circuiti attivi oppure dispositivi come isolatori ottici o relè, ma la maggior parte di loro serve semplicemente da posto per montare connettori o componenti, come le shield di estensione mostrate in “Shield di estensione I/O” a pagina 226, che utilizzano connettori multipin. Le connessioni, che siano socket-header oppure pin-header sono semplicemente estensioni dei pin di Arduino e non c’è niente che prevenga dal rischio di collegare 12 volt a un input digitale da 5 V (o addirittura da 3,3 V) e convertire il microcontroller AVR di Arduino in un pezzo di carbone. Per questo, è necessario fare sempre attenzione al voltaggio e controllare i limiti di tensione del microcontroller AVR.
Le caratteristiche fisiche delle shield Dal punto di vista fisico, una tipica shield è grande come una scheda Arduino di base (ne trovate le dimensioni nel Capitolo 4) e può presentare la stessa lunghezza di Arduino, oppure essere più lunga o più corta. È possibile creare una shield più ampia di una scheda Arduino di base, dal momento che l’unico limite reale è il fatto che i pin della shield devono potersi allineare con i pin socket della scheda Arduino sottostante (ne trovate posizioni e dimensioni nel Capitolo 4). Installare una shield non comporta nient’altro che collegarla come mostra la Figura 8-1.
Figura 8-1 - Come si monta una shield su una scheda Arduino host.
Le schede Arduino più recenti, che utilizzano il layout dei pin R3, sono dotate di due pin socket al termine di ciascuna riga, che non sono utilizzate dalla shield. Questo non è importante, dal momento che queste prese extra o sono duplicati di pin esistenti oppure non sono collegate. Nel caso delle schede Mega, la shield si monta come mostra la Figura 4-20 nel Capitolo 4, dove la maggior parte dei pin della scheda Mega non sono collegati alla shield e alcuni altri sono resi inaccessibili dalla PCB della shield sottostante. Tutti i pin e i segnali di base sono a disposizione della shield. SUGGERIMENTO Bisogna sempre controllare l’isolamento 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 l’altra 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 un’estremità e un foro filettato sull’altra estremità. Questi, noti anche come “martinelli a vite”, si trovano spesso sui PC e, se mai avete assemblato il vostro computer a partire da zero, li avete già visti. La Figura 8-2 mostra alcuni esempi dei tipi di distanziatori e di standoff disponibili. Questi componenti possono essere fatti di nylon, allumino, acciaio inossidabile, ottone o plastica.
Figura 8-2 - Tipi di distanziatori e standoff.
I distanziatori possono anche essere ricavati da strisce ritagliate da PCB di prototipazione e fatte scivolare tra i pin della scheda superiore. Questa tecnica non serve molto per la connessione fisica delle schede, ma aggiunge spazio sufficiente per prevenire collisioni. Potete acquistare distanziatori e standoff presso vari distributori, come Amazon (http://amazon.com/), McMaster-Carr (http://www.mcmaster.com/), Mouser (http://www.mouser.com/) e Digi-Key (http://www.digikey.com/). Se per caso nella vostra città è presente una ferramenta, qui vi potete trovare questi prodotti e altre cose utili (come viti a testa tonda e dadi 1-72 o 2-56).
Montare diverse shield una sopra l’altra A volte, non ha senso utilizzare terminali pin socket estese per far stare una shield su una pila. Se, per esempio, una shield ha un grande numero di connettori che richiedono accesso verticale, semplicemente non c’è spazio sufficiente per montarvi sopra un’altra shield. Ma a volte potete imbattervi in una shield che può essere montata su un’altra ma non è dotata dei tipi di connettori corretti. Di solito, per permettere a una shield di essere montata su un’altra, si utilizzano due tecniche: socket con pin estesi oppure pin e socket spostati. L’approccio dei pin estesi permette alla shield di allinearsi verticalmente. L’altro design produce shield una sopra l’altra che sono spostate della distanza tra le righe di pin e di socket. Se le shield si spostano tutte nello stesso modo, il risultato può avere l’aspetto di una scala e i fori delle viti di montaggio sulle schede non si allineano correttamente. L’uso di pin estesi richiede socket con pin lunghi per il montaggio su una PCB. I pin più lunghi sulla parte posteriore (quella delle saldature) della shield si inseriscono nei socket di Arduino e un’altra shield può essere montata in cima. La tecnica dello spostamento utilizza pin-strip separate per collegare la shield a Arduino e socket-strip separate per accettare un’altra shield. Queste vengono montate una di fianco all’altra, di solito più vicino possibile per ridurre al minimo lo spostamento tra le shield.
Shield Arduino comuni I questo paragrafo vedremo alcuni dei tipi più comuni di shield. Non è assolutamente un elenco esaustivo, dal momento che continuamente ne appaiono di nuove e ne vengono abbandonate di vecchie o che altrimenti possono non essere più disponibili. In quest’era di prototipazione rapida, improvvise inversioni di tendenza e produzione a basso costo, una shield può apparire e poi scomparire soltanto pochi mesi dopo. Per rimanere al passo con quello che esiste, potete consultare gli elenchi dei distributori cinesi su eBay e quelli di Amazon.com, Adafruit, SparkFun, SainSmart e altri siti web. Nell’Appendice C trovate fonti note di shield Arduino. La Tabella 8-2 che si trova al termine di questo capitolo elenca i distributori e produttori dei quali parliamo qui. Ecco un elenco che rappresenta un riferimento rapido delle shield descritte qui, suddivise in categorie: •
Input/output – Shield d’estensione I/O – Shield d’espansione I/O – Relè shield – Shield che trasportano il segnale
•
Memoria – Schede di memoria flash SD e microSD
•
Comunicazione – I/O seriale – MIDI – Ethernet – Bluetooth – USB – ZigBee – CAN
•
Prototipazione
•
Controllo del movimento – Controllo di motori passo-passo e DC – Controllo di PWM e servo
•
Display – Array di LED – Display di LED a 7 segmenti – Display LCD – Display TFT a colori
•
Shield per la strumentazione – Registrazione di dati – Analizzatore logico – ADC da 24 bit – ADC da 12 bit
•
Shield adattatore – Adattatori Nano – Adattatori morsettiera
•
Shield varie – Morsettiera/prototipazione – Shield multifunzione
In questo paragrafo, daremo anche una rapida occhiata ad alcune shield meno comuni
progettate per applicazioni specifiche: un’interfaccia di controllo di un incisore CNC, un’interfaccia di controllo di una RepRap e un game controller FPGA.
Input/Output Esistono shield input/output (I/O) che collegano vari pin I/O di Arduino ai connettori che sono più robusti dei pin del circuito della scheda Arduino (oppure, nel caso dell’Arduino 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 d’estensione oppure come shield d’espansione, anche se il termine “shield d’espansione” spesso viene applicato a entrambi i tipi. Una shield d’estensione collega i pin I/O di un Arduino senza alterarne i segnali: semplicemente utilizza tipi diversi di connettori. Una shield d’espansione vera e propria, invece, utilizza componenti elettronici attivi per aumentare il numero di canali I/O digitali discreti. Per comunicare con la scheda Arduino host, questi tipi di shield utilizzano SPI o I2C.
Shield di estensione I/O Questa categoria di shield si utilizza per condurre i segnali input/output dal chip AVR ai connettori che sono più robusti dei pin socket utilizzate sulle schede Arduino. Alcune shield d’estensione I/O possono offrire un buffering attivo di qualche tipo, ma la maggior parte si limitano a portare i segnali della scheda Arduino. A volte, vengono dette shield d’espansione, ma non è del tutto corretto, dal momento che si limitano a trasferire i segnali esistenti da un connettore di Arduino a un altro sulla shield. La shield per sensori di SainSmart (http://bit.ly/sainsmart-sensor-shield) Si tratta di una shield che si può montare con altre (notate lo spostamento tra le pinstrip e le socket strip nella Figura 8-3). Gli I/O dell’AVR sono portati fuori da socket multi-pin, blocchi di pin-header e posizioni per due header da 10 pin adatti per essere utilizzati con connettori con cavo a nastro di tipo IDC. È fornito anche un interruttore di reset. Questa shield può essere utilizzata con qualsiasi scheda Arduino con la configurazione di base dei pin, comprese le schede Mega.
Figura 8-3 - La shield d’espansione I/O di SainSmart (interfaccia per sensori).
La Figura 8-4 illustra i grandi connettori modulari sui bordi della PCB della shield. Questi sono connettori multipin, a volte detti conntettori “buckled”, che si adattano alle spine corrispondenti di tre e quattro pin. I cavi multiconduttori sono comuni e possono essere trovati presso diversi rivenditori. Uno (diverso da SainSmart) è TrossenRobotics (http://bit.ly/trossen-robotgeek).
Figura 8-4 - Il layout dei pin e dei connettori della shield d’espansione I/O di SainSmart.
La shield per sensori di TinkerKit (http://bit.ly/tinkerkit-sensor) Questa shield che si può montare con altre (Figura 8-5) utilizza prese di pin con terminali lunghi, 12 connettori da tre pin e due connettori da quattro pin. Tra i connettori da quattro pin si trova un interruttore di reset.
Figura 8-5 - La shield d’espansione I/O di TinkerKit.
In origine, la shield per sensori di TinkerKit era stata progettata per lavorare con vari moduli sensore e motore prodotti da TinkerKit, ma può essere utilizzata come qualsiasi altra shield d’estensione I/O. La Figura 8-6 mostra il layout dei connettori sulla PCB. Questi utilizzano uno schema a tre fili come quello utilizzato sulla scheda di SainSmart che abbiamo mostrato prima. Per maggiori dettagli sui moduli TinkerKit progettati per essere utilizzati con questa shield, potete consultare il Capitolo 9.
Figura 8-6 - I connettori della shield d’espansione I/O di TinkerKit.
Anche se attualmente TinkerKit non è attiva, i suoi prodotti si trovano ancora presso Mouser (http://www.mouser.com/) e altri rivenditori. Le librerie software sono disponibili su GitHub (https://github.com/TinkerKit). La shield per sensori per Mega di TinkerKit (http://bit.ly/tinkerkitmega-sensor) La shield per sensori per Mega di TinkerKit (Figura 8-7) è progettata per collegare i pin I/O addizionali delle schede Arduino Mega, Mega2650 o Mega ADK. Utilizza prese di pin a terminali lunghi per permettere di montarle una sopra l’altra e sulla PCS è fornito un interruttore di reset. Essenzialmente si tratta di una versione più grande della shield di TinkerKit descritta prima.
Figura 8-7 - La shield d’espansione I/O di TinkerKit per le schede Arduino di tipo Mega.
La shield Grove Base Un sistema di moduli e di shield che sta guadagnando popolarità tra gli utenti di Arduino sono i componenti Grove venduti da Seeed Studio. Si tratta di un ampia varietà di moduli da scegliere ed è disponibile una scheda di base con integrata una MCU ATMEGA328p compatibile con Arduino. La scheda, progettata da Linaro.com (96Boards.org), è mostrata nella Figura 8-8.
Figura 8-8 - La shield Grove Base.
Seeed Studio vende anche una shield d’espansione passiva (cioè priva di MCU integrata) per il sistema di moduli Grove, ma, anche se potete riuscire ancora a trovarne qualcuna, non sono più sviluppate. La shield Passive Seeed Studio Grove Base è mostrata nella Figura 8-9. Per ulteriori informazioni sulla serie di moduli Grove e le shield di interfaccia compatibili, potete visitare la wiki di Seeed Studio (http://bit.ly/seeed-grove).
Figura 8-9 - La shield Seeed Studio Passive Grove Base.
La shield d’espansione per sensori di CuteDigi (http://bit.ly/cutedigi) Tecnicamente, si tratta di una shield d’estensione I/O, più che di una shield d’espansione vera e propria. Per portare i segnali delle schede Arduino di tipo Mega, questa shield di CuteDigi (Figura 8-10) utilizza header di pin anziché connettori. Non permette di montare su di essa un’altra shield, ma, vista la distribuzione verticale dei pin sulla PCB, non avrebbe senso montare qualcosa su questa scheda. Le etichette sulla PCB sono chiare e le funzioni ovvie. Questa shield è interessante per il fatto che include anche un header con pin ad angolo retto per collegarsi a un lettore di schede flash di tipo SD e un header di pin da utilizzare con un modulo Bluetooth. I connettori adottano lo stesso schema S-V-G (signal, V+, ground) che si trova su altre shield d’estensione I/O.
Figura 8-10 - La scheda d’estensione per Mega di CuteDigi con le connessioni flash SD e Bluetooth.
Shield d’espansione I/O A differenza delle shield d’estensione I/O elencate nel paragrafo precedente, una shield d’espansione I/O offre ulteriori funzionalità I/O, di solito nella forma di I/O digitali discreti (anche se alcune shield presentano capacità analoghe). Dal momento che queste shield sono dotate di circuiti attivi oltre a vari connettori, sono più care di quelle d’estensione. Il grande vantaggio che offrono è rappresentato dal fatto che mettono a disposizione diversi canali I/O utilizzando soltanto una connessione I2C o SPI con la scheda Arduino sottostante. Questo lascia i pin rimanenti di Arduino a disposizione per altre applicazioni. La shield Centipede di Macetech (http://bit.ly/macetech-centipede) La shield Centipede di Macetech (Figura 8-11) utilizza l’interfaccia I2C di Arduino per fornire 64 pin I/O digitali discreti a scopo generale. I pin sono organizzati in 4 gruppi di 16 pin, con ciascun gruppo controllato da un chip di espansione I/O I2C. La Figura 8-12 mostra il layout dei pin I/O utilizzato sulla shield di Macetech. Ciascuno degli IC MUX (multiplexer) controlla 16 pin, oppure un blocco di pin I/O. Notate come è organizzata la numerazione dei pin su ciascun blocco, con la numerazione “avvolta” intorno al blocco.
Figura 8-11 - La shield d’espansione I/O Centipede di Macetech.
Figura 8-12 - Il layout dei pin della shield I/O Centipede di Macetech.
La shield d’espansione I/O di LinkSprite (http://bit.ly/linksprite)
Si tratta di una shield che si può montare con altre e che utilizza un chip d’espansione I/O I2C MCP23017 per fornire 16 ulteriori pin I/O digitali discreti (Figura 8-13). Notate che questa shield è progettata per utilizzare schede Arduino in stile R3 e che utilizza gli ultimi due pin (9 e 10, SDA e SCL) del connettore esteso che si trova sulle schede Uno R3 e Leonardo. I pin I/O espansi sono sistemati in due serie di otto canali discreti, che si chiamano GPIOA e GPIOB. Come mostra la Figura 8-14, questi sono posizionati accanto alle strisce di prese di pin I/O digitali. Questo rende scomodo utilizzare questi pin se su questa è montata un’altra shield, per cui bisogna fare attenzione alle peculiarità di questo tipo. Se invece è l’unica shield che si sta utilizzando, oppure quella che sta al di sopra di tutte le altre, non dovrebbero esserci problemi.
Figura 8-13 - La shield d’espansione I/O a 16 canali di CuteDig.
Figura 8-14 - Il layout dei pin della shield d’espansione I/O a 16 canali di CuteDig.
La shield d’espansione I/O digitale e analogico di Numato (http://bit.ly/numatodigitalanalog) La shield d’espansione digitale e analogico di Numato (Figura 8-15) mette a disposizione 28 ulteriori canali I/O digitali discreti e 16 input analogici utilizzando due chip I/O I2C MCP23017 e un IC multiplexer analogico NXP 74HC4067 per i segnali analogici.
Figura 8-15 - La shield d’espansione I/O digitale e analogico di Numato.
Come mostra la Figura 8-16, l’interfaccia principale con Arduino è l’interfaccia I2C sui pin A4 e A5. I pin interrupt dei chip MCP23017 sono anch’essi 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 d’espansione I/O di Numato.
Relè shield Le relè shield sono disponibili con uno o più relè. I relè utilizzati in queste shield possono essere da 5 o da 10 ampere come quelli mostrati sulle shield elencate qui, oltre che i relè reed dei package DIP. NOTA Quando dovete scegliere una scheda relè, dovete fare attenzione a notare la valutazione massima della shield suggerita dal rivenditore. I relè modulari che si utilizzano su una shield possono essere dotati di contatti nominalmente per AC da 10 A a 120 V, ma i connettori e le tracce della PCB della shield PCB possono non essere indicati per questo livello di teensione. Notate anche che non tutti i rivenditori riducono la capacità tenendo conto dei limiti dei connettori delle PCB. Conviene prendersi un momento e controllare le specifiche del relè basandosi sul numero del componente mostrato nelle foto o negli schemi del rivenditore. Pensateci due volte, prima di procurarvi una shield dove i numeri dei componenti sono stati rimossi o nascosti in qualche altre modo (e questo vale per qualsiasi shield, non soltanto per le relè shield).
La relè shield di DFRobot (http://bit.ly/dfrobot-relay) Questa shield mostra come il fattore di forma di una shield può essere “modificato” per adattarla a componenti più grandi. Nel caso della relè shield di DFRobot (Figura 8-17), i quattro relè sono montati su un componente espanso della PCB della shield. I contatti dei relè hanno 3 A nominali a DC da 24 V o AC da 120 V, con una capacità di tensione massima di 5 A. Si tratta di una shield che può essere montata con altre, anche se i pin I/O verticali possono rendere difficile utilizzare un’altra scheda sopra questa.
Figura 8-17 - La relè shield di DFRobot.
La scheda utilizza una serie di jumper per portare i segnali digitali per i driver dei relè
e i pin di un modulo XBee, mostrato nella Figura 8-18. Tutti i pin digitali e analogici di Arduino sono collegati in blocchi di pin header.
Figura 8-18 - Il layout della relè shield di DFRobot.
La relè shield di Numato (http://bit.ly/numato-relay) Questa shield (Figura 8-19) utilizza due relè modulari a basso consumo con contatti da 1 A ad AC 120 V e 2 A a DC 24 V. La shield di Numato utilizza i pin digitali di Arduino 2 e 3. I terminali dei relè sono collegati a delle morsettiere. Si tratta di una shield che può essere impilata sulle altre.
Figura 8-19 - La relè shield di Numato.
La relè shield di Seeed Studio (http://bit.ly/seeedstudio-relay) La relè shield di Seeed Studio (Figura 8-20) utilizza quattro relè con contatti da 10 A ad AC 120 V. Utilizza i pin di output digitale di Arduino dal 4 al 7, uno per relè. Ciascun relè è dotato di un LED che ne indica l’attività. Si tratta di una shield che può essere montata con altre.
Figura 8-20 - La relè shield di Seeed Studio.
Shield che trasportano il segnale
Non ne esistono moltissime. Di solito, quelle che si trovano sono di due tipi: routing passivo oppure routing MUX (multiplexer) attivo. La patch shield di Adafruit (http://www.adafruit.com/products/256) Una patch board è una board d’interconnessione messa a disposizione da Adafruit e mostrata nella Figura 8-21 permette di connettere i segnali tra quattro connettori di tipo RJ45 (noti anche come connettori 8P8C) e la scheda Arduino sottostante utilizzando fili patch corti inseriti in blocchi di pin socket.
Figura 8-21 - La patch shield di Adafruit.
NOTA Questo è un kit, non una shield assemblata. La foto mostra come deve presentarsi la shield assemblata.
L’idea 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 un’altra 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 l’uso della patch shield di Adafruit.
La shield Go-Between di Mayhew Labs (http://bit.ly/mayhew-gobtw) La shield Go-Between (Figura 8-23) utilizza una matrice di posizioni di jumper saldabili per portare i segnali dall’Arduino di base o da una shield più in basso a una shield più in alto. Può rivelarsi utile quando volete mettere una sopra l’altra due shield che utilizzano gli stessi pin per le funzioni I/O. Se i pin della shield superiore possono essere spostati su pin diversi sulla shield inferiore senza dover apportare modifiche, questo risolve il problema. Tutto funzionerà con una piccola modifica del software.
Figura 8-23 - La shield Go-Between di Mayhew Labs.
La Mux Shield II di Mayhew Labs (http://bit.ly/mayhew-mux)
La Mux Shield II (Figura 8-24) è una shield attiva che supporta fino a 48 input o output utilizzando tre chip multiplexer CD74HC4067 di Texas Instruments e tre circuiti di output con registri a scorrimento. La scheda utilizza quattro dei pin digitali di Arduino per controllare i chip MUX e i registri a scorrimento. I pin digitali predefiniti sono il 2, il 4, il 6 e il 7. I pin A0, A1 e A2 di Arduino si utilizzano come input dei chip MUX. L’array di piazzole 3 × 16 (Figura 8-25) può essere utilizzato con pin header o pin socket. Ciascun canale è bidirezionale, nel senso che trasporta segnali a un output comune oppure da un input comune. Ciascun chip MUX è simile a un array di interruttori, ciascuno con una leggera resistenza mentre è chiuso e un’impedenza molto alta quando è aperto.
Figura 8-24 - La shield multiplexer attiva di Mayhew Labs (Mux II).
Figura 8-25 - I pin della shield multiplexer di Mayhew Labs.
La Mux Shield di Mayhew Labs (http://mayhewlabs.com/arduino-mux-shield) Simile alla shield descritta prima, questa shield multiplexer attiva mette a disposizione 48 linee I/O programmabili utilizzando tre chip MUX TI CD75HC4067 (vedere Figura 8-26). Inoltre, offre due grossi blocchi di pin socket header per accedere ai segnali. I pin digitali di Arduino dal 2 al 5 si utilizzano per comunicare con i chip MUX e i pin A0, A1 e A2 sono gli input analogici provenienti dai chip MUX. Si tratta di una shield che può essere montata con altre.
Figura 8-26 - La shield multiplexer attiva di Mayhew Labs (Mux).
Memoria Senza dubbio, i formati di memoria flash SD e microSD rappresentano il modo più diffuso di aggiungere della memoria per i file ad Arduino. Alla memoria flash esterna si accede per mezzo dell’interfaccia 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é l’interfaccia SD o microSD di Arduino è semplicemente un’interfaccia 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 l’interfaccia SPI si utilizzano i pin digitali di Arduino D4, D11,
D12 e D13. La shield, inoltre, collega i pin ICSP, I2C e UART ai connettori della PCB. Si tratta di una shield che può essere montata con altre.
Figura 8-27 - La shield con scheda di memoria SD di Seeed Studio.
La shield con scheda SD SHD-SD (http://bit.ly/shd-sd-sdcard) Questa shield SD, illustrata nella Figura 8-28, presenta una piccola area di prototipazione per aggiungere circuiti personalizzati. Può accettare schede microSD con un adattatore.
Figura 8-28 - La shield con scheda di memoria Short.
La shield utilizza i pin D10, D11, D12 e D13 di Arduino per l’interfaccia 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 un’area 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 un’interfaccia 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 l’UART integrato oppure scrivere un cosiddetto “bit-banger” per inviare dati seriali, ma a volte è più comodo utilizzare qualcosa come un’interfaccia 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 l’hardware esterno necessario e quindi è definitivamente più facile utilizzare una shield pronta per l’uso.
I/O seriale e MIDI Anche se perfino Ethernet può essere considerato una forma di comunicazione di dati seriali, qui I/O seriale si riferisce ai vecchi standard RS-232 e RS-485. Anche se sono vecchi, sono onnipresenti. I PC più vecchi sono dotati di connettori RS-232 (e anche alcuni dei modelli più nuovi ne hanno almeno uno) e RS-485 è comune nei sistemi di strumentazione, testing e misurazione distribuita. La shield RS232 di CuteDigi (http://bit.ly/cutedigi-rs232) La shield RS-232 (Figura 8-30) utilizza un IC MAX232 per eseguire l’adattamento dei livelli del segnale necessario per inviare e ricevere segnali compatibili con RS-232. Per configurare l’interfaccia seriale si utilizza una serie di jumper e per l’interfaccia seriale si possono utilizzare due qualsiasi dei pin digitali di Arduino da D0 a D7. Installando le prese di pin fornite, diventa una shield che è possibile montare con altre.
Figura 8-30 - La shield RS232 di CuteDigi.
La shield RS-485 di CuteDigi (http://bit.ly/cutedigi-rs485) La shield RS485 di CuteDigi (Figura 8-31) utilizza un chip MAX481CSA per fornire l’interfaccia elettrica RS485 utilizzando le porte Rx e Tx di Arduino (D2 e D3, rispettivamente). Sulla PCB della shield è fornita una posizione di montaggio per un connettore DB-9 opzionale. Si tratta di una shield che può essere montata con altre.
Figura 8-31 - La shield RS-485 di CuteDigi.
La shield MIDI di SparkFun (http://bit.ly/sparkfun-midi) Il MIDI è un venerabile protocollo seriale che esiste da oltre 30 anni. Tra le altre cose, lo si utilizza per controllare sintetizzatori musicali, sequencer, drum machine e mixer. Per inviare e ricevere messaggi relativi a eventi MIDI, la shield MIDI di SparkFun (Figura 8-32) utilizza i pin USART di Arduino.
Figura 8-32 - La shield MIDI di SparkFun.
Per l’I/O seriale MIDI, la shield MIDI utilizza i pin D0 e D1 (Rx e Tx, rispettivamente). È anche dotata di pulsanti su D2, D3 e D4; di LED collegati a D6 e D7; e di potenziometri collegati a A0 e A1.
Ethernet Le shield Ethernet sono molto diffuse e l’IDE 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 l’interfaccia SPI. L’AVR 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 un’interfaccia SPI e 10 Mb/s (10BASE-T) è un obiettivo improbabile. L’aspettativa più realistica è di 5 Mb/s. I dati vengono comunque inviati attraverso un livello fisico (l’Ethernet vero e proprio) a 10 Mb/s, soltanto a passo di byte anziché come un flusso continuo. Tutto dipende da quanto velocemente il software dell’AVR 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 l’interfaccia 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 l’interfaccia SPI utilizzata dal chip Ethernet WIZnet W5100 e per la presa della scheda microSD. Si tratta di una shield che può essere montata con altre.
Figura 8-33 - La shield Ethernet di Vetco.
La shield Ethernet R3 con connettore microSD di Arduino (http://bit.ly/ethernet-r3) La shield Ethernet ufficiale di Arduino include un lettore di schede microSD, un pulsante di reset e tutti i componenti elettronici necessari per implementare l’interfaccia Ethernet (vedere Figura 8-34). Utilizza i pin digitali D10, D11, D12 e D13 dell’interfaccia SPI. Si tratta di una shield che può essere montata con altre.
Figura 8-34 - La shield Ethernet di Arduino.
Bluetooth Bluetooth è una tecnologia di comunicazione wireless a basso consumo e a corto raggio originariamente pensata per sostituire i cavi che scorrevano tra un computer e dispositivi come stampanti, tastiere, mouse e così via. Anche se la si utilizza ancora per queste applicazioni, ha trovato uso in molti altri tipi di applicazioni basate sulla comunicazione. Esistono diverse shield Bluetooth. La shield Bluetooth (http://bit.ly/dx-bluetooth) Questa shield è già assemblata con un modulo Bluetooth già montato sulla PCB. Notate che si tratta di una shield che può essere montata con altre e che è più corta delle tipiche shield. L’antenna è il motivo dorato che emerge dall’estremità del modulo Bluetooth (vedere Figura 8-35). Utilizza i pin Rx e Tx (D2 e D3, rispettivamente).
Figura 8-35 - La shield Bluetooth di DealeXtreme.
La shield Bluetooth di Seeed Studio (http://bit.ly/seeed-bluetooth) Questa shield Bluetooth, compatta e che può essere montata con altre (Figura 836), utilizza i pin Rx e Tx di Arduino. Inoltre collega i pin dei segnali analogici e digitali all’interfaccia con i moduli sensore.
Figura 8-36 - La shield Bluetooth compatta di Seeed Studio.
Il kit della shield wireless Bluetooth con modulo BT di ITEAD (http://bit.ly/iteadbluetooth) Questa shield (Figura 8-37) utilizza un modulo Bluetooth standard e include un’area di prototipazione sulla PCB. È una shield “corta”, nel senso che non occupa l’intera lunghezza di una scheda Arduino. Può essere montata con altre.
Figura 8-37 - La shield Bluetooth con area di prototipazione di ITEAD.
La shield d’espansione Gravity:IO di DFRobot (http://bit.ly/dfrobot-gravityio) Questa scheda multifunzione di DFRobot (Figura 8-38) combina funzionalità d’estensione I/O con una serie di prese di pin per moduli wireless Bluetooth o ZigBee. Non può essere montata con altre.
Figura 8-38 - La shield multifunzione con Bluetooth di DFRobot.
USB Una cosa che un Arduino da 8 bit non può fare è fungere da host USB per altri dispositivi USB. Una host shield USB permette di collegare ad Arduino dispositivi USB come tastiere, stampanti, alcuni strumenti di test e vari giocattoli. La host shield USB di ITEAD (http://bit.ly/itead-usb) Si tratta di una shield che può essere montata con altre con funzionalità di host USB. Inoltre fornisce i pin per i segnali digitali e analogici di Arduino e due posizioni da 10 pin sulla PCB per connettori o header di pin (vedere Figura 8-39). Si basa su un chip MAX3421E con un’interfaccia SPI con Arduino.
Figura 8-39 - La host shield USB con connessioni I/O.
La host shield USB di Circuits@Home (http://bit.ly/circuitsathome-usb) Questa shield (Figura 8-40) supporta la funzionalità USB 2.0 a piena velocità e utilizza un’interfaccia SPI con un Arduino. I segnali digitali e analogici provenienti da Arduino sono disponibili sulla PCB della shield e, con i corretti pin socket, può essere montata con altre. Utilizza un chip MAX3421E con un’interfaccia SPI con Arduino utilizzando i pin D10, D11, D12 e D13. Non include già pin socket o pin header.
Figura 8-40 - La host shield USB di Circuits@Home.
La host shield USB di Arduino (http://bit.ly/arduino-usb) Come altre host shield USB, questa scheda utilizza il chip MAX3421E con un’interfaccia SPI con Arduino utilizzando i pin D10, D11, D12 e D13. Connettori da tre e quattro pin collegano le porte di input e di output che funzionano direttamente con moduli TinkerKit (i moduli TinkerKit sono descritti nel Capitolo 9). Si tratta di una shield che può essere montata con altre (vedere Figura 8-41).
Figura 8-41 - La host shield USB di Arduino USB con connettori I/O.
ZigBee ZigBee è un noto protocollo wireless a basso consumo. Molte delle shield ZigBee per
Arduino esistenti utilizzano moduli XBee già pronti, ma la maggior parte delle schede possono accogliere qualsiasi modulo RF con il pinout corretto. Alcune sono disponibili con un modulo XBee e altre senza. Un modulo XBee da 1 mW costa circa 25 $. La shield wireless SD di Arduino (http://bit.ly/arduino-wireless) Su questa shield ZigBee (Figura 8-42), sono fornite due prese di pin per un modulo Digi XBee o qualsiasi altro modulo con una disposizione di pin compatibile. Questa shield utilizza il pin D4 di Arduino come select e i pin D11, D12 e D13 per la comunicazione SPI. Inoltre, il lettore microSD della shield utilizza l’interfaccia SPI.
Figura 8-42 - La shield ZigBee di Arduino.
La shield XBee di SainSmart (http://bit.ly/sainsm-xbee) Questa shield non include un modulo XBee, ma il layout dei pin accetta un modulo XBee standard, oppure qualsiasi altro modulo con una disposizione di pin compatibile. Notate che non c’è il lettore di microSD. Si tratta di una shield che può essere montata con altre con un offset (notate le posizioni degli header dei pin e delle prese dei pin nella Figura 8-43).
Figura 8-43 - La shield ZigBee compatta di SainSmart.
La shield XBee di Seeed Studio (http://bit.ly/seeedst-xbee) La shield XBee di Seeed Studio (Figura 8-44) presenta la posizione di montaggio che ci si aspetta in un normale modulo XBee e fornisce anche un’area di prototipazione. Questa shield utilizza i pin Rx e Tx di Arduino e anche un blocco di pin per i jumper per portare i segnali Rx e Tx provenienti da Arduino al modulo wireless.
Figura 8-44 - La shield ZigBee di SainSmart con area di prototipazione.
CAN
Controller Area Network (CAN, noto anche come CAN bus), è un segnale differenziale parente dell’RS-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 l’autodiagnosi 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 un’interfaccia SPI e un chip ricetrasmettitore CAN MCP2551. Per i segnali del bus CAN, sono forniti sia un blocco di terminali che un connettore DB-9. Inoltre, la shield collega le comunicazioni I2C e UART provenienti da Arduino. Il layout dei pin è mostrato nella Figura 8-46.
Figura 8-45 - La shield CAN di Seeed Studio con connettori I/O ausiliari.
Figura 8-46 - Il layout dei pin della shield CAN di Seeed Studio con connettori I/O ausiliari.
La shield CAN-BUS di SparkFun (http://bit.ly/sparkfun-canbus) Questa shield CAN di SparkFun (Figura 8-47) incorpora molte delle funzionalità che si possono voler utilizzare quando si crea un dispositivo di lettura OBD-II e di cattura dei dati. È dotata di un connettore DB-9 per i segnali del bus CAN e anche di un header da 4 pin che fornisce i segnali. Sono forniti punti di connessione per un display LCD esterno e un modulo GPS EM406.
Figura 8-47 - La shield CAN di SparkFun con lettore microSD e joystick digitale.
Una funzionalità interessante è un joystick binario da quattro posizioni e incorpora un lettore di schede flash microSD. Il joystick è collegato agli input analogici di Arduino. Il chip CAN e la flash SD sono selezionati separatamente per mezzo dei pin digitali D9 e D10. I pin D3, D4, D5 e A0 non sono utilizzati dalla shield. Il layout dei pin è mostrato nella Figura 8-48.
Figura 8-48 - Il layout dei pin I/O della shield CAN di SparkFun.
La shield CAN-BUS di LinkSprite (http://bit.ly/linksprite-can-bus) Fisicamente, la shield CAN di LinkSprite (Figura 8-49) è simile alla shield di Seeed. È dotata sia di un connettore DB-9 che di un blocco di terminali da due posizioni per i segnali CAN. I pin D10, D11, D12 e D13 si utilizzano per l’interfaccia SPI con un chip CAN MCP2515.
Figura 8-49 - La shield CAN di LinkSprite.
Prototipazione Se desiderate creare una scheda personalizzata, potete costruirne un prototipo (o addirittura una shield definitiva) utilizzando una scheda shield di prototipazione. Non si tratta dello stesso processo di creazione di una shield descritto nel Capitolo 10, che coinvolge la progettazione di una PCB per una (possibile) produzione di massa. La Figura 8-50 mostra una shield di prototipazione simile a quelle descritte in questo paragrafo, con montati un sensore di temperatura e un relè. Un potenziometro è collegato ai pin +5 V, messa a terra e A0 (ingresso analogico 0) passati dalla scheda Arduino sottostante. Il potenziometro controlla il punto di temperatura impostata.
Figura 8-50 - La shield di prototipazione con il sensore/controllo della temperatura.
Questo prototipo è stato utilizzato per controllare una vecchia (e molto pericolosa) stufa elettrica portatile, che utilizzava un termostato bimetallico e che sembrava non riuscire a mantenere una temperatura superiore a +/– 15 gradi. Dal momento che il relè nominalmente sostiene soltanto 10 ampere a 120 VAC e gli elementi della stufa 15 ampere, veniva utilizzato insieme a un trasformatore da 24 VAC per controllare un contattore da 20 ampere. Funzionava abbastanza bene e manteneva il mio ufficio relativamente caldo durante l’inverno. 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 (d’altra parte, si tratta di un prototipo) e quindi non c’è molto bisogno di diagrammi. La proto shield stackable R3 di Adafruit (http://bit.ly/stackable-r3) Questa shield (Figura 8-51) è venduta nella forma di un kit, che significa una PCB
essenziale e un sacchetto di componenti. Non è difficile da assemblare, ma è necessario saper saldare un po’.
Figura 8-51 - Il kit della shield di prototipazione stackable di Adafruit.
La proto shield Mega di Adafruit (http://bit.ly/ada-mega-proto) Questa shield di prototipazione che si può montare con altre, che è un altro kit di Adafruit, include tutti i componenti che potete vedere nella Figura 8-52. Notate la doppia riga di piazzole di saldatura per le connessioni lungo i lati della PCB. Questa permette di saldare nelle prese dei pin da terminali corti per ottenere un accesso facile ai segnali con un Arduino di tipo Mega sottostante.
Figura 8-52 - Il kit della shield di prototipazione Mega di Adafruit.
La proto shield assemblata per Arduino di CuteDigi (http://bit.ly/cutedigi-assembled) Questa shield di prototipazione (Figura 8-53) viene venduta già assemblata. Sulla PCB è inoltre dotata di prese di pin per accedere ai segnali di Arduino. Non è una shield che può essere montata con altre.
Figura 8-53 - La shield di prototipazione di CuteDigi.
La proto shield assemblata per Arduino MEGA di CuteDigi (http://bit.ly/assembledmega) Progettata per lavorare con un Arduino di tipo Mega, questa shield (Figura 8-54) presenta anche una posizione di montaggio SOIC (small-outline) per un IC. Non è una shield che può essere montata con altre.
Figura 8-54 - La shield di prototipazione Mega di CuteDigi.
La proto shield per Arduino con mini breadboard di CuteDigi (http://bit.ly/proto-bboard) Questa shield, illustrata nella Figura 8-55, include una piccola breadboard che non richiede saldature per permettervi di creare circuiti personalizzati.
Figura 8-55 - La shield di prototipazione con una breadboard di CuteDigi.
Creare una shield di prototipazione personalizzata Potete montare una shield che funzioni utilizzando nient’altro che una PCB di prototipazione e alcuni pin e connettori. La dimensione della PCB non è realmente importante, purché i pin si allineino con le prese della scheda Arduino. Il kit della shield DIT di Adafruit Se esistesse un premio per il kit della shield più semplice, sicuramente questo starebbe tra i primi a contenderselo. Questa shield, formata da una PCB di prototipazione e quattro connettori di pin dai terminali lunghi (Figura 8-56), vi permette di montarvi tutto quello che desiderate. Si rivela utile per prototipare un nuovo progetto di shield, oppure soltanto per mettere rapidamente diverse cose insieme ed è ideale per utilizzare un modulo esistente di qualche tipo che non era mai stato pensato per collegarsi con Arduino.
Figura 8-56 - Il kit della shield DIY di Adafruit.
Purtroppo il prodotto è stato abbandonato da Adafruit, ma non vi serve altro che una PCB di prototipazione (che si trovano facilmente presso vari rivenditori) e le prese dei pin, che distribuiscono Adafruit e altri rivenditori. Dal momento che le piazzole dei pin sulla scheda Arduino utilizzano la distanza standard di 0,1 pollici (2,54 mm), è facile creare qualcosa con componenti di prototipazione di base che possono fungere da shield.
Controllo del movimento Il controllo del movimento è un argomento di grande interesse nel mondo di Arduino. Da robot mobili programmabili a incisori CNC, da stampanti 3D a scanner laser e perfino controlli automatici per seguire il sole per i pannelli solari e sculture cinetiche, Arduino è stato utilizzato per controllare motori DC, servomotori e motori passo-passo fin dall’inizio. Come potete immaginare, per ciascun tipo di motore esistono diverse shield e questo non è che un piccolo campionario di tutto quello che avete a disposizione.
Controllo di motori DC e passo-passo Le shield per controllare i motori che si basano su un ponte H (un tipo di interruttore che porta tensione allo stato solido) di solito possono essere utilizzate per controllare motori DC del tipo a spazzole oppure motori passo-passo. Fondamentalmente, le shield di questo tipo possono essere utilizzate per controllare qualsiasi carico DC induttivo, compresi solenoidi e relè. La shield Rugged Motor Driver (http://bit.ly/rugged_motor) La shield Rugged Motor Driver di Rugged Circuits (Figura 8-57) può gestire due motori DC del tipo a spazzole oppure un motore passo-passo bipolare. È valutato per un massimo di 30 V a corrente di picco 2,8 A. La shield utilizza i pin D3, D11, D12 e D13 per gli input enable (di attivazione) e di controllo della direzione. Gli input
enable possono essere gestiti con un segnale PWM per controllare in modo fluido un motore DC. Sul sito web trovate maggiori dettagli sulla gestione della tensione e il software.
Figura 8-57 - La shield Rugged Motor Driver.
La shield per gestire motori di SainSmart (http://bit.ly/sainsm-motor) La shield per gestire motori di SainSmart (Figura 8-58) si basa su un driver IC L293D da quattro canali. Può gestire quattro motori DC del tipo a spazzole oppure due motori passo-passo a un massimo di 10 V. È dotato di terminali per una fonte di alimentazione esterna. Sul sito web trovate maggiori dettagli sulla gestione della tensione e il software.
Figura 8-58 - La shield di gestione dei motori L239D di SainSmart.
La shield per gestire motori di Arduino (http://bit.ly/arduino-motor) La shield per gestire motori di Arduino.cc (Figura 8-59) si basa sul dual-driver IC L298. La si può utilizzare con relè, solenoidi, motori DC e motori passo-passo. Una funzionalità interessante è la sua capacità di misurare il consumo di corrente, che può rivelarsi utile per rilevare un motore in stallo. Notate, inoltre, che è dotato di connettori modulari che sono compatibili con vari moduli TinkerKit (descritti nel Capitolo 9).
Figura 8-59 - La shield di gestione dei motori di Arduino.
Controllo di PWM e servomotori I piccoli servomotori utilizzati nei modellini RC e nella robotica a piccola scala funzionano posizionando un’armatura relativa a una serie di impulsi di controllo di lunghezza variabile ma a frequenza costante. La lunghezza (i momenti “attivi”) degli impulsi determina l’angolo di rotazione del servo. Una shield per PWM/servo può essere utilizzata anche per gestire un motore DC, per controllare con precisione la luminosità di uno o più LED, oppure per controllare un attuatore lineare. La shield per PWM/Servo a 16 canali e 12 bit (http://bit.ly/ada-16-pwm) Questa shield (Figura 8-60) utilizza un controller IC PWM PCA9685 a 16 canali con un’interfaccia I2C. Ha la capacità di generare un segnale PWM unico e programmabile su ciascun output e non richiede l’attenzione costante di Arduino.
Figura 8-60 - La shield per PWM/servo con interfaccia I2C di Adafruit.
La shield per PWM/Servo a 27 canali di LinkSprite (http://bit.ly/linksprite-27-pwm) Questa shield di LinkSprite (Figura 8-61) utilizza un microcontroller IC STM32F103C8T6 per generare fino a 27 output PWM unici. Vale la pena sottolineare che l’STM32F103C8T6 è un dispositivo ARM Cortex-M3 RISC a 32 bit con fino a 128 KB di memoria flash e 20 KB di SRAM. In realtà, il microcontroller di questa shield dal punto di vista delle capacità di calcolo è più potente dell’AVR dell’Arduino sulla quale è montata. Comunica con Arduino utilizzando l’interfaccia SPI.
Figura 8-61 - La shield per servo di LinkSprite.
La shield per PWM di SparkFun (http://bit.ly/sparkfun-pwm) La shield per PWM di SparkFun (Figura 8-62) utilizza un TLC5940 IC ed è in grado di produrre 16 output PWM. Il TLC5940 è in grado di gestire LED oppure servo motori. Utilizza un’interfaccia seriale clocked di tipo SPI, ma riceve soltanto dati. Trovate maggiori informazioni e librerie software presso SparkFun.
Figura 8-62 - La shield per PWM di SparkFun.
Display Le shield con display per le schede Arduino possono contenere LED (light-emitting diode), array di LED, un LCD (liquid-crystal display), oppure un display grafico a colori. Alcune di queste shield utilizzano diversi output digitali di Arduino, mentre altre utilizzano interfacce SPI o TWI (I2C). Qualunque cosa vogliate visualizzare, è probabile che esista una shield con display che faccia al caso vostro.
Gli array di LED In sé, un solo array di LED fa ridere, ma quando li si mette uno a fianco all’altro è possibile creare display rettangolari di vari colori. Per ulteriori informazioni sulle shield elencate qui, potete consultare il sito web di ciascuna di esse: •
La shield LoL di Adafruit, http://bit.ly/ada-lol (Figura 8-63)
Figura 8-63 - La shield con un array di 9 × 14 LED di Adafruit.
•
La shield SMD LoL di Solarbotics, http://bit.ly/solarbio-smd-lol (Figura 8-64)
Figura 8-64 - La shield con un array di 9 × 14 LED di Solarbotics.
•
La shield NeoPixel di Adafruit, http://bit.ly/ada-neo (Figura 8-65)
Figura 8-65 - La matrice di pixel con 40 LED RGB di Adafruit.
I display di LED a sette segmenti I display di LED a 7 segmenti esistono praticamente da quando esistono i LED. Anche se attualmente sono considerati abbastanza obsoleti, i display a 7 segmenti hanno ancora delle carte da giocare, quando si ha bisogno di cifre grandi e luminose che si possano vedere facilmente dall’altra parte di una stanza. Vi consiglio di guardare anche la shield multifunzione elencata in “Shield varie” a pagina 273, dotata di display numerico di LED a 4 cifre. •
La shield di cifre 4 x 7 segmenti compatibile con Arduino, http://bit.ly/arduino-7seg (Figura 8-66)
Figura 8-66 - La shield con display a 7 segmenti di Nootropic Design.
I display LCD Molte shield LCD basate sui caratteri e a basso costo utilizzano display 16 × 2 (16 caratteri in 2 righe) con lettere bianche su schermo blu, lettere rosse su schermo nero, oppure lettere nere su schermo verde. Esistono anche altre combinazioni, come configurazioni 16 × 4 e 20 × 4. La maggior parte di questi tipi di shield si basano sul controller LCD HD44780 di Hitachi o su qualcosa di simile. Esistono anche display LCD che possono indirizzare pixel e mostrare bitmap. Alcuni di questi, come il noto Nokia 5110, sono disponibili presso vari rivenditori e sono facili da interfacciare con Arduino. Potete anche trovare display con risoluzioni di 128 × 64 e 160 × 128 pixel senza dover cercare troppo, ma non molti di questi sono disponibili nella forma di una shield compatibile con Arduino. Nel Capitolo 9 trovate ulteriori informazioni sui componenti display che non sono shield. La shield con keypad LCD di SainSmart (http://bit.ly/sainsmart-keypad) Si tratta di un design di shield LCD comune, mostrato nella Figura 8-67, che utilizza un modulo display LCD 16 × 2 e il controller LCD HD44780 di Hitachi (il modulo display è disponibile separatamente e uno è utilizzato nel generatore di segnale descritto nel Capitolo 11 e nel termostato descritto nel Capitolo 12).
Figura 8-67 - La shield con keypad LCD 16 × 2 di SainSmart.
Questa shield LCD utilizza un driver del voltaggio per i cinque interruttori a pulsante, in modo che la pressione di ciascun pulsante produca una tensione diversa. La Figura 8-68 mostra come funziona. Il vantaggio offerto da questo approccio è che gli input dei cinque interruttori sono condotti attraverso un input analogico.
Figura 8-68 - Lo schema della shield LCD di SainSmart.
La shield con keypad LCD di DFRobot (http://bit.ly/dfrobot-keypad) Questa è simile alla shield LCD di SainSmart, a eccezione che per le connessioni dei pin analogici con l’Arduino sottostante (vedere Figura 8-69). Secondo la documentazione del rivenditore, i pin addizionali sono pensati soprattutto per interfacciarsi con un modulo radio APC220 oppure con un modulo Bluetooth.
Figura 8-69 - La shield con keypad LCD 16 × 2 con pin analogici di DFRobot.
Il kit della shield LCD di Adafruit (http://bit.ly/adafruit-lcd) Per controllare il display LCD, il kit della shield LCD 16 × 2 di Adafruit, mostrato nella Figura 8-70, utilizza l’interfaccia I2C e un expander IC I/O MCP232017 (utilizzato anche nel Capitolo 10). Questo fa sì che la shield utilizzi soltanto due dei pin di Arduino, A4 e A5, per l’interfaccia I2C. L’LCD e i pulsanti sono tutti collegati all’IC MCP23017 e non utilizzano un partitore resistivo. Notate che si tratta di un kit, ma che non è troppo difficile da assemblare.
Figura 8-70 - Il kit della shield LCD con display di 16 × 2 caratteri di Adafruit.
Il modulo Nokia LCD5110 con SD (http://bit.ly/nokia_lcd) Questa shield, illustrata nella Figura 8-71, combina un display LCD Nokia 5110 con un lettore di schede flash SD. Utilizza i pin D3, D4, D5, D5 e D7 per il display e i pin D10, D11, D12 e D13 per la scheda SD. I pin D0, D1 e D2 restano disponibili per altre applicazioni.
Figura 8-71 - La shield LCD Nokia 5110 di Elechouse.
A differenza dei display basati su 16 × 2 caratteri, il 5110 è un LCD che supporta immagini grafiche con un’area di visualizzazione di 48 × 84. Originariamente è stato creato per i telefoni cellulari e adesso tutte le unità che si trovano sono avanzi di
produzione. Alcuni possono presentare graffi o altri leggeri difetti. Dovete tenere presente anche che, quando scompariranno, finirà la loro storia. Quindi, non è una buona idea progettare un nuovo prodotto utilizzandoli, ma sono divertenti per giocarci e sono relativamente economici.
I display TFT I TFT LCD (thin-film transistor liquid crystal display), detti più brevemente soltanto TFT, sono un tipo di display comune che si trova nei monitor dei computer, nei display dei registratori di cassa, nei telefoni cellulari, nei tablet e praticamente in tutto quello che presenta un display grafico a colori. Una shield con TFT a colori per Arduino può mostrare migliaia di colori a risoluzioni come 240 × 320 pixel. Si trovano display più grandi, ma generalmente questi non ci stanno in una shield. Le shield TFT di solito sono economiche: la maggior parte di loro utilizzano un’interfaccia SPI e alcune sono dotate di un’interfaccia 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 un’interfaccia digitale parallela con Arduino. Sulla shield, è utilizzata un’interfaccia a 8 bit è con un TFT controller S6D1121 e le funzioni touchscreen sono gestite dal chip TSC2046. Per informazioni più dettagliate, potete consultare il sito web del rivenditore.
Figura 8-72 - La shield TFT a colori da 2,4 pollici con touchscreen di ITEAD.
La touch shield TFT da 28” di Adafruit (http://bit.ly/ada-tft) La shield TFT da 2,8 pollici di Adafruit (Figura 8-73) utilizza un’interfaccia SPI ad alta velocità per il controller di display ILI9341 con un buffer di RAM video integrato e il controller del touchscreen STMPE610. Incorpora anche un lettore di scheda flash microSD. La shield utilizza i pin digitali di Arduino dal D8 al D13, il controller del
touchscreen utilizza il pin D8 e select del lettore microSD si trova sul pin D4.
Figura 8-73 - La shield TFT da 2,8 pollici di Adafruit con touchscreen resistivo.
Shield per la strumentazione Anche se non ne esistono tante come nel caso di altri tipi di shield, si trovano shield per la strumentazione. Queste includono shield per la registrazione dei dati, analizzatori logici e convertitori analogo-digitale (A/D) di precisione. Strumentazione, in questo caso, si riferisce alla possibilità di percepire e catturare dati dal mondo fisico, oppure di generare un segnale analogico. Non esistono molte shield con funzionalità integrate di cattura e conversione dei dati, principalmente per via del fatto che la MCU AVR che si trova su Arduino ha già gran parte di queste funzioni nel chip. Il convertitore A/D (ADC) integrato delle MCU AVR utilizzate con le schede Arduino ha una risoluzione di 10 bit, che dà una risoluzione di conversione di 1/1.024 per DN, o numero digitale. Se avete bisogno di una risoluzione migliore (12, 16 o addirittura 24 bit, per esempio), dovete prendere in considerazione qualche tipo di modulo o shield aggiuntivi. La shield per la registrazione dei dati di Adafruit (http://bit.ly/1Tjlu5V) La shield per la registrazione dei dati di Adafruit, mostrata nella Figura 8-74, include un lettore di scheda flash SD e un chip real-time clock (RTC). L’RTC può essere alimentato da una batteria, quando l’alimentazione principale che proviene
dall’Arduino di base è spenta. Per i circuiti personalizzati si utilizza una piccola griglia di prototipazione. Non è una shield che può essere montata con altre.
Figura 8-74 - La shield per la registrazione dei dati di Adafruit assemblata.
La shield Ultimate GPS Logger di Adafruit (http://bit.ly/ada-gps) Questa shield, mostrata nella Figura 8-75, incorpora un ricevitore GPS, oltre a un lettore di flash SD e a un chip RTC. L’output del GPS può essere registrato automaticamente nella scheda di memoria flash. Non è una shield che può essere montata con altre.
Figura 8-75 - La shield per la registrazione dei dati GPS di Adafruit.
La shield analizzatore (http://www.arduinolab.us)
logico
e
generatore
di
segnale
di
HobbyLab
In realtà, si tratta di un analizzatore logico indipendente su una shield. Controlla i segnali di Arduino senza interferire con essi, cosa che si rivela utile per vedere che cosa sta succedendo sui pin I/O. Oltre alla funzionalità dell’analizzatore logico, include anche un decodificatore SPI, un decodificatore UART e un monitor da un filo. Non comunica direttamente con Arduino, ma utilizza un’interfaccia USB per interagire con un computer host. Si tratta di una shield che può essere montata con altre (vedere Figura 8-76).
Figura 8-76 - L’analizzatore logico e generatore di segnale di HobbyLab.
La shield ADC da 16 canali e 24 bit di Iowa Scaled Engineering (http://bit.ly/ardltc2499) Questa shield incorpora un convertitore A/D da 24 bit e un riferimento di precisione della tensione per ottenere le letture di diversi input differenziali o single-ended. È dotata anche di una EEPROM integrata per salvare e leggere dati di calibrazione e configurazione. Comunica con Arduino per mezzo dell’interfaccia I2C (TWI). Si tratta di una shield che può essere montata con altre (vedere Figura 8-77).
Figura 8-77 - La shield di acquisizione dei dati ADC da 24 bit di Iowa Scaled Engineering.
La shield Power DAC di Visgence (http://bit.ly/power-dac)
Una funzione che manca alla MCU AVR e per estensione ad Arduino è un convertitore digitale-analogico (DAC) integrato. L’ADC interno dell’AVR incorpora un DAC da 10 bit, ma l’output non è disponibile esternamente. Anche se le shield per l’output audio sono facili da trovare, non sembra che ne esistano molte di puro output DC DAC. La shield Power DAC di Visgence (Figura 8-78) fornisce tre canali di output analogico con la possibilità di generare fino a 250 mA di tensione.
Figura 8-78 - La shield DAC da 12 bit di Visgence.
Shield adattatori Una shield adattatore si utilizza come interfaccia fisica tra quelli che altrimenti sarebbero due moduli fisicamente incompatibili. La differenza principale tra una shield adattatore e una shield che trasporta il segnale (vedere “Shield che trasportano il segnale” a pagina 236), almeno per quando riguarda come sono organizzate le shield in questo capitolo, è che un adattatore è pensato per fungere da interfaccia fisica. Una shield che trasporta il segnale non si occupa delle differenze fisiche, ma soltanto dei segnali. La shield di espansione per Arduino Nano di Tronixlabs Australia (http://bit.ly/expnano) Una scheda Nano presenta tutte le funzionalità dell’Arduino di base, più grande, ma non funziona con le shield convenzionali. Questa scheda, mostrata nella Figura 8-79, risolve questo problema collegando i pin della Nano agli header dei pin e opzionalmente ai connettori standard dei pin.
Figura 8-79 - La shield adattatore per la Nano di Tronixlabs.
La scheda di espansione I/O per Arduino Nano (eBay) (http://bit.ly/exp-nano-ebay) Un altro esempio di adattatore per la scheda Nano (Figura 8-80). Questa si trova su eBay, ma ne esistono anche altre simili.
Figura 8-80 - La scheda di espansione per Arduino Nano.
La shield per terminali a vite (http://bit.ly/screw-term) Anche se tecnicamente non si tratta di una shield, di per sé questi utili adattatori permettono di collegare fili isolati fino a 18 AWG. Si trovano facilmente presso vari rivenditori. Notate che questi componenti possono essere montati l’uno sull’altro (vedere Figura 8-81).
Figura 8-81 - Gli adattatori dei terminali.
Shield varie Questo paragrafo descrive alcune shield utili che non rientrano esattamente in categorie definite. A me piace chiamarle “wing shield” perché permettono di creare collegamenti più ordinati e le shield multifunzione mostrate qui presentano una vasta gamma di utilizzi. La Proto-ScrewShield (Wingshield) di Adafruit (http://bit.ly/ada-proto-screw) La Wingshield, conosciuta anche come Proto-ScrewShield, è una shield passiva con due serie di blocchi di terminali in miniatura (vedere Figura 8-82). Se prevedete di incorporare una scheda Arduino in un prodotto commerciale o in un laboratorio, potete prendere in considerazione una shield come questa. Le viti del blocco di terminali forniscono una connessione molto più sicura e affidabile dei jumper dei pin. L’area di prototipazione al centro della shield può essere utilizzata per montare moduli sensore, oppure può contenere un circuito personalizzato. La shield include un interruttore di reset e un LED. Inoltre, può essere montata con altre. Attenzione perché si tratta di un kit e quindi si presenta come una PCB e un sacchetto di componenti. Assemblarlo non è difficile, ma è necessario saper saldare.
Figura 8-82 - La Wingshield di Adafruit.
La Screw ProtoShield di DFRobot (http://bit.ly/screw-protoshield) Come la Wingshield di Adafruit, questa shield (Figura 8-83) fornisce terminali a vite per ciascuno dei segnali provenienti da Arduino, ma è già completamente assemblata. Inoltre si tratta di una shield che può essere montata con altre e quindi può essere collocata sotto altre shield mantenendo la possibilità di accedere ai blocchi di terminali.
Figura 8-83 - La shield con blocchi di terminali di DFRobot.
La shield multifunzione DIY di DealeXtreme (http://bit.ly/diy-multi) Si tratta di una shield interessante, con un lettore di LED numerico da 4 cifre, un punto di interfaccia per un modulo Bluetooth APC220, diversi interruttori a pulsante collegati con i pin di Arduino A1, A2 e A3m, un interruttore di reset e un potenziometro collegato all’input A0 (vedere Figura 8-84). Quattro LED sono collegati ai pin digitali D10, D11, D12 e D13 e un header da 3 × 4 pin collega i pin D5, D6, D9 e A5, oltre a +5 V e messa a terra. Purtroppo, questa shield è anche piuttosto mal documentata e riuscire a trovare qualche informazione utile può richiedere un po’ di ricerche. Potete trovare ulteriori informazioni sul forum di HobbyComponents.com (http://bit.ly/dx-diy-hc). Inoltre, potete scaricare una raccolta di sketch di esempio e uno schema da http://bit.ly/dx-diy-sketch. Notate che i nomi delle directory nell’archivio ZIP sono tutti in cinese, ma la maggior parte degli sketch presentano commenti in inglese.
Figura 8-84 - La scheda d’espansione della shield multifunzione DX DIY.
L’organizzazione dei vari componenti della shield multifunzione è mostrata nella Figura 8-85. Notate che non si tratta di una shield che può essere montata con altre e la cosa ha senso, dal momento che montando un’altra shield sopra di essa si renderebbe inutile il display LED.
Figura 8-85 - Le funzionalità principali della shield multifunzione.
Lo schema fornito per questa shield è in un certo senso criptico e quindi ne ho creato una versione alternativa, mostrata nella Figura 8-86. Notate che questa shield utilizza tutti i pin di Arduino. La Tabella 8-1 elenca i pin di Arduino e mostra per che cosa li utilizza la shield multifunzione.
Figura 8-86 - Lo schema della shield multifunzione.
Tabella 8-1 - Le funzioni dei pin della shield multifunzione di Arduino.
Pin
Utilizzo
D0
Rx dal modulo wireless
D1
Tx al modulo wireless
D2
ID ricevuto
D3
Controllo dell’annunciatore
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 l’inglese più essere difficile per alcuni utenti). Lo schema è corretto, ma può risultare difficile da capire a una prima occhiata e non c’è una descrizione dettagliata del pinout (bè, in realtà adesso sì).
Shield di Arduino non comuni Oltre alla vasta gamma di shield dalle I/O RS-232 a quelle per controllare PWM e servo, esistono anche shield create per applicazioni specifiche. Alcune stampanti 3D open source utilizzano una scheda Arduino come controller principale e le interfacce di controllo, nella forma di shield, si trovano facilmente. Alcune di queste shield sono pensate per le schede Arduino di tipo Mega e le loro dimensioni sono studiate di conseguenza. Altre shield non comuni non rientrano esattamente in nessuna delle categorie che abbiamo visto in questo capitolo, ma sono comunque interessanti. Un esempio di questo tipo di shield è la Gameduino. Si tratta essenzialmente di un contenitore per un chip FPGA (field-programmabile gate array) e può essere utilizzata per altre applicazioni, oltre che per i videogiochi. La shield Qunqi CNC per Arduino V3 Engraver (http://bit.ly/qunqi-cnc) Questa shield, illustrata nella Figura 8-87, non include moduli di gestione dei motori, ma se ne trovano facilmente. Un tipico modulo driver il utilizza driver chip microstepping A4988 DMOS di Allegro.
Figura 8-87 - La scheda d’espansione Qunqi A4988 driver CNC.
La shield SainSmart RepRap Arduino Mega Pololu (http://bit.ly/sainsmart-reprap) Il costruttore di RepRap 3D (http://reprap.org/), pubblicizzato come “la prima macchina per scopi generali dell’umanità capace di replicarsi da sola”, è un costruttore compatto che può creare componenti per altre macchine RepRap, oltre a molte altre cose. Questa shield, mostrata nella Figura 8-88, è pensata per sostituire le parti elettroniche di un dispositivo di tipo RepRap e come processore utilizza un Arduino di tipo Mega.
Figura 8-88 - La shield RAMPS 1.4 RepRap per stampanti 3D di SainSmart.
excamera Gameduino (http://bit.ly/excam-gameduino) Questa shield utilizza un Xilinx FPGA (Figura 8-89) per controllare le immagini e i suoni in una console di giochi fatta in casa. Come interfaccia con i controlli e per
dirigere i giochi si utilizza un Arduino. Gameduino è open source, per cui tutti i dettagli tecnici sono a disposizione di chiunque ed è possibile riproporre il FPGA per qualcosa di diverso dai giochi.
Figura 8-89 - La shield game controller excamera Gameduino.
Fonti La Tabella 8-2 elenca i rivenditori e i produttori menzionati in questo capitolo. Naturalmente ce ne sono molti altri non elencati qui, che sono comunque ottimi posti dove cercare shield utili o innovative. Digitando “Arduino shield” nel campo di ricerca di Google, ottenete circa 400.000 risultati e quindi, come vedete, non mancano i posti dove cercare prodotti e informazioni. Il solo fatto che un rivenditore o un produttore non sia menzionato qui non significa che non valga la pena di essere preso in considerazione. Semplicemente, cercare di includere tutti in un mercato volatile come questo, che propone tanti prodotti diversi, sarebbe come il supplizio di Sisifo. Tabella 8-2 - Elenco di rivenditori e produttori di shield.
Nome
URL
Adafruit
www.adafruit.com
Arduino
store.arduino.cc
Arduino Lab
www.arduinolab.us
Circuits@Home
www.circuitsathome.com
CuteDigi
store.cutedigi.com
DFRobot
www.dfrobot.com
DealeXtreme (DX)
www.dx.com
Elecfreaks
www.elecfreaks.com
Elechouse
www.elechouse.com
excamera
www.excamera.com
Iowa Scaled
www.iascaled.com
Engineering iMall
imall.itead.cc
Macetech
www.macetech.com/store/
Mayhew Labs
www.mayhewlabs.com
Nootropic Design
www.nootropicdesign.com
Numato
www.numato.com
RobotShop
www.robotshop.com
Rugged Circuits
www.ruggedcircuits.com
SainSmart
www.sainsmart.com
Seeed Studio
www.seeedstudio.com
SparkFun
www.sparkfun.com
Tindie
www.tindie.com
Tronixlabs
www.circuitsathome.com
Vetco
www.vetco.net
9 Moduli e componenti I/O
Anche se molte delle shield disponibili per Arduino presentano moltissime funzioni interessanti e utili già integrate, non sono onnipotenti. Né potrebbero esserlo, dal momento che esiste una vasta gamma di tipi diversi di sensori, controlli e attuatori che possono essere utilizzati con Arduino. Molti rivenditori offrono componenti sensore aggiuntivi con una sola funzionalità e piccoli moduli PCB per Arduino. Questi includono sensori di temperatura e umidità, rilevatori di vibrazioni, fotorivelatori, tastierini, joystick e perfino laser a stato solido. Quasi tutti i sensori, i controlli o gli attuatori che possono essere utilizzati con i microcontroller possono essere utilizzati anche con Arduino. Presentano alcuni limiti per quanto riguarda l’alimentazione, 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 l’ordine e l’affidabilità. Purtroppo, utilizzare gli onnipresenti ponticelli per collegare moduli e altri componenti può diventare rapidamente tutto tranne che ordinato e i connettori da crimpare che si utilizzano sulle estremità dei ponticelli tendono a rivelarsi troppo allentati per i pin dei moduli.
Anziché rassegnarsi a saldarli direttamente ai pin di un modulo, oppure a nascondere i connettori dei jumper con una goccia di silicone per tenerli fermi al loro posto, si possono utilizzare connettori modulari. Questi possono essere fatti su misura per applicazioni specifiche utilizzando strumenti manuali semplici, oppure si può decidere di utilizzare un sistema come TinkerKit, Grove o TinyCircuits. Questo capitolo offre una panoramica dei metodi per collegare moduli ad Arduino che permettono di non creare un groviglio di ponticelli.
I moduli I moduli sensore e I/O sono senza dubbio il modo più comodo di collegare un sensore, un interruttore, un relè, oppure un microfono ad Arduino e potervi fare esperimenti. La Figura 9-1 mostra diversi tipi di modulo.
Figura 9-1 - Diversi tipi e dimensioni di modulo sensore.
Alla lunga, è facile ritrovarsi con una grande quantità di moduli, alcuni dei quali più utili di altri. Vi suggerisco di cominciare con i kit di moduli più grandi che vi possiate permettere e poi scoprire quali utilizzate maggiormente. Di questi, vi conviene tenerne diversi a portata di mano, mentre quelli che utilizzate di meno potete metterli da parte per progetti futuri. ATTENZIONE Le descrizioni che trovate online di come funzionano vari moduli non sono sempre corrette. Potrebbero essere problemi di traduzione, ma a volte le descrizioni online dichiarano che quando è attivo un modulo genera un output high, quando in realtà genera un output low. Prima di collegarlo a un circuito, vi conviene sempre controllare bene come funziona un modulo con un multimetro digitale (DMM). La maggior parte dei moduli elencati in questo
paragrafo sono stati testati per determinare come funzionano davvero e le descrizioni offerte qui corrispondono a queste scoperte. Detto questo, non posso affermare che tutti i moduli che possono assomigliare a quelli elencati in questo capitolo si comportino nello stesso modo o presentino le stesse funzioni dei pin. In quest’angolo dell’universo, la standardizzazione non è ancora arrivata.
Per quanto riguarda gli schemi dei moduli elencati qui, be’, in realtà non ne esistono di ufficiali che io sia riuscito a trovare. Diverse anime coraggiose su Internet si sono prese la briga di creare le PCB di alcuni dei moduli. Ho cercato di raccogliere quelle che riuscivo a trovare e di combinarle con i miei sforzi di ingegneria inversa. In alcuni casi, il risultato è uno schema completo e in altri ho soltanto voluto verificare che i pin facessero veramente quello che diceva la documentazione disponibile (seppur minima).
I fattori di forma fisici I moduli possono presentare diverse dimensioni, da 1,8 per 1,5 cm (approssimativamente 3/4 per 9/16 pollici) a 4,2 per 1,7 cm (approssimativamente 1 11/16 per 5/8 pollici), mentre alcuni possono raggiungere i 3,4 per 2,5 cm (approssimativamente 1 5/16 per 1 pollice), nel caso di un relè modulare da 5 V. La Figura 9-2 mostra una gamma di dimensioni dei moduli. Notate che queste sono dimensioni approssimative. Le dimensioni reali delle PCB possono variare di circa +/– 1 mm (0,04 pollici), a seconda di dove sono stati prodotti i moduli.
Figura 9-2 - Esempi di dimensioni di moduli che si trovano spesso.
Sulla PCB, molti moduli presentano dei fori di montaggio sufficienti per una vite a testa tonda #2 (2,03 mm). L’equivalente metrico è di solito una dimensione pari a M1.6 o M1.8. La Figura 9-3 mostra due moduli montati uno sopra l’altro utilizzando viti a testa
tonda da 2-56 e distanziatori di nylon. Si tratta di un sensore di temperatura da un filo con un modulo interruttore a inclinazione al mercurio.
Figura 9-3 - Moduli montati utilizzati viti a testa tonda #2 e distanziatori.
Purtroppo, non tutti i moduli possono essere montati bene con altri. A volte, i fori di montaggio non presentano la stessa distanza, oppure possono trovarsi nel posto sbagliato sulla PCB e non permettere ai moduli di essere montati uno sopra l’altro. 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 all’altro 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 d’estensione 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 d’estensione TinkerKit. Prima di collegare un modulo, conviene sempre controllarne i pin, per verificare le posizioni della tensione e del segnale.
Dal momento che l’AVR è 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 un’interfaccia 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.
Un’altra opzione è un IC per uno scopo speciale come il MAX4896, mostrato nella Figura 9-6, che utilizza un’interfaccia SPI e un Arduino può interfacciarsi direttamente all’IC. Anche se è pensato per gestire piccoli relè, questo IC è in grado di gestire LED grandi con la stessa facilità.
Figura 9-6 - Un IC di gestione dell’output per diversi relè o altri carichi.
Dove trovare i moduli La Tabella 9-1 suggerisce dove trovare moduli con una sola PCB e kit di sensori con 24, 36 o più moduli. Se ne trovano anche su eBay e Amazon. La Figura 9-7 mostra una
valigetta di plastica con una serie completa di moduli (37 tipi diversi: l’ultimo settore contiene due moduli diversi). Tabella 9-1 - Un elenco parziale di rivenditori e produttori di moduli sensore e di output.
Nome
URL
Adafruit
www.adafruit.com
CuteDigi
store.cutedigi.com
DealeXtreme (DX)
www.dx.com
KEYES
en.keyes-robot.com
SainSmart
www.sainsmart.com
Seeed Studio
www.seeedstudio.com
TinyCircuits
www.tiny-circuits.com
Trossen Robotics
www.trossenrobotics.com
Vetco
www.vetco.net
Figura 9-7 - Una serie di moduli di input/output.
Quasi tutti i rivenditori elencati nella Tabella 9-1 vendono anche moduli singoli, oltre a ponticelli, cavi di interconnessione e componenti di input e output. Potete comprare praticamente tutti i moduli di cui avete bisogno in piccole quantità, anche se non tutti i
moduli presenti nei kit possono essere disponibili da acquistare individualmente.
Le descrizioni dei moduli In questo paragrafo elencheremo i moduli di tre marche: KEYES, SainSmart e TinkerKit. Le descrizioni sono, per necessità, brevi. Qui l’accento è posto soprattutto sulla forma fisica e sulle connessioni elettriche dei moduli elencati nelle tabelle. “I sensori” a pagina 312 descrive i sensori componenti (cioè i sensori che compongono il kit) in maggiore dettaglio e, dove necessario, i moduli presentano riferimenti incrociati alle descrizioni dettagliate. Dopo aver lavorato con diversi moduli per un po’, potete cominciare a notare che molti dei moduli descritti qui utilizzano lo stesso circuito di base. Questo di solito consiste di un comparatore LM393 e di un sensore di qualche tipo. In tutti i casi, un potenziometro imposta la tensione di soglia e l’output dell’LM393 è collegato al pin del segnale del modulo. I moduli KEYES con circuiti simili sono elencati nella Tabella 9-2 e i moduli SainSmart con circuiti simili sono elencati nella Tabella 9-3. Tabella 9-2 - I moduli KEYES con circuiti simili (Figura 9-8).
Modulo
Nome
KY-025
Modulo interruttore reed
KY-026
Sensore di fiamma
KY-036
Sensore a contatto conduttivo
KY-037
Sensore con microfono sensibile
KY-038
Sensore con microfono
Tabella 9-3 - I moduli SainSmart con circuiti simili (Figura 9-8).
Modulo
Nome
20-011-981
Sensore fotosensibile
20-011-982
Sensore di vibrazioni/shock
20-011-983
Sensore a effetto hall
20-011-984
Sensore di fiamma
La Figura 9-8 mostra una rappresentazione schematica e generica del circuito comparatore LM393 utilizzato nei moduli elencati nella Tabella 9-2 e nella Tabella 9-3. I valori esatti del componente possono variare leggermente, ma lo stesso circuito di base viene utilizzato in diversi moduli. La differenza principale tra i moduli è il sensore (fiamma
IR, microfono, LDR, ecc.).
Figura 9-8 - Circuito generico dei moduli con IC comparatore.
Il terminale DO (digital output) proviene direttamente dal comparatore. È high quando l’input non invertente (+) è maggiore di quello invertente (–). L’output del comparatore diventa low se l’input non invertente è più basso di quello invertente. Alcuni moduli possono essere progettati con gli input per l’IC del comparatore organizzati al contrario rispetto a quello che si vede nella Figura 9-8, ma il principio di funzionamento è lo stesso. La tensione sull’input non invertente è impostata dal potenziometro. Questo costituisce la metà di un partitore di tensione che insieme al sensore e forse ad una resistenza limitatrice di corrente, forma l’altra metà. Un secondo partitore di tensione serve ad applicare circa la metà del VCC +5 V all’input invertente, o circa 2,5 V. Questo è l’input di riferimento. Il potenziometro si utilizza per impostare la tensione alla quale il comparatore cambierà il suo output, mentre il sensore cambia la sua resistenza in risposta a qualche tipo di input. Sull’estremità dell’output del circuito, si utilizza una resistenza da 10K come pull-up sul pin di output dell’IC. L’AO (analog output) è il valore “crudo” fornito dal sensore presso l’input dell’IC LM393 (in questo caso). Su questi moduli dotati di un solo output, soltanto l’output del comparatore è collegato al pin del terminale come il segnale DO. Un modulo può anche presentare un LED che indichi quando è presente l’alimentazione e qualche altro LED che indichi quando l’output del comparatore è low (diventa una fonte di alimentazione per il LED). Come tutto questo si relaziona con un sensore dipende da come il sensore risponde all’input e per farsi un’idea di come si comporta può rendersi necessario fare qualche esperimento. In molti casi, un sensore attivo rivela una resistenza diminuita, cosa che
farà sì che l’input non invertente scenda al si sotto della tensione di riferimento sull’input invertente. Quando questo accade, l’output del circuito comparatore mostrato nella Figura 9-8 diventa low e il LED sull’output dell’IC diventa attivo (l’IC funge da fonte di alimentazione per il LED). I circuiti comparatore che presentano un output low quando l’input si trova in uno stato attivo o al di sotto di una qualche soglia vengono detti circuiti active-low. In questi circuiti, una tensione bassa sull’output è equivalente a una condizione true. I circuiti che presentano un output high quando il sensore è attivo o l’input si trova al di sopra di una qualche soglia vengono detti circuiti active-high. In un circuito active-high, un output high è equivalente a una condizione true. True e false in questo senso significano semplicemente e rispettivamente che il sensore sta ricevendo input oppure no. ATTENZIONE Vi conviene dedicare qualche istante, armati di un DMM (multimetro digitale) e di una lente di ingrandimento, a esaminare con attenzione un modulo prima di collegarlo ad Arduino. Questo si rivela particolarmente importante nel caso dei moduli molto economici, dove ho trovato che mancano parti o appaiono ponti di saldatura (cortocircuiti) tra piazzole e pin di collegamento che non vanno da nessuna parte. Un modulo che ho esaminato aveva un pezzo di filo, installato dalla fabbrica, saldato tra tracce collegate ai pin +5 V e messa a terra! Questo avrebbe causato dei problemi. Il semplice fatto che un modulo sia dotato di pin per la messa a terra, +5 V e segnale non significa che tutti i pin siano effettivamente utilizzati e nemmeno che i pin facciano quello che implicano i nomi che sono stati loro assegnati. Una volta risolti tutti i problemi, i moduli tendono a funzionare bene (tutto sommato, sono formati soltanto da una manciata di componenti). Se prendete appunti, più tardi vi risparmierete qualche mal di testa.
Molti moduli comuni progettati dalla società cinese Shenzhen KEYES DIY Robot Co. Ltd. (conosciuta anche come semplicemente KEYES) sono venduti come singole unità oppure riuniti in kit di moduli, di solito con 36 moduli circa per kit. Potete trovare anche moduli che presentano le lettere “HXJ”. Funzionalmente, sono identici ai moduli KEYES, ma il layout della PCB può essere leggermente differente. La Tabella 9-4 è un elenco riassuntivo dei moduli KEYES descritti in questo paragrafo, mentre la Tabella 9-7 contiene immagini, note e diagrammi del pinout, da KY-001 a KY040. Alcuni dei modelli mostrati sono KEYES e alcuni sono di altri rivenditori, ma sono altrimenti identici (le unità HXJ, per esempio). Tutti condividono lo stesso pinout e le stesse funzioni e spesso hanno lo stesso nome (KY-002, KY-027 e così via). Notate che i moduli KY-007, KY-014, KY-029 o KY-030 non esistono. Non ho idea del perché. Tabella 9-4 - I moduli I/O KEYES più diffusi.
Numero di componente
Nome
KY-001
Sensore di temperatura
KY-002
Sensore di vibrazioni
KY-003
Sensore di campo magnetico a effetto hall
KY-004
Pulsante
KY-005
Emettitore di infrarossi
KY-006
Cicalino passivo
KY-008
LED laser
KY-009
LED RGB a colori
KY-010
Interruttore ottico
KY-011
LED a 2 colori
KY-012
Cicalino attivo
KY-013
Sensore analogico di temperatura
KY-015
Sensore di temperatura e umidità
KY-016
LED RGB a 3 colori
KY-017
Interruttore a inclinazione al mercurio
KY-018
Modulo LDR
KY-019
Relè 5 V
KY-020
Interruttore a inclinazione
KY-021
Mini interruttore reed
KY-022
Sensore/ricevitore di infrarossi
KY-023
Joystick a 2 assi
KY-024
Sensore lineare a effetto hall
KY-025
Modulo interruttore reed
KY-026
Sensore di fiamma
KY-027
Modulo luce magica
KY-028
Sensore di temperatura
KY-031
Sensore di shock
KY-032
Sensore di prossimità IR
KY-033
Sensore IR per seguire una linea
KY-034
LED a colori con lampeggiamento automatico
KY-035
Sensore magnetico a effetto hall
KY-036
Sensore di tocco
KY-037
Sensore con microfono sensibile
KY-038
Sensore con microfono
KY-039
Sensore del battito cardiaco con LED
KY-040
Encoder rotativo
Un altro produttore di moduli sensore è SainSmart. La Tabella 9-5 è un riepilogo di quello che si può trovare nella forma di kit di moduli di SainSmart e la Tabella 9-8 contiene immagini, note e diagrammi del pinout. Si tratta di un elenco rappresentativo, dal momento che i contenuti dei kit possono variare. I moduli con un numero di componente di SainSmart Part possono essere acquistati anche singolarmente e alcuni di loro sono unici. Tabella 9-5 - I moduli SainSmart disponibili nella forma di kit.
Numero di componente n/d
Nome Modulo relè
20-011-985
Sensore di tocco
20-019-100
Sensore di distanza a ultrasuoni HC-SR04
20-011-984
Sensore di fiamma
20-011-986
Sensore di temperatura e umidità relativa
n/d
Cicalino attivo
20-011-982
Sensore di vibrazioni/shock
n/d
Cicalino passivo
20-011-987
Sensore di tracking
20-011-983
Sensore a effetto hall
20-011-981
Sensore fotosensibile
n/d
Ricevitore di infrarossi
20-011-944
Modulo joystick
20-011-946
Sensore d’acqua
Infine, ci sono i moduli TinkerKit. La Tabella 9-6 è un riepilogo e la Tabella 9-9 rivela i dettagli su ciascuno dei moduli inclusi nel kit “Pro”. La serie di moduli TinkerKit è progettata per lavorare con la shield di interfaccia di TinkerKit (descritta nel Capitolo 8). Anche se attualmente la società TinkerKit non è attiva, i suoi prodotti si trovano ancora presso http://www.mouser.com), Newark/Element14 (http://www.newark.com) e altri. Le librerie software si trovano su GitHub (https://github.com/TinkerKit). Una serie di schede tecniche di base relative a questi moduli si trovano presso Mouser (http://bit.ly/mouser-tinkerkit). Tabella 9-6 - Riepilogo dei moduli TinkerKit.
Modulo
Nome
Modulo
Nome
T000020
Modulo accelerometro
T010020
Modulo mosfet
T000030
Modulo joystick
T010110
Modulo LED ad alta intensità
T000070
Sensore a effetto hall
T010111
Modulo LED blu 5 mm
T000090
Modulo LDR
T010112
Modulo LED verde 5 mm
T000140
Modulo potenziometro rotativo
T010113
Modulo LED giallo 5 mm
T000150
Modulo potenziometro lineare
T010114
Modulo LED rosso 5 mm
T000180
Modulo pulsante
T010115
Modulo LED blu 10 mm
T000190
Modulo inclinazione
T010116
Modulo LED verde 10 mm
T000200
Modulo termistore
T010117
Modulo LED giallo 10 mm
T000220
Modulo sensore di tocco
T010118
Modulo LED rosso 10 mm
La Tabella 9-9 non mostra i diagrammi del pinout perché i moduli TinkerKit utilizzano tutti un pinout standard. L’unica differenza tra i moduli è tra i moduli discreti digitali (on/ off) e analogici. Entrambi i tipi utilizzano lo stesso pinout di base mostrato nella Figura 9-9.
Figura 9-9 - Il connettore comune dei moduli TinkerKit.
I circuiti dei moduli TinkerKit gestiscono l’interfaccia 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
dell’input, 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. L’obiettivo 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 dell’interfaccia di basso livello sono già fornite.
I moduli KEYES Tabella 9-7 - I moduli sensore e di output di tipo KEYES.
Numero del componente
Nome e descrizione
KY-001
Sensore di temperatura Utilizza un IC del sensore di temperatura DS18B20 da un solo filo in un package TO-92.
KY-002
Sensore di vibrazioni Un sensore di shock sigillato chiude il circuito tra i pin GND e signal. +5 V non sembra essere collegato, ma c’è una posizione per una resistenza sul lato inferiore della PCB. Molto sensibile.
KY-003
Sensore di campo magnetico a effetto hall Rileva la presenza di un campo magnetico. L’output è il collettore aperto di un transistor NPN nel dispositivo A3144 a effetto hall. L’output è collegato alla messa a terra quando il sensore è attivo. Non si tratta di un sensore lineare, mentre il KY-024 lo è.
KY-004
Pulsante Un semplice interruttore a pulsante. L’output diventa low quando il pulsante è premuto. Emettitore di infrarossi Un LED IR adatto per essere utilizzato con un KY-022.
Immagine
Pinout
KY-005
Notate che si deve utilizzare una resistenza esterna che limiti la tensione. Sul modulo testato, il pin GND non era collegato.
KY-006
Cicalino passivo Si tratta di un piccolo altoparlante con un diaframma metallico. Il pin +5 V non è utilizzato.
KY-008
LED laser Un LED laser 650 nm (rosso) a bassa potenza (vedere Figura 9-51). La messa a terra è collegata all’anodo, il segnale al catodo. Il pin+5 V non è utilizzato (ma è collegato al segnale per mezzo di una resistenza da 10K sulla PCB). L’unità ha bisogno di una resistenza esterna che limiti la tensione.
KY-009
LED RGB a 3 colori Utilizza un LED con output simultanei rosso, verde o blu. Diversi moduli testati hanno pinout diversi e quindi prima vi conviene controllare come è collegato ciascun colore.
KY-010
Interruttore ottico Incorpora un interruttore ottico (un LED e un fototransistor) 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.
KY-012
Cicalino attivo Genera un tono di un’altezza fissa quando gli si fornisce alimentazione.
KY-013
Sensore analogico di temperatura Come elemento attivo per rilevare la temperatura, utilizza un termistore (vedere “I termistori” a pagina 315). La tensione di output varia in funzione della temperatura.
KY-015
Sensore di temperatura e umidità Utilizza un sensore di temperatura e umidità DHT11. Trovate ulteriori informazioni su questo componente in “I sensori DHT11 e DHT22” a pagina 313.
KY-016
LED RGB a 3 colori Fondamentalmente uguale al KY-009, ma utilizza un componente through-hole anziché un dispositivo a montaggio superficiale. Interruttore a inclinazione al mercurio Rileva l’inclinazione 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
l’inclinazione 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.
KY-018
Modulo LDR Un modulo LDR (lightdependent resistor). La tensione di output varia quando varia la quantità di luce che colpisce l’LDR (vedere “Le fotocellule” a pagina 321).
KY-019
Relè da 5 V Un piccolo relè montato su PCB (vedere “I relè” a pagina 341) con un driver integrato per interfacciarsi con un segnale di controllo del livello logico.
KY-020
Interruttore a inclinazione Simile al KY-017, ma utilizza una pallina di metallo all’interno di una piccola scatola.
KY-021
Mini interruttore reed Un interruttore reed racchiuso in un piccolo tubo di vetro che si chiude in presenza di un campo magnetico.
KY-022
Sensore/ricevitore di infrarossi Un sensore a infrarossi 1838 come quelli che si utilizzano per i telecomandi dei televisori e altri elettrodomestici. Opera ad una frequenza portante di 37,9 kHz. La presenza del vettore di IR fa sì che l’output diventi
high.
KY-023
Joystick a 2 assi Contiene due potenziometri montati ad angolo retto l’uno rispetto all’altro per rilevare il movimento x–y dell’albero centrale.
KY-024
Sensore lineare a effetto hall Utilizza un sensore lineare SS49E a effetto hall. Per regolare la sensibilità del circuito, con un potenziometro si utilizza un comparatore di tensione LM393.
KY-025
Modulo interruttore reed Utilizza un interruttore reed e il circuito comparatore mostrato nella Figura 9-8.
KY-026
Sensore di fiamma Utilizza un sensore ottimizzato per lunghezze d’onda IR tra 760 e 1100 nm. Il livello di sensibilità è impostato da un potenziometro.
KY-027
Modulo luce magica A essere onesti, non capisco bene per che cosa lo si dovrebbe utilizzare. Il KY-027 è fondamentalmente un KY-017 con un LED su un circuito separato.
KY-028
Sensore di temperatura Utilizza un termistore e un IC comparatore per rilevare una 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 l’inclinazione come il KY-002, il KY-017 e il KY-020.
KY-032
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 sensibilità è impostata dal potenziometro. Notate che esistono almeno due varianti di questo modulo. Controllate il pinout prima di fornire l’alimentazione.
KY-033
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 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.
KY-034
LED a colori con lampeggiamento automatico Un LED lampeggia automaticamente quando gli viene fornita alimentazione.
KY-035
Sensore magnetico a effetto hall Simile al KY-003 ma con un sensore lineare a effetto hall SS49E. Sensore di contatto conduttivo
KY-036
L’output cambia quando qualcosa di conduttivo (come un dito) tocca il piombo del sensore.
KY-037
Sensore con microfono sensibile Un microfono con una soglia variabile. Il microfono più grande (rispetto a quello del modulo KY-038) dota questa unità di un livello leggermente maggiore di sensibilità.
KY-038
Sensore con microfono Un microfono con una soglia variabile. Per via delle dimensioni più ridotte del microfono (rispetto a quello del modulo KY-037), questo modulo è meno sensibile.
KY-039
Sensore del battito cardiaco con LED Fondamentalmente, è come lo strumento molto diffuso negli ospedali e negli studi medici che serve a misurare il ritmo cardiaco dei pazienti. Per rilevare le leggere variazioni di luce di un LED che riflettono il fluire del sangue in un dito, si utilizza un fototransistor.
KY-040
Encoder rotativo Un encoder rotativo digitale e continuo. Trovate maggiori 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 componente
Nome e descrizione Modulo relè Relè da 5 V con contatti da 10 A.
20-019-100
Sensore di distanza a ultrasuoni HC-SR04 Utilizza un paio di trasduttori a ultrasuoni per emettere un segnale e quindi riceverne l’eco. Il tempo trascorso tra la prima emissione e l’eco è 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.
20-011-983
Sensore a effetto hall Utilizza un sensore lineare a 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.
20-011-946
Sensore d’acqua Rileva la presenza d’acqua rispondendo ai cambiamenti della conduttività sulle dita metalliche della PCB. Può essere utilizzato per rilevare
Immagine
Pinout
pioggia o spruzzi.
20-011-985
Sensore di tocco Rileva il tocco di un dito
20-011-984
Sensore di fiamma Risponde a IR tra 760 e 1100 nm. La sensibilità è impostata dal potenziometro.
20-011-988
Sensore di temperatura Utilizza un IC per sensore di temperatura da un filo DS18B20 (vedere “DS18B20” a pagina 312 in un package TO-92.
20-011-986
Sensore di temperatura e umidità relativa Utilizza un sensore di temperatura e umidità DHT11. Trovate ulteriori informazioni su questo componente nella Figura 9-14.
20-011-982
Sensore di vibrazioni/shock Percepisce movimenti improvvisi (shock o vibrazioni) con un sensore sigillato, simile al KY-002 di KEYES.
20-011-987
Sensore per il tracking Utilizza un LED IR LED e un fotosensore per rilevare la rilfettanza.
20-011-981
Sensore fotosensibile Un circuito LDR di base (vedere “Le fotocellule” a pagina 321) con sensibilità variabile.
20-011-944
Modulo joystick Un joystick con potenziometro lineare da due assi. Include
una grande manopola.
I moduli TinkerKit Tabella 9-9 - I moduli I/O TinkerKit.
Numero del componente
Nome e descrizione
T000020
Modulo accelerometro Basato sull’IC LIS344AL da tre assi. Include due amplificatori di segnale.
T000030
Modulo joystick Due potenziometri montati su una sospensione cardanica da due assi.
T000070
Sensore a effetto hall Emette un output relativo alla tensione che dipende dalla potenza di un campo magnetico locale.
T000090
Modulo LDR LDR (light-dependent resistor) con un amplificatore, emette come output una tensione proporzionale al livello della luce.
T000140
Modulo potenziometro rotativo Potenziometro analogico rotativo da 4,7 kohm.
T000150
Modulo potenziometro lineare Potenziometro analogico lineare (slider) da 4,7 kohm.
T000180
Modulo pulsante Semplice modulo pulsante, normalmente aperto, che emette +5 V quando è premuto.
Immagine
T000190
Modulo inclinazione Utilizza un semplice sensore di inclinazione con una pallina metallica interna.
T000200
Modulo termistore Utilizza un termistore e un amplificatore per emettere una tensione proporzionale alla temperatura.
T000220
Modulo sensore di tocco Utilizza un controllo di tocco singolo QT100A per produrre 5 V quando viene toccato il sensore. La parte tattile è quella sulla parte superiore della PCB, che nell’immagine appare piatta.
T010010
Modulo relè Incorpora un relè da 5 V con contatti da 250 V 10 A, un transistor e un blocco di terminali del tipo a vite.
T010020
Modulo mosfet Passa fino a 24 V DC utilizzando un MOSFET IRF520. Abbastanza veloce da poter essere utilizzato con PWM per il controllo di motori DC.
T010110
Modulo LED ad alta intensità Fornisce cinque LED ad alta luminosità. Richiede molta corrente e quindi potete preferire utilizzarlo con un T010020 e un alimentatore esterno.
T010111
LED blu 5 mm Un modulo semplice con un solo LED blu da 5 mm.
T010112
Modulo LED verde 5 mm Un modulo semplice con un solo LED verde da 5 mm.
T010113
Modulo LED giallo 5 mm Un modulo semplice con un solo LED giallo da 5 mm.
T010114
Modulo LED rosso 5 mm Un modulo semplice con un solo LED rosso da 5 mm.
T010115
Modulo LED blu 10 mm Un modulo semplice con un solo LED blu grande 10 mm.
T010116
Modulo LED verde 10 mm Un modulo semplice con un solo LED verde grande 10 mm.
T010117
Modulo LED giallo 10 mm Un modulo semplice con un solo LED giallo grande 10 mm.
T010118
Modulo LED 10 rosso mm Un modulo semplice con un solo LED rosso grande 10 mm.
I moduli Grove SeedStudio ha riunito un gran numero di moduli sotto il sistema di interconnessione Grove. Dal punto di vista della funzionalità, molti di questi sono simili ai moduli messi a disposizione da KEYES, SainSmart e TinkerKit. Altri sono prodotti unici della linea Grove. I moduli Grove sono categorizzati in sei gruppi: monitoraggio ambientale, rilevamento del movimento, interfaccia utente, monitoraggio fisico, funzioni delle porte logiche e controllo dell’alimentazione. 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 è l’inclusione di linguette di montaggio nella PCB della maggior parte dei moduli. Questo permette di lasciare l’hardware di montaggio separato dai circuiti (cosa che non accade quando ci sono fori di montaggio nel mezzo del layout della PCB) e i connettori modulari sono facili da utilizzare. Un esempio di modulo Grove è mostrato nella Figura 9-10.
Figura 9-10 - Un esempio di modulo Grove.
Mentre scrivevo questo libro, i moduli TinkerKit stavano sparendo, mentre i moduli Grove sembravano essere in piena forma. Questo non significa che TinkerKit non tornerà sulla scena o che Grove esisterà per sempre: nel mondo di Arduino le cose cambiano molto in fretta. Come vi ho fatto notare in precedenza, questo capitolo e il Capitolo 8 sono pensati per fornire esempi di quello che è disponibile e non per indicare riferimenti definitivi. Il mercato è troppo volatile per permettere di farlo. Se state cercando dei moduli che seguono una convenzione di un tipo o di un altro, vi consiglio di dare un’occhiata ai prodotti Grove. Se volete utilizzare una shield d’espansione o di interfaccia diversa, potete creare dei cavi di interfaccia personalizzati utilizzando shell, pin e prese già pronti, come descritto in “Costruire connettori personalizzati” a pagina 355. Trovate un elenco completo dei moduli attualmente disponibili sulla wiki di Seeed Studio (http://bit.ly/seeed-grove).
Descrizioni di sensori e moduli Il resto di questo capitolo descrive alcuni dei vari tipi di componenti, moduli e sensori compatibili con Arduino esistenti attualmente. Dico “alcuni dei” perché, come nel caso
delle shield, appaiono continuamente nuovi sensori e moduli e alcuni tipi più vecchi spariscono se non c’è mercato sufficiente per giustificarne la produzione continua. Alcuni moduli sono tipi piuttosto specializzati, come sensori di gas o controlli di corrente. Alcuni sensori possono sparire quando vengono sostituiti da tipi più moderni. Potete trovare tutti i dispositivi descritti qui e molti altri facendo pochissima fatica, utilizzando Google, consultando gli elenchi di Amazon.com oppure i siti web elencati in “Fonti” a pagina 357. La Tabella 9-10 elenca i controlli, i sensori, gli attuatori, i display e i moduli descritti in questo paragrafo. Sono organizzati in base a funzione, classe (input o output) e tipo (dispositivo, componente o modulo). Ricordate che i componenti di ciascun modulo sono disponibili anche come prodotti singoli e quindi potete creare i vostri moduli personalizzati o incorporare i componenti in qualcos’altro. Tabella 9-10 - Indice di sensori e moduli.
Funzione
Classe
Tipo
Descrizione
Audio
Output
Dispositivo
Cicalino (annunciatore), componenti e moduli
Audio
Sensore
Microfono
Moduli pick-up audio (microfono)
Comunicazione
I/O
Modulo
Moduli RF 315/433 MHz
Comunicazione
I/O
Modulo
Moduli wireless APC220
Comunicazione
I/O
Modulo
Ricetrasmittente WiFi ESP8266
Comunicazione
I/O
Modulo
Modulo NRF24L01
Contatto
Sensore
Interruttore
Moduli interruttore a contatto
Contatto
Output
Interruttore
Relè e moduli relè
Controllo
Input
Dispositivo
Tastierini numerici
Controllo
Input
Modulo
Moduli joystick
Controllo
Input
Dispositivo
Potenziometri
Display
Output
Modulo
Moduli a 7 segmenti
Display
Output
Modulo
Display LCD ERM1601SBS-2 16 × 1
Display
Output
Modulo
Display LCD ST7066 (HD44780) 16 × 2
Display
Output
Modulo
Display LCD ERC240128SBS-1 240 × 128
Display
Output
Modulo
Display TFT ST7735R 128 × 160
Emissione di luce
Output
Display
Display LED a 7segmenti
Emissione di luce
Output
Display
Emissione di luce
Output
Laser
Emissione di luce
Output
LED
LED di un solo colore
Emissione di luce
Output
LED
LED bicolori
Emissione di luce
Output
LED
LED tricolori (RGB)
Rilevamento della luce
Sensore
Photocell
Rilevamento della luce
Sensore
Diode
Rilevamento della luce
Sensore
Transistor
Moduli fototransistor
Rilevamento IR
Sensore
IR
Moduli sensore PIR
Magnetico
Sensore
Stato solido
Moduli sensore a effetto hall
Magnetico
Sensore
Stato solido
Moduli magnetometro
Umidità
Sensore
PCB
Movimento
Output
Attuatore
Controllo motori DC
Movimento
Output
Attuatore
Controllo servo
Movimento
Output
Attuatore
Controllo motori passo-passo
Movimento
Sensore
Stato solido
Moduli giroscopio
Movimento
Sensore
Stato solido
Moduli accelerometro
Pressione
Sensore
Stato solido
Moduli sensore barometrico
Intervallo
Sensore
Modulo
Moduli trasmettitore/ricevitore laser
Intervallo
Sensore
Modulo
Moduli sensore oggetto LED
Intervallo
Sensore
Modulo
Moduli misurazione della distanza a ultrasuoni
Rotazione
Sensore
Controllo
Output
Modulo
Temperatura
Sensore
Stato solido
Moduli sensore di temperatura DS18B20
Temperatura
Sensore
Modulo
Moduli sensore temperatura e umidità DHT11/DHT22
Segnale
Moduli matrice di LED LED laser
Moduli LDR Moduli fotodiodo
Moduli sensore umidità del suolo
Moduli encoder rotativo digitale Moduli generatore di forme d’onda
Moduli sensore di temperatura
Temperatura
Sensore
Modulo
Inclinazione
Sensore
Interruttore
Moduli sensore di inclinazione un solo asse
Inclinazione
Sensore
Interruttore
Moduli sensore di inclinazione due assi
Tempo
Supporto
Modulo
Moduli RTC DS1302
Tempo
Supporto
Modulo
Moduli RTC DS1307
Tempo
Supporto
Modulo
Moduli RTC DS3231
Tempo
Supporto
Modulo
Moduli RTC PCF8563
Output
Modulo
Moduli DAC
Sensore
PCB
Tensione Acqua
termistore
Moduli sensore conduttività dell’acqua
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 un’applicazione 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 dall’ambiente fisico e li converte in una forma che un microcontroller possa elaborare. Come implica il nome, “sentono” qualcosa, dove quel qualcosa può essere temperatura, umidità, campi magnetici, luce visibile, calore, infrarossi, suono o movimento fisico.
I sensori di temperatura, umidità e pressione Esistono diversi tipi di sensori ambientali che possono essere utilizzati con Arduino. Che si tratti di semplici sensori di rilevamento dell’acqua basati sulla continuità o di sensori sensibili a temperatura e umidità, è molto probabile che si trovi un sensore capace di misurare quanto è caldo o freddo o umido o secco l’ambiente.
DS18B20 Il DS18B20 è un sensore di temperatura cosiddetto “a un filo” che restituisce al sensore un flusso di dati binari che contiene la temperatura. La Figura 9-11 mostra un modulo facile da trovare con un DS18B20, alcuni componenti passivi e un LED.
Figura 9-11 - Un tipico modulo DS18B20.
La Figura 9-12 mostra il modulo montato su una shield di prototipazione con un relè e un potenziometro. Questo, a proposito, è un semplice termostato digitale che è stato montato per sostituire il termostato elettromeccanico bimetallico ormai morto di una piccola stufa elettrica portatile. Il termostato meccanico del vecchio stile non aveva mai funzionato molto bene, ma con questa semplice sostituzione digitale fa il suo lavoro in modo eccellente. La scheda Arduino cui si collega fornisce anche la possibilità di registrare i dati relativi alla temperatura ed eseguire altre funzioni. Una stufa economica di Internet delle Cose? Certo, perché no?
Figura 9-12 - Esempio di applicazione del modulo DS18B20.
I sensori DHT11 e DHT22 I sensori di temperatura e umidità DHT11 e DHT22 si presentano in package di plastica con tre terminali, come mostra la Figura 9-13. Si trovano anche montati su una piccola PCB, come mostra la Figura 9-14.
Figura 9-13 - Il package di DHT11.
Figura 9-14 - Il modulo DHT11/DHT22.
I sensori DHT11 e DHT22 presentano delle differenze per quanto riguarda la risoluzione e la velocità dei dati seriali. Il DHT11 è un dispositivo di base con una precisione di rilevamento della temperatura di +/– 2 gradi C e una risoluzione dell’umidità 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 dell’umidità relativa del +/– 1%, oltre a una velocità superiore di dati seriali. Il DHT22 ha un intervallo di percezione più ampio rispetto al DHT11: da –40 a 80 gradi C e dallo 0 al 100% di umidità relativa. Il pinout del DHT22 è identico a quello del DHT11. Sia il DHT11 che il DHT22 utilizzano un protocollo per le comunicazioni seriali a un filo e non standard. Funziona adottando un approccio segnale-risposta. Il microcontroller costringe la linea singola di segnale a rimanere low per un breve periodo di tempo e poi le permette di diventare high (per mezzo di una resistenza pull-up, aggiunta esternamente oppure presente sul modulo PCB). Il DHT11/ DHT22 risponde con 40 bit di dati seriali, organizzati come cinque valori di dati da 8 bit, compreso un checksum di 8 bit.
I termistori Un termistore è una resistenza controllata dalla temperatura. Ne esistono con coefficiente di temperatura negativo o positivo. Un dispositivo con coefficiente di
temperatura negativo (NTC, negative temperature coefficient) mostra una resistenza inferiore quando aumenta la temperatura. Un dispositivo con coefficiente di temperatura positivo (PTC, positive temperature coefficient) si comporta nel modo opposto. I termistori NTC sono il tipo più comune che si trova nei sensori e quelli del tipo PTC spesso si utilizzano come limitatori di corrente di spunto. La Figura 9-15 mostra un modo di collegare un termistore a un Arduino, ma attenzione che la curva di risposta del termistore non è lineare. Alcuni circuiti sostituiscono la resistenza fissa con una sorgente di tensione costante.
Figura 9-15 - Un semplice termistore collegato a un Arduino.
Anche se è possibile collegare un termistore direttamente a un Arduino, un modo più facile è utilizzare un modulo che includa i componenti passivi necessari per creare un partitore di tensione per il termistore, come il KY-028 mostrato nella Tabella 9-7. Potete anche utilizzare il circuito amplificatore operazionale mostrato nella Figura 9-26 per aumentare la sensibilità del termistore. Notate che, dal momento che la maggior parte dei termistori utilizzati per rilevare la temperatura sono di tipo NTC, la tensione che appare sull’input analogico di Arduino scende quando la temperature aumenta.
I sensori d’acqua Un sensore d’acqua è 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 d’acqua disponibile presso SainSmart (il 20-011-946). Questo sensore incorpora un transistor NPN che mantiene l’output low quando le sottili tracce della PCB sono collegate da una goccia d’acqua, 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 l’acqua comincia ad allagare la cantina.
Figura 9-16 - Schema di un sensore d’acqua.
I sensori di umidità del suolo Nella sua forma più semplice, un sensore di umidità del suolo a due poli realmente non è nient’altro che una sonda di conduttività. La sonda è configurata in modo che si comporti come un componente di un semplice partitore di tensione e la tensione che appare attraverso di esso sarà una funzione della conduttività del suolo tra le sonde. Potete acquistare un kit composto da una sonda di umidità, un piccolo modulo di interfaccia e un cavo da fornitori come SainSmart. La Figura 9-17 mostra tutti i tre componenti di un kit del genere.
Figura 9-17 - Il kit della sonda per rilevare l’umidità del suolo con il modulo di interfaccia.
Lo stesso effetto può essere ottenuto utilizzando praticamente qualsiasi materiale conduttivo per le sonde. Per un utilizzo prolungato, l’acciaio inossidabile o delle barre di carbonio potrebbero rappresentare una scelta migliore, nei posti dove la corrosione può essere un problema, e un amplificatore o un buffer di qualche tipo è essenziale per ottenere letture omogenee senza perdere troppa corrente nella sonda (cosa che può provocare alcuni effetti collaterali interessanti e anche contribuire alla corrosione degli elettrodi della sonda). Un’altra variazione del sensore di umidità del suolo, il Grove 101020008 di Seeed Studio, è mostrata nella Figura 9-18. Questo sensore include un transistor NPN integrato sulla scheda per portare la caduta della tensione a un livello con il quale l’ADC AVR di Arduino possa lavorare. Lo strato di rame sui poli di questa sonda è stato placcato con un sottile stato d’oro per resistere alla corrosione.
Figura 9-18 - Una sonda per l’umidità del suolo.
Lo schema della sonda per l’umidità del suolo è mostrato nella Figura 9-19. Essenzialmente, il circuito è identico a quello utilizzato per il sensore d’acqua, mostrato nella Figura 9-16. Notate che questo design utilizza un connettore da quattro terminali anziché la connessione con pin utilizzata sulla sonda nella Figura 9-17. Questo è certamente più comodo, ma dovete fare attenzione a come sono collegati i terminali del connettore.
Figura 9-19 - Schema della sonda per l’umidità del suolo.
I sensori barometrici Con un sensore di pressione barometrica, come quello mostrato nella Figura 9-20, e i moduli DHT11 o DHT22 descritti prima (“I sensori DHT11 e DHT22” a pagina 313), si può utilizzare un Arduino per costruire una stazione meteorologia compatta. Il sensore mostrato qui si basa su un sensore MPL115A2 con un’interfaccia 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 all’attrazione gravitazionale), la pallina o la perlina si muovono e chiudono un circuito tra i contatti. Il funzionamento è identico a quello di un interruttore che si chiude. Dovete tenere presente che un sensore di inclinazione non è un sensore proporzionale. È inclinato oppure no e quindi dal punto di vista elettrico è aperto oppure chiuso. Non ci sono opzioni intermedie.
I sensori di inclinazione a un solo asse La Figura 9-21 mostra un modulo con un sensore di inclinazione a perlina di mercurio, in questo caso un KY-017. Questo modulo in particolare rileva l’inclinazione soltanto in una direzione. Per rilevare l’inclinazione sulle due estremità di un asse, dovrete utilizzarne due o più.
Figura 9-21 - Un sensore di inclinazione a un solo asse.
I sensori di inclinazione a due assi La chiave per utilizzare un sensore di inclinazione in modo efficace è determinare la posizione neutra su un determinato asse. Una volta che si sa questo, il sensore può essere orientato in modo che rilevi l’inclinazione su un determinato asse orizzontale. La Figura 9-22 mostra due sensori di inclinazione su un’unica base per rilevare l’inclinazione sugli assi x e y. Notate che questa organizzazione rileva l’inclinazione soltanto in una direzione (che sia verso l’alto e verso il basso, a seconda di come sono montati).
Figura 9-22 - Un sensore di inclinazione a due assi.
Se volete rilevare l’inclinazione verso l’alto o verso il basso su entrambi gli assi, dovete organizzare quattro sensori di inclinazione con la giusta angolazione l’uno rispetto all’altro. In questo modo, potete rilevare l’inclinazione 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 dall’osservatore al fulmine). Esistono piccoli moduli dotati di microfoni e un IC, come quello mostrato nella Figura 923. Il minuscolo potenziometro serve a impostare la soglia del circuito. Questo modulo utilizza un circuito simile a quello mostrato nella Figura 9-8. È anche possibile collegare un microfono direttamente a uno degli input analogici di un Arduino, anche se non si ottiene nessun controllo sulla sua sensibilità. Per migliorarne la sensibilità si può utilizzare un semplice circuito amplificatore operazionale come quello mostrato nella Figura 9-26.
Figura 9-23 - Un modulo pick-up audio.
I sensori di luminosità
I sensori per rilevare la luminosità esistono in una vasta gamma di stili e tipi. Alcuni, come i sensori a infrarossi (IR), possono rilevare il calore. Altri rispondono agli IR emessi dalle fiamme, altri alla luce visibile. Un sensore di luminosità può utilizzare un elemento resistivo che cambia la sua resistenza intrinseca in risposta alla quantità di luce che lo tocca. Altri utilizzano un semiconduttore per fornire una sensibilità maggiore e una risposta rapida.
Le fotocellule Una fotocellula, nota anche come LDR (light-dependent resistor), è esattamente quello che dice il suo nome: un componente nel quale la resistenza cambia in funzione della quantità di luce che lo colpisce. Quasi tutti hanno un aspetto simile a quello mostrato nella Figura 9-24. Anche se questi dispositivi non sono tutti veloci come gli standard dei fotodiodi o dei fototransistor, tutti sono abbastanza veloci da poter trasportare audio in un fascio di luce modulato in ampiezza. Si rivelano utili come rilevatori del livello di luce ambientale, semplici collegamenti con dati ottici codificati con impulsi a bassa velocità, sensori guida perché un robot possa trovare una stazione di ricarica e rilevatori della posizione del sole per una matrice di pannelli solari.
Figura 9-24 - Un tipico dispositivo LDR economico.
I fotodiodi Anche se la maggior parte dei diodi sono dotati di un qualche grado di sensibilità alla luce, per ottenere questo effetto serve un fotodiodo. Un fotodiodo, come suggerisce il suo nome, è un diodo che è stato prodotto in modo che diventi conduttivo quando lo colpisce la luce e un tipo comune di fotodiodo è il diodo PIN. La “I” sta per lo strato di materiale silicio “intrinseco” tra le parti di silicio P e N del diodo e questo strato di materiale intrinseco rende un diodo PIN un ottimo rilevatore di luce. Dal momento che
rispondono molto velocemente, si rivelano utili per i collegamenti di comunicazione con dati ottici e come sensori di posizione per meccanismi rotativi. I diodi PIN si trovano anche in circuiti radio ad alta frequenza, dove fungono da interruttore. Per ulteriori informazioni sui diodi e altri dispositivi a stato solido, potete consultare l’Appendice 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 l’elettricità finché non viene esposto alla luce. Questo circuito funziona bene con una fonte di luce sufficientemente intensa, ma potrebbe trovare difficoltà in caso di condizioni di illuminazione scarse.
Figura 9-25 - La semplice connessione di un fotodiodo con Arduino.
Un modo per aumentarne la sensibilità è utilizzare una amplificatore operazionale, come mostra la Figura 9-26. In questo caso, si utilizza un amplificatore operazionale LM358 con un guadagno di circa 10 per fare in modo che la piccola tensione cambi quando il diodo arriva a un livello che l’ADC di Arduino può rilevare e convertire facilmente. Il potenziometro imposta il guadagno del circuito, in modo che possa essere regolato per adattarsi a una specifica applicazione. Questo circuito può essere assemblato facilmente su una piccola breadboard che non richiede saldature, oppure i componenti possono essere montati su una PCB di prototipazione (spesso detta “scheda millefiori”) per una sistemazione più permanente.
Figura 9-26 - Il collegamento di un fotodiodo con un amplificatore operazionale.
Potete consultare la selezione di fotodiodi (e di amplificatori operazionali) disponibili presso distributori di componenti elettronici come Digikey (http://www.digikey.com), Mouser (http://www.mouser.com) e Newark/Element14 (http://www.newark.com). Inoltre, molti fornitori di avanzi di magazzino hanno a portata di mano stock di fotodiodi.
I fototransistor Come suggerisce il nome, un fototransistor risponde alla luce variando la quantità di tensione che attraversa il dispositivo, proprio come farebbe altrimenti il terminale di input di base. Il circuito mostrato nella Figura 9-8 funziona con un fototransistor. Alcuni moduli, come il KY-039, si limitano a collegare i terminali del transistor ai pin del connettore (potete eliminare il LED e utilizzare il modulo come modulo sensore fototransistor, a proposito). Potete espandere il circuito di base aggiungendo un amplificatore operazionale per un maggiore guadagno. La Figura 9-27 mostra come si può fare. Andranno bene praticamente tutti i fototransistor NPN per giardinaggio, ma a me piace il BFH310, soprattutto perché l’ho 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 l’output 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 all’altro 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 dell’ambiente (come quando un essere umano, con il suo calore, entra nella stanza), il dispositivo emette un segnale. Un sensore PIR può essere utilizzato anche per ottenere una misurazione approssimativa della temperatura di qualsiasi cosa si trovi nel campo visivo. La Figura 9-28 mostra un modulo PIR piuttosto diffuso.
Figura 9-28 - Un rilevatore PIR.
Questo modulo è in vendita per circa 2 $ presso Banggood (http://www.banggood.com) e altri distributori. Utilizza tre connessioni: +5 V, messa a terra e output. L’output diventa high quando il sensore rileva un cambiamento negli IR dell’ambiente. Se combinate questo con un sensore audio, come quello mostrato nella Figura 9-23, con il codice di base per il sistema di sicurezza descritto nell’Esempio 5-5, otterrete un sistema di allarme anti intrusione perfetto.
I sensori magnetici Una delle aree dove la tecnologia dei semiconduttori ha fatto considerevoli passi avanti è quella del rilevamento dei campi magnetici statici. Rilevare un campo magnetico che oscilla, come quello prodotto da una molla, è relativamente facile, dal momento che non serve nient’altro che un’altra 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 un’escursione oppure per rilevare il campo magnetico intorno a un filo che trasporta corrente continua diretta, ma utilizzarla per raccogliere dati si rivelerebbe molto noioso. Oggigiorno, è possibile costruire un rilevatore di campi magnetici o una bussola elettronica senza parti mobili che si interfacci direttamente con un microcontroller.
I sensori a effetto hall Un sensore a effetto hall è in grado di rilevare la presenza di un campo magnetico. Alcuni tipi, come l’A3144 utilizzato nel KY-003, sono pensati per essere dispositivi di tipo on/off: che rilevano se il campo magnetico è presente o meno. Altri tipi, come l’SS49E, sono tipi lineari, con un output analogico proporzionale relativo al campo magnetico rilevato. Il KY-024 è un esempio di un modulo con un sensore lineare a effetto hall. Sia
l’A3144 che l’SS49E hanno l’aspetto di piccoli transistor fatti di plastica e quindi qui non li mostrerò. Nel caso dell’A3144 e dispositivi simili, potete collegarlo direttamente a un Arduino, che è essenzialmente quello che fa il modulo KY-003. Il modulo KY-024 utilizza il circuito comparatore comune mostrato nella Figura 9-8.
I sensori magnetometro Un’altra 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 un’interfaccia I2C.
Figura 9-29 - Un modulo bussola con magnetometro.
I sensori di vibrazioni e shock Di solito, i sensori di vibrazioni e shock si basano sul rilevamento del movimento in una massa di qualche tipo. Questa massa può essere un semplice braccio meccanico con una piccola massa sull’estremità e qualche contatto sistemato in modo che il braccio chiuda un circuito con uno o con l’altro quando si piega. Un’altra variazione potrebbe utilizzare un sensore ottico che cambi il suo stato di output quando il braccio interrompe un fascio di luce. Può anche trattarsi di una massa scorrevole con contatti, sensori ottici o perfino un sensore magnetico. Un altro tipo che viene utilizzato include un sensore piezoelettrico per rilevare il movimento in una massa. Un tipo molto economico di sensore di vibrazioni utilizza una piccola massa conduttiva in un contenitore sigillato. Quando la massa si muove, si rompe e fa contatto con le
maniche conduttive che si trovano su ciascuna estremità del contenitore. Il KY-020 è un tipico modulo con un sensore di questo tipo. Un sensore di shock è simile a un sensore di vibrazioni, ma in alcuni casi i sensori di shock sono progettati per rispondere a livelli di input specifici in termini di alcuni multipli di g (1g = la forza di gravità della Terra a livello del mare). Il KY-031 è un esempio di modulo sensore di shock a basso costo. Potete costruirvi un sensore di shock o di impatto utilizzando una pallina di metallo (una BB andrà bene), una molla (magari quella di una penna a sfera), un pezzettino di tubo di plastica e qualche filo di basso calibro. La Figura 9-30 mostra come si assemblano tutti i componenti.
Figura 9-30 - Un sensore di impatto o di shock fatto in casa.
Se avete bisogno di una maggiore precisione, potete trovare sensori di shock industriali calibrati per livelli di forza specifici. Questi si utilizzano per esempio per testare gli impatti delle automobili o la tolleranza agli impatti dei contenitori per inviare dispositivi delicati. In ogni caso, non sono economici.
I sensori di movimento La capacità di rilevare cambiamenti angolari della posizione a velocità variabili è la
chiave per mantenere stabili le cose nello spazio tridimensionale. Molti quadricotteri (o droni, come a volte vengono chiamati) incorporano qualche forma di rilevamento del movimento su diversi assi per simulare il funzionamento di un vero giroscopio meccanico o IMU (inertial management unit). Questi tipi di dispositivi sono diffusi anche presso gli appassionati di aerei ed elicotteri RC e alcuni utenti avventurosi li hanno inseriti in modellini di razzi per seguire e registrare il movimento del razzo durante il volo. I recenti progressi della tecnologia e delle tecniche di produzione hanno permesso di abbassare i prezzi di questi dispositivi a livelli impossibili da immaginare in passato. Un giroscopio a stato solido o un accelerometro che prima costavano perfino 50 $ adesso possono essere acquistati per circa 10 $. Per via del basso costo e del fatto che i componenti IC sono package molto piccoli a montaggio superficiale a passo stretto, ha più senso acquistare un modulo piuttosto che cercare di assemblare qualcosa partendo da zero, a meno che, naturalmente, non vogliate utilizzarlo come parte di qualcosa di più grande e non abbiate la capacità di utilizzare componenti a montaggio superficiale.
I giroscopi Il termine “giroscopio” è improprio quando lo si applica a dispositivi digitali di rilevamento. A differenza dei giroscopi meccanici veri e propri, questi dispositivi sono più simili a sensori di velocità angolare pensati per rilevare il movimento intorno a un asse. Non fanno riferimento per natura a una posizione di partenza inerziale come un giroscopio vero e proprio. Un IMU può farlo, ma la maggior parte dei dispositivi IMU elettromeccanici sono oggetti grandi e pesanti con tre (o più) giroscopi interni ad alta velocità in cuscinetti a sfera di precisione con motori elettrici e sensori di posizione. Tendono anche a essere molto, molto cari. Tuttavia, con un po’ di programmazione intelligente e l’uso di accelerometri multiassiali (che vedremo tra poco) è possibile simulare un’IMU. 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 l’accelerometro si muove a una velocità costante, non rileva nessun cambiamento, ma quando la velocità cambia per via dell’accelerazione o della decelerazione, il sensore genera un output. Un accelerometro da tre assi rileva i cambiamenti di velocità sugli assi x, y e z. La Figura 9-32 mostra un modulo accelerometro da un solo asse economico, basato su MMA7361 e venduto da DealeXtreme, ma moduli come questo si trovano anche presso Adafruit, SparkFun e altri rivenditori.
Figura 9-32 - Un modulo accelerometro.
I sensori a contatto e di posizione I sensori a contatto si trovano in applicazioni di ogni tipo, dalle macchine per l’imbottigliamento delle bevande agli strumenti controllati dal computer in negozi di macchine. I pulsanti sulle scatole di effetti come quelle che utilizzano i musicisti sono un tipo di sensore a contatto. Ma, a prescindere da come sono fatti, i sensori a contatto funzionano tutti in base allo stesso principio: o sono in contatto fisico con qualcosa, oppure non lo sono. I sensori di posizione, come suggerisce il loro nome, si utilizzano per rilevare la posizione di qualcosa. A differenza dei sensori a contatto, di solito quelli di posizione hanno la capacità di percepire il grado di vicinanza oppure una certa quantità di rotazione angolare. Alcuni sensori di posizione utilizzano la luce riflessa, altri utilizzano il suono e altri ancora incorporano un rotore progettato specificamente e un fascio di luce per misurare il movimento angolare. Un’altra forma di sensore di posizione, detto encoder assoluto, utilizza un disco di vetro interno con dei segni molto sottili per determinare il grado preciso di rotazione di un albero. Gli encoder assoluti non sono trattati qui.
Gli interruttori a contatto Un interruttore a contatto può essere semplice come un filo “whisker” fatto con una bobina con un palo conduttivo nel centro, come quelli che si trovano nei piccoli insetti robot che si vendono nei negozi di giocattoli. Quando il whisker si piega, la bobina entra in contatto con il palo conduttivo e chiude il circuito. In altre parole, non è altro che un interruttore. La Figura 9-33 mostra un’immagine più da vicino di questo tipo di sensore a contatto.
Figura 9-33 - Un sensore a contatto con bobina whisker.
All’altra estremità dello spettro ci sono i cosiddetti interruttori a scatto, come quello montato su un modulo nella Figura 9-34. Questo è un modulo sensore di impatto Meeeno. Questi tipi di interruttori spesso si trovano in applicazioni come sensori di limiti per oggetti di robotica o strumenti per macchine CNC (computer-numeric controlled).
Figura 9-34 - Un tipico interruttore a scatto.
Un pulsante può anche fungere da sensore a contatto. Gli interruttori a pressione di vecchio stile che si utilizzavano sulle automobili per accendere la luce all’interno del veicolo quando la porta era aperta sono eccellenti sensori a contatto (anche se possono richiedere una certa forza per attivarli, più di quella che può fornire un piccolo robot tipico). Per rilevare il contatto fisico si possono utilizzare perfino una striscia di rame e una vite, come mostra la Figura 9-35. L’importante è che l’interruttore chiuda (o apra) il circuito, in modo che un Arduino possa accorgersene e rispondervi.
Figura 9-35 - Un semplice sensore a contatto fatto con una striscia di metallo.
Gli encoder rotativi digitali Un encoder rotativo digitale, come le unità mostrate nella Figura 9-36, genera impulsi oppure emette un valore numerico quando viene ruotato un albero. Anche il modulo KY040 utilizza un encoder rotativo. Alcuni encoder rotativi presentano sull’albero dei denti di arresto in modo che l’operatore possa notare dei lievi urti mentre lo gira. Nel caso di applicazioni che non richiedono che qualcuno giri una manopola, l’albero si muove liberamente e continuamente. Nel Capitolo 12 trovate un esempio di come si crea un software per leggere un encoder rotativo come il KY-040.
Figura 9-36 - Gli encoder rotativi digitali.
I mouse vecchio stile dei computer utilizzavano una sfera di metallo rivestita anziché un LED e due encoder rotativi per rilevare il movimento della sfera. Questi stanno diventando rari, ma al loro interno presentano alcuni componenti interessanti. Se ne smontate uno, notate le ruote di plastica con delle fessure a distanza uniforme. Quando le ruote si muovono, il fascio di luce di un LED viene interrotto. Rilevando il ritmo degli impulsi, il piccolo microcontroller contenuto nel mouse può generare valori numerici che indichino quanto lontano si è spostato il mouse nelle direzioni x e y su una superficie. La Figura 9-37 mostra la parte interna di un tipico mouse a sfera.
Figura 9-37 - Un mouse del vecchio stile con una sfera ed encoder rotativi.
In questo mouse in particolare, il LED sender e il fototransistor (o fotodiodo, forse) sono due componenti separati. Altri modelli di questi vecchi mouse a sfera utilizzano interruttori ottici, come quelli che si utilizzano nel modulo KY-010 mostrato nella Tabella 9-7. Le ruote dell’interruttore sono gestite da alberi in contatto con i lati della sfera di metallo. Se mai avete utilizzato un mouse a sfera per un po’ di tempo, sapere che occasionalmente dovete rimuovere la sfera e pulire tutto lo sporco che si è accumulato sull’albero (e anche sulla sfera). Le ruote dell’interruttore e i sensori ottici possono essere rimossi e riutilizzati in qualcos’altro (francamente, le ruote dell’interruttore sono probabilmente la parte più utile di un mouse di questo tipo).
I trasmettitori/ricevitori laser Il modulo mostrato nella Figura 9-38 è un trasmettitore e ricevitore laser a corto raggio progettato principalmente per rilevare ostacoli o svolgere qualsiasi altra operazione dove si possa utilizzare la riflettanza per rilevare un oggetto. Può essere utilizzato come collegamento di dati, ma le ottiche dovrebbero essere perfezionate per raggiungere un raggio significativo.
Figura 9-38 - Il rilevatore di oggetti laser a corto raggio.
I sensori di distanza La capacità sia di rilevare un oggetto che di determinarne la distanza dal sensore è una funzione chiave in molte applicazioni di robotica. Un sensore di distanza di solito utilizza la riflessione, che sia della luce, del suono o di onde radio nel caso di un radar. Qui vedremo il suono e la luce, dal momento che i sensori radar tendono a essere piuttosto costosi e funzionano meglio sulle grandi distanze. Per rilevare un corto raggio, vanno bene sensori ottici o acustici, che sono molto economici.
I sensori di oggetti con LED Un sensore di oggetti con LED funziona misurando la luce emessa da un LED (che sia ottica o IR) e riflessa da una superficie. Questi dispositivi di solito hanno un LED IR e un rilevatore situati uno a fianco all’altro, come nel modulo mostrato nella Figura 9-39. Non misurano il tempo che impiega la luce a viaggiare dall’emettitore e tornare al sensore, perché a corto raggio la velocità della luce lo renderebbe estremamente difficile da calcolare. Se volete misurare la distanza dalla Terra alla Luna utilizzando uno dei retroriflettori lasciati dalle missioni Apollo, dovete utilizzare un laser a impulsi, un grande telescopio e un buon timer ad alta precisione: Nel caso di Arduino, invece, un sensore riflettente basterà per evitare a un piccolo robot di andare a sbattere contro il muro o per permettergli di seguire una linea sul pavimento.
Figura 9-39 - Il modulo sensore di oggetti riflettente.
I misuratori di distanza a ultrasuoni Se siete abbastanza grandi, potete ricordare le vecchie fotocamere “istantanee” che includevano un misuratore di distanza a ultrasuoni per mettere a fuoco automaticamente il soggetto e scattare una fotografia che potevate guardare mentre si sviluppava. Il misuratore di distanza di solito consisteva di un paio di sensori piezoelettrici, uno collegato come emettitore e l’altro come ricevitore. L’emettitore generava un breve impulso di ultrasuoni e l’eco veniva rilevato dal ricevitore. Con questo tipo di misuratore di distanza, il tempo tra l’output dell’impulso e il ritorno dell’eco è determinato dalla distanza di quello che stanno puntando i sensori. Questo funziona perché il suono si muove con relativa lentezza e quindi ottenere il tempo trascorso tra l’impulso e il ritorno non è una cosa particolarmente difficile da fare con una logica abbastanza veloce. Oggigiorno, potete trovare un misuratore di distanza a ultrasuoni per pochi euro e lo potete collegare a una scheda Arduino. Un esempio di un sensore a ultrasuoni facile da trovare è il modulo 20-019-100 mostrato nella Tabella 9-8.
Le comunicazioni Esistono numerosi moduli per applicazioni basate sulle comunicazioni, da semplici adattatori RS-232 a moduli trasmettitori/ricevitori di comunicazioni wireless e laser.
I moduli wireless APC220 I moduli ricetrasmittente APC220 funzionano tra i 418 e i 455 MHz. Un collegamento digitale completo consiste di due moduli e un adattatore USB opzionale. Questo permette a un modulo di collegarsi a un PC e all’altro di collegarsi a una scheda Arduino. L’APC220 è in grado di trasferire dati a 19.200 bit al secondo, con un raggio di
fino 1.000 metri. La shield multifunzione descritta in “Shield varie” a pagina 273 include un punto di connessione per un modulo APC220, così come la shield LCD 16 × 2 di DFRobot (anch’essa analizzata nel Capitolo 8). La Figura 9-40 mostra un paio di moduli APC220.
Figura 9-40 - I moduli ricetrasmittente RF APC220 (immagine: DFRobot).
I moduli RF 315/433 MHz Questi moduli, con un raggio di fino a 500 piedi (150 metri), sono alternative a basso costo dell’APC220. Lo svantaggio è che non sono ricetrasmittenti, ma si presentano come una coppia di trasmettitore e ricevitore, come mostra la Figura 9-41. Sono disponibili preimpostati su 315 MHz o 433 MHz. Notate che dovete aggiungervi la vostra propria antenna.
Figura 9-41 - Il trasmettitore e ricevitore a 433 MHz.
La ricetrasmittente ESP8266 Questo modulo WiFi altamente integrato, mostrato nella Figura 9-42, supporta i protocolli 802.11 b/g/n e utilizza un’interfaccia seriale per comunicare con un Arduino. La MCU da 32 bit integrata nella scheda ha uno stack di protocolli di rete TCP/IP nel suo firmware. Gestisce i dettagli di basso livello per stabilire e mantenere un collegamento digitale e quindi l’unica cosa che deve fare Arduino è specificare un indirizzo con il quale collegarsi, oppure aspettare che qualche altro modulo si colleghi con lui.
Figura 9-42 - Un modulo ricetrasmittente WiFi.
L’NRF24L01 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 un’interfaccia SPI. Questi moduli possono essere acquistati per circa 3 $ da diversi rivenditori.
Figura 9-43 - La ricetrasmittente RF NRF24L01.
L’adattatore 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 RS232 standard. Anziché costruire un convertitore personalizzato, il modulo adattatore RS232 fornisce il convertitore, l’ID e un connettore DB-9, come mostra la Figura 9-44. I pin RxD e TxD della MCU si collegano direttamente al modulo.
Figura 9-44 - Il modulo adattatore RS-232.
Dispositivi e componenti di output Un output proveniente da una scheda Arduino può essere un LED, un servo motore, un relè, oppure qualche altro modulo, componente o dispositivo che risponda a un segnale o a un comando che venga dal microcontroller AVR di Arduino. Questo paragrafo comincia con le fonti di luce, seguite dai relè, dai motori e dai servo. Parla anche delle fonti di suono, come l’altoparlante KY-006 che risponde agli impulsi e che appare nella Tabella 9-7. I componenti relativi all’input e all’output dell’utente sono trattati in paragrafi successivi.
Le fonti di luce Le fonti di luce possono essere lampadine vecchio stile in una vasta gamma di tipi e dimensioni, oppure LED, dispositivi a stato solido che si comportano come diodi ma emettono un bagliore intenso quando li attraversa la corrente. In questo paragrafo ci concentreremo sui LED, principalmente perché sono economici, durano a lungo e non sempre hanno bisogno di un circuito per gestirli. Perfino una piccola lampadina a incandescenza può consumare una quantità significativa di corrente e tendere a surriscaldarsi o a bruciarsi. Detto questo, non c’è ragione per cui non possiate utilizzare lampadine a incandescenza: dovete soltanto prepararvi ad affrontare la complessità (e il costo) di un ulteriore circuito e la necessità di sostituire occasionalmente una lampadina bruciata. I LED sono disponibili in una vasta gamma di stili, dimensioni e colori. Un microcontroller AVR può fornire dai 5 ai 10 mA necessari per gestire un LED, ma generalmente non è una buona idea collegare direttamente diversi LED oppure cercare di gestire qualcosa come un modulo LED ad alto output. Per questo, il modo migliore di procedere è con un driver di qualche tipo. Le prossime immagini mostrano alcuni dei tipi di LED disponibili e che si possono anche trovare già montati sulle PCB dei moduli, come quelli mostrati nella Tabella 9-7 e nella Tabella 9-9.
I LED a un solo colore I LED a un solo colore possono avere dimensioni che vanno da minuscoli componenti a montaggio superficiale, come il LED D13 della scheda Arduino, agli enormi dispositivi utilizzati per applicazioni di illuminazione. La Figura 9-45 mostra una selezione di alcuni dei vari tipi disponibili.
Figura 9-45 - Un comune LED di un solo colore.
I LED bicolori Un LED bicolore è fondamentalmente una coppia di LED montati in un unico package, che generalmente si presenta come un LED normale con una connessione interna come quella mostrata nella Figura 9-46. I LED interni sono collegati al contrario l’uno rispetto all’altro. Quando la corrente fluisce in una direzione, uno dei LED si accende e quando la corrente viene invertita si accende l’altro.
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 all’interno del package di plastica del dispositivo.
I LED tricolori (RGB) Un LED tricolore è composto da tre chip separati in un unico package di plastica. La Figura 9-47 mostra un componente a montaggio superficiale. È possibile montarne un gran numero in una serie su un’unica PCB e diverse PCB possono essere montate una a fianco all’altra per creare un grande display LED pieno di colori.
Figura 9-47 - Un LED tricolore a montaggio superficiale.
Un LED tricolore può produrre un’approssimazione di qualsiasi colore visibile variando l’intensità`dell’output di ciascuno dei LED interni. Dal momento che le matrici dei LED (i chip dei singoli LED) sono fisicamente separate, i colori si miscelano con un diffusore di un qualche tipo. Dalla distanza può sembrare convincente. LED RGB ad alta potenza e alto output sono stati utilizzati per creare enormi display a colori, come quelli che si vedono accanto agli edifici o nei grandi stadi sportivi.
Le matrici di LED Una matrice di LED è utile per una vasta gamma di applicazioni. Una matrice 8 × 8, come quella mostrata nella Figura 9-48, può essere utilizzata per mostrare lettere o numeri. Se disponete diversi di questi moduli uno accanto all’altro, 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 all’altro, la distanza tra l’ultima colonna o l’ultima riga su un modulo e la colonna o la riga adiacente sul modulo successivo è uguale alla distanza tra i LED che si trovano al centro del modulo. Questo mantiene uniforme la distanza quando si utilizzano molti moduli per creare display grandi.
I display LED a 7 segmenti Il venerabile display a 7 segmenti esiste da molto tempo. Oltre a singoli LED, questa è stata la prima applicazione valida per la tecnologia a LED e prima della fine degli anni ’70 i moduli display con cifre LED a 7 segmenti e alfanumerici cominciavano ad apparire in applicazioni di ogni tipo. La Figura 9-49 mostra un tipico modulo display da 4 cifre.
Figura 9-49 - Un tipico display a 7 segmenti a 4 cifre.
Come nel caso del modulo matrice di LED mostrato nella Figura 9-48, la distanza sui bordi di questo modulo è inferiore, in modo che si possano montare diversi moduli uno accanto all’altro. Con tre di questi componenti potete facilmente creare un display a virgola mobile da 12 cifre.
I moduli LED a 7 segmenti I moduli display a 7 segmenti sono disponibili con interfaccia I2C o SPI integrata. Il modulo mostrato nella Figura 9-50 ne è un esempio. Questo specifico modulo può essere acquistato presso Tindie (vedere Tabella 9-11). Esistono anche moduli con diversi display e si trovano in rosso, verde, giallo e blu.
Figura 9-50 - Un modulo display a 7 segmenti con interfaccia SPI.
I laser Alcuni tipi di fonti di luce con diodo sono anche i laser come quelli che si trovano nei puntatori laser, mentre altri sono abbastanza potenti da tagliare la plastica o il legno. Un laser a stato solido è essenzialmente un LED con alcune modifiche interne per fargli produrre una luce coerente. I LED laser sono disponibili con lunghezze d’onda di output che vanno da infrarosso a blu. Senza questi dispositivi, cose come livelli laser per lavori di costruzione, puntatori per docenti e istruttori, profilatori di superfici per la modellazione 3D, riproduttori e registratori CD e DVD e alcuni tipi di strumenti da taglio industriali non sarebbero possibili. Un tipico piccolo modulo LED laser è mostrato nella Figura 9-51 (si tratta di un KY-008).
Figura 9-51 - Un tipico LED laser rosso a bassa potenza.
Il LED laser può essere acquistato come componente separato presso distributori di elettronica.
I relè, i motori e i servo Molti piccoli relè possono trasportare più corrente per alimentare la bobina interna rispetto a quanto non possa fare con sicurezza il microcontroller AVR della PCB di Arduino. I motori e i servo sono esempi di dispositivi molto utili che spesso hanno bisogno di un componente driver di qualche tipo che fornisca loro la corrente di cui hanno bisogno per funzionare.
I relè I relè esistono in una vasta gamma di dimensioni e forme, da piccoli package che sembrano IC DIP da 14 pin a oggetti enormi per controllare grandi carichi in attrezzature industriali. Nel caso della maggior parte delle applicazioni Arduino, è sufficiente un piccolo relè. Un piccolo relè può gestire un relè più grande, che a sua volta può gestirne uno ancora più grande e così via. Il KY-019 è un esempio di un modulo relè che può essere collegato direttamente ad Arduino. Il driver di un relè può essere un semplice transistor 2N2222, oppure può trattarsi di un IC progettato specificamente per gestire la corrente e i picchi inversi incontrati con i relè. Il circuito mostrato nella Figura 9-5, che abbiamo visto prima, utilizza un transistor NPN per controllare un piccolo relè montato sulla PCB. La Figura 9-52 mostra un modulo con quattro relè. La PCB include anche i transistor del driver, le resistenze e i diodi necessari. Tutto quello che è richiesto è una sorgente di DC 5 V per gestire le bobine dei relè e segnali logici standard per controllarli.
Figura 9-52 - Un modulo relè con quattro relè montati sulla PCB.
Il controllo dei servo Il termine servo di solito si riferisce a piccoli dispositivi simili a motori, anche se in passato veniva utilizzato per riferirsi a ingombranti attuatori utilizzati per cose come come il posizionamento di pistole su una nave militare o l’esecuzione di calcoli analogici. I tipici piccoli servo, come quelli mostrati nella Figura 9-53, si utilizzano nelle macchinine e negli aereini radiocontrollati, oltre che nella robotica a livello di hobby.
Figura 9-53 - Una selezione di piccoli servo.
Anche se esistono delle shield da usare con i servo (vedere Capitolo 8), un microcontroller AVR può gestire questi dispositivi direttamente con i suoi output PWM. Un servo come quelli mostrati nella Figura 9-53 ruota un albero di 180 gradi, con la quantità della rotazione determinata dall’ampiezza dell’impulso e dalla frequenza di un segnale di controllo.
Il controllo di motori DC I motori DC di solito sono controllati con quello che viene detto circuito “a ponte H” e la Figura 9-54 mostra un diagramma semplificato.
Figura 9-54 - Un ponte H semplificato.
Un ponte H può essere utilizzato con DC continua o con un segnale PWM e, a seconda di come è gestito il motore, può girare in un senso o nell’altro. Non vi consiglio di costruire un circuito di controllo di un motore a partire da zero (a meno che non vogliate davvero farlo, naturalmente). Una shield come quella mostrata nella Figura 9-55 è dotata di tutto il necessario per controllare un motore DC. Ha anche un radiatore per dissipare il calore generato con grandi carichi di corrente. Questa particolare shield è di Seeed Studio (http://bit.ly/seeed-motor-v2). Notate che la shield controlla due motori DC oppure un motore passo-passo.
Figura 9-55 - Una shield per controllare motori.
Il controllo di motori passo-passo I motori passo-passo sono relativamente semplici da controllare, una volta che si forniscono loro i necessari componenti elettronici per generare gli impulsi che facciano girare l’albero. Un requisito è la corrente e, anche se un IC come l’ULN2003A fornisce tutto il necessario per gestire un piccolo motore passo-passo, non riesce a gestire motori grandi che richiedono molta corrente. L’ULN2003A è fondamentalmente soltanto una serie di otto transistor Darlington e quindi Arduino deve occuparsi di tutto il timing per gli impulsi del motore. Esistono delle shield (vedere Capitolo 8) che contengono i circuiti per fino a quattro motori passo-passo, insieme ai connettori necessari per collegarli in un modo leggermente più facile. Come nel caso dei motori DC, utilizzare qualcosa che è già costruito è molto più facile che costruire qualcosa a partire da zero e, se considerate anche il tempo necessario, probabilmente risulta anche più economico.
Gli output dei segnali analogici
I segnali analogici sono i fenomeni ciclici continuamente variabili che spesso definiamo suono, oltre a quei segnali oltre l’intervallo udibile per gli esseri umani, come quelli radio. Esistono diversi modi di utilizzare una scheda Arduino per produrre segnali analogici di tipo onda sinusoidale, dei quali tutti richiedono qualche componente esterno aggiuntivo. Un microcontroller AVR non incorpora un convertitore digitale-analogico (DAC) nel suo design, per cui, se volete ottenere qualcosa di diverso da onde quadre da un output PWM o del timer, avete bisogno di qualcosa per generare i segnali.
I cicalini I cicalini possono essere oggetti semplici che emettono un tono ad altezza fissa quando sono attivi, oppure possono essere leggermente più sofisticati e generare un picco programmabile. Il KY-006 e il KY-012 sono esempi di questi tipi di sorgenti audio.
I moduli DAC Un modo di fornire ad Arduino la funzionalità digitale-analogico è con un modulo DAC, come l’unità mostrata nella Figura 9-56. Questo prodotto in particolare è di Adafruit e si basa sull’IC MCP4725, che è un DAC a un solo canale da 12 bit con un’interfaccia I2C.
Figura 9-56 - Il modulo DAC basato su MCP4725.
Un DAC si rivela utile quando c’è bisogno di un segnale continuamente variabile, come una tensione di controllo per qualche altro circuito o dispositivo. Un DAC può essere utilizzato anche per generare una forma d’onda come una rampa o un’onda sinusoidale. Con la velocità delle comunicazioni da 100 Kb/s della modalità standard I2C utilizzata con i microcontroller AVR non è possibile raggiungere la velocità di aggiornamento possibile con tipi di interfaccia I2C più rapidi, ma un DAC può comunque generare una rispettabile onda sinusoidale a bassa frequenza. Lo svantaggio è che l’AVR di solito non sta facendo nient’altro che aggiornare il DAC per produrre forme d’onda.
I generatori di forme d’onda Anche se è possibile generare forme d’onda a bassa frequenza direttamente con una scheda Arduino e un modulo DAC, per forme d’onda di qualità oltre a circa 1 kHz è necessario un altro circuito. Un dispositivo di questo tipo è il modulo DDS (direct digital synthesis) mostrato nella Figura 9-57.
Figura 9-57 - Il modulo DDS basato sull’AD9850.
L’IC AD9850 può generare sia onde quadre che onde sinusoidali da 1 Hz a 40 MHz. Potete scaricare la scheda tecnica dell’AD9850 da Analog Devices (http://bit.ly/ad9850data). L’AD9850 utilizza la sua propria interfaccia unica e può essere controllata utilizzando un’interfaccia parallela da 8 bit o una seriale. Esistono anche le librerie di Arduino per il AD9850.
L’input dell’utente 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 all’altro con etichette, di solito disposti in una griglia di 3 × 3, 3 × 4 o 4 × 4. Può riferirsi anche a un cosiddetto tastierino a membrana, che è una serie di piccoli interruttori a membrana su una PCB. Di solito i tasti sono contrassegnati con lettere e numeri, come gli esempi mostrati nella Figura 9-58. I tastierini non devono per forza essere rettangolari, ma se ne trovano in una vasta gamma di stili e layout. In effetti, la tastiera di un computer non
è altro che un tastierino molto grande.
Figura 9-58 - Un assortimento di tastierini.
I joystick I joystick di solito possono essere di due tipi: analogici continui oppure digitali discreti. Un joystick analogico continuo, come quello mostrato nella Figura 9-59, utilizza due potenziometri, ciascun collegato agli assi x e y. I valori letti dai potenziometri indicano quanto lontano si è spostato il joystick e in quale posizione si trova attualmente.
Figura 9-59 - Un modulo joystick analogico.
Un joystick digitale discreto utilizza piccoli interruttori o altri tipi di rilevatori per rilevare quando è stato spostato il joystick alla sua estensione massima in entrambe le direzioni, x o y. Questi tipi di joystick venivano utilizzati con i primi giochi economici di fascia consumer e i personal computer. Sono dispositivi “tutto o niente”, ma sono economici da produrre e non presentano problemi con lo sporco e l’usura che possono affliggere i joystick analogici. Molte shield LCD incorporano un joystick discreto.
I potenziometri e gli encoder rotativi Un potenziometro è una resistenza variabile, di solito utilizzata per il controllo dell’input. Un potenziometro può essere utilizzato in un modulo dimmer per le luci, come controllo del volume, come controllo dell’input per uno strumento di test, oppure come input per una vasta gamma di circuiti analogici. I moduli TinkerKit T000140 e T000150 sono esempi di potenziometri. Un encoder rotativo, come quello mostrato prima nella Figura 9-36, può anche essere utilizzato come dispositivo di input dell’utente. Anziché produrre una tensione variabile che deve essere convertita in numeri digitali per poter essere utilizzata da un microcontroller AVR, l’encoder rotativo produce output digitale che può essere utilizzato direttamente.
L’output dell’utente
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 all’utente 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 l’assoluta 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 $.
L’ERM1601SBS-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.
L’ST7066 (HD44780) Questo è un display LCD 16 × 2 con una semplice interfaccia parallela che utilizza un controller ST7066 o HD44780. Si tratta dello stesso componente che si trova sulle shield display LCD di Adafruit, SparkFun, SainSmart e altri rivenditori. La Figura 9-61 mostra un esempio di questo tipo di display. Costa circa 10 $.
Figura 9-61 - Un display 16 × 2 che utilizza un controller HD44780 o ST7066.
Potete notare che l’ERM1601SBS-2 mostrato nella Figura 9-60 assomiglia molto al display mostrato nella Figura 9-61. Questo perché entrambi utilizzano gli stessi IC per gestire l’LCD. L’unica grande differenza è che uno ha un display da una sola riga e l’altro 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.
L’ERC240128SBS-1 Il display ERC240128SBS-1, mostrato nella Figura 9-62, è un display LCD a matrice di punti 240 × 128 con un’interfaccia parallela da 8 bit. Si trova presso BuyDisplay (http://www.buydisplay.com).
Figura 9-62 - Un display TFT a colori 240 × 128.
L’ST7735R Un esempio di un altro tipo di display è l’unità 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 un’interfaccia 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 dell’ora e della data. Alcuni hanno una EEPROM integrata e altri no. Alcuni utilizzano un’interfaccia non standard, alcuni utilizzano SPI e altri utilizzano I2C. A parte le evidenti differenze di interfaccia, le differenze principali riguardano ampiamente la precisione come funzione di stabilità nel corso del tempo, di sensibilità alla temperatura, di consumo energetico e di costo. Quattro moduli RTC che si trovano spesso sono quelli basati sugli IC DS1302, DS1307, DS3231 e PCF8563. I moduli di solito sono dotati di un supporto per una batteria a bottone, spesso una CR2032 o una LIR2032. Test indipendenti hanno mostrato che la DS3231 offre la maggiore stabilità generale a lungo termine, ma gli altri RTC si possono utilizzare perfettamente. I moduli con cristalli esterni possono soffrire di deriva termica indotta e tutti deviano di qualche grado nel corso di lunghi periodi di tempo.
Il modulo RTC DS1302 L’IC RTC DS1302 (Figura 9-64) utilizza un’interfaccia seriale non standard. Non è SPI, ma è clocked. Una linea trasporta i dati, una è il segnale del clock e un’altra è la linea CE (chip enable). Questa è quella che Maxim (prima Dallas Semiconductor) definisce
un’interfaccia a tre fili. La Figura 9-64 mostra un tipico modulo DS1302. Trovate maggiori informazioni sul DS1302 su Maxim Integrated (http://bit.ly/maxim-ds1307).
Figura 9-64 - Un modulo RTC DS1302.
Il modulo RTC DS1307 L’RTC DS1307 è un dispositivo I2C. Non è compatibile né dal punto di vista del codice né dei pin con il DS1302, ma il risultato finale è lo stesso. Trovate maggiori dettagli sulle schede tecniche di Maxim (http://bit.ly/maxim-ds1307). La Figura 9-65 mostra un modulo RTC DS1307 di Tronixlabs (http://tronixlabs.com).
Figura 9-65 - Un modulo RTC DS1307.
Il modulo RTC DS3231 Come il DS1307, l’RTC DS3231 utilizza un’interfaccia I2C e dal punto di vista del codice è compatibile con il DS1307. La differenza principale è la precisione. Il DS3231 utilizza un cristallo interno e questo lo rende meno sensibile alla temperatura. La Figura 9-66 mostra un tipico modulo RTC DS3231.
Figura 9-66 - Un modulo RTC DS3231.
Il modulo RTC che utilizza PCF8563 Il PCF8563 è un altro IC RTC con un’interfaccia I2C. È un componente NXP (http://www.nxp.com) e i suoi registri interni sono completamente diversi da quelli del DS1307 o del DS3231 di Maxim. La Figura 9-67 mostra un tipico modulo basato sul PCF8563.
Figura 9-67 - Un modulo RTC PCF8563.
I timer Anche se la MCU AVR contiene un timer watchdog integrato, esistono moduli che svolgono essenzialmente la stessa funzione. Una possibile applicazione per un watchdog esterno (per essere più precisi, un timer a conto alla rovescia resettabile), è quando ha senso che il segnale di reset del timer provenga da un dispositivo esterno anziché dall’AVR stesso. Prendete per esempio un meccanismo rotativo con un sensore magnetico che emette un impulso per ciascuna rivoluzione dell’albero. 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 l’IC 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). L’edizione originale del 1979 è fuori stampa, ma potete ancora trovarne delle copie su Amazon e ne esiste una versione più recente, ma leggermente diversa. La società australiana Freetronics (http://www.freetronics.com.au) vende un economico modulo timer watchdog basato su un time 555.
Le connessioni Nel corso degli ultimi anni, nei metodi di interconnessione di moduli e shield ha cominciato a emergere una tendenza, dove i connettori modulari stanno sostituendo i pin e le prese che prima si trovavano sia su shield che su moduli. Detti spesso sistemi, questi implicano una serie di moduli e qualche forma di shield di interfaccia che utilizzino tutti gli stessi tipi di connettori e gli stessi pinout per tensione, segnale e messa a terra. I moduli TinkerKit (elencati nella Tabella 9-9) sono soltanto un esempio di un sistema di connessione dei moduli. Un altro è la linea di moduli Grove e le shield di interfaccia associate di Seeed Studio. Altre shield sono dotate di connettori da tre e quattro pin da utilizzare con cavi già pronti con i relativi connettori su ciascuna estremità, come il kit della patch shield passiva mostrato nella Figura 8-21.
Lavorare con jumper nudi Immaginate di prevedere di collegare in modo permanente un unico modulo a una scheda Arduino (magari per integrarla da qualche parta e lasciare che faccia il suo lavoro per molto tempo) e di non voler dedicare il tempo necessario per costruirvi un connettore. Va benissimo: non c’è niente di male nell’utilizzare jumper, purché eseguiate alcuni semplici passaggi per rendere le connessioni fisicamente più affidabili. I terminali socket (o pin) a crimpare che si utilizzano nei jumper sono gli stessi terminali che si utilizzano nei connettori modulari. La differenza è che un ponticello ha soltanto un terminale, mentre un connettore ne ha due o più. Più terminali da crimpare ci sono in un connettore, più robusto sarà. Questo è dovuto all’attrito meccanico aumentato da diversi terminali che lavorano tutti insieme nello stesso connettore. Un unico ponticello può spostarsi e flettersi e non offrire la stessa presa meccanica che si ottiene con diversi terminali in un solo connettore. Un modo per ottenere una connessione più affidabile è applicare una goccia di gomma di silicone (nota anche con il nome della marca “RTV”) per fissare i connettori dei jumper sui pin del modulo. Può non rivelarsi una soluzione elegante o robusta come un connettore modulare, ma, a meno che il modulo non stia lavorando in un ambiente ad alte vibrazioni con un veicolo RC o uno strumento in una fabbrica, resisterà bene.
Però non esagerate con il silicone, perché magari in qualche momento vorrete togliere e sostituire il modulo. La lama affilata di un rasoio può tagliare la gomma di silicone, che è morbida, e non danneggiare il jumper (se prestate attenzione, naturalmente).
I sistemi di connessione dei moduli In generale, una shield con connettori (che siano dello stile aperto utilizzato da TinkerKit o del tipo chiuso utilizzato dai componenti Grove e altri) può essere utilizzata anche può essere utilizzata o con jumper singoli oppure con socket-header crimpati, proprio, proprio come le shield e i moduli con pin nudi. I connettori già pronti rendono più facile collegare un modulo e non doversi preoccupare di come sono collegati i pin, purché il modulo sia progettato per collegarsi a una determinata shield con gli stessi tipi di connettori. Questo è l’approccio che hanno adottato i moduli TinkerKit e Grove (maggiori informazioni sui moduli Grove possono essere trovate sul sito web di Seeed Studio [http://www.seeedstudio.com]). Altri sistemi, come i moduli TinyDuino di TinyCircuits, utilizzano piccoli connettori multipin a montaggio superficiale. La Figura 9-68 mostra alcuni esempi di questi tipi di moduli. Anche se tecnicamente non si tratta di moduli come quelli descritti in questo capitolo, questo approccio mostra soltanto uno dei molti modi di risolvere il problema dell’interconnessione. TinyCircuits produce anche moduli sensore con lo stesso tipo di connettore e hanno cavi d’estensione disponibili. Queste cose sono molto piccole (guardate il connettore USB su una scheda Nano e poi confrontatela con la Figura 9-68) e la prima cosa che mi è saltata in mente quando le ho viste è stata “modellino di razzo”. Trovate maggiori informazioni sul sito web di TinyCircuits (https://www.tinycircuits.com).
Figura 9-68 - Esempi di moduli proposti da TinyCircuits.
I connettori sono il problema quando si utilizzano moduli e shield fatti per un determinato sistema di interconnessione. Non esiste un unico standard tra tutte le diverse marche e non c’è nessuna garanzia che un modulo fornito da un rivenditore si inserisca in una shield di interfaccia prodotta da qualcun altro. Un modo per risolvere questo è creare
sia la shield di interfaccia che una selezione di moduli con cui lavorare, che è esattamente quello che hanno deciso di fare i ragazzi che stanno dietro ai prodotti TinkerKit. Quando prendere in considerazione un determinato modulo, prestate attenzione al metodo di connessione che utilizza. Dovete anche prepararvi ad acquistare ulteriori cavi e forse alcuni moduli di prototipazione, per interfacciavi con componenti non fatti per un particolare sistema di connessione. Oppure potete scegliere di costruire i vostri cavi personalizzati, come vedremo nel prossimo paragrafo.
Costruire connettori personalizzati I connettori non soltanto sono più facili da utilizzare, ma sono anche più robusti e affidabili dei jumper. Ma non disporre di connettori non è necessariamente un male. Una shield di interfaccia come quella di SainSmart mostrata nella Figura 8-3 ha i pin I/O organizzati in file ordinate, con una distanza di 0,1 pollici (2,54 mm). Un connettore, come quelli mostrati nella Figura 9-69, con la stessa distanza e fori per crimpare i terminali corrisponderà con i pin e creerà una connessione solida.
Figura 9-69 - Pin e socket per terminali crimpati.
Le shell dei connettori e i terminali da crimpare esistono in una vasta gamma di stili. Le shell, o alloggiamenti, sono di disponibili con posizioni per uno o più terminali. Occasionalmente, potete incontrare un ponticello con alloggiamenti di plastica da una sola posizione su ciascuna estremità, anziché l’isolamento termoretraibile che si utilizza anch’esso. 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, l’approccio socket header è un’alternativa che vale la pena considerare. Lo svantaggio è che si deve investire in una crimpatrice e in un paio di buone spellafili. La Figura 9-70 mostra una
crimpatrice e la Figura 9-71 mostra come funziona.
Figura 9-70 - Tipica crimpatrice di terminali.
Figura 9-71 - Come si collega a un filo un terminale crimpato.
La Figura 9-72 mostra una presa da tre posizioni collegata a un modulo sensore di temperatura e umidità (un KY-015 di KEYES).
Figura 9-72 - Utilizzare un header da tre posizioni per collegare un modulo sensore.
Questa organizzazione permette al sensore di essere montato dove è necessario e collegato a una shield di interfaccia. Per assicurarsi che non si stacchi facilmente dal modulo, si può aggiungere una piccola quantità di silicone trasparente tra l’alloggiamento del connettore e la PCB del modulo.
Scegliere un metodo di connessione Il compromesso si riduce all’opzione di utilizzare connettori modulari e cavi già pronti, che sono affidabili e robusti ma richiedono una serie di componenti adatti, oppure quella di creare le proprie connessioni, utilizzando ponticelli utilizzando jumper con terminali socket a crimpare oppure creandosi da soli il socket-header per un determinato modulo. Quale opzione scegliere dipende da quanta fatica volete fare per collegare moduli a una scheda Arduino o a una shield e quanto “chiuso” volete che sia un particolare schema di connessione. Potete aver notato che non ho parlato di un altro possibile metodo di connessione dei moduli: la saldatura. Questa è sempre un’opzione, ma, a meno che un modulo non sia destinato a diventare una parte permanente di qualcosa, dovrebbe essere considerata come l’ultima spiaggia. Saldando un modulo direttamente ai cavi o su una PCB si crea una connessione solida, ma non facile da disfare e probabilmente brutta da vedere. Significa anche se si disporrà di un modulo in meno da utilizzare in altri progetti. Detto questo, potete aver notato che nella Figura 9-12 il relè e moduli sensore di temperatura sono saldati direttamente in una shield di prototipazione per il termostato fatto con Arduino. Il motivo qui è che il modulo non verrà messo fuori servizio in tempi brevi e dovrà lavorare in un ambiente alquanto difficile, all’interno di una stufa elettrica, con fluttuazioni termiche e le vibrazioni del ventilatore. Per questo, ho scelto di renderlo relativamente permanente. Anche se a un certo punto potrei pentirmene, per adesso va bene così. Se vi si presenta l’occasione, dovrete essere voi stessi a decidere se è il
caso di saldare.
Fonti Le fonti elencati nella Tabella 9-11 sono soltanto un esempio di alcune delle società che vendono componenti e moduli compatibili con Arduino. Sono soltanto quelli che ho avuto occasione di conoscere e che ho potuto provare. Esistono molti altri rivenditori di cui non sono a conoscenza, ma potete scoprirli da soli navigando su Internet. E non dimenticatevi di eBay. Tabella 9-11 - Fonti di componenti.
Distributore/Venditore
URL
Distributore/Venditore
Adafruit
www.adafruit.com
Mouser Electronics
www.mous
Amazon
www.amazon.com
RobotShop
www.robot
CuteDigi
store.cutedigi.com
SainSmart
www.sains
DealeXtreme (DX)
www.dx.com
DFRobot
www.dfrob
Seeed Studio
www.seeedstudio.com
Elecfreaks
www.elecfr
SparkFun
www.sparkfun.com
Elechouse
www.elech
Tindie
www.tindie.com
Freetronics
www.freetr
Tinkersphere
tinkersphere.com
iMall
imall.itead.
Tronixlabs
tronixlabs.com
ITEAD Studio
store.itead
Trossen Robotics
www.trossenrobotics.com
KEYES
en.keyes-ro
Riepilogo Questo capitolo ha fornito un assaggio di alcuni dei vari moduli e componenti disponibili per implementare funzioni di input e di output con Arduino (o praticamente con qualsiasi microcontroller moderno). Come ho dichiarato in precedenza, potete trovare molte delle funzionalità descritte qui su una shield, ma possono esserci occasioni nella quali una shield non è la scelta più adatta. Con un Arduino Nano e alcuni sensori, componenti di input e alcuni tipi di output, potete organizzare le cose in modo che siano ideali per i vostri particolari requisiti. Con un browser web e l’accesso 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 un’interfaccia 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ù l’accento sui punti 1 e 2, soprattutto perché ho cose migliori da fare che l’ingegneria inversa di un’interfaccia complessa di qualche cosa con davvero un bell’aspetto che ho comprato in offerta su eBay. Per me, ha più senso per comprare una cosa non-cosìbella e ottenere le informazioni tecniche di cui ho bisogno per installarla e farla funzionare. La cosa più importante è trovare qualcosa che farà il lavoro e a un prezzo non superi il nostro budget.
10 Creare componenti personalizzati
Più lavorate con dispositivi Arduino in generale e con il microcontroller AVR in particolare, più vi accorgete di quanto siano flessibili e versatili. Sembra che esista un sensore o una shield per quasi qualsiasi applicazione possiate immaginare e regolarmente appaiono nuove shield. Ciononostante, ci sono ancora alcune applicazioni per le quali non esiste una shield. Può succedere di passare ore online cercando invano una shield con determinate funzionalità, soltanto per accorgersi, alla fine, che semplicemente non esiste. In una situazione simile, fondamentalmente avete tre opzioni: la prima è arrendervi e cercare di trovare un altro modo di risolvere il problema, la seconda è trovare qualcuno che ve la costruisca (a pagamento, di solito) e la terza è progettare e costruirvi da soli la PCB. Questo capitolo descrive due progetti che illustrano i passaggi necessari per creare una shield personalizzata e un dispositivo compatibile con il software di Arduino. Il primo progetto è una shield, mostrata nella Figura 10-1, pensata per applicazioni di un determinato tipo. La GreenShield, come la chiamo io, si basa su un fattore di forma convenzionale. Utilizza componenti a montaggio superficiale in un layout che include potenziometri, relè e LED.
Figura 10-1 - La GreenShield.
Quando viene associata a un Arduino, la GreenShield può funzionare come un monitor indipendente e come un controller per applicazioni di giardinaggio o agricoltura. Questa shield può anche fungere da base per stazioni meteorologiche automatiche, per prevedere temporali, oppure come termostato (notate che un termostato programmabile costruito utilizzando moduli e sensori già pronti è descritto nel Capitolo 12). La seconda metà di questo capitolo descrive lo Switchinator, un dispositivo basato su AVR ATmega328 che non si appoggia al firmware del bootloader di Arduino, ma può essere comunque programmato con l’IDE di Arduino e con un dispositivo di programmazione ICSP. La PCB Switchinator è mostrata nella Figura 10-2.
Figura 10-2 - Lo Switchinator.
Lo Switchinator può controllare in remoto fino a 14 dispositivi DC come relè o LED ad alto consumo, gestire 3 motori passo-passo unipolari, oppure controllare carichi AC utilizzando relè a stato solido esterni. Utilizza un’interfaccia RS-232 e non richiede una connessione con un PC host via USB. Lo Switchinator incorpora tutti i componenti essenziali di un Arduino in una scheda con un design personalizzato. Non dovremo preoccuparci delle dimensioni dei socket header e delle considerazioni sul layout che richiedono le PCB delle shield: gli unici limiti per la dimensione generale e la forma saranno quelli imposti dal design. Con un po’ di pazienza e di pianificazione, potete facilmente creare una PCB personalizzata che non assomigli affatto a un Arduino, ma offra la stessa facilità di programmazione. E il bello è che farà esattamente quello per cui lo avete progettato e in una forma fisica che risponde esattamente alle vostre esigenze. Creare una PCB non è particolarmente difficile, ma si tratta di un’operazione che richiede alcune conoscenze di design delle PCB e di elettronica. Esistono strumenti software gratuiti o a basso costo che servono a gestire la creazione del layout della
PCB e in realtà procurarsi una scheda a circuito pronta è piuttosto facile. I progetti mostrati in questo capitolo richiederanno anche che sappiate saldare, specialmente nel caso dei componenti a montaggio superficiale. Se avete già esperienza in questi campi, siete preparati. In caso contrario, imparare come creare uno schema, a lavorare con le PCB, a utilizzare una saldatrice e a selezionare i componenti giusti può rivelarsi un’esperienza divertente e appagante. Per la PCB della shield, utilizzeremo lo strumento per la cattura degli schemi e il layout della PCB Eagle, mentre per la PCB compatibile con Arduino utilizzeremo lo strumento Fritzing. Entrambi sono strumenti molto diffusi e potenti. Inoltre sono gratuiti (in realtà, Fritzing è gratuito e la versione entry-level di Eagle, con alcuni limiti, è disponibile a prezzo zero). NOTA Quando create shield personalizzate o schede compatibili con Arduino, potete farvi un favore enorme mantenendo un quaderno di appunti. Anche se non si tratta di nient’altro che di una raccolta di pagine stampate o fotocopiate in un raccoglitore ad anelli, sarete contenti di averlo quando in futuro avrete bisogno di cercare alcune informazioni per un progetto simile. Perché non salvarle semplicemente tutte sul disco del vostro PC? Perché rischiare di perderle se il disco si danneggia senza un backup, o nella folla di dati se ci sono già moltissime cose salvate sul disco (questo a me succede più spesso di quanto non ammetta). Inoltre, raccoglierle in un quaderno di appunti vi permette di ritornarci in seguito e di annotarvi cose man mano che diventate più esperti testando, costruendo e utilizzando il vostro dispositivo. Le penne rosse non servono soltanto ai professori.
Questo capitolo propone inoltre un elenco di fonti dove trovare software, componenti e PCB. L’unica cosa che ho dato per scontata è che abbiate già qualche esperienza con l’elettronica o che almeno vogliate fare un piccolo sforzo extra per impararne i concetti fondamentali. Vi consiglio di dare un’occhiata alla breve panoramica degli strumenti nell’Appendice A e certamente di sfogliare le letture suggerite nell’Appendice 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 l’accento è posto principalmente sull’hardware di Arduino e sui relativi moduli, sensori e componenti, il software mostrato qui ha l’unica 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 l’implementazione di software complesso, per la costruzione di una casa, per la progettazione di un’automobile per le gare di Formula 1, oppure per la preparazione di una spedizione nell’Artico. 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 dell’ingegneria 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 dell’ingegneria. 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 d’acqua 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 l’acqua” 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 l’ottenere più informazioni essenziali possibile in un unico posto (cose come le schede tecniche dei componenti, dove reperire le parti, l’identificazione del design necessario e degli strumenti software e così via). L’idea è arrivare al passaggio relativo alla progettazione con tutto il necessario per prendere le decisioni giuste su che cosa è disponibile, quando può volerci per procurarselo e come lo si utilizzerà. Il passaggio della pianificazione è anche il momento in cui si formulano alcune timide ipotesi su quanto si impiegherà per completare ciascuno dei passaggi successivi: progettazione, prototipazione, test, produzione e collaudo. Dico “timide ipotesi” perché dopo aver raccolto più informazioni possibile si dovrebbe avere qualche idea di che cosa servirà, ma queste sono soltanto ipotesi perché nessuno ha la sfera di cristallo per vedere il futuro. Possono sempre presentarsi degli imprevisti e a volte il completamento di alcuni aspetti del progetto può richiedere più tempo di quello che si era pensato. Così vanno le cose nel mondo reale. Questo è anche il motivo per il quale chi si occupa di project management da una vita moltiplica i tempi che stima per un fattore di due o tre. È meglio esagerare e finire il lavoro prima che sottovalutare la quantità di tempo necessario e consegnarlo tardi. Uno strumento di pianificazione si rivela utile sia per prevedere la tempistica in modo realistico, sia come modo per valutare i progressi. Il mio strumento preferito per pianificare in modo rapido e semplice è il grafico temporale, detto anche diagramma di Gantt. Questi possono essere diagrammi complicati creati utilizzando un software di gestione dei progetti, oppure grafici semplici come quello mostrato nella Figura 10-3.
Figura 10-3 - Un grafico temporale di esempio.
Nel caso di molti progetti piccoli, i grafici elaborati non sono necessari e la complessità aggiuntiva non è altro che lavoro in più. Le cose importanti sono che: (1)
nella pianificazione si tenga conto di tutti i compiti necessari, (2) il piano sia realistico sia dal punto di vista del tempo che delle risorse e (3) il piano abbia un obiettivo e un termine precisi. Un’altra 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. Un’altra 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, l’iterazione è 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 all’inizio del progetto. Per esempio, può non essere una buona idea saltare subito al layout di una PCB nel caso di un dispositivo che combina un
processore AVR, un display LCD, una ricetrasmittente Bluetooth, un accelerometro multiassiale e una bussola elettronica, tutti sulla stessa PCB. Tutto può funzionare al primo tentativo, ma, se ci fossero piccoli problemi imprevisti, possono non diventare apparenti finché la PCB non è già stata creata e pagata. Costruire e testare prima un prototipo può far risparmiare molti problemi e denaro più avanti. I problemi che si identificano con un prototipo influenzano il design per contribuire a migliorarlo. In un caso estremo, il prototipo può addirittura dimostrare che il design iniziale è sbagliato e deve essere rifatto da capo. Anche se questo è fastidioso, non è un disastro (in realtà, è più comune di quanto possiate pensare). Costruire un centinaio di schede a circuito soltanto per scoprire che c’è un difetto di progettazione fondamentale: questo è un disastro. I prototipi, i test e le revisioni del design possono evitare che questo succeda.
Modifiche e ancora modifiche Durante il suo sviluppo, il generatore di segnale mostrato nel Capitolo 11 è passato per diverse revisioni principali. Il piano originale mirava alla possibilità di disporre di un controllo remoto di tutte le funzioni del generatore attraverso un’interfaccia seriale RS-232 e una funzione di output parallela con una specifica configurazione digitale. Il problema è che su Arduino non ci sono abbastanza pin I/O on per far succedere tutto questo senza ricorrere all’utilizzo di shield di espansione I/O ed RS-232. Per risolvere questi problemi si sarebbero potute utilizzare altre opzioni, come utilizzare un encoder rotativo, ma ogni alternativa proponeva delle sfide. Lo strumento aveva comunque bisogno di pulsanti per alcune funzioni e l’LCD stava cominciando a diventare davvero piccolo in termini di spazio di visualizzazione disponibile. Quindi, anziché incorporare altra complessità sia nell’hardware che nel software, ho deciso di puntare alla semplicità. Il design che ne ha risultato non utilizza interrupt nel software (non ce n’è bisogno), l’LCD non è troppo affollato di valori di dati criptici e sono necessari soltanto due componenti PCB principali: la scheda Arduino e il modulo DDS. Il dispositivo finale offre sufficienti funzionalità come generatore di segnale, anche se non è dotato di un pattern output arbitrario o di un controllo remoto.
Testare L’essenza 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 l’affidabilità 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 all’oceano) o che il dispositivo non debba controllare qualcosa che costerebbe moltissimo denaro se non funziona a dovere (o danneggiare qualcos’altro, 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 all’integrazione 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 l’assemblaggio 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 è l’ultima cosa da fare prima che il dispositivo si possa considerare pronto per l’utilizzo 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. L’idea è applicare gli stessi test utilizzati con il prototipo per verificare che non sia cambiato niente. Nell’ingegneria 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 l’applicazione 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 (l’R2), che si trova sulla Duemilanove, sull’Uno 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 (l’R3) 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é all’Arduino 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 un’occhiata alla Figura 10-4. Qui vedete la scheda di una fresatrice CNC Roland SRM-20. Trovate maggiori informazioni su di essa sul blog infosyncratic.nl di Nadya Peek (http://bit.ly/open-hardware-footbath).
Figura 10-4 - Un Arduino invertito su una PCB grande (immagine di Nadya Peek).
Se volete progettare una shield da mettere in commercio, vi conviene utilizzare il layout
di base come modello, dal momento che funzionerà anche con le schede Uno o Leonardo, oltre che con le PCB di tipo Mega. Il Capitolo 4 descrive ciascuno di questi tipi di scheda e fornisce le dimensioni e le informazioni sul pinout. Le schede Arduino con un fattore di forma piccolo come la Nano, la Mini e la Micro sono uniche, per il fatto che hanno tutti i loro pin I/O sulla parte inferiore della PCB, anziché come un grande IC. Aggiungere una shield a una di queste schede comporta l’utilizzo di un adattatore, come quello mostrato nella Figura 10-5, per collegare i segnali ai pin socket e collegare la PCB di una shield PCB.
Figura 10-5 - La PCB dell’adattatore di un Arduino Nano.
Nella Figura 10-5 potete notare che i pin socket sono state aggiunte alla PCB. Questo è stato un esperimento, per vedere come si sarebbe potuto fare per interfacciare fisicamente una scheda Nano con una shield normale. Con un po’ di creatività, è possibile collegare una shield alla scheda, eccetto che per il fatto che la Nano è troppo elevata sui pin socket. Una soluzione potrebbe essere utilizzare estensioni per i pin della shield, che non sono altro che socket header di estensione con eliminata una parte della lunghezza dei pin. Una soluzione più drastica potrebbe essere dissaldare gli header esistenti della Nano e sostituirli con un tipo più corto. Io consiglio l’opzione dell’estensione 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 dell’alimentazione 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. Un’altra 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 dell’alimentazione DC di queste schede può interferire con la PCB delle shield. Anche se è di plastica e non farà corto circuito con niente, può impedire alla shield di collocarsi completamente. La Figura 10-6 mostra questa situazione con una scheda Duemilanove e una shield Ethernet.
Figura 10-6 - Una scheda Duemilanove con una shield.
Per questi motivi, conviene regolare la lunghezza della shield in modo che non interferisca con l’Arduino 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 l’una sull’altra. Quando si progetta una shield, si deve anche pensare a quello che non sarà più accessibile sulla scheda Arduino sotto di essa e a che cosa vi si può montare o meno. Questo include il pulsante di reset, i LED a montaggio superficiale e il gruppo di pin ICSP. Alcune shield risolvono questo semplicemente replicando il pinout della scheda Arduino. Altre, come la maggior parte delle shield LCD, possono non replicare i pin di Arduino sulla parte superiore della PCB della shield, ma a volte mettono a disposizione
un pulsante di reset. Nel caso di una shield LCD questo ha senso, naturalmente, dal momento che in ogni caso si tratterebbe della shield al di sopra di tutte le altre.
Montare le shield una sopra l’altra Uno dei vantaggi offerti dal fattore di forma di Arduino è la possibilità di montare diverse shield una sopra l’altra. Potete creare una pila che contiene una scheda Arduino di base (una Uno, per esempio) con sopra una shield con lettore di schede di memoria SD, seguita da una shield input/output di qualche tipo e quindi una shield con display LCD o TFT al di sopra di tutto. In questo modo ottenete facilmente un semplice dispositivo di logging dei dati. Quello che può essere montato sopra una shield dovrebbe essere sempre pensato bene, che si tratti di un’altra shield o magari di un modulo sensore di un qualche tipo. Quando si selezionano i componenti per una shield, si deve prendere in considerazione l’altezza delle varie parti. Se le parti sono troppo alte e non si può collegare fisicamente un’altra shield senza che interferisca con qualcosa, significa che quella shield dovrà sempre essere quella al di sopra di tutte. Esistono fondamentalmente due modi di montare diverse shield l’una sopra l’altra: prese sfalsate e header di pin e pin socket estese. Sfalsate, in questo contesto, significa che i connettori superiori (le prese) sono leggermente spostati rispetto ai pin inferiori (gli header dei pin), con gli header I/O digitale e alimentazione/analogico entrambi spostati sul lato della stessa distanza. Nella Figura 10-7 potete vedere una shield I/O modulare su una Duemilanove. Qui ci sono alcune cose da notare. La prima è che la shield I/O modulare utilizza l’approccio dei connettori sfalsati e quindi il bordo non è allineato verticalmente con la scheda Arduino sottostante. Questo deve essere tenuto presente se il tutto deve essere montato in una custodia di un qualche tipo che può essere soggetta a colpi o vibrazioni (può non essere possibile fissare la shield con dadi e bulloni). La seconda cosa da notare è che la shield non collega i pin ICSP e quindi la funzionalità viene effettivamente persa (cosa che può rappresentare un grosso problema o meno). Infine, i pin dei connettori sul bordo della shield al di sopra dell’alimentatore dell’Arduino e del connettore USB possono (e lo fanno) toccarsi e quindi è necessario aggiungere uno strato isolante di qualche tipo.
Figura 10-7 - Un esempio di shield sfalsata.
I connettori extended pin socket sono una variante comune sui connettori 0.1 (pollici) dotati di un pin lungo che attraversa la PCB. Il pin è sufficientemente lungo da creare una connessione solida con una scheda sottostante e le prese dei connettori permettono di montare un’altra 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 è l’uso dei pin di Arduino, oltre alla possibilità di montarle una sopra l’altra. I pin utilizzati da una shield determinano che cos’altro si può utilizzare con quella shield in una pila. Evitare l’uso esclusivo dei pin SPI e I2C significa poter utilizzare altre shield in una pila, comprese memorie flash SD e microSD, shield d’espansione 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 un’ottima 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 un’altra 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 l’unico 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 l’una, 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. Sull’Arduino di base ci sono tre prese per la messa a terra: due sul lato con gli input analogici e una sul lato degli I/O digitali. Se utilizzate soltanto una delle prese della messa a terra di Arduino per il riferimento della messa a terra del segnale di una shield, potete evitare problemi potenziali con rumore indotto e loop di massa. Anche se queste situazioni sono molto rare, rappresentano comunque una possibilità, in particolare nel caso di shield che possono incorporare amplificatori operazionali ad alto guadagno o circuiti ad alta frequenza. Applicare buone pratiche di design può aiutare a evitare problemi strani e difficili da diagnosticare nel futuro.
La shield personalizzata GreenShield In questo paragrafo creeremo una shield personalizzata per illustrare i passaggi necessari per progettare e produrre una shield per Arduino. La shield servirà a controllare l’umidità, la temperatura, l’illuminazione dell’ambiente e l’umidità del suolo. È pensata principalmente per essere utilizzata in una serra, anche se, con una custodia adeguata, qualche pannello solare e una ricetrasmittente wireless di qualche tipo può essere messa in un campo per controllare le rape (o qualsiasi altra cosa). Dal momento che in alcune parti del mondo (tra le quali gli Stati Uniti orientali) l’acqua scarseggia, tenere d’occhio l’umidità del suolo oltre alla temperatura e all’umidità può aiutare a ridurre al minimo i tempi e i volumi di irrigazione mantenendo comunque in buona salute le coltivazioni. L’agricoltore può rimanere seduto in salotto e leggere rapidamente come vanno le cose nel suo campo per mezzo di uno smartphone, di un tablet o di un PC desktop. Io la chiamo GreenShield, per ovvie ragioni, e i passaggi relativi a definizione e progettazione sono combinati in un unico passaggio. Dal punto di vista fisico, la GreenShield è molto semplice e la sfida principale per il design dell’hardware sarà riuscire a far stare alcuni componenti grandi (due relè e un DHT22) nella piccola PCB della shield.
Obiettivi L’obiettivo di questo progetto è creare una shield che possa essere utilizzata come
monitor remoto che rilevi la temperatura, l’umidità, l’umidità del suolo e il livello di illuminazione dell’ambiente. Basata sui limiti predefiniti degli input dei sensori, controllerà due relè. I relè possono essere utilizzati per controllare una valvola dell’acqua e magari un ventilatore o forse qualche luce per compensare nei giorni nuvolosi. Ha anche sei LED: due per i punti d’umidità alta e bassa, due per i livelli di umidità del suolo alto e basso e un LED per indicare l’attività 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à dell’ambiente e un sonda per l’umidità 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à dell’ambiente
Controllo e output di stato: •
Due relè di controllo, funzione del software definibile, capacità 10 A
•
Quattro LED che indichino i limiti dell’umidità del suolo e dell’umidità
•
Due LED che indichino lo stato dei relè
Interfaccia elettrica: •
Morsettiera da due posizioni per l’input 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 dall’host di controllo
•
Risultati dei sensori disponibili su richiesta
•
Sostituzione dei relè da parte dell’host 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 l’host principale) per ricevere parametri operativi, restituire i dati dei sensori e sostituire l’azione 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 l’azione 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 l’host di controllo e la GreenShield Arduino saranno transazioni comando-risposta. Il software della GreenShield sarà sviluppato interamente con l’IDE di Arduino. Il computer host utilizzato per compilare e caricare il codice completo fungerà anche da interfaccia per testare il codice in esecuzione su Arduino. Idealmente, si potrebbe pensare di creare un programma di interfaccia personalizzato utilizzando qualcosa come per esempio Python, o, in un ambiente Windows, un emulatore di terminale come TeraTerm (https://ttssh2.osdn.jp/index.html.en). Include un eccellente ambiente di scripting e ve lo consiglio vivamente.
Lo strumento per schemi e PCB Eagle Per questo progetto, utilizzo lo strumento per schemi e PCB Eagle. Se non ve lo siete già procurato, potete scaricarlo da http://www.cadsoftusa.com/download-eagle. La maggior parte delle distribuzioni principali di Linux ne hanno una versione più vecchia disponibile nei loro repository di pacchetti. Sul sito web di CadSoft, i limiti della versione gratuita di Eagle sono indicati come: •
L’area utilizzabile della scheda è limitata a 100 × 80 mm (4 × 3,2 pollici).
•
Si possono utilizzare soltanto due livelli di segnali (Top e Bottom).
•
L’editor di schemi può creare soltanto due fogli.
Le dimensioni di base di Arduino sono approssimativamente 69 mm × 53 mm e quindi non ci sono problemi se si vuole utilizzare Eagle per una shield del tipo di base o esteso. Non può essere utilizzato per creare una shield per un Arduino con PCB di tipo Mega, per via dei limiti imposti alle dimensioni. Il limite dei due livelli di solito non rappresenta un problema per la maggior parte dei design di shield, ma, in alcuni casi, le shield che elaborano segnali video o RF possono avere bisogno di ulteriori livelli per la messa a terra e l’alimentazione. I ragazzi di SparkFun offrono alcuni tutorial online chiari e concisi che aiutano a installare e utilizzare il software Eagle. Potete trovarli su http://bit.ly/sparkfun-eagle e http://bit.ly/sparkfun-using-eagle. Potete ottenere anche i componenti libreria Eagle PCB sul repository GitHub (https://github.com/sparkfun/SparkFun-Eagle-Libraries) di SparkFun. Ho scoperto che le librerie di SparkFun non funzionavano con la versione del pacchetto di Eagle utilizzata da Kubuntu 12.04 (l’ultima versione di Eagle
disponibile è la 5.12), ma la versione più recente di CadSoft (la versione 7.4.0) si installa e funziona bene. Io ho scelto la via più corta e ho installato la 7.4.0 con la 5.12 già installata, ho copiato il vecchio eseguibile di Eagle che si trova in /usr/bin in eagle.old e ho creato un link simbolico in /usr/bin che puntasse alla versione più recente in /opt/eagle-7.4.0/bin.
Le funzionalità La prima considerazione è il design fisico della PCB della shield. Il diagramma a blocchi mostrato nella Figura 10-8 propone una panoramica di quali tipi di funzioni presenterà la shield.
Figura 10-8 - Il diagramma a blocchi della GreenShield.
Notate che nella Figura 10-8 nessuna delle funzioni hardware interagisce direttamente. I sensori, i LED e i relè sono soltanto estensioni delle funzionalità I/O di base di Arduino. Il sensore di umidità/ temperatura è montato sulla PCB, mentre volendo la fotocellula
(un LDR, light-dependent resistor) e la sonda dell’umidità 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 l’ultima (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 un’altra shield.
L’hardware 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 dell’LDR per l’input da inviare all’ADC dell’AVR, si utilizza un amplificatore operazionale duale. I sensori collegati agli input dell’amplificatore 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 dall’amplificatore operazionale senza spingerlo troppo a un estremo o all’altro dal punto di vista della tensione.
Figura 10-9 - Lo schema della GreenShield.
La GreenShield è stata progettata per permettere di estendere la pila di shield di Arduino evitando i pin I/O digitali e analogici importanti. La Tabella 10-1 elenca i pin di Arduino e le assegnazioni utilizzate per la GreenShield.
Tabella 10-1 - L’utilizzo dei pin di Arduino della GreenShield.
Pin
Funzione
Pin
Funzione
D2
ULN2003A canale 1
D7
ULN2003A canale 6
D3
ULN2003A canale 2
D8
Input di dati DHT22
D4
ULN2003A canale 3
A0
Input sensore umidità del suolo
D5
ULN2003A canale 4
A1
Input sensore LDR
Notate che i pin SPI (D10, D11, D12 e D13) non sono utilizzati e quindi rimangono disponibili per le shield SPI. Sono disponibili anche D0 e D1, se volete collegare un’interfaccia RS-232 e dimenticarvi dell’USB. A4 e A5 sono disponibili per applicazioni I2C. Adesso che abbiamo uno schema, possiamo assemblare l’elenco completo delle parti, mostrato nella Tabella 10-2. Tabella 10-2 - L’elenco delle parti della GreenShield.
Quantità
Tipo
Descrizione
2
SRD-05VDC-SL-C
1
DHT22
1
Generico
Sensore LDR
1
SainSmart
Sonda dell’umidità del suolo
6
3 mm
1
LM358N
1
ULN2003A
6
1 kohm, 1/8 W
Resistenza
4
2,2 kohm, 1/8 W
Resistenza
2
3,3 kohm, 1/8 W
Resistenza
2
10K trim
2
0,1” (2,54 mm)
Morsettiera da 3 posizioni
2
0,1” (2,54 mm)
Morsettiera da 2 posizioni
2
0,1” (2,54 mm)
Socket header a 8 posizioni
2
0,1” (2,54 mm)
Socket header a 6 posizioni
1
Personalizzato
PCB della shield
Songle 5A relè Sensore di umidità/temperatura
LED Amplificatore operazionale IC driver
Potenziometro montato sulla PCB
Il software Il software della GreenShield si basa su tre funzioni principali: l’input del sensore, l’analisi dei comandi e la generazione dell’output e la mappatura delle funzioni dei relè. La prima funzione è responsabile di ottenere dati da ciascuno dei quattro input dei sensori (temperatura, umidità, umidità del suolo e livello di illuminazione dell’ambiente) e di salvarne i valori perché li possano utilizzare altre parti del software. Le funzioni di analisi dei comandi interpretano le stringhe di comando che provengono da un PC host e generano risposte utilizzando il protocollo comando-risposta descritto qui. Le funzioni di output controllano i relè basandosi sugli input dei sensori e sui limiti predefiniti dai vari comandi. Il protocollo comando-risposta utilizzato per le transazioni tra il computer e la GreenShield per Arduino è mostrato nella Tabella 10-3. Notate che la GreenShield risponde soltanto all’host e non inizierà mai una transazione per sua iniziativa. Tabella 10-3 - Il protocollo comando-risposta della GreenShield (tutti i comandi).
Comando
Risposta
Descrizione
AN:n:?
AN:n:val
GT:HMX
GT:HMX:val
Ottiene il valore max dell’umidità
GT:HMN
GT:HMN:val
Ottiene il valore min dell’umidità
GT:LMX
GT:LMX:val
Ottiene il valore max della luminosità
GT:LMN
GT:LMN:val
Ottiene il valore min dell’umidità
GT:MMX
GT:MMX:val
Ottiene il valore max dell’umidità del suolo
GT:MMN
GT:MMN:val
Ottiene il valore min dell’umidità del suolo
GT:TMX
GT:TMX:val
Ottiene il valore max della temperatura
GT:TMN
GT:TMN:val
Ottiene il valore min della temperatura
HM:?
HM:val
Restituisce l’umidità corrente
RY:n:?
RY:n:n
Restituisce lo status del relè n
RY:n:1
OK
Imposta il relè n su ON
RY:n:0
OK
Imposta il relè n su OFF
RY:A:1
OK
Imposta tutti i relè su ON
RY:A:0
OK
Imposta tutti i relè su OFF
RY:n:HMX
OK
Imposta il relè n su ON se umidità >= max
RY:n:HMN
OK
Imposta il relè n su ON se umidità = max
Ottiene l’ingresso analogico n in raw DN
RY:n:LMN
OK
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 = max
RY:n:TMN
OK
Imposta il relè n su ON se temperatura = max
RY:n:TMN
OK
Imposta il relè n su ON se temperatura ” seguito da uno spazio. Le risposte sono precedute dal carattere “” e “