RP2040 / Pico 플랫폼 가이드¶
Raspberry Pi Pico (RP2040)용 Xylolabs SDK 통합 가이드이다. RP2040은 비용 효율적인 센서 전용 타겟이다.
RP2040 사양¶
| 리소스 | 사양 | 비고 |
|---|---|---|
| CPU | 듀얼 Cortex-M0+ @ 133 MHz | ~266 MIPS 총합; DSP/FPU 없음 |
| SRAM | 264 KB | 정적 할당, 힙 없음 |
| Flash | 외장 QSPI (일반적으로 2-16 MB) | 펌웨어 + 로그 저장 |
| UART | 2채널 | LTE-M1 모뎀 AT 명령 |
| ADC | 4채널, 12-bit, 500 ksps | 센서 입력 (GPIO26-29) |
| SPI | 2채널 | 외부 센서, SD 카드 |
| I2C | 2채널 | 온도, 습도, 기압 센서 |
| PIO | 8 상태 머신 (2 블록 x 4) | 유연한 I/O 프로토콜 |
| DMA | 12채널 | 제로카피 데이터 전송 |
| WDT | 하드웨어 워치독 | 장기간 무인 운전 |
| GPIO | 30핀 | 센서, 모뎀 제어, 상태 LED |
RP2350과의 주요 차이점¶
RP2040은 RP2350과 동일한 Pico SDK를 사용하지만 중요한 하드웨어 차이가 있다:
| 특징 | RP2040 (Pico) | RP2350 (Pico 2) |
|---|---|---|
| 코어 | Cortex-M0+ | Cortex-M33 |
| 클록 | 133 MHz | 150 MHz |
| SRAM | 264 KB | 520 KB |
| FPU | 없음 | 단정밀도 |
| DSP 확장 | 없음 | SIMD MAC, 포화 연산 |
| XAP 오디오 | 불가 | 전체 지원 (4ch @96kHz) |
| ADPCM 오디오 | 1-2ch 선택적 | 4ch 지원 |
| Pico SDK 보드 | pico |
pico2 |
| 가격 | ~$4 | ~$5 |
RP2040에서 XAP는 불가능하다. Cortex-M0+ 코어에는 하드웨어 FPU가 없으므로 모든 부동소수점 연산이 소프트웨어로 에뮬레이션된다. XAP 인코딩은 FPU 사용 시 ~10 MIPS/채널이지만 소프트웨어 플로트에서는 ~40+ MIPS/채널로 다중 채널 오디오의 RP2040 예산을 초과한다.
사용 사례¶
RP2040은 다음 용도에 권장된다:
- 환경 모니터링: 온도, 습도, 기압, CO2
- 간단한 진동 모니터링: ADC를 통한 단축 가속도계
- 전력 모니터링: 전류 및 전압 센서
- 저비용 센서 네트워크: 오디오가 필요 없는 경우
오디오 스트리밍이 필요하면 RP2350 (Pico 2)을 사용한다.
하드웨어 설정¶
LTE 모뎀 (UART0) -- BG770A¶
RP2040 GPIO LTE 모뎀
------------------ ------------------
GPIO0 (UART0_TX) ----- RXD
GPIO1 (UART0_RX) ----- TXD
GPIO2 (GPIO) ----- PWRKEY
GPIO3 (GPIO) ----- RESET_N
VSYS (5V) ----- VCC (LDO 경유)
GND ----- GND
센서 입력 (ADC)¶
| GPIO | ADC 채널 | 일반적 용도 |
|---|---|---|
| GPIO26 | ADC0 | 온도 센서 |
| GPIO27 | ADC1 | 습도 센서 |
| GPIO28 | ADC2 | 기압 센서 |
| GPIO29 | ADC3 | 진동 / 전류 |
I2C 센서¶
| 버스 | GPIO | 주요 장치 |
|---|---|---|
| I2C0 | GPIO4 (SDA), GPIO5 (SCL) | CHT832X (온도/습도), BME280 |
| I2C1 | GPIO6 (SDA), GPIO7 (SCL) | LIS3DH (가속도계) |
Rust 빌드 (권장)¶
# 의존성 설치
rustup target add thumbv6m-none-eabi
cargo install probe-rs-tools
# 빌드
cd sdk/examples/rp2040-sensor
cargo build --release
# 플래시
cargo run --release # .cargo/config.toml을 통해 probe-rs 사용
모든 RP2040 예제는 sdk/examples/를 참고한다.
레거시 C 빌드 시스템¶
cmake_minimum_required(VERSION 3.13)
include($ENV{PICO_SDK_PATH}/external/pico_sdk_import.cmake)
project(my_sensor_node C CXX ASM)
set(PICO_BOARD pico) # 중요: 원본 Pico 타겟, Pico 2 아님
pico_sdk_init()
add_subdirectory(sdk/rp2040)
add_executable(my_sensor_node src/main.c)
target_link_libraries(my_sensor_node
pico_stdlib
hardware_adc
hardware_i2c
hardware_watchdog
hardware_timer
xylolabs_sdk_rp2040
)
pico_add_extra_outputs(my_sensor_node)
RP2350 빌드와의 주요 차이¶
PICO_BOARD=pico로 설정한다 (pico2가 아님). Pico SDK가 RP2040에 맞는 시작 코드와 링커 스크립트를 자동으로 선택한다.
메모리 예산¶
| 영역 | 크기 | 설정 매크로 |
|---|---|---|
| XMBP 패킷 버퍼 | 4 KB | XYLOLABS_XMBP_BUF_SIZE |
| HTTP 버퍼 | 4 KB | XYLOLABS_HTTP_BUF_SIZE |
| 메타데이터 누적 | ~4 KB | 4ch x 100 samples x f32 |
| AT 명령 버퍼 | ~1 KB | 내부 |
| 스택 + SDK 내부 | ~8 KB | |
| SDK 합계 | ~21 KB | 264 KB의 8% |
| 앱 사용 가능 | ~243 KB |
소프트웨어 부동소수점 고려사항¶
RP2040에는 FPU가 없으므로 부동소수점 연산이 에뮬레이션된다:
float곱셈: ~20 사이클 (Cortex-M4F에서는 1 사이클)float나눗셈: ~70 사이클float삼각함수: ~200+ 사이클
성능이 중요한 센서 보정에는 부동소수점 대신 스케일링 팩터를 사용하는 고정소수점 정수 연산을 고려한다.
전력 관리¶
RP2040은 dormant 및 sleep 모드를 지원한다:
// Rust (Embassy) - 권장
use embassy_time::Timer;
// 샘플 사이 경량 슬립 (비동기 타이머 웨이크업)
Timer::after_micros(interval_us - 500).await;
// 이벤트 트리거 웨이크업은 Embassy GPIO 인터럽트 사용
let mut sensor_int = Input::new(p.PIN_X, Pull::Down);
sensor_int.wait_for_rising_edge().await;
레거시 C 코드
Rust (권장)¶
Rust는 새로운 RP2040 프로젝트의 권장 언어이다. Embassy 기반 Rust 예제는 컴파일 타임 타입 안전성을 유지하면서 비동기 센서 폴링과 네트워킹을 구현한다.
cd sdk/examples/rp2040-sensor
cargo build --release
# probe-rs를 통해 결과 ELF를 플래시한다
probe-rs run --chip RP2040 target/thumbv6m-none-eabi/release/rp2040-sensor
자세한 빌드 지침은 sdk/examples/README.md를 참고한다.
C 예제 (대안)
### 기존 예제 `sdk/rp2040/examples/` 디렉토리에 포함된 예제: | 예제 | 설명 | |------|------| | `sensor_node.c` | 100Hz에서 4채널 ADC 센서 스트리밍 |문제 해결¶
| 증상 | 가능한 원인 | 해결 방법 |
|---|---|---|
| 워치독 리셋 루프 | xylolabs_tick() 호출 빈도 부족 |
틱이 4초마다 실행되는지 확인 |
| 부정확한 센서 값 | 소프트웨어 플로트 반올림 | 스케일링을 사용한 정수 연산 활용 |
| 높은 전력 소모 | 샘플 사이 슬립 미사용 | 메인 루프에 sleep_us() 추가 |
| RP2350 오류로 빌드 실패 | 잘못된 PICO_BOARD 설정 | CMake에서 PICO_BOARD=pico 설정 |
| 모뎀 무응답 | UART 보드레이트 불일치 | 기본 115200, 모뎀 설정 확인 |
추가 자료¶
sdk/rp2040/README.md-- SDK 파일 목록 및 빠른 시작docs/PLATFORM-PICO.md-- RP2350 가이드 (비교용)- Pico SDK 문서
- RP2040 데이터시트