CAN 통신

자동차 ECU와 CAN 통신(실전 프로젝트)

임베디드 친구 2025. 3. 13. 07:53
728x90
반응형

자동차 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 데이터 로깅 개념

차량 데이터를 실시간으로 수집하여 저장하면, 이후 분석을 통해 차량 성능을 모니터링하거나 고장을 진단할 수 있습니다. 데이터 로깅 시스템을 구축하려면 다음과 같은 요소가 필요합니다.

  1. 차량에서 CAN 데이터를 지속적으로 수집
  2. 데이터를 CSV 또는 데이터베이스에 저장
  3. 실시간 시각화를 통해 사용자에게 제공

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 통신 개념과 실시간 차량 데이터 읽기 및 로깅 시스템 구축 방법을 소개하였습니다. 이러한 시스템을 활용하면 차량의 상태를 실시간으로 모니터링하고, 고장 진단 및 최적화에 활용할 수 있습니다.

반응형