Adafruit Feather M0 LoRa Radio 시작하기

Motivation

Adafruit Feather M0 RFM95
(이미지 출처: Adafruit.com)

급하게 ICT 기술사업화 페스티벌 2019(World IT Show와 함께 열림)에 나가게 되었습니다. 저희 회사 주력 제품인 IoT.own은 메인으로 나가고… 이를 보조할 end-device 장치들은 어떤게 좋을지 고민하다가, 이왕이면 새로운 보드를 준비해서 함께 들고 나가는 것으로 결정했습니다.

Adafruit Industries
(이미지 출처: Adafruit.com)

Adafruit Industries는 오픈소스 하드웨어, Maker 커뮤니티에서는 유명한 회사죠. 늘 새로운 하드웨어를 소개, 개발하기도 하고, learning system도 잘 갖춰져 있어 지식을 쌓기에도 매우 훌륭한 사이트입니다. 여기에서 Feather라는 새로운 폼팩터가 나온지 조금 되긴 했습니다만, 최근 HackSpace magazine 에서 LoRaWAN 관련하여 괜찮은 개발보드로 소개되기도 한, Feather M0 RFM95(900MHz LoRa Radio)를 포팅해보기로 했습니다.

Unpacking

위 상태로 배송이 왔습니다. 뜯어보면 메인 보드, 핀헤더 2개와 MAC-48로 보이는 주소가 프린트된 스티커가 있네요. 혹시나 해서 IEEE Registration Authority에서 검색해보니 98-76-B6은 Adafruit의 OUI가 맞습니다. 즉, 이 주소는 이 보드에게만 부여된 식별자라는 것이고, 나중에 LoRaWAN 연동해볼 때 device EUI로 사용하면 되겠네요.

IEEE Registration Authority에서 검색

보드가 살아있는지 확인하는 방법은 여러가지가 있습니다. Feather M0의 경우 공식적으로 Arduino IDE에서 사용이 가능하지만 저희 목적은 Nol.A-SDK에 포팅하는 것이기에 JLink debugger로 연결해서 확인을 해봅니다. JLink에 ARM SWD 인터페이스로 연결을 해보려면 Vtarget, reset, SWDIO, SWCLK, ground 등 총 5개 핀의 연결이 필요합니다. 이 중 SWDIO, SWCLK는 보드 뒷면에 패드가 나와 있습니다. 그 외에 핀들은 모두 커넥터에서 찾을 수 있습니다.

5개 핀을 모두 JLink에 연결하고 JLink 프로그램을 실행시키면 인식되는 것을 확인할 수 있습니다. 저는 GUI보다 CLI를 더 선호하는데, CLI에서는 다음과 같이 확인할 수 있습니다.

SEGGER J-Link Commander V6.40 (Compiled Oct 26 2018 15:07:23)
DLL version V6.40, compiled Oct 26 2018 15:07:12

Connecting to J-Link via USB...O.K.
Firmware: J-Link V10 compiled Oct 26 2018 12:04:17
Hardware version: V10.00
S/N: 50000712
License(s): GDB
VTref=3.335V


Type "connect" to establish a target connection, '?' for help
J-Link>connect
Please specify device / core. <Default>: ATSAMD21G18
Type '?' for selection dialog
Device>ATSAMD21G18
Please specify target interface:
  J) JTAG (Default)
  S) SWD
  T) cJTAG
TIF>S
Specify target interface speed [kHz]. <Default>: 4000 kHz
Speed>4000
Device "ATSAMD21G18" selected.


Connecting to target via SWD
InitTarget()
Found SW-DP with ID 0x0BC11477
Scanning AP map to find all available APs
AP[1]: Stopped AP scan as end of AP map has been reached
AP[0]: AHB-AP (IDR: 0x04770031)
Iterating through AP map to find AHB-AP to use
AP[0]: Core found
AP[0]: AHB-AP ROM base: 0x41003000
CPUID register: 0x410CC601. Implementer code: 0x41 (ARM)
Found Cortex-M0 r0p1, Little endian.
FPUnit: 4 code (BP) slots and 0 literal slots
CoreSight components:
ROMTbl[0] @ 41003000
ROMTbl[0][0]: E00FF000, CID: B105100D, PID: 000BB4C0 ROM Table
ROMTbl[1] @ E00FF000
ROMTbl[1][0]: E000E000, CID: B105E00D, PID: 000BB008 SCS
ROMTbl[1][1]: E0001000, CID: B105E00D, PID: 000BB00A DWT
ROMTbl[1][2]: E0002000, CID: B105E00D, PID: 000BB00B FPB
ROMTbl[0][1]: 41006000, CID: B105900D, PID: 001BB932 MTB-M0+
Cortex-M0 identified.
J-Link>

Bootloader and Image Uploader

사실 처음에는 이렇게 해서 내장 부트로더도 다 날릴 생각이었는데, 곰곰히 생각해보니 잘 만들어놓은 부트로더를 안쓰는 것도 아깝다는 생각이 들었습니다. 게다가 저 JLink가 한두푼도 아니니 그냥 저 부트로더를 그대로 사용해보기로 했습니다.

Feather-M0 보드의 USB는 CDC가 적용되어 있어 PC에 연결시 시리얼포트처럼 인식됩니다. 여기 저기 뒤진 끝에 내장 부트로더에 진입하는 방법은 보드 런타임 중 USB-CDC 연결을 닫고 1200bps로 다시 여는 것과 리셋 버튼을 더블클릭하는 것, 이렇게 2가지가 있습니다. 전자의 방법은 Arduino IDE에서 사용하는 방법으로 보드의 애플리케이션 영역에서 구현이 되어 있어야 합니다. 아직은 포팅 전이므로 후자의 방법을 사용합니다. 아래와 같이 리셋 버튼을 더블 클릭하니 USB 커넥터 옆에 있는 빨간 LED가 디밍(dimming)을 합니다. 아마도 부트로더에 성공적으로 진입했다는 뜻이겠죠?

부트로더가 있으면이미지 업로더가 있겠죠. Feather-M0는 Arduino IDE를 기본적으로 사용하고 있으니 Arduino IDE 안에 그 업로더가 있겠지 하는 생각으로 또 뒤지고 뒤진 끝에 BOSSA라는 것을 발견했습니다. (무슨발견을 이렇게 하는지…;;)

BOSSA는 Atmel이 만든 SAM용 Boot Assistance 프로토콜을 사용하는 이미지 업로더입니다. 다행히 그 안에는 BOSSAC라는 CLI도 존재하기 때문에 Nol.A-SDK (0.11.4 이상)에 추가했습니다.

Usage

먼저 위와 같이 구성합니다. USB는 2개를 연결하였는데요. 보드에 직접 연결된 USB는 전원공급 및 부트로더를 통한 이미지 업로딩에 사용됩니다. 밑에 별도 USB-to-UART 변환 보드를 통해서 연결한 것은 Serial2 입니다.

Basic 예제 코드는 여기에 있습니다. 이미지를 보드에 올리기 위해서는 먼저 리셋 버튼을 더블클릭하여 부트로더로 진입한 후, 다음과 같이 보드는 Adafruit Feather-M0를, 포트는 보드의 USB와 연결된 TTY 포트(Windows 에서는 COM 포트)를 선택합니다. 그리고 Build 버튼을 클릭하면 빌드 및 플래싱이 진행됩니다.

포트는 반드시 부트로더 진입한 후 선택해야 합니다. PC에서 인식할 때까지 수 초가 걸릴 수 있습니다.

Future Work

사실 별도의 USB-to-UART 변환보드를 이용하지 않고 보드의 USB 포트로 기본입출력을 해야 합니다. 그리고 SPI, I2C 등등 해야할 일들이 많네요. 앞으로 계속 차근차근 진행해보도록 하겠습니다.