Archiv pro měsíc: Listopad 2016

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