Develop Note

W5500-EVB-Pico에서 TCP 소켓 통신을 Rust 기반으로 구현해 보기 (with embassy) 본문

개발 (Ko)/Raspberry Pi

W5500-EVB-Pico에서 TCP 소켓 통신을 Rust 기반으로 구현해 보기 (with embassy)

Chalsu 2023. 7. 19. 10:38

개요

embassy라는 Rust 기반 프레임워크를 알게 되었고, 이 프레임워크에서 W5500-EVB-Pico 라이브러리와 예제를 제공하고 있어 테스트를 해보기로 했다.

키워드 검색하다 보니 대사관 홈페이지가 나와서 뜻을 보니 대사관, 대사관 직원을 의미하는 명사였다. 그래서 embassy로 검색하기보다는 embassy rust로 검색하면 페이지를 바로 찾을 수 있다.

ChatGPT에게 물어보니 다음과 같이 답해주었다.

Github에 embassy-rs라는 조직이 구성되어 있고, 업데이트가 활발하게 이루어지고 있다.

이 글에서는 W5500-EVB-Pico를 사용하여 환경을 구성하고, TCP 소켓 통신 예제를 구동시켜 본다.

준비

  • Linux 환경
    • Virtual Machine 사용
  • W5500-EVB-Pico
  • 종류에 상관없는 여분의 Pico 보드
    • picoprobe로 사용
    • 여기에서는 WizFi360-EVB-Pico를 사용했다.
  • Breadboard
  • Hercules Tool
    • 소켓 통신 테스트용으로 사용

환경 구성

WSL2 환경에서 사용하려고 시도했는데, USB 포트 문제로 VM 환경에서 진행했다.

WSL에서 USB 포트를 사용하도록 설정하는 방법이 있었는데, 굳이 건드리고 싶지 않아서 구성해뒀던 VM을 사용했다.

VirtualBox(무료)나 VMware(유료) 프로그램을 사용하면 Host Windows에 연결된 하드웨어 장치를 VM으로 끌어올 수 있다.

Ubuntu 20.04 VM

lsusb 커맨드로 확인해보면, W5500-EVB-Pico가 다음과 같이 인식된다.

참고로, picoprobe.uf2 설치 후에는 다음과 같이 인식되는 이름이 조금 바뀐다.

Picoprobe 환경 구성

공식 가이드 문서를 참조하여, 보드를 다음과 같이 연결했다.

Build and flash picoprobe

Toolchain이 설치되지 않은 경우, 먼저 패키지를 설치한다.

$ sudo apt update
$ sudo apt install cmake gcc-arm-none-eabi libnewlib-arm-none-eabi build-essential

picoprobe repository를 clone 하고, 빌드한다.

아래 커맨드는 Raspberry Pi Pico 공식 가이드 문서에서 참조했다.

cd ~/pico
git clone https://github.com/raspberrypi/picoprobe.git 
cd picoprobe
mkdir build 
cd build
cmake ..
make -j4

Cargo

Cargo는 Rust 프로그래밍 언어의 공식 패키지 관리자로, Rust 프로젝트의 빌드 시스템과 패키지 관리자로 기능한다.

다음과 같은 기능을 제공하여 Rust의 생산성을 크게 향상시켜준다고 한다. (by ChatGPT)

Python의 pip와 같은 역할을 포함한다고 볼 수 있을 것 같다.

공식 가이드에 개발환경 구성과 테스트 방법이 잘 설명되어 있다.

환경 설정을 가이드를 따라 진행했다.

Install Rust and Cargo

curl https://sh.rustup.rs -sSf | sh

First Steps with Cargo

Cargo 설치 후, 간단한 동작 테스트를 진행한다.

Embassy

Embassy 공식 사이트도 가이드가 되어 있어 따라서 진행했다.

: https://embassy.dev/book/dev/getting_started.html

Prerequisite

필요한 내용은 다음과 같다.

rustup

https://rustup.rs/

curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh

probe-run

sudo apt install -y libusb-1.0-0-dev libudev-dev
cargo install probe-rs-cli

source "$HOME/.cargo/env"

embassy download

이제, embassy 소스 코드를 다운로드 받아서 예제를 실행해 보자.

#git clone https://github.com/embassy-rs/embassy-net-w5500
git clone https://github.com/embassy-rs/embassy
cd embassy

Blinky

cd examples/rp
cargo run --release --bin blinky
# 시간이 몇 분 소요됨

여기에서 probe 보드를 인식하지 못하는 문제가 발생했다.

쉽게 해결이 되지 않아 꽤 많이 검색했는데 나와 비슷한 문제를 겪는 사람이 꽤 있는 듯 했지만 명확한 해결책을 찾지 못했다.

결과적으로 Github Issue와 블로그 글이 큰 도움이 되었다.

블로그 글은 중간 내용을 참조했다.

2개의 터미널을 실행하여 다음과 같이 실행한다.

터미널 1

$ cd ~/pico/openocd
$ src/openocd -f interface/cmsis-dap.cfg -f target/rp2040.cfg -s tcl -c "adapter speed 5000"

 

터미널 2

$ cd ~/pico/rp2040-project-template
$ gdb-multiarch -q -ex "target extended-remote :3333" target/thumbv6m-none-eabi/debug/rp2040-project-template

 

gdb에서 다음 커맨드를 사용하여 load 하고 동작시킬 수 있다.

(gdb)

load
continue

 

여기까지 보드 연결에 대한 동작 검증을 진행했다.

 

다시 embassy로 돌아와서, 동일한 방식으로 예제를 실행한다.

기본 예제인 blinky 예제부터 실행했다.

cd ~/pico/cargo/embassy/examples/rp
cargo run --release --bin blinky

 

동작이 잘 된다!

W5500 example

W5500-EVB-Pico의 이더넷 기능을 사용하는 TCP server 및 client 예제를 실행하고 테스트했다.

ethernet_w5500_tcp_server

먼저, TCP server 어플리케이션 테스트를 진행했다.

어플리케이션 코드에서 다음을 수정 및 참조했다.

  • 식별할 수 있도록 맥 주소 수정
  • IP는 DHCP로 할당받도록 설정되어 있음
  • TCP Connection이 이루어지면 LED가 켜지도록 설정됨

$ vi src/bin/ethernet_w5500_tcp_server.rs

let mac_addr = [0x00, 0x08, 0xdc, 0x01, 0x02, 0x03];

$ **cargo run --release --bin ethernet_w5500_tcp_server**

 

 

보드가 연결된 공유기에서 내가 설정한 맥 주소와 할당된 IP 주소를 확인할 수 있다.

기본적으로 Loopback 모드로 동작한다.

 

ethernet_w5500_tcp_client

다음은 TCP client 어플리케이션이다.

다음과 같이 코드 수정 후에 실행한다.

  • host_addr 값을 내 환경의 Host PC IP 주소 값으로 설정했다.
$ vi src/bin/ethernet_w5500_tcp_client.rs

        let **host_addr** = embassy_net::Ipv4Address::from_str("192.168.50.81").unwrap();

$ cargo run --release --bin ethernet_w5500_tcp_client

 

Client가 곧바로 실행되고, 주기적으로 Hello world 메시지를 보내도록 구현되어 있다.

여기에서, 두번째 Run을 하니까 멈춰 있었는데, 보드 연결이 끊긴 듯 했다.

이 때는 리셋을 사용하여 보드를 다시 인식시켜주면 된다.

ethernet_w5500_multisocket

마지막으로 Multiple socket 동작 테스트이다.

$ cargo run --release --bin ethernet_w5500_multisocket

 

 

⚠️ cmsis-dap 인식 불가 문제에 대한 기록

테스트 진행 중 갑자기 OpenOCD에서 USB 인식이 되지 않는 경우가 있다. 이 때 lsusb 커맨드를 사용해 확인해보면 장치는 인식된 상태이다.

lsusb로 확인했을 때 동일하게 인식되어 있음에도 불구하고 openocd가 안되는 경우 보드 리셋 후 VirtualBox에서 USB를 다시 VM 쪽으로 연결하면 된다.

리셋은 USB 전원을 연결한 디버그 보드 쪽에서 해야 한다. RUN 버튼을 누르면 리셋된다.

아마도 VirtualBox를 사용하다보니 불안정한 부분이 있는 듯 한데, 추후 실제 리눅스 환경에서 테스트 할 기회가 있으면 진행해 봐야겠다.

 

여기까지 Rust 환경 기반에서 W5500-EVB-Pico 보드로 TCP 소켓 통신 테스트를 진행해봤고, 잘 동작한다.

기본 동작을 테스트 해봤으니, 다음은 기능을 붙여서 뭔가 연동하는 테스트를 진행해보고 싶다.

 

문서 참조: W5500-EVB-Pico example

https://github.com/embassy-rs/embassy-net-w5500/tree/main/examples

Comments