diff --git a/README.md b/README.md new file mode 100644 index 0000000..c0cba3f --- /dev/null +++ b/README.md @@ -0,0 +1,55 @@ +# Auto_Seat + +## 개요 + +차량 시트 자동 제어 프로젝트입니다. EEPROM 설정, 점화/주차 조건, 릴레이 출력, 자동 보정, 시리얼 명령 처리를 포함합니다. + +분류: AutoSeat_UL, Auto_Seat_LL과 같은 자동 시트 제어 계열의 기준 프로젝트입니다. + +## 코드 구성 요약 + +- 분석한 파일 수: 3 +- 사용 라이브러리/include: EEPROM.h +- 코드에서 확인되는 주요 모듈: EEPROM, Serial +- 코드에서 확인되는 핀/입출력 단서: ignitionPin:INPUT, parkingPin:INPUT, seatRelayD8:OUTPUT, seatRelayD9:OUTPUT + +## 파일별 설명 + +### `Auto_Seat.ino` + +- 역할: Arduino의 `setup()`/`loop()`를 포함한 실행 스케치입니다. +- include/의존성: EEPROM.h +- 주요 함수: applySeatAction, clampPosition, getTargetForConfirmedMode, handleRelativeStep, handleSerial, isSeatCommandBusy, loadSettings, loop, measurement, normalizeMotionState, printIntro, printStatus, processSerialCommand, readUint16, registerIgnitionOffUse, requiresParkingForCommand, saveCurrentPositionCommand, seat, setRelay, setup, startAutoCalibration, startDownEdgeMargin, updateAutoCalibration, updateConfirmedDriveMode, updateDebugOutput, updateManualStepStatus, updateMovement, updateRelayOutput, writeUint16 +- 주요 전역값/설정값: AUTO_CALIBRATION_DELAY_MS=300000UL, AUTO_CALIBRATION_DOWN_MS=6000UL, AUTO_CALIBRATION_UP_MS=7000UL, DEBUG_INTERVAL_MS=1000UL, DOWN_EDGE_MARGIN_MS=300UL, DOWN_SPEED_DEN=10, DOWN_SPEED_NUM=11, DRIVE_CONFIRM_MS=80UL, EEPROM_MAGIC_ADDR=0, EEPROM_MAGIC_VALUE=0x64, IGNITION_STABILIZE_MS=1000UL, MANUAL_STEP_MS=500, PARK_CONFIRM_MS=250UL, PARKING_OFF_THRESHOLD=940, PARKING_ON_THRESHOLD=950, RELAY_DEADTIME_MS=120UL, SEAT_HARD_LIMIT_UP_MS=6000, USES_BEFORE_AUTO_CALIBRATION=10 +- 핀/입출력 설정: ignitionPin:INPUT, parkingPin:INPUT, seatRelayD8:OUTPUT, seatRelayD9:OUTPUT +- 입출력/통신 호출: analogRead, digitalRead, EEPROM.read, EEPROM.update, Serial.available, Serial.begin, Serial.print, Serial.println + +### `report.html` + +- 역할: 프로젝트 보고서 또는 설명을 담은 HTML 문서입니다. +- include/의존성: - +- 주요 함수: - +- 주요 전역값/설정값: - +- 핀/입출력 설정: - +- 입출력/통신 호출: EEPROM.update + +### `upload.ps1` + +- 역할: 업로드/자동화에 사용되는 PowerShell 스크립트입니다. +- include/의존성: - +- 주요 함수: - +- 주요 전역값/설정값: - +- 핀/입출력 설정: - +- 입출력/통신 호출: - + +## 동작 흐름 + +1. `setup()`에서 시리얼, 센서, 통신 모듈, LCD/릴레이/핀 모드 등 초기 설정을 수행합니다. +2. `loop()`에서 센서 측정, 입력 확인, 상태 계산, 출력 제어, 통신 전송 또는 화면 갱신을 반복합니다. +3. 보조 함수들은 측정값 변환, 값 변화 감지, 릴레이/모터 제어, 시간 표시, 네트워크 응답 같은 세부 동작을 나눠 담당합니다. + +## 빌드 및 사용 메모 + +- Arduino IDE 또는 PlatformIO에서 폴더명과 같은 대표 스케치를 열어 빌드합니다. +- 코드에 포함된 네트워크 주소, Wi-Fi 정보, DB 정보, 장치 핀 번호는 실제 하드웨어 구성에 맞춰 확인해야 합니다. +- 공개 저장소에 올릴 때는 비밀번호, 토큰, 차량별 민감 정보가 포함되지 않았는지 확인합니다. diff --git a/report.html b/report.html new file mode 100644 index 0000000..d6e3c77 --- /dev/null +++ b/report.html @@ -0,0 +1,305 @@ + + + + + + Auto Seat 동작 시뮬레이션 보고서 + + + +
+

Auto Seat 동작 시뮬레이션 보고서

+
대상 파일: Auto_Seat.ino / 현재 코드 기준
+
+ +
+

1. 현재 핵심 설정

+
+
+ 최대 상승 가능 위치 + SEAT_HARD_LIMIT_UP_MS = 6000 +

모든 자동/수동 위치 목표는 0..6000ms 범위 안에서만 허용됩니다.

+
+
+ 자동 상승 위치 + storedSeatPositionMs = EEPROM +

하드코딩 기본 위치는 사용하지 않고 EEPROM에서 읽습니다. EEPROM 초기화 시 6000ms로 설정됩니다.

+
+
+ 하강 속도 추정 + 11 / 10 +

일반 자동 하강과 수동 하강 위치 계산은 상승보다 1.1배 빠른 것으로 추정합니다.

+
+
+ 수동 스텝 + MANUAL_STEP_MS = 500 +

u는 +500ms, d는 -500ms 이동 목표를 설정합니다.

+
+
+ 자동 보정 + UP 7000ms -> DOWN 6000ms +

10회 사용 후 시동 OFF 상태 5분 경과 시 자동 보정합니다. c 명령은 즉시 보정합니다.

+
+
+ 릴레이 보호 + RELAY_DEADTIME_MS = 120 +

상승/하강 반전 시 릴레이를 잠깐 OFF로 두어 접점 부담을 줄입니다.

+
+
+ +

2. 입력 신호 판정

+ + + + + + + + + + + + +
항목조건결과
P ONparkingRawValue >= 950parkingState = HIGH
P OFFparkingRawValue <= 940parkingState = LOW
주행 rawIG1 HIGH && P LOW시트 상승 목표 상태
주행 확정주행 raw가 80ms 유지confirmedDriveMode = HIGH
P/비주행 확정비주행 raw가 250ms 유지confirmedDriveMode = LOW
시동 직후 안정화IG1 LOW -> HIGH 후 1000ms릴레이 OFF, P 신호 튐 무시
+ +

3. 장시간 주차 후 전원 인가부터 시뮬레이션

+

3.1 잠금 해제 직후

+
IG1 = LOW
+P = LOW
+confirmedDriveMode = LOW
+targetPosMs = 0
+relay = OFF
+

사용자 설명 기준으로 잠금 해제 직후에는 IG1 OFF, P OFF입니다. 코드는 주행 조건을 IG1 HIGH && P LOW로 보므로 상승하지 않습니다.

+ +

3.2 브레이크 후 시동 ON 직후

+
IG1 LOW -> HIGH
+isStabilizing = true
+for 1000ms:
+  seat(0)
+  relay = OFF
+

시동 직후 P가 약 1초 동안 ON/OFF/ON으로 흔들려도 안정화 구간에서 릴레이는 동작하지 않습니다.

+ +

3.3 P단 유지

+
IG1 = HIGH
+P = HIGH
+confirmedDriveMode = LOW
+targetPosMs = 0
+

P단에서는 목표 위치가 0입니다. 현재 추정 위치가 0보다 높으면 하강합니다.

+ +

3.4 P단 외 이동

+
P = LOW for 80ms
+confirmedDriveMode = HIGH
+targetPosMs = storedSeatPositionMs
+relay = UP until currentPosMs reaches targetPosMs
+

P단 외 상태가 80ms 유지되면 EEPROM에 저장된 위치까지 상승합니다.

+ +

3.5 P단 복귀 또는 시동 OFF

+
confirmedDriveMode = LOW
+targetPosMs = 0
+currentPosMs -= deltaTime * 11 / 10
+when currentPosMs <= 0:
+  currentPosMs = 0
+  DOWN relay extra 300ms
+  relay = OFF
+

하강은 1.1배 속도로 위치를 추정하고, 바닥 도달 후 300ms 추가 하강으로 바닥 밀착감을 줍니다.

+ +

4. 한 글자 시리얼 명령

+

시리얼 연결 후 처음에는 잠금 상태입니다. 빈 Enter를 한 번 입력하면 도움말과 현재 상태를 출력하고, 그때부터 한 글자 명령을 사용할 수 있습니다. 잠금 해제 후 Enter 단독 입력은 아무 동작도 하지 않습니다. 안전을 위해 p/u/d/a/c/r 명령은 P단에서만 실행됩니다.

+ + + + + + + + + + + + + + + + +
명령동작응답
s현재 상태 1회 출력상태 ACK 출력
u현재 추정 위치에서 +500ms 목표 설정현재 위치/목표 출력
d현재 추정 위치에서 -500ms 목표 설정현재 위치/목표 출력
p현재 추정 위치를 EEPROM 자동 상승 위치로 저장저장된 위치 출력
g1초마다 debug 출력 시작debug 중에는 x만 작동
xdebug 모드 종료 전용debug 종료 후 상태 출력
a수동 모드 해제, 기어 기반 자동 목표로 복귀상태 출력
c즉시 보정: 상승 7초, 하강 6초, 위치 0 설정상태 출력
r10회 자동 보정 카운터 초기화상태 출력
h도움말 출력도움말 + 현재 상태 출력
+

주의: 명령은 한 글자만 받습니다. debug, down, position 2000처럼 긴 문자열은 실행하지 않습니다.

+ +

5. 수동 위치 세팅 시뮬레이션

+ + + + + + + + + + + +
현재 추정 위치입력계산결과
2000u2000 + 500 = 2500목표 2500으로 상승, 상태 출력
2500u2500 + 500 = 3000목표 3000으로 상승, 상태 출력
3000p현재 위치 3000 저장EEPROM 저장 위치가 3000으로 변경
3000P단 복귀목표 0하강
0P단 외 이동목표 EEPROM 30003000까지 자동 상승
+ +

6. 범위 초과 시뮬레이션

+ + + + + + + + + +
현재 추정 위치입력계산결과
5800u63000..6000 범위 초과, 경고 출력, 목표 변경 없음
200d-3000..6000 범위 초과, 경고 출력, 목표 변경 없음
임의abc한 글자 아님실행 거절, ACK 상태 출력
+ +

7. 10회 사용 후 자동 보정 시뮬레이션

+
each IG1 HIGH -> LOW:
+  useCount++
+  EEPROM.update(useCount)
+
+if useCount >= 10 and IG1 LOW for 5 minutes:
+  UP relay ON   for 7000ms
+  DOWN relay ON for 6000ms
+  relay OFF
+  currentPosMs = 0
+  targetPosMs = 0
+  useCount = 0
+

자동 보정 중 시동이 켜지면 중단합니다. 단, c로 시작한 강제 보정은 IG1 ON 상태에서도 끝까지 진행합니다.

+ +

8. 현재 주의 사항

+ + +

9. 추가 예외처리 기준

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
예외 상황처리목적
시트 이동 중 키 입력ERR: busy 출력 후 명령 무시연속 입력으로 500ms 단위가 흐트러지는 문제 방지
P단이 아닌 상태에서 p/u/d/a/c/r 입력ERR: check gear state. Command requires P. 출력수동 이동, 저장, 보정, EEPROM 변경이 P단 외 상태에서 실행되는 문제 방지
수동 이동 완료 전 기어 상태 변경수동 완료 대기 플래그 해제자동 제어로 넘어간 뒤 잘못된 MANUAL_STEP_DONE 출력 방지
내부 위치값 범위 이탈currentMs, targetMs를 0..6000으로 보정시간 계산 오차나 상태 꼬임으로 인한 비정상 목표 방지
보정 시작/중단수동 이동 플래그, 하강 잔여값, 하단 추가 하강 상태 초기화보정과 일반 이동 상태가 섞이는 문제 방지
+
+ + diff --git a/upload.ps1 b/upload.ps1 new file mode 100644 index 0000000..f57d115 --- /dev/null +++ b/upload.ps1 @@ -0,0 +1,13 @@ +param( + [string]$Port = "COM3", + [string]$Fqbn = "arduino:avr:nano:cpu=atmega328" +) + +$ArduinoCli = "arduino-cli" +$InstalledCli = "C:\Program Files\Arduino CLI\arduino-cli.exe" + +if (Test-Path $InstalledCli) { + $ArduinoCli = $InstalledCli +} + +& $ArduinoCli upload --fqbn $Fqbn --port $Port .