ARDUINO Duemilanove Lelio Spadoni
Argomenti trattati Caratteristiche di Arduino Duemilanove (hardware e software) Programmazione di Arduino Arduino + GPS Ethernet shield XBee shield Arduino + GSM Arduino + Bluetooth
Arduino Principali caratteristiche 14 ingressi/uscite digitali di cui: 6 utilizzabili come uscite di tipo PWM; 4 utilizzabili per comunicazione SPI; 2 utilizzabili per comunicazione I 2 C; 2 utilizzabili per i collegamenti seriali TTL level; 2 utilizzabili per interrupt esterno; 6 ingressi analogici (risoluzione 10 bits) memoria SRAM 2KB; memoria FLASH 32KB di cui 2 utilizzati per il bootloader; memoria EEPROM 1KB microcontrollore ATMEGA328 a 16 MHz
Arduino Principali caratteristiche Il microcontrollore è fornito con un bootloader, che è un software che permette il caricamento dei programmi in memoria senza l ausilio di programmatori esterni (occupa 2 KB di memoria flash). Il bootloader si mette in ascolto di comandi o dati in arrivo dal computer (che generalmente sono i programmi scritti dall utente) e li carica nella memoria flash del microcontrollore; dopodiché viene lanciato il programma in memoria. Se non ci sono programmi in arrivo dal computer viene lanciato l ultimo sketch* caricato. Se invece, il microcontrollore è vuoto viene lanciato in continuazione il bootloader. *programma scritto dall utente
Arduino IDE Il software per la programmazione di tutti i tipi di schede Arduino, si chiama semplicemente Arduino. Ne esistono diverse versioni sia per Windows (quella testata in questo lavoro), sia per Linux sia per Mac. La versione utilizzata per le successive prove è la 0018.
Arduino Programmazione Uno sketch si compone di due funzioni principali che non accettano nessun parametro e non restituiscono alcun valore: - void setup(), tutte le istruzioni contenute all interno di questa funzione vengono eseguite una sola volta al lancio dello sketch da parte del microcontrollore; - void loop(), tutte le istruzioni contenute in questa funzione sono eseguite in continuazione. E sempre possibile inserire parti di programma all interno di altre funzioni che vengono richiamate dal programma principale all occorrenza.
Arduino Programmazione - Strutture e Costanti setup() loop() if if...else for switch case while do... while break continue return HIGH LOW INPUT OUTPUT true false Integer Constants
Arduino Programmazione - Funzioni Digital I/O pinmode(pin, mode) digitalwrite(pin, value) int digitalread(pin) Analog I/O int analogread(pin) analogwrite(pin, value) Advanced I/O tone() notone() shiftout(datapin, clockpin, bitorder, value) unsigned long pulsein(pin, value) Time unsigned long millis() unsigned long micros() delay(ms) delaymicroseconds(us) Math min(x, y) max(x, y) abs(x) constrain(x, a, b) pow(base, exponent) sq(x) sqrt(x) map(value, fromlow, fromhigh, tolow, tohigh) Trigonometry sin(rad) cos(rad) tan(rad) Random Numbers randomseed(seed) long random(max) long random(min, max) Communication Serial
Arduino Programmazione - Librerie Di solito uno sketch utilizza delle librerie di comandi che consentono di controllare dei particolari dispositivi. Molte librerie per usi generali e per le comunicazioni, sono già pronte come ad esempio: SPI, I 2 C, Ethernet, ecc ; altre possono essere scritte dagli utenti a proprio uso e consumo. Le librerie vengono inserite con il comando #include <SoftwareSerial.h>
per cominciare! int sensorpin = 0; int ledpin = 13; int sensorvalue = 0; Il led collegato al pin 13 lampeggia con una frequenza proporzionale al valore di tensione letto sull ingresso analogico 0 regolato da un potenziometro. void setup() { pinmode(ledpin, OUTPUT); } void loop() { sensorvalue = analogread(sensorpin); digitalwrite(ledpin, HIGH); delay(sensorvalue); digitalwrite(ledpin, LOW); delay(sensorvalue); }
ARDUINO + GPS
GPS Il GPS (Global Positioning System) è il sistema satellitare di posizionamento globale, capace di localizzare in ogni momento la posizione di un dispositivo senza l ausilio di carte o bussole. I satelliti inviano ai ricevitori i dati necessari al calcolo della loro posizione. Il calcolo della posizione si basa sulla conoscenza della distanza del dispositivo da tre punti noti (tre satelliti).
GPS - NMEA Il ricevitore dopo aver elaborato le informazioni provenienti dai satelliti, invia sulla seriale i risultati in una forma standard chiamata frase NMEA (National Marine Electronics Association). Esempio di frase (o sentenza): $GPRMC,140502.53,A,4329.5619,N,01256.1853,E,000.1,000.0,271209,002.3,E,A*36
GPS - Programma #include <SoftwareSerial.h> #define rxpin 2 #define txpin 3 I dati trasmessi sulla seriale dal GPS vengono intercettati e inviati tramite i comandi seriali al Personal Computer dove possono essere visualizzati ed interpretati. GPS-41MLR SoftwareSerial myserial = SoftwareSerial(rxPin, txpin); int buffer_int; byte buffer_byte; void setup(){ pinmode(rxpin, INPUT); pinmode(txpin, OUTPUT); Serial.begin(9600); myserial.begin(4800); } void loop(){ buffer_byte = myserial.read(); Serial.write(buffer_byte); }
GPS Cattura sentenza NMEA Il ricevitore utilizzato in questa prova (GPS-41MLR) trasmette sulla seriale le sentenze NMEA: $GPGSA, $GPGSV, $GPRMC, $GPGGA
ARDUINO + Ethernet shield
Ethernet shield La Ethernet shield è una scheda elettronica che si collega alla Arduino Duemilanove board con la quale è possibile il collegamento ad una rete locale LAN. La Ethernet shield è basata sull integrato Wiznet W5100 che è un 10/100 ethernet controller, progettato per applicazioni embedded, che fornisce lo stack TCP/IP dal livello fisico fino al livello di trasporto.
Ethernet shield Architettura di riferimento In questo primo esempio Arduino è il client che richiede una pagina.html al Web Server Apache.
Ethernet shield Lato Server Arduino si collega all indirizzo http://192.168.1.100 e richiede la pagina index.html (visibile di seguito insieme alla sua pagina sorgente).
Ethernet shield Lato client Nel programma a fianco, dopo aver impostato l IP del server (al quale è inviata la richiesta) e del client (che genera la richiesta), viene inviata una richiesta GET e viene inoltrata la risposta attraverso la porta seriale. #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED }; byte ip[] = { 192, 168, 1, 103 }; byte server[] = { 192, 168, 1, 100 }; Client client(server, 80); void setup() { Ethernet.begin(mac, ip); Serial.begin(9600); delay(1000); Serial.println("connecting..."); if (client.connect()) { Serial.println("connected"); client.println("get /index.html HTTP/1.0");
Ethernet shield Risultato Con il Serial Monitor disponibile nel software di programmazione di Arduino catturiamo i dati che arrivano sulla seriale. Dall analisi della videata a fianco si vede che il server ha risposto alla richiesta del client inviandogli un messaggio di HTTP/1.1 200 OK e di seguito il sorgente (HTML) della pagina richiesta.
Ethernet shield Architettura di riferimento In questo secondo esempio Arduino è il server che una volta interrogato dal client (FireFox), gli invia una pagina.html in cui inserisce il livello di tensione presente all ingresso analogico 0 in quel momento.
Ethernet shield Lato Server Dopo aver impostato l IP e la porta di ascolto (http) del server (Arduino), questo si mette in attesa di una richiesta proveniente da un client (Firefox); al suo arrivo il server inserisce in una pagina in formato.html il livello di tensione presente all ingresso analogico 0, e la invia come risposta alla richiesta del client. #include <Ethernet.h> byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED}; byte ip[] = { 192, 168, 1, 103 }; Server server(80); void setup() {Ethernet.begin(mac, ip); server.begin(); Serial.begin(9600);} void loop() {Client client = server.available(); if (client) { while (client.connected()) { if (client.available()) { char c = client.read(); Serial.print(c); if ((c == '\n')) { client.println("http/1.1 200 Ok"); client.println("content-type: text/html"); client.println(); client.println("<html>"); client.println("<title>"); client.println("arduino Web Server"); client.println("</title>"); client.println("<body>"); client.println("<hr>"); client.println("<h2 align=\"center\">arduino Web Server</h2>"); client.println("<hr>"); client.println("<br>"); client.println("<h2 align=\"center\">il livello di tensione presente all'ingresso analogico 0 è</h2>"); client.print("<h1 align=\"center\">"); client.print(analogread(0)*0.0048828125); client.println("</h1>"); client.println("</body>"); client.println("</html>"); break; }}}} delay(1); client.stop();}
Ethernet shield Lato client La pagina di richiesta da parte del client. La pagina di risposta da parte del server.
ARDUINO + XBee
XBee shield Il modulo XBee è una soluzione compatibile con lo standard ZigBee/IEEE 802.15.4 che soddisfa la necessità di una rete a basso costo e a basso consumo, pensata soprattutto per l'utilizzo con sensori. Per configurare lo XBee il suo produttore, la Digi International, mette a disposizione il software X-CTU, reperibile all indirizzo: http://www.digi.com
XBee shield Architettura di riferimento In questo esempio il trasmettitore invia al ricevitore lo stato di due contatori interni (uno si incrementa, l altro si decrementa ad ogni secondo); il ricevitore riceve i dati e li invia, attraverso un collegamento USB (seriale virtuale) al PC in cui un applicativo (Tera Term) li mostra a video.
XBee shield Configurazione del Coordinator La configurazione che permette al Coordinator di ricevere i dati da qualsiasi modulo Xbee Router/End Device, si ottiene con le impostazioni seguenti: Modem Xbee: XB 24-B Function Set: ZNET 2.5 COORDINATOR AT Operating Channel: 11 (canali da 11 a 26) Operating PAN ID: 234 (numero a scelta)
XBee shield Configurazione del Router/End Device La configurazione che permette al Router/End Device di trasmettere i dati verso il Coordinator, si ottiene con le impostazioni seguenti: Modem Xbee: XB 24-B Function Set: ZNET 2.5 ROUTER/END DEVICE AT Operating Channel: 11 (canali da 11 a 26) Operating PAN ID: 234 (numero a scelta)
XBee shield Lato Router/End Device Lo sketch a lato deve essere caricato sulla scheda Arduino 2009 dove è alloggiato il Router/End Device (TX). Nel programma vengono creati due contatori: il primo A è inizializzato a 0 e successivamente incrementato di 1; il secondo B è inizializzato a 1024 e successivamente decrementato di 1. Quando il contatore arriva a 1024 viene impostato nuovamente a zero e il ciclo riparte. int count = 0; void setup() { Serial.begin(9600); } void loop() { // counter A will go forwards Serial.print('A'); Serial.print(count); Serial.println(); delay(1000); // counter B will go backwards Serial.print('B'); Serial.print(1024 - count); Serial.println(); delay(1000); // increase and reset the counter count++; if (count == 1024) count = 0; }
XBee shield Lato Personal Computer Nella pagina iniziale di Tera Term selezionare la porta seriale sulla quale è collegato il Coordinator e assicurarsi di impostare i parametri di comunicazione nel seguente modo: Baud rate: 9600 Data: 8 bit Parity: none Stop: 1 bit Flow control: none Il risultato è che vedremo a video il contatore A che si incrementa, mentre il contatore B si decrementa.
ARDUINO + GSM
GSM - Telit GM862 Il modem della Telit GM862 è utilizzato nell esempio seguente per inviare un SMS, attraverso la rete GSM, ad un telefono cellulare. Una volta inserita la SIM di un qualsiasi gestore di telefonia mobile il dispositivo ricerca la rete e, nel caso sia presente, si collega ad essa. Per comandare il modem si utilizzano i comandi AT.
GSM - Comandi AT La maggior parte degli attuali modem utilizza i comandi AT Hayes, uno specifico insieme di comandi originalmente sviluppato per il modem Hayes Smartmodem da 300 baud. Ogni funzione del modem è governata dal relativo comando AT (che sta per ATtention, attenzione). Per inviare un comando occorre trasmettere sulla porta seriale del modem una stringa ASCII formata da AT seguito da uno o più comandi e da un carattere di ritorno a capo (CR).
GSM - Schema elettrico
Programma per l invio di un SMS Dopo aver caricato lo sketch nell ATmega328, viene inviato un SMS attraverso il modem ad esso collegato tramite una seriale software.
Utilizzo dei comandi AT Invio di un SMS da un telefonino, utilizzando i comandi AT: a) collegare il proprio cellulare al PC (seguire le istruzioni del produttore); b) aprire un programma che simula un terminale (HyperTerminal, Tera Term, ecc ) e selezionare la COM dove è collegato il telefono; c) digitare i seguenti comandi: 1: AT 2: OK 3: AT+CMGF=1 4: OK 5: AT+CMGW= 328467xxxx 6: > Un semplice messaggio :-) 7: +CMGW: 1 9: OK 10: AT+CMSS=1 11: +CMSS: 20 13: OK La descrizione dei comandi è nella slide seguente
Utilizzo dei comandi AT Linea 1: "AT" viene spedito al modem GSM/GPRS per testare la connessione. Il modem risponde con un codice di risposta (OK alla linea 2) Linea 3: Il comando AT+CMGF viene usato per istruire il modem ad operare in modalità testuale per gli SMS. Il codice di risposta OK alla linea seguente indica che linea di comando AT+CMGF=1 è stata eseguita con successo; Linee 5-6: Il comando AT+CMGW viene usato per memorizzare nel modem il messaggio, mentre +85291234567 è il numero telefonico del destinatario. Dopo aver digitato tale numero, premete il tasto Enter. Il modem a questo punto dovrebbe ritornare il prompt ">" e a questo punto potete incominciare a scrivere il vostro SMS (in questo caso "Un semplice messaggio"). Quando avete finito, premete Ctrl+Z; Linea 7: +CMGW: 1 ci dice che l'indice assegnato al messaggio è 1. Questo indica la locazione dell'sms nella memoria del modem; Linea 9: Il risultato OK indica che l'esecuzione del comando +CMGW ha avuto successo; Linea 10: il comando +CMSS viene usato per spedire i messaggi dalla memoria del modem. 1 indica l'indice dell'sms ottenuto alla linea 7; Linea 11: +CMSS: 20 ci dice che il numero di riferimento assegnato all'sms è 20; Linea 13: Il risultato OK indica che l'esecuzione del comando +CMSS ha avuto successo.
ARDUINO + BLUETOOTH
BluetoothBee BluetoothBee è un modulo Bluetooth Serial Port Profile (SPP) che permette di realizzare collegamenti seriali wireless. Il device è pienamente compatibile con la XBee shield già vista nelle slide precedenti; in pratica basta sostituire il modulo Xbee con il modulo BluetoothBee per avere a disposizione la tecnologia Bluetooth. BluetootBee CSR Bluecore-04 Externel Bluetooth singol chip
BluetoothBee - Caratteristiche Hardware e Software
BluetoothBee Installazione del dispositivo In questa immagine si vede come si installa il modulo BluetoothBee sulla Xbee shield e anche come si posiziona quest ultima sulla Arduino board.
BluetoothBee Architettura di riferimento In questo esempio faremo in modo che il modulo BluetoothBee si colleghi con il PC equipaggiato con una chiavetta Bluetooth. Una volta avvenuto il collegamento fra i due dispositivi, inviando il carattere a dal PC (utilizzando il programma Tera Term o altro simile), il modulo BluetoothBee risponderà inviando indietro la stringa You are connected to BluetoothBee.
BluetoothBee Collegamento BluetoothBee-PC Animazione
BluetoothBee - Sketch Lo sketch a lato deve essere caricato sulla scheda Arduino 2009 dove è alloggiato il BluetoothBee. Con questo programma il modulo BluetoohBee funziona in modalità slave. Quando arriva il carattere a, Arduino risponde con il messaggio: "You are connected to Bluetooth Bee. void setup() { Serial.begin(38400); setupbluetoothconnection(); } Sketch 1/2 void loop() { if(serial.read() == 'a') { Serial.println("You are connected to Bluetooth Bee");} } void setupbluetoothconnection() { delay(1000); sendbluetoothcommand("\r\n+stwmod=0\r\n"); sendbluetoothcommand("\r\n+stna=modem\r\n"); sendbluetoothcommand("\r\n+stauto=0\r\n"); sendbluetoothcommand("\r\n+stoaut=1\r\n"); sendbluetoothcommand("\r\n+stpin=0000\r\n"); delay(2000);
BluetoothBee - Sketch Lo sketch prosegue dalla slide precedente. } Serial.print("\r\n+INQ=1\r\n"); delay(2000); Sketch 2/2 void sendbluetoothcommand(char command[]) { Serial.print(command); delay(3000); } Comandi utilizzati
BluetoothBee - Flowchat
BluetoothBee Risultato
Prossimi sviluppi
Arduino Arduino + Android
Arduino Arduino + WiFi