Conrad 10215 Operation Manual [it]

PRIMA DI INIZIARE
La prima volta che si collegano le schede WiFi per IoT (Internet of Things) (di seguito chiamate anche NanoESP), può accadere che il computer non trovi automaticamente i driver necessari per il convertitore USB seriale. Se ciò accade, scaricare i driver dalla pagina www.iot.fkainka.de/driver e installarli
manualmente. Il software di Arduino consente di selezionare la porta e la scheda
essere pienamente operativo. Anche per utilizzare il monitor seriale è necessario effettuare alcune impostazioni.
La velocità di trasmissione utilizzata in questo caso è di 19200 baud. Per poter inviare comandi, è inoltre necessario selezionare le opzioni CR e NL accanto al menu del baudrate.
Impostazioni corrette per l'ambiente Arduino
Ho utilizzato le versioni IDE per Arduino 1.6.5 e 1.6.6. Le versioni precedenti possono causare problemi. La versione corrente dell'IDE per Arduino è disponibile sul sito www.arduino.cc,+++
In caso di difficoltà o problemi con la scheda o il kit di apprendimento, può essere utile consultare la pagina www.iot.fkainka.de. Oltre al forum, la pagina offre
nuovi progetti degli utenti e l'ultima versione dei programmi presentati. Il kit di apprendimento è una breadboard alla quale è possibile collegare la scheda
NanoESP, come mostrato nella foto seguente. Questo lascia ampio spazio di sperimentazione, mentre il modulo WLAN si estende dietro, sopra la breadboard. Quindi è possibile inserire il cavo Micro-USB, che interferisce minimamente, come illustrato nella figura della sezione seguente. Per immagini più dettagliate della struttura, vedere il capitolo corrispondente.
La scheda WiFi per IoT (NanoESP)
L'elemento principale di questo kit di apprendimento è la scheda WiFi per IoT (NanoESP). Come si può vedere abbastanza bene sul lamierino, la scheda è costituita da due componenti. Nella metà a sinistra c'è un sistema a microcontroller compatibile con Arduino e simile ad Arduino Nano. Sul lato destro c'è il modulo WLAN con l'etichetta ESP8266,
Questi due componenti comunicano per mezzo di un'interfaccia seriale generata tramite software.
La scheda NanoESP sulla breadboard
Disposizione dei pin della scheda
Sulla scheda sono presenti molti elementi diversi, come ad esempio i pin, alcuni dei quali hanno una funzione speciale, o anche i LED le cui funzioni non sono sempre evidenti a prima vista. La figura seguente offre una panoramica delle funzioni e degli identificatori principali dei singoli elementi.
I pin e gli identificatori più importanti della scheda
Il modulo WLAN è controllato dai cosiddetti comandi AT. La parte Arduino della scheda è quindi collegata al modulo WLAN tramite i pin 11 e 12. Un piccolo circuito converte il livello di 5 V nel livello compatibile di 3,3 V. I pin 11 e 12 non devono essere utilizzati nei propri progetti.
Altre importanti caratteristiche hardware della scheda sono elencate brevemente nella tabella seguente.
Specifiche tecniche
Microcontroller: ATmega328 Memoria Flash 32 KB (di cui 0,5 KB per il bootloader) SRAM: 2 KB EEPROM 1 kB Frequenza di clock: 16 MHz Pin di I/O: 20 (di cui 2 per la comunicazione con il modulo
WLAN)
U
di cui PWM: 6
U
di cui ingressi analogici: 6
Chip USB-seriale: CH340G Tensione di esercizio: 5 V Tensione in ingresso consigliata: 7-12 V Corrente massima per pin di I/O: 40 mA Resistenza uscita da 3,3 V: 50 mA
Modulo WLAN: ESP8266 SPI-Flash 4 Mbit Tensione di esercizio: 3,3 V Standard WLAN: 802.11 b/g/n Modalità WLAN: Wi-Fi Direct (P2P), Soft-AP Firmware: Firmware AT versione 00:22 Varie: Stack TCP/IP integrato Potenza di uscita di 19,5 dBm in modalità 802.11b CPU a 32 bit integrata a bassa potenza Comunicazione tramite UART
COMPONENTI DEL KIT DI APPRENDIMENTO
Di seguito viene offerta una panoramica dei componenti inclusi nel kit di apprendimento.
1 Scheda WiFi per IoT (NanoESP) 1 Breadboard 1 m Filo di collegamento 2 Pulsanti 1 Clip da 9V 1 LED (rosso) 1 LED RGB (4 terminali) 1 Resistenza da 10 kOhm (marrone-nero-arancio) 1 Resistenza da 1 kOhm (marrone-nero-rosso) 1 Fototransistor (2 terminali) 1 NTC da 10 kOhm 1 Altoparlante piezoelettrico 1 Potenziometro da 10 kOhm con pomello rosso
DESCRIZIONE DEL MODULO
In questo primo capitolo vengono descritte le funzioni base del modulo WLAN. Il modulo è controllato dai cosiddetti comandi AT. Tutti i programmi di esempio qui utilizzati, così come la guida e ulteriori informazioni sono reperibili sul sito
www.iot.fkainka.de
Il modo più semplice è quello di scaricare l'intera cartella compressa (.zip), quindi copiarla e decomprimerla nella propria cartella dei disegni. Quindi è possibile aprire facilmente tutti i programmi uno dopo l'altro dall'interfaccia Arduino.
1.1
|
Comandi AT base
Una prima impressione sull'uso dei comandi AT si ottiene semplicemente provandoli. Ecco perché in questa sezione vengono descritti alcuni dei comandi base del modulo.
Aprire il programma P01_SoftwareSerial nell'IDE di Arduino. Si tratta di un programma molto semplice, che non fa altro che filtrare tutti i dati ricevuti tramite
l'interfaccia hardware seriale del microcontroller attraverso l'interfaccia software definita dall'utente sul controller ESP. Il tutto funziona anche in senso inverso. Come si può vedere nel codice sorgente, le due connessioni dell'interfaccia software sono i pin 11 e 12. Questi non devono essere utilizzati come pin GPIO nei propri progetti. È inoltre necessaria la libreria di software seriale, già
installata sulla maggior parte delle versioni di Arduino – in caso contrario, scaricarla.
Una volta che il programma è stato caricato, è possibile avviare il monitor seriale dell'interfaccia di Arduino. Prima di procedere, è necessario effettuare ancora due importanti impostazioni sul monitor seriale, ovvero, nell'angolo in basso a destra selezionare il baudrate di 19200 e nella casella a sinistra selezionare CR e NL.
Ora si può già vedere un messaggio, vale a dire AT e poche righe sotto OK. Il comando AT è stato inviato dal microcontroller al modulo ESP e il modulo ha risposto con OK. In questo modo viene indicato che il modulo WLAN funziona ed è pronto all'uso.
Impostazioni del terminale: CR e NL e una velocità di trasmissione di 19200 baud
1.1.1 | Comandi base
Per testare alcuni comandi base del modulo, è sufficiente digitare il comando e premere
[Enter]
per inviarlo al modulo. Viene fatta distinzione tra lettere
maiuscole e minuscole. È possibile inviare il primo comando digitando
AT
sul monitor seriale e premendo
[Enter]
. Il programma caricato inoltra il comando al modulo ESP, che a sua volta risponde con AT e quindi con OK. Il comando successivo che è possibile testare è:
AT+GMR
Tramite questo comando è possibile visualizzare il firmware attuale e il numero di versione.
Tramite il comando
AT+RST
è possibile ripristinare il modulo. Il terminale visualizza alcuni caratteri incomprensibili e alla fine la parola ready per indicare che il modulo è pronto. Un altro comando è:
ATE0
Esso consente di disattivare la cosiddetta eco del modulo. Questo significa che il comando inviato non viene ritrasmesso, ma si riceve solo la risposta. Per esempio, se si invia il comando AT, non si riceve prima AT e dopo OK, ma solo OK. Per i primi tentativi, è consigliabile riattivare l'eco con
ATE1
.
Primi test con i comandi AT
1.1.2 | Comandi WLAN
I seguenti comandi WLAN consentono di modificare le funzioni WLAN del modulo. Per alcuni comandi è possibile non solo definire uno stato, ma anche controllare lo stato attuale. Questo viene fatto inserendo un punto interrogativo immediatamente dopo il comando, per esempio
AT+CWMODE?
Il valore di ritorno è in genere
+CWMODE=2
seguito da OK. Se si immette
AT+CWMODE=?
il modulo risponde con i possibili parametri del comando, in questo caso 1-3.
CWMODE è il comando tramite il quale è possibile impostare la modalità WLAN. Tre sono le modalità operative, descritte nel seguente ordine.
1
AT+CWMODE=2 – il modulo come un punto di accesso (modalità AP)
Al momento della consegna, il modulo è un access point. Ciò significa che è possibile abilitare una connessione diretta con il modulo tramite un dispositivo che supporta la WLAN, come per esempio uno smartphone o un PC. È sufficiente cercare la rete WLAN aperta denominata NanoESP e collegarsi ad essa. In condizioni di lavoro non viene assegnata alcuna password, in modo che la connessione sia agevole. Se quando si è collegati al modulo non si ha alcuna connessione a Internet, significa che il modulo non è un router con una connessione propria alla rete telefonica. Questa modalità WLAN è comunque utile se per esempio è necessaria una rete sicura e chiusa. A proposito di sicurezza: Vi è anche la possibilità di assegnare una password alla rete tramite il comando:
AT+CWSAP
Qui devono ancora essere specificati i parametri, in sequenza e separati dalla virgola:
U
il nome della rete tra virgolette,
U
la password tra virgolette,
U
l'ID del canale (un valore qualsiasi tra 1 e 13),
U
e la modalità di crittografia (0-4).
Un'impostazione possibile sarebbe:
AT+CWSAP="MyNanoESP","MyPassword",5,3
Dopo qualche istante compare OK come conferma. Se viene visualizzato ERROR, immettere nuovamente il comando facendo attenzione alle virgolette. Se compare di nuovo la scritta ERROR, verificare se CWMODE è realmente 2.
Quando tutto funziona, è possibile collegarsi alla scheda tramite un dispositivo abilitato per la WLAN. Tutti i dispositivi collegati al modulo possono essere visualizzati con l'indirizzo IP e MAC utilizzando il comando
AT+CWLIF
.
Il modulo in modalità Station. L'IP del computer collegato è evidenziato.
2
AT+CWMODE=1 – il modulo in modalità Stazione
Tramite il comando
AT+CWMODE=1
è possibile impostare il modulo in modalità Station. Questa modalità consente il collegamento al router WLAN. Il modulo viene così collegato anche a Internet e dispone di molte più opzioni.
Prima però occorre elencare tutte le reti presenti nel raggio di ricezione tramite il comando
AT+CWLAP
e quindi verificare se la propria rete è presente. Per poter stabilire una connessione con router, è necessario il comando
AT+CWJAP
Anche questo, come il comando CWSAP, ha parametri importanti, vale a dire il
nome della rete WLAN (chiamata anche SSID) e la password, entrambi racchiusi tra virgolette e separati da una virgola. Una connessione a un secondo modulo, impostato con i dati descritti nella sezione precedente sarebbe simile a questa:
AT+CWJAP="MyNanoESP","MyPassword"
La connessione può richiedere alcuni secondi e poi dovrebbe restituire OK. Tra l'altro si può richiamare dal router l'indirizzo IP assegnato del modulo tramite il comando
AT+CIFSR
. Questo sarà importante successivamente, quando si vorrà stabilire un collegamento al server TCP del modulo. Tramite il comando
AT+CWQAP
è anche possibile disattivare nuovamente il collegamento dal router.
La scheda stabilisce una connessione a un secondo NanoESP.
3
AT+CWMODE=3 – la doppia modalità
La terza opzione possibile delle impostazioni WLAN è la doppia modalità che, come suggerisce il nome, consente il funzionamento del modulo sia in modalità Station che AP. Questo significa che i dispositivi possono stabilire sia una connessione WLAN diretta con il modulo oppure raggiungere il modulo come stazione intermedia attraverso il router. Un'opzione utile, per esempio, quando si pianifica una rete interna con più moduli, uno dei quali deve fungere da server che fornisce i dati alla rete. Ma questa soluzione verrà descritta più avanti.
1.2 |
Configurazione automatica
I comandi base possono essere già testati manualmente. Questo capitolo affronta solo la questione di come possono essere eseguiti automaticamente tramite il controller. Viene descritto un ulteriore comando che consente di verificare se è possibile raggiungere un PC collegato in rete o un server in Internet. In questo esempio viene eseguito il ping al server di Google. Nel programma di esempio P02_GooglePing le operazioni eseguite manualmente nel primo esempio ora vengono in gran parte automatizzate. Il controller invia comandi in successione al modulo ESP e crea quindi, tra l'altro, la connessione alla rete WLAN. I diversi timeout offrono al modulo il tempo sufficiente per rispondere.
Affinché il programma possa funzionare correttamente, è necessario registrare i dati della WLAN dopo #define SSID e PASSWORD #define all'inizio del codice sorgente del programma. Il modulo richiede l'accesso a Internet per poter eseguire il suo ultimo comando. Tramite il comando
AT+PING
è possibile eseguire il ping ad altri dispositivi sulla rete. Il ping è il segnale che indica l'accessibilità generale di un computer. In questo caso al server di Google viene inviato il comando AT+PING="www.google.de". Quando torna indietro la risposta del server, sul monitor seriale viene visualizzato un messaggio di conferma e il LED identificato con D3 sul pin D13 della scheda collegata si accende. La prima comunicazione con Internet è stata stabilita.
Il programma
Di seguito vengono analizzate passo passo le funzioni del programma. Per iniziare
Panoramica dei comandi nell'appendice e sul sito web
Tutti i comandi importanti sono comunque reperibili nell'appendice e sul sito web www.iot.fkainka.de. Alcuni comandi, come per esempio l'impostazione della velocità
viene descritta la comunicazione con il modulo.
1
Comunicazione seriale
La comunicazione avviene tramite l'interfaccia software seriale fornita insieme alla libreria SoftwareSerial. Durante l'inizializzazione è necessario specificare anche i pin utilizzati, in questo caso, 11 e 12.
001
#include <SoftwareSerial.h>
002
SoftwareSerial esp8266(11, 12);
Proprio come nel caso di un'interfaccia seriale normale, tramite i comandi esp8266.print o esp8266.println si possono trasmettere byte o intere righe. Particolarmente utili sono i comandi esp8266.find e esp8266.findUntiltramite i quali è possibile controllare il flusso in entrata per determinate stringhe. Questo rende molto facile intercettare la risposta appropriata del modulo. Tuttavia, se non arriva una stringa prevista, la ripresa del programma può richiedere del tempo. Il tempo di attesa (timeout) viene definito tramite esp8266.setTimeout. Con findUntil() si può tuttavia definire una seconda stringa che abbandona la funzione di ricerca e restituisce "false" come valore di ritorno. Questo è utile nella funzione sendCom ():
001
//-------Controll ESP--------
002
003
boolean sendCom(String command, char respond[])
004
{
005
esp8266.println(command);
006
if (esp8266.findUntil(respond, "ERROR"))
007
{
008
return true;
009
}
010
else
011
{
012
debug("ESP SEND ERROR: " + command);
013
return false;
014
}
015
}
Quando si richiama la funzione, è quindi necessario passare ad essa anche il comando e il valore di ritorno previsto, per esempio AT e OK. Tramite println() il comando viene trasmesso e si attende fino a quando viene ricevuto il valore di ritorno previsto o il messaggio ERROR. Se l'attesa viene soddisfatta, la funzione restituisce il valore "true". In caso contrario, il modulo invierà tramite la funzione debug()-un messaggio ESP SEND ERROR e restituirà il comando inviato in modo che sia possibile controllare facilmente quale comando sta causando problemi.
Non tutti i comandi AT hanno un valore di ritorno univoco o di una singola riga. Se per esempio viene richiesto l'indirizzo IP, in genere non esiste un valore precedentemente noto. Pertanto, esiste una seconda funzione sendCom() che richiede solo il parametro command e restituisce l'intera stringa ricevuta. Tale stringa tuttavia non dovrebbe essere troppo lunga, in quanto il buffer dell'interfaccia SoftwareSerial può andare in overflow.
001
String sendCom(String command)
002
{
003
esp8266.println(command);
004
return esp8266.readString();
005
}
2
Risoluzione dei problemi
Lo sviluppo di programmi spesso implica errori e complicazioni. Esistono quindi due funzioni di debug che vengono attivate o disattivate tramite un parametro proprio all'inizio del programma.
#define DEBUG true
La prima funzione non rappresenta più un'edizione semplificata del testo tramite l'interfaccia seriale definita come standard. Se la costante DEBUG è vera, viene inviato il contenuto della stringa Msg.
001
void debug(String Msg)
002
{
003
if (DEBUG)
004
{
005
Serial.println(Msg);
006
}
007
}
La seconda funzione è altrettanto semplice. Se viene richiamata la funzione serialDebug, il programma entra in un loop infinito e da quel momento in poi si comporta come il primo programma SoftwareSerial testato. Ciò significa che tutti i dati che vengono inviati al controller tramite il monitor seriale saranno inoltrati direttamente al modulo e viceversa. In caso di errore, è possibile richiamare la funzione e inviare i comandi manualmente per verificare dove si trova l'errore.
001
//---Debug Functions---
002
void serialDebug() {
003
while (true)
004
{
005
if (esp8266.available())
006
Serial.write(esp8266.read());
007
if (Serial.available())
008
esp8266.write(Serial.read());
009
}
010
}
3
Configurazione
Per rendere i programmi generalmente più chiari, la maggior parte delle impostazioni è stata separata in funzioni proprie, soprattutto la funzione espConfigi n cui vengono impostati i parametri più importanti per il programma.
001
//---Config ESP8266---
002
boolean espConfig()
003
{
004
boolean success = true;
005
esp8266.setTimeout(5000);
006
success &= sendCom("AT+RST", "ready");
007
esp8266.setTimeout(1000);
008
009
if (configStation(SSID, PASSWORD)) {
010
success &= true;
011
debug("WLAN Connected");
012
debug("My IP is:");
013
debug(sendCom("AT+CIFSR"));
014
}
015
else
016
{
017
success &= false;
018
}
019
020
success &= sendCom("AT+CIPMODE=0", "OK");
021
success &= sendCom("AT+CIPMUX=0", "OK");
022
023
return success;
024
}
All'inizio della funzione la variabile success viene prima impostata su true, perché ora viene collegata a varie funzioni AND. Ciò significa che se anche solo una delle funzioni restituisce il valore false, success diventa subito false e l'intera configurazione non va a buon fine. Il primo comando AT di cui viene controllata la corretta esecuzione è reset, eseguito quasi sempre all'inizio del programma per garantire che i tentativi precedenti non abbiano ancora raggiunto il modulo. Tuttavia, possono essere necessari fino a cinque secondi affinché il modulo restituisca il messaggio ready. Pertanto poco prima della funzione sendCom()viene impostato un timeout elevato per esp8266.findUtil. Dopo il reset il timeout viene reimpostato sul valore predefinito di un secondo.
Successivamente viene richiamata una funzione definita dall'utente, denominata configStation(), descritta nella prossima sezione. Questa funzione consente di collegare il modulo alla rete domestica. Pertanto vengono trasmessi i parametri SSID e PASSWORD , inseriti all'inizio del programma. Una volta che la connessione è stata stabilita, il relativo messaggio e infine l'IP corrente del modulo vengono trasmessi al monitor seriale. Alla fine della funzione vengono utilizzati ancora dei parametri, che verranno trattati più avanti. Infine viene restituita la variabile success che si spera abbia mantenuto il valore true.
001
boolean configStation(String vSSID, String vPASSWORT)
002
{
003
boolean success = true;
004
success &= (sendCom("AT+CWMODE=1", "OK"));
005
esp8266.setTimeout(20000);
006
success &= (sendCom("AT+CWJAP=\"" + String(vSSID) + "\",\"" + String(vPASSWORT) + "\"", "OK"));
007
esp8266.setTimeout(1000);
008
return success;
009
}
La funzione configStation() è stata richiamata nella funzione espConfig(). Qui viene eseguita l'impostazione della modalità WLAN sulla modalità Station tramite il comando CWMODE e infine la connessione alla rete tramite il comando CWJAP. La connessione può richiedere un po' di tempo, ragione per cui il timeout è stato aumentato a 20 secondi. Qualora si preferisca la modalità WLAN doppia, per CWMODE qui è possibile immettere 3.
001
boolean configAP()
002
{
003
boolean success = true;
004
005
success &= (sendCom("AT+CWMODE=2", "OK"));
006
success &= (sendCom("AT+CWSAP=\"NanoESP\",\"\",5,0", "OK"));
007
008
return success;
009
}
In questo esempio la funzione configAP() non viene richiamata, ma è comunque opportuno descriverla brevemente. Essa rappresenta, per così dire, la controparte della funzione configStation()poiché qui il modulo viene impostato come access point. Non è necessario un timeout più lungo, in quanto il modulo è in grado di elaborare il comando CWSAP molto più velocemente. Nei tentativi successivi, nella funzione espConfig()al posto della funzione configStation() viene richiamata la funzione configAP().
001
void setup()
002
{
003
// Open serial communications and wait for port to open:
004
Serial.begin(19200);
005
// set the data rate for the SoftwareSerial port
006
esp8266.begin(19200);
007
008
if (!espConfig()) serialDebug();
009
else debug("Config OK");
010
011
if (sendCom("AT+PING=\"www.google.de\"", "OK"))
012
{
013
Serial.println("Ping OK");
014
digitalWrite(13, HIGH);
015
}
016
else
017
{
018
Serial.println("Ping Error");
019
}
020
}
021
022
void loop() // run over and over
023
{
024
//Start serial Debug Mode - Type Commandos over serial Monitor
025
serialDebug();
026
}
Vengono trattate le funzioni più importanti presenti in quasi tutti i programmi. Nelle note funzioni Arduino setup() e loop() ora vengono utilizzate queste funzioni. In primo luogo, tuttavia, vengono inizializzate le due interfacce seriali con 19200
baud. Solo a questo punto viene richiamata la funzione espConfig(). In caso di guasto viene avviata immediatamente la funzione serialDebug(). Se tutto funziona correttamente, viene inviato il relativo messaggio. Nei programmi successivi il LED sul pin 13, contrassegnato sulla scheda con D3, si accende se la configurazione è stata eseguita correttamente. Si dispone così di un feedback, se il modulo non è collegato a un PC con il monitor seriale. In questo esperimento il LED è comunque necessario per il feedback dello stato di ping. La query è uguale anche nella riga successiva dopo la configurazione. Il comando AT+PING con l'indirizzo Google viene inviato come parametro. Anziché questo indirizzo, si potrebbe eseguire una query su un indirizzo IP della rete locale. Se la query viene eseguita correttamente, viene visualizzato un messaggio e il LED D3 viene attivato. Come azione finale, il programma passa alla funzione loop che a sua volta richiama la funzione serialDebug(). È quindi possibile verificare ulteriori comandi a seconda del programma e, per esempio, eseguire il ping su altri indirizzi.
1.3 | Rilevamento di una rete
In questo capitolo, tra le altre cose, viene esaminata per la prima volta una configurazione hardware più piccola. Scopo del progetto è un tipo di impianto di allarme che risponde quando una particolare rete entra nel raggio di copertura o viene attivata.
Vengono utilizzati solo due componenti e del filo. La struttura precisa è riportata nelle relative figure.
Componenti necessari
1 breadboard, 1 scheda NanoESP, 1 elemento
Collegamento dell'altoparlante piezoelettrico
Il codice sorgente per questo progetto è diverso da quello dell'esperimento precedente soprattutto per quanto riguarda le seguenti funzioni:
001
void findSSID()
002
{
003
esp8266.println("AT+CWLAP");
004
if (esp8266.findUntil(ToFindSSID,"OK")) alarm();
005
else debug("SSID not found!");
006
}
007
008
void alarm()
009
{
010
debug("alarm!");
011
012
digitalWrite(LED_ALARM, HIGH);
013
014
for (int i; i <=30; i++)
015
{
016
tone(PIEZO, 400, 500);
017
delay(500);
018
tone(PIEZO, 800, 500);
019
delay(500);
020
}
021
022
digitalWrite(LED_ALARM, LOW);
023
}
La funzione findSSID() viene richiamata circa ogni 30 secondi nella routine loop e cerca tutte le reti nella zona. Se viene trovata la rete desiderata, viene attivata la funzione alarm() che accende il LED D3 ed emette un segnale acustico sul componente piezoelettrico. Nel programma di esempio viene cercata una rete con SSID NanoESP , quindi sostanzialmente altre reti NanoESP nel raggio di copertura. Ma all'inizio del programma, in corrispondenza di #define ToFindSSID , si può semplicemente immettere un SSID diverso. Ciò consente di verificare, per esempio, qual è la portata della propria WLAN.
UDP E IP
Questo capitolo descrive lo scambio di dati di base tra due sistemi su una rete WLAN. Verranno trattati argomenti quali indirizzi IP, porte e protocollo UDP. Questi concetti fondamentali devono essere spiegati prima.
Che cos'è un indirizzo IP?
Un indirizzo IP è simile a un indirizzo postale e consente di identificare e indirizzare un computer in rete in modo univoco. Un indirizzo IP, in base allo standard IPv4 ancora diffuso, per esempio ha il seguente aspetto:
192.168.4.1
È composto da quattro numeri, o più specificamente quattro byte. Questo significa
quindi che il valore di un numero può essere al massimo 255. Fondamentalmente esistono indirizzi IP locali, ossia che ad esempio vengono distribuiti sul computer e sui dispositivi della rete domestica, e IP globali.
Gli IP locali sono di solito distribuiti dal router. In genere iniziano con i numeri
192.168. I numeri che seguono variano da router a router. Se NanoESP funge da access point e aggancia computer nella propria rete, i PC ricevono un indirizzo che inizia con 192.168.4. In questo modo viene bloccata anche una sotto-rete. In genere i router Fritz!Box distribuiscono gli indirizzi IP locali secondo lo schema
192.168.178.X. Si può conoscere il proprio indirizzo IP, per esempio, in Windows immettendo nella riga di comando (sotto Start -> Programmi -> Accessori -> Riga di comando) il comando ipconfig. Viene visualizzato un elenco più lungo che contiene anche il punto Indirizzo IPv4 con l'IP della rete locale.
Gli indirizzi IP globali di solito vengono assegnati dal provider di Internet. Si tratta, per esempio, dell'indirizzo che può essere raggiunto tramite il router nella rete globale. Il router estende la rete locale e distribuisce i dati ai client. Un modo per conoscere il proprio IP globale per esempio, è consultare il sito web
http://www.meine-aktuelle-ip.de/. Sul sito vengono rappresentati anche altri
dati visualizzabili da un server web. Quindi su Internet non sono poi così anonimi come si potrebbe pensare.
Che cos'è una porta?
In analogia con un indirizzo postale, una porta potrebbe essere simile alla porta d'ingresso di un condominio. Un computer con un indirizzo IP univoco è in grado di fornire vari servizi attraverso varie porte. È possibile accedere al server tramite l'indirizzo IP, ma attraverso la porta è necessario selezionare anche il servizio da utilizzare. Può trattarsi per esempio della porta 20 per la trasmissione dei dati FTP oppure della porta 23 per una connessione Telnet. In genere la porta può essere scelta liberamente, ma alcune porte standard rendono più facili le applicazioni web. Per un elenco di porte standard, vedere
https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports
Che cos'è UDP?
UDP è l'abbreviazione di User Datagram Protocol. È un protocollo di rete minimo, senza connessione. Cioè, in sostanza, è più semplice da utilizzare rispetto ad altri protocolli Internet, come per esempio TCP, che verrà descritto più avanti. Il confronto non è particolarmente facile in questo momento, ma si possono annotare le proprietà di questo protocollo:
U
UDP supporta il broadcasting.
U
Non vi è alcuna verifica della correttezza dei dati e non viene eseguita
alcuna correzione degli errori.
U
Quindi non vi è alcuna garanzia che i dati siano stati trasmessi
correttamente.
U
Non vi è inoltre alcuna garanzia che durante il trasferimento i dati
vengano non danneggiati o intercettati da terzi.
U
Non prevede una sola connessione, bensì è possibile lo scambio
veloce dei dati.
U
Ci sono poche variazioni nel ritardo di trasmissione.
U
Il formato, per esempio, è adatto per il VoIP (Voice over IP - cioè le
chiamate via Internet).
Questi sono solo i principi fondamentali più importanti per la descrizione dei concetti dei progetti seguenti. L'argomento potrebbe essere trattato in modo ancora più approfondito, e al momento opportuno saranno fornite ulteriori informazioni. Ma per prima cosa, esaminiamo la parte pratica.
2.1 | Scambio di dati tra scheda e PC tramite UDP
In questo primo progetto sul tema UDP vengono scambiati dati tra la scheda e il PC tramite la WLAN. Il prerequisito è che il computer disponga di una scheda di rete WLAN. Un programma sul lato PC assicura la corretta ricezione dei messaggi. In questo esperimento non è necessaria una configurazione hardware speciale.
Il programma
Se si carica il programma P04_UDPBasics.ino sul controller, quest'ultimo viene configurato come access point, ed è possibile individuare una rete aperta denominata NanoESP. Tuttavia, prima di collegarsi alla rete, è necessario scaricare da Internet un programma per il PC. Negli esperimenti condotti è stato utilizzato il programma Packet Sender di Dan Nagle, che può essere scaricato al seguente link:
https://packetsender.com/ Dopo aver scaricato e installato il programma, è possibile collegare il PC alla rete
aperta di NanoESP. Assicurarsi che il firewall rilevi la rete come una rete domestica e non blocchi i dati. Il computer dovrebbe ora aver ricevuto l'indirizzo IP
192.168.4.2. È possibile verificarlo inviando il comando AT
AT+CWLIF
al modulo tramite il monitor seriale. Questo comando consente di visualizzare tutti i computer collegati all'access point con l'indirizzo IP e MAC.
Ora avviare Packet Sender, sotto Settings -> Network impostare la UDP Server Port su 90 e cliccare sulla casella di controllo Enable UDP Server. Di solito in basso a sinistra dovrebbe trovarsi UDP: 90. In caso contrario, è necessario riavviare il software, ancora una volta.
Le impostazioni corrette nel programma Packet Sender
Il programma sul computer ora serve come server UDP, mentre il controller è impostato come client UDP. Nel protocollo UDP la distinzione client/server non è chiara, ma in questo caso significa che è possibile inviare i dati al computer tramite il controller.
Il messaggio è stato trasmesso correttamente.
Per inviare i dati, utilizzare il comando:
AT+CIPSEND=7
7 indica il numero dei caratteri da inviare. Viene visualizzato il carattere> come valore di ritorno. Questo significa che ora è possibile trasmettere il messaggio. Immettere Hello e confermare ancora con
[Enter]
, Come valore di ritorno il modulo invia SEND OK, anche se sono stati immessi solo cinque caratteri. Questo perché dopo l'immissione vengono inviati anche Carriage Return e New Line, quindi due caratteri in più, che devono essere considerati nella lunghezza del messaggio.
Se si passa di nuovo a Packet Sender e si osserva sotto Traffic Log, si può vedere l'immissione del messaggio. Nella visualizzazione ASCII si possono vedere anche i due segni inviati, rappresentati da \ r e \n.
Il messaggio è stato ricevuto da Packet Sender.
001
boolean configUDP()
002
{
003
boolean success = true;
004
005
success &= (sendCom("AT+CIPMODE=0", "OK"));
006
success &= (sendCom("AT+CIPMUX=0", "OK"));
007
success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2\",90", "OK"); //UDP-Server
008
return success;
009
}
Nel programma Arduino, per il percorso di comunicazione è fondamentale la funzione configUDP(). Qui vengono eseguite impostazioni importanti per la trasmissione. In primo luogo, la modalità di trasparenza dei dati viene impostata con CIPMODE su 0. Infine, con CIPMUX=0 si stabilisce che venga ammessa una sola connessione. Il comando chiave è CIPSTART, che permette di stabilire una connessione sull'indirizzo IP 192.168.4.2 quindi ascoltare il proprio PC, e la porta 90 sul programma Packet Sender con il server UDP. Questi sono i passi iniziali necessari per stabilire una prima comunicazione.
2.2 | Invio e ricezione dei dati con UDP
Nel progetto precedente la comunicazione UDP è stata testata in una direzione, vale a dire dalla scheda al PC. In questo programma il modulo è impostato in modo che sia possibile anche la comunicazione nella direzione opposta, quasi come in una chat.
Il programma
Il programma prevede essenzialmente solo un cambiamento minimo, ma che ha un grande effetto sulla comunicazione tramite il protocollo UDP. Quando si carica il programma, viene nuovamente creato un access point che può essere collegato al PC. Anche in questo caso è necessario utilizzare Packet Sender o un programma simile. Avviare il programma e utilizzare le stesse impostazioni di prima (File -> Settings -> Network: Enable UDP Server, Port 90). Nella finestra principale, nel campo IP Address , è necessario immettere l'indirizzo del modulo (192.168.4.1), configurare Port su 91 e nel menu a discesa ancora più a destra selezionare UDP. Se queste impostazioni vengono effettuate e il monitor seriale è aperto, è possibile inviare il primo messaggio al modulo, per esempio Hi immettendolo nel campo ASCII.
Se si clicca su Send, sul monitor seriale viene visualizzato:
Loading...
+ 58 hidden pages