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.
##############################################################
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
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
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ść!