← zpět na zápisky z Arduino projektů
Flash firmware Micropythonu do NodeMCU (ESP8266)
Tuto sekci jsem prováděl bez dětí. Flashování firmware není zrovna záživná záležitost. Nicméně jednou se k ní děti třeba vrátí, až si budou chtít přeflashovat svoje NodeMCU :-)
- Co je potřeba umět
- Hardware
- Software
- Postup
- 1. Stáhnout a nainstalovat NodeMCU driver
- 2. Připojit NodeMCU k počítači přes microUSB kabel
- 3. Zjistit, na jakém portu se objevil
- 4. Nainstalovat Python
- 5. Získat Esptool
- 6. Zjistit typ čipu
- 7. Zjistit MAC adresu
- 8. Stáhnout Micropython firmware pro ESP8266
- 9. Přepnout NodeMCU do flash režimu
- 10. Smazat obsah flash
- 11. Zapsat nový firmware do NodeMCU
- 12. Test
Pořídil jsem několik NodeMCU devkitů šlapajících na ESP8266. Tyto čipy díky svému výkonu (v základu 80 MHz, lze zvýšit až na 160 MHz - což i výkon zvýší asi dvojnásobně) zvládají nejen Wifi, ale i interpretované jazyky. Obvykle se nabízí ke koupi s předchystaným interpretem jazyka Lua (vlastně spíš eLua), ale je možné jej vyměnit i za Micropython nebo Arduino (programujeme pak v jazyce Wiring, který je velmi podobný C/C++).
Zvolil jsem nakonec Micropython. Nechtělo se mi učit jazyk Lua a C++ je zase trochu nemotorné pro výuku dětí. Má to své výkonové dopady (Lua je zhruba 20× pomalejší než C++, Micropython asi 10×), ale jsem s tím srozuměn a jdeme to zkusit. Vždy můžeme flashovat něco jiného.
Tohle je návod, jak nahrát nový firmware právě do NodeMCU. Vlastní flash firmware jsem prováděl na Windows i Linux, návod popisuje obě platformy.
Co je potřeba umět
- Trochu se orientovat v příkazové řádce
Hardware
- NodeMCU devkit (ESP8266), použil jsem od výrobce Lolin (Aliexpress)
- microUSB kabel
Software
Aneb někdy taky toolchain. SW nářadí, které bude potřeba.
- Driver NodeMCU
- Python (na Linuxu nejspíš už máte)
- Esptool
- Micropython firmware
Postup
1. Stáhnout a nainstalovat NodeMCU driver
aby ho rozpoznal operační systém. NodeMCU driver najdeme zde.
2. Připojit NodeMCU k počítači přes microUSB kabel
3. Zjistit, na jakém portu se objevil
Windows (nemám bohužel českou verzi)
- Control panels/Device manager
- Pod záložkou Ports (COM & LPT) najít, kde ho máme
Linux
ls -l /dev/tty*
nebo ještě lépe
dmesg | tail
4. Nainstalovat Python
Brát verzi 3.x, na Linuxu velmi pravděpodobně už Python je.
5. Získat Esptool
Nástroj napsaný v pythonu pro flashování ESP8266 z příkazové řádky. Lze ho stáhnout přímo z Githubu a nebo je možné ho samozřejmě nainstalovat přímo přes pip:
pip install esptool
6. Zjistit typ čipu
Pokud jsme zvědaví, můžeme zjistit typ čipu.
python esptool.py --port <port> flash_id
Kde <port>
je náš port, kde se NodeMCU zrovna nachází. Pro Windows tedy nějak takto:
python esptool.py --port COM28 flash_id
Pro Linux pak třeba takto:
python esptool.py --port /dev/ttyUSB0 flash_id
A dostaneme nějakou podobnou odpověď
esptool.py v2.2-dev
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Uploading stub...
Running stub...
Stub running...
Manufacturer: c8
Device: 4016
Detected flash size: 4MB
Hard resetting...
7. Zjistit MAC adresu
Můžeme si nechat prozradit i MAC adresu zařízení.
python esptool.py --port <port> read_mac
esptool.py v2.2-dev
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Uploading stub...
Running stub...
Stub running...
MAC: 70:01:88:20:22:21
Hard resetting...
8. Stáhnout Micropython firmware pro ESP8266
Stahujeme bin soubor.
- Pokud bychom chtěli flashnout (zpátky) inpterpret Lua, je nutné si soubor sestavit ve vlastní režii ze zdrojáků a nebo si ho nechat sestavit on demand službou NodeMCU custom builds - a vybrat si jen moduly, které potřebujeme.
- Můžeme také NodeMCU programovat jako Arduino v jazyce Wiring (pak je možné ho programovat i v Arduino IDE). Board manager v Arduino IDE se pak postará o to, že sestaví pokaždé celý firmware ESP8266 SDK spolu s naším programem a flashuje vše do NodeMCU. To znamená, že jednoduchý program na bliknutí LED pak může mít i 250 KiB.
9. Přepnout NodeMCU do flash režimu
Některé návody uvádí, že je potřeba vždy uvést čip do flash režimu pomocí tlačítek Flash a Reset. Jiné pak doplňují, že je to hodně hardwarově závislé a pokud má deska USB konektor, USB-serial konvertor a DTR + RTS piny, tak že si to vše obstará sama bez naší asistence.
NodeMCU se umí samo přepnout do flash režimu. Tento krok tedy uvádím jen pro úplnost. Netřeba nic dělat.
10. Smazat obsah flash
Některé návody se o tom nezmiňují, jiné píší o tom, že mnoho potíží je zapřičiněno tím, že předchozí firmware není řádně vymazán. Proto doporučuji nejdříve flash smazat.
python esptool.py --port <port> erase_flash
esptool.py v2.2-dev
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Uploading stub...
Running stub...
Stub running...
Erasing flash (this may take a while)...
Chip erase completed successfully in 5.3s
Hard resetting...
11. Zapsat nový firmware do NodeMCU
python esptool.py --baud 115200 --port <port> write_flash --flash_mode dio 0x00000 <micropython_esp_firmware>.bin
kde
baud
= rychlost zápisu (počet bitů za sekundu), raději neměnit, nekterá zařízení to nemají rádaport
= náš port, kde je NodeMCUwrite_flash
= příkaz pro zápis firmware do flashflash_mode
= pro NodeMCU nutnědio
, na několika místech jsem se dočetl, že většina desek přežije parametrqio
, pak že dochází k automatické detekci pro flash > 4 MB, ale stálo mě to více než 2h, než jsem přišel na to, že pro NodeMCU v3 je nutné tento parametr uvést- 0x00000 = adresa, od které se začíná flashovat - pokud se sestavuje firmware ze zdrojáků, jsou to obvykle 2 soubory a každý jde od jiné adresy
micropython_esp_firmware
= firmware, který tlačíme do NodeMCU
Případné další parametry lze nastudovat v dokumentaci esptool.
Celá operace chvíli trvá (zhruba do minuty).
esptool.py v2.2-dev
Connecting....
Detecting chip type... ESP8266
Chip is ESP8266EX
Uploading stub...
Running stub...
Stub running...
Configuring flash size...
Auto-detected Flash size: 4MB
Flash params set to 0x0240
Compressed 601136 bytes to 392067...
Wrote 601136 bytes (392067 compressed) at 0x00000000 in 34.6 seconds (effective 138.8 kbit/s)...
Hash of data verified.
Leaving...
Hard resetting...
12. Test
Je dobré udělat test. Prvních několik flashů se mi nepovedlo (nenastavil jsem --flash-mode
) a nikdo neprotestoval (ani NodeMCU, ani esptool
).
Flash Micropythonu se nejlépe ověří přihlášením do konzole Micropythonu. Jsou v zásadě 3 způsoby, REPL, WebREPL AP a WebREPL klient.