Arduino - II parte - roma1.infn.itnigro/materiale2/mat/6-arduino-2.pdf · Esercizio: una...
Transcript of Arduino - II parte - roma1.infn.itnigro/materiale2/mat/6-arduino-2.pdf · Esercizio: una...
Arduino - II parte
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esercizio: simulazione di un semplice sistema di controllo
Un certo impianto viene acceso e spento manualmente tramite un interruttore.
Inoltre,passando da spento ad acceso si deve immaginare una fase di
riscaldamento iniziale.
Durante il funzionamento si puo’ poi verificare una qualche situazione anomala
(per esempio surriscaldamento) che deve provocare uno spegnimento
automatico.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esercizio: una simulazione (2)
Simuliamo lo stato spento o acceso con due LED:
• Led Verde acceso: impianto spento (in attesa);
• Led Rosso acceso: impianto acceso;
• Led Verde lampeggiante: fase di preriscaldamento;
• Led Rosso lampeggiante: fase di spegnimento per allarme.
(Simuliamo la situazione di allarme come un pulsante che viene premuto in
modo asincrono)
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esercizio: una simulazione (3)
Diagramma degli stati:
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Prima soluzione - Codice (1)
/∗ 4 p o s s i b i l i s t a t i 0=spento , 1= r iscaldamento , 2=acceso , 3=al la rme ∗ /i n t ledVerde = 8;i n t ledRosso = 9;i n t swi tchPin = 2;i n t swi tchVal = 0 ;v o l a t i l e i n t s t a t e = 0;vo id setup ( ) {
/ / put your setup code here , to run once :S e r i a l . begin (9600) ;pinMode ( ledVerde , OUTPUT) ;pinMode ( ledRosso , OUTPUT) ;pinMode (2 , INPUT_PULLUP ) ; / / p in d i accensione e spegnimentopinMode (3 , INPUT_PULLUP ) ; / / p in d i a l la rme ( i n t e r r u p t )a t t a c h I n t e r r u p t (1 , al larme , FALLING ) ;S e r i a l . p r i n t ( " Stato a t t u a l e " ) ;S e r i a l . p r i n t l n ( s t a t e ) ;}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Prima soluzione - Codice (2)
vo id loop ( ) {swi tchVal = d ig i t a lRead ( swi tchPin ) ;
swi tch ( s t a te ) {case 0: {
d i g i t a l W r i t e ( ledVerde , HIGH ) ;d i g i t a l W r i t e ( ledRosso , LOW) ;i f ( swi tchVal == 1) s ta te =1;
break ; }case 1: {
f l a s h ( ledVerde , 5 , 1000) ;s t a t e = 2;break ; }case 2: {
d i g i t a l W r i t e ( ledVerde , LOW) ;d i g i t a l W r i t e ( ledRosso , HIGH ) ;
i f ( swi tchVal == 0) s ta te =0;break ; }
case 3: {f l a s h ( ledRosso , 10 , 500) ;s t a t e = 0;break ;
}}
}Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Prima soluzione - Codice (3)
vo id a l la rme ( ){
S e r i a l . p r i n t ( " I n t e r r u p t : Stato a t t u a l e " ) ;S e r i a l . p r i n t l n ( s t a t e ) ;
s t a t e = 3;}vo id f l a s h ( i n t pin , i n t number , i n t leng ){
i n t i = 0 ;f o r ( i = 0 ; i < 5 ; i ++){
d i g i t a l W r i t e ( pin , HIGH ) ;delay ( leng ) ;d i g i t a l W r i t e ( pin , LOW) ;delay ( leng ) ;
}
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Commenti
Questa soluzione e’ sbagliata! Dove sta l’errore?
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Commenti
Questa soluzione e’ sbagliata! Dove sta l’errore?
In caso di allarme il sistema si spegne, ma poi legge il pin 2, lo trova HIGH e si
riaccende.
Possibili soluzioni:
• Introdurre un ulteriore stato (4) in cui si va dopo l’allarme e da cui si esce
solo con reset manuale;
• Accensione e spegnimento tramite pulsante (toggle) (tramite interrupt o in
altro modo).
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Diagramma modificato
Diagramma degli stati:
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Soluzione con interrupt - Codice (1)
/∗ 4 p o s s i b i l i s t a t i 0=spento , 1= r iscaldamento , 2=acceso , 3=al la rme ∗ /i n t ledVerde = 8;i n t ledRosso = 9;v o l a t i l e i n t s t a t e = 0;vo id setup ( ) {S e r i a l . begin (9600) ;pinMode ( ledVerde , OUTPUT) ;pinMode ( ledRosso , OUTPUT) ;pinMode (2 , INPUT_PULLUP ) ; / / p in d i accensione e spegnimentopinMode (3 , INPUT_PULLUP ) ; / / p in d i a l la rmea t t a c h I n t e r r u p t (0 , comando , FALLING ) ;a t t a c h I n t e r r u p t (1 , al larme , FALLING ) ;S e r i a l . p r i n t ( " Stato a t t u a l e " ) ;S e r i a l . p r i n t l n ( s t a t e ) ;}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Soluzione con interrupt - Codice (2)
vo id loop ( ) {/ / put your main code here , to run repeated ly :
swi tch ( s t a te ) {case 0: {
d i g i t a l W r i t e ( ledVerde , HIGH ) ;d i g i t a l W r i t e ( ledRosso , LOW) ;
break ; }case 1: {
f l a s h ( ledVerde , 5 , 1000) ;s t a t e = 2;break ; }case 2: {
d i g i t a l W r i t e ( ledVerde , LOW) ;d i g i t a l W r i t e ( ledRosso , HIGH ) ;
break ; }case 3: {
f l a s h ( ledRosso , 10 , 500) ;s t a t e = 0;break ;
}}
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Soluzione con interrupt - Codice (3)
vo id comando ( ){
i f ( s t a t e == 0) { s t a t e = 1 ; }e lse i f ( s t a t e == 2 ) { s t a t e = 0 ; }
}vo id a l la rme ( ){
s t a t e = 3;}vo id f l a s h ( i n t pin , i n t number , i n t leng ){
i n t i = 0 ;f o r ( i = 0 ; i < 5 ; i ++){
d i g i t a l W r i t e ( pin , HIGH ) ;delay ( leng ) ;d i g i t a l W r i t e ( pin , LOW) ;delay ( leng ) ;
}
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Timing
Ci sono varie funzioni legate al timing
• delay();
• delayMicroseconds();
• millis()
• micros()
Le funzioni millis() e micros() consentono di misurare intervalli di tempo
(per esempio per misurare la velocita’ di esecuzione di una istruzione)
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempio
i n t imax = 1000;f l o a t t e s t = 752.32;f l o a t t es t2 ;unsigned long i s t a r t ;unsigned long i s t o p ;unsigned long d i f f ;vo id setup ( ) {S e r i a l . begin (9600) ;S e r i a l . p r i n t l n ( " INIZIO " ) ;}vo id loop ( ) {S e r i a l . p r i n t ( " Time s t a r t stop d i f f " ) ;i s t a r t = micros ( ) ;f o r ( i n t i =0; i < imax ; i ++) { t es t2 = s q r t ( t e s t ) ; }i s t o p = micros ( ) ;d i f f = i s t o p − i s t a r t ;S e r i a l . p r i n t ( i s t a r t ) ;S e r i a l . p r i n t ( " " ) ;S e r i a l . p r i n t ( i s t o p ) ;S e r i a l . p r i n t ( " " ) ;S e r i a l . p r i n t l n ( d i f f ) ;delay (2000) ;}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Alcune cose da NON fare con Arduino
La scheda (e il µC) non sono completamente protetti contro errori che possono
danneggiare irreparabilmente l’hardware. Esempi:
• Mettere a massa un pin di I/O (quando usato come output);
• Mettere in corto tra loro due pin di I/O;
• Applicare sovratensioni ai pin di I/O;
• Applicare tensioni negative ai pin di I/O;
• Applicare tensioni ai pin 5 V o 3.3 V ;
• Mettere a massa il pin Vin;
• Superare la corrente massima dei pin di I/O (40 mA);
• Superare la corrente massima totale (200 mA);
• ...
• ...
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Operazioni logiche e operazioni sui bit
Operazioni logiche:
i f ( a == b && c == d ) / / AND LOGICO{
/ / . . . .}
i f ( x > 0 | | y > 0) / / OR LOGICO{
/ / . . .}
i f ( ! x ) / /NOT LOGICO{
/ / . . .}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Operazioni logiche e operazioni sui bit
Operazioni sui bit:
i n t a = 92;i n t b = 101;i n t c = a & b ; / / AND b i t per b i t de i due operandi
i n t a = 92;i n t b = 101;i n t c = a | b ; / / OR b i t per b i t de i due operandi
i n t a = 92;i n t b = 101;i n t c = a ^ b ; / / XOR b i t per b i t de i due operandi
i n t a = 103;i n t b = ~a ; / / NOT b i t per b i t
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Spostamenti di bit
i n t a = 5; / /i n t b = a << 3; / / spostamento a s i n i s t r a d i 3 p o s t i
i n t a = 5; / /i n t c = a >> 4; / / spostamento a dest ra d i 4 p o s t i
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
I canali di Input/Output
I canali di I/O del µC sono organizzati in gruppi di 8 (tecnicamente ports):
PORTB, PORTC, PORTD
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Ports
Ordinamento:
Bit PORTB PORTC PORT D
0 D I/O 8 A 0 D I/O 0
1 D I/O 9 A 1 D I/O 1
2 D I/O 10 A 2 D I/O 2
3 D I/O 11 A 3 D I/O 3
4 D I/O 12 A 4 D I/O 4
5 D I/O 13 A 5 D I/O 5
6 (crystal) (reset) D I/O 6
7 (crystal) / D I/O 7
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Ports
Ad ogni port sono associati 3 registri da 8 bit
PORT REGISTER
B
DDRB Data Direction Register Read/Write
PORTB Data Register Read/Write
PINB Input Pin Register Read only
C
DDRC Data Direction Register Read/Write
PORTC Data Register Read/Write
PINC Input Pin Register Read only
D
DDRB Data Direction Register Read/Write
PORTD Data Register Read/Write
PIND Input Pin Register Read only
Il programma puo’ accedere e manipolare direttamente questi registri.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi:
DDRD = B11110000 ; / / De f in i sce i p in 0 ,1 ,2 ,3 come i npu t/ / e i p in 4 ,5 ,6 ,7 come output
DDRD = DDRD | B11111100 ; / / De f in i sce i p in 2 ,3 ,4 ,5 ,6 ,7 come output/ / senza a l t e r a r e i p in 0 ,1
DDRD = DDRD & B00000011 ; / / De f in i sce i p in 2 ,3 ,4 ,5 ,6 ,7 come i npu t/ / senza a l t e r a r e i p in 0 ,1
PORTD = B10101000 ; / / sets d i g i t a l p ins 7 ,5 ,3 HIGH
byte A;A = PIND ; / / Legge i n A g l i 8 p in d i Inpu t 0 − 7;
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Vantaggi
L’uso diretto dei registri consente di fare in modo molto piu’ veloce le
manipolazioni dei canali di I/O.Esempio:
vo id setup ( ){
i n t p in ;f o r ( p in =0; p in <= 7; ++p in ) {
pinMode ( pin , OUTPUT) ;}
}
Richiede un grandissimo numero di cicli di clock (e molta memoria). Lo stessorisultato puo’ essere ottenuto con una sola istruzione:
PORTD = B11111111 ; / /
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Altro esempio
Generare onde rettangolari alla massima frequenza possibile:Esempio:
vo id setup ( ){
DDRD = B11111111 ; / / se t PORTD ( d i g i t a l 7~0) to outputs}
vo id loop ( ){
PORTD = B11111111 ;PORTD = B00000000 ;
}
Notare che non si ottiene un’onda quadra, perche’ il µC impiega del tempo extra
per tornare all’inizio del loop.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Cautele
Bisogna fare attenzione a non toccare bit che possono svolgere altre funzioni!
Per esempio, i pin digitali 0 e 1 sono usati dalla comunicazione seriale.
Il pin PC6 e’ utilizzato per il Reset (active LOW).
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Interfacciamento del DAC MCP4922
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
L’integrato MCP4922
• 2 DAC indipendenti a 12 bit (DAC A
e DAC B).
• Interfaccia SPI
• Singola alimentazione (2.7 ÷ 5.5 V )
• Fondo scala di VOUT selezionabile
(VREF oppure 2 × VREF )
• Uscite sincronizzabili (tramite
LDAC)
• Le uscite possono essere messe in
alta impedenza (tramite SHDN) e il
consumo ridotto al minimo
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Schema funzionale
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
String DAC
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Caratteristiche generali
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Significato dei pin
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Interfaccia SPI
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Interfaccia SPI: timing
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Interfacciamento con Arduino
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Un semplice programma
/ / Legge 2 i n t e r i da conso l le e s c r i v e su i DAC
# inc lude <SPI . h>
const i n t s laveSe lec tP in = 10;
i n t datoA = 0;
i n t datoB = 0;
boolean datoAReady = f a l s e ;
boolean datoBReady = f a l s e ;
vo id setup ( ) {
S e r i a l . begin (9600) ;
pinMode ( s laveSelec tP in , OUTPUT) ;
d i g i t a l W r i t e ( s laveSelec tP in , HIGH ) ;
SPI . begin ( ) ;
SPI . setDataMode (SPI_MODE0 ) ;
SPI . se tB i tOrder (MSBFIRST ) ;
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Un semplice programma
vo id loop ( ) {
S e r i a l . p r i n t l n ( " I n s e r i s c i i l primo dato (0 − 4 0 9 5 ) : " ) ;
wh i le ( ! datoAReady ) {
i f ( S e r i a l . a v a i l a b l e ( ) > 0 ) {
datoA = S e r i a l . pa rse In t ( ) ;
datoAReady = t rue ; } }
S e r i a l . p r i n t l n ( " I n s e r i s c i i l secondo dato (0 − 4 0 9 5 ) : " ) ;
wh i le ( ! datoBReady ) {
i f ( S e r i a l . a v a i l a b l e ( ) > 0)
datoB = S e r i a l . pa rse In t ( ) ;
datoBReady = t rue ; } }
writeDAC ( datoA , 0 ) ; / / s c r i v e su i DAC A
writeDAC ( datoB , 1 ) ; / / s c r i v e su i DAC B
datoAReady= f a l s e ;
datoBReady = f a l s e ;
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Un semplice programma
vo id writeDAC ( i n t dato , i n t dac ) {
/ / Scr ive su l DAC dac (0 o 1) i l dato
/ / Prende solo i 12 b i t meno s i g n i f i c a t i v i d i dato
/ / con f i g per i l DAC A (SHDN=1 ,GAIN = 1 , UNBUFFERED)
byte conf = B00110000 ;
byte mask = B00001111 ;
byte low = lowByte ( dato ) ;
byte high = highByte ( dato ) ;
h igh = high & mask ; / / maschera i 4 b i t piu ’ s i g n i f i c a t i v i
h igh = high | conf ; / / c i mette i b i t d i con f igu raz ione
i f ( dac == 1) b i t S e t ( high , 7 ) ; / / mette a 1 i l b i t 7 se vogliamo
/ / S e r i a l . p r i n t ( high , BIN ) ;
/ / S e r i a l . p r i n t ( " " ) ;
/ / S e r i a l . p r i n t l n ( low , BIN ) ;
d i g i t a l W r i t e ( s laveSelec tP in ,LOW) ;
SPI . t r a n s f e r ( high ) ;
SPI . t r a n s f e r ( low ) ;
d i g i t a l W r i t e ( s laveSelec tP in , HIGH ) ;
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Timing
/ / Programma per osservare a l l ’ o s c i l l o g r a f o i l d ia logo SPI
# inc lude <SPI . h>
i n t dato = 0;
i n t dac = 0;
boolean datoReady = f a l s e ;
const i n t s laveSe lec tP in = 10;
vo id setup ( ) {
S e r i a l . begin (9600) ;
pinMode ( s laveSelec tP in , OUTPUT) ;
d i g i t a l W r i t e ( s laveSelec tP in , HIGH ) ;
SPI . begin ( ) ;
SPI . setDataMode (SPI_MODE0 ) ;
SPI . se tB i tOrder (MSBFIRST ) ;
SPI . se tC lockD iv ide r (SPI_CLOCK_DIV2 ) ;
S e r i a l . p r i n t l n ( " I n s e r i s c i i l dato (0 − 4 0 9 5 ) : " ) ;
wh i le ( ! datoReady ) {
i f ( S e r i a l . a v a i l a b l e ( ) > 0 ) {
dato = S e r i a l . pa rse In t ( ) ;
datoReady = t rue ; } }
}Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Timing
vo id loop ( ) {
writeDAC ( dato , dac ) ;
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Timing
vo id writeDAC ( i n t dato , i n t dac ) {
/ / Scr ive su l DAC dac (0 o 1) i l dato
/ / Prende solo i 12 b i t meno s i g n i f i c a t i v i d i dato
/ / con f i g per i l DAC A (SHDN=1 ,GAIN = 1 , UNBUFFERED)
byte conf = B00110000 ;
byte mask = B00001111 ;
byte low = lowByte ( dato ) ;
byte high = highByte ( dato ) ;
h igh = high & mask ; / / maschera i 4 b i t piu ’ s i g n i f i c a t i v i
h igh = high | conf ; / / c i mette i b i t d i con f igu raz ione
i f ( dac == 1) b i t S e t ( high , 7 ) ; / / mette a 1 i l b i t 7 se vogliamo
/ / S e r i a l . p r i n t ( high , BIN ) ;
/ / S e r i a l . p r i n t ( " " ) ;
/ / S e r i a l . p r i n t l n ( low , BIN ) ;
d i g i t a l W r i t e ( s laveSelec tP in ,LOW) ;
SPI . t r a n s f e r ( high ) ;
SPI . t r a n s f e r ( low ) ;
d i g i t a l W r i t e ( s laveSelec tP in , HIGH ) ;
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Interfacciamento dello schermo LCD
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
TFT LCD
Utilizzeremo un piccolo schermo LCD a colori (160x128 pixels), che verra’
connesso ad Arduino Uno. La scheda contiene anche una slot per Memory Card
SD (tipo micro).
La comunicazione con queste 2 periferiche avviene tramite il protocollo SPI
(Serial Peripheral Interface).
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
TFT: Schema logico delle connessioni
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
TFT LCD: Connessioni
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Coordinate grafiche
Tutte le applicazioni grafiche utilizzano questa sistema di riferimento:
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
TFT LCD: programmazione
Per utilizzare lo schermo occorre includere nello sketch le librerie SPI e TFT e
definire alcuni pin (gli altri sono di default).Lo schermo va poi inizializzato.
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino LCD l i b r a r y
# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ; / / Crea una is tanza d i TFTvoid setup ( ) {
/ / i n i t i a l i z e the screenscreen . begin ( ) ;
}
vo id loop ( ) {
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Colore
Il colore e’ sempre definito utilizzando il modello RGB.
Il colore di fondo dello schermo viene definito con la funzione
screen.background(red,green,blue)
red : int 0-255
green : int 0-255
blue : int 0-255
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino LCD l i b r a r y# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ; / / Crea una is tanza d i TFTvoid setup ( ) {
screen . begin ( ) ; / / i n i t i a l i z e the screenscreen . background (255 ,255 ,255) ; / / background whi te
}vo id loop ( ) {}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Il modello RGB dei colori
il modello RGB è di tipo additivo e si basa su
tre colori primari: rosso (Red), verde (Green) e
blu (Blue) (da non confondere con i colori primari
sottrattivi giallo, ciano e magenta).
Unendo i tre colori con la loro intensità massima
si ottiene il bianco. La combinazione delle coppie
di colori dà il ciano, il magenta e il giallo.
La scelta dei colori primari è correlata alla fisiologia dell’occhio umano;sono
stimoli che massimizzano la differenza tra le risposte delle cellule cono della
retina (ce ne sono di 3 tipi) alle differenze di lunghezza d’onda della luce.
Notare che non tutti i colori visibili possono essere riprodotti con la miscelazione
RGB.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Colore (2)
Per ogni oggetto grafico si distingue il colore del contorno e il colore del
riempimento.
Il colore del contorno e’ definito con la funzione
screen.stroke(red,green,blue)
red : int 0-255
green : int 0-255
blue : int 0-255
Il colore del riempimento con la funzione
screen.fill(red,green,blue)
red : int 0-255
green : int 0-255
blue : int 0-255
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Colore (3)
Se non si vuole il contorno, lo si puo’ escludere con la funzione
screen.nostroke( )
invece se non si vuole il riempimento con la funzione
screen.nofill()
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Forme
screen . po i n t ( x , y ) ; / / disegna un punto (1 p i x e l )/ / i n pos iz ione x , y
screen . l i n e ( xS , yS , xE , yE ) ; / / disegna una l i n e a/ / da ( xS , yS ) a ( xE , yE )
screen . r e c t ( xS , yS , w, h ) / / disegna un r e t t a n g o l o d i/ / larghezza w e a l tezza h/ / xS , yS sono l e coord ina te/ / d e l l o sp igo lo super io re s i n i s t r o
screen . c i r c l e (xC , yC , r ) ; / / disegna un cerch io d i ragg io r/ / con cent ro i n xC , yC
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Altre funzioni
i n t screen . width ( ) ; / / r e s t i t u i s c e l a larghezza/ / d e l l o schermo
i n t screen . he igh t ( ) ; / / r e s t i t u i s c e l ’ a l t ezza/ / d e l l o schermo
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi (1): rettangolo
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino TFT l i b r a r y# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ;
vo id setup ( ) {
screen . begin ( ) ; / / i n i z i a l i z z a l o schermo
screen . background ( 0 , 0 , 0 ) ; / / background nero
screen . s t roke (255 ,255 ,255) ; / / bordo bianco
screen . f i l l ( 255 ,0 ,0 ) ; / / r iempimento rosso
/ / draw un r e t t a n g o l o a l cent roscreen . l i n e ( screen . width () /2 −5 , screen . he igh t () /2 −5 , 10 , 10 ) ;
}vo id loop ( ) { }
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi (2): testo
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino TFT l i b r a r y# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ;
vo id setup ( ) {
screen . begin ( ) ;
screen . background ( 0 , 0 , 0 ) ; / / background nero
screen . s t roke (255 ,255 ,255) ; / / t e s to bianco
screen . setTextS ize ( 2 ) ; / / t e s to da 20 p i x e l s
screen . t e x t ( " Buongiorno " , 5 , 5 ) ;}
vo id loop ( ) {
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi (3): linee
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino TFT l i b r a r y# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ;
vo id setup ( ) {screen . begin ( ) ;
screen . background ( 0 , 0 , 0 ) ;
screen . s t roke (255 ,255 ,255) ;
screen . l i n e (0 , 0 , 160 , 128) ; / / d iagonale biancascreen . s t roke (0 ,255 ,0 ) ;screen . l i n e (0 , 128 , 160 , 0 ) ; / / d iagonale verde
}
vo id loop ( ) {/ / put your main code here , to run repeated ly :
}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Persistenza
Si noti che l’immagine persiste indefinitamente sullo schermo.
Esempio:
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino TFT l i b r a r y# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ;vo id setup ( ) {
screen . begin ( ) ;screen . background ( 0 , 0 , 0 ) ;screen . s t roke (255 ,255 ,255) ;screen . setTextS ize ( 2 ) ; / / t e s to da 20 p i x e l sscreen . t e x t ( " Buongiorno " , 5 , 5 ) ; / / S c r i t t a n . 1delay (10000) ;screen . t e x t ( "15 maggio 2014" , 5 , 5 ) ; / / S c r i t t a n . 2
}vo id loop ( ) { }
Le due scritte si sovrappongono malamente!
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Persistenza
Perciò, se si vuole aggiornare un’immagine occorre cancellare la precedente:
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino TFT l i b r a r y# de f ine cs 10# de f ine dc 9# de f ine r s t 8TFT screen = TFT( cs , dc , r s t ) ;vo id setup ( ) {screen . begin ( ) ;screen . background ( 0 , 0 , 0 ) ;screen . s t roke (255 ,255 ,255) ;screen . setTextS ize ( 2 ) ;screen . t e x t ( " Buongiorno " , 5 , 5 ) ; / / S c r i t t a n . 1delay (10000) ;screen . s t roke ( 0 , 0 , 0 ) ; / / Colore de l backgroundscreen . t e x t ( " Buongiorno " , 5 , 5 ) ; / / Cancel la s c r i t t a n . 1screen . s t roke (255 ,255 ,255) ; / / R i p r i s t i n a i l co lo re d e l l o s t rokescreen . t e x t ( "15 maggio 2014" , 5 , 5 ) ; / / S c r i t t a n . 2}vo id loop ( ) { }
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Persistenza
Un bravo programmatore puo’ fare di meglio usando le funzioni:
. . .
. . .TFT screen = TFT( cs , dc , r s t ) ;i n t background [ ] = {0 , 0 , 0 } ;i n t foreground [ ] = {255 , 255 , 255 } ;vo id setup ( ) {screen . begin ( ) ;screen . background ( background [ 0 ] , background [ 1 ] , background [ 2 ] ) ;screen . s t roke (255 ,255 ,255) ;screen . setTextS ize ( 2 ) ;w r i t eTex t ( foreground [ 0 ] , foreground [ 1 ] , foreground [ 2 ] , 5 , 5 , " Buongiorno " , 2 ) ;delay (10000) ;w r i t eTex t ( background [ 0 ] , background [ 1 ] , background [ 2 ] , 5 , 5 , " Buongiorno " , 2 ) ;w r i t eTex t ( foreground [ 0 ] , foreground [ 1 ] , foreground [2 ] , 5 , 5 , " 14 maggio 2014" ,2 ) ;}vo id loop ( ) { }vo id wr i t eTex t ( i n t r , i n t g i n t b , i n t x , i n t y , char t e x t [ ] , i n t s i ze ){screen . s t roke ( r , g , b ) ;screen . setTextS ize ( s ize ) ;screen . t e x t ( t ex t , x , y ) ;}
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi (4): sinusoide calcolata
# inc lude <SPI . h># inc lude <TFT . h> / / Arduino TFT l i b r a r y
# de f ine cs 10# de f ine dc 9# de f ine r s t 8
TFT screen = TFT( cs , dc , r s t ) ;double xmin = 0 . ;double xmax = 8∗3.14159;double pax = 0 . ;double x ;double y ;i n t i x , i y ;i n t imin = 0;i n t imax = 160;
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi (4): sinusoide calcolata
vo id setup ( ) {screen . begin ( ) ;screen . background ( 0 , 0 , 0 ) ;screen . s t roke (255 ,255 ,255) ;S e r i a l . begin (9600) ;pax = (xmax−xmin ) / imax ;
f o r ( i n t i =0; i < imax ; i ++){
x = xmin + pax∗ ( i −1);y = s in ( x ) ;i x = i n t ( x ∗6 .37 ) ;i y = i n t ( y ∗30. )+64;S e r i a l . p r i n t ( i x ) ;S e r i a l . p r i n t ( " " ) ;S e r i a l . p r i n t l n ( i y ) ;screen . f i l l (255 ,255 ,255) ;screen . po i n t ( i x , i y ) ;screen . po i n t ( i x , i y +1 ) ; / / l i n e a a l t a 2 p i x e l s
}
}vo id loop ( ) { }
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempi(4): Sinusoide calcolata
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Esempio: Grafico in tempo reale
Si vuole costruire sullo schermo LCD (160 x 128 pixels) un grafico dove si riporta
l’andamento di una grandezza ( per esempio la temperatura ◦C) misurata ad
intervalli regolari di tempo, δt .
Supponendo quindi di dedicare un punto di un pixel ad ogni misura avremo sul
grafico il valore delle ultime 160 misure. Il grafico si deve aggiornare ad ogni δt
eliminando la misura piu’ vecchia e aggiungendo (a destra) l’ultima misura.
Si noti che un’immagine disegnata sul LCD e’ persistente, quindi ad ogni
aggiornamento l’immagine vecchia va cancellata e sostituita da quella nuova.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Grafico in tempo reale
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Grafico in tempo reale
Come si affronta questo problema?
E’ chiaro che dovremo avere una array con 160 posizioni dove memorizzare man
mano le misure e riportare sul grafico i 160 punti corrispondenti.
Che succede quando avremo memorizzato le prime 160 misure?
Questa struttura si chiama tecnicamente una coda ovvero una struttura FIFO
(First In First Out).
L’idea piu’ ovvia e’ quella di traslare via via a sinistra i dati per liberare l’ultimo
posto a destra.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Grafico in tempo reale
Come si affronta questo problema?
E’ chiaro che dovremo avere una array con 160 posizioni dove memorizzare man
mano le misure e riportare sul grafico i 160 punti corrispondenti.
Che succede quando avremo memorizzato le prime 160 misure?
Questa struttura si chiama tecnicamente una coda ovvero una struttura FIFO
(First In First Out).
L’idea piu’ ovvia e’ quella di traslare via via a sinistra i dati per liberare l’ultimo
posto a destra.
Ma questo richiede un enorme spreco di tempo!
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Grafico in tempo reale
Bisogna invece pensare all’array come ad una struttura circolare:
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Grafico in tempo reale
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Applicazioni
• Didattica;
• Giochi;
• Sistemi di controllo e gestione;
• Robotica e domotica.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Controllo remoto di Arduino
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Controllo remoto di Arduino
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Arduino come programmatore ISP
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro
Conclusioni
• Arduino e’ un ottimo strumento didattico perche’ ci aiuta a comprendere e
risolvere sistemi elettronici complessi;
• In rete si trovano miriadi di applicazioni piu’ o meno futili;
• Puo’ essere un strumento di sviluppo di applicazioni serie.
Laboratorio di Segnali e Sistemi II - Arduino-II parte A.Nigro