Pokud chcete programovat vzdálená zařízení s Arduinem, případně ATMEL AVR procesory, může se hodit následující projekt – Arduino nahrání programu přes wifi. Při potřebě nahrát nový firmware nemusíte nic nikam připojovat, upload nového firmware probíhá přes wifi – tzv. OTA upload – (Over The Air upload).
Prakticky to funguje tak, že se použije miniaturní deska ESP8266 a přes standardní ICSP konektor se programuje Arduino (nebo jiný AVR) přes wifi. Výhodné je to například v případě, že máte po domě nebo po nějakém provoze řadu Arduin, které Vám řídí ledasco a nechce se Vám je obcházet, když chcete upgradovat program. Osobně jsem si na tento proces tak zvykl, že prakticky ke všem projektům s Arduinem připojím ESP8266 v popsané konfiguraci a programuji a ladím vše přes wifi v koncové aplikaci (a často geograficky rozdílné lokaci) bez připojení kabelem k PC a fyzické přítomnosti.
Co budeme potřebovat
- Modul ESP8266, stačí v nejlevnější variantě jen jako samostatný modul – ESP8266MOD.
- Přidat do Arduino IDE (vývojové prostředí) ESP8266 a desku do vlastnosti (správce dalších desek přidat http://arduino.esp8266.com/stable/package_esp8266com_index.json) – podrobnější návod například zde.
- USB / COM převodník – nejjednodušeji ho vytvoříte z Arduino desky, tak, že propojíte RST a GND. (já testoval UNO a MEGA)
- Program ESP8266AVRISP – nahrát do modulu ESP8266MOD.
Jak nahrát do ESP8266 požadovaný software ESP8266AVRISP
Přidejte v nastavení Arduino IDE definici ESP8266 desek. Do řádku „Správce dalších desek URL“ přidejte:
http://arduino.esp8266.com/stable/package_esp8266com_index.json
V Arduino IDE vyberte desku Vývojová deska: Generic ESP8266module
Upravte název wifi sítě (SSID), ke které se bude modul připojovat a heslo (pass).
Nyní bude potřeba vzít páječku a trochu si zabastlit. Na modulu ESP8266:
- propojte pin GPIO 15 s GND kapkou cínu přímo na modulu – takto to zůstane natrvalo
- propojte GPIO 0 s GND – toto propojení bude po nahrání programu potřeba odstranit
- připojte stabilizátor a kondenzátor 470uF mezi Vcc a GND přímo na modul
- Propojte piny EN, RST na VCC (na fotografii je rezistor, ale funguje to i když to propojíte natvrdo).
- Vezměte Arduino UNO nebo MEGA a spojte RST pin na Arduinu s GND na Arduinu – takto bude mikrokontrolér na Arduinu držen v resetu a deska se bude chovat jen jako hloupý USB / COM převodník. V různých diskusích jsem našel zmínky, že to nefunguje a že je nutné použít převodník USB/ COM nebo další obskurnosti – mě to fungovalo vždy a s různými druhy Arduin, tak se toho nebojte.
- Připojte TX a RX modulu ESP8266 na TX a RX Arduina (Arduino piny 0,1). RX na RX a TX na TX
- Připojte napájení, wifi modul napájejte přímo z Arduina. Mělo by to vypadat nějak takto (na obrázku není kondenzátor ani stabilizátor 3,3V pro ESP 8266 a je napájen přímo z 3,3V výstupu Arduina):
- Otevřete si sériový terminál (v Arduino IDE Nástroje -> Sériový terminál) na příslušném portu a nyní a resetujte modul ESP8266 odpojením a znovu připojením napájení (pouze napájení modulu, ne Arduina, protože by se ztratil příslušný port). Mělo by to vypsat něco jako boot mode 1,6) . Pokud se zobrazují klikyháky, změňte rychlost portu na 74880Bd (případně experimentujte s jinými rychlostmi).
- Nyní můžete nahrát program do ESP8266, vyberte příslušný COM port a upload speed 115200. (ano, opravdu 115200).
- Po nahrání do ESP8266 odpojte napájení a a zrušte propojku GPIO 0 na GND. Propojku GPIO15 na GND ponechte. Bez ní by wifi modul nenaběhl do standardního módu. Po opětovném připojení napájení (resetu modulu) by se měl již modul připojit k nastavené wifi a získat adresu z DHCP. Zjistěte jeho IP adresu (například z logu routeru nebo ze záložky DHCP leases, případně DHCP zápůjčky v administraci routeru).
- Do sériové konzole by ESP8266 mělo po resetu vypsat:
Arduino AVR-ISP over TCP IP address: 192.168.10.93 Use your avrdude: avrdude -c arduino -p <device> -P net:192.168.10.93:328 -t # or -U ...
- Pokud je vše v pořádku, můžete už odpojit vodiče od RX a TX modulu a naopak připojit vodiče ke GPIO5, GPIO14, GPIO13, GPIO12. Těmito vodiči se bude připojovat Arduino (AVR ICSP konektor), které chcete vzdáleně programovat. Připojení bude následující:
ESP8266 GPIO5 - Arduino RST (bílá) ESP8266 GPIO14 - Arduino SCK (oranžová) ESP8266 GPIO13 - Arduino MOSI (zelená) ESP8266GPIO12 - Arduino MISO (žlutá)
Nejlepší je připojit vše na ICSP konektor. Na následujícím obrázku se můžete podívat, jak jsem to pro účely testování udělal já (všimněte si nabastleného stabilizátoru 3,3V aby bylo možno celek napájet z 5V. 5V je dostupných na ICSP konektoru, 3,3V nikoliv.
Zapojení ICSP konektoru na Arduinech je následující:
Vlastní programování Arduina přes wifi
Linux
Programování probíhá na portu 328, pod linuxem je obvykle u avrdude k dispozici i přepínač net:, příkaz potom vypadá takto:
avrdude -c arduino -p <device> -P net:192.168.10.93:328 -t # or -U ...
Windows
Pod Windows ve standardní instalaci Arduino IDE/avrdude přepínač net: nefunguje. Musíte nainstalovat virtuální sériový port (převodník COM / LAN). Já použil tento. Zde si vyberete volné číslo COM portu a přiřadíte mu IP adresu wifi desky ESP8266 a port (defaultně 328). Potom v Arduino IDE vyberete příslušný COM port a programujete vzdálené Arduino příkazem Projekt -> Nahrát pomocí programátoru (Ctrl + Shift + U). Nikoliv šipkou, tou to nefunguje, protože očekává fyzicky připojené Arduino. Toto je jediné malé omezení a je potřeba si zvyknout na to nemačkat v Arduino IDE šipku „Nahrát“, ale Nahrát pomocí programátoru (Ctrl + Shift + U).
Důležité poznámky
- ESP8266 je citlivý na kvalitu napájení, wifi potřebuje poměrně značný proud především při vysílání a pokud nemá stabilní napájení náhodně se resetuje nebo kouše. V mém případě trochu pomohlo připojení 470uF kondenzátoru přímo k modulu, nicméně přesto se modul občas zasekl a celý proces nefungoval (ESP8266 jsem měl připojený na 3,3V výstup Arduina). Celý problém jsem vyřešil připojením 3,3V stabilizátoru před ESP8266 a celek napájím z 5V výstupu Arduina. Kondenzátor 470uF přímo u modulu ESP8266MOD je pochopitelně stále samozřejmostí.
- ESP8266 je potřeba napájet napětím 3,3V. GPIO porty má však 5V tolerantní. I přes rozšířenou pověru, že se zničí připojením k 5V logice Arduina, mi to takto funguje řadu měsíců. A nejsem sám. Takže se toho nebojte a v tomto případě se nezdržujte převodníkem úrovní 5/3,3V.
- Pokud nahráváte do Arduina přes ESP8266AVRISP musíte dát vždy Projekt -> Nahrát pomocí programátoru (Ctrl + Shift + U). Jestliže zmáčknete pouze šipku, nebude to fungovat, protože Arduino IDE bude na portu očekávat standardní Arduino.