- Add GYRO_CONFIG0/ACCEL_CONFIG0 register setup in imu_read_direct() to fix gyro always returning -32768 - Increase sensor startup delay from 2ms to 80ms for reliable first read - Put IMU back to sleep after msp? read to save power - Fix piezo frequency table: swap freq 0/1 values, remove unused freq 5 Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
126 lines
4.2 KiB
Markdown
126 lines
4.2 KiB
Markdown
# Medithings VesiScan BASIC
|
|
|
|
nRF52840 기반 초음파(Piezo) + IMU 방광 모니터링 패치 펌웨어
|
|
|
|
## Author
|
|
|
|
**Charles KWON** - charleskwon@medithings.co.kr
|
|
|
|
## Overview
|
|
|
|
VesiScan BASIC은 피에조 초음파 트랜스듀서와 IMU 센서를 이용하여 방광 상태를 측정하고, BLE를 통해 모바일 클라이언트로 데이터를 전송하는 웨어러블 패치 디바이스 펌웨어입니다.
|
|
|
|
## Hardware
|
|
|
|
| 구분 | 칩/센서 | 사양 | 인터페이스 |
|
|
|------|--------|------|-----------|
|
|
| MCU | nRF52840 | ARM Cortex-M4, SoftDevice S140 | - |
|
|
| Piezo TX | MD1822K6-G + TC7920K6-G | MOSFET Driver, +/-20V | GPIO (Timer+PPI) |
|
|
| Piezo MUX | 8ch MUX (MUXA/MUXB) | 채널 선택 (CH0~CH7) | GPIO |
|
|
| Echo AFE | ADA2200 | Lock-in Amplifier | SPI |
|
|
| Echo ADC | ADC121S051 | 12-bit, Echo 신호 샘플링 | SPI |
|
|
| DAC | MCP4725 | 12-bit, 바이어스 전압 | I2C (SW) |
|
|
| DigiPot | AD5272 | 가변저항, AGC 제어 | I2C (SW) |
|
|
| IMU | ICM42670P | 6축 가속도/자이로 | I2C (HW) |
|
|
|
|
## BLE Commands (Piezo)
|
|
|
|
| Command | Response | 설명 |
|
|
|---------|----------|------|
|
|
| `mpa?` | - | Piezo 시스템 활성화 (전원 ON + 드라이버 초기화) |
|
|
| `mpc? [cycles] [freq] [ch]` | - | Piezo 버스트 (주파수/채널 선택) |
|
|
| `mdc? [cycles] [delay] [samples]` | `rdb:` `rdd:` `rde:` | Piezo 버스트 + Echo 캡처 (12-bit packed) |
|
|
| `mec? [freq] [delay] [samples] [cycles] [avg] [ch]` | `rer:` | Piezo 버스트 + Echo 캡처 (16-bit raw) |
|
|
| `maa? [mode]` | `raa:` | 8채널 전체 캡처 (비동기, mode 0=raw) |
|
|
|
|
### Piezo 주파수 옵션
|
|
|
|
| freq | 주파수 |
|
|
|------|--------|
|
|
| 0 | 1.8 MHz |
|
|
| 1 (기본) | 2.1 MHz |
|
|
| 2 | 2.0 MHz |
|
|
| 3 | 1.7 MHz |
|
|
| 4 | 2.2 MHz |
|
|
|
|
### 8채널 MUX 매핑
|
|
|
|
| Channel | MUX | SEL1 | SEL0 | EN_MUXA | EN_MUXB |
|
|
|---------|-----|------|------|---------|---------|
|
|
| CH0 | A0 | 0 | 0 | 1 | 0 |
|
|
| CH1 | A2 | 0 | 1 | 1 | 0 |
|
|
| CH2 | A1 | 1 | 0 | 1 | 0 |
|
|
| CH3 | A3 | 1 | 1 | 1 | 0 |
|
|
| CH4 | B0 | 1 | 1 | 0 | 1 |
|
|
| CH5 | B1 | 0 | 1 | 0 | 1 |
|
|
| CH6 | B2 | 1 | 0 | 0 | 1 |
|
|
| CH7 | B3 | 0 | 0 | 0 | 1 |
|
|
|
|
### Echo 수신 체인
|
|
|
|
```
|
|
Piezo → MUX(8ch) → ADA2200(AFE) → ADC121S051 → nRF52840
|
|
↑
|
|
MCP4725(Bias) + AD5272(AGC)
|
|
```
|
|
|
|
## BLE Commands (IMU)
|
|
|
|
| Command | Response | 설명 |
|
|
|---------|----------|------|
|
|
| `msp?` | `rsp:` | IMU 6축 데이터 (single shot, 레지스터 직접 읽기) |
|
|
|
|
### IMU 사양
|
|
|
|
| 항목 | 설정 |
|
|
|------|------|
|
|
| 센서 | ICM42670P (6축: 3축 가속도 + 3축 자이로) |
|
|
| 인터페이스 | I2C (HW) |
|
|
| 모드 | Low-Noise Mode |
|
|
| 해상도 | 16-bit |
|
|
|
|
## BLE Commands (측정)
|
|
|
|
| Command | Response | 설명 |
|
|
|---------|----------|------|
|
|
| `scj?` | `rcj:` | PD-ADC M48 MODE 2 (Pressure + M48 + Battery + Temp + IMU) |
|
|
| `sdj?` | `rdj:` | PD-ADC M48 MODE 3 |
|
|
| `sej?` | `rej:` | PD-ADC M48 MODE 4 (M48 + Battery + IMU) |
|
|
| `ssj?` | `rsj:` | PD-ADC M48 MODE 0 (M48 + Battery/IMU combined) |
|
|
| `cmd? [v1] [v2] [v3]` | `rmd:` | ADC count / delay / 파라미터 설정 |
|
|
|
|
## Build
|
|
|
|
- **IDE**: Keil uVision5 (ARM5)
|
|
- **SDK**: nRF5 SDK + SoftDevice S140
|
|
|
|
```c
|
|
#define HARDWARE_VERSION "VB0HW0000"
|
|
#define FIRMWARE_VERSION "VB0FW0000"
|
|
#define FIRMWARE_SERIAL_NO "VB026030000"
|
|
```
|
|
|
|
## Project Structure
|
|
|
|
```
|
|
project/
|
|
├── ble_peripheral/
|
|
│ ├── ble_app_bladder_patch/ ← 메인 펌웨어
|
|
│ │ ├── main.c ← 부트, BLE, 전원 제어
|
|
│ │ ├── main_timer.c ← 메인 루프 (측정/제어)
|
|
│ │ ├── cmd_parse.c ← BLE 명령어 파싱 (레거시)
|
|
│ │ ├── icm42670p/ ← IMU 드라이버
|
|
│ │ └── meas_pd_*.c ← PD Echo 측정 (모드별)
|
|
│ └── dr_piezo/ ← Piezo TX 드라이버
|
|
└── dfu/
|
|
└── secure_bootloader/ ← BLE DFU 부트로더
|
|
|
|
pc_firm/ ← 파서 및 ADC 드라이버
|
|
├── parser.c ← BLE 명령어 파서 (신규)
|
|
└── dr_adc121s051/ ← Echo ADC 드라이버
|
|
```
|
|
|
|
## License
|
|
|
|
Proprietary - Medithings Co., Ltd.
|