[ESP8266] Krótkie wprowadzenie

Pozostałe układy mikrokontrolerów, układy peryferyjne i inne, nie mieszczące się w powyższych kategoriach.
Awatar użytkownika
inż.wielki
User
User
Posty: 307
Rejestracja: niedziela 20 gru 2015, 23:11

[ESP8266] Krótkie wprowadzenie

Postautor: inż.wielki » 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:

  • 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 :D ). 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

esp-12-modul-wifi-z-esp8266-i-antena-pcb.jpg


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.

esp1png_sshhnea.png


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):
espkonsol_sshhwhw.png

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\n

Na 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 linii


Tak więc sprawdźmy czy wszystko poszło okej. Na start wklepmy samo

Kod: Zaznacz cały

AT\r\n

Komenda 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 :lol:
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\n


W moim module jest to wersja:
Putty_2_wersja.png


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 :D

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:
ESP_Flash_tool.png


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\n

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
  1. Inicjalizacja UART
  2. Inicjalizacja ESP
  3. Połączenie ESP z siecią wifi
  4. Ustawienie ESP w tryb serwer
  5. Nasłuchiwanie na porcie 80
  6. 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
  7. 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ę ;) 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

Kod: Zaznacz cały

AT+UART_DEF=9600,8,1,0,0\r\n


Podłą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 ;) 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 ;)

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 :) Za niedługo może wypuszczę następną część, jeżeli ta się przyjmie i nie zostanę zesłany na banicje :D 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
Nie masz wymaganych uprawnień, aby zobaczyć pliki załączone do tego posta.
Ostatnio zmieniony niedziela 26 cze 2016, 12:55 przez inż.wielki, łącznie zmieniany 1 raz.

Awatar użytkownika
dambo
Expert
Expert
Posty: 645
Rejestracja: czwartek 17 mar 2016, 17:12

Re: [ESP8266] Krótkie wprowadzenie

Postautor: dambo » piątek 01 kwie 2016, 23:15

super! Ja się zabrałem za niego od łatwiejszej strony - poprzez wgranie Blynka na niego i sterowanie przez telefon, ale zawsze chciałem wiedzieć jak on działa na niższym poziomie.
Nowy blog o tematyce embedded -> https://www.embedownik.pl/

Awatar użytkownika
inż.wielki
User
User
Posty: 307
Rejestracja: niedziela 20 gru 2015, 23:11

Re: [ESP8266] Krótkie wprowadzenie

Postautor: inż.wielki » piątek 01 kwie 2016, 23:17

Samo programowanie ESP żeby działał jako samodzielne urządzenie też będzie, ale na początek potrzeba było trochę teorii. Poza tym, czasem trzeba też mieć połączenie z internetem z takiego arduino czy STM a wtedy ESP z komendami AT jest bardzo fajnym rozwiązaniem :D

Awatar użytkownika
inż.wielki
User
User
Posty: 307
Rejestracja: niedziela 20 gru 2015, 23:11

Re: [ESP8266] Krótkie wprowadzenie

Postautor: inż.wielki » niedziela 03 kwie 2016, 14:57

Reset ustawień wykonujesz po wgraniu nowego oryginalnego firmware, przy wgrywaniu swojego nie masz opcji resetu przez komendy jeżeli tego nie zaimplementujesz

Awatar użytkownika
Antystatyczny
Geek
Geek
Posty: 1177
Rejestracja: czwartek 03 wrz 2015, 22:02

Re: [ESP8266] Krótkie wprowadzenie

Postautor: Antystatyczny » niedziela 03 kwie 2016, 16:12

wielki pisze:Podłączamy Linie RX -> D2 i TX -> D3 w Arduino. Na początek przetestujemy połączenia prostym programikiem


No dobrze, ale typowe Arduino pracuje na napięciu 5V, zaś ESP jest na 3.3V. Nie potrzebuję żadnego dopasowania poziomów?
"The true sign of intelligence is not knowledge but imagination" Albert Einstein.

Awatar użytkownika
inż.wielki
User
User
Posty: 307
Rejestracja: niedziela 20 gru 2015, 23:11

Re: [ESP8266] Krótkie wprowadzenie

Postautor: inż.wielki » niedziela 03 kwie 2016, 16:15

Też się nad tym zastanawiałem, ale najwidoczniej ESP toleruje te zmiany poziomu, dla pewności możesz zastosować konwerter. Ja jednak podłączam swój moduł prosto do Arduino i na razie żyje, a z tego co widzę to w internecie to nie stosują konwertera. Ale masz racje, muszę to dopisać do artykułu

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [ESP8266] Krótkie wprowadzenie

Postautor: matty24 » niedziela 03 kwie 2016, 16:54

To chyba zależy od producenta. Na adafruit:
All digital IO pins are protected from over-voltage with a snap-back circuit connected between the
pad and ground. The snap back voltage is typically about 6V, and the holding voltage is 5.8V. This provides protection from over-voltages and ESD. The output devices are also protected from
reversed voltages with diodes.

Natomiast w innym DS:
All digital IO pins must add an overvoltage protection circuit (snap back circuit) between the pin and ground. Usually bounce (snap back) voltage is about 6V, while maintaining the voltage is 5.8V. This prevents excessive voltage and generating ESD. Diodes also avoid reverse voltage output devices.

Dla bezpieczeństwa warto jednak zastosować konwerter poziomów bo nie kosztuje wiele a nawet na szybko można sobie w domu polutować.

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [ESP8266] Krótkie wprowadzenie

Postautor: matty24 » poniedziałek 04 kwie 2016, 22:29

Dzięki wielki za ogrom pracy włożony w poradnik. Przebrnąłem przez cały artykuł pomyślnie i mogę się podzielić spostrzeżeniami laika:
  • do pierwszego podłączenia wystarczy najtańszy konwerter USB-TTL na PL2303 ze sterownikami z linku: Klik Po instalacji wystarczy wejść w aktualizację sterowników - przeglądaj w poszukiwaniu - pozwól wybrać z listy i wskazać starszą wersje
  • ESP-07 z Aliexpress działało domyślnie na baud rate 115200
  • jak komuś nie działa Putty to polecam prościutki Termite 3.2 bo do powyższego zadania się nadaje w zupełności
  • podczas aktualizacji firmware należy zwrócić uwagę na ręczne wpisanie adresów przy ścieżkach w zależności od rozmiaru pamięci w naszym ESP; tabela z adresami jest pod linkiem: klik
  • cytat "Podłączamy Linie RX -> D2 i TX -> D3 w Arduino. " oznacza, że linię TX z ESP podłączamy do D2 a RX z ESP do D3 w arduino. Ja początkowo zrozumiałem to odwrotnie
  • w ostatnim kodzie należy wprowadzić własny SSID i hasło sieci Wifi a nie bezmyślnie skopiować do programu i wgrać
  • adres do wyświetlenia strony pojawi nam się w monitorze arduino i nie będzie sztywno 192.168.0.33
Może niektóre uwagi są oczywiste ale może warto je napisać dla kogoś dopiero raczkującego w elektronice.

Awatar użytkownika
inż.wielki
User
User
Posty: 307
Rejestracja: niedziela 20 gru 2015, 23:11

Re: [ESP8266] Krótkie wprowadzenie

Postautor: inż.wielki » poniedziałek 04 kwie 2016, 22:33

Dzięki za sprostowanie, co do baudrate, tak, napisałem że ono działa, ale jak odpalisz kod na Arduino to się okażę że sprzętowy UART nie wyrabia się z prędkością 115200 i trzeba ją zaniżyć do 9600. I faktycznie, słabo opisałem te linie, następnym razem postaram się pokazać to na schemacie.

Awatar użytkownika
phill2k
User
User
Posty: 288
Rejestracja: niedziela 18 paź 2015, 00:12

Re: [ESP8266] Krótkie wprowadzenie

Postautor: phill2k » piątek 29 kwie 2016, 14:16

wielki pisze:
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.

Ściągamy wersję NONOS czy z RTOS ?, tak dla uściślenia ;)

Awatar użytkownika
matty24
User
User
Posty: 333
Rejestracja: sobota 31 paź 2015, 20:11
Lokalizacja: Małopolska

Re: [ESP8266] Krótkie wprowadzenie

Postautor: matty24 » piątek 29 kwie 2016, 14:38

Ja pobierałem NONOS i autor też chyba korzystał z NONOS.

Awatar użytkownika
inż.wielki
User
User
Posty: 307
Rejestracja: niedziela 20 gru 2015, 23:11

Re: [ESP8266] Krótkie wprowadzenie

Postautor: inż.wielki » piątek 29 kwie 2016, 16:42

Tak jak zostało wspomniane, wersja non os


Wróć do „Inne mikroklocki, również peryferyjne”

Kto jest online

Użytkownicy przeglądający to forum: Obecnie na forum nie ma żadnego zarejestrowanego użytkownika i 16 gości