Conrad 10215 Operation Manual [nl]

VOOR U BEGINT
Wanneer u het IoT-WiFi-Board (hierna ook NanoESP- genoemd) voor het eerst aansluit, kan het gebeuren dat de computer de vereiste driver voor de USB-to-Serial-omzetter niet automatisch vindt. Als dit het geval is, dient u de driver van de pagina www.iot.fkainka.de/driver te downloa-
Om met de seriële monitor te werken, moet u eveneens instellingen uitvoeren. Als Baudrate wordt hier 19200 Baud gebruikt. Om bevelen te versturen moet u bo-
vendien de optie CR en NL naast het menu voor de Baudrate selecteren.
De juiste instellingen in de Arduino-omgeving
Ik heb met de Arduino-IDE-versies 1.6.5. - 1.6.6. gewerkt. Oudere versies kunnen problemen veroorzaken. De huidige versie vindt u op de website
www.arduino.cc.
Bij moeilijkheden of problemen met het board of het leerpakket kunt u op elk mo­ment op de website www.iot.fkainka.de hulp vinden. Op deze website vindt u
bovendien een forum, nieuwe gebruikersprojecten en ook alle hier voorgestelde programma's in de meest recente versie.
In het leerpakket bevindt zich een breadboard waarop u de NanoESP, kunt aansluiten, zoals getoond in de onderstaande afbeelding. Daar­door blijft de meeste plaats voor experimenten terwijl de WLAN-module achteraan boven het breadboard uitsteekt. De micro-USB-kabel kan dan worden aangeslo­ten, zoals getoond op de afbeelding in het volgende hoofdstuk, en stoort slechts minimaal. Gedetailleerde opbouwafbeeldingen vindt u in het overeenkomstig hoofdstuk.
Het IoT-WiFi- Board (NanoESP)
Het hoofdelement van dit leerpakket is het IoT-WiFi-Board (NanoESP). Zoals men aan de platine zeer goed kan herkennen, bestaat het board uit twee onderdelen. Bij de linkerhelft gaat het om een Arduino-compatibel microcontrollersysteem dat met de Arduino Nano vergelijkbaar is. Het rechterdeel is de WLAN-module met de omschrijving ESP8266.
Deze beide componenten communiceren met elkaar via een door software gege­nereerde seriële interface.
De NanoESP op het breadboard
De pin-lay-out van het board
Op het board zijn er veel verschillende elementen, zoals bv. de pins, waarvan enkele een bijzondere functie hebben of de LED's, wier functies niet altijd op het eerste zicht zichtbaar zijn. Opdat u het overzicht niet verliest, zijn de belangrijkste functies en omschrijvingen van de afzonderlijke elementen in de volgende afbeel­ding aangebracht.
De belangrijkste pins en omschrijvingen van het board
De WLAN-module wordt via zogenaamde AT-commando's gestuurd. Daarvoor is het Arduino-deel van het board via pins 11 en 12 met de WLAN-module verbon­den. Een kleine schakeling zet het 5 V-niveau in een compatibel 3,3 V-niveau om. Pins 11 en 12 mag u dus niet in eigen projecten gebruiken.
Verdere belangrijke hardware-eigenschappen van het board vindt u in de onderste tabel kort opgelijst.
Technische gegevens
Microcontroller: ATmega328 Flashgeheugen: 32 kB (waarvan 0,5 kB voor de bootloader) SRAM: 2 kB EEPROM: 1 kB Kloksnelheid: 16 MHz I/O-pins: 20 (waarvan 2 voor de communicatie met de
WLAN-module)
U
waarvan PWM: 6
U
waarvan analoge ingangen: 6
USB-to-Serial-chip: CH340G Bedrijfsspanning: 5 V Aangewezen ingangsspanning: 7 – 12 V Maximale stroom pre I/O-pin: 40 mA Belastbaarheid van de 3,3 V-uitgang: 50 mA
WLAN-module: ESP8266 SPI-flash 4 Mbit Bedrijfsspanning: 3,3 V WLAN-standaarden: 802.11 b/g/n WLAN-modi: Wi-Fi Direct (P2P), soft-AP Firmware: AT-firmware versie 0.22 Overige: Geïntegreerde TCP/IP-stack +19,5 dBm uitgangsvermogen in de 802.11b-modus
Geïntegreerde low-power-32-bit-CPU Communicatie via UART
ELEMENTEN IN HET LEERPAKKET
Hieronder vindt u een overzicht van de elementen die zich in het leerpakket bevin­den.
1 IoT-WiFi-Board (NanoESP) 1 breadboard 1 m draadbrug 2 knoppen 1 9V-clip 1 LED (rood) 1 RGB-LED (4 contactpennen) 1 weerstand 10 kOhm (bruin-zwart-oranje) 1 weerstand 1 kOhm (bruin-zwart-rood) 1 fototransistor (2 contactpennen) 1 NTC 10 kOhm 1 Piezo-luidspreker 1 potentiometer 10 kOhm met rode draaiknop
DE MODULE LEREN KENNEN
In dit eerste hoofdstuk gaat het om de algemene werking van de WLAN-module. De module wordt via zogenaamde AT-commando's gestuurd. Alle hier gebruikte
voorbeeldprogramma's, hulp en andere informatie vindt u overigens op
www.iot.fkainka.de
Het makkelijkst is om het volledige zip-bestand te downloaden en de uitgepakte map in uw sketch-map te kopiëren. Dan kunt u uit het Arduino-oppervlak alle pro­gramma's makkelijk na elkaar openen.
1.1
|
Algemene AT-bevelen
Men krijgt de beste eerste indruk van het gebruik van AT-bevelen door ze gewoon uit te proberen. Daarom leert u in dit hoofdstuk enkele van de algemene bevelen kennen.
Open hiervoor het programma P01_SoftwareSerial in de Arduino-IDE. Het gaat om een zeer eenvoudig programma dat niets meer doet dan alle gegevens die via
de seriële hardware-interface van de microcontroller worden ontvangen, via de zelf gedefinieerde software-interface naar de ESP-controller door te geven. Het geheel werkt ook in omgekeerde richting. Zoals men in de brontekst kan zien, zijn beide aansluitingen van de software-interface pins 11 en 12. Deze moeten in ei­gen projecten niet als GPIO-pins worden gebruikt. U hebt bovendien de Softwa-
reSerial-Library, nodig die bij de meeste Arduino-versies reeds voorgeïnstal-
leerd is – indien niet, moet u de library via de manager downloaden.
Nadat het programma werd geüpload, kunt u de seriële monitor van het Arduino­oppervlak starten. Voor u kunt starten, moet u nog twee belangrijke instellingen aan de Serial Monitor uitvoeren, namelijk rechtsonder in de hoek de Baudrate op
19200 instellen en in de box links daarnaast de instelling CR en NL uitvoeren.
Nu kunt u reeds een bericht zien, namelijk AT en een paar regels daaronder OK. Het commando AT werd door microcontroller naar de ESP-module verzonden en de module heeft met OK geantwoord. Hieraan kunt u herkennen dat de WLAN­module werkt en gebruiksgereed is.
Terminal-instellingen CR en NL en een Baudrate van 19200
1.1.1 | Basisbevelen
Enkele algemene bevelen van de module kunt u nu testen door het commando gewoon in te tikken en met
[Enter]
naar de module te zenden. Het is daarbij van belang om hoofdletters te gebruiken voor het bevel. U kunt uw eerste eigen bevel aanmaken door
AT
in de seriële monitor in te tikken en op
[Enter]
te drukken. Het opgeladen pro-
gramma geeft het bevel opnieuw naar ESP-module door, dat opnieuw met AT en daarna OK antwoordt. Het volgende bevel dat u kunt testen, luidt:
AT+GMR
Met dit bevel worden de huidige firmware en het versienummer weergegeven. Met het bevel
AT+RST
kunt u de module terugzetten. U ziet dan in de terminal eerst een paar onleesbare tekens en op het einde ready als teken dat de module nu gereed is Een ander bevel luidt:
ATE0
Hiermee is het mogelijk om de zogenaamde echo van de module te deactiveren. Dit betekent dat u niet wilt dat het verzonden commando wordt teruggestuurd, maar alleen het antwoord. Wanneer u bijvoorbeeld AT verzendt, komt niet eerst AT en dan OK, maar alleen OK terug. Voor uw eerste passen is het echter aan­gewezen om de echo met
ATE1
opnieuw te activeren.
Eerste verzoeken met de AT-bevelen
1.1.2 | WLAN-bevelen
Met de volgende WLAN-commando's kunt u belangrijke WLAN-eigenschappen van de module wijzigen. Bij veel bevelen kunt u niet alleen slechts een toestand vastleggen, maar ook de huidige toestand opvragen. Dit gebeurt door direct na het bevel een vraagteken in te voeren, bv.
AT+CWMODE?
Als returnwaarde komt in regel
+CWMODE=2
gevolgd door OK. Wanneer u
AT+CWMODE=?
intikt, antwoordt de module met de mogelijke parameters van het bevel; hier na­melijk 1-3. Bij CWMODE gaat het overigens om het bevel waarmee u de WLAN­module kunt vastleggen.
Er zijn dus drie bedrijfsmodi die ik hieronder na elkaar vermeld:
1
AT+CWMODE=2 – de module als Access Point (AP-modus)
In de leveringstoestand is de module een Access Point. Dit betekent dat u met een WLAN-compatibel apparaat, zoals een smartphone of een pc, een rechtstreekse verbinding met de module kunt aanmaken. Daartoe zoekt u gewoon het open WLAN met de naam NanoESP en verbindt u zich daarmee. In de fabriekstoestand is er geen wachtwoord gegeven zodat de verbinding zonder problemen kan worden ge­maakt. Wanneer u met de module verbonden bent, hebt u geen verbinding met het internet aangezien de module geen router is met een eigen verbinding met het tele­foonnet. Deze WLAN-modus is echter toch zinvol wanneer u bijvoorbeeld een veilig afgesloten netwerk nodig hebt. Met betrekking tot veiligheid: De mogelijkheid be­staat ook om het netwerk van een wachtwoord te voorzien, en wel met behulp van het bevel:
AT+CWSAP
Er moeten hier nog parameters worden ingevoerd, en wel in volgorde en geschei­den door een komma:
U
de naam van het netwerk in aanhalingstekens,
U
het wachtwoord in aanhalingstekens,
U
de Channel ID (willekeurige waarde tussen1 en 13),
U
en de encryptiemodus (waarde van 0-4).
Een mogelijke instelling is:
AT+CWSAP="MyNanoESP","MyPassword",5,3
Na korte tijd verschijnt OK als bevestiging. Als een ERROR verschijnt, controleert
u nogmaals uw invoer, vooral de aanhalingstekens. Als ERROR toch verschijnt, controleert u of de CWMODE echt 2 is.
Wanneer alles heeft gewerkt, kunt u zich met een WLAN-compatibel apparaat met het board verbinden. Alle met de module verbonden apparaten kunt u met IP- en MAC-adressen via het bevel
AT+CWLIF
laten weergeven.
De module in stationsmodus. Het IP van de verbonden computer is gemarkeerd.
2
AT+CWMODE=1 – de module in de stationsmodus
Met het bevel
AT+CWMODE=1
plaatst u de module in de stationsmodus. Deze modus laat u toe om een verbin­ding met uw WLAN-router te maken. Daardoor is de module ook met het internet
verbonden en heeft veel meer mogelijkheden. Vooraf kunt u echter met het bevel
AT+CWLAP
alle netwerken in uw bereik laten oplijsten en zo controleren, of uw netwerk zich in de ontvangstradius bevindt. Om een verbinding met uw router te kunnen aanma­ken, hebt u het bevel
AT+CWLAP nodig
Deze bevat, net zoals het CWSAP-bevel, belangrijke parameters, namelijk de naam van het WLAN-netwerk (ook SSID genaamd) en het wachtwoord, beiden opnieuw in aanhalingstekens en door een komma gescheiden. Een verbinding maken met een tweede module dat met de in het vorige hoofdstuk vermelde ge­gevens is ingesteld, zou er dus als volgt uitzien:
AT+CWJAP="MyNanoESP","MyPassword"
De verbinding aanmaken kan een paar seconden duren en moet dan OK terugge­ven. U kunt overigens de door de router gegeven IP van de module met het bevel
AT+CIFSR
oproepen. Dit zal later van belang zijn, wanneer u een verbinding met de TCP­server van de module wilt aanmaken. Met het bevel
AT+CWQAP
kunt u de verbinding met uw router ook opnieuw verbreken.
Het board maakt een verbinding met een tweede NanoESP aan.
3
AT+CWMODE=3 – de duale modus
De derde mogelijke modus van de WLAN-instelling is de duale modus. Zoals de naam reeds laat vermoeden, laat dit u toe om de module zowel in de stations- als in de AP-modus te gebruiken. Dit betekent dat apparaten zowel een rechtstreekse WLAN-verbinding met de module kunnen aanmaken of de module via de router
als tussenstation bereiken. Een handige modus, bv. wanneer men een intern net met meerdere modules plant en een module toch als server moet dienen die de gegevens in het net levert. Daarover later meer.
1.2 | Automatische configuratie
De algemene bevelen kunt u reeds manueel testen. In dit hoofdstuk moet nu de vraag worden beantwoord, hoe deze bevelen automatisch via de controller kunnen worden bediend. Bovendien leert u een bijkomend bevel kennen, waarmee u kunt testen of een pc in het netwerk of een server in het internet bereikbaar is. In dit voorbeeld wordt namelijk de Google-server aangepingt. In het voorbeeldprogram­ma P02_GooglePing worden de werkwijzen die u in het eerste voorbeeld manueel hebt ingetikt, grotendeels geautomatiseerd. De controller stuurt na elkaar bevelen naar de ESP-module en maakt zo o.m. de verbinding naar de WLAN. De verschil­lend lange time-outtijden geven de module voldoende tijd om te antwoorden.
Voor het programma echter goed kan werken, moet u uw WLAN-gegevens na #define SSID en #define PASSWORD onmiddellijk bij het begin van de programma­broncodes invoeren. De module heeft namelijk toegang tot het internet nodig om zijn laatste bevel te kunnen uitvoeren. Met het bevel
AT+PING
kunnen andere apparaten in het netwerk worden aangepingd. Pingen betekent dat men vraagt of een computer in principe bereikbaar is. Hier wordt de Google-server met AT+PING="www.google.de" aangepingt. Wanneer er een antwoord terug­komt, verschijnt er een melding in de Serial Monitor en de met D3 aangeduide LED die op pin D13 aan de boards is aangesloten, wordt geactiveerd. De eerste communicatie met het internet is dan geslaagd.
Het programma
Hieronder analyseren wij de functies van de programma's stap voor stap. Bij het begin wordt de communicatie met de module besproken.
1
Seriële communicatie
He geheel werkt via de seriële software-interface die met de SoftwareSerial­Library beschikbaar wordt gesteld. Bij het initialiseren moeten bovendien de ge­bruikte pins worden aangegeven, in dit geval pins 11 en 12.
001
#include <SoftwareSerial.h>
002
SoftwareSerial esp8266(11, 12);
Net zoals bij de normale seriële interface kunnen dan bytes of hele regels met de bevelen esp8266.print of esp8266.println worden overgedragen. Bijzonder prak­tisch zijn ook de bevelen esp8266.find en esp8266.findUntil waarmee een inko­mende stream op bepaalde datareeksen kunnen worden getest. Daardoor is het heel eenvoudig om het passende antwoord van de module te onderscheppen. Wanneer een verachte datareeks niet opduikt, kan het een hele poos duren tot het
programma verder gaat. De wachttijd (time-out) wordt door esp8266.setTimeout gedefinieerd. Met findUntil() kan echter ook een tweede datareeks worden gedefi­nieerd waarbij de zoekfunctie uitstapt en false als returnwaarde levert. Dit gebrui­ken wij in de functie 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
}
Wanneer u de functie oproept, moet u dus het bevel en de verwachte returnwaar­de aan de functie overgeven, bv. AT en de verwachte returnwaarde OK. Via print­ln() wordt het commando overgedragen en tenslotte gewacht tot de verwachte returnwaarde of een ERROR wordt ontvangen. Als de verwachting vervuld is, geeft de functie de waarde true terug. Indien niet, zendt de module via de debug()­functie een ESP SEND ERROR en het verzonden commando terug zodat men makkelijk kan controleren, welk bevel de problemen veroorzaakt.
Niet alle AT-bevelen hebben een eenduidige of uit een regel bestaande return­waarde. Als bv. het IP-adres wordt gevraagd, is er in regel geen vooraf bekende waarde. Daarom is er een tweede sendCom()-functie die alleen de parameter command nodig heeft en dan de hele ontvangen string teruggeeft. De string mag echter niet te lang zijn want de buffer van SoftwareSerial kan overlopen.
001
String sendCom(String command)
002
{
003
esp8266.println(command);
004
return esp8266.readString();
005
}
2
Zoeken naar fouten
Bij het ontwikkelen van programma's komt het tot fouten en complicaties. Opdat men überhaupt een kans heeft, zijn er twee debug-functies die via een parameter helemaal aan het begin van het programma geactiveerd of gedeactiveerd worden.
#define DEBUG true
De eerste functie bewerkt niets meer dan een vereenvoudigde uitvoer van tekst via de als standaard gedefinieerde seriële interface. Wanneer de constante DE­BUG waar is, wordt de inhoud van de datareeks Msg verzonden.
001
void debug(String Msg)
002
{
003
if (DEBUG)
004
{
005
Serial.println(Msg);
006
}
007
}
De tweede functie is eveneens snel verklaard. Als de functie serialDebug wordt opgeroepen, gaat het programma in een permanente lus over en gedraagt zich vanaf dan zoals het eerst geteste SoftwareSerial-programma. Dit betekent dat alle gegevens die via de seriële monitor naar de controller worden verzonden, rechtstreeks naar de module worden doorgezonden en omgekeerd. Ingeval van fout kan men dus de functie oproepen en manuele bevelen verzenden om te testen, waar de fout is.
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
Configuratie
Om de programma's over het algemeen overzichtelijker vorm te geven, werden de meeste instellingen eveneens in eigen functies ondergebracht, met vooreerst de functie espConfig, waarin de belangrijkste parameters voor het respectievelijke programma kunnen worden ondergebracht.
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
}
Bij het begin van de functie wordt eerste de variabele success op true gezet aan­gezien deze variabele nu met verschillende functies En-gekoppeld wordt. Dit bete­kent dat wanneer er ook slechts een van de functies de waarde false teruglevert, success eveneens onmiddellijk false wordt en de hele configuratie mislukt. Het eerste AT-bevel dat zo op succes wordt gecontroleerd, is het Reset-bevel dat bijna altijd bij het begin van het programma wordt uitgevoerd om te garanderen dat vorige verzoeken niet nog de module belasten. Het kan in elk geval tot vijf secon­den duren tot de module de melding ready terugstuurt. Daarom wordt kort voor de sendCom()-functie, de time-out voor esp8266.findUtil verhoogd. Na het resetten wordt de time-out opnieuw op de standaardwaarde van een seconde ingesteld.
Wat daarna volgt, is de oproep van een zelf gedefinieerde functie met de naam configStation()die in het volgend hoofdstuk wordt besproken. Hij dient om de mo­dule met uw thuisnetwerk te verbinden. Daartoe worden de parameters SSID en PASSWORD overgedragen die u bij het begin van het programma hebt ingevoerd. Als de verbinding met succes werd gemaakt, wordt eerst het positieve bericht en tot slot ook de huidige IP van de module naar de seriële monitor overgedragen. Tot slot van de functie worden nog parameters ingesteld waarop ik slechts later zal ingaan. Tot slot wordt de variabele success teruggegeven die hopelijk de waarde true heeft bevat.
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
}
De functie configStation() werd in de espConfig()-functie opgeroepen. Hier wordt het instellen van de WLAN-modus op stationsmodus met het bevel CWMODE en tenslotte het verbinden met het netwerk via het CWJAP-bevel uitgevoerd. Het kan echt lang duren tot de verbinding wordt gemaakt, waardoor de time-out hier kort­stondig tot 20 seconden wordt verhoogd. Als u overigens een voorkeur hebt voor de duale WLAN-modus, kunt u hier voor CWMODE een 3 invoeren.
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
}
De functie configAP() wordt in dit voorbeeld niet opgeroepen, maar moet echter kort behandeld worden. Ze geeft zogezegd het contrastuk van de configStation()­functie weer aangezien hier de module als Access Point wordt ingesteld. Een langere time-out is hier niet nodig aangezien de module het CWSAP-bevel duide-
lijk sneller kan verwerken. In latere verzoeken wordt dan in de espConfig()-functie in de plaats van configStation() de configAP()-functie opgeroepen.
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
}
De belangrijkste functies die u in bijna elk programma zult vinden, zijn daarmee behandeld. In de bekende Arduino-functies setup() en loop() worden deze functies nu gebruikt. Eerst worden beide seriële interfaces met 19200 Baud geïnstalleerd. Pas dan wordt de functie espConfig() opgeroepen. In geval van fout wordt onmid­dellijk de serialDebug()-functie gestart. Als alles in orde was, wordt een positief bericht verzonden. In latere programma's zal de LED aan pin 13, die op het board met D3 is gemarkeerd, bij een succesvolle configuratie bijkomend branden. Daar­mee hebt u ook feedback wanneer de module niet aan een pc met seriële monitor is aangesloten. In dit verzoek is de LED alleszins voor de terugmelding van de ping-status nodig. De vraag gebeurt ook onmiddellijk in de volgende regel na de configuratie. Het AT+PING-commando met het Google-adres wordt als parameter verzonden. U kunt in plaats van dit adres ook een IP-adres in uw lokaal netwerk opvragen. Indien succesvol, verschijnt er een melding en de voornoemde LED D3 wordt geactiveerd. Als laatste actie springt het programma in de loop-functie die aan uw zijde de serialDebug()-functie oproept. U kunt dus na het programma meer bevelen testen en zo bijvoorbeeld meer adressen aanpingen.
1.3 | Een netwerk herkennen
In dit hoofdstuk gaat het onder andere voor het eerst over een kleinere hardware­opbouw. Doel van het project is een soort alarminstallatie, die reageert wanneer een bepaald netwerk in uw bereik komt of ingeschakeld wordt.
Er worden slechts twee elementen en een beetje kabel gebruikt. De precieze opbouw vindt u in de opbouwafbeeldingen.
Aansluiten van de Piezo-luidsprekers
De brontekst voor dit project is hoofdzakelijk in de volgende functies verschillend van het vorig verzoek:
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
}
De functie findSSID() wordt ca. elke 30 seconden in de loop-routine opgeroepen en zoekt dan naar alle netwerken in de omgeving. Wanneer het gezochte netwerk werd gevonden, wordt de functie alarm() geactiveerd die LED D3 inschakelt en een geluidssignaal aan de Piezo uitgeeft. In het voorbeeldprogramma wordt na een netwerk met de SSID NanoESP gezocht, in principe dus naar andere Na­noESP-netwerken in uw bereik. U kunt echter gewoon bij #define ToFindSSID aan het begin van het programma een andere SSID invoeren. Daardoor kunt u bij­voorbeeld controleren hoe ver uw WLAN-netwerk reikt.
UDP EN IP
In dit hoofdstuk gaat het om de algemene datauitwisseling tussen twee systemen via een WLAN-netwerk. Daarbij zullen wij thema's, zoals IP Ports en het UDP­protocol behandelen. Daarvoor moeten deze algemene begrippen eerst worden verklaard.
Wat is een IP-adres?
Een IP-adres werkt als een postadres. Via dit adres kan een computer in een netwerk eenduidig worden geïdentificeerd en geadresseerd. Een IP-adres op basis van de gangbare IPv4-standaard ziet er bijvoorbeeld als volgt uit:
192.168.4.1
Het gaat om vier getallen of, juister gezegd, om vier bytes. Dit betekent dus dat de waarde van een getal maximum 255 kan bedragen. In principe zijn er lokale IP­adressen, i.e. IP's die bv. aan de computers en apparaten in uw thuisnetwerk worden verdeeld, en globale IP's.
Lokale IP's worden in regel door uw router verdeeld. Zij beginnen meestal met
192.168. Het daarop volgende getal is van router tot router anders. Wanneer de NanoESP als Access Point fungeert en een computer zich in uw netwerk aan­meldt, krijgen de pc's een adres dat met 192.168.4 begint. Zo is onmiddellijk een subnetwerk aangemaakt. Fritz!Box-routers verdelen in regel lokale IP-adressen volgens het schema 192.168.178.X. U kunt uw IP vinden door bijvoorbeeld in Windows in de prompt (onder Start -> Programma's -> Accessoires -> Prompt) het bevel ipconfig invoeren. Er verschijnt een lange lijst die ook het punt IPv4-adres met uw lokale IP in het netwerk bevat.
Globale IP's worden in regel door internetproviders toegekend. Daarbij gaat het bijvoorbeeld om het adres via hetwelk uw router in het wereldwijde netwerk te bereiken is. De router spant het lokale netwerk op en verdeelt de data aan de clients. Een mogelijkheid om uw globale IP te vinden is bijvoorbeeld de internetsite
http://www.meine-aktuelle-ip.de/ op te roepen. Op deze pagina worden bo-
vendien meerdere door een webserver te raadplegen data weergegeven. U bent dus niet zo anoniem op het internet als u eventueel denkt.
Wat is een port?
In analogie met een postadres kan een port zoiets als een huisdeur in een woning zijn. Een computer met een uniek IP kan via verschillende ports verschillende diensten ter beschikking stellen. U kunt via het IP de server bereiken, maar via de port moet u ook de te gebruiken dienst kiezen. Dit kan bv. port 20 zijn voor de FTP-gegevensoverdracht of port 23 voor een telnet-verbinding. U kunt de port in regel vrij kiezen, maar er zijn wel gestandaardiseerde ports die de omgang met webtoepassingen makkelijker maken. Een lijst van de gestandaardiseerde ports vindt u op
https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports
Wat is UDP?
UDP is de afkorting van User Datagram Protocol. Het gaat hierbij om een mini­maal, verbindingsloos netwerkprotocol. Dat betekent in principe dat het minimalis­tischer en eenvoudiger is dan andere internetprotocollen, zoals bv. TCP wat we
later zullen behandelen. De vergelijking is op dit moment nog niet bijzonder een­voudig, maar u kunt het volgende merken over de eigenschappen van het proto­col:
U
UDP is in staat om te broadcasten.
U
Er is geen controle van de data op correctheid en er is ook geen
correctie van fouten.
U
Er is dus ook geen garantie dat data met succes is overgedragen.
U
Er is bovendien geen garantie dat data niet onderweg worden
vervalst of door derden afgeluisterd.
U
Er moet niet eerst een verbinding worden gemaakt, maar een snelle
gegevensuitwisseling is mogelijk.
U
Er zijn nauwelijks overdrachtsvertragingsschommelingen.
U
Het formaat is bv. geschikt voor VoIP (Voice over IP – telefoneren via
het internet).
Dat zijn de belangrijkste principes met betrekking tot de begrippen van de volgen­de projecten. Men zou het thema nog een beetje diepgaander kunnen behandelen en op geschikte plaatsen zullen wij nog meer informatie geven. Echter, eerst naar het praktische deel.
2.1 | Gegevens tussen board en pc met UDP uitwisselen
In het huidige project worden voor het eerst gegevens tussen board en pc via het WLAN uitgewisseld. Voorwaarde is dat uw computer over een WLAN-adapter beschikt. Een programma aan pc-zijde zorgt voor het succesvol ontvangen van de meldingen. Een bijzondere hardware-opbouw is in dit verzoek niet nodig.
Het programma
Wanneer u het programma P04_UDPBasics.ino op de controller laadt, zal de Controller als AccessPoint worden geconfigureerd en kunt u een open netwerk met de naam NanoESP vinden. Voor u zich in elk geval met het netwerk verbindt, moet u eerst nog een programma voor de pc van het internet downloaden. Bij mijn verzoeken heb ik het programma Packet Sender van Dan Nagle gebruikt, aange­zien men ze onder de volgende link kan downloaden:
https://packetsender.com/
Na het laden en installeren van het programma kunt u uw pc met het open net­werk van de NanoESP kiezen. Let op dat de Firewall het netwerk als thuisnetwerk herkent, zodat er geen gegevens geblokkeerd worden. Uw computer zou nu IP
192.168.4.2 moeten ontvangen hebben. U kunt dit controleren door het AT-bevel
AT+CWLIF
via de seriële monitor naar de module te zenden. Dit bevel geeft alle met het Ac­cess Point verbonden computers met IP- en MAC-adres aan.
Nu start u Packet Sender, zet u onder Settings -> Network de UDP Server Port op 90 in en klikt u op de checkbox Enable UDP Server an. In regel moet linksonder dan UDP 90 staan. Indien niet, moet u de software nog eens opnieuw opstarten.
De juiste instellingen in het programma Packet Sender
Het programma op de computer dient nu als UDP-server, terwijl de controller als UDP-client is ingesteld. In het UDP-protocol is het onderscheid client/server niet eenduidig, maar in dit geval betekent het dat u met de controller gegevens naar uw computer verzendt.
Het bericht werd met succes overgedragen.
Om gegevens te verzenden , gebruikt u het bevel:
AT+CIPSEND=7
Daarbij staat de 7 voor het aantal te verzenden tekens. Het teken > verschijnt als teruggavewaarde. Dit betekent dat u nu uw bericht kunt overmaken. Tik Hello in en bevestig opnieuw met
[Enter]
. Als teruggavewaarde zendt de module SEND OK en dat hoewel u slechts vijf tekens hebt ingevoerd. Dit komt door het feit dat er na uw invoer nog Carriage Return en New Line mee verstuurd worden, i.e. twee tekens meer die u in uw berichtlengte moet incalculeren.
Wanneer u opnieuw naar Packet Sender gaat en daar onder Traffic Log kijkt, kunt u de ingang van het bericht zien. In het ASCII-aanzicht ziet u zelfs beide meege­zonden tekens, voorgesteld door \r en \n.
Het bericht werd door Packet Sender ontvangen.
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
}
In het Arduino-programma is voor de communicatieweg vooral de functie confi­gUDP() beslissend. Daar worden de voor de overdracht belangrijke instellingen uitgevoerd. Als eerste wordt de datatransparantiemodus met CIPMODE op 0 ge­zet. Tenslotte wordt met CIPMUX=0 ingesteld dat er slechts een enkele verbinding is toegestaan. Het beslissende bevel is CIPSTART. Daarmee wordt een verbin­ding aangemaakt en wel met IP 192.168.4.2, i.e. uw pc en PORT 90 waaraan het programma Packet Sender met zijn UDP-server afluistert. Dat zijn eerst alle stap­pen die nodig zijn om een eerste communicatie op te bouwen.
2.2 | Gegevens verzenden en ontvangen met UDP
In het vorige project werd de UDP-communicatie in een richting, i.e. van het board naar de pc getest. In dit programma wordt de module zo ingesteld dat een com­municatie ook in de andere richting mogelijk is, bijna als in een chat.
Het programma
Het programma van vandaag bevat in principe slechts een minimale wijziging die echter een grote invloed op de communicatie met het UPD-protocol heeft. Wan­neer u het programma uploadt, wordt opnieuw een Acces Point aangemaakt waarmee u zich met de pc kunt verbinden. Ook deze keer zult u Packet Sender of een vergelijkbaar programma nodig hebben. Start het programma en stel dezelfde instellingen als totnogtoe in (File -> Settings -> Network: Enable UDP Server, Port
90). Vervolgens moet u nog in het hoofdvenster in het veld IP-adres het adres van de module (192.168.4.1) intikken, de port op 91 instellen en in het verder rechts staande dropdownmenu het punt UDP selecteren. Als beide instellingen zijn ge­maakt en de Serial Monitor geopend, kunt u het eerste bericht naar de module zenden door bv. Hi in het met ASCII gemarkeerde veld te tikken.
Wanneer u nu op Send klikt, verschijnt in de Serial Monitor:
001
+IPD,2:Hi
002
OK
Loading...
+ 63 hidden pages