Archiv pro štítek: 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