DII - Dipartimento di Ingegneria
dell’Informazione
Corso di Comunicazioni Wireless
Arduino
Board-IDE-Shield
Samuele Gasparrini – s.gasparrini@univpm.it
Laura Montanini – laura.montanini@univpm.it
Schema lezione
 Introduzione
 Board




Arduino Uno Ver.3
Arduino Ethernet
Arduino POE
Galileo
 Ambiente di sviluppo IDE




Panoramica sull’IDE
Elementi principali
Serial Monitor
Esempi
Schema lezione
 Shield



GSM-GPRS
GPS
NFC
Cos’è Arduino?
Arduino is an open-source electronics
prototyping platform based on flexible, easy-touse hardware and software.
It's intended for artists, designers, hobbyists, and
anyone interested in creating interactive objects
or environments.
http://arduino.cc/
Cos’è Arduino?
Le caratteristiche che contraddistinguono il progetto sono:
 Multipiattaforma:
Mac OS X o superiore
Windows XP o superiore32/64-bit
Linux 32/64-bit (Ubuntu o simili)
 IDE integrated development environment (IDE) semplice
 Programmabile tramite cavo usb
 Software e hardware open source
Es. Fritzing
Cos’è Arduino?
Le caratteristiche che contraddistinguono il progetto sono:
 Il costo totale della board è 20€
 Comunità di utente molto grande
 Ideale per i progetti che abbiamo pensato
Arduino Uno Ver.3
http://arduino.cc/en/Main/ArduinoBoardUno









5V tensione di lavoro
Basato su ATmega328: (CPU, RAM, memoria flash, pin di input/output)
14 pin di input/output digitali (6 abilitati per PWM)
6 input analogici
Connettore USB
Power jack
Pin AREF riservato per una tensione di riferimento
32 KB di spazio di memoria (0.5KB per bootloader)
16 MHz di Clock
Arduino Uno Ver.3
 Pin di Alimentazione:


Vin: pin per di ingresso per alimentazione
alternativa
5V: fornisce 5V in uscita
 3.3V: fornisce 3.3V in uscita



GND: Ground
IOREF: Fornisce la tensione di lavoro della board
RESET: permette di realizzare un segnale di reset esterno
 Pin di input/Output:

Possono essere usati sia per input
che output





0-1: trasmissione seriale
2-3: pin di interrupt
PWM(3, 5, 6, 9, 10,11): realizzano un’uscita PWM
SPI: 10,11,12,13: comunicazione SPI
13: pin connesso al led
Arduino Uno Ver.3
 Pin analogici:



risoluzione a 10 bit su 1024 livelli (0-5V)
Tramite il pin AREF è possibile cambiare il riferimento
superiore
A4,A5: pin per la comunicazione I2C(A4 =SDA ,A5=SCL)
 SPI (Serial Peripheral Interface)

ICSP(In Circuit Serial Programming):Utilizzato per comunicazione tra board e altri
device/shield

SPI: 10(SS),11(MOSI),12(MISO),13(SCK): comunicazione SPI
Arduino Uno Ver.3
 Led:



ON: led di alimentazione
L: generico, connesso al pin 13
Tx-Rx: utilizzati come feedback per capire
rispettivamente quando vengono inviate/ricevute
delle informazione verso/da pc
Oscillatore:

Permette di generare una frequenza di 16 MHz
ATMega16U2:

Microcontrollore programmato come convertitore USB-serial
Regolatore di tensione:

In uscita fornisce i 5V di tensione utilizzati dalla board
Arduino Ethernet
http://arduino.cc/en/Main/ArduinoBoardEthernet








Quasi identica ad Arduino Uno
Connettore RJ45
Pin 10,11,12,13 riservati alla comunicazione Ethernet
Interfaccia Wiznet Ethernet per la connessione con PC
Lettore di card SD
Pin 4 usato per la connessione SPI (SS)con la SD card
Led connesso al pin 9
6 pin per la programmazione tramite adattatore USB Serial Light
Arduino POE
http://arduino.cc/en/Main/ArduinoBoardEthernet


Molto simile ad Arduino Ethernet
Presente il modulo POE(Power over Ethernet)


Lettore di card SD
La scheda è alimentabile tramite:
 connettore di alimentazione
 modulo POE
 connettore FTDI cable/USB Serial
Galileo
http://arduino.cc/en/ArduinoCertified/IntelGalileo
https://communities.intel.com/community/makers/documentation/galileodocuments
Galileo
http://arduino.cc/en/ArduinoCertified/IntelGalileo









Intel® Quark SoC X1000(architettura Intel a 32 bit a 400MHz per wearable devices)
Compatibile a livello software(90%) e hardware(100%) con Arduino
IDE quasi identico a quello di Arduino
I/O pin alimentabili a 3.3-5V
mini-PCI Express slot
100Mb Ethernet port
Slot micro-SD(max 32GB)
RS-232 serial port
USB Host port, USB Client port
Galileo
http://arduino.cc/en/ArduinoCertified/IntelGalileo


Kernel Linux
Per rendere lo sketch permanente è necessario utilizzare una memoria SD:
https://communities.intel.com/docs/DOC-22204
 UART per la comunicazione seriale sui pin 0(Tx) e 1(Rx)
 Anche la porta USB Device permette la comunicazione seriale (…serial Monitor)
 258-512KB dedicati allo sketch( Arduino è di solo 8 KB!!)
Arduino IDE 1.0.5 r2
Procedure di istallazione dell’IDE
Per Galileo seguire la guida in:
https://communities.intel.com/docs/DOC-22204

Utilizzare il cavo tipo A/B

Scaricare e istallare l’ambiente di sviluppo IDE Arduino 1.0.5 dal link:
http://arduino.cc/en/Main/Software
Arduino IDE 1.0.5 r2
Procedure di istallazione dell’IDE

Connettere adesso la board al pc e verificare che il pin PWR sia acceso

Attendere che la procedura di istallazione dei driver termini
Nel caso in cui fosse necessario indicare il percorso dei driver scaricati(arduino.inf)

Al termine il device sarà presente all’interno dispositivi

Aprire l’IDE e provare ad eseguire lo sketch:
File > Examples > 1.Basics > Blink
Arduino IDE 1.0.5 r2
Integrated development environment(IDE):
Command
Area
menu
Icone
principali
Editor
Area dei
messaggi
Arduino IDE 1.0.5 r2
Caratteristiche fondamentali
Command Area:



nome del programma(Sketch) e versione IDE
Barra del menu
Pulsanti principali: Verifica, Carica, Nuovo, Apri, Salva, Monitor Serale
Editor:
Arduino IDE 1.0.5 r2
Caratteristiche fondamentali
Area dei messaggi:


Permette di visualizzare errori di compilazione
Indica la riga di codice in cui si è presentato l’errore

Indica la porta a cui è connesso Arduino
Arduino IDE 1.0.5 r2
Linguaggio di programmazione
Il linguaggio utilizzato è derivato dal Processing ma con alcune differenze
www.processing.org

Basato su Java, permette quindi l’utilizzo di classi e relativi oggetti

Di seguito verranno descritti:
 gli elementi principali di un programma(Sketch)
 le componenti fondamentali del linguaggio di programmazione utilizzato
La struttura fondamentale del programma è:
// the setup routine runs once when you press reset:
void setup()
{
// ...
}
// the loop routine runs over and over again forever:
void loop()
{
// ...
}
Arduino IDE 1.0.5 r2
Linguaggio di programmazione
La funzione setup
 viene eseguita una sola volta
 permette di dichiarare/settare le variabili utilizzate nel programma
// the setup routine runs once when you press reset:
void setup()
{
// ...
}
La funzione loop:
 è eseguita ripetutamente finché non viene tolta l’alimentazione alla board
 rappresenta la parte fondamentale del programma
// the loop routine runs over and over again forever:
void loop()
{
// ...
}
Arduino IDE 1.0.5 r2
Funzioni
Le funzioni loop e setup sono a tutti gli effetti delle funzioni:
// Function example
type functionName(parameters)
{
// ...
}
Gli elementi fondamentali sono:
 Tipo della variabile ritornata
type
 Nome della funzione
functionName
 Parametri in ingresso
parameters
 Codice all’interno delle parentesi graffe
Arduino IDE 1.0.5 r2
Parentesi {}
Vengono utilizzate per racchiudere in un blocco unico una serie di istruzioni
 sono state usate per le funzioni loop e setup
 possono essere utilizzate dopo istruzioni condizionali (es.: if)
{
// ...
}
Commenti
Esistono due versioni:
 inserire un commento in una singola riga
// primo tipo
 inserire un commento in più righe
/* secondo
tipo*/
Arduino IDE 1.0.5 r2
Costanti
L’IDE ha dei valori predefiniti, come ad esempio:
TRUE //0
FALSE //1
HIGH //livello del pin alto
LOW
//livello del pin basso
digitalWrite(13, HIGH);
INPUT //definisce la modalità di un pin
OUTPUT
pinMode(13, OUTPUT);
Variabili
Servono per memorizzare informazioni all’interno della memoria(RAM)
 Usare un nome appropriato(evitare var1, var2, ecc..)
 A differenza della costanti il dato salvato è modificabile durante il programma
int tensione = 4;
boolean messaggio = TRUE;
 le variabili non devono avere lo stesso nome di altre keyword già utilizzate da Arduino
int Serial = 4;
Arduino IDE 1.0.5 r2
Variabili
Tutte le variabili devono essere dichiarate prima di essere utilizzate
tensione = 4;
//utilizzo senza dichiarazione
...
int tensione = 4;
//dichiarazione
tensione = 4;
//utilizzo
Visibilità delle variabili
Una variabile può essere dichiarata:
 Prima della funzione setup
int tensione = 4; //globale
void setup()
{
// ...
}
 Localizzata all’interno di una funzione
Arduino IDE 1.0.5 r2
Visibilità delle variabili
 Localizzata all’interno di una funzione
void funzione1()
{
int tensione = 4; //locale
// ...
}
 Dentro un blocco di codice(es.: esempio un for, if, ecc…)
for(int i = 1;i<10;i++)
{
int tensione = 4; //locale
}
Tipo di dato
Una lista dettaglia è presente al riferimento:
http://arduino.cc/en/Reference/HomePage
Arduino IDE 1.0.5 r2
Tipo di dato
 boolean
memorizza uno tra i due possibili valori TRUE o FALSE, occupa 8 bit
 byte
memorizza valori interi in 8 bit(1 byte) con intervallo [0 255]
 char
dimensione di 8bit(1 byte)
memorizzata come numero tramite la codifica ASCII, intervallo[-128 127]
char lettera = 'A';//A = 65;
 int
memorizza valori interi in 16 bit(2 byte) con intervallo [-32768 32767]
ATTENZIONE all’overflow : x = 32768, x = x+1!!!
 unsigned int
sempre 16 bit(2 byte) ma solo per interi positivi 0 [0 65535]
 long
memorizza valori interi in 32 bit con intervallo [-2147483648 2147483647]
In Arduino è possibile utilizzare il casting:
long tensione = 2147483647
int tensioneInt = (int)tensione;
Arduino IDE 1.0.5 r2
Tipo di dato

unsigned long
versione senza segno dei long [0 4,294,967,295]
 float
memorizza valori decimali in 32 bit con intervallo [-3.4028E+38 3.4028E+38]
 double
1.7976931348623157x10^308
 array
collezione ordinata di valori accessibili tramite un indice. La numerazione parte da 0
int myArray = {1, 2, 3, 5};
int myArray[4]
string
array di tipo char terminato con il carattere null('\0')
string Str[] = "Arduino";
Allo stesso tempo è possibile utilizzare la classe String:
String Str = "Arduino";
Arduino IDE 1.0.5 r2
Tipo di dato

Struct
permette di creare delle variabili che al loro interno sono composte da membri di tipo
differenti:
typedef struct Struttura
{
String Str;
int num;
};
typedef struct GPRMCData Record;
Arduino IDE 1.0.5 r2
Operatori aritmetici




Somma: +
Sottrazione: Moltiplicazione: *
Divisione: /
Operatori di confronto






x
x
x
x
x
x
== y
!= y
< y
> y
<= y
>= y
//pari a
//diverso
//minore
//maggiore
//minore uguale
//maggiore uguale
Arduino IDE 1.0.5 r2
Strutture di controllo
If-else
Viene valutato condizione, in caso di soluzione TRUE viene eseguita la prima parte. Altrimenti
la seconda
if(condizione)
{
//prima parte;
}
else
{
//Seconda parte;
}
for
Viene ripetuto il codice per un numero volte definito
for(int i = 1;i<10;i++)
{
//codice
}
Arduino IDE 1.0.5 r2
Strutture di controllo
while
Si esegue il codice finché la condizione è TRUE
while(condizione)
{
//Codice;
}
Operatori booleani
Utilizzati quando si vogliono combinare istruzioni condizionali multiple
&&
//AND
||
//OR
!
//NOT
if ((sensor => 5) && (sensor <=10))
Arduino IDE 1.0.5 r2
Funzioni predefinite

pinMode(pin, mode)
Utilizzata all’interno della funzione setup() per configurare un pin come input o output
Di default i pin digitali sono impostati a input, cioè ad alta impedenza. Per evitare che il pin
quando lasciato floating, generi informazioni random è consigliato inserire una resistenza di
pull up.
pinMode(pin, OUTPUT)
I pin configurati come output sono a bassa impedenza, in questo modo è possibile fornire una
corrente di 20mA ai device connessi.
 digitalRead(pin)
Legge il livello(HIGH-LOW) di uno specifico pin digitale(0-13)
value = digitalRead(13);
 digitalWrite(pin, mode)
Impostare il livello di uscita di un pin(0-13) ad HIGH o LOW
digitalWrite(13, HIGH)
Arduino IDE 1.0.5 r2
Funzioni predefinite

analogRead(pin)
Viene letto il valore di un pin analogico(0-5) con una risoluzione di 10 bit.
Il risultato è compreso nel range [0 1023]
value = analogRead(A2)
Diversamente dai pin digitali, quelli analogici non hanno bisogno di essere dichiarati come
INPUT-OUTPUT

analogRead(pin) Vs digitalRead(pin)
Arduino IDE 1.0.5 r2
Funzioni predefinite

analogWrite(pin,value)
Arduino IDE 1.0.5 r2
Funzioni predefinite





Delay(ms)
Ferma il programma per una quantità di tempo pari al valore in ms
millis()
Ritorna l’intervallo di tempo in ms a partire dall’avvio del programma
min(x,y)
Calcola il minimo tra due valori dello stesso tipo e torna quello più piccolo
max(x,y)
Equivalente a sopra ma torna il massimo
abs(x)
restituisce il valore assoluto della variabile x
Serial Monitor
Principali funzionalità
Tramite il monitor seriale è possibile ricevere a pc le informazioni memorizzate all’interno della
board oppure inviare comandi(Es. Accensione/spegnimento LED)
 Serial.begin(rate)
Apre una porta seriale con baud rate pari a rate. Prepara quindi Arduino all’invio e alla
ricezione di possibili informazioni da e verso il PC
Quando viene utilizzata la comunicazione seriale, i pin RX e TX sono riservati a questa funzione
 Serial.print(data)
Stampa sulla porta seriale la quantità data.
Serial.println(data):Applica in automatico il ritorno di carrello
void setup()
{
Serial.begin(9600);
}
void loop()
{
Serial.println("ciao");
//delay(200);
}
Serial Monitor
Principali funzionalità
Può essere utilizzato anche per finalità di debug
int stato = 3;
void setup()
{
Serial.begin(9600);
}
void loop()
{
if(stato == 1) Serial.println("stato 1");
else if(stato == 2) Serial.println("stato 2");
else Serial.println("stato 3");
delay(200);
}
Serial Monitor
Principali funzionalità
Inviare comandi alla board
//Send command to Arduino
int incomingByte = 0;
void setup()
{ Serial.begin(9600);
}
void loop()
{ // send data only when you receive data:
if (Serial.available() > 0)
{ // read the incoming byte:
incomingByte = Serial.read(); // say what you got:
Serial.print("ricevuto: ");
Serial.print(incomingByte, DEC);
Serial.print(" Carattere: ");
Serial.println((char)incomingByte);
if(incomingByte == '3')
Serial.println("ricevuto 3");
}
}
Serial Monitor
Principali funzionalità
Ricevuto 13
Carattere ?vuoto?
Esempio 1
Accensione LED
Controllare l’accensione di un LED tramite Arduino
Materiale necessario:
 LED
 Arduino
 Resistenza 220 Ω
 Cavi
 cavo tipo A/B
 Breadboard ??
Esempio 1
Accensione LED
Controllare l’accensione di un LED tramite Arduino






LED
Arduino
Resistenza 220 Ω
Cavi
cavo tipo A/B
Breadboard
Esempio 1
Accensione LED
Controllare l’accensione di un LED tramite Arduino
//Switch on a LED connected to Digital Pin 8 via a 220 Ohm
resitors.
void setup()
{
pinMode(8, OUTPUT); // Initialize Arduino Digital Pin 8 as output
}
void loop()
{
digitalWrite(8, HIGH); // Switch On LED
}
Esempio 2
Blinking del LED
Spegnere e accendere il LED
Stesso circuito elettrico di prima ma sketch differente
//Blink a LED connected to Digital Pin 8 via a 220 Ohm
resitors.
void setup()
{
pinMode(8, OUTPUT); //Initialize Arduino Digital Pin 8 as
output
}
void loop()
{
digitalWrite(8, HIGH); // Switch On LED
delay(500); // Wait for half a second
digitalWrite(8, LOW); // Switch Off LED
delay(500); // Wait for half a second
}
Esempio 3
Controllo del blinking LED
Controllare il tempo di accensione e spegnimento del LED tramite un potenziometro







LED
Potenziometro
Arduino
Resistenza 220 Ω
Cavi
cavo tipo A/B
Breadboard
Esempio 3
Controllo del blinking LED
Controllare il tempo di accensione e spegnimento del LED tramite un potenziometro
//Varying the Blinking time of the LED using a Pot
int value=0; int mval;
void setup()
{
Serial.begin(9600); //pinMode(5, OUTPUT);
pinMode(8, OUTPUT); // Initialize Arduino Digital Pin 8 as output
}
void loop()
{
value=analogRead(A1); //read analog value from input A1
//delay output given to the LED
mval = map(value, 0, 1023, 100, 1000);
Serial.println(value);
digitalWrite(8, HIGH); // Switch On LED
delay(mval);
digitalWrite(8, LOW); // Switch Off LED
delay(mval); //analogWrite(5,mval);
}
Riferimenti
Link:
http://arduino.cc/en/Reference/HomePage
Libri:
Arduino Workshop
Getting Started
with Arduino
Arduino Programming
Notebook
Shield
Sono PCB collegabili ad Arduino tramite i pin di I/O
Permettono di aggiungere features al sistema
Shield
Link ufficiale:
http://store.arduino.cc/index.php?main_page=index&cPath=5&language=it
shieldlist.org
Circa 300 shield!!!
GSM-GPRS
Seed Studio GSM-GPRS shield V.2
http://www.seeedstudio.com/wiki/GPRS_Shield_V2.0






Compatibile con Arduino Uno, Ethernet, POE e Galileo
Interfaccia di comunicazione selezionabile tra: hardware serial e software serial
Quad band: 850/900/1800/1900MHz
Supporta il protocollo TCP/UDP
Modulo controllabile tramite comandi AT: Standard - GSM 07.07 & 07.05 e Enhanced SIMCOM AT Commands
Alloggio per la SIM
GSM-GPRS
Interfaccia di comunicazione selezionabile

Hardware serial
È possibile comunicare con il modulo
tramite un’interfaccia seriale sui pin 0 e 1
19200 bps 8-N-1
Il serial Monitor però non è più utilizzabile con Arduino(mentre con Galileo…)
 Software serial
In alternativa è possibile utilizzare la libreria Software Serial(solo per Arduino…)
#include <SoftwareSerial.h>
SoftwareSerial GPRS(7, 8);
http://arduino.cc/en/Reference/SoftwareSerial
La libreria permette di utilizzare due pin digitali per realizzare una comunicazione seriale
La board si aspetta di inviare/ricevere le informazioni sui pin 7-8
GSM-GPRS
Comando AT(attention):
AT + command
Sono delle sequenze da inviare al modulo per richiedere delle informazioni
Tutto ok?
Tx:
AT\r
Rx:
OK
Leggere sms N.1 in memoria
Tx:
AT+CMGR=1\r
Rx:
+CMGR: "REC READ","+39338999****","","14/03/25,09:19:18+04"
CIAO CIAO
OK
GSM-GPRS
Comando AT(attention):
Inviare un sms (non utilizzare il terminale di Arduino, alternative: PuTTY-Docklight)
Tx:
AT+CMGF=1\r entra in modalità testo
Rx:
OK
Tx:
AT + CMGS = "+39340490****"
Rx:
OK
>
È possibile scrivere il messaggio
> Prova mess \r
Per una lista completa di comandi AT si veda:
http://seeedstudio.com/wiki/images/a/a8/SIM900_AT_Command_Manual_V1.03.pdf
 Ricevere/effettuare una chiamata
 Ottenere i parametri di cella
GPS
Global Positioning System
ITEAD GPS SHIELD




Basato sul modulo GPS NEO-6M GPS
I dati possono essere salvati all’interno della SD utilizzando la libreria SD.h
Antenna esterna
Comunicazione seriale UART(Tx-Rx) su due dei possibili pin digitali
GPS
Global Positioning System
ITEAD GPS SHIELD


Non sono necessari comandi AT
Stringa di informazione inviata ad Arduino ogni 1s
$GPRMC,220516,A,4916.45,N,12311.12,W,173.8,231.8,130694,004.2,W*70
$: carattere di inizio stringa
GPRMC: identificativo del stringa(GP - GPS)
GP: GP=GPS mentre GL=Glonass
RMC: Recommended minimum specific GPS/Transit data (altri: GSV - GGA)
Time 220516: tempo di arrivo 22h 05min 16sec (UTC: Coordinated Universal Time)
Quality A: qualità del segnale A=valido V = warning
Lat 4916.45 N: latitudine 49° 16.45’ Nord
Long 12311.12 W: longitudine 123° 11.12’ Ovest
Speed 173.8 : velocità in Nodi
Date 130694: data in cui viene ricevuto il messaggio ddmmyy (d=giorni, m=mesi, y=anni)
Direction 231.8 : direzione di movimento in gradi
Variation 004.2W: Variazione rispetto al Nord magnetico
OperMode *70: checksum

Non sempre le stringhe sono corrette/complete
NFC
Near Field Communication
Perché NFC?:


Procedura di configurazione della comunicazione semplificata
Sicurezza della comunicazione
Definizioni:
TAG NFC(passivo): memoria + antenna
Reader \Writer NFC(attivo)
RFID Vs NFC




NFC sotto famiglia della tecnologia RFID
Una comunicazione NFC è bidirezionale
Condividono la stessa frequenza di lavoro: 13.56MHz (HF RFID)
NFC reader e tag devono essere molto vicini tra loro(pochi cm)
NFC
Near Field Communication
TAG NFC
NXP MIFARE Ultralight (Tag Tipo 2)
http://www.nxp.com/documents/data_sheet/MF0ICU1.pdf
 Basati sullo standard ISO-14443A
 Accesso in lettura/scrittura con la possibilità di configurare il tag come read-only
 Velocità di trasmissione 106kbps
 Memoria di tipo EEPROM divisa in 16 settori da 4 byte ciascuno (TOT di 512 bit)
Posizione
Numero di byte
Decimale
Esadecimale
0
1
2
3
0
0x00
Serial number(R)
1
0x01
Serial number(R)
2
0x02
Serial number(R)
Internal(R)
Lock
bytes(WORM)
Lock
bytes(WORM)
3
0x03
OTP(WORM)
OTP(WORM)
OTP(WORM)
OTP(WORM)
Da 4 a 15
Da 0x04 a
0x0F
Memoria utente(RW)
NFC
Near Field Communication
Reader \Writer NFC
Adafruit PN532 NFC/RFID
https://www.adafruit.com/products/789
Per comunicare con la board è necessario
 utilizzare una libreria specifica:
https://github.com/adafruit/Adafruit_NFCShield_I2C
 Comunicazione I2C tramite i pin A4-A5
 Autenticazione non richiesta
Arduino Due
http://arduino.cc/en/Main/ArduinoBoardDue
 3,3V tensione di lavoro
 Basato su AT91SAM3X8E (microcontrollore a 32 bit che integra un core
ARM Cortex-M3)
 84 MHz di Clock
 54 pin di input/output digitali (12 abilitati per PWM)
 12 input analogici
 2 output analogici (DAC)
 Con l’arrivo di Arduino DUE è anche stato rilasciato l’IDE 1.5.0 che
contiene tutta la parte relativa alla compilazione del codice per ARM
Arduino Due
http://arduino.cc/en/Main/ArduinoBoardDue





2 porte micro USB: “Programming port” e “Native port”
Pulsante “Erase” per cancellare il contenuto della Flash
Power jack
512 KB di spazio di memoria (per il programma)
96 kB memoria SRAM (per le variabili del programma)
Wi-fi
• http://arduino.cc/en/Main/ArduinoWiFiShield
• Tensione operativa 5V
(fornita dall'Arduino)
• Connessione : 802.11b/g
networks
• Antenna integrata
• Crittografia: WEP e WPA2 Personal
• on-board micro SD slot
Wi-fi
• Connessione con Arduino tramite il bus SPI (attraverso il
connettore ICSP)
• Micro-USB per aggiornamento firmware WiFi
• Usa il pin IOREF presente nelle schede più recenti (Uno rev3,
Mega2560 rev3, ecc.)
• Se si usa su schede più vecchie è necessario collegare il pin
IOREF a 5V o 3,3 V tramite un jumper
Wi-fi
•
•
•
•
Insieme allo shield, Arduino fornisce una libreria che permette alla board di connettersi ad
internet: Wi-Fi library
http://arduino.cc/en/Reference/WiFi
La libreria Wi-Fi è simile alla libreria Ethernet
La scheda può essere usata sia come client sia come server
•
Il lettore di schede SD è accessibile tramite la libreria SD (http://arduino.cc/en/Reference/SD)
Il protocollo http
• Che cos’è l’http?
• L'HyperText Transfer Protocol è usato come sistema per la
trasmissione d'informazioni fra client e server attraverso
una connessione IP
• Le specifiche del protocollo sono gestite dal World Wide
Web Consortium (W3C)
• Un server HTTP generalmente resta in ascolto delle
richieste dei client sulla porta 80
Il protocollo http
• Quando viene fatta una richiesta tramite http, il server
individua un file nel proprio file system basato sull'URL
richiesto
• Questo file può essere un file regolare o un programma
• Nel secondo caso il server esegue il programma e, a
seconda della sua configurazione, spedisce l’output
sottoforma di stringa o di pagina web
Il messaggio di richiesta
•
Il messaggio di richiesta è composto di tre parti:
– riga di richiesta (request line);
– sezione header (informazioni aggiuntive);
– body (corpo del messaggio).
•
•
•
•
•
La riga di richiesta è composta da metodo, URI e versione del protocollo
Il metodo di richiesta può essere uno dei seguenti: GET, POST, HEAD, DELETE,
CONNECT, …
I metodi HTTP più comuni sono GET e POST
Il metodo GET è usato per ottenere il contenuto della risorsa indicata
come URI
Il metodo POST è usato di norma per inviare informazioni al server (ad
esempio i dati di un form)
Il messaggio di risposta
•
•
•
•
Il messaggio di risposta è di tipo testuale ed è composto da tre parti:
riga di stato (status-line), codice a tre cifre che descrive l’esito della richiesta.
Ad esempio:
200 OK. Il server ha fornito correttamente il contenuto
404 Not Found. La risorsa richiesta non è stata trovata e non se ne
conosce l'ubicazione
sezione header, i più comuni sono:
Server. Indica il tipo e la versione del server
Content-Type. Indica il tipo di contenuto restituito
body (contenuto della risposta)
Query string
• Quando una risorsa viene richiesta tramite URI è
possibile utilizzare una query string
• La query string è parte dell'URL che è stato
passato al programma
• Il suo utilizzo permette ai dati di essere passati dal
client HTTP (spesso un browser) al programma
lato server
• Tipica struttura di una stringa http contenente una
query string:
http://server/path/program?query_string
Query string
• La sintassi delle query string non è formalmente
definita
• Generalmente si usa questa sintassi:
parametro1=valore1&parametro2=valore2&para
metro3=valore3
• A ciascun parametro viene assegnato un valore
utilizzando il separatore "="
• I vari parametri sono intervallati dal simbolo "&"
Il linguaggio PHP
• PHP (PHP: Hypertext Preprocessor) è un linguaggio di
programmazione interpretato
• Originariamente è stato concepito per la programmazione
di pagine web dinamiche
• L'interprete PHP è un software libero
• Attualmente è principalmente utilizzato per sviluppare
applicazioni web lato server
Il linguaggio PHP
• Utilizzo del linguaggio PHP in un’architettura
client-server
Il linguaggio PHP
• Tramite protocollo http è possibile richiamare uno script
PHP ed inviargli dei parametri
• I parametri vengono recuperati dallo script tramite la
funzione $_GET
http://localhost/path/program.php?pippo=valore_1
Il sistema domotico Jago
• Jago: Prototipo del sistema domotico utilizzato per
condurre test in laboratorio
• Sviluppato da:
– ArieLAB, spinoff dell'UnivPM
– AUTOMA Srl, azienda produttrice di
sistemi domotici
– Laboratorio di TLC dell‘UnivPM
Il sistema domotico Jago
• Jago è costituito da:
– 2 lampade
– 1 finestra
– 1 serranda
• Permette di:
–
–
–
–
Aprire/Chiudere una serranda
Aprire/Chiudere una finestra
Accendere/Spegnere due lampade
Attuare più comandi contemporaneamente (scenari)
• È comandato :
– Manualmente → pulsanti
– Via Wi-fi o Ethernet → protocollo http
Architettura di Jago
• Jago è composto da tre schede "XN-3OUT"
•
•
•
•
•
Sono schede di uscita digitale
Gestiscono fino a tre relè
Sono costituite da un microcontrollore microchip PIC24F-16 bit.
Ogni scheda viene identificata con un "id“
Al suo interno, ogni singolo relè viene identificato con un "pin“.
Architettura di Jago
ID = 2
ID = 3
ID = 8
Il protocollo di comunicazione
• Jago può essere controllato tramite un protocollo
di comunicazione chiamato “Xefiro”
• Per richiedere l’attivazione di un carico pilotato da
una XN-3OUT si usa la stringa chiamata “Scenario”
• Esempio – Luce on:
• http://192.168.21.5:1234/Scenario?rid=0&DevTy
pe=8&ScenNum=255&instantAck=0&DevNum=1&
p1=0&p2=1&p3=0&p4=0&p5=0&set=1
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
address e port: indirizzo IP e la porta del gateway
a cui è connesso il sistema domotico
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
rid (requestId): è un contatore
compreso tra 1 e 255,
lega la richiesta del client
alla risposta inviata dal sistema
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
•DevType: identifica la scheda XN-3OUT
che dovrà pilotare il carico
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
ScenNum: serve per le configurazioni di scenari
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
•instantAck: indica il tempo in secondi
di attività del comando;
il valore 0 indica l’invio immediato
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
DevNum: indica il numero di pin della XN-3OUT
a cui è rivolto il comando
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
p2: se impostato a 1 invia un segnale con livello alto,
mentre con 0 invia un segnale con livello basso:
• Luci: 0 per spegnimento, 1 per accensione
• Serranda/ Finestra: 1 per attivare i motori
Il protocollo di comunicazione
• Esempio:
• http://address:port/Scenario?rid=0&DevType=8&ScenNu
m=255&instantAck=0&DevNum=1&p1=0&p2=1&p3=0&p4
=0&p5=0&set=1
p3: identifica l’attuatore da comandare
all’interno della scheda XN-3OUT
Le basi di dati
• Che cos’è un DB?
• Rappresenta una raccolta di dati ben strutturata
• I dati sono organizzati secondo un modello logico
(relazionale, gerarchico, …)
• L’interazione con l’utente o con altre applicazione viene
gestita da uno specifico software chiamato DBMS
(Database management system)
Le basi di dati
• Sfruttano tre tipi di linguaggio:
– Data definition language – definisce il tipo di dato e le
relazioni fra di essi
– Data manipulation language – esegue operazioni quali
inserimento, aggiornamento e cancellazione di
occorrenze di dati
– Query language – permette di effettuare ricerche fra i
dati
Accesso al DB
• Accesso ad un DB tramite un’architettura clientserver
Accesso al DB
• Esempio di scrittura su DB tramite script PHP:
• Lato client:
– http://address:port/path/nomefile.php?value=1
– GET /path/nomefile.php?value=1
• Lato server: