Arduino - II parte - roma1.infn.itnigro/materiale2/mat/6-arduino-2.pdf · Esercizio: una...

Post on 16-Sep-2018

225 views 0 download

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