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

我如何通过中间计算机通过 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 上的设备节点。

答案1

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

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

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=

更复杂的是,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 命令

答案2

最简单的设置是在远程计算机上安装 Arduino IDLE,然后使用 ssh 访问它。

为了能够通过 ssh 发送图形,只需将标志 -X 添加到末尾:

$ ssh username@ip-adress -X

答案3

如果根本目标是对 Arduino 进行编程,而无需将其与预先存在的 USB 连接断开(例如,可能是 ROS 系统上的节点),但您距离它足够近,可以运行电缆,那么您可以使用ICSP 端口上的系统内编程器(我使用 Olimex AVI-ISP-MK2)。

在 Arduino IDE 中,它是“草图”>“使用程序员上传”,或 Ctrl+Shift+U。这种方式比通过 USB 更容易,因为永远不需要设置 ISP 连接到的 USB 端口的 /dev 分配。

〜贾斯汀

答案4

thrig 的回答非常详细,但很笼统。我认为有一个几乎是剪切和粘贴的答案可能会有所帮助。以下内容是在 Windows 10 1903 上使用 Arduino IDE 1.8.12 进行测试的,但如果您提供自己的 scp 和 ssh,应该很容易适应较旧的 Windows 版本。

为此,您需要进行一些设置,以便可以通过 ssh 从当地的偏僻的无需在命令行上要求输入密码或密码短语。

它还假设您已在远程系统上成功设置并配置了带有 avrdude 的 Arduino IDE。

以下所有内容中带***标记的都需要修改

最后免责声明:我还没有测试如果任何路径包含空格会发生什么。此外,也没有任何检查可以防止您覆盖文件等。

在本地系统上,在Arduino-安装目录\硬件\arduino\avr创建或编辑一个名为

平台.local.txt并将其添加为内容:

tools.remoteavrdude.path={runtime.tools.avrdude.path}
tools.remoteavrdude.cmd.path={path}\bin\avrrelay.bat
tools.remoteavrdude.remote.host=***user***@***host***
tools.remoteavrdude.remote.cmd.path=***how to invoke avrdude on the remote system. could be sudo avrdude***
tools.remoteavrdude.remote.config.path=***which config file on the remote system to use. could be /etc/avrdude.conf***
tools.remoteavrdude.remote.file.path=***to which filename the compiled code should be copied to on the remote system***

tools.remoteavrdude.upload.params.verbose=-v
tools.remoteavrdude.upload.params.quiet=-q -q
# tools.remoteavrdude.upload.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value
tools.remoteavrdude.upload.verify=
tools.remoteavrdude.upload.params.noverify=-V
tools.remoteavrdude.upload.pattern="{cmd.path}" {remote.host} "{remote.cmd.path} -C{remote.config.path} {upload.verbose} {upload.verify} ***the board-specific options*** -Uflash:w:{remote.file.path}:i" {build.path}\{build.project_name}.hex {remote.file.path}

tools.remoteavrdude.program.params.verbose=-v
tools.remoteavrdude.program.params.quiet=-q -q
# tools.remoteavrdude.program.verify is needed for backwards compatibility with IDE 1.6.8 or older, IDE 1.6.9 or newer overrides this value
tools.remoteavrdude.program.verify=
tools.remoteavrdude.program.params.noverify=-V
tools.remoteavrdude.program.pattern="{cmd.path}" {remote.host} "{remote.cmd.path} -C{remote.config.path} {program.verbose} {program.verify} ***the board-specific options*** -Uflash:w:{remote.file.path}:i" {build.path}\{build.project_name}.hex {remote.file.path}

tools.remoteavrdude.erase.params.verbose=-v
tools.remoteavrdude.erase.params.quiet=-q -q
tools.remoteavrdude.erase.pattern="{cmd.path}" {remote.host} "{remote.cmd.path} -C{config.path} {erase.verbose} {program.extra_params} -e ***the board-specific options*** -Ulock:w:{bootloader.unlock_bits}:m -Uefuse:w:{bootloader.extended_fuses}:m -Uhfuse:w:{bootloader.high_fuses}:m -Ulfuse:w:{bootloader.low_fuses}:m"

tools.remoteavrdude.bootloader.params.verbose=-v
tools.remoteavrdude.bootloader.params.quiet=-q -q
tools.remoteavrdude.bootloader.pattern="{cmd.path}" {remote.host} "{remote.cmd.path} -C{config.path} {bootloader.verbose} ***the board-specific options*** {program.extra_params} -Uflash:w:{remote.file.path}:i -Ulock:w:{bootloader.lock_bits}:m {runtime.platform.path}\bootloaders\{bootloader.file} {remote.file.path}

为了董事会特定选项, 查看平台.txt在远程系统上。通常类似于-p{build.mcu} -c{upload.protocol} -D上传-p{build.mcu} -c{protocol} {program.extra_params}

同样在此目录中,编辑

程序员.txt并添加以下内容:

remoteavrdude.name=remote avrdude
remoteavrdude.protocol=***what your board needs***
remoteavrdude.program.tool=remoteavrdude
***any other options for your board and programmer, check programmers.txt on the remote system***

然后,在Arduino-安装目录\硬件\工具\avr\bin创建一个名为

avrrelay.bat并将其添加为内容:

IF "%~3" == "" GOTO execute
C:\Windows\Sysnative\OpenSSH\scp.exe "%3" %1:%4
:execute
C:\Windows\Sysnative\OpenSSH\ssh.exe %1 %2

如果您使用其他 scp / ssh,请更改上面的路径。

相关内容