Wgrywanie firmware do ESP8266

1. Wstęp

Układ ESP8266 dostarczany jest przez producenta z wczytanym domyślnie oprogramowaniem sprzętowym (tak zwanym “firmware”), często jest to oprogramowanie obsługujące komendy AT (dostarczone przez Ai-Thinker Technology Co. Ltd.). Za pomocą krótkich instrukcji wysłanych do ESP8266 przez port UART możliwe jest wykonanie podstawowych operacji; połączenie z siecią WiFi, wysłanie danych itp. Wymaga to jednak podłączenia do ESP8266 układu nim sterującego.

 

EPS-01

Moduł ESP8266-01

Potencjał ESP8266 jest jednak znacznie większy… Układ posiada szereg portów; wejścia/wyjścia, magistralę HSPI/SPI, przetwornik A/C i inne. Z uwagi na możliwość wgrania innego firmware niż dostarczony przez producenta szybko powstały alternatywne rozwiązania wykorzystujące te możliwości. Płytki z układem ESP8266 stają się coraz bardziej rozbudowane i nie wymagają podłączania dodatkowego mikrokontrolera sterującego, sprzedawane są układy z wbudowanym konwerterem USB-UART a nawet wyświetlaczami OLED (nazwa płytki to D-Duino).

 

ESP-12N

Moduł ESP12-N

2. Przygotowanie ESP8266 do wczytywania firmware

Zależnie od rodzaju płytki i układów na niej umieszczonych proces wczytywania firmware wymaga pewnych akcji ze strony programującego i ewentualnej modyfikacji okablowania.

W przypadku prostych płytek np. ESP8266-01 należy wykonać następujące kroki:

  • odłączyć zasilanie od układu,
  • pin GPIO0 podłączyć do GND,
  • podłączyć zasilanie,
  • wczytać firmware (omówione w pkt 2.1),
  • odłączyć zasilanie,
  • odłączyć GPIO0 od GND,
  • włączyć zasilanie – nastąpi uruchomienie układu z nowym firmware.

Pozostałe okablowanie jest podłączone jak przy normalnej pracy układu:

  • VCC – podłączone zasilanie 3,3V,
  • GND – masa (0V),
  • TX – podłączone z RX konwertera USB-UART,
  • RX – podłączone z TX konwertera USB-UART,
  • CH_PD – podłączone do 3,3V.

Oczywiście powyższe dotyczy układów niewyposażonych w konwerter USB-UART (np. ESP8266-01) w przypadku np. ESP12-N wystarczy jedynie podłączyć kabel USB.

W przypadku rozbudowanych układów np. ESP12-N z wbudowanym konwerterem USB-UART i umieszczonym na płytce przyciskiem “flash”, należy wykonać następujące kroki:

  • odłączyć kabel USB,
  • nacisnąć przycisk FLASH,
  • podłączyć zasilanie,
  • wczytać firmware (omówione w pkt 2.1),
  • puścić przycisk FLASH,
  • odłączyć kabel USB,
  • włączyć kabel USB – nastąpi uruchomienie układu z nowym firmware.

Powyższe kroki mogą wydawać się nieco na wyrost, jednak zdarza się, że komunikacja z układem z różnych przyczyn “zawiesza się” lub występują inne błędy.

UWAGA: W systemie Linux użytkownik musi mieć prawa do zapisu na porcie UART, trwałym rozwiązaniem tego “problemu” jest:  wydanie polecenia z poziomu root:
sudoedit /etc/udev/rules.d/50-ttyusb.rules
a następnie wpisanie:
KERNEL==”ttyUSB[0-9]*”,NAME=”tts/USB%n”,SYMLINK+=”%k”,GROUP=”uucp”,MODE=”0666″
Od tej chwili porty ttyUSB będą w systemie tworzone z prawami do zapisu i odczytu przez wszystkich użytkowników.

2.1 Wczytywanie firmware w systemie Linux Debian

Popularnym narzędziem jest napisany w języku Python – ESPTool-master.

Bardzo możliwe, że koniecznym będzie doinstalowanie biblioteki Python obsługującej UART. Z poziomu administratora (root) należy wykonać:

apt-get install python-serial

Po pobraniu i rozpakowaniu ESPTool-master należy wejść do folderu ze skryptem i można  wykonać czyszczenie pamięci ESP8266:

./esptool.py –port /dev/ttyUSB0  erase_flash

Wczytanie firmware odbywa się po wydaniu polecenia:

./esptool.py –port /dev/ttyUSB0 write_flash 0x000000 nodemcu-master-7-modules-2017-09-12-12-24-06-float.bin

W powyższym przykładzie wczytano nodemcu, plik zawierający firmware został skopiowany do folderu ze skryptem esptool.py, w przeciwnym przypadku należy podać pełną ścieżkę do pliku. ESP12-N zwykle widziane jest przez system jako ttyUSB0 należy pamiętać, by użytkownik miał ustawione odpowiednie uprawnienia do zapisu danych na porcie.

3. Rodzaje firmware

Firmware jest oprogramowaniem sprawującym kontrolę nad danym układem – w tym przypadku ESP8266. Dla tego układu opracowano kilka rodzajów firmware który jest swego rodzaju szkieletem obsługującym skrypty napisane przez użytkownika, wgrane do pamięci układu w celu ich wykonania. Samo wgranie firmware wymaga wykonania kroków omówionych  w rozdziale “Przygotowanie ESP8266 do wczytania firmware” jednak późniejsze wczytywanie skryptów z programem odbywa się “w locie” i często nawet nie wymaga resetowania układu.

3.1 NodeMCU

NodeMCU zostało wydane 13 października 2014, niemalże zaraz po pojawieniu się układu ESP8266 na rynku. Jest to firmware dedykowany dla urządzeń IoT bazujących na ESP8266.

Po jego wgraniu możliwe jest pisanie programów w języku LUA które po wczytaniu do pamięci układu wykonywane są przez firmware. Domyślnie startującym skryptem po uruchomieniu jest plik o nazwie init.lua.
Możliwe jest również połączenie z układem za pośrednictwem UART i wydawanie poleceń w języku LUA “z konsoli”.

Domyślna konfiguracja UART:
baudrate – 115200
parity – none
stopbits – 1
bytesize – 8

By pobrać aktualną wersję NodeMCU należy udać się pod adres https://nodemcu-build.com/ i przygotować paczkę zawierającą moduły, które będą przez nas używane w projekcie (np. obsługa systemu FatFS do obsługi kart SD, magistrali 1Wire itp.). Pobrany plik zawierający firmware ma przykładowo postać: nodemcu-master-7-modules-2017-09-12-12-24-06-float.bin
Wczytanie pliku bin zawierającego firmware należy wykonać zgodnie z opisem z punktu 2.1.

Proces wgrywania skryptów LUA może usprawnić program NodeMCU Prog

3.2 MicroPython

MicroPython jest zoptymalizowanym pod mikrokontrolery językiem Python co sprawia iż można łatwo go przenosić między różnymi platformami i kod działający na PC można bez modyfikacji przenieść do systemu wbudowanego (między innymi do ESP8266). Do działania wymaga 256k miejsca na kod i 16k RAM.

Po jego wgraniu możliwe jest pisanie programów w języku Python, które po wczytaniu do pamięci układu wykonywane są przez firmware. Domyślnie startującym skryptem po uruchomieniu jest plik o nazwie boot.py, alternatywą (o niższym priorytecie) jest plik main.py.
Możliwe jest również połączenie z układem za pośrednictwem UART i wydawanie poleceń w języku Python “z konsoli”.

Domyślna konfiguracja UART:
baudrate – 115200
parity – none
stopbits – 1
bytesize – 8

Aktualną wersję firmware można pobrać ze strony http://micropython.org/download#esp8266
Natomiast dokumentacja wraz z przykładami dostępna jest pod adresem http://docs.micropython.org/en/v1.9.2/esp8266/esp8266/tutorial/index.html Pobrany plik zawierający firmware ma przykładowo postać: esp8266-20171101-v1.9.3.bin
Wczytanie pliku bin zawierającego firmware należy wykonać zgodnie z opisem z punktu 2.1.

Uwaga, niektóre płytki (np. ESP12-N) wymagają opcji -fm dio:

./esptool.py –port /dev/ttyUSB0 –baud 460800 write_flash –flash_size=detect -fm dio 0 esp8266-20170108-v1.8.7.bin

3.3 Arduino IDE (wersja 1.8.5)

Arduino IDE które stworzone zostało dla płytek z mikrokontrolerami AVR ma możliwość współpracy również z mikrokontrolerem ESP8266. Program dla ESP8266 pisany jest tak samo jak dla Arduino a sam układ działa bez nadrzędnego firmware (po skompilowaniu kodu powstały program pełni jego funkcję).
By aktywować to rozszerzenie należy wybrać z menu programu:

  • Plik->Preferencje – w polu “Dodatkowe adresy URL do  menadżera płytek” należy wpisać adres: http://arduino.esp8266.com/stable/package_esp8266com_index.json
  • Narzędzia->Płytka->Menadżer Płytek – należy wpisać w wyszukiwarkę “ESP”, wybrać “ESP8266 Community” i zainstalować najnowszą wersję.
  • Narzędzia->Płytka – wybrać płytkę ESP8266 Module

W tak skonfigurowanym środowisku można rozpocząć pisanie programu.

void setup() {
  Serial.begin(115200);
}
void loop() {
  Serial.println(“Hello!\n”);
  delay(1000);
}

Powyższy kod powoduje wysyłanie na UART napisu “Hello!” co sekundę.

Kompilacja odbywa się po wybraniu z menu Szkic->Weryfikuj/Kompiluj.
Przed rozpoczęciem programowania należy przygotować układ zgodnie z opisem z punktu “Przygotowanie ESP8266 do wczytywania firmware”, następnie można wybrać Szkic->Wgraj.

Odnośniki