Sei sulla pagina 1di 122

PROGETTI CON ARDUINO UNO

-Introduzione alla scheda Arduino-

www.arduino.cc sistemisds.altervista.org

Novembre 2013

- Sergio De Sordi

Dispositivo interattivo
sensori Arduino

attuatori

Comportamento software

Il progetto Arduino nato nel 2 ! in Italia presso l" Interaction Design Institute di Ivrea #on l"intento di fornire agli studenti uno strumento sempli#e ed e#onomi#o di prototipa$ione elettroni#a% &a s#'eda e il software di s(iluppo sono nati #on li#en$a open sour#e % Arduino un progetto in #ontinua e(olu$ione%

Arduino UNO

Il mi#ro#ontrollore utili$$ato una AT)EGA *2+ a ,- ).$ )emoria flas' *2 /01te )emoria sram 2 /01te *2 registri a + 0it uso generale

A&TRE 2C.EDE ARDUINO


ARDUINO )EGA ATMEGA 2560 6 Mhz 5! I"# di$itali 6 analo$ici

A&TRE 2C.EDE ARDUINO


ARDUINO &EONARDO ATMEGA %2*! 6 Mhz *.3 e seriale separati

ARDUINO DUE %2 &it A'M (! M)z

ARDUINO 3UN ATMEGA %2*! co+e Ard. ,E#-A'D# 6 Mhz 4 AT)E'#. /%% !00 Mhz con ,I-*0 e 1i2i

Il mi#ro#ontrollore utili$$ato una AT)EGA *2+ a ,- ).$ )emoria flas' *2 /51te


-el processore 4 +e+orizzato un piccolo pro$ra++a di &oot che serve a caricare nella +e+oria 5lash del +icrocontrollore lo s6etch creato con l7a+&iente di sviluppo su 8c9 IDE. Il processore 4 di tipo 'I.: e una istruzione +acchina viene ese$uita +edia+ente in un solo ciclo di cloc6. ,7architettura 4 di tipo )arvard con canali di co+unicazione dati e istruzioni separati.

6 in$ressi analo$ici ! I"# di$itali ;6 pw+<

Con l"am0iente di s(iluppo IDE si s#ri(ono i programmi #'iamati s6et#' 7s#'i$$o8 Come (isuali$$are uno s6et#' di esempio denominato 0lin6

Ci sono due fun$ioni9 setup #'e (iene eseguita una sola (olta e loop #'e un #i#lo infinito% pin)ode7pin:OUTPUT;INPUT8 digital<rite7pin:.IG.;&O<8 dela17millise#8

A((iato l"IDE e #ollegata la s#'eda di Arduino ne#essario sele$ionare il tipo di s#'eda e la #onnessione seriale da utili$$are% =uando la s#'eda Arduino (iene #onnessa al p# nas#e una porta (irtuale seriale% &a #onnessione seriale pu> essere utili$$ata an#'e da programma per una #omuni#a$ione tra Arduino e P#% 2erial%0egin7?- 8@ 2erial%print7dato8@ 2erial%read78@

Il linguaggio usato un C C44 #on al#une fun$ioni spe#ifi#'e %

Al#une fun$ioni pin)ode7pin: mode8@ AA imposta il pin in INPUT o OUTPUT digitalRead7pin8@ analogRead7pin8@ dela17millise#8 AA legge un ingresso digitale AA in(ia .IG. o &O< al pin di us#ita ;, 2* AA legge da un ingresso analogi#o AA ritardo digital<rite7pin: (alue8

Costanti e variabili ,e varia&ili apparten$ono alle locazioni di +e+oria 'AM che al cessare dell7ali+entazione perdono il loro contenuto. 0oolean true 5alse #'ar 01te int un carattere A.:II. *n &=te in +e+oria +e+orizza un intero da 0 a 255 nu+ero intero da -%2>6( a %2>6> . Due &=te

unsigned int nu+ero da 0 a 655%5 long +e+orizza un nu+ero tra -2 !>!(%6!( e 2 !>!(%6!> float nu+ero in vir$ola +o&ile9 > ci5re dopo il punto deci+ale. In +e+oria ! &=te dou0le vir$ola +o&ile doppia precisione

Costanti e variabili 8er creare un arra=? int no+e@varia&ileA%B C crea tre varia&ili adiacenti di tipo intero #'ar no+e@varia&ileA(B D E ArduinoFC crea una strin$a di > caratteri piG un carattere ter+inatore. ( &=te da 0 a > Modo veloce per de5inire il contenuto di un arra=? int no+e@varia&ileABD H09 259 509 009 200IC

&e (aria0ili nel linguaggio di programma$ione C44 #'e usa Arduino 'anno una proprietB di (isi0ilitB denominata s#ope% Una (aria0ile glo0ale (isi0ile da ogni fun$ione del programma% &e (aria0ili lo#ali sono (isi0ili soltanto all"interno della fun$ione nella Cuale esse sono di#'iarate% Nell"am0iente Arduino Cualsiasi (aria0ile di#'iarata fuori di una fun$ione 7 per es% setup78: loop78: et#% 8 una (aria0ile glo0ale% &e (aria0ili lo#ali sono un modo utile per assi#urare #'e soltanto all"interno di Cuella fun$ione si 'a a##esso alle proprie (aria0ili% =uesto pre(iene errori di programma$ione Cuando una fun$ione ina((ertitamente modifi#a (aria0ili usate da un"altra fun$ione% E" an#'e #omodo di#'iarare e ini$iali$$are una (aria0ile all"interno di un #i#lo% =uesto #rea una (aria0ile a##essi0ile solo all"interno di un #i#lo for% for7 int 6D @6E, @6448 F
%%%

2unzioni e para+etri
All"interno di una fun$ione sono (isi0ili le (aria0ili glo0ali l passaggio dei parametri pu> a((enire per (alore o per riferimento int G@ int 1@ (oid swap78 F int temp@ tempDG@ GD1@ 1Dtemp@ H $lo&ali int moltipli#a7int a: int 08 F return aJ0@ H per valore

locale

(oid swapr7int I(al,: int I(al28 F int temp@ tempD(al,@ (al,D(al2@ (al2Dtemp@ AJ in Cuesto #aso la fun$ione modifi#a due (alori utili$$o9 swapr7G:18JA H

per ri5eri+ento

Istruzioni di controllo
if else i5 ;varia&ile DD 55< H di$ital1rite;%9 <C I else di$ital1rite;%90<C for 5or;int iD0C iJ 0C iKK< H .erial.println;E.alveF<C I do while while

#ondi$ione

while;livello J 5 2< H di$ital1rite;,ed'osso9 )IG)<C livelloDanalo$'ead;A0<C I

do H dela=;50<C L D analo$'ead;A <C "" I while ;L J 00<C


#ondi$ione

Istruzioni di controllo
break &rea6 4 usata per uscire da do9 5or9 o while 9 &=passando la condizione nor+ale del ciclo. while ;true< H i5;di$ital'ead;5<DD0< &rea6C I switch case switch (var) { case ! ""esegui #uando var$$ break% case &! ""esegui #uando var$$& break% default! "" esegui il default "" default ' o(zionale )

A##endere e spegnere led


Pro0lema 2i (uole #'e il proprio s6et#' a##enda e spenga tre diodi led in modo da simulare il fun$ionamento di un semaforo%

Utili$$are un pulsante
Pro0lema 2i (uole #'e il proprio s6et#' risponda a##endendo un diodo led Cuando (iene #'iuso un #ontatto elettri#o: per esempio Cuando si utili$$a un pulsante a pressione%

AJ

un pulsante #ollegato al pin 2 a##ende un led #ollegato al pin ,* JA

#onst int ledPin D ,*@ #onst int inputPin D 2@ (oid setup78F pin)ode7ledPin: OUTPUT8@ pin)ode 7inputPin: INPUT8@ H (oid loop78 F int (alDdigitalRead7inputPin8@ if 7(alDD .IG.8 F digital<rite7ledPin: .IG.8@ H else F digital<rite7ledPin:&O<8@ H H

Ri#onos#ere la pressione del pulsante


Pro0lema 2i (uole #'e lo s6et#' agis#a su un led in us#ita solo in #orrisponden$a del #am0iamento di stato del pulsante% 2olu$ione 2i utili$$a una (aria0ile per memori$$are lo stato e agire solo Cuando Cuesto (alore #am0ia%

int 0utton2tate D @ int last5tn2tate D &O<@ AA stato pre#edente del pulsante

(oid loop78 F 0utton2tateD digitalRead70uttonPin8@ if 70utton2tate KD last5tn2tate8 F if 70utton2tate DD .IG.8 F digital<rite7ledPin: .IG.8@ H else F digital<rite7ledPin: &O<8@ H H last5tn2tateD 0utton2tate@ H

Ri#onos#ere la pressione del pulsante per #am0iare lo stato del led in us#ita%
Pro0lema 2i (uole #'e lo s6et#' agis#a in us#ita in modo #'e il led si illumini ad una prima pressione del tasto e resti a##eso spegnendosi alla pressione su##essi(a%

2olu$ione &o s6et#' pre#edente: gra$ie alle fun$ioni if nidifi#ate: in grado di distinguere la pressione 7 rising edge) dal rilas#io 7falling edge) del pulsante% Per fare in modo #'e il led resti a##eso al rilas#io del pulsante reagiremo solo sul rising edge*

#onst int 0uttonPin D 2@#onst int ledPin D ,*@ (oid loop78 F int 0utton2tate D @ int last5tn2tate D &O<@ int led2tateD &O<@ 0utton2tateD digitalRead70uttonPin8@ if 70utton2tate KD last5tn2tate II 0utton2tate DD .IG.8 F led2tate D K led2tate@ (oid setup78 F pin)ode7ledPin: OUTPUT8@ pin)ode70uttonPin: INPUT8@ H H else F digital<rite7ledPin: &O<8@ H H last5tn2tateD 0utton2tate@ H if 7led2tateDD .IG.8 F digital<rite7ledPin: .IG.8@

Una #ompli#a$ione9 il de0oun#e di un pulsante%


Pro0lema Reali$$ando lo s6et#' pre#edente #i siamo im0attuti in una #ompli#a$ione non 0anale: il led si a##ende o si spegne Cuando non do(re00e% Il pro0lema do(uto ai falsi #ontatti del pulsante durante la sua pressione o al suo rilas#io: fenomeno #'e 'a una durata di Cual#'e de#ina di millise#ondi% 2olu$ione Usare te#ni#'e di de0aun#e: la piL sempli#e #onsiste nell"aggiungere un ritardo dopo l"ese#u$ione del #odi#e legato alla pressione del tasto%

8ressione )IG)

'ilascio

,#1 .che+a se+pli5icato del 5eno+eno

#onst int 0uttonPin D 2@ #onst int ledPin D ,*@ #onst int de0aun#eDela1 D ! @ (oid loop78 F 0utton2tateD digitalRead70uttonPin8@ if 70utton2tate KD last5tn2tate II 0utton2tate DD .IG.8 F int 0utton2tate D @ int last5tn2tate D &O<@ int led2tateD &O<@ H (oid setup78 F pin)ode7ledPin: OUTPUT8@ pin)ode70uttonPin: INPUT8@ H H last5tn2tateD 0utton2tate@ dela17de0aun#eDela18@ H H else F digital<rite7ledPin: &O<8@ led2tate D K led2tate@ if 7led2tateDD .IG.8 F digital<rite7ledPin: .IG.8@

2imula$ione semaforo #on due fun$ioni normale e lampeggiante


Pro0lema 2i (uole #'e il semaforo reali$$ato #on tre led passi dal fun$ionamento normale a Cuello #on giallo lampeggiante premendo un pulsante e (i#e(ersa%

2olu$ione E" opportuno utili$$are due fun$ioni una per il fun$ionamento normale e l"altra per Cuello a lampeggio% Una (aria0ile di stato determina Cuale delle due utili$$are% Il pulsante premuto determina il #am0iamento della (aria0ile di stato%

#onst int (erdeD2@ #onst int gialloD*@ #onst int rossoDM@ #onst int ingressoD, @ 0oolean lampeggioDfalse@ (oid setup78 F pin)ode7(erde:OUTPUT8@ pin)ode7giallo:OUTPUT8@ pin)ode7rosso:OUTPUT8@ pin)ode7ingresso:INPUT8@ digital<rite7ingresso:.IG.8@ AA atti(a$ione pull up H AA in alternati(a pin)ode7ingresso: INPUTNPU&&UP8@

void nor+ale;<H di$ital1rite;rosso9,#1<C di$ital1rite;verde9)IG)<C di$ital1rite;$iallo9,#1<C dela=;!000<C di$ital1rite;$iallo9)IG)<C di$ital1rite;verde9,#1<C dela=; 000<C di$ital1rite;$iallo9,#1<C di$ital1rite;rosso9)IG)<C dela=;!000<C I

void $iallo,;< H di$ital1rite;verde9,#1<C di$ital1rite;rosso9,#1<C di$ital1rite;$iallo9)IG)<C dela=;500<C di$ital1rite;$iallo9,#1<C dela=;500<C I

void loop;< H i5;la+pe$$ioDD5alse< nor+ale;<C else $iallo,;<C i5 ;di$ital'ead;in$resso<DD0< la+pe$$ioDMla+pe$$ioC I AJ in Cuesto modo la modifi#a al fun$ionamento pu> essere effettuata solo alla fine di una seCuen$a di lampeggio JA

void loop;< H i5;la+pe$$ioDD5alse< nor+ale;<C else $iallo,;<C i5 ;di$ital'ead;in$resso<DD0< la+pe$$ioDMla+pe$$ioC I AJ in Cuesto modo la modifi#a al fun$ionamento pu> essere effettuata solo alla fine di una seCuen$a di lampeggio JA

.ostituzione della dela= per avere una risposta i++ediata

void attendi,e$$iInput;int attesa< H lon$ attualeD+illis;<C while;+illis;< J ;attualeKattesa<< H letturaDdi$ital'ead;in$resso<C i5 ;letturaDD,#1<H while;M di$ital'ead;in$resso<<C "" attende 5inch4 resta &asso dela=;200<C "" ri+&alzo al rilascio la+pe$$ioD M la+pe$$ioC &rea6C "" esce dalla while I I

*tilizzo di attendi,e$$iInput void $iallo,;< H di$ital1rite;$iallo9)IG)<C di$ital1rite;verde9,#1<C di$ital1rite;rosso9,#1<C ""dela=; 000<C attendi,e$$iInput; 000<C i5 ;M la+pe$$io< returnC di$ital1rite;$iallo9,#1<C di$ital1rite;verde9,#1<C di$ital1rite;rosso9,#1<C ""dela=; 000<C attendi,e$$iInput; 000<C I

sostituita termina la fun$ione giallo

sostituita

&eggere un ingresso analogi#o e #omuni#arlo in seriale


Pro0lema 2i (uole rile(are un input analogi#o: input da mi#ro#ontrollore lo #on(erte in un numero intero da seriale al P#% a ! Oolt% Il #on(ertitore ADC del a , 2*% Tale numero (errB in(iato in

2olu$ione &a lettura da input analogi#i (iene effettuata #on analogRead7A ;A!8 Per la #omuni#a$ione seriale si utili$$a 2erial%0egin7?- 8 per ini$iali$$are la #omuni#a$ione a ?- 0ps e 2erial%print7(alore8 per in(iare un (alore numeri#o sotto forma di #aratteri #odifi#ati in A2CII al P#% 2e il dato fosse l"intero ,2* i 01te in(iati sare00ero M? ! !, #orrispondenti ai #odi#i A2CII rispetti(amente di ,:2:* &a lettura sul P# pu> essere eseguita sfruttando il )onitor seriale dell"IDE o #on un programma spe#ifi#o%

&eggere piL di - input analogi#i


Pro0lema 2i de(ono rile(are piL input analogi#i di Cuanti pin analogi#i si a00iano a disposi$ione% &e s#'ede Arduino standard sono dotate di sei input analogi#i 7le )ega di ,-8 e in al#uni #asi gli input analogi#i non sono suffi#ienti per la propria appli#a$ione% Per esempio: nella propria appli#a$ione si pu> a(er 0isogno di regolare otto parametri girando le manopole di otto poten$iometri%

2olu$ione Per sele$ionare e #ollegare di(erse sorgenti di (oltaggi su un solo input analogi#o: si de(e utili$$are un #'ip multipleGer% 2ele$ionando di(erse sorgenti in modo seCuen$iale: si ries#e a leggere una alla (olta% Nell"esempio si utili$$a il diffuso #'ip M !,: #'e si #ollega ad Arduino #ome mostrato in figura%

"J legge + (alori analogi#i attra(erso un uni#o pin di input analogi#o JA #onst int sele#tP Q D F 2:*:MH@ #onst int analogPin D @ AA pin analogi#o #ollegato all"output del multipleGer AA la fun$ione restituis#e il (alore analogi#o di un #anale int getOalue7int #'annel8 F AA imposta i 0it del selettore in modo #'e #orrispondano al (alore 0inario del #anale for 7int 0itD @0it E*@ 0it448 F int pinDsele#tP0itQ@ int is5it2et D 0itRead7#'annel:0it8@ digital<rite7pin: is5it2et8@ H return analogRead7analogPin8@ H

(oid setup78 F for 7int 0itD @ 0it E *@0it448 pin)ode7sele#tP0itQ: OUTPUT8@ 2erial%0egin7?H (oid loop78 F AA stampa i (alori di #ias#un #anale una (olta al se#ondo for 7int #'annelD @ #'annel E+@ #'annel448 F int (alue D getOalue7#'annel8@ 2erial%print7RCanale R8@ 2erial%print7#'annel8@ 2erial%print7R D R8@ 2erial%print7(alue8@ H Dela17, H 8@ 8@

"

'ealizzare uno s6etch con processin$ in +odo che riceva dati seriali da Arduino Pro0lema
2i (uole utili$$are l"am0iente di s(iluppo di Pro#essing per ri#e(ere in seriale da Arduino un (alore #orrispondente alla posi$ione di un poten$iometro% &a posi$ione (iene utili$$ata per simulare l"in#lina$ione di un aereo (isto di #oda%

2olu$ione
&o s6et#' su Arduino in(ia ogni * ms un (alore da a 2! #ontenuto in un 01te in 0ase alla rota$ione di un poten$iometro #ollegato all"ingresso analogi#o A %

255 =

!50 piLel

AJJ Il programma (iene asso#iato ad uno s6et#' su arduino #'e in(ia la posi$ione di un poten$iometro: tramite lettura analogi#a% JA import pro#essing%serial%J@ 2erial serial2@ int dataPQD new intPMQ@ int G,D, @ int 1,D, @ int G2DMM @ int 12D, @ int in51te@ (oid setup78 F si$e7M! : 2!!8@ 0a#6ground7 8@ AA nero stro6e7 8@ serial2 D new 2erial7t'is: 2erial%list78P2Q: ?- 8@ print72erial%list78P2Q8@ H

(oid draw78 F stro6e72!!8@ 0a#6ground7 8@ dela172 8@ AA ritardo ne#essario fill7 :2!!:2!!8@ ellipse722 :, :! :! 8@AJ #er#'io rD! JA line722 :, :22 :* 8@ AA#oda GD22 if 7serial2%a(aila0le78 S 8 in51te D serial2%read78@ dataP QDG,@ dataP2QDG2@ dataP,QD1,47in51te;,2!8@ dataP*QD12;7in51te;,2!8@ AJ Disegna la linea #on le #oordinate ri#e(ute% 2e in51teD ,2! rimane ori$$ontale JA stro6e7 :2!!:2!!8@ line7dataP Q: dataP,Q: dataP2Q: dataP*Q8@ AAali H

Cari#a di un #ondensatore%
Pro0lema Un #ondensatore di #apa#itB C: #ollegato alla tensione O mediante una resisten$a R: si #ari#a se#ondo la legge esponen$iale9
t

V =V 0 ( 1e RC )

Il prodotto RC (iene detto #ostante di tempo e dB un stima della (elo#itB di #ari#a del #ondensatore% Dopo un tempo tDRC il #ondensatore si #ari#ato di #ir#a il -*T 7,; ,A e8del (alore massimo% 2i (uole (erifi#are sperimentalmente la legge% 2olu$ione &o s6et#' su arduino: dopo a(er dato tensione al #ir#uito: una resisten$a e un #ondensatore #ollegati in serie: misura la tensione ai #api del #ondensatore in istanti su##essi(i per un #erto numero di (olte: #omuni#a i dati di tensione e di tempo ad uno s6et#' di pro#essing #'e li (isuali$$a su di un grafi#o%

R D , /o'm C D , nU RCD : , s

Vdefine Num)aG M2 #onst int pinCari#a D2@ #onst int ledD,*@ long ini$io@ unsigned int tempoPNum)aGQ@ int letturaPNum)aGQ@ (oid setup78 F 2erial%0egin7?- 8@ pin)ode7pinCari#a:OUTPUT8@ pin)ode7led:OUTPUT8@ H (oid loop78 F digital<rite7pinCari#a: &O<8@ AA s#ari#a #ondensatore dela17, 8@ digital<rite7led:.IG.8@ AA segnala$ione digital<rite7pinCari#a:.IG.8@ AA ini$io #ari#a ini$ioDmi#ros78@ for 7int 6D @6ENum)aG@6448 F tempoP6QDmi#ros78; ini$io@ letturaP6QDanalogRead7A 8@ AA ,,* us H

AA in(io dati in seriale for7int 6D @6ENum)aG@6448 F 2erial%print7letturaP6Q8@ 2erial%print7" "8@ 2erial%print7tempoP6QA, 8@ 2erial%print7" "8@ H 2erial%print7"J"8@ digital<rite7led:&O<8@ AA fine segnala$ione dela17, 8@ H

'D 20 Noh+ :D 00 n2

import pro#essing%serial%J@ 2tring m12tring D null@ 0oolean fineDfalse@ AA T'e serial port9 2erial m1Port@

(oid setup78 F si$e7M :* 8@ m1Port D new 2erial7t'is: 2erial%list78 P2Q: ?- 8@ H

(oid draw78 F stro6e7 : :2!!8@ line7,:2??:*??:2??8@ line7,:2??:,:,8@ fill7 8@ AA nero teGt7RM! msR: *! :2W 8@ if 7fine8 F print7m12tring8@ fineDfalse@ intPQ datiD int7split7m12tring:#'ar7 G2 888@ stro6e72!!: : 8@ int GD @ int 1D 2??@ if7dati KD null8 F for7int 6D @6Edati%lengt';,@6D6428F int G,DdatiP64,QA, @ int 1,D2??;7datiP6QJ2??A, 2*8@ line7G:1:G,:1,8@ GDG,@ 1D1,@ H m12tringDRR@ H H H

(oid serialE(ent72erial m1Port8 F #'ar #arattereDm1Port%readC'ar78@ m12tringDm12tring4#arattere@ if7#arattereDD"J"8 fineDtrue@ H

&eggere un tastierino a matri#e


Pro0lema 2i (uole rile(are la pressione dei tasti di un tastierino a matri#e rig'e: #olonne #ome Cuello dei telefoni% 2olu$ione 2i de(ono #ollegare le M rig'e e le * #olonne del #onnettore del tastierino rispetti(amente a M ingressi e a * us#ite digitali di Arduino #ome in figura% =uando (iene pigiato un tasto: (iene messa in #omuni#a$ione una #olonna #on una riga% In figura per sempli#itB indi#ato un solo tasto%

Dis#ussione ,e tastiere a +atrice sono di solito costituite da pulsanti nor+al+ente aperti che9 Ouando ven$ono pre+uti9 colle$ano una ri$a a un colonna. ,a 5unzione get/e1 i+posta in seOuenza su &O< i pin per ciscuna colonna e poi controlla se i pin di alcune ri$he sono &O<% Dato che si utilizzano delle resistenze di pull-up le ri$he saranno .IG. a +eno che non si chiuda un pulsante. #onst #'ar 6e1mapPMQP*QD H H7 79 7279 7%7I 9 H7!79 7579 767I9 H7>79 7(79 7/7I9 H7P79 7079 7Q7I IC int nu+:arD0C int o55setD0C int te+pTi+eD0C int ti+eC #onst int rowPinsPMQDF+:?:, :,*H@ #onst int #olPinsP*QD F :-:WH@

#'ar get/e178 F #'ar 6e1D @ for7int #olumnD @#olumnE*@#olumn448 F digital<rite7#olPinsP#olumnQ:&O<8@ for7int rowD @rowEM@ row448 F if7digitalRead7rowPinsProwQ8DD&O<8 F dela172 8@ w'ile7digitalRead7rowPinsProwQ8DD &O<8@ 6e1D 6e1mapProwQP#olumnQ@ H H digital<rite7#olPinsP#olumnQ:.IG.8@ H return 6e1@ H

(oid setup78 F 2erial%0egin7?-

8@

for 7int rowD @rowEM@row448 F pin)ode7rowPinsProwQ:INPUT8@ digital<rite7rowPinsProwQ:.IG.8@ AAatti(a pull;up H for 7int #olumnD @#olumnE*@#olumn448 F pin)ode7#olPinsP#olumnQ:OUTPUT8@ digital<rite7#olPinsP#olumnQ:.IG.8@ AA#olonne tutte inatti(e H H (oid loop78 F #'ar 6e1Dget/e178@ if76e1 KD 8 F 2erial%println76e18@ H

Contatti da sG9 #olonne 7 la prima ,:M:W:J8 rig'e 7la prima ,:2:*:A8 &a Cuarta #olonna non utili$$ata%

Utili$$are displa1
Collegare e utili$$are un displa1 &CD alfanumeri#o

Pro0lema 2i (uole utili$$are un &CD alfanumeri#o 0asato sul #ontroller .DMMW+ di .ita#'i o un #'ip #ompati0ile e si (ogliono (isuali$$are (alori alfanumeri#i%

2olu$ione Il software di Arduino in#lude la li0reria &iCuidCr1stal: #'e ser(e a gestire i dispositi(i &CD 0asati sul #'ip .DMMW+ %

Pin del displa1 &CD , 2 * M ! W + ? , ,, ,2 ,* ,M ,! ,-

Uun$ione GND o Oss 4!O o Odd #ontrasto R2 RA< E D D, D2 D* DM D! DDW 4! retroillumina$ione GND retroillumina$ione

Pin di Arduino GND 4!O Da ,2 GND ,, a 4!O

! M * 2

Vin#lude E&iCuidCr1stal%'S &iCuidCr1stal l#d7,2:,,:!:M:*:28@ (oid setup78 F l#d%0egin7,-:28@ H (oid loop78 F for7 int numeroD @ numero E2!-@ numero448 F if 7numeroDD 8 F l#d%#lear78@ l#d%print7Rnumero9 R8@ H l#d%setCursor7?: 8@ l#d%print7numero8@ dela172 H H 8@ AA R2 E DM D! D- DW

Collegare e utili$$are displa1 a W segmenti


Pro0lema .i vo$liono utilizzare dei displa= a > se$+enti per visualizzare dei nu+eri. 2olu$ione *n displa= a > se$+enti ha la piedinatura che si vede in 5i$ura. .e il displa= 4 a catodo co+une Ouesto andrR colle$ato a +assa attraverso una resistenza. Gli altri pin deno+inati a9&9c9d.e9 59$ possono essere colle$ati co+e nello sche+a se$uente.

Displa1 Pin

a&cde5 $ !5>(/%2

-ell7ese+pio che se$ue viene utilizzato un unico displa=. Il catodo co+une del displa= non 4 colle$ato a +assa +a al pin 0 della scheda Arduino. Tale pin viene dichiarato in output e attivato al valore &O<.

const int se$+ent8insA>BDH!959>9(9/9%92IC "" a & c d e 5 $ const int catodo D 0C "" se$+ent8inA0B const int attivazioneA 0BDH0&00 90&00000 090&0 0 0 0&0 00 90&0 00 0090&0 0 0 90&0 0 90&00000 90&0 0 IC "" 0$5edc&a void setup;< H 5or ;int iD0CiJ(CiKK< pinMode;se$+ent8insAiB9#*T8*T<C pinMode;catodo9#*T8*T<C di$ital1rite;catodo9,#1<C "" a&ilitazione del displa= I void loop;< H "" ci5re da 0 a / in seOuenza 5or ;int nu+eroD0C nu+eroJ 0Cnu+eroKK< H showDi$it;nu+ero<C dela=; 000<C I I

a 9 90&0

void showDi$it;int nu+&er< H &oolean is3it.etC "" a&ilitazione di$it 5or ;int se$+entD0C se$+entJ>C se$+entKK< H is3it.etD&it'ead;attivazioneAnu+&erB9se$+ent<C di$ital1rite;se$+ent8insAse$+entB9is3it.et<C I I

2e i displa1 sono piL di uno si pu> utili$$are la te#ni#a del multipleGing% Tutti i sette pin a:0%#:d:e:f:g dei displa1 sono #ollegati in parallelo mentre i #atodi #omuni sono atti(ati da altri pin di Arduino% &"atti(a$ione a((iene #on (alore logi#o (ari displa1% e (iene fatta #i#li#amente per i

&a #osa importante #'e i displa1 (engano atti(ati tutti in un tempo totale di #ir#a 2 ms% In Cuesto modo: per la persisten$a della (isione: l"impressione #'e tutti i displa1 siano a##esi #ontemporaneamente% =uando si atti(a un displa1 (iene in(iata ai suoi led la #onfigura$ione 0inaria opportuna: per (isuali$$are la #ifra numeri#a%

const int se$+ent8insA>BDH!959>9(9/9%92IC "" a & c d e 5 $ const int di$it8insA%BDH 09 9 2IC 90&00000 0 0 90&0 090&0 0 0 9 90&0 90&0

const int nu+eraleA 0BDH0&00 0&0 00 0 IC 90&0 00 0090&0

0 90&00000

void setup;< H 5or ;int iD0CiJ(CiKK< pinMode;se$+ent8insAiB9#*T8*T<C 5or ;int iD 0CiJ %CiKK< pinMode;i9#*T8*T<C 5or;int iD0CiJ%CiKK< di$ital1rite;di$it8insAiB9)IG)<C I

(oid loop78 F int numeroDanalogRead7A 8@ numeroDmap7numero: :, 2*: :???8@

for7int 6D @6E! @6448 s'owNum0er7numero8@ AA il #i#lo for (iene eseguito in WJ*J! D, ! ms H

AA ri#'iama * (olte la s'owDigit (oid s'owNum0er7int num0er8 F if 7num0erDD 8 s'owDigit7 :28@ AA s'owDigit7 #ifra: displa18 elseF for7int digitD2@ digit SD @ digit;;8 F if 7num0erS 8F s'owDigit7num0erT, :digit8@ num0erDnum0erA, @ H H H

AA ritarda W millise#ondi (oid s'owDigit7int num0er:int digit8 F 0oolean is5it2et@ AA a0ilita$ione digit digital<rite7digitPinsPdigitQ:&O<8@ for 7int segmentD @ segmentEW@ segment448 F is5it2etD0itRead7numeralePnum0erQ:segment8@ digital<rite7segmentPinsPsegmentQ:is5it2et8@ H dela17W8@ digital<rite7digitPinsPdigitQ:.IG.8@ H

*tilizzare una co+unicazione seriale per pilotare un displa= a > se$+enti


8ro&le+a .i vuole controllare un displa= a > se$+enti inviando i dati con una co+unicazione seriale sincrona . .oluzione .i utilizza uno shi5t re$ister co+e >!):5/5 e la 5unzione shi5t#ut per inviare ( &it in +odo seriale sincrono ;con cloc6<. In Ouesto +odo si utilizzano solo % pin di$itali di Arduino9 uno per i &it inviati in serie9 uno per il cloc6 e uno per l7a&ilitazione dell7uscita verso il displa= Ouando il dato ;&=te< 4 pronto

int lat#'Pin D !@ AAPin #onne#ted to 2TNCP of WM.C!?! in(io in us#ita int #lo#6Pin D W@ AAPin #onne#ted to 2.NCP of WM.C!?! #lo#6 int dataPin D -@ AAPin #onne#ted to D2 of WM.C!?! dati

#onst int #ifraP,-QD AA gfed#0a F 0 ,,,,,,: 0 ,, : 0 , ,, ,,: 0 , ,,,,: 0 ,, , : 0 ,, ,, ,: 0 ,,,,, ,: 0 ,,,: 0 ,,,,,,,: 0 ,, ,,,,: 0 ,,, ,,,: 0 ,,,,, : 0 ,,, ,: 0 , ,,,, : 0 ,,,, ,: 0 ,, , ,H@ (oid setup78 F pin)ode7lat#'Pin: OUTPUT8@ AAset pins to output pin)ode7#lo#6Pin: OUTPUT8@ pin)ode7dataPin: OUTPUT8@ H (oid loop78 F for7int 6D @6E,-@6448 F AAground lat#'Pin and 'old low for as long as 1ou are transmitting digital<rite7lat#'Pin: &O<8@ s'iftOut7dataPin: #lo#6Pin: )25UIR2T:#ifraP6Q8@ AJ per lo $ero si in(ia ,,,,,, dal piL signifi#ati(o al termine dello s'ift sull"us#ita C del WM.C!?! #i sarB il 0it meno signifi#ati(o: in Cuesto #aso ,JA digital<rite7lat#'Pin: .IG.8@ dela17, 8@ H H

:olle$a+ento in cascata di shi5t re$ister >!):5/5

In$resso &it

A##ensione dei led #ome super#ar


(oid loop78 F for 7int X D ,@ X E -!!*-@ XDXJ28 F digital<rite7lat#'Pin: &O<8@ s'iftOut7dataPin: #lo#6Pin: )25UIR2T: 7XSS+88@ AA in(io + 0it alti s'iftOut7dataPin:#lo#6Pin:)25UIR2T:X8@ AA in(io + 0it 0assi digital<rite7lat#'Pin: .IG.8@ dela17* 8@ H for 7int X D *2W-+@ X S @ XDXA28 F digital<rite7lat#'Pin: &O<8@ s'iftOut7dataPin: #lo#6Pin: )25UIR2T: 7XSS+88@ s'iftOut7dataPin: #lo#6Pin: )25UIR2T: X8@ digital<rite7lat#'Pin: .IG.8@ dela17* 8@ H H

*tilizzare co+e displa= uno stru+ento analo$ico


8ro&le+a .i vuole controllare la lancetta di uno stru+ento analo$ico dallo s6etch. ,e letture varia&ili sono piG 5acili da interpretare con stru+enti analo$ici. .oluzione *tilizzo di pw+ . 8er un +isuratore da resistenza da 5N oh+ +A 5ondo scala si utilizza una

const in analo$8inD 0C const int analo$Meter8in D/C

int sensorSalue D0C int outputSalueD0C

(oid setup78

H I

(oid loop78 F sensorOalueD analogRead7analogPin8@ outputOalueDmap7sensorOalue: :, 2*: :2!!8@ analog<rite7analog)eterPin: outputOalue8@

&a fun$ione analog<rite7pin: ;2!!8 utili$$a una te#ni#a detta P<) 7Pulse <idt' )odulation8 % Il segnale P<) opera (ariando la propor$ione dei tempi di on e di off degli impulsi%
T

analog<rite7pin :,2W8 @ AA! T del dut1 #1#le

Il periodo di , ms % 2u Arduino i pin #'e possono essere utili$$ati per l"output analogi#o sono il *: !:-: ?: , e ,,%

2EN2ORI DI TE)PERATURA &)*! produ#e un (oltaggio analogi#o direttamente propor$ionale alla temperatura #on un output di , milli(olt per grado% Il termistore NTC da , / o'm a 2!Y (aria la sua resisten$a #on la temperatura% Con istruzioni di Arduino (oltaggioD7!% J(alore&etto8A, 2*@ termistoreD 77, tempD 7M,
% , -- D ,

J!% 8A(oltaggio8;,

8@

% Alog7termistoreA % , --8@ dipende dal termistore


A72W*%,!42!88

AA la #ostante M,
eZ 7;M,

Sensori di temperatura

*n sensore alternativo per +isurare la te+peratura 4 l7,M%%5. ,7output dell7,M%%5 4 pari a 0+S per $rado Nelvin e Ouindi 0T celsius producono 29>% volt. 8er i+postare la corrente di i+pie$o 4 necessaria una resistenza da N oh+.

int (alueD analogRead7inPin8@ float milli(oltsD 7(alueA , 2*% 8J! @ float #elsiusD 7milli(oltsA, 8 ;2W*%,!@

2EN2ORI DI PRO22I)ITA" A INURARO22I

2EN2ORI DI PRO22I)ITA" A INURARO22I

Il sensore fornis#e in us#ita una tensione #'e (aria in fun$ione della distan$a dell"osta#olo rile(ato% 2i utili$$a una analogRead7A 8

Rispondere a un tele#omando ad infrarossi


Pro0lema 2i (uole rispondere alla pressione di un tasto Cualsiasi sul tele#omando di un tele(isore o altro% 2olu$ione 2i utili$$a un dispositi(o +odulo ricevitore I, #'e 'a al suo interno un amplifi#atore e un filtro a *+ /'$ per renderlo immune alla radia$ione infrarossa am0ientale%

T2OP2M*+

, Output 2 4!O * Gnd

,2*

AA il led sul pin ,* si a##ende o si spegne ogni (olta AA #'e si preme un tasto Vin#lude EIRremote%'S AA li0reria da in#ludere #onst int RECONPIN D ,,@ AA output #ollegato al pin ,, #onst int ledPin D ,*@ IRre#( irre#(7RECONPIN8@ de#odeNresults results@ (oid setup78 F pin)ode7ledPin:OUTPUT8@ irre#(%ena0leIRIn78@ AA 2tart oggetto ri#e(itore H 0oolean lig't2tate D false@ unsigned long lastD millis78@ (oid loop78 F if 7irre#(%de#ode7Iresults8DD true8 F if7 millis78 ;last S2! 8 F AA se sono tras#orsi almeno 2! ms lig't2tate D K lig't2tate@ digital<rite7ledPin: lig't2tate8@ AA #am0ia stato H lastDmillis78@ irre#(%resume78@ AA Ri#e(e il prossimo (alore H H

*tilizzo di un +isuratore di distanza ad ultrasuoni

Uornendo un impulso positi(o della durata di , [s al pin di ingresso \Trigger]: il sensore genera un treno d"impulsi 7otto8 ad ultrasuoni a M 6.$: Cuesti impulsi (engono in(iati: tramite la #apsula trasmittente: (erso l"osta#olo: la #apsula ri#e(ente rile(a l"e#o sul pin di us#ita \E#'o]: do(e sarB presente un impulso di durata da ,! [s 72 #m8 a 2! ms 7M:! m8 propor$ionale alla distan$a dell"oggetto% 2e non rile(a al#un osta#olo entro i M:! m: produ#e un impulso di durata di #ir#a *+ ms% &a formula per #al#olare la distan$a in #m 9 impulso in [s di(iso !+%

#onst int trigD2@ AA us#ita per in(iare un impulso al sonar #onst int e#'oD*@ AA ingresso per leggere l"e#o (oid setup78 F pin)ode7trig:OUTPUT8@ pin)ode7e#'o:INPUT8@ 2erial%0egin7?- 8@ H (oid loop78 F 2erial%print7distan$a788@ 2erial%println7R #mR8@ dela172 8@ H int distan$a78F long duration@ digital<rite7trig:&O<8@ dela1)i#rose#onds7!8@ digital<rite7trig:.IG.8@ dela1)i#rose#onds7, 8@ AA #rea$ione di un impulso di , us digital<rite7trig:&O<8@ durationDpulseIn7e#'o:.IG.:2 8@ AA rile(a il tempo di ritorno dell"e#o return 7int8 durationA!+@ AA (elo#itB del suono *M mAs : *M #mAus 2? usA#m H Ti+eout in +icrosecondi opzionale

,7output 5isico
:ontrollare un +otore in corrente continua
Pro0lema 2i (uole #ontrollare la (elo#itB di rota$ione di un motore in #%#% attra(erso una us#ita P<) 7Pulse <ide )odulation8

2olu$ione 2i utili$$a la fun$ione analog<rite7pin: ;2!!8 per regolare il pwm% &o s6et#' seguente ri#e(e un #arattere da a ? dalla porta seriale e lo #on(erte nel range da a 2!! per #omandare il motore%

#onst int motorPin D *@ (oid setup78 F 2erial%0egin7?H 8@

(oid loop78 F if 72erial%a(aila0le788 F #'ar #'D 2erial%Read78@ if7isDigit7#'8 AA #' un numero ^ F int speedDmap7#':" ":"?": :2!!8@ analog<rite7motorPin:speed8@ 2erial%println7speed8@ H else F 2erial%println7\Carattere inaspettato ]8@ 2erial%println7#'8@ H H H

Controllare la rota$ione di due motori in #%#% #on un ponte ad .%


Pro0lema 2i (uole #ontrollare la dire$ione di rota$ione di due motori in #%#% Tale pro0lema tipi#o del #ontrollo dei motori di un ro0ot autonomo% 2olu$ione I ponti ad . sono in grado di #ontrollare i motori a spa$$ole% 2i pu> utili$$are un &2?*D .;5ridge IC #'e pu> #ontrollare due motori in #%#% 2i pu> utili$$are an#'e l"2NW!MM, : #'e presenta la stessa disposi$ione dei pin%

#onst int m,Pin, D!@ #onst int m,Pin2 DM@ #onst int m2Pin, D*@ #onst int m2Pin2 D2@ (oid setup78 F pin)ode7m,Pin,:OUTPUT8@ pin)ode7m,Pin2:OUTPUT8@ pin)ode7m2Pin,:OUTPUT8@ pin)ode7m2Pin2:OUTPUT8@ H (oid loop78 F a(anti72 8@ fermo78@ indietro72 8@ H (oid a(anti7int tempo8 F digital<rite7m,Pin,:&O<8@ digital<rite7m,Pin2:.IG.8@ digital<rite7m2Pin,:&O<8@ digital<rite7m2Pin2:.IG.8@ dela17tempo8@ H

(oid indietro7int tempo8 F digital<rite7m,Pin,:.IG.8@ digital<rite7m,Pin2:&O<8@ digital<rite7m2Pin,:.IG.8@ digital<rite7m2Pin2:&O<8@ dela17tempo8@ H (oid fermo78 F digital<rite7m,Pin,:&O<8@ digital<rite7m,Pin2:&O<8@ digital<rite7m2Pin,:&O<8@ digital<rite7m2Pin2:&O<8@ dela17, 8@ H

Controllare la posi$ione di un ser(omotore


Pro0lema 2i (uole #ontrollare la posi$ione di un ser(omotore posi$ionandolo da Y a ,+ Y% Utili$$ando un sensore di lu#e #'e ruota #on il ser(omotore si (uole #'e Cuesto si sposti nella posi$ione di masssima lu#e% 2olu$ione 2i utili$$a una fotoresisten$a fissata sul ser(omotore: si fa ruotare il ser(omotore da Y a ,+ Y a passi di un grado e si aggiorna man mano il (alore di lu#e massimo misurato dalla fotoresisten$a aggiornando nel #ontempo l"angolo #orrispondente% Alla fine si riporta il ser(omotore nella posi$ione #orrispondente all"angolo di lu#e massima% Il ser(omotore si posi$iona a se#onda della durata degli impulsi #'e ri(e(e9 , ms #orrisponde a Y: 2 ms a ,+ Y% &a durata degli impulsi dipende dal tipo di ser(omotore%

Vin#lude E2er(o%'S 2er(o ser(oG@ int letturaminD, 2M@ AA la lu#e fa diminuire il (alore della fotoresisten$a e la lettura int angolomaGD @ (oid setup78 F ser(oG%atta#'7?:,ser(oG%write7? 8@ dela17, 8@ H :,? 8@ AAtra ,:- ms e 2 ms 7usare pin ? o , 8

(oid loop78 F for7int angoloD2 @ angoloED,+ @angoloDangolo448 F ser(oG%write7angolo8@ dela17* 8@ int letturaDanalogRead7A 8@ if 7letturaminS lettura8 F letturaminDlettura@ angolomaGDangolo@ H H

ser(oG%write7angolomaG8@ dela172 8@ angolomaGD @ letturaminD, 2M@ dela17! H 8@

Controllare la rota$ione di un motore passo passo 7stepper motor8


Pro0lema 2i (uole #ontrollare la rota$ione di un motore passo passo unipolare utili$$ando gli output digitali% I motori passo passo si distinguono in due #ategorie: 0ipolari e unipolari % =uelli unipolari pre(edono M a((olgimenti da alimentare in seCuen$a uno alla (olta in senso orario o antiorario per generare la rota$ione% 2ono #aratteri$$ati da ! o - fili a se#onda #'e gli a((olgimenti siano #ollegati ad un nodo #omune o a due a due #on due nodi% 2olu$ione Ogni (olta #'e si alimenta un a((olgimento dello statore: togliendo alimenta$ione agli altri: il motore gira di un passo: per esempio ,:+Y in Cuanto il rotore: magneti$$ato nord sud: si orienta sul #ampo magneti#o % Per alimentare i M a((olgimenti dello statore si pu> utili$$are un darlington arra1s #ome un U&N2 *%

#onst int fasePMQD F 0 ,: 0 #onst int pinPMQD F2:*:M:!H@ (oid setup78 F pin)ode72:OUTPUT8@ pin)ode7*:OUTPUT8@ pin)ode7M:OUTPUT8@ pin)ode7!:OUTPUT8@ H (oid loop78 F giraOr7, 8@ dela17! 8@ giraAn7, 8@ dela172 8@ H

, : 0 ,

: 0,

H@

(oid giraOr7int numPassi8 F AA numPassiGM for7int passiD @passiE numPassi@passi448 F for 7int XD @XEM@X448 F AA per le M fasi for7int 6D @6EM@6448F AA per i M 0it digital<rite7pinP6Q:0itRead7fasePXQ:688@ H dela17*8@ AA ritardo di passo H H for7int 6D @6EM@6448 AA togli alimenta$ione digital<rite7pinP6Q:&O<8@ H (oid giraAn7int numPassi8 F AA numPassiGM for7int passiD @passiE numPassi@passi448 F for 7int XD*@XSD @X;;8 F for7int 6D @6EM@6448F digital<rite7pinP6Q:0itRead7fasePXQ:688@ H dela17*8@ H H for7int 6D @6EM@6448 AA togli alimenta$ione digital<rite7pinP6Q:&O<8@ H

,7output audio
Un suono prodotto dalla (i0ra$ione dell"aria% Il segnale elettri#o (iene #on(ertito in segnale a#usti#o: (i0ra$ioni dell"aria: da un altoparlante o da un dispositi(o pie$oelettri#o% &"inter(allo dei suoni udi0ili dagli esseri umani os#illa tra 2 periodi al se#ondo8 e 2 .$% .$ 7#i#li o

Il software di Arduino per produrre del suono in#lude la fun$ione tone

tone7pin: freCuen$a in .$: durata in ms8

#onst int us#ita D2@ #onst int laMDMM @ AA do re mi fa sol la si do ,2 semitoni: , tra mi;fa e si;do #onst int siMDMM Jpow72:72% A,288@ AA MM .er$ G 2Z7semitoniA,28 #onst int do! DMM Jpow72:7*% A,288@ #onst int re!DMM Jpow72:7!% A,288@ #onst int si0MDMM Jpow72:7,% A,288@ #onst int solMDMM Jpow72:;72% A,288@ #onst int tu2#endiPQDFdo!:do!:re!:do!:si0M:si0M:laM:laM:solM:laM:si0M:do!:do!:si0M:laM:solMH@ (oid setup78 F pin)ode7us#ita:OUTPUT8@ H (oid loop78 F for7int 6D @6Esi$eof7tu2#endi8Asi$eof7int8@6448F tone7us#ita:tu2#endiP6Q:W! 8@ dela17W! 8@ H dela17* 8@ H ;pin9 5reOuenza in )z9 durata in +s<

Comuni#are utili$$ando I2C


Introdu$ione I due #ollegamenti del 0us I2C si #'iamano 2C& e 2DA% 2ulle s#'ede Arduino standard sono disponi0ili utili$$ando il pin analogi#o ! per 2C&: #'e offre il segnale di #lo#6: e il pin analogi#o M per 2DA #'e ser(e per trasferire i dati% Un dispositi(o sul 0us I2C fun$iona da dispositi(o +aster % &a sua fun$ione #oordinare il trasferimento delle informa$ioni #on gli altri dispositi(i slave*

Utili$$are un port eGpander I2C


Pro0lema 2i (ogliono utili$$are piL porte di Cuante me fornis#a la propria s#'eda% 2olu$ione 2i utili$$a un port eGpander esterno: #ome PCU+!WMA: #'e dotato di + pin di inputAoutput #'e possono essere #ontrollati usando I2C%

Gli ingressi A ;A2 ser(ono per sta0ilire l"indiri$$o del dispositi(o% Collegandoli a massa l"indiri$$o G*+ e arri(a fino a G*U% &a li0reria da in#ludere <ire%' e i medodi sono9 <ire%0egin78@ <ire%0eginTransmission7address8@ <ire%write7numero8@ <ire%endTransmission78@ Vin#lude E<ire%'S #onst int address D G*+@ int numero@ (oid setup78 F <ire%0egin78@ H (oid loop78 F for7 numeroD @ numero E2!-@ numero448 F <ire%0eginTransmission7address8@ <ire%write7numero Z GUU8@ AA si a##endono dei led in logi#a negata <ire%endTransmission78@ dela172 8@ H H

Utili$$are l"'ardware del #ontroller

Gli interrupt
Gli interrupt sono segnali #'e o00ligano il pro#essore ad interrompere il flusso normale di uno s6et#' per gestire una opera$ione #'e ri#'iede un"atten$ione immediata: prima di #ontinuare Cuello #'e sta(a fa#endo% Arduino utili$$a gli interrupt per gestire i dati #'e pro(engono dalla porta seriale: per tenere il tempo nelle fun$ioni dela1 e millis e per lan#iare una fun$ione #on atta#'Interrupt% Arduino gestis#e un interrupt alla (olta% Il #odi#e #'e gestis#e un interrupt: detto interru(t service routine- do(re00e essere 0re(e: per e(itare #'e gli altri interrupt (engano gestiti #on un ritardo e##essi(o% &a fun$ione atta#'Interrupt7 :anal1$e:C.ANGE8 #ollega all"interrupt : #'e si riferis#e al pin 2: la fun$ione anal1$e #'e (iene eseguita Cuando sul pin 2 a((iene un #am0iamento di stato% Altre possi0ilitB sono &O<: RI2ING: UA&&ING% &"interrupt , si riferis#e al pin * #on le stesse modalitB%

Utili$$are gli interrupt sui pin 2 e *


Pro0lema 2i (uole reali$$are un timer #'e de#rementa ogni , se#ondi un numero (isuali$$ato su di un displa1% Due pulsanti permettono di in#rementare o de#rementare tale numero in modo immediato% 2olu$ione Per poter reagire in modo immediato i due pulsanti sono #ollegati ai pin 2 e * #'e sono sorgenti di interrupt%

#onst int segmentPinsPWQDFM:!:-:W:+:?:, H@ #onst int atti(a$ioneP, QDF 0 ,,,,,,: 0 ,, : 0 , ,, ,,: 0 , ,,,,: 0 ,, , : 0 ,, ,, ,: 0 ,,,,, ,: 0 ,,,: 0 ,,,,,,,: 0 ,, ,,,,H@ int numeroD @ (oid s'owDigit7int num0er8 F 0oolean is5it2et@ AA a0ilita$ione digit for 7int segmentD @ segmentEW@ segment448 F is5it2etD0itRead7atti(a$ionePnum0erQ:segment8@ digital<rite7segmentPinsPsegmentQ:is5it2et8@ H H (oid in#rementa78 F AA de0oun#e if 7numero E ?8 numero44@ s'owDigit7numero8@ H (oid de#rementa78 F AA de0oun#e if7numero S 8 numero;;@ s'owDigit7numero8@ H

(oid setup78 F for 7int iD @iE+@i448 pin)ode7segmentPinsPiQ:OUTPUT8@ atta#'Interrupt7 :in#rementa:RI2ING8@ atta#'Interrupt7,:de#rementa:RI2ING8@ H (oid loop78 F s'owDigit7numero8@ dela17, 8@ if 7numeroS 8 numero;; @ H

Vin#lude ETimerOne%'S (oid setup78 F AA Initiali$e t'e digital pin as an output% AA Pin ,* 'as an &ED #onne#ted on most Arduino 0oards pin)ode7,*: OUTPUT8@

Interrupt dal timer, AA ne#essario aggiungere la li0reria TimerOne

Timer,%initiali$e7, 8@ AA set a timer of lengt' , mi#rose#onds 7or %, se# ; or , .$ DS t'e led will 0lin6 ! times: ! #1#les of on;and;off: per se#ond8 Timer,%atta#'Interrupt7 timerIsr 8@ AA atta#' t'e ser(i#e routine 'ere H (oid loop78 F AA )ain #ode loop H AA I2R Timer Routine (oid timerIsr78 F AA Toggle &ED digital<rite7 ,*: digitalRead7 ,* 8 Z , 8@ H

Controllare una matri#e di led utili$$ando il multipleGing e l"interrupt del timer


2olu$ione Nello s6et#' si utili$$a una matri#e di led #omposta da *! led 7W rig'e G ! #olonne8% Ci sono matri#i di led di dimensione +G+ #ome in figura%

Gli anodi sono #ollegati alle rig'e: i #atodi alle #olonne% Per a##endere un led la #olonna #orrispondente de(e essere #ollegata a massa #on resisten$a da 22 o'm mentre (iene #ontemporaneamente atti(ata la riga%

2ono pre(iste #inCue di(erse s#'ermate #'e (erranno (isuali$$ate in seCuen$a% &a li0reria TimerOne permette di utili$$are gli interrupt del timer,%

Vin#lude ETimerOne%'S AA non pu> essere atti(ala la seriale K per (ia del pin , #onst int #olumnPinsPQDF2:*:M:!:,H@ #onst int rowPinsPQD F,!:,-:,W:,+:,?:-:WH@ AA A, A2 A* AM A! - W Cuattro pin di norma analogi#i sono utili$$ati #ome digitali int s#'ermoPWQP!Q@ #onst int ritardoD2 @ #onst int s#'ermata PWQP!QDF F : : : : H:F : : : : H:F : : : : H:F : : : : H:F : : : : H: F : : : : H:F : : : : HH@ #onst int s#'ermata,PWQP!QDF F : : : : H:F : : : : H:F : : : : H:F : :,: : H:F : : : : H: F : : : : H:F : : : : HH@ #onst int s#'ermata2PWQP!QDF F : : : : H:F : : : : H:F :,:,:,: H:F :,: :,: H:F :,:,:,: H: F : : : : H:F : : : : HH@ #onst int s#'ermata*PWQP!QDF F : : : : H:F :,:,:,: H:F :,: :,: H:F :,: :,: H:F :,: :,: H: F :,:,:,: H:F : : : : HH@ #onst int s#'ermataMPWQP!QDF F,:,:,:,:,H:F,: : : :,H:F,: : : :,H:F,: : : :,H:F,: : : :,H: F,: : : :,H:F,:,:,:,:,HH@ int #olonnaD @ int #olonnaPre#D @

(oid setup78 F for7int iD @iEW@i448 pin)ode7rowPinsPiQ:OUTPUT8@ for7int iD @iE!@i448F pin)ode7#olumnPinsPiQ:OUTPUT8@ digital<rite7#olumnPinsPiQ:.IG.8@ H Timer,%initiali$e7M 8@ AA ogni M ms Timer,%atta#'Interrupt7(isCol8@ H (oid (isCol78F AA ri#'iamata ogni M ms dall"interupt del timer digital<rite7#olumnPinsP#olonnaPre#Q:.IG.8@ AA disatti(a la pre#edente #olonna for7int 6D @6EW@6448 digital<rite7rowPinsP6Q:s#'ermoP6QP#olonnaQ8@ AA in(io dati #olonna digital<rite7#olumnPinsP#olonnaQ:&O<8@ AA atti(a la #olonna #olonnaPre#D#olonna@ #olonnaD77#olonna4,8 T !8@ H

(oid loop78 F for7int XD @XEW@X448 for7int 6D @6E!@6448 s#'ermoPXQP6QDs#'ermata PXQP6Q@ dela17ritardo8@ AA 2 ms for7int XD @XEW@X448 for7int 6D @6E!@6448 s#'ermoPXQP6QDs#'ermata,PXQP6Q@ dela17ritardo8@ for7int XD @XEW@X448 for7int 6D @6E!@6448 s#'ermoPXQP6QDs#'ermata2PXQP6Q@ dela17ritardo8@ for7int XD @XEW@X448 for7int 6D @6E!@6448 s#'ermoPXQP6QDs#'ermata*PXQP6Q@ dela17ritardo8@ for7int XD @XEW@X448 for7int 6D @6E!@6448 s#'ermoPXQP6QDs#'ermataMPXQP6Q@ dela17ritardo8@ H

Impostare rapidamente i pin digitali


Pro0lema Gestire i pin digitali piL (elo#emente di Cuanto non permetta la fun$ione digital<rite% 2olu$ione &a fun$ione digital<rite #omoda da utili$$are ma per a(ere maggiore (elo#itB si possono impostare direttamente i 0it sui registri 'ardware #'e #ontrollano i pin digitali% Nello s6et#' seguente si utili$$a l"IO 'ardware diretto per in(iare un #odi#e )orse ad una radio A) sintoni$$ata su , )'$ % &a te#ni#a * (olte piL (elo#e della fun$ione digital<rite%

#onst int sendPinD2@ #onst 01te <P) D ,2@ #onst long repeatCount D ,2 A <P)@ #onst 01te dotD ,@ #onst 01te das' D *@ #onst 01te gap D *@ #onst 01te wordGap D W@ 01te letter D @ AAla lettera da in(iare #'ar Jarduino D R%; %;% ;%% %%; %% ;% ;;;R@ (oid setup78 F pin)ode7sendPin: OUTPUT8@ pin)ode7,*:OUTPUT8@ dela172 8@ H (oid loop78 F send)orse7arduino8@ dela172 8@ H

(oid send)orse7#'ar J string8 F letterD @ w'ile7stringPletterQKD 8 F if 7stringPletterQ DD "%"8 sendDot78@ else if7stringPletterQ DD ";"8 sendDas'78@ else if 7stringPletterQ DD " "8 sendGap78@ else if 7stringPletterQ DD 8 send<ordGap78@ letterDletter4,@ H H

(oid sendDot78 F digital<rite7,*:.IG.8@ transmitCarrier7dot J repeatCount8@ digital<rite7,*:&O<8@ sendGap78@ H (oid sendDas'78 F digital<rite7,*:.IG.8@ transmitCarrier7 das' J repeatCount8@ digital<rite7,*:&O<8@ sendGap78@ H (oid sendGap78 F transmitNoCarrier7gap J repeatCount8@ H

(oid send<ordGap78 F transmitNoCarrier7wordGap J repeatCount8@ H (oid transmitCarrier7long #ount8 F w'ile 7#ount;;8 F 0it2et7PORTD:sendPin8@ 0it2et7PORTD:sendPin8@ 0it2et7PORTD:sendPin8@ 0it2et7PORTD:sendPin8@ 0itClear7PORTD: sendPin8@ H H

(oid transmitNoCarrier7long #ount8 F w'ile7#ount;;8 F 0itClear7PORTD: sendPin8@ 0itClear7PORTD: sendPin8@ 0itClear7PORTD: sendPin8@ 0itClear7PORTD: sendPin8@ 0itClear7PORTD: sendPin8@ H H

Dis#ussione 0it2et e 0itClear non sono fun$ioni ma sono +acro di una sola istruzione in codice +acchina* I pin digitali da a W sono #ontrollati dal registro di nome PORTD mentre i pin da + a ,* si tro(ano sul registro PORT5% 2u Arduino a ,- )'$ una istru$ione (iene eseguita in -2%! nanose#ondi * Nello s6et#' #" una sola 0itClear #ontro M 0it2et per (ia del tempo ne#essario ad aggiornare e #ontrollare la (aria0ile #ount del #i#lo w'ile%

Utili$$are lo s'ield RTC


Pro0lema A(ere un orologio di sistema 2olu$ione Utili$$are un RTC7Real time #lo#68 s'ield #'e permette di a(ere un orario pre#iso solle(ando il mi#ro#ontrollore dall"onere di gestire l"orologio di sistema% &o s'ield (iene inserito in una struttura a sandwi#' #on sotto arduino e sopra un e(entuale altro s'ield% &a RTC s'ield dispone di una 0atteria tampone per mantenere l"orario an#'e sen$a alimenta$ione%

Vin#lude E<ire%'S AA la s#'eda utili$$a il 0us I2C Vin#lude RRTCli0%'] AA li0reria da aggiungere RTCND2,* W RTC@ (oid setup 78 F 2erial%0egin7?<ire%0egin78@ RTC%0egin78@ 8@

if 7KRTC%isrunning788 F 2erial%println7RRTC is not runningKR8@ AA la linea seguente setta RTC alla data e all"ora della #ompila$ione RTC%adXust7DateTime7NNDATENN: NNTI)ENN88@ :rea o$$etto di tipo H DataTi+e; varia&ili di siste+a< RTC%sCw7,8@ AA lampeggio del led ogni se#ondo H

(oid loop 78 F DateTime now D RTC%now78@ 2erial%print7now%1ear78: DEC8@ 2erial%print7"A"8@ 2erial%print7now%mont'78: DEC8@ 2erial%print7"A"8@ 2erial%print7now%da178: DEC8@ 2erial%print7" "8@ 2erial%print7now%'our78: DEC8@ 2erial%print7"9"8@ 2erial%print7now%minute78: DEC8@ 2erial%print7"9"8@ 2erial%print7now%se#ond78: DEC8@ 2erial%println78@ dela17, 8@

import pro#essing%serial%J@ 2erial m1Port@ AA T'e serial port (oid setup78 F si$e7- :, 8@ println72erial%list788@ AA &ist all t'e a(aila0le serial ports 0a#6ground7 8@ m1Port D new 2erial7t'is: 2erial%list78P2Q: ?- 8@ H (oid draw78 F dela17, 8@ 0a#6ground7 8@ AA nero w'ile 7m1Port%a(aila0le78 S 8 F 2tring in5uffer D m1Port%read2tring78@ if 7in5uffer KD null8 F fill72!!8@ teGt2i$e7! 8@ teGt7in5uffer: ,!: ! 8@ H H H