자동차 ECU와 CAN 통신(실전 프로젝트)
1. 개요
자동차는 다양한 전자제어장치(ECU, Electronic Control Unit)로 구성되어 있으며, 이러한 ECU들은 차량 내부에서 CAN(Controller Area Network) 통신을 통해 서로 데이터를 주고받습니다. 이번 포스팅에서는 OBD-II(On-Board Diagnostics) 포트를 통해 차량의 실시간 데이터를 읽고, 이를 활용하여 차량 진단 및 데이터 로깅 시스템을 개발하는 방법을 설명하겠습니다.
2. 자동차 OBD-II 포트와 CAN 통신
2.1 OBD-II 포트란?
OBD-II 포트는 차량의 ECU와 통신하기 위한 인터페이스로, 차량의 센서 데이터 및 진단 정보를 얻을 수 있도록 설계되었습니다. 1996년 이후 생산된 모든 차량에는 OBD-II 포트가 장착되어 있으며, 이 포트를 통해 CAN 통신을 사용할 수 있습니다.
2.2 OBD-II 포트의 핀 구성
OBD-II 커넥터는 16개의 핀으로 구성되어 있으며, 이 중 CAN 통신과 관련된 주요 핀은 다음과 같습니다.
핀 번호 | 기능 |
---|---|
4 | 차체 접지 (Chassis Ground) |
5 | 신호 접지 (Signal Ground) |
6 | CAN High (CAN-H) |
14 | CAN Low (CAN-L) |
16 | 배터리 전원 (12V) |
CAN-H와 CAN-L 핀을 사용하여 차량의 ECU와 직접 CAN 메시지를 주고받을 수 있습니다.
2.3 OBD-II 프로토콜
OBD-II 포트는 여러 프로토콜을 지원하지만, 최근 차량에서는 대부분 CAN 프로토콜을 사용합니다. CAN 프로토콜을 통한 OBD-II 통신에서 가장 중요한 PID(Parameter ID) 명령어는 다음과 같습니다.
PID 코드 | 설명 |
---|---|
0C | 엔진 RPM |
0D | 차량 속도 |
10 | MAF (공기 유량 센서) |
11 | 스로틀 위치 |
1F | 엔진 런타임 |
이를 통해 차량의 실시간 데이터를 가져올 수 있습니다.
3. 차량에서 실시간 데이터 읽어오기
3.1 필요한 하드웨어
차량의 CAN 데이터를 읽어오기 위해 다음과 같은 하드웨어가 필요합니다.
- OBD-II 블루투스 어댑터 (ELM327 기반)
- USB 또는 Wi-Fi 기반 OBD-II 어댑터
- CAN 분석기 (Peak CAN, Seeed Studio CAN-BUS Shield 등)
- Raspberry Pi 또는 PC
3.2 ELM327을 이용한 데이터 읽기
ELM327 칩이 내장된 OBD-II 어댑터를 사용하면 차량의 실시간 데이터를 쉽게 읽을 수 있습니다. Python을 사용하여 데이터를 읽는 예제 코드를 보겠습니다.
import obd
# OBD-II 포트에 연결
connection = obd.OBD()
# 엔진 RPM 데이터 요청
cmd = obd.commands.RPM
response = connection.query(cmd)
# 결과 출력
print("엔진 RPM:", response.value)
위 코드에서 obd.OBD()
를 통해 차량과 연결하고, connection.query(obd.commands.RPM)
을 호출하여 엔진 RPM 데이터를 가져옵니다.
3.3 CAN 통신을 직접 사용하여 데이터 읽기
ELM327 대신 CAN 어댑터를 사용하여 직접 데이터를 읽을 수도 있습니다. 다음은 Python과 python-can
라이브러리를 사용하여 CAN 메시지를 수신하는 코드입니다.
import can
# CAN 인터페이스 설정
bus = can.interface.Bus(channel='can0', bustype='socketcan')
# 메시지 수신
message = bus.recv()
print("Received CAN Message:", message)
이 방식은 차량의 원시 CAN 메시지를 직접 분석할 수 있다는 장점이 있습니다.
4. 차량 진단 및 데이터 로깅 시스템 개발
4.1 데이터 로깅 개념
차량 데이터를 실시간으로 수집하여 저장하면, 이후 분석을 통해 차량 성능을 모니터링하거나 고장을 진단할 수 있습니다. 데이터 로깅 시스템을 구축하려면 다음과 같은 요소가 필요합니다.
- 차량에서 CAN 데이터를 지속적으로 수집
- 데이터를 CSV 또는 데이터베이스에 저장
- 실시간 시각화를 통해 사용자에게 제공
4.2 실시간 데이터 저장
아래 코드는 차량의 속도 및 RPM 데이터를 실시간으로 CSV 파일에 저장하는 예제입니다.
import obd
import csv
import time
# OBD-II 연결
connection = obd.OBD()
cmd_rpm = obd.commands.RPM
cmd_speed = obd.commands.SPEED
# CSV 파일 열기
with open("car_data.csv", "w", newline='') as file:
writer = csv.writer(file)
writer.writerow(["Time", "RPM", "Speed"])
while True:
# 데이터 요청
rpm = connection.query(cmd_rpm).value
speed = connection.query(cmd_speed).value
# 데이터 기록
writer.writerow([time.strftime("%Y-%m-%d %H:%M:%S"), rpm, speed])
print(f"RPM: {rpm}, Speed: {speed}")
time.sleep(1)
4.3 데이터 시각화 및 분석
수집한 데이터를 matplotlib
을 이용하여 시각화할 수도 있습니다.
import pandas as pd
import matplotlib.pyplot as plt
# 데이터 로드
data = pd.read_csv("car_data.csv")
# 그래프 그리기
plt.plot(data["Time"], data["RPM"], label="RPM")
plt.plot(data["Time"], data["Speed"], label="Speed")
plt.xlabel("Time")
plt.ylabel("Value")
plt.legend()
plt.show()
5. 결론
이번 포스팅에서는 자동차 OBD-II 포트를 이용한 CAN 통신 개념과 실시간 차량 데이터 읽기 및 로깅 시스템 구축 방법을 소개하였습니다. 이러한 시스템을 활용하면 차량의 상태를 실시간으로 모니터링하고, 고장 진단 및 최적화에 활용할 수 있습니다.
'CAN 통신' 카테고리의 다른 글
CAN 데이터를 활용한 머신러닝 기반 예측 시스템(실전 프로젝트) (0) | 2025.03.13 |
---|---|
CAN 기반 센서 네트워크 구축 (실전 프로젝트) (0) | 2025.03.13 |
CAN FD 및 최신 CAN XL 기술 심화 분석 (0) | 2025.03.12 |
Linux에서 SocketCAN을 활용한 CAN 네트워크 제어 (0) | 2025.03.11 |
CAN to Wireless 통합 시스템 구축 (0) | 2025.03.10 |