W5100S-EVB Pico + AWS IoT Core + MQTT Example
Creating a hands-on project for AWS integration using W5100 pico
0. 들어가기
✔ W5100S-EVB 피코
개발 보드. 이더넷 연결이 가능함. 자세한 건 홈페이지 참조
W5100S-EVB-Pico는 Raspberry Pi RP2040 마이크로컨트롤러 칩과 완전 유선 TCP/IP 컨트롤러 W5100S 칩을 기반으로 하는 마이크로컨트롤러 평가 보드입니다. W5100S-EVB-Pico는 Raspberry Pi Pico 플랫폼과 동일한 역할을 하며 W5100S를 포함하므로 이더넷 기능이 기본적으로 포함되어 있습니다.
✔ AWS IoT 코어
- IoT 디바이스를 다른 디바이스에 연결하는 클라우드 서비스와 AWS 클라우드 서비스를 제공함.
- IoT 디바이스를 AWS IoT 기반 솔루션에 통합하는 데 도움이 되는 디바이스 소프트웨어 제공.
- 지원 프로토콜
- MQTT
- WSS를 통한 MQTT
- HTTPS
- LoRaWAN
✔ MQTT
- MQTT(Message Queueing Telemetry Transport)의 약자로, 최소한의 전력과 패킷량으로 통신하는 프로토콜이다.
- 저전력 배터리나 네트워크 상태가 좋지 않은 제한적인 환경에서 동작하게 하기 위한 용도로 만들어졌다.
- ⇒ 낮은 전력과 낮은 대역폭 환경에서 사용할 수 있어, IoT Device에서 유용.
1. 개발 환경 구축
1) Toolchain 설치
ARM GCC 컴파일러
- 링크에서 windows용 exe를 다운받고 설치.
- 유의할 점은 설치 시에 Add path to environment variable을 선택해준다. 다른 옵션은 이미 선택되어 있지만 저 옵션만 선택되어 있지 않으니 선택해준다.
CMake
- 링크에서 windows용 installer을 다운받아서 설치.
- 설치 시에 all users path 관련 옵션 선택.
비주얼 스튜디오
- 문서에는 2019 버전을 다운로드하라고 되어 있지만 2022 버전을 받아도 잘 돌아감.
- C++을 사용한 데스크톱 개발 옵션만 선택해서 설치.
파이썬
- 문서에는 3.9버전을 설치하라고 되어 있다.
- 이미 3.9 버전이 설치되어 있어서, 다른 버전이 안되는지는 정확하지 않다.
힘내
- git이 설치되어 있어야 한다.
2) 설치 확인
SDK 및 예제 가져오기
원하는 폴더 경로에 가서 아래의 git 명령어를 실행.
C:\[userpath]> git clone -b master https://github.com/raspberrypi/pico-sdk.git
C:\[userpath]> cd pico-sdk
C:\[userpath]\pico-sdk> git submodule update --init
C:\[userpath]\pico-sdk> cd ..
C:\[userpath]> git clone -b master https://github.com/raspberrypi/pico-examples.git
명령줄에서 "Hello World" 빌드
- 커맨드 창에서 빌드 테스트. 아래 명령어 실행
- 빌드가 완료되면 hello_world/serial 폴더와 hello_world/usb 디렉토리에 bulid 디렉터리가 생성됨.
- 생성된 UF2 파일을, 컴퓨터와 연결된 보드에 drag and drop 해주면 실행할 수 있음.
C:\[userpath]> setx PICO_SDK_PATH "..\..\pico-sdk"
C:\[userpath]> cd pico-examples
C:\[userpath]\pico-examples> mkdir build
C:\[userpath]\pico-examples> cd build
C:\[userpath]\pico-examples\build> cmake -G "NMake Makefiles" ..
C:\[userpath]\pico-examples\build> nmake
Visual Studio Code에서 "Hello World" 빌드
- 위와 똑같은 테스트이지만 VS Code에서 실행.
- Developer Command Prompt for VS 2022 에 들어가서 code 입력.
- 입력하면 자동으로 VS Code가 실행된다.
- C/C++을 사용하려면 VS Code에서 몇 가지 설정을 해줘야 한다.
1) CMake Tools 설치
2) Settings(설정)에서 Configure Envionment 설정
3) Settings에서 Generator 설정
- 이제 설정 화면을 닫고, pico-examples 폴더를 열어줍니다.
- 폴더를 열고, 아래의 build 버튼을 누르거나 F7을 눌러서 빌드합니다.
- 빌드가 완료되면 build 디렉토리에 있는 uf2 파일을 보드에 넣어서 실행합니다.
2. MQTT를 통해 AWS IoT 연결하기
1) 터미널 프로그램 설치
- Tera Term 을 사용했음.
- 다른 터미널 프로그램을 사용해도 관계없음.
2) 하드웨어 연결
- 이더넷 케이블을 사용해서 W5100S-EVB-Pico 이더넷 포트에 연결해준다.
- 연결된 보드를 5pin usb 케이블을 통해서 컴퓨터와 연결해둔다.
3) AWS IoT 설정
4) MQTT 예를 통해 Connect AWS IoT 설정
✅ 자식 클론
git clone --recurse-submodules https://github.com/Wiznet/RP2040-HAT-AWS-C.git
✅ SPI 포트 및 핀 설정
- 'RP2040-HAT-AWS-C/port/ioLibrary_Driver/' 디렉토리에 있는 'w5x00_spi.h' 파일에서 설정.
/* SPI */
#define SPI_PORT spi0
#define PIN_SCK 18
#define PIN_MOSI 19
#define PIN_MISO 16
#define PIN_CS 17
#define PIN_RST 20
✅ 네트워크 구성 설정
- 'RP2040-HAT-AWS-C/examples/aws_iot_mqtt/' 디렉토리에 있는 'aws_iot_mqtt.c' 파일에서 설정.
- 보드가 공유기와 연결된 것이라면 알아서 할당되므로 파일을 수정할 필요 없음.
/* Network */
static wiz_NetInfo g_net_info =
{
.mac = {0x00, 0x08, 0xDC, 0x12, 0x34, 0x56}, // MAC address
.ip = {192, 168, 11, 2}, // IP address
.sn = {255, 255, 255, 0}, // Subnet Mask
.gw = {192, 168, 11, 1}, // Gateway
.dns = {8, 8, 8, 8}, // DNS server
.dhcp = NETINFO_DHCP // DHCP enable/disable
};
✅ AWS IoT 구성 설정
- 도메인은 AWS IoT data endpoint 이다.
- AWS IoT Core에서 설정에 들어가서 복사한 후, 변경 해준다
- my_rp2040_thing은 자신이 만든 사물(device) 이름으로 바꾼다.
- username과 password는 설정하지 않는다.
/* AWS IoT */
#define MQTT_DOMAIN "account-specific-prefix-ats.iot.ap-northeast-2.amazonaws.com"
#define MQTT_PUB_TOPIC "$aws/things/my_rp2040_thing/shadow/update"
#define MQTT_SUB_TOPIC "$aws/things/my_rp2040_thing/shadow/update/accepted"
#define MQTT_USERNAME NULL
#define MQTT_PASSWORD NULL
#define MQTT_CLIENT_ID "my_rp2040_thing"
✅ 장치 인증서 및 키 설정
- 'RP2040-HAT-AWS-C/examples/aws_iot_mqtt/' 디렉토리의 mqtt_certificate.h 파일에 설정한다.
- AWS에서 사물(Device) 생성 시에 발급받은 인증키를 넣어준다.
- root_ca에는 Amazon Root CA1 인증서를 넣어주고,
- client_cert에는 Private key를 넣어주고,
- private key에는 RSA를 넣어준다.
- 아래의 입력 형식에 맞춰서 넣어줘야 한다. 각 줄마다 따옴표와 \r\n을 넣어준다.
uint8_t mqtt_root_ca[] =
"-----BEGIN CERTIFICATE-----\r\n"
"...\r\n"
"-----END CERTIFICATE-----\r\n";
uint8_t mqtt_client_cert[] =
"-----BEGIN CERTIFICATE-----\r\n"
"...\r\n"
"-----END CERTIFICATE-----\r\n";
uint8_t mqtt_private_key[] =
"-----BEGIN RSA PRIVATE KEY-----\r\n"
"...\r\n"
"-----END RSA PRIVATE KEY-----\r\n";
5) 빌드
- 파일 수정을 완료했다면, vs code에서 빌드 버튼을 누르거나 f7을 누른다.
- 빌드가 완료되면, 'RP2040-HAT-AWS-C/build/examples/aws_iot_mqtt/' 디렉토리에 'aws_iot_mqtt.uf2' 파일이 생성된다.
6) 업로드 및 실행
✅ Tera Term 실행
- W5100S-EVB-Pico의 BOOTSEL 버튼을 누르고 usb 포트를 연결하면 RPI-RP2 드라이브가 자동으로 마운트됨.
- 드라이브 안에 'aws_iot_mqtt.uf2' 파일을 복사 후 붙여넣기 해줌
- 보드의 시리얼 COM 포트를 Tera Term과 연결
- 연결 후에 바로 실행될 수도 있으나, 실행되지 않으면 usb를 뽑았다가 다시 연결시킴.
- 정상적으로 연결되었다면 아래와 같은 화면 출력
✅ AWS MQTT test client 실행
- AWS IoT 콘솔에서 Test 메뉴 선택
- 주제를 구독하고, 주제를 게시함
- 주제를 게시하면 tera term 창에서 message를 받은 것을 확인할 수 있음.