piątek, 17 lipca 2020

Arduino IDE i zdalne wgrywanie programu do układu


Czasami pojawia się konieczność kompilowania programu i ładowania do układu, który jest w większej odległości i długość kabla USB lub zasięg Bluetooth (ładowanie programu przez Bluetooth odpowiednio skonfigurowanym modułem HC-05 i SSP) są niewystarczające.
Środowisko Arduino IDE jest rozszerzalne i umożliwia skonfigurowanie dowolnego programu ładującego skompilowany kod do mikrokontrolera. Dzieje się tak dlatego, że dużo ustawień jest zdefiniowana w plikach tekstowych. W opisywanym przypadku sama płytka Arduino UNO jest podpięta pod konwerter USB2TTL połączony do Raspberry Pi (ale może to być dowolny komputer z linuksem). Natomiast środowisko Arduino IDE jest zainstalowane na desktopie (może to być Windows lub Linux). Poniżej przedstawiona jest topologia opisywana w artykule.

Zacznijmy konfigurację od Arduino IDE. Do pliku boards.txt ( katalog hardware\arduino\avr\ w katalogu gdzie jest zainstalowane Arduino IDE) dodajemy definicję płytki „Arduino UNO over SSH”:

##############################################################



unossh.name=Arduino UNO over SSH



unossh.vid.0=0x2341

unossh.pid.0=0x0043

unossh.vid.1=0x2341

unossh.pid.1=0x0001

unossh.vid.2=0x2A03

unossh.pid.2=0x0043

unossh.vid.3=0x2341

unossh.pid.3=0x0243



unossh.upload.tool=avrssh

unossh.upload.protocol=arduino

unossh.upload.maximum_size=32256

unossh.upload.maximum_data_size=2048

unossh.upload.speed=115200



unossh.bootloader.tool=avrdude

unossh.bootloader.low_fuses=0xFF

unossh.bootloader.high_fuses=0xDE

unossh.bootloader.extended_fuses=0xFD

unossh.bootloader.unlock_bits=0x3F

unossh.bootloader.lock_bits=0x0F

unossh.bootloader.file=optiboot/optiboot_atmega328.hex

unossh.build.mcu=atmega328p

unossh.build.f_cpu=16000000L

unossh.build.board=AVR_UNO

unossh.build.core=arduino

unossh.build.variant=standard


Od zwykłej definicji dla UNO różni się tylko nazwą konfiguracji (unossh) oraz narzędziem do programowania (unossh.upload.tool=avrssh). Definicja tego programatora musi być dodana do pliku platform.txt (w tym samym katalogu co boards.txt). Poniżej ta definicja (ostanie trzy linijki to przełamana jedna linijka tekstu):
#avrssh



tools.avrssh.path={runtime.tools.avrdude.path}

tools.avrssh.cmd.path={path}/../../../avrssh.cmd

tools.avrssh.config.path={path}/etc/avrdude.conf

tools.avrssh.network_cmd={runtime.tools.arduinoOTA.path}/bin/arduinoOTA

tools.avrssh.upload.params.verbose=-v

tools.avrssh.upload.params.quiet=-q -q

tools.avrssh.upload.verify=

tools.avrssh.upload.params.noverify=-V

tools.avrssh.upload.pattern="{cmd.path}" {build.path}/{build.project_name}.hex {upload.verbose} {upload.verify} -p{build.mcu} -c{upload.protocol} -b{upload.speed} -D "-Uflash:w:/tmp/{build.project_name}.hex:i"

  
Znowu jest to kopia sekcji avrdude zamienionej na avrssh z modyfikacjami.
Teraz środowisko Arduino IDE jest już skonfigurowane do wykorzystywania własnego programatora (po każdej zmianie w opisywanych plikach trzeba ponownie uruchomić Arduino IDE w celu wczytania zmienionych plików). W naszym przypadku programatorem będzie plik wsadowy avrssh.cmd umieszczony w katalogu, gdzie zainstalowany jest Arduino IDE (arduino.exe). Jego zawartość dla systemu Windows zamieszono poniżej:

rem @echo off

@echo %0

pscp -P 22 %1 pi@raspberry:/tmp

@echo ssh pi@raspberry 'avrdude -c avrdude.conf %2 -P/dev/ttyACM0 %3 %4 %5 %6 %7 %8 %9'

@echo avrdude -c avrdude.conf %2 -P/dev/ttyACM0 %3 %4 %5 %6 %7 %8 %9;sleep 10>run.sh

putty -P 22 -ssh pi@raspberry -t -m run.sh


W pliku wsadowym wykorzystywany jest pakiet PuTTY, który trzeba mieć zainstalowany na komputerze z Windows. Zamiast nazwy hosta i użytkownika i hosta (pi@raspberry) należy podać nazwę używanego konta oraz adres zdalnego komputera. Ważnym elementem konfiguracji jest dodanie publicznych kluczy SSH do naszego zdalnego komputera i możliwość logowania po kluczach bez podania hasła. W tym celu można użyć agenta ssh z pakietu PuTTY: Pagent. Konfigurację agenta i ssh można znaleźć np. tutaj: https://www.ssh.com/ssh/putty/putty-manuals/0.68/Chapter9.html (wygenerowany klucz publiczny trzeba dodać do pliku .ssh/authorized_keys na naszym zdalnym komputerze). Po prawidłowej konfiguracji kluczy SSH wykonanie polecenia:
putty -P 22256 -ssh pi@raspberry
powinno nawiązać sesję ssh bez pytania o hasło.
W przypadku komputera z systemem Linux konfiguracja Arduino IDE wygląda podobnie, z tą różnicą, że w avrssh.cmd wywoływane są standardowe polecenia ssh i scp. 
#!/bin/bash

echo Kopiowanie programu
scp $2 -P 22 $1 pi@raspberry:/tmp

echo Ładowanie programu
ssh -p22 pi@raspberry "avrdude -c avrdude.conf $2 -P/dev/ttyACM0 $3 $4 $5 $6 $7 $8 $9"
echo Gotowe



należy pamiętać o nadaniu prawa wykonywania plikowi avrssh.cmd poleceniem:
chmod +x avrssh.cmd
Tu także trzeba za pomocą ssh-keygen lub graficznego programu „Hasła i klucze” w systemie Ubuntu utworzyć klucz SSH i dodać jego część publiczną do pliku .ssh/authorized_keys na naszym zdalnym komputerze połączonym z płytką Arduino UNO.
Aby nasz komputer zdalny (np. z Rasberry Pi) mógł programować płytki Arduino trzeba zainstalować na nim narzędzie arvdude. W większości dystrybucji powinno być w standardowych repozytoriach, dlatego zainstalowanie ograniczy się do wydania polecenia:
apt install avrdude

Avrdude do działania wymaga pliku avrdude.conf. Można go skopiować z komputera z zainstalowanym Arduino IDE i umieścić w katalogu domowym.
Jeśli wszystko zostanie wykonane poprawnie, wystarczy dla płytek „zdalnych” wybrać utworzoną konfigurację:
W przypadku systemu Windows wyskoczy osobne okno PuTTY, które po załadowaniu programu powinno zniknąć. W Linuksie komunikaty pojawią się w dolnym oknie Arduino IDE i ładowanie programu jest równie szybkie jak lokalne.
Opisywana konfiguracja jest szybkim rozwiązaniem problemu. Nie działa okno monitora portu szeregowego (bo jest on na zdalnym komputerze) i jeśli komunikaty z konsoli szeregowej są istotne można je oglądać za pomocą emulatora terminalu minicom lub poleceniem cat /dev/tyyACM0 na zdalnym komputerze, pamiętając o zatrzymaniu podglądu na czas ładowania nowego programu. Nie ma także kontroli błędów po stronie zdalnej, dlatego należy obserwować komunikaty i warto na początku włączyć opcję „pokaż szczegółowe informacje podczas wgrywania” w konfiguracji środowiska. Pewne ustawienia są robione w plikach (np. nazwa pliku portu szeregowego) i mogą wymagać zmiany w konkretnym systemie. W przypadku użycia innej płytki niż UNO trzeba dostosować do niej konfigurację w analogiczny sposób jak zostało to przedstawione dla Arduino UNO.
Miłego programowania na odległość!