我如何通过中间计算机通过 SSH 访问/编程远程 Arduino?

5 linux ssh arduino

我的笔记本电脑上安装了 Arduino IDE,我想对连接到同一网络中的远程计算机的远程 Arduino (Uno) 进行编程,例如,Raspberry Pi(Arduino Uno 将插入其中)使用 USB 电缆)连接到我的无线网络。我需要设置什么才能做到这一点?

注意:我并不是想使用 Arduino 作为 SSH 客户端。我想做的是在笔记本电脑上的 Arduino IDE 和 Raspberry PI 之间建立某种隧道(最好是 SSH),Arduino 板通过 USB 电缆连接到 Raspberry PI。

理想情况下,当我按下Upload按钮时,本地编译的固件将通过隧道发送到远程 Arduino。另外,我会使用串行监视器远程连接到/dev/ttyACM0远程 Pi 上的设备节点。

thr*_*rig 2

缺少 USB 设备代理(截至 2016 年 2 月,usbip 似乎不太便携),另一种方法是安装avrdude在 Arduino 连接的系统上(远程)。avrdude如果这是可能的,那么可以指示 Arduino IDE 运行系统(客户端)调用连接到REMOTE 的程序。缺点:需要摆弄 Arduino IDE 配置文件,可能很脆弱,需要额外的工作来支持诸如此类的事情arduinoOTA......

CLIENT (Arduino IDE) -> ssh -> REMOTE (avrdude) -> usb -> arduino
Run Code Online (Sandbox Code Playgroud)

Arduino IDE 应包含programmers.txt配置platform.txt文件(例如,位于Arduino.app/Contents/Java/hardware/arduino/avrmac 版本下)。这些文件中我们需要的是一个新的程序员,它将与 REMOTE 连接并传递要上传的数据,然后在 REMOTE 上使用avrdude从 CLIENT 系统传递的数据发出实际的程序员命令。

客户端程序员

添加Java/hardware/arduino/avr/programmers.txt类似的东西

avrrelay.name=AVR RELAY
avrrelay.protocol=stk500v2
avrrelay.program.tool=avrrelay
avrrelay.program.extra_params=
Run Code Online (Sandbox Code Playgroud)

更复杂的是,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"
Run Code Online (Sandbox Code Playgroud)

然后在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"
Run Code Online (Sandbox Code Playgroud)

远程脚本

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 
Run Code Online (Sandbox Code Playgroud)

该命令可以复制并适应 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"
Run Code Online (Sandbox Code Playgroud)

理论上,重新启动 Arduino IDE 并尝试使用新的“AVR RELAY”编程器。使用你疯狂的调试技巧找出故障所在,重复。

远程串行监视器

为了使串行监视器远程工作,一个可能的选择是通过以下方式转发socat

用于连接远程计算机中的串行端口并记录数据的无缓冲 socat 命令