DOMOTICA
E
ARDUINO
Daniele Moro – a.s. 2010-2011
Scopo del progetto
Comandare mediante interfaccia web alcuni
dispositivi di casa e monitorare la produzione
elettrica di un impianto fotovoltaico.
Cosa è stato utilizzato?
•
•
•
•
•
Arduino Mega
Ethernet Shield
RS485 shield
Relè
Sensore di temperatura
Fasi del progetto
• Implementazione Web-Server per l’interfaccia
tra utente e Arduino
• Implementazione di funzioni richiamate dalle
pagine
• Implementazione libreria di comunicazione tra
Arduino e Inverter
COS’É ARDUINO?
• Piccola scheda elettronica
• Hardware Open-Source
• Progetto Italiano partito nel
2005
Perchè scegliere Arduino?
• Costo
• Facilità di implementazione
• Linguaggio di programmazione
simile a C++
• Ambiente di sviluppo
• Comunity
• Shield
Panoramica scheda Arduino
Panoramica scheda Arduino
Microcontrollori utilizzati:
• ATmega328 (Arduino UNO)
– 32KB Flash Memory
– 2KB SRAM
– 1KB EEPROM
– Clock: 16Mhz
– 14 I/O digitali
– 6 Input analogici
Panoramica schede Arduino
Microcontrollori utilizzati:
• ATmega2560(Arduino MEGA 2560)
– 256KB Flash Memory
– 8KB SRAM
– 4KB EEPROM
– Clock: 16Mhz
– 54 I/O digitali (14 PWM)
– 16 Input Analogici
Shield Arduino
• Schede collegabili ad Arduino per espanderne
le capacità
• Ne esistono a centinaia
• Possono essere costruiti autonomamente con
delle semplici millefori
Alcuni shield
Ethernet Shield
Mp3 Shield
Display a colori
Shield GPS
PROTOCOLLO HTTP
•
•
•
•
•
Trasferimento ipertesti
Porta 80
Protocollo TCP
Client/Server
WWW
PROTOCOLLO HTTP
MESSAGGIO DI RICHIESTA
• Riga di richiesta
(GET, POST + URL+Versione Protocollo)
• Intestazione (host, user-agent)
• Corpo del messaggio (Facoltativo)
Esempio:
GET index.html HTTP/1.1
Connection: Keep-Alive
User-Agent: Mozilla/5.0
PROTOCOLLO HTTP
Alcune intestazioni:
• Autorization: credenziali per l’autenticazione
(es. Authorization: Basic
WxhZGRpbjpvcGVuIHNlc2FtZQ==)
• User-Agent: identificazione tipo di client
(es. User-Agent: Mozilla/5.0 (compatible; MSIE
9.0; Windows NT 6.1; WOW64; Trident/5.0))
• Host: Nome del server
(es. Host: en.wikipedia.org)
PROTOCOLLO HTTP
MESSAGGIO DI RISPOSTA
• Versione HTTP con codice di stato (200 OK, 404 Not
Found...)
• Intestazione (server, content-type...)
• Corpo del messaggio (pagina richiesta)
Esempio:
HTTP/1.1 200 OK
Server: Apache/1.3.29
Content-Type: text/html
<html>
<head>
<title> Pagina iniziale</title>
</head>
<body>
Pagina iniziale
</body
</html>
PROTOCOLLO HTTP
Alcune intestazioni:
• WWW-Authenticate: indica che schema di
autenticazione usare
(es. WWW-Authenticate: Basic)
• Server: Nome del server
(es. Server: Apache/1.3.27)
• Content-Type: Tipo mime del contenuto del
messaggio
(es. Content-Type: text/html)
PROTOCOLLO HTTP
Alcuni codici di stato:
•
•
•
•
200 OK
404 Not Found
401 Unauthorized
500 Internal Server Error
PROTOCOLLO HTTP
•
•
•
•
•
•
AUTENTICAZIONE (basic access authentication)
Autenticazione con username e password codificati in
Base64
VANTAGGI
Direttamente implementati in HTTP/1.1
Supportato da tutti i browser web
SVANTAGGI
Password inviata in chiaro (solo codificata in base64)
Nessuna cifratura dei contenuti
Impossibilità di log out se non chiudendo il browser (il
browser mantiene in memoria le credenziali di
accesso)
PROTOCOLLO HTTP
AUTENTICAZIONE (basic access authentication)
Esempio di transazione tra server web e client:
• il client richiede una pagina
• il server risponde inviando un errore tipo 401
• il client apre la finestra per il login
• il client reinvia la richiesta della pagina aggiungendo un
campo all’intestazione con la password e l’username codificati
in base
• Il server controlla se le credenziali sono corrette ed invia la
pagina, altrimenti reinvia un errore tipo 401
COMUNICAZIONE CON INVERTER
• RS485
• ComLynx protocol (Danfoss)
RS485
• Standard livello fisico
• Connessione seriale
• Half-Duplex
• Multipunto (max 256 Nodi)
• Trasmissione differenziale
Esempio Trasmissione differenziale (0xD3 LSb)
ComLynx Protocol
• Utilizza RS485
• Velocità di comunicazione: 19200 baud
• Frame HDLC
Messaggio ComLynx
Inizio Frame
•
Contenuto del
messaggio
Fine Frame
CRC-CCIT
Start
Indirizzo
Controllo
Intestazione Dati
0x7E
0xFF
0x03
6 byte
0-255byte 2 byte
Stop
0x7E
ComLynx Protocol
Byte Stuffing
0x7E0x7D 0x5E 0111111001111101 01011110
0x7D0x7D 0x5D 0111110101111101 01011101
ComLynx Protocol
CRC
• Polinomio: x16+x12+x5+1
• Calcolato su tutti i campi tranne start, stop e
CRC
ComLynx Protocol
ComLynx Protocol
Contenuto del Messaggio: Header
Contenuto del messaggio
Intestazione
Indirizzo
Mittente
Indirizzo
Destinatario
Dimensione
campo dati
Tipo campo
dati
Dati
2 Bytes
2Bytes
1Byte
1Byte
0-255 Bytes
Tipo campo dati può essere:
• 0x13 Per ricevere informazioni dal nodo
• 0x15 Ping
• 0x01 Messaggio CAN Kingdom (protocollo di
comunicazione per effettuare richieste di parametri)
ComLynx Protocol
Messaggio CAN Kingdom:
CAN KINGDOM
Byte 1
Byte 2
Byte 3
N° doc
Vuoti
Modulo di
destinazione
Modulo sorgente
N° Pagina
1 Byte
4 bits
4bits
4bits
4bits
0xC8
0
CAN KINGDOM
Byte 4
Byte 5
Byte 6
Byte 7-10
Indice
parametro
Sotto indice
parametro
Flags
Tipo dato
Valore parametro
1 Byte
1 Byte
4 bits
4 bits
4 Bytes
ComLynx Protocol
• ESEMPIO (richiesta produzione istantanea)
CAN KINGDOM
Byte 1
Byte 2
Byte 3
N° doc
Vuoti
Modulo di
destinazione
Modulo sorgente
N° Pagina
1 Byte
4 bits
4bits
4bits
4bits
0x4
0xD
0x0
0xC8
CAN KINGDOM
Byte 4
Byte 5
Byte 6
Byte 7-10
Indice
parametro
Sotto indice
parametro
Flags
Tipo dato
Valore parametro
1 Byte
1 Byte
4 bits
4 bits
4 Bytes
0x01
0x01
0x8
0x7
0x00000000
IMPLEMENTAZIONE SU ARDUINO
• Server Web
– Lettura richiesta HTTP
– Esecuzione richiesta
• Pagine su MicroSD
• “tag” per variabili o azioni
• Passaggio in GET di variabili
FUNZIONALITÀ DEL SITO
temp.htm
Index.htm
rele.htm
inv.htm
Pagina per la visualizzazione della
temperatura e dell’umidità
Pagina per attivare e disattivare dei
relè che comandano dispositivi (luci,
cancelli...)
Pagina per la visualizzazione delle
statistiche di produzione
dell’impianto fotovoltaico
Esempio di codice
LETTURA RICHIESTA HTTP
while(client.connected() && client.available())
{ c=client.read();
readString+=c;
c=client.read();
readString+=c;
bufindex=2;
while(readString[bufindex-1]!='\n' && readString[bufindex-2]!='\r') //Lettura per
riga
{c=client.read();
bufindex++;
}
//Interpretazione della riga appena letta
.....
Esempio di codice
Richiesta della produzione totale all’inverter
unsigned long inverter::ProdTotale()
{...
Intestazione(mex[0]);
DataField(mex[8],0x01,0x02,0x04,0x07);
//INDEX=0x01,SUBINDEX=0x02,MODULE=0x04,DATATYPE=0x7
crc=pppfcs16(PPPINITFCS16, mex, 18); crc^=0xFFFF; //Calcolo del CRC
spedMex(mex, 18, crc); //Spedizione del messaggio
ricMex(mex, num); //Ricezione del messaggio
crc = pppfcs16( PPPINITFCS16, &mex[1], num); //Calcolo del CRC
if( crc == PPPGOODFCS16 ) //Controllo CRC
{
...
return retVal(&mex[15]);
...
Possibili sviluppi futuri
• Comunicazione tra più Arduino mediante rete
Ethernet
• Collegamento circuito RTC per log dei dati
• Implementazione di software per PC per
visualizzare le statistiche di produzione
elettrica
SITOGRAFIA
•
•
•
•
•
•
•
www.arduino.cc
it.wikipedia.org
www.arduino.cc/playground
www.arduino.apogeolab.it
www.openskill.info
www.danfoss.com
www.centrosolar.de