[ESP8266] Krótkie wprowadzenie
: piątek 01 kwie 2016, 22:49
Uf.. Wreszcie po długich przemyśleniach i kubku kawy postanowiłem opisać to co wiem i to czego nie wiem o układzie ESP8266 znajdującym się w module ESP12.
TEORIA
Troszkę suchych faktów, według noty katalogowej dotyczącej naszego układu sam 32 bitowy procesor pędzony jest zegarem 80MHz, maksymalnie może osiągnąć on 160MHz. Na pokładzie mamy takie cudeńka jak:
Peryferia tedostępne są w momencie pisania własnego firmwaru, czym zajmiemy się w następnych częściach tego "kursu" (jeżeli nie skończę w lochach za te wypociny
). Na początek jednak zajmiemy się prostą obsługą modułu ESP12 jako zewnętrznego modułu podłączonego do Arduino. W moim przypadku będzie to Arduino UNO R3 oraz moduł ESP-12-Q, rozbudowany o parę dodatkowych pinów, nie ma to jednak żadnego znaczenia gdyż na razie będziemy korzystać tylko i wyłącznie z paru pinów.
Jednakże, nie smućcie się wy, którzy nie posiadacie tak profesjonalnych platform rozwojowych, sama teoria którą przedstawię tutaj pozwoli wam na samodzielne napisanie obsługi ESP na każdym mikroklocku
PODŁĄCZENIE LUB TEŻ PINOLOGIA STOSOWANA
Zajmijmy się więc gwiazdą programu. Samo PCB ESP12 prezentuje się następująco
Jak widać znajdują się tam piny od zasilania, resetu, ADC, uarta oraz pin oznaczony jako CH_PD, który jest pinem ENABLE. Moja wersja płytki różni się tym że na dole mam wyprowadzone jeszcze piny do sprzętowego SPI oraz I2C. Najważniejsze piny znajdziemy na każdym module ESP. Zaczynajmy więc. Na początek potrzebujemy przejściówki UART/USB oraz zasilania 3.3, ja do tego wykorzystam Arduino z wyciągniętym procesorem.
WAŻNE! Pin GPIO0 powinien być w stanie wysokim w momencie pracy z komendami AT, na wielu forach podają że może też być pinem fruwającym ale to nie działało mi za dobrze więc rekomenduje podłączenie go do Vcc. GPIO0 zwarte do masy oznacza że będziemy programować nową wersję softu na ESP.
KOMUNIKACJA UART - czyli rozmowy kontrolowane
Do pinów RX oraz TX podłączamy przejściówkę UART/USB. Prędkość ustawiamy na 115200 (zależnie od wersji ESP i wersji firmware równie dobrze może to być 9600). Ja będę używał Putty. Na ekranie, po podłączeniu zasilania do modułu powinniśmy zobaczyć coś takiego lub bardzo podobnego (znów zależność od wersji firmware):
Ready oznacza że wszystko poszło okej, często pojawia się też INVALID, spotkałem parę modułów, które się tak zachowywały, niczym się nie różniły w funkcjonowaniu od innych z tym samym softem, na jednym i drugim dużo nie działało. Dlatego sprawdźmy jaką mamy wersję softu. Komendy wysyłamy do układu w formie
Na końcu musi być znak powrotu karetki oraz znak końca linii. W Putty robi się to za pomocą kombinacji
Tak więc sprawdźmy czy wszystko poszło okej. Na start wklepmy samo
Komenda testowa AT zwraca
jeżeli moduł jest gotowy do działania. Osobiście wykorzystywałem tą komendę przy inicjalizacji, sprawdzałem w pętli kiedy dostanę zwrot OK i wtedy wiedziałem że moduł jest gotów do dzikich szaleństw
Inne możliwe zwroty to:
w wypadku błędu
w przypadku kiedy ESP wykonuje już jakąś robotę
kiedy nadejdzie nowy pakiet
Te wszystkie zwroty należało by jakoś sparsować. Wymyśliłem na to całkiem ciekawy patent.
Kod pisałem z palca, bo właściwy zaginął mi gdzieś w czeluściach bitów na dysku
Dodanie nowego parametru który może zwrócić nam moduł nie zmieniało by funkcji parsującej a sprowadzało jedynie do zmiany 2 na 3 i dodaniu elementu do tablicy. Sama funkcja parsująca jedynie by jechała w pętli po buforze.
To teraz po tych moich herezjach programistycznych jedziemy dalej, sprawdźmy soft
W moim module jest to wersja:
Firmware skompilowany prawie rok temu, stary, do tego bardzo zarobaczony. Weźmy się więc do update naszego moduliku! Dla osób które nie chcą/nie muszą tego robić polecam ominięcie tej części, jest nudna i żmudna
UPDATE SOFTU
Z racji tego że update z sukcesem udał mi się tylko korzystając z windowsa opiszę tą metodę, ale na dniach prawdopodobnie będę pisał cały skrypt automatycznie ładujący soft najnowszy na moduł ESP więc podzielę się na forum doświadczeniami.
Zaczynamy od ściągnięcia softu stąd następnie udajemy się na forum i ściągamy najnowszy soft. Na dzień dzisiejszy (tj. 01-04-2016) jest to wersja 1.5.2 z dnia 29-01-2016.
Odłączamy nasze ESP, wyłączamy konsolę. Pin GPIO0 podłączamy do GND tylko na czas update firmware.
Program do update ustawiamy tak:
Po zakończeniu procesu przełączamy pin GPIO0 w stan wysoki i sprawdzamy na konsoli wersję oprogramowania. Jeżeli wersja zgadza się z tą, którą zaprogramowaliśmy możemy przejść dalej.
Jest jeszcze jedna ważna rzecz, musimy wyczyścić pamięć ustawień, bez tego często funkcje nie chcą działać i zachodzimy w głowę o co chodzi.
Wklepujemy te polecenie:
I już wszystko powinno działać jak należy
Piszemy pierwszy program!
Przechodzimy teraz do najważniejszego i najciekawszego, czyli napiszemy pierwszy program z wykorzystaniem Arduino i naszego modułu
Znów pare faktów, ESP może działać w paru trybach. W trybie klienta i serwera oraz w trybie AP oraz klient sieci WIFI. Ma 2 interfejsy sieciowe z 2 różnymi adresami MAC. My będziemy działać jako klient sieci WIFI. Zaczynamy, pierwszy program. Zaczniemy od prostej strony WWW.
Plan programu jest prosty
Myślę że każdy da radę napisać to na każdym mikroprocesorze. Tutaj zabiorę się za to na Arduino, z jednego powodu, mało razy używałem Arduino, leży, kurzy się, to niech się spoci troszkę
Do dzieła.
Z racji tego że nasze Arduino ma tylko jeden sprzętowy UART, drugi, który wykorzystamy do komunikacji z ESP jest programowy, musimy zmniejszyć baudrate ESP z powodu niewyrabiania się programowego UARTA na 115200. Oczywiście te osoby, które już mają prędkość 9600 ustawioną mogą śmiało olać ten kawałek. Dla reszty, wklepujemy
Podłączamy Linie RX -> D2 i TX -> D3 w Arduino. Na początek przetestujemy połączenia prostym programikiem
Następnie w monitorze szeregowym ustawiamy prędkość 9600, oraz znak powrotu karetki i końca linii.
Po wpisaniu komendy AT widać piękny zwrot OK, znaczy działa
Przechodzimy dalej.
Spróbujmy teraz odpalić prosty serwer WWW na naszych demonach prędkości. Znów trochę teorii. ESP może działać jako serwer oraz klient w jednym czasie, jednak może nawiązać tylko 5 połączeń, lub żeby było jaśniej, stworzyć tylko 5 socketów UDP lub TCP. Na to trzeba zwrócić uwagę projektując serwer. Do tego może obsłużyć naraz tylko jeden port jako serwer. Nasłuchiwać może teoretycznie na kilku, jednak do tego trzeba przerabiać firmware, a dziś zostajemy tylko i wyłącznie na oryginalnym, do następnego razu
Prosty kod który powoduje że w przeglądarce ujrzymy taki widok:
Warto mieć też monitor lub konsolę odpaloną dla kontroli tego co się dzieje
To by było na tyle w dzisiejszym odcinku
Za niedługo może wypuszczę następną część, jeżeli ta się przyjmie i nie zostanę zesłany na banicje
Piszcie w komentarzach czego brakowało a czego było za dużo i czy wgl było to czytelne
KOPIOWANIE ARTYKUŁU TYLKO I WYŁĄCZNIE Z PODANIEM LINKU DO ORYGINAŁU
TEORIA
Troszkę suchych faktów, według noty katalogowej dotyczącej naszego układu sam 32 bitowy procesor pędzony jest zegarem 80MHz, maksymalnie może osiągnąć on 160MHz. Na pokładzie mamy takie cudeńka jak:
- 10-bitowe ADC
- SPI
- UART
- I2C
- I2S
- PWM
- GPIO
Peryferia tedostępne są w momencie pisania własnego firmwaru, czym zajmiemy się w następnych częściach tego "kursu" (jeżeli nie skończę w lochach za te wypociny
Jednakże, nie smućcie się wy, którzy nie posiadacie tak profesjonalnych platform rozwojowych, sama teoria którą przedstawię tutaj pozwoli wam na samodzielne napisanie obsługi ESP na każdym mikroklocku
PODŁĄCZENIE LUB TEŻ PINOLOGIA STOSOWANA
Zajmijmy się więc gwiazdą programu. Samo PCB ESP12 prezentuje się następująco
Jak widać znajdują się tam piny od zasilania, resetu, ADC, uarta oraz pin oznaczony jako CH_PD, który jest pinem ENABLE. Moja wersja płytki różni się tym że na dole mam wyprowadzone jeszcze piny do sprzętowego SPI oraz I2C. Najważniejsze piny znajdziemy na każdym module ESP. Zaczynajmy więc. Na początek potrzebujemy przejściówki UART/USB oraz zasilania 3.3, ja do tego wykorzystam Arduino z wyciągniętym procesorem.
WAŻNE! Pin GPIO0 powinien być w stanie wysokim w momencie pracy z komendami AT, na wielu forach podają że może też być pinem fruwającym ale to nie działało mi za dobrze więc rekomenduje podłączenie go do Vcc. GPIO0 zwarte do masy oznacza że będziemy programować nową wersję softu na ESP.
KOMUNIKACJA UART - czyli rozmowy kontrolowane
Do pinów RX oraz TX podłączamy przejściówkę UART/USB. Prędkość ustawiamy na 115200 (zależnie od wersji ESP i wersji firmware równie dobrze może to być 9600). Ja będę używał Putty. Na ekranie, po podłączeniu zasilania do modułu powinniśmy zobaczyć coś takiego lub bardzo podobnego (znów zależność od wersji firmware):
Ready oznacza że wszystko poszło okej, często pojawia się też INVALID, spotkałem parę modułów, które się tak zachowywały, niczym się nie różniły w funkcjonowaniu od innych z tym samym softem, na jednym i drugim dużo nie działało. Dlatego sprawdźmy jaką mamy wersję softu. Komendy wysyłamy do układu w formie
Kod: Zaznacz cały
AT+KOMENDA\r\nNa końcu musi być znak powrotu karetki oraz znak końca linii. W Putty robi się to za pomocą kombinacji
Kod: Zaznacz cały
CTRL + M -> znak powrotu karetki
CTRL + J -> znak końca liniiTak więc sprawdźmy czy wszystko poszło okej. Na start wklepmy samo
Kod: Zaznacz cały
AT\r\nKomenda testowa AT zwraca
OK
jeżeli moduł jest gotowy do działania. Osobiście wykorzystywałem tą komendę przy inicjalizacji, sprawdzałem w pętli kiedy dostanę zwrot OK i wtedy wiedziałem że moduł jest gotów do dzikich szaleństw
Inne możliwe zwroty to:
w wypadku błędu
ERROR
w przypadku kiedy ESP wykonuje już jakąś robotę
busy p...
kiedy nadejdzie nowy pakiet
+IPD
Te wszystkie zwroty należało by jakoś sparsować. Wymyśliłem na to całkiem ciekawy patent.
Kod pisałem z palca, bo właściwy zaginął mi gdzieś w czeluściach bitów na dysku
Kod: Zaznacz cały
struct
{
char* msg;
int ret;
}return_msg;
#define MSG_NUMBER 2
return_msg tab[MSG_NUMBER] = {tab[0].msg="OK", tab[0].ret=0, tab[1].msg="ERROR", tab[1].ret=1};
Dodanie nowego parametru który może zwrócić nam moduł nie zmieniało by funkcji parsującej a sprowadzało jedynie do zmiany 2 na 3 i dodaniu elementu do tablicy. Sama funkcja parsująca jedynie by jechała w pętli po buforze.
To teraz po tych moich herezjach programistycznych jedziemy dalej, sprawdźmy soft
Kod: Zaznacz cały
AT+GMR\r\nW moim module jest to wersja:
Firmware skompilowany prawie rok temu, stary, do tego bardzo zarobaczony. Weźmy się więc do update naszego moduliku! Dla osób które nie chcą/nie muszą tego robić polecam ominięcie tej części, jest nudna i żmudna
UPDATE SOFTU
Z racji tego że update z sukcesem udał mi się tylko korzystając z windowsa opiszę tą metodę, ale na dniach prawdopodobnie będę pisał cały skrypt automatycznie ładujący soft najnowszy na moduł ESP więc podzielę się na forum doświadczeniami.
Zaczynamy od ściągnięcia softu stąd następnie udajemy się na forum i ściągamy najnowszy soft. Na dzień dzisiejszy (tj. 01-04-2016) jest to wersja 1.5.2 z dnia 29-01-2016.
Odłączamy nasze ESP, wyłączamy konsolę. Pin GPIO0 podłączamy do GND tylko na czas update firmware.
Program do update ustawiamy tak:
Po zakończeniu procesu przełączamy pin GPIO0 w stan wysoki i sprawdzamy na konsoli wersję oprogramowania. Jeżeli wersja zgadza się z tą, którą zaprogramowaliśmy możemy przejść dalej.
Jest jeszcze jedna ważna rzecz, musimy wyczyścić pamięć ustawień, bez tego często funkcje nie chcą działać i zachodzimy w głowę o co chodzi.
Wklepujemy te polecenie:
Kod: Zaznacz cały
AT+RESTORE\r\nI już wszystko powinno działać jak należy
Piszemy pierwszy program!
Przechodzimy teraz do najważniejszego i najciekawszego, czyli napiszemy pierwszy program z wykorzystaniem Arduino i naszego modułu
Znów pare faktów, ESP może działać w paru trybach. W trybie klienta i serwera oraz w trybie AP oraz klient sieci WIFI. Ma 2 interfejsy sieciowe z 2 różnymi adresami MAC. My będziemy działać jako klient sieci WIFI. Zaczynamy, pierwszy program. Zaczniemy od prostej strony WWW.
Plan programu jest prosty
- Inicjalizacja UART
- Inicjalizacja ESP
- Połączenie ESP z siecią wifi
- Ustawienie ESP w tryb serwer
- Nasłuchiwanie na porcie 80
- Następuje połączenie, na początek nie będziemy sprawdzać co otrzymaliśmy tylko wyplujemy paczkę z kodem HTML do wyświetlenia w przeglądarce
- Powrót do nasłuchu
Myślę że każdy da radę napisać to na każdym mikroprocesorze. Tutaj zabiorę się za to na Arduino, z jednego powodu, mało razy używałem Arduino, leży, kurzy się, to niech się spoci troszkę
Z racji tego że nasze Arduino ma tylko jeden sprzętowy UART, drugi, który wykorzystamy do komunikacji z ESP jest programowy, musimy zmniejszyć baudrate ESP z powodu niewyrabiania się programowego UARTA na 115200. Oczywiście te osoby, które już mają prędkość 9600 ustawioną mogą śmiało olać ten kawałek. Dla reszty, wklepujemy
Kod: Zaznacz cały
AT+UART_DEF=9600,8,1,0,0\r\nPodłączamy Linie RX -> D2 i TX -> D3 w Arduino. Na początek przetestujemy połączenia prostym programikiem
Kod: Zaznacz cały
#include <SoftwareSerial.h>
SoftwareSerial ESPSerial(2,3);
void setup()
{
ESPSerial.begin(9600);
Serial.begin(9600);
while (!Serial);
}
void loop()
{
if (ESPSerial.available())
Serial.write(ESPSerial.read());
if (Serial.available())
ESPSerial.write(Serial.read());
}Następnie w monitorze szeregowym ustawiamy prędkość 9600, oraz znak powrotu karetki i końca linii.
Po wpisaniu komendy AT widać piękny zwrot OK, znaczy działa
Spróbujmy teraz odpalić prosty serwer WWW na naszych demonach prędkości. Znów trochę teorii. ESP może działać jako serwer oraz klient w jednym czasie, jednak może nawiązać tylko 5 połączeń, lub żeby było jaśniej, stworzyć tylko 5 socketów UDP lub TCP. Na to trzeba zwrócić uwagę projektując serwer. Do tego może obsłużyć naraz tylko jeden port jako serwer. Nasłuchiwać może teoretycznie na kilku, jednak do tego trzeba przerabiać firmware, a dziś zostajemy tylko i wyłącznie na oryginalnym, do następnego razu
Kod: Zaznacz cały
#include <SoftwareSerial.h>
#define DEBUG true
SoftwareSerial esp8266(2,3); // Pin D2(RX) -> ESP-TX
//Pin D3(TX) -> ESP-RX
void setup()
{
Serial.begin(9600);
esp8266.begin(9600); //Nasz serial programowy, to z jego powodu zmniejszaliśmy prędkość
sendData("AT+RST\r\n",1000,DEBUG);
delay(1000);
sendData("AT+CWMODE_CUR=3\r\n",1000,DEBUG); // ustawiamy w tryb 3 czyli AP + Client WIFI
delay(1000);
sendData("AT+CWJAP_CUR=\"TWOJE_SSID\",\"TWOJE_HASLO\"\r\n",1000,DEBUG); // Należy podać hasło i SSID swojej sieci WIFI
/*W momencie wysłania komendy do połączenia z siecią przy udanej autoryzacji otrzymamy takie informacje jak
WIFI CONNECTED
WIFI GOT IP
OK
Ewentualnie możemy dostać przy złych danych (SSID i PASSWORD)
WIFI DISCONNECT
CWJAP:2
*/
while(1)
{
if(esp8266.available() && esp8266.find("OK"))
{
Serial.print("CONNECTED\n\r");
break;
}
else if(esp8266.available() && esp8266.find("DISCONNECT"))
{
Serial.print("ERROR\n\r");
while(1);
}
}
sendData("AT+CIPMUX=1\r\n",1000,DEBUG); // wymagane przy ustawianiu serwera jest uruchomienie multipołączeń
delay(1000);
sendData("AT+CIPSERVER=1,80\r\n",1000,DEBUG); // uruchamiamy serwer i ustawiamy go na nasłuch portu 80
delay(1000);
sendData("AT+CIFSR\r\n",1000,DEBUG); // informacje o MAC i adresach IP
}
void loop()
{
if(esp8266.available()) // Jeżeli jest jakakolwiek wiadomość od ESP
{
if(esp8266.find("+IPD,")) //Pakiety zawsze dostają na początku +IPD,nrPolaczenia,dlugoscDanych: blablabla
{
delay(1000);
int connectionId = esp8266.read()-48; //wyciagamy nr połączenia, zero w ASCII zaczyna się od 48
//Tworzymy paczkę danych, zwykły HTML
String webpage = "<h1>Hello</h1><h2>World!<h2>";
String cipSend = "AT+CIPSEND=";
cipSend += connectionId;
cipSend += ",";
cipSend +=webpage.length();
cipSend +="\r\n";
//Najpierw wysyłamy informacje o tym że wgl chcemy coś wysłać wraz z numerem połączenia
sendData(cipSend,1000,DEBUG);
//A potem wysyłamy same dane, już bez znaków końca lini, ESP sam przerwie wczytywanie po otrzymaniu odpowiedniej ilości bajtów
sendData(webpage,1000,DEBUG);
//zamykamy połączenie
String closeCommand = "AT+CIPCLOSE=";
closeCommand+=connectionId; // append connection id
closeCommand+="\r\n";
sendData(closeCommand,3000,DEBUG);
}
}
}
String sendData(String command, const int timeout, boolean debug)
{
String response = "";
esp8266.print(command); // send the read character to the esp8266
long int time = millis();
while( (time+timeout) > millis())
{
while(esp8266.available())
{
// The esp has data so display its output to the serial window
char c = esp8266.read(); // read the next character.
response+=c;
}
}
if(debug)
{
Serial.print(response);
}
return response;
}
Prosty kod który powoduje że w przeglądarce ujrzymy taki widok:
Warto mieć też monitor lub konsolę odpaloną dla kontroli tego co się dzieje
To by było na tyle w dzisiejszym odcinku
KOPIOWANIE ARTYKUŁU TYLKO I WYŁĄCZNIE Z PODANIEM LINKU DO ORYGINAŁU