diff --git a/README.md b/README.md index ebc8bfa..dd3974e 100644 --- a/README.md +++ b/README.md @@ -1,73 +1,159 @@ -# OBD CAN 기반 운전 성향 분석 +# OBD CAN 기반 운전 성향 분석 시스템 -차량 OBD-II CAN 데이터를 받아 운전 점수를 계산하는 시스템 설계 자료입니다. +## 프로젝트 개요 +차량 **OBD-II 기반 CAN 통신**으로 주행 데이터를 수집하고, 운전 행동을 분석하여 **운전 성향(캐릭터)** 및 **주행 점수**를 실시간으로 시각화하는 시스템입니다. +속도(Speed), RPM, 조향각(Steering), 브레이크(Brake) 데이터를 활용해 운전 습관을 평가합니다. -속도, RPM, 조향각, 브레이크 값을 기준으로 급가속, 급제동, 급조향, 저속 지속 같은 상황을 나눕니다. 결과는 TFT 화면에 점수와 상태로 표시하는 구조로 잡았습니다. +--- -## 기간 +## 프로젝트 목표 +- 차량 OBD CAN 데이터를 **안정적으로 수집/처리** +- 위험 운전 행동과 교통 흐름 방해 행동을 분리하여 **감점 요소 설계** +- 정체 구간에서의 오판을 줄이기 위한 **보호 로직 적용** +- TFT 디스플레이를 통해 **실시간 점수/캐릭터 UI 출력** +- (추가) 세션/로그 기반으로 **주행 기록 누적 및 통계 확장 기반 마련** -- 2026.01.06 ~ 2026.01.19 +--- -## 맡은 부분 +## 시스템 구성 -- MCP2515 기반 CAN 통신 회로 구성 -- Arduino와 TFT, SD, RTC 모듈 연결 -- 차량 OBD-II 환경에서 데이터 요청/응답 확인 -- 점수 화면과 기록 구조 설계 +### 전체 구조 +1. **차량 OBD-II → CAN 데이터 수신** +2. **MCP2515 CAN Controller**로 프레임 수신/송신 +3. **Arduino Nano Mini**에서 UDS/ISO-TP 응답 파싱 및 점수 산출 +4. **TFT LCD(ILI9341)** 에 속도/조향/브레이크/RPM/점수/캐릭터 출력 -## 사용한 것 +--- -- `Arduino` -- `C/C++` -- `MCP2515` -- `CAN` -- `UDS` -- `OBD-II` -- `Adafruit_ILI9341` -- `SD` -- `DS1302` +## CAN/UDS 통신 방식(요청-응답) -## 데이터 흐름 +차량 ECU와는 CAN 버스를 통해 통신하며, 필요한 값은 **UDS(ReadDataByIdentifier, 0x22)** 요청으로 읽어옵니다. -1. OBD-II 포트에서 CAN 프레임을 받습니다. -2. MCP2515가 CAN 프레임을 Arduino로 넘깁니다. -3. Arduino가 UDS 응답 payload를 바이트 위치와 스케일 값으로 변환합니다. -4. 변환한 속도, RPM, 조향각, 브레이크 값을 점수 계산에 사용합니다. -5. TFT 화면에 현재 값, 점수, 운전 상태를 표시합니다. +- **Request (예시)**: `0x22 C1 01` → “DID=C101 읽어줘” +- **Response (Positive)**: `0x62 C1 01 ...payload...` + - 응답 서비스 ID는 일반적으로 `요청ID + 0x40` 규칙 (0x22 → 0x62) -## 평가 기준 +> 수신한 응답 프레임의 payload는 **바이트 오프셋/길이/부호/스케일링/엔디안** 규칙에 따라 물리값으로 변환합니다. -### 위험 행동 +### -통신 흐름 그림 +CAN request/response +### -ECU / CAN ID 맵 +ECU map + +### -Payload 바이트 매핑 +payload map + +--- + +## 동작 방식 +- CAN 통신으로 주행 데이터를 **주기적으로 수신**합니다. +- 수신 값은 노이즈/스파이크 완화를 위해 **필터링(이동평균/저역통과 등)** 후 점수 로직에 적용됩니다. +- 감점 요인은 아래와 같이 **위험 요인 / 흐름 방해 / 정체 보호**로 구성됩니다. + +--- + +## 감점 요인 설계 + +### [위험 요인 감점] - 급가속 - 급제동 - 급조향 -- 고속 상태의 급조향 +- 고속 + 급조향 - 고RPM 유지 -- 위험 행동 반복 - -### 흐름 방해 +- 급가속 + 급조향 동시 발생 +- 위험 행동 반복(누적 패널티) +### [흐름 방해 감점] - 저속 지속 -- 평균 속도 대비 낮은 속도 유지 -- 감속 뒤 회복 지연 +- 평균 대비 과도한 저속 +- 불필요 감속 후 회복 지연 +- 저속 시간 누적 감점 -### 정체 보호 +### [정체 구간 보호(오판 방지)] +- 정체 판단 시 **흐름 방해 감점 적용 X** +- 정체 구간에서는 **위험 감점 기준 완화** +- 정체 해제 판단 시 정상 평가로 복귀 -- 정체 상태에서는 흐름 방해 감점을 제외합니다. -- 정체 상태에서는 급가속/급제동 기준을 별도로 둡니다. -- 정체가 끝나면 일반 평가 상태로 돌아갑니다. +--- -## 자료 +## 운전 성향(캐릭터) & 점수 UI +- 점수: 0 ~ 100 (기본 100에서 감점 누적) +- 캐릭터 예시: + - **매드맥스(과격)**: 위험 행동 빈도 높음 + - **일반**: 평균적인 감점 수준 + - **안전**: 위험 행동 낮고 안정 주행 + - **거북이**: 저속/흐름 방해 패턴이 높음 +- TFT UI: 속도/조향각/브레이크/RPM + 점수 + 캐릭터(이미지/아이콘) -- `IMAGE/CAN_3.png`: CAN 요청/응답 흐름 -- `IMAGE/CAN_!.png`: ECU / CAN ID 맵 -- `IMAGE/CAN_2.png`: payload 바이트 매핑 -- `IMAGE/FSM.png`: 상태 전환 흐름 -- `IMAGE/HW.png`: 하드웨어 구성 +--- -## 한계 +## 상태 머신(FSM) 기반 평가 흐름 +평가 오탐을 줄이기 위해 주행 상태를 FSM으로 관리합니다. -- 차량마다 DID와 payload 위치가 달라 그대로 재사용하기 어렵습니다. -- 정체 판단은 속도 기반이라 실제 도로 상황과 다를 수 있습니다. -- 차종별 CAN 맵을 따로 분리해야 다른 차량에 맞추기 쉽습니다. +FSM + + 상태: +- NORMAL (일반 평가) +- TRAFFIC (정체 보호) +- HIGHWAY / HIGH_SPEED (고속 주행) +- LOW_SPEED (저속 누적 감점 강화) +- RECOVERY (감속 후 회복 판단) + +--- + +## 사용 기술 스택 + +### Hardware +FSM + +- Arduino Nano Mini +- MCP2515 CAN Module +- 2.2inch TFT LCD (ILI9341) +- microSD Module (캐릭터 RAW 리소스 + 로그 저장) +- DS1302 RTC Module (시간 기록) + +### Software +- Arduino IDE (C/C++) +- CAN 통신: `mcp_can` +- TFT UI: `Adafruit_GFX`, `Adafruit_ILI9341` +- SD 처리: `SPI`, `SD` +- UDS/ISO-TP 기반 데이터 요청/응답 처리 + +--- + +## 데이터 로깅/세션 관리(추가) + +### 1) 타임스탬프 로그 저장 +- DS1302 RTC를 이용해 **주행 로그에 날짜/시간을 기록**합니다. +- SD 카드에 아래 형태로 저장(예시): + - `YYYY-MM-DD HH:MM:SS, speed, rpm, steer, brake, score, state, character` + +### 2) 재시동 시 세션 이어쓰기(최근 N분) +- **시동 OFF 후 N분 이내 재시동** 시, 이전 점수/상태를 이어서 누적합니다. + - 예: 시동 OFF 후 **5분 이내 재시동 → 이전 세션 이어서 누적** + - 예: 시동 OFF 후 **5분 초과 재시동 → 새 세션으로 초기화** +- 구현 포인트: + - `last_off_time`을 RTC로 저장해두고 재부팅 시 비교 + - SD(또는 EEPROM)에 **최근 세션 score/state** 저장 후 복원 + +### 3) 시간 기반 통계 확장(향후) +- SD 로그를 기반으로 **하루/주간 통계**(평균 점수, 위험 이벤트 횟수, 정체 시간 비율 등) 기능 확장 +- 장기적으로 차종별 DID/맵을 config로 분리해 호환성 강화 + +--- + +## 한계 및 개선 사항 +- **차종별 CAN/UDS 데이터 차이** + - DID/바이트 오프셋이 차량마다 달라 호환성 확장이 필요함 + +- **정체/고속/저속 모드 판별 한계** + - 현재는 속도 기반 추정이므로 환경에 따라 오탐 가능 + +### 향후 개선 방향 +- 주행 기록에 날짜/시간 타임스탬프 추가 +- N분 이내 재시동 시 이전 운전 기록 이어서 사용 +- SD 로그 기반 하루/주간 통계 기능 확장 +- 차종별 DID/맵을 외부 설정 파일화하여 확장성 강화 + +---