Linux

我將/如何通過中間電腦通過 SSH 訪問/程式遠端 Arduino?

  • May 4, 2020

我的筆記型電腦上安裝了 Arduino IDE,我想對遠端 Arduino (Uno) 進行程式,該遠端 Arduino (Uno) 連接到同一網路中的遠端機器,例如,Raspberry Pi(Arduino Uno 將插入使用 USB 電纜)連接到我的無線網路。我需要設置什麼來做到這一點?

注意:我並不是要將 Arduino 用作 SSH 客戶端。我想做的是某種隧道,最好是 SSH,在我的筆記型電腦上的 Arduino IDE 和 Raspberry PI 之間,Arduino 板通過 USB 電纜連接到該 Raspberry PI。

理想情況下,當我按下Upload按鈕時,本地編譯的韌體將通過隧道發送到遠端 Arduino。此外,我會使用串列監視器遠端連接到/dev/ttyACM0遠端 Pi 上的設備節點。

缺少 USB 設備代理(截至 2016 年 2 月的 usbip 似乎不太便攜)另一種方法是安裝avrdude在 Arduino 連接的系統 (REMOTE) 上。如果這是可能的,那麼可以指示 Arduino IDE 執行系統 (CLIENT) 呼叫連接到avrdude遠端的程序。缺點:需要在 Arduino IDE 配置文件中擺弄,可能很脆弱,需要額外的工作來支持諸如此類的東西arduinoOTA……

CLIENT (Arduino IDE) -> ssh -> REMOTE (avrdude) -> usb -> arduino

Arduino IDE 應包含配置文件(例如位於mac 版本下)programmers.txt。我們在這些文件中需要的是一個新的程序員,它將與 REMOTE 建立連接並傳遞要上傳的數據,然後在 REMOTE 上使用從 CLIENT 系統傳遞的數據發出實際的程序員命令。platform.txt``Arduino.app/Contents/Java/hardware/arduino/avr``avrdude

客戶端程序員

添加Java/hardware/arduino/avr/programmers.txt類似的東西

avrrelay.name=AVR RELAY
avrrelay.protocol=stk500v2
avrrelay.program.tool=avrrelay
avrrelay.program.extra_params=

更複雜的是,Java/hardware/arduino/avr/platform.txt重複所有tools.avrdude.包含的行並將它們調整為命名tools.avrrelay.並在必要時呼叫avrrelay-client(這些行中的大多數不是必需的,但將它們全部子化可能比找出哪些是必要的更容易):

tools.avrrelay.path={runtime.tools.avrdude.path}
tools.avrrelay.cmd.path={path}/bin/avrrelay-client
tools.avrrelay.config.path={path}/etc/avrdude.conf
... many more of these not shown, e.g. the verbose one ...
tools.avrrelay.upload.pattern="{cmd.path}" "{build.path}/{build.project_name}.hex"
tools.avrrelay.program.pattern="{cmd.path}" "{build.path}/{build.project_name}.hex"

然後在Java/hardware/tools/avr/bin目錄(應該與runtime.tools.avrdude.path配置選項相同)中創建avrrelay-client並使其可執行:

#!/bin/sh
# send the only argument (which should be the *.hex file) to avrrelay-remote
# this will need to use public key auth, or expect to automatically fill
# in any password promptes
ssh theremotehost avrrelay-remote < "$1"

遠端腳本

Arduino IDE 有一個偏好選項,可以在上傳期間顯示詳細輸出,這將顯示正在執行的命令。

/Applications/Arduino.app/Contents/Java/hardware/tools/avr/bin/avrdude \
-C/Applications/Arduino.app/Contents/Java/hardware/tools/avr/etc/avrdude.conf \
-v -patmega328p -cstk500v2 -Pusb \
-Uflash:w:/blablabla.../Blink.ino.hex:i 

此命令可以複製並適用於 REMOTE 上的程式碼,但avrdude(1)表示必須指定文件名,因此需要將複製的數據放在 tmp 文件中,並將其饋送到avrdude; 這是avrrelay-remote客戶端呼叫的程序;它需要chmod +x通過完整路徑呼叫或位於 SSH 可用PATH目錄中。

#!/bin/sh
FLASH=`mktemp /tmp/avrrelay.XXXXXXXXXX` || exit 1
# assume data passed via standard input
cat > "$FLASH"
# these flags will vary depending on programmer, etc
avrdude -C /path/to/avrdude.conf -v -patmega328p -cstk500v2 -Pusb \
"-Uflash:w:$FLASH:i"

理論上,重啟 Arduino IDE 並嘗試使用新的“AVR RELAY”程式器。使用你瘋狂的調試技巧找出它在哪裡崩潰,重複。

遠端串列監視器

為了使串列監視器遠端工作,一個可能的選擇是通過以下方式轉發socat

無緩衝的 socat 命令連接遠端機器的串口並記錄數據

引用自:https://unix.stackexchange.com/questions/341298