중간 컴퓨터를 통해 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은 이식성이 떨어지는 것 같습니다) 대안은 avrdudeArduino가 연결된 시스템에 (원격으로) 설치하는 것입니다. 이것이 가능하다면 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에 연결하고 업로드할 데이터를 전달한 다음 avrdudeCLIENT 시스템에서 전달된 데이터를 사용하여 REMOTE에서 실제 프로그래머 명령을 실행하는 새로운 프로그래머입니다.

클라이언트 프로그래머

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의 코드에 복사되고 적용될 수 있지만 복사된 데이터를 tmp 파일에 배치하고 클라이언트가 호출 해야 하는 프로그램 avrdude(1)에 공급해야 하도록 파일 이름을 지정해야 한다고 명시 되어 있습니다. 전체 경로를 사용하거나 SSH를 사용할 수 있는 디렉터리에 위치합니다 .avrdudeavrrelay-remotechmod +xPATH

#!/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

기본 목표가 기존 USB 연결(예: ROS 시스템의 노드)에서 연결을 끊지 않고 Arduino를 프로그래밍하는 것이지만 케이블을 연결할 수 있을 만큼 Arduino에 가까이 있는 경우 ICSP를 사용할 수 있습니다. 포트 컴퓨터의 시스템 내 프로그래머(저는 Olimex AVI-ISP-MK2를 사용합니다).

Arduino IDE에서는 스케치 > 프로그래머를 사용하여 업로드 또는 Ctrl+Shift+U입니다. 이 방법은 ISP가 연결된 USB 포트에 대해 /dev 할당을 설정할 필요가 없기 때문에 USB를 통한 방법보다 쉽습니다.

~저스틴

답변4

thrig의 답변은 매우 자세하지만 매우 일반적입니다. 거의 잘라서 붙여넣는 답변이 도움이 될 것이라고 생각했습니다. 다음은 Arduino IDE 1.8.12를 사용하여 Windows 10 1903에서 테스트되었지만 자체 scp 및 ssh를 제공하는 경우 이전 Windows 버전에도 쉽게 적용할 수 있습니다.

이렇게 하려면 SSH를 통해 연결할 수 있도록 뭔가를 설정해야 합니다.현지의도착하다외딴명령줄에서 비밀번호나 패스프레이즈를 요청할 필요가 없습니다.

또한 원격 시스템에서 avrdude를 사용하여 Arduino IDE를 성공적으로 설정하고 구성했다고 가정합니다.

아래 ***로 표시된 내용은 모두 수정이 필요합니다.

최종 면책조항: 경로에 공백이 포함된 경우 어떤 일이 발생하는지 테스트하지 않았습니다. 또한 파일 덮어쓰기 등을 방지하는 검사도 없습니다.

로컬 시스템에서는Arduino 설치 디렉토리\hardware\arduino\avr다음 이름의 파일을 생성하거나 편집합니다.

platform.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를 사용하시는 경우 위의 경로를 변경해주세요.

관련 정보