1. Programmazione Arduino e interfacciamento a
moduli esterni
Lezione 3
CSP@SCUOLA
in collaborazione
con ITI FAUSER NOVARA
Anno scolastico 2011-2012
2. Introduzione
• Questa lezione si propone di fornire informazioni integrative per lo
sviluppo su Arduino e di fornire concetti di base per:
– Interfacciamento di Arduino a moduli di espansione
– Sviluppo di applicazioni basate su di essi
• Attraverso questi moduli e’ possibile realizzare payload funzionali
complessi, da installare a bordo di un micro UAV
• I moduli di espansione sono detti “shield”
– Daughter board che si installano sugli header della scheda
Arduino
– Alimentati direttamente da Arduino
– Interfacciamento solitamente tramite pin/porta seriale
• In questa lezione verranno presentati alcuni shield di esempio:
– SD card shield
– GPS shield
– Communicator shield
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 2
3. Considerazioni sullo sviluppo su
piattaforma Arduino (1/4)
• Come già detto un programma generico per Arduino si suddivide in
due sezioni
– Setup => inizializzazione, singola esecuzione
– Loop => vero programma eseguito ciclicamente da Arduino
• Il loop è eseguito a ciclo continuo
– Qualcosa come
While(1)
{
loop()
}
– Cercate di evitare l’uso di cicli “globali” dentro la funzione loop
se non strettamente necessari
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 3
4. Considerazioni sullo sviluppo su
piattaforma Arduino (2/4)
• All’interno di ogni programma Arduino è possibile definire e richiamare
delle funzioni, esattamente come avviene nel linguaggi o C
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 4
5. Considerazioni sullo sviluppo su
piattaforma Arduino (3/4)
• E’ possibile sviluppare la stessa applicazione su più file pde
– Non è necessaria nessuna inclusione esplicita
– Devono essere dentro la medesima cartella
– Il file principale implementa la funzione loop
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 5
6. Considerazioni sullo sviluppo su
piattaforma Arduino (4/4)
• E’ possibile inoltre creare delle librerie
– Collezioni di funzioni che possono essere utili a più programmi
• Ad esempio librerie per gestire una interfaccia ethernet
ecc
• Qualsiasi applicativo può utilizzare le funzioni di una libreria
includendone l’header
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 6
7. Programmazione Arduino: approfondimenti utili
• Programmazione a stati finiti (raccomandato):
– http://zuccala.blogspot.com/2010/02/arduino-e-
programmare-stati-finiti.html
• Programmazione multitasking (raccomandato):
– L’Arduino deve gestire in maniera temporizzata l’acquisizione
dati da sensori diversi
– Qui riferimenti utili:
• http://zuccala.blogspot.com/2010/01/multitasking-
arduino-millis-parte-1.html
• http://zuccala.blogspot.com/2010/02/multitasking-
arduino-millis-parte-2.html
• Serializzazione (invio di strutture dati complesse tramite porta
seriale)
– Libreria: http://code.google.com/p/simpleserialization/
• Esempio di calcolo di un codice a ridondanza ciclica per garantire
l’integrità dei dati (da aggiungere prima di una trasmissione seriale
o di rete):
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1246539386
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 7
8. Arduino SD shield
• Interfacciamento di scheda Arduino a modulo SD
• Obiettivi:
– Interfacciamento a dispositivo di massa capace di memorizzare
dati acquisiti da sensori o eventi di sistema in maniera
persistente
– Accesso in lettura di dati memorizzati su un dispositivo SD con
file system standard
• Interfaccia seriale sincrona tra modulo Arduino e SD shield
• Istruzioni dettagliate su utilizzo e installazione disponibili qui:
http://www.cooking-
hacks.com/index.php/documentation/tutorials/arduino-micro-sd
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 8
9. Interfaccia seriale sincrona
• Serial Peripheral Interface (SPI)
– Comunicazione tra microcontrollore e periferica
– Comunicazione tra microcontrollori
• Dispositivo master=microcontrollore, dispositivo slave=periferica
• La comunicazione avviene attraverso 3 linee:
– Master In Slave Out (MISO), linea usata dal dispositivo slave per comunicare con il master
– Master Out Slave In (MOSI), linea usata dal dispositivo master per comunicare con lo slave
– Segnale di clock seriale (CLK), impulso che sincronizza la trasmissione dati generato dal master
• Ogni periferica seriale sincrona ha un pin di selezione che la abilita
– Slave Selector (SS)
• L’ambiente di sviluppo Arduino fornisce una libreria per la gestione a basso livello della SPI
– http://arduino.cc/en/Reference/SPI
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 9
10. Interfaccia seriale sincrona: connessioni (1/2)
1
SCK 5V
MISO MOSI
RESET GND
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 10
11. Interfaccia seriale sincrona: connessioni (2/2)
• I pin ISP sono riportati su altri pin dell’header
– In questo modo è possibile installare sull’arduino più shield che
non potrebbero combinarsi meccanicamente fra loro altrimenti
– La porta resta comunque unica
• Arduino Uno/diecimila/duemilanove
– SS => 10 (abilita l’uso dell’Arduino come slave)
– MOSI => 11
– MISO => 12
– SCK => 13
• Arduino Mega
– SS => 53 (abilita l’uso dell’Arduino come slave)
– MOSI => 51
– MISO => 50
– SCK => 52
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 11
12. Arduino SD shield: libreria
• L’ambiente di sviluppo Arduino fornisce una libreria per la gestione
di una scheda SD formattata con il file system FAT16 o FAT32 e
supporta anche SDHC
• Libreria SD
– Metodi di gestione begin, read, write print, close, available...
– Documentazione qui:
• http://arduino.cc/en/Reference/SD
• NOTA: il processore Atmega dell’Arduino possiede un pin SS per
essere utilizzato come slave. Anche se nell’interazione con lo shield
SD l’Arduino ha il ruolo di master, il pin SS dell’Atmega deve
essere comunque inizializzato a pin digitale di output
– Arduino Mega => pinmode(53, OUTPUT);
– Arduino => pinmode(10, OUTPUT);
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 12
13. Arduino SD shield: esempio
• Esempio di programma:
Il pin SS dell’SD shield
deve essere connesso
al pin digitale 53
dell’Arduino Mega
Creazione o apertura del file “test4.txt”
sul file system della scheda SD
Scrittura del file sulla scheda SD.
L’invocazione alla close finalizza la
scrittura
Finchè ci sono dati sulla scheda SD
(available) verranno inviati al PC tramite
la porta seriale
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 13
14. Modulo GPS per Arduino
• Modulo GPS prodotto da Libelium
• Le stringhe NMEA sono disponibili su interfaccia seriale
– Default baud rate 4800 baud
• Basato su Vincotech A1080-b
– Il modulo adatta i livelli elettrici del ricevitore Vincotech alla
seriale Arduino
– 1 aggiornamento al secondo
• Alimentazione da scheda Arduino mediante cavetti
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 14
15. Modulo GPS per Arduino: esempio d’uso
Interfaccia seriale 3
Alimentazione (5V)
• Informazioni dettagliate sul modulo disponibili qui:
http://www.cooking-hacks.com/index.php/gps-module-for-arduino.html
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 15
16. Modulo Vincotech A1080-b (1/2)
• Supporta la maggior parte delle stringhe NMEA di uso comune:
– GGA, GSA, VTG, RMC, GSV e GLL
• Mette a disposizione un protocollo di configurazione basato su
messaggi inviati tramite la porta seriale a cui è collegato
– Permette di cambiare baud rate, richiedere specifiche stringhe
NMEA ecc
• L’Arduino tramite la seriale invia opportuni comandi di
configurazione e ottiene risposte dal modulo
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 16
17. Vincotech A1080-b (2/2)
• Questi messaggi servono a modificare il comportamento base
– Di default il modulo si avvia con un buad rate 4800 e invia una
volta al secondo le più comuni stringhe NMEA
• Esempi di messaggi di riconfigurazione del modulo GPS:
– $PSRF100,0,9600,8,1,0*0C
• Imposta il baud rate a 9600
• 8N1 (8 bit di dato, no bit di parità, 1 bit di stop)
– $PSRF101,0,0,0,0,0,0,12,4*10
• Reset del modulo GPS
– $PSRF103,0,1,0,1,*25
• Esegue la query di una stringa GGA
• A seconda dei parametri il PSRF103 permette di effettuare
la query di una qualsiasi stringa NMEA o di impostare il
rate per l’invio automatico
• Ulteriori informazioni disponibili qui:
http://www.cooking-
hacks.com/skin/frontend/default/cooking/pdf/GPS_Firmware_GSC3
_3.5.0_V4.2.pdf
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 17
18. Modulo GPS: gestione avanzata dei dati
• Il GPS può essere gestito come un qualsiasi dispositivo seriale
• Tuttavia essendo un componente “standard” esistono librerie per
semplificarne l’utilizzo
• Libreria TinyGPS
– http://arduiniana.org/libraries/tinygps/
• Semplifica la gestione delle stringhe NMEA nelle applicazioni
– Modulo di parsing completo per le stringhe NMEA più comuni
– Verifica automaticamente se il fix di posizione è valido
– Esegue automaticamente la verifica dell’integrità della stringa
– Fornisce delle funzioni per ottenere direttamente dalle stringhe
le informazioni di posizione, velocità ecc
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 18
19. TinyGPS: esempio di utilizzo
1) Includere la libreria
2) Istanziare l’oggetto GPS
Il metodo encode analizza Nell’esempio il modulo GPS
byte per byte i dati è connesso alla seriale 1. I
ricevuti e se riconosce una dati letti saranno inviati
stringa NMEA valida sulla seriale 0
ritorna un valore>0
Per debug tutto quanto
viene ricevuto è comunque
inviato sulla seriale 0
Il metodo get_position
attinge ai dati memorizzati
dalla funzione encode per
ottenere le informazioni
richieste
• Per ulteriori informazioni sugli altri metodi della libreria si faccia
riferimento a http://arduiniana.org/libraries/tinygps/
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 19
20. Communication shield
• Progettato originariamente per connettere un modulo Zigbee a una
scheda Arduino, è stato successivamente per connettere vari altri
moduli
• Fornisce una interfaccia completa, garantendo la corretta
alimentazione del modulo installato
• http://arduino.cc/it/Main/ArduinoXbeeShield
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 20
21. Communicator shield: principali moduli supportati
Modulo wifi: consente l’interfacciamento con una rete IEEE 802.11
Modulo RFID permette di utilizzare l’Arduino come modulo RFID per
rilevare il passaggio in prossimità di ricevitori RFID
Modulo Bluetooth
Modulo Xbee: permette l’interfacciamento a una rete Zigbee (IEEE
802.15.4). Sarà oggetto della prossima lezione
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 21
22. Communicator shield: considerazioni
• Il dispositivo installato nello shield comunica con la scheda Arduino
attraverso l’interfaccia seriale 0
– La porta seriale 0 è accessibile:
• Attraverso i pin in alto a sinistra nell’header dell’Arduino base
– (a cui si connette lo shield)
• Tramite la porta USB
• La porta seriale 0 è la stessa usata per programmare il dispositivo
• Se la seriale è usata dal dispositivo montato sul modulo, la scheda
Arduino non può essere riprogrammata attraverso la porta USB,
poichè questa è la seriale 0
• Per ovviare al problema sullo shield sono presenti due jumper:
– Jumper entrambi in posizione “USB”=> la porta seriale 0 può
essere usata per la programmazione dell’Arduino
– Jumper entrambi in posizione “xbee” => la porta seriale 0 è
connessa al dispositivo montato sullo shield e non può esssere
usata per la programmazione
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 22
23. Interfacciamento di più shield a una scheda Arduino
• Esempio:
• Shield SD => pin 50,51,52,53 (rilancio ICSP)
• Shield GPS => Seriale 3
Lezione 3: programmazione Arduino e interfacciamento a moduli esterni 23
24. www.csp.it rd.csp.it
CSP ICT Innovation
Livio Torrero livio.torrero@csp.it
Registered and Central Offices
Environment Park - Laboratori A1
via Livorno 60 - 10144 Torino
Tel +39 011 4815111
Fax +39 011 4815001
E-mail: marketing@csp.it
Lezione 3: piattaforma Arduino 24