Conrad 10215 Operation Manual [pl]

ZANIM ROZPOCZNIEMY
Przy pierwszym podłączeniu karty IoT-WiFi (zwanej dalej także NanoESP) może się zdarzyć, że komputer nie odnajdzie automatycznie sterownika niezbędnego do konwertera portu USB na port szeregowy. W takim przypadku należy pobrać sterownik ze strony www.iot.fkainka.de/driver i
zainstalować ręcznie. W oprogramowaniu Arduino można wtedy wybrać port jako karetę Arduino Nano (procesor: Atmega328). Następnie kontroler powinien być w pełni gotowy do pracy.
Aby móc pracować z szeregowym monitorem, także trzeba dokonać ustawień. Stosuje się tutaj prędkość transmisji sygnału na poziomie 19200 bodów. Aby móc wysyłać polecenia należy ponadto wybrać opcję CR i NL obok menu prędkości transmisji sygnału.
Poprawne ustawienia w otoczeniu Arduino
Pracowałem z wersjami Arduino-IDE 1.6.5 i 1.6.6. Starsze wersje mogą sprawiać problemy. Aktualna wersja Arduino-IDE znajduje się na stronie internetowej
www.arduino.cc.
W przypadku jakichkolwiek problemów z kartą lub pakietem do nauki można zawsze znaleźć pomoc na stronie www.iot.fkainka.de. Ponadto znajduje się
tam forum, nowe projekty użytkowników a także opisane tutaj programy w ich najnowszych wersjach.
W pakiecie do nauki znajduje się także karta z gniazdem, do której można podłączyć NanoESP - jak pokazano na ilustracji. Dzięki temu uzyskuje się dużo miejsca na eksperymenty a moduł WLAN wystaje z tyłu spoza karty. Kabel z wtykiem micro-USB można wtedy podłączyć tak, jak widać na ilustracji w kolejnym rozdziale - wtedy kabel prawie wcale nie przeszkadza. Szczegółowe ilustracje połączeń znajdują się w poszczególnych rozdziałach.
Karta IoT-WiFi (NanoESP)
Głównym elementem niniejszego zestawu jest karta IoT-WiFi (NanoESP). Jak widać na płytce, karta składa się z dwóch komponentów. Z lewej strony znajduje się system mikrokontrolera kompatybilny z Arduino, porównywalny z Arduino Nano. Prawą stronę zajmuje moduł WLAN o oznaczeniu ESP8266.
Oba komponenty komunikują się ze sobą poprzez generowany programowo port szeregowy.
NanoESP na karcie z gniazdem
Układ pinów na karcie
Na karcie znajduje się wiele różnych elementów, jak np. piny, z których niektóre mają szczególną funkcję, a także diody LED, których funkcja nie zawsze jest widoczna na pierwszy rzut oka. W celu zachowania orientacji na poniższej ilustracji podano najważniejsze funkcje i nazwy poszczególnych elementów.
Najważniejsze piny i oznaczenia na karcie
Moduł WLAN jest sterowany tzw. poleceniami AT. W tym celu część Arduino karty jest połączona pinami 11 i 12 z modułem WLAN. Niewielki układ przetwarza
poziom 5 V na kompatybilny poziom 3,3 V. We własnych projektach nie należy więc używać pinów 11 i 12.
Dalsze istotne właściwości sprzętowe karty zostały zestawione w poniższej tabeli.
Dane techniczne
Mikrokontroler: ATmega328 Pamięć flash: 32 kB (z tego 0,5 kB na bootloader) SRAM: 2 kB EEPROM: 1 kB Częstotliwość taktowania: 16 MHz Piny I/O: 20 (z tego 2 do komunikacji z modułem WLAN)
U
w tym PWM: 6
U
w tym wejścia analogowe: 6
Chip USB-to-Serial: CH340G Napięcie robocze: 5 V Zalecane napięcie wejściowe: 7 – 12 V Maksymalny prąd na pin I/O: 40 mA Obciążalność wyjścia 3,3 V: 50 mA
Moduł WLAN: ESP8266 SPI-Flash 4 Mbit Napięcie robocze: 3,3 V Standardy WLAN: 802.11 b/g/n Tryby WLAN: Wi-Fi Direct (P2P), Soft-AP Firmware: AT-Firmware wersja 0.22 Inne: Zintegrowany stos TCP/IP +19,5 dBm mocy wyjściowej w trybie 802.11b Zintegrowany Low-Power-32-bit-CPU Komunikacja przez UART
ELEMENTY ZESTAWU DO NAUKI
Poniżej znajduje się zestawienie elementów zestawu do nauki.
1 Karta IoT-WiFi (NanoESP) 1 płytka ze złączami wtykowymi 1 m drut sterujący 2 przyciski 1 klips 9-V 1 dioda LED (czerwona) 1 dioda LED RGB (4 piny podłączeniowe) 1 opornik 10 kiloomów (brązowy-czarny-pomarańczowy) 1 opornik 1 kiloom (brązowy-czarny-czerwony) 1 fototranzystor (2 piny podłączeniowe) 1 NTC 10 kiloomów 1 głośnik piezoelektryczny 1 potencjometr 10 kiloomów z czerwonym pokrętłem
POZNAWANIE MODUŁU
Pierwszy rozdział opisuje podstawowe funkcje modułu WLAN. Moduł jest sterowany tzw. poleceniami AT. Wszystkie zastosowane tutaj przykładowe programy a także pomoc i dalsze informacje znajdziesz także na stronie
www.iot.fkainka.de
Najprościej jest pobrać cały folder skompresowany zip i skopiować cały wyodrębniony folder do własnego folderu szkicu. Wtedy z poziomu interfejsu Arduino można wygodnie po kolei otwierać wszystkie programy.
1.1
|
Podstawowe polecenia AT
Aby uzyskać pierwsze wrażenie o stosowaniu poleceń AT, najlepiej je po prostu wypróbować. W związku z tym w niniejszym rozdziale opisano kilka z podstawowych poleceń modułu.
Otwórz program P01_SoftwareSerial w IDE Arduino. Jest to bardzo prosty program, którego jedynym zadaniem jest przekazywanie do kontrolera ESP
wszystkich danych odebranych przez sprzętowy interfejs mikrokontrolera. Działa to także w przeciwnym kierunku. Jak widać w tekście źródłowym, dwa podłączenia interfejsu programowego to piny 11 i 12. Nie należy ich wykorzystywać we własnych projektach jako pinów GPIO. Ponadto potrzebna jest SoftwareSerial-
Library, która jest w większości wersji Arduion jest już preinstalowana – jeśli nie,
należy pobrać bibliotekę przez managera. Po załadowaniu programu można uruchomić szeregowy monitor interfejsu
Arduino. Przedtem jednak należy dokonać dwóch ważnych ustawień na szeregowym monitorze: w dolnym prawym rogu należy ustawić prędkość transmisji sygnału na 19200 a w kratce obok ustawić CR i NL.
Teraz pojawia się już pierwszy komunikat, jest to AT a kilka wierszy niżej OK. Polecenie AT zostało wysłane przez mikrokontroler do modułu ESP a moduł wysłał odpowiedź OK. Oznacza to, że moduł WLAN działa i jest gotowy do pracy.
Ustawienia terminala: CR i NL oraz prędkość transmisji sygnału 19200
1.1.1 | Podstawowe polecenia
Kilka podstawowych poleceń modułu można przetestować wpisując polecenie i przesyłając je do modułu naciśnięciem
[Enter]
. Wielkie i małe litery wpisywanego
polecenia mają znaczenie. Pierwsze własne polecenie można przekazać wpisując
AT
w szeregowym monitorze i naciskając
[Enter]
. Załadowany program przekazuje
polecenie do modułu ESP, który ponownie odpowiada wysyłając AT a następnie
OK . Kolejne polecenie, które można przetestować, brzmi:
AT+GMR
Tym poleceniem wyświetla się aktualne firmware i numer wersji. Poleceniem
AT+RST
można zresetować moduł. Wtedy najpierw na terminalu pojawi się najpierw kilka nieczytelnych znaków a na końcu komunikat ready jako znak, że moduł jest już gotowy. Kolejne polecenie brzmi:
ATE0
Tym poleceniem można dezaktywować tzw. echo modułu. Oznacza to, że wysłane polecenie nie zostanie odesłane z powrotem, lecz zostanie wysłana sama odpowiedź. Jeśli zostanie wysłane np. AT, w odpowiedni nie przyjdzie najpierw AT a później OK, lecz tylko samo OK . Jednakże do pierwszych prób zaleca się użycie polecenia
ATE1
do ponownej aktywacji echa.
Pierwsze próby z poleceniami AT
1.1.2 | Polecenia WLAN
Poniższymi poleceniami WLAN można zmieniać właściwości WLAN modułu. Przy niektórych poleceniach można nie tylko ustawić stan, ale także sprawdzić stan aktualny. Dzieje się tak, jeśli bezpośrednio po poleceniu wpisany zostanie znak zapytania, np.
AT+CWMODE?
Jako wartość zwrotna przychodzi zazwyczaj
+CWMODE=2
a za nim OK. Po wpisaniu
AT+CWMODE=?
moduł odpowiada podając możliwe parametry polecenia, w tym przypadku 1-3. CWMODE to polecenie, którym można ustalić tryb WLAN.
Są trzy tryby pracy, które są objaśnione poniżej.
1
AT+CWMODE=2 – moduł jako Access Point (tryb AP)
Fabrycznie moduł pracuje jako Access Point (punkt dostępu). Oznacza to, że za pomocą urządzenia obsługującego WLAN, jak np. smartfon lub komputer można nawiązać bezpośrednie połączenie z modułem. W tym celu należy po prostu wyszukać otwartą sieć WLAN o nazwie NanoESP i połączyć się z nią. W ustawieniu fabrycznym nie jest ustawione żadne hasło i nawiązanie połączenia powinno się odbyć bez problemów. Po połączeniu się z modułem nie uzyskuje się połączenia z internetem, jeśli moduł nie pracuje jako router z własnym połączeniem z siecią telefoniczną. Ten moduł WLAN jest jednakże bardzo przydatny, gdy potrzebna jest bezpieczna, zamknięta sieć. Jeśli chodzi o bezpieczeństwo: Jest możliwość chronienia sieci hasłem. Służy do tego polecenie:
AT+CWSAP
Należy tu jeszcze podać parametry w następującej kolejności i oddzielone przecinkami:
U
nazwa sieci w cudzysłowie,
U
hasło w cudzysłowie,
U
Channel ID (dowolna wartość między 1 a 13),
U
tryb kodowania (wartość 0-4).
Jedno z możliwych ustawień to:
AT+CWSAP="MyNanoESP","MyPassword",5,3
Po krótkim czasie pojawia się OK jako potwierdzenie. Jeśli pojawi się ERROR , należy jeszcze raz sprawdzić wpisane wartości, przede wszystkim cudzysłowy. Jeśli nadal pojawia się ERROR , należy sprawdzić, czy CWMODE to rzeczywiście
2. Jeśli wszystko zadziała poprawnie, można połączyć się z urządzenia
obsługującego WLAN z kartą. Wszystkie urządzenia połączone z modułem można wyświetlić wraz z ich adresami IP i MAC poleceniem
AT+CWLIF
.
Moduł w trybie stacji. Adres IP połączonego komputera jest zaznaczony.
2
AT+CWMODE=1 – moduł w trybie stacji
Poleceniem
AT+CWMODE=1
ustawia się moduł w trybie stacji. Ten tryb umożliwia nawiązanie połączenia z routerem WLAN. Dzięki temu moduł jest połączony także z internetem i zyskuje wiele więcej możliwości.
Wcześniej jednak można poleceniem
AT+CWLAP
wyświetlić wszystkie sieci znajdujące się w zasięgu sprawdzając w ten sposób, czy Twoja sieć jest w zasięgu modułu. Do nawiązania połączenia z routerem potrzebne jest polecenie
AT+CWJAP
Polecenie to, podobnie jak CWSAP, zawiera ważne parametry, mianowicie nazwę
sieci WLAN (zwaną także SSID) oraz hasło, obie wartości ponownie w cudzysłowie i oddzielone przecinkami. Nawiązywanie połączenia z drugim modułem, na którym ustawione są dane opisane w poprzednim rozdziale dane, wyglądałoby więc następująco:
AT+CWJAP="MyNanoESP","MyPassword"
Nawiązywanie połączenia może trwać kilka sekund i powinno być potwierdzone przez zwrotne OK. Można także wywołać nadany przez router adres IP modułu. Służy do tego polecenie
AT+CIFSR
. Będzie to istotne później przy nawiązywaniu połączenia z serwerem TCP modułu. Poleceniem
AT+CWQAP
można ponownie przerwać połączenie z routerem.
Karta nawiązuje połączenie z drugim NanoESP.
3
AT+CWMODE=3 – tryb dual
Trzeci dostępny tryb ustawień WLAN to tryb podwójny. Jak już sama nazwa wskazuje, tryb ten umożliwia pracę modułu zarówno w trybie stacji jak i w trybie AP. Oznacza to, że urządzenia mogą zarówno nawiązywać bezpośrednie połączenie WLAN z modułem oraz przez router jako stację pośrednią. Jest to tryb
bardzo praktyczny, gdy np. planowane jest utworzenie wewnętrznej sieci z wieloma modułami i jeden z modułów ma pełnić rolę serwera dostarczającego dane do sieci. Więcej na ten temat w dalszej części.
1.2 | Konfiguracja automatyczna
Podstawowe polecenia zostały już przetestowane ręcznie. Ten rozdział jest poświęcony kwestii, w jaki sposób polecenia te mogą być obsługiwane bezpośrednio przez kontroler. Ponadto poznamy tu kolejne polecenie, którym można przetestować, czy dostępny jest określony komputer w sieci lub serwer w internecie. W tym przykładzie ping wysyłany jest do serwera Google. W przykładowym programie P02_GooglePing czynności, które w pierwszym przykładzie były wpisywane ręcznie, są teraz w znacznym stopniu zautomatyzowane. Kontroler wysyła kolejno po sobie polecenia do modułu ESP i w ten sposób m.in. nawiązuje połączenie z WLAN. Czasy timeout o róznej długości dają modułowi wystarczająco czasu na odpowiedź.
Ale zanim program będzie mógł prawidłowo działać, trzeba wpisać dane WLAN za #define SSID i #define PASSWORD zaraz na początku kodu źródłowego programu. Moduł potrzebuje bowiem dostępu do internetu, aby mógł wykonać swoje ostatnie polecenie. Poleceniem
AT+PING
można wysłać ping do innych urządzeń w sieci. Wysyłanie sygnału ping oznacza zapytanie, czy dany komputer zasadniczo jest osiągalny. Tutaj za pomocą AT+PING="www.google.de" ping jest wysyłany do serwera Google. Gdy nadejdzie odpowiedź, na monitorze szeregowym pojawia się komunikat o powodzeniu w zapala się dioda LEd oznaczona jako D3, która jest podłączona do pina D13 karty. Pierwsza komunikacja z internetem zakończyła się powodzeniem.
Program
W kolejnych częściach zostaną krok po kroku przeanalizowane funkcje programu. Najpierw omówiona zostanie komunikacja z modułem.
1
Komunikacja szeregowa
Wszystko działa za pośrednictwem szeregowego portu wirtualnego udostępnianego przez SoftwareSerial-Library . Podczas inicjalizacji muszą ponadto zostać podane używane piny, w tym przypadku 11 i 12.
001
#include <SoftwareSerial.h>
002
SoftwareSerial esp8266(11, 12);
Tak samo, jak przy zwykłym porcie szeregowym, można poleceniami esp8266.print lub esp8266.println przesyłać bajty lub całe wiersze. Szczególnie praktyczne są także polecenia esp8266.find i esp8266.findUntil, którymi przychodzący strumień można sprawdzić pod kątem określonych łańcuchów znaków. W ten sposób bardzo proste jest wyłapanie pasującej odpowiedzi modułu. Jeśli jednak oczekiwany ciąg znaków się nie pojawia, oczekiwanie na dalszy bieg programu można nieco potrwać. Czas oczekiwania (timeout) jest definiowany przez esp8266.setTimeout . Przez findUntil() można jednakże zdefiniować drugi ciąg znaków, który pojawia się w funkcji wyszukiwania i daje false jako wartość zwrotną. To można wykorzystać w funkcji 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
}
Po wywołaniu tej funkcji należy więc przekazać jej polecenie oraz oczekiwaną wartość zwrotną, np. AT oraz oczekiwana wartość zwrotnaOK. Funkcja println() przekazuje polecenie i czeka na odebranie oczekiwanej wartości zwrotnej lub komunikatu ERROR . Gdy oczekiwanie zostanie spełnione, funkcja odsyła wartośćtrue . Jeśli nie, moduł przez funkcję debug()-odsyła ESP SEND ERROR i
wysłane polecenie, dzięki czemu można w łatwy sposób sprawdzić, które polecenie stwarza problemy.
Nie wszystkie polecenia AT mają jednoznaczne lub jednowierszowe wartości zwrotne. Gdy pojawia się np. zapytanie o adres IP, z reguły nie ma wcześniej znanej wartości. Dlatego jest druga funkcja sendCom(), która potrzebuje jedynie parametru command i odsyła cały odebrany strumień. Strumień nie może być jednak zbyt długi, ponieważ może dojść do przepełnienia buforu SoftwareSerial .
001
String sendCom(String command)
002
{
003
esp8266.println(command);
004
return esp8266.readString();
005
}
2
Poszukiwanie błędów
Podczas tworzenia programów dochodzi często do błędów i komplikacji. Aby mieć jakąkolwiek szansę powodzenia, są dwie funkcje debug, które są aktywowane i dezaktywowane jednym parametrem na samym początku programu.
#define DEBUG true
Pierwsza funkcja powoduje jedynie uproszczone wydawanie tekstu przez port szeregowy zdefiniowany jako standardowy. Jeśli stała DEBUG jest prawdziwa, wysyłana jest zawartość ciągu znaków Msg.
001
void debug(String Msg)
002
{
003
if (DEBUG)
004
{
005
Serial.println(Msg);
006
}
007
}
Drugą funkcję można także szybko wyjaśnić. Gdy wywołana zostanie funkcja serialDebug, program zapętla się i od tej chwili zachowuje się jak pierwszy testowany program SoftwareSerial. Oznacza to, że wszystkie dane wysłane przez szeregowy monitor do kontrolera, są dalej przekazywane do modułu i odwrotnie. Można więc w przypadku błędu wywołać tę funkcję i wysyłać ręczne polecenia,
aby sprawdzić, gdie występuje błąd.
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
Konfiguracja
Aby programy były ogólnie zbudowane bardziej przejrzyście, większość ustawień została przeniesiona do własnych funkcji, przede wszystkim do funkcji espConfig, w której ustawia się najważniejsze parametry dla danego programu.
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
}
Na początku funkcji najpierw ustawiana jest zmienna success na true , ponieważ ta zmienna jest łączona z różnymi funkcjami ORAZ. Oznacza to, że nawet gdy tylko jedna z funkcji zwróci wartość false, wartość success natychmiast zmienia się na false i występuje niepowodzenie całej konfiguracji. Pierwsze polecenie AT, które w ten sposób jest sprawdzane pod kątem powodzenia, to polecenie Reset, który prawie zawsze jest wykonywany na początku programu w celu zapewnienia, że poprzednie próby nie zajmują już modułu. Może jednakże trwać do pięciu sekund, aż moduł odeśle komunikat ready. Dlatego na krótko przed funkcją sendCom() timeout jest wydłużany doesp8266.findUtil . Po resecie timeout jest ponownie ustawiany na standardową wartość jednej sekundy.
Następnie wywoływana jest samodzielnie zdefiniowana funkcja o nazwie configStation(), która jest omówiona w kolejnym rozdziale. Służy ona do połączenia modułu z siecią domową. W tym celu przekazywane są parametry SSID i PASSWORD , które zostały wpisane na początku programu. Jeśli próba nawiązania połączenia zakończyła się powodzeniem, najpierw komunikaty o powodzeniu a następnie aktualny adres IP modułu są przesyłane do monitora szeregowego. Na koniec tej funkcji ustawiane są jeszcze parametry, o których mowa będzie jeszcze później. Na koniec zwracana jest zmienna success, która ­miejmy nadzieję - zachowała wartość 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
}
Funkcja configStation() została wywołana w funkcjiespConfig(). Tutaj dokonuje się ustawienia modułu WLAN w trybie stacji poleceniem CWMODE a następnie połączenia z siecią poleceniem CWJAP. Nawiązywanie połączenia może trwać bardzo długo, w związku z czym timeout jest tutaj na krótko wydłużany do 20 sekund. Jeśli jednak preferowany jest podwójny tryb WLAN, można tutaj dla CWMODE wpisać wartość 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
}
Funkcja configAP() w tym przykładzie nie jest wywoływana, ale musi byc krótko omówiona. Można powiedzieć, że jest ona przeciwnością funkcjiconfigStation(), ponieważ tutaj moduł jest ustawiany jako Access Point. Długi timeout nie jest tutaj potrzebny, ponieważ moduł może przetworzyć polecenie CWSAPznacznie szybciej. W źniejszych próbach w funkcji espConfig()-zamiast configStation() będzie wywoływana funkcja 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
}
Omówione zostały najważniejsze funkcje, które znajdują się w prawie każdym programie. W znanych funkcjach Arduino setup() i loop() funkcje te są teraz stosowane. Najpierw jednak oba porty szeregowe zostają uruchomione z prędkością transmisji sygnału 19200 bodów. Dopiero wtedy otwierana jest funkcja espConfig(). W przypadku błędu uruchamiana jest natychmiast funkcja serialDebug(). Jeśli wszystko przebiegło bez problemu, wysyłany jest komunikat powodzenia. W późniejszych programach po udanej konfiguracji dodatkowo
zapala się dioda LED na pinie 13, która na karcie oznaczona jest symbolem D3 . Dzięki temu pojawia się potwierdzenie także wtedy, gdy moduł nie jest podłączony do komputera z monitorem szeregowym. W tej próbie jednak dioda LED potrzebna jest do informacji zwrotnej o statusie sygnału ping. Zapytanie odbywa się także bezpośrednio w kolejnym wierszu po konfiguracji. Wysyłane jest polecenie AT+PING z adresem Google jako parametr. Zamiast tego adresu można wysłać zapytanie także na adres IP w sieci lokalnej. W przypadku powodzenia pojawia się komunikat i włącza się wspomniana dioda LED D3. W ostatnim kroku program przechodzi do funkcji loop, która z kolei wywołuje funkcję serialDebug(). Można więc po programie przetestować dalsze polecenia i przykładowo wysyłać sygnały ping na inne adresy.
1.3 | Rozpoznawanie sieci
W tym rozdziale będzie m.in. mowa po raz pierwszy o drobnych pracach przy sprzęcie. Celem projektu jest stworzenie swego rodzaju instalacji alarmowej, która będzie reagować, gdy w zasięgu znajdzie się określona sieć lub gdy zostanie włączona.
Potrzebne są tylko dwa podzespoły i kawałek drutu. Szczegóły budowy przedstawione są na odpowiednich ilustracjach.
Podłączenie głośnika piezoelektrycznego
Tekst źródłowy tego projektu różni się od poprzedniej próby przede wszystkim w następujących funkcjach:
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
}
Funkcja findSSID() jest wywoływana co ok. 30 sekund w trybie loop i poszukuje wszelkich sieci w otoczeniu. Gdy odnaleziona zostanie szukana sieć, uruchamiana jest funkcja alarm(), włącza się dioda LED D3 a element piezoelektryczny wydaje sygnał. W tym przykładzie poszukiwana jest sieć o SSID NanoESP , czyli w
zasadzie inne sieci NanoESP w zasięgu. Ale na początku programu w #define ToFindSSID można wpisać inne SSID. Można w ten sposób np. sprawdzić, jak daleko sięga dana sieć WLAN.
UDP I IP
Ten rozdział dotyczy podstawowej wymiany danych między dwoma systemami poprzez sieć WLAN. Zajmiemy się tutaj takimi tematami jak porty IP oraz protokół UDP. W pierwszym rzędzie należy więc wyjaśnić te podstawowe pojęcia.
Co to jest adres IP?
Adres IP działa tak, jak adres pocztowy. Na jego podstawie można jednoznacznie zidentyfikować i zaadresować komputer w sieci. Przykładowy adres IP utworzony na podstawie stosowanego jeszcze standardu IPv4 wygląda następująco:
192.168.4.1
są to cztery liczby, a mówiąc dokładniej cztery bajty. Oznacza to, że wartość jednej liczby może wynieść maksymalnie 255. Generalnie wyróżnia się lokalne adresy IP, czyli w skrócie IP, które są np. nadawane komputerom i urządzeniom w sieci domowej oraz globalne IP.
Lokalne IP są z reguły przydzielane przez router. Zazwyczaj rozpoczynają się od
192.168. Następująca potem liczba jest różna w różnych routerach. Gdy NanoESP działa jako Access Point i do jego sieci zgłaszają się komputery, każdy z nich otrzymuje adres rozpoczynający się od 192.168.4. W ten sposób tworzy się podsieć. Routery Fritz!Box przydzielają z reguły lokalne adresy IP wg schematu
192.168.178.X. Własny IP można sprawdzić w Windows wpisując w wierszu polecenia (Start -> programy -> akcesoria -> wiersz polecenia) polecenie
ipconfig. Pojawia się dłuższa lista zawierająca także punkt adres IPv4 z Twoim
lokalnym adresem IP w sieci. Globalne IP są z reguły nadawane przez dostawcę internetu. Jest to np. adres,
pod którym Twój router dostępny jest w sieci globalnej. Router tworzy sieć lokalną i przesyła dane do klientów. Jedną z możliwości sprawdzenia swojego globalnego adresu IP jest wejście na stronę http://www.meine-aktuelle-ip.de/. Na tej
stronie podawane są dodatkowo inne dane, do których ma wgląd serwer sieci web. Wbrew temu, co wielu sądzi, nie jesteśmy w internecie anonimowi.
Co to jest port?
Kontynuując porównanie do adresu pocztowego port można określić jako drzwi do mieszkania w domu wielorodzinnym. Komputer posiadający jednoznaczny IP może udostępniaćżne usługi przez różne porty. Poprzez IP można dotrzeć do serwera, ale poprzez port trzeba wybrać jeszcze odpowiednią usługę. Może to być np. port 20 do transmisji danych FTP lub port 23 do połączenia Telnet. Z reguły
można dowolnie wybierać port, jednakże występują porty standardowe ułatwiające pracę z aplikacjami sieciowymi. Lista portów standardowych znajduje się na stronie
https://de.wikipedia.org/wiki/Liste_der_standardisierten_Ports
Co to jest UDP?
UDP to skrót od User Datagram Protocol. Jest to minimalny bezpołączeniowy protokół internetowy. Oznacza to, że jest on w zasadzie bardziej minimalistyczny i prostszy niż inne protokoły internetowe, jak np. TCP, którym zajmiemy sięźniej. Porównanie nie jest teraz zbyt proste, ale można już teraz zapamiętać sobie kilka właściwości protokołu:
U
UDP obsługuję funkcję broadcast.
U
Nie odbywa się sprawdzanie danych pod kątem poprawności oraz
korekta błędów.
U
Nie ma więc żadnej gwarancji, że dane zostały przekazane
pomyślnie.
U
Ponadto nie ma gwarancji, że dane nie zostały po drodze
zafałszowane lub przechwycone przez osoby trzecie.
U
Nie ma konieczności nawiązywania połączenia, lecz możliwa jest
szybka wymiana danych.
U
Prawie nie występują wahania opóźnienia transmisji.
U
Format ten nadaje się np. do VoIP (Voice over IP – czyli
telefonowanie przez internet).
Są to najważniejsze podstawy dotyczące pojęć używanych w poniższych projektach. Można głębiej zająć się tym tematem i w odpowiednim miejscu zostaną przedstawione jeszcze dalsze informacje. Teraz jednak przejdziemy do części praktycznej.
2.1 | Wymiana danych między kartą a PC przez UDP
W pierwszym projekcie dotyczącym UDP będą wymieniane dane między kartą i PC za pośrednictwem WLAN. Warunkiem jest posiadanie przez komputer adaptera WLAN. Program na komputerze dba o prawidłowe odbieranie wiadomości. W tej próbie nie jest konieczne dodatkowe rozbudowywanie sprzętu.
Program
Po załadowaniu programu P04_UDPBasics.ino na kontroler będzie on skonfigurowany jako Access Point i będzie możliwe odnalezienie otwartej sieci o nazwie NanoESP. Jednakże przed połą czeniem się z siecią należy wcześniej z internetu pobrać odpowiedni program na PC. Przy moich próbach użyłem programu Packet Sender od Dan Nagle, który można pobrać pod następującym linkiem:
https://packetsender.com/
Po pobraniu i zainstalowaniu programu można połączyć komputer z otwartą siecią NanoESP. Należy zwrócić uwagę, aby firewall rozpoznał tę sieć jako sieć domową i nie blokował żadnych danych. Komputer powinien otrzymać IP 192.168.4.2. Można to sprawdzić wysyłając polecenie
AT+CWLIF
przez szeregowy monitor do modułu. To polecenie powoduje pokazanie wszystkich komputerów połączonych z Access Point wraz z adresami IP i MAC.
Teraz należy uruchomić Packet Sender, Settings -> Network den UDP Server Port ustawić na 90 i zaznaczyć pole wyboru Enable UDP Server . Z reguły na dole po lewej stronie powinno się wtedy pojawić UDP:90 . Jeśli nie, należy ponownie uruchomić program.
Prawidłowe ustawienia w programie Packet Sender
Program na komputerze służy teraz jako serwer UDP a kontroler jest ustawiony jako klient UDP. W protokole UDP rozróżnienie klient/serwer nie jest jednoznaczne, ale w tym przypadku oznacza to, że za pomocą kontrolera można wysyłać dane do komputera.
Wiadomość została przekazana pomyślnie.
Aby wysłać dane, należy użyć polecenia:
AT+CIPSEND=7
Cyfra 7 oznacza tutaj ilość wysyłanych znaków. Pojawia się znak > jako odpowiedź. Oznacza to, że teraz można przesłać wiadomość. Należy wpisać Hello i ponownie potwierdzić przez
[Enter]
. Jako odpowiedź moduł wysyła SEND OK mimo, że zostało wpisanych tylko pięć znaków. Wynika to z tego, że po wpisaniu wiadomości wysłane razem z nią zostały jeszcze Carriage Return i New Line czyli dwa znaki więcej, które trzeba uwzględnić przy długości wiadomości.
Po powrocie do Packet Sender można w Traffic Log zobaczyć nadejście wiadomości. W widoku ASCII widać nawet oba wysłane razem z wiadomością znaki, przedstawione jako \r i \n.
Wiadomość została odebrana przez 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
}
W programie Arduino dla drogi komunikacji decydująca jest przede wszystkim
funkcja configUDP() . Tam wykonuje się ustawienia istotne dla transmisji. Najpierw w CIPMODE ustawia się tryb transparencji danych na0. Następnie przez CIPMUX=0 ustawia się, że dopuszczone jest tylko jedno jedyne połączenie. Decydującym poleceniem jest CIPSTART. Służy ono do nawiązania polecenia z IP 192.168.4.2, czyli Twoim komputerem, oraz PORTEM 90, który nasłuchuje program Packet Sender przez serwer UDP. Są to na razie wszystkie czynności niezbędne do nawiązania pierwszej komunikacji.
2.2 | Wysyłanie i odbieranie danych przez UDP
W poprzednim projekcie przetestowana została komunikacja UDP w jednym kierunku czyli od karty do komputera. W tym programie moduł zostanie tak ustawiony, że możliwa będzie komunikacja także w drugim kierunku, prawie tak, jak na czacie.
Program
W zasadzie program zawiera tylko niewielką zmianę, która jednak w dużym stopniu wpływa na komunikację z zastosowaniem protokołu UDP. Po załadowaniu programu ponownie zostaje utworzony Access Point, za pośrednictwem którego można połączyć się z komputerem. Także tutaj potrzebny jest program Packet Sender lub podobny. Należy uruchomić program i wykonać takie same ustawienia, jak poprzednio (File -> Settings -> Network: Enable UDP Server, Port 90). Następnie w oknie głównym w polu IP Address trzeba wpisać adres modułu (192.168.4.1), ustawić Port na 91 i w znajdującym się dalej po prawej rozwijanym menu wybrać punkt UDP. Po dokonaniu tych ustawień i otwarciu szeregowego monitora można wysłać pierwszą wiadomość do modułu wpisując np. Hi w polu oznaczonym ASCII .
Po kliknięciu na Send na monitorze szeregowym pojawia się:
001
+IPD,2:Hi
002
OK
Packet Sender pomyślnie przekazał wiadomość »Hi«.
Wiadomość została zatem odebrana. Można wysłać odpowiedź korzystając ponownie z polecenia CIPSEND, czyli np:
001
AT+CIPSEND=7
002
>Hello
żnica w porównaniu z poprzednim programem znajduje się w jednym wierszu:
success &= sendCom("AT+CIPSTART=\"UDP\",\"192.168.4.2 \",90,91", "OK");
Jak widać, podany został drugi port. Ten port, w tym przypadku port o numerze 91, to port, który moduł odsłuchuje czekając na nadchodzące dane. Po załączeniu tego prostego wiersza możliwe jest także wysyłanie danych do modułu. Ponadto można odsłuchiwać ten sam port, z którego wysyłane są wiadomości. Można więc dla obu portów wpisać liczbę 90. Teoretycznie zmiana ta daje możliwość
Loading...
+ 56 hidden pages