我將/如何通過中間電腦通過 SSH 訪問/程式遠端 Arduino?
我的筆記型電腦上安裝了 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
: