148 lines
5.7 KiB
Markdown
148 lines
5.7 KiB
Markdown
# VesiScan BASIC - Zephyr (nRF Connect SDK)
|
|
|
|
nRF52840 기반 VesiScan BASIC 펌웨어의 Zephyr 포팅 프로젝트입니다.
|
|
|
|
## 현재 구현 상태
|
|
|
|
| Stage | 내용 | 상태 |
|
|
|-------|------|------|
|
|
| 1 | GPIO + 전원 래치 + 버튼 상태머신 | 완료 |
|
|
| 1 | LED 제어 (green/orange 패턴) | 완료 |
|
|
| 2 | BLE 스택 + NUS (advertising, 연결, 재연결) | 완료 |
|
|
| 3 | 배터리 ADC (AIN2, 12bit, 저전압 자동 OFF) | 진행중 |
|
|
| 3 | 커맨드 파서 (msn? 구현) | 진행중 |
|
|
| - | Flash 저장소 (NVS) | 미구현 |
|
|
| - | 온도 센서 (TMP235, AIN3) | 미구현 |
|
|
| - | IMU (ICM42670P, I2C) | 미구현 |
|
|
| - | 피에조 + ADC121S051 | 미구현 |
|
|
| - | BLE 보안 (본딩, 패스키) | 미구현 |
|
|
|
|
## 프로젝트 구조
|
|
|
|
```
|
|
blinky/
|
|
├── CMakeLists.txt # 빌드 설정 (소스 파일 등록)
|
|
├── prj.conf # Kconfig 설정 (기능 ON/OFF)
|
|
├── boards/
|
|
│ └── nrf52840dk_nrf52840.overlay # Devicetree Overlay (핀 매핑)
|
|
└── src/
|
|
├── main.c # 메인 진입점 + 부팅 시퀀스 + 버튼 상태머신
|
|
├── main.h # 전역 상수/변수/타입 정의
|
|
├── debug_print.h # 디버그 출력 매크로 (RTT)
|
|
├── parser.c / .h # BLE 커맨드 파서 (TAG+DATA+CRC16)
|
|
├── power_control.c / .h # 전원 시퀀스 상태머신
|
|
├── ble/
|
|
│ └── ble_service.c / .h # BLE NUS 서비스 (advertising, 연결, TX/RX)
|
|
└── drivers/
|
|
├── battery/
|
|
│ └── battery_adc.c / .h # 배터리 전압 ADC (AIN2, 12bit)
|
|
└── led/
|
|
└── led_control.c / .h # LED 패턴 제어 (k_timer 기반)
|
|
```
|
|
|
|
## 빌드 방법
|
|
|
|
### 일반 빌드
|
|
소스 파일(.c/.h)만 변경한 경우.
|
|
|
|
### Pristine Build
|
|
아래 파일을 변경한 경우 반드시 Pristine Build:
|
|
- `prj.conf` (Kconfig 설정)
|
|
- `boards/*.overlay` (Devicetree 핀 매핑)
|
|
- `CMakeLists.txt` (소스/include 경로 추가)
|
|
|
|
nRF Connect for VS Code → Build 패널 → **Pristine Build** 또는 `build` 폴더 삭제 후 빌드.
|
|
|
|
## 핀 매핑 (Devicetree Overlay)
|
|
|
|
| 이름 | 핀 | 방향 | 역할 |
|
|
|------|-----|------|------|
|
|
| `PWR_HOLD` | P0.08 | Output, Active HIGH | 전원 래치 |
|
|
| `BUTTON_CHECK` | P1.08 | Input, Pull-up, Active LOW | 전원 버튼 |
|
|
| `LED_BLE` | P0.12 | Output, Active LOW | 초록 LED |
|
|
| `FUNCTION_LED` | P0.29 | Output, Active LOW | 주황 LED |
|
|
| ADC AIN2 | P0.04 | Analog Input | 배터리 전압 분압 |
|
|
|
|
> UART0은 P0.08 충돌 방지를 위해 비활성화 (`status = "disabled"`)
|
|
|
|
## 전원 버튼 동작
|
|
|
|
| 동작 | 조건 | 결과 |
|
|
|------|------|------|
|
|
| 부팅 (OFF→ON) | 2초 이상 홀드 | 전원 래치 + LED 깜빡임 + BLE advertising |
|
|
| 무시 | 부팅 후 2초 미만 릴리스 | 전원 OFF (래치 안 됨) |
|
|
| 전원 OFF (ON→OFF) | 버튼 놓은 뒤 다시 2초 홀드 | advertising 중지 + LED OFF + 3초 후 전원 차단 |
|
|
|
|
## BLE 커맨드 프로토콜
|
|
|
|
### 패킷 포맷
|
|
```
|
|
[TAG 4바이트] [DATA N바이트] [CRC16 2바이트]
|
|
```
|
|
- TAG: ASCII 4글자 (예: `msn?`, `mfv?`)
|
|
- DATA: uint16 little-endian 값들
|
|
- CRC16: CRC-CCITT (초기값 0xFFFF)
|
|
- 응답 TAG: 첫 글자 `m` → `r` (예: `msn?` → `rsn:`)
|
|
|
|
### 구현된 커맨드
|
|
|
|
| 커맨드 | 응답 | 기능 |
|
|
|--------|------|------|
|
|
| `msn?` | `rsn:` + uint16 mV | 배터리 전압 측정 |
|
|
|
|
### 전체 커맨드 목록 (구현 예정)
|
|
|
|
| # | 내용 | 명령 | 응답 | 비고 |
|
|
|---|------|------|------|------|
|
|
| 1 | 전원 OFF | `msq?` | `rsq:` | |
|
|
| 2 | 재부팅 | `mss?` | `rss:` | |
|
|
| 3 | 본딩 삭제 + 재부팅 | `msr?` | `rsr:` | |
|
|
| 4 | LED 상태 | `mls?` | - | |
|
|
| 5 | HW Version 읽기 | `mrh?` | `rrh:` | FDS |
|
|
| 6 | HW Version 쓰기 | `mwh?` | `rwh:` | FDS |
|
|
| 7 | Serial Number 읽기 | `mrs?` | `rrs:` | FDS |
|
|
| 8 | Serial Number 쓰기 | `mws?` | `rws:` | FDS |
|
|
| 9 | FW Version 읽기 | `mfv?` | `rfv:` | |
|
|
| 10 | Passkey 읽기 | `mqz?` | `rqz:` | FDS |
|
|
| 11 | Passkey 쓰기 | `mpz?` | `rpz:` | FDS |
|
|
| 12 | 배터리 측정 | `msn?` | `rsn:` | 구현 완료 |
|
|
| 13 | IMU 단발 측정 | `msp?` | `rsp:` | |
|
|
| 14 | 온도 측정 | `mso?` | `rso:` | |
|
|
| 15 | 단일 채널 측정 | `mec?` | `reb:` → `raa:` | 테스트용 |
|
|
| 16 | 모든 채널(6) 측정 | `maa?` | `reb:`(6개) → `raa:` | |
|
|
| 17 | 전체 측정 | `mbb?` | `rbb:` → `reb:`(6개) → `raa:` | 배터리+IMU+온도+피에조 |
|
|
| 18 | 측정 파라미터 읽기 | `mcf?` | `rcf:` | FDS |
|
|
| 19 | 측정 파라미터 쓰기 | `mcs?` | `rcs:` | FDS |
|
|
|
|
## 디버그 로그 (RTT)
|
|
|
|
- **VS Code**: nRF Connect 패널 → Connected Devices → 보드 선택 → 터미널 아이콘
|
|
- **J-Link RTT Viewer**: Connection: USB, Target Device: NRF52840_XXAA
|
|
|
|
### 로그 태그
|
|
| 태그 | 내용 |
|
|
|------|------|
|
|
| `[BTN]` | 버튼 이벤트 (2s 홀드, 릴리스) |
|
|
| `[PWR]` | 전원 래치 ON/OFF |
|
|
| `[BOOT]` | 부팅 시퀀스 완료 |
|
|
| `[BLE]` | BLE 연결/해제/advertising/파라미터 |
|
|
| `[BLE RX]` | NUS 수신 데이터 (hex dump) |
|
|
| `[NUS TX]` | NUS 송신 |
|
|
| `[CMD]` | 커맨드 파서 처리 결과 |
|
|
| `[BATT]` | 배터리 ADC 측정값 |
|
|
| `[SYS]` | 슬립 진입 |
|
|
|
|
## prj.conf 주요 설정
|
|
|
|
| 설정 | 값 | 역할 |
|
|
|------|-----|------|
|
|
| `CONFIG_GPIO` | y | GPIO 드라이버 |
|
|
| `CONFIG_LOG` | y | 로깅 시스템 |
|
|
| `CONFIG_LOG_BACKEND_RTT` | y | RTT 로그 출력 |
|
|
| `CONFIG_SERIAL` | n | UART 비활성화 (P0.08 충돌 방지) |
|
|
| `CONFIG_BT` | y | BLE 스택 |
|
|
| `CONFIG_BT_NUS` | y | Nordic UART Service |
|
|
| `CONFIG_BT_L2CAP_TX_MTU` | 247 | MTU 크기 |
|
|
| `CONFIG_BT_CTLR_TX_PWR_PLUS_8` | y | TX power +8dBm |
|
|
| `CONFIG_ADC` | y | ADC 드라이버 (배터리, 온도) |
|