ESP8266, IoT – praktyczny przykład cz. 4 – Arduino IDE

ESP na płytce stykowej
ESP na płytce stykowej

ESP8266 dotąd programowaliśmy z użyciem ESPtool i w języku LUA. Tym razem  zaprogramujemy ESP bezpośrednio z Arduino IDE.

Jakie są różnice? nodeMcu był to firmware wgrany na flash ESP8266. Programy w języku LUA były wgrywane na wydzielony system plików, sam firmware pozostawał bez zmian. Różnica jest taka, że Arduino IDE będzie przygotowywać za każdym razem nowy firmware który będziemy wgrywać na ESP. Na nasze szczęście, Arduino IDE potrafi zrobić to same, więc narzędzie esptool nie będzie nam potrzebne. No, precyzyjnie mówiąc – nie musimy mieć specjalnie zainstalowanego esptool Arduino IDE za nas to zrobi.

Arduino IDE i ESP8266 w jednym stały domu

Pierwszy krok – przystosować Arduino IDE do pracy z ESP. Na szczęście dla początkujących użytkowników jest to bardzo proste zadanie. Otwieramy okno ustawień Arduino IDE (Ctrl + ,) i w polu Additional Boards Manager URLs wklejamy link do definicji pakietu ESP8266 dla Arduino IDE: http://arduino.esp8266.com/stable/package_esp8266com_index.json

Teraz menu Tools/Board/Boards Manager (to jest to menu gdzie wybiera się rodzaj płytki, Boards Manager jest na samej górze) w pole wyszukiwania wpisujemy ESP i powinniśmy dostać między innymi „esp8266 by EPS8266 Community”. Klikamy ten wynik i gdy pojawi się przycisk Install, wiadomo co zrobić :)

Chwilkę to trwa, ale gdy pasek postępu pokaże nam że już wszystko gotowe, możemy przystąpić do testów. W menu Tools/Boards wybieramy Generic ESP8266 module. Gdy drugi raz zajrzysz do menu Tools zobaczysz, że sekcja wyboru płytki ma teraz mnóstwo dodatkowych opcji.

Pierwszą istotną informacją jest rozmiar pamięci flash. Wybrać należy rozmiar zgodny z tym co wiemy o naszym module. Jego rozmiar jest podawany jako dwie wartości. Np 512K (64K SPIFFS). Pierwsza wartość (512) to całkowity rozmiar pamięci flash. Druga wartość to jaka część pamięci flash ma być zarezerwowana na system plików. Czyli w tym przypadku mamy 512 kB flasha z czego 64 kB zajęte są na system plików, reszta dostępna dla szkicu. Ile mamy flash w naszym module? To najlepiej sprawdzić w miejscu gdzie kupowałeś swój moduł.

Jeśli takiej informacji nie masz to metody o 100% skuteczności nie ma, najbliższa prawdzie będzie metoda stosowana przez nodeMCU. Także jeśli nie wiesz – zainstaluj na ESP8266 nodeMCU i wywołaj polecenie (w ESPlorer)  node.info() by dowiedzieć się ile pamięci ma Twoje ESP. Instalacja nodeMCU opisana jest w pierwszej części przewodnika.

Wybranie złej wartości pamięci może prowadzić do zawieszenia się układu – zazwyczaj tak się stanie w przypadku gdy układ ma mniej pamięci niż podałeś. Dlatego jeśli nie wiesz, zawsze możesz wybrać bezpieczną wartość 512K/64K. Dla większości zastosowań to będzie aż nadto miejsca.

Co z pozostałymi parametrami? Nie zauważyłem, by moduły ESP8266 będące w sprzedaży na Nettigo reagowały na zmiany prędkości pamięci Flash, CPU czy inne. Podłączenie pamięci flash jest typu QIO, ale szkic na DIO działa tak samo.

Pierwszy szkic z Arduino IDE na ESP8266

Przetestujmy – najprostszą rzecz, czyli niech ESP wysyła jakieś dane na Serial a my spróbujemy odczytać to na komputerze. Szkic jeszcze prostszy niż klasyczny Blink.

void setup() {
  Serial.begin(115200);
  Serial.println(ESP.getChipId(), HEX);
  Serial.println(ESP.getFlashChipId(), HEX);

  Serial.println(ESP.getFlashChipSize());
  Serial.println(ESP.getFlashChipSpeed());
}

void loop() {
  Serial.println("TICK");
  delay(2000);

}

Co my tu mamy? Jak widać W setup ustawiamy prędkość seriala (115200), oraz kolejno wysyłamy odczytany ID układu (MAC – getChipId) oraz ID producenta, ID układu (o tym była mowa w oddzielnym artykule) następnie rozmiar i prędkość pamięci flash. Ale, jak pisałem wcześniej z testów na różnych układach wynika,  że są to wartości ustawione w menu Tools/Board a nie prawdziwe…

Potem co dwie sekundy (dzieje się to w loop), będzie wysyłał do nas komunikat. Jeśli programowałeś/aś cokolwiek na Arduno, to wszystko powinno być jasne. Jedynie funkcje ESP.xxx() są nowością, ich opis znajdziecie tam gdzie całą dokumentację do Arduino core dla ESP8266. Dokładniej w sekcji Biblioteki/API dla ESP.

Przed wgraniem szkicu na ESP8266, musimy ustawić (podobnie jak podczas wgrywania firmware nodeMCU w poprzednich części) ESP w tryb aktualizacji firmware. Jeśli korzystasz z adaptera dostępnego na Nettigo wystarczy podpiąć do GND pin GPIO0 i zrestartować moduł. Moduł nie startuje lecz czeka na nowy firmware. Po jego wgraniu we flash podaje kilka informacji diagnostycznych i zaczyna normalną pracę. Wynik działania (monitor portu był otwarty przed wgraniem szkicu by złapać całą komunikację):

Serial monitor - ESP8266 nadaje do komputera
Serial monitor – ESP8266 nadaje do komputera

Ostatnia linia wypluta przez firmware to ~ld potem już wynik działania szkicu. W normalnym trybie (bez GND0 i nowego fw) firmware nic nie raportuje na Serial, zacznie się od wyniku działania szkicu.

Nie ma tutaj automatycznego resetu jak w Arduino – przed każdym wgraniem firmware musisz powtórzyć podłączenie GPIO0 do GND. Potem musisz go odłączyć, albo po resecie ESP nie będzie dział, bo znowu będzie czekał na firmware.

Dwie pierwsze wartości są podane jako szesnastkowe (bo dodaliśmy argument HEX do Serial.println). Dla wyjaśnienia – pierwsza wartość (A14DB8) to są trzy ostatnie bajty adresu MAC jaki ma dany moduł ESP8266, druga wartość to jest ID producenta układu flash i ID układu (więcej o tym było w artykule o odczytywaniu wielkości pamięci flash – link podano wyżej) tutaj jest to id producenta C8 a id układu 4013 (zwróć uwagę że jest inna kolejność bajtów!).

Sterowanie GPIO na ESP8266 – Arduino way

Gdy sterowaliśmy pinami GPIO używając nodeMCU, w dokumentacji była tabelka oznaczająca, który pin jaki ma numer, by użyć go jako argumentu funkcji. Arduino core dla ESP przyjęło nieco inną filozofię. Otóż numer GPIO odpowiada numerowi używanemu przez Arduino IDE. Czyli – chcąc ustawić stan GPIO0 na wysoki napiszemy digitalWrite(0, HIGH); natomiast dla GPIO14 będzie to digitalWrite(14,HIGH);. Proste. Ale jest tutaj jeden szkopuł. Otóż, GPIO na ESP8266 nie mają ciągłej numeracji. I to nie dlatego że np ESP nie ma GPIO9. Ma, ale może ono być użyte wewnętrznie (komunikacja ESP8266 z układem Flash?). Próba nawet ustawienia takiego GPIO przez pinMode może spowodować że Twój program się zawiesi. Także upewnij się, że używasz właściwych numerów.

Dynamiczne ujęcie świecącej diody
Dynamiczne ujęcie świecącej diody

Dobra, przywołany wcześniej już był Blink. Zróbmy go! Podłączamy diodę przez rezystor ok 200 om do GPIO13 (rezystor do nóżki GPIO13, dioda dłuższą nóżką do rezystora a krótszą do masy), i wgrywamy File/Examples/01. Basics/Blink. Ponieważ użyliśmy GPIO13, mamy w Arduino IDE używać portu 13, a w UNO jest tam dioda LED, więc nawet naszego blinka nie musimy edytować. Tylko wgrać (pamiętaj o podpięciu masy do GPIO0 przed wgraniem szkicu).

Czemu tak słabo świeci?

Jeśli podpiąłeś wszystko jak należy zobaczysz migającą diodę. Gratulacje! Osoby, które robił takiego blinka na Arduino mogą zauważyć, że dioda świeci wyraźnie słabiej niż w wypadku Arduino. Wynika to z faktu, że stan wysoki na wyjściu ESP jest reprezentowany przez napięcie 3.3V. Jeżeli dioda zużywa ok 2V, to dla rezystora zostaje tylko 1.3V. Gdyby diodą sterowało Arduino, wówczas stan wysoki byłby reprezentowany przez 5V. Wówczas po odjęciu napięcia diody na rezystorze zostałoby ok 3V. Taki sam rezystor a większe napięcie – więc płynie większy prąd a dioda świeci jaśniej.

Jeśli ten temat Cię bardziej interesuje – już dość dawno temu pisałem oddzielny artykuł tłumaczący jak rezystor ogranicza prąd płynący przed diodę LED.

Zmieniając rezystor na mniejszy, zwiększymy prąd, ale musimy pamiętać o tym że o ile Arduino potrafi wygenerować na pinie cyfrowym 40 mA, to ESP8266 na wyjściu cyfrowym może mieć maksymalnie 12 mA.

Czego się nauczyliśmy?

Po tym artykule powinieneś/powinnaś umieć podłączyć ESP8266 do Arduino IDE i wgrać szkic na ESP. W następnym artykule zajmiemy się czymś bardziej rozbudowanym.

Spis części

Użyte części: