Archiv pro rubriku: Arduino

Vzdálené nahrávání programu do Arduina – přes WIFI

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
Přidání definic desek ESP8266 do Arduino IDE

Přidání definic desek ESP8266 do Arduino IDE

V Arduino IDE vyberte desku Vývojová deska: Generic ESP8266module

Výběr ESP8266 modulu v Arduino IDE

Výběr ESP8266 modulu v Arduino IDE

Upravte název wifi sítě (SSID), ke které se bude modul připojovat a heslo (pass).

Nastavení wifi SSID a hesla

Nastavení wifi SSID a hesla

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):
Arduino MEGA jako USB / COM převodník pro ESP8266

Arduino MEGA jako USB / COM převodník pro ESP8266

  • 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.

Připojení ESP8266AVRISP pro ICSP programování Arduina - arduino nahrání programu přes wifi

Připojení ESP8266AVRISP pro ICSP programování Arduina

Zapojení ICSP konektoru na Arduinech je následující:

Zapojení ICSP konektoru Arduino

Zapojení ICSP konektoru Arduino

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).

nastavení převodu IP / COM

Nastavení virtuálního COM portu

Důležité poznámky

  1. 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í.
  2. 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.
  3. 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.

LAN bootloader pro Arduino MEGA 2560 (Atmel ATMEGA 2560)

Pro pohodlné nahrávání software do Arduina, které je někde na síti se hodí mít k dispozici bootloader, který umožní nahrávat firmware přes LAN síť bez nutnosti mít cílové zařízení připojené přímo k počítači s vývojovým prostředím. Jak takovouto funkcionalitu rozchodit na velkém Arduinu s procesorem ATMEGA 2560 si ukážeme v tomto článku.

V první řadě bych rád představil projekt Ariadne Bootloader, který nahradí stávající zavaděč Arduina (a zároveň zůstane kompatibilní s přímým nahráváním sketches z vývojového prostředí Arduina). Nyní tedy přesný postup, jak rozchodit Ariadne Bootloader na desce Arduino Mega 2560.

1) pro nahrání do Arduina, budete potřebovat nějaký programátor. Já jsem použil jiné Arduino UNO a nahrál do něj kód, který je připraven v příkladech. Tento kód zajistí, že se Arduino bude chovat jako programátor.

Arduino ISP

Arduino ISP

2) nyní propojte Arduino (do kterého jste nahráli Arduino ISP) s cílovým Arduinem Mega 2560 podle následujícího obrázku.

Propojení Arduino UNO s cílovým Arduino MEGA 2560

3) stáhněte si příslušný hex soubor s Ariadne Bootloaderem s kombinací AT Mega procesoru a čipu na ethernet shieldu. V mém případě to byl tento soubor pro kombinaci ATMega 2560 a Wiznet W5100 na ethernet shieldu. V době programování tohoto bootloaderu samozřejmě ethernet shield nepřipojujte.

4) nyní budete potřebovat avrdude pro naprogramování. Vypadá to nějak takto:

Avrdude - programování zavaděče 1

cmd_avrdude2

Budete potřebovat tyto tři příkazy:

Verze pro Windows:

avrdude -c avrisp -p m2560 -P COM3 -b 19200 -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xD8:m -U efuse:w:0xFF:m
avrdude -c avrisp -p m2560 -P COM3 -b 19200 -V -U flash:w:ariadne_atmega2560.hex
avrdude -c avrisp -p m2560 -P COM3 -b 19200 -U lock:w:0x0F:m

Pozor: pokud to hází timeouty, asi máte špatně nastavenou rychlost portu, já musel použít 19200, defaultně tam je 115200Bd… je potřeba taky nastavit správný port (v mém případě COM3)

avrisp je definice programátoru Arduino as ISP pod windows. Pod linuxem jsem netestoval, ale mělo by to vypadat nějak takto:

avrdude -c usbasp -p m2560 -P usb -b 115200 -e -u -U lock:w:0x3F:m -U efuse:w:0xFD:m -U hfuse:w:0xD8:m -U efuse:w:0xFF:m
avrdude -c usbasp -p m2560 -P usb -b 115200 -V -U flash:w:ariadne_atmega2560.hex 
avrdude -c usbasp -p m2560 -P usb -b 115200 -U lock:w:0x0F:m

Po úspěšném nahrání ethernet bootloaderu do Arduina můžeme vypnout napájení, odpojit programátor (Arduino UNO s nahraným Arduino as ISP), připojit ethernet shield a vyzkoušet funkčnost.

5) Po zapnutí napájení je uvedený bootloader dostupný na IP adrese 192.168.1.128 s maskou 255.255.255.0 . Pokud není v mikrokontroléru žádný další nahraný software, bootloader čeká na nahrání programu v nekonečné smyčce. Pokud je již software nahraný, čeká bootloader na nahrání 10 sekund po resetu a poté se začne vykovávat nahraný program.

Síťové rozhraní počítače, ze kterého budeme chtít posílat program přes TFTP, je potřeba nastavit na shodnou síť. Například nastavíte:

IP adresa počítače např. 192.168.1.100
Maska 255.255.255.0
Brána 192.168.1.1

Můžeme vyzkoušet zda odpovídá na ping příkazem:

ping 192.168.1.128 -t

6) Pokud odpovídá a je vše v pořádku, můžeme vyzkoušet nahrát některý testovací software. Doporučuji blink. Soubor musí být ve formátu .bin, hex soubory nelze přes TFTP posílat. Jako TFTP nedoporučuji používat příkazový řádek windows, TFTP je defaultně ve Windows vypnuto, ale hlavně řadě uživatelů nahrávání z příkazového řádku interním TFTP nefunguje z nejrůznějších důvodů. Obvykle to vrací „connect request failed“.

Prověřený klikací prográmek je tento: tftpd32 . Je potřeba ho povolit ve firewallu. Po spuštění programu se ale Windows obvykle zeptá a stačí dát tedy povolit v dialogovém okně firewallu.

Vyberete soubor který chcete nahrát, nastavíte IP adresu a port 69. Poté stiskntete PUT a soubor se nahraje do arduina. Podmínkou je, že musí být aktivní bootloader v arduinu (bliká rychle LED). Pokud tomu tak není, resetujte arduino a máte 10 sekund na odeslání souboru.

Nahrávání přes TFTP

Nahrávání přes TFTP

Potvrzení úspěšného nahrání

Potvrzení úspěšného nahrání

7) Nyní bude chtít určitě nahrát nějaký svůj firmware. Jak ho vytvořit z přeloženého kódu? Soubor hex musíte přetransformovat do bin.

Na rozdíl od sériového programování, které používá HEX soubory na naprogramování Arduina, server TFTP implementovaný v bootloaderu pracuje s binárními soubor (*.bin). To znamená, že budete muset ručně převést své programy do správném formátu. Nejprve si vytvořte svůj program v prostředí Arduina, potom stiskněte tlačítko Přeložit/Ověřit. Potom je potřeba najít soubor hex, které prostředí Arduina vytvořilo. Je v dočasném adresáři. Na všech platformách můžete zjistit cestu k hex souboru pokud ve vlastnostech zaškrtnete „Zobrazit více informací během výstupu kompilace“. Cesta s hex souborem bude zobrazena v posledním řádku výstupu kompilace.

Výpis cesty k souborům a dalších podrobností

Výpis cesty k souborům a dalších podrobností

V mém případě na Windows byla cesta k souboru jednoho mého projektu takováto:

"C:\Users\UIVATE~1\AppData\Local\Temp\arduino_build_992369/swtopeni.ino.ino.hex"

Potom příkaz pro převod z hex do bin vypadá takto:

"C:\Program Files (x86)\Arduino\hardware\tools\avr\bin\avr-objcopy.exe" -I ihex "C:\Users\UIVATE~1\AppData\Local\Temp\arduino_build_992369\swtopeni.ino.ino.hex" -O binary "C:\Users\UIVATE~1\AppData\Local\Temp\arduino_build_992369\swtopeni.cpp.bin"

(pozor, musí se zadat jako jeden řádek).

Hex to bin

Hex to bin

Pokud je vše správně, vytvoří se *.bin soubor v adresáři dle cesty uvedené v posledním parametru příkazu.

Tento bin soubor pak lze přes TFTP bootloader odeslat do Arduina. Viz bod 6.

BTW1: Nahrávání přes USB z prostředí do Arduina je s tímto bootloaderem zachováno, takže si můžete vybrat, jestli budete programovat přes LAN nebo USB.

BTW2: Pokud je zařízení vzdálené a nelze ho resetovat ručně pomocí tlačítka aby naběhl LAN bootloader, doporučuji si napsat přes webové ovládaní arduina nějaké tlačítko nebo port který spustí tento trik s watchdogem a zařízení se resetuje vzdáleně.

Tuning dětského autíčka s Arduinem a hrstí LEDek (Knight – rider)

Díky pár LED diodám a Arduinu můžete oživit dětem nudné autíčko o skvělé světelné efekty. Konkrétní návod na efektní běžící světlo, jako v legendárním Knight Rideru, naleznete v tomto článku.

Hardware

8 červených LED diod jsem připojil na porty D2, D3, D5, D6, D7, D9, D11, D12. Zbylé piny D4, D8 a D10 jsem použil na zadní červená světla a boční žlutá světla. Vlastní realizace byla provedena jako vrabčí hnízdo přímo na desce Arduina. LED jsem připájel přímo na Arduino Nano a připojil proti zemi pomocí rezistorů 220R. Jako vypínač jsem použil tento model s červenou indikační LED. Pochopitelně by šlo použít všechny dostupné piny pro běžící světlo, ale jelikož jsem pájel LED přímo na Arduino Nano, fyzicky by se mi LED vedle sebe nevešly. Volné piny 8 a 10 jsem připojil pomocí kablíků a rezistorů opět 220R k zadním červeným LED. Volný PIN 4 jsem připojil k bočním žlutým sériově řazeným LED v sérii s rezistorem 68R. Celek je napájen z 9V baterie a vestavěn do plastového autíčka pomocí vrtačky, vrtáku a tavné lepící pistole 🙂

Software

Kód pro Arduino je velmi jednoduchý a určitě Vás napadne řada dalších úprav nebo vylepšení.

int pinArray[] = {2, 3, 5, 6, 7, 9, 11, 12};
int count = 0;
int timer = 60;

V proměnné pinArray[] je nadefinováno pole čísel pinů, ke kterým jsou připojeny červené LED pro efekt bežícího světla jako v legendárním Knight Rideru.

Dále je cyklem nadefinováno, že uvedené piny se mají chovat jako výstupy. Zbylé piny jsou pro přehlednost deklarovány zvlášť a použil jsem je pro zadní červená světla a boční žlutá světla.

void setup(){
 for (count=0;count<8;count++) {
 pinMode(pinArray[count], OUTPUT);
 }
pinMode(4, OUTPUT); //zluta svetla
pinMode(8, OUTPUT); //cervene zadni svetlo
pinMode(10, OUTPUT); //cervene zadni svetlo
}

V hlavní programové smyčce je prováděno pomocí dvou cyklů postupné rozsvědcení a zhasínání červených LED. Vždy po doběhnutí je změněn směr a jsou změněny i stavy zadních červených LED a bočních žlutých LED.

 void loop() {
 for (count=0;count<7;count++) {
 digitalWrite(pinArray[count], HIGH);
 delay(timer);
 digitalWrite(pinArray[count + 1], HIGH);
 delay(timer);
 digitalWrite(pinArray[count], LOW);
 delay(timer*2);
 digitalWrite(4, LOW);
 digitalWrite(8, LOW);
 digitalWrite(10, HIGH);
 
 }
 for (count=7;count>0;count--) {
 digitalWrite(pinArray[count], HIGH);
 delay(timer);
 digitalWrite(pinArray[count - 1], HIGH);
 delay(timer);
 digitalWrite(pinArray[count], LOW);
 delay(timer*2);
 digitalWrite(4, HIGH);
 digitalWrite(8, HIGH);
 digitalWrite(10, LOW);
 
 }
 
 }

Jak to vypadá v realitě, ukazuje následující video:

 Seznam součástek

Arduino Nano nebo Micro 1ks

LED dioda červená – doporučuji úspornou verzi 2mA – 10ks (nebo celé balení 200ks)

LED dioda žlutá 2ks

Rezistor 220R 10ks

Rezistor 68R 1ks

Vodič 2×0,35mm2 podle potřeby

Vypínač 1ks

Konektor na 9V baterii 1ks

Tavná pistole

Náhradní náplně do tavné pistole