2026-04-12 18:42:54 +09:00
2026-04-10 17:57:09 +09:00
2026-04-09 17:11:41 +09:00
2026-04-10 17:57:09 +09:00

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: 첫 글자 mr (예: 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 드라이버 (배터리, 온도)
S
Description
No description provided
Readme 1 MiB
Languages
C 96.1%
CMake 1.7%
PowerShell 1.3%
Batchfile 0.9%