자동차 진단(Diagnostic Trouble Code, DTC) 시스템과 CAN 통신
자동차 진단 시스템은 차량의 전자제어장치(ECU)에서 발생하는 오류를 감지하고 문제를 해결하는 데 필수적인 역할을 합니다. 특히 OBD-II(On-Board Diagnostics II) 시스템과 CAN(Controller Area Network) 통신 프로토콜은 차량 진단과 유지보수에서 핵심적인 기술입니다. 이번 글에서는 자동차 진단 시스템과 CAN의 관계, DTC 코드의 구조 및 해석 방법, 그리고 ELM327과 ESP32 IDF를 이용한 데이터 분석 방법을 설명하겠습니다.
1. OBD-II와 CAN의 관계
OBD-II란?
OBD-II는 1996년 이후 제작된 모든 차량에 적용된 차량 진단 시스템입니다. 이는 차량의 다양한 센서 데이터를 모니터링하고 오류가 발생할 경우 이를 기록하여 정비사가 쉽게 문제를 파악할 수 있도록 합니다. OBD-II 시스템은 엔진 및 배기가스 관련 문제를 주로 다루며, 다양한 프로토콜을 지원합니다.
CAN과 OBD-II
OBD-II가 표준화되면서 진단 데이터 전송을 위한 프로토콜로 CAN이 가장 널리 사용되고 있습니다. CAN은 차량 내 ECU 간의 통신을 담당하며, 신뢰성이 높고 빠른 데이터 전송이 가능하여 OBD-II와 결합되어 사용됩니다.
OBD-II에서 사용되는 CAN 프로토콜의 기본적인 사양은 다음과 같습니다:
- 속도: 250kbps 또는 500kbps
- 메시지 형식: 표준 CAN (11-bit) 또는 확장 CAN (29-bit)
- 통신 방식: 요청-응답 방식(진단 요청 후 응답 받음)
- 사용되는 PID(Parameter ID): 엔진 속도, 차량 속도, 연료 상태 등 다양한 진단 정보 제공
OBD-II 커넥터는 보통 차량 운전석 아래쪽에 위치하며, 다음과 같은 핀 배열을 가집니다:
핀 번호 | 설명 |
---|---|
4 | 차체 접지 (Ground) |
5 | 신호 접지 (Signal Ground) |
6 | CAN High (ISO 15765-4) |
14 | CAN Low (ISO 15765-4) |
16 | 배터리 전원 (+12V) |
2. DTC 코드 구조 및 해석 방법
DTC 코드란?
Diagnostic Trouble Code(DTC)는 차량에서 발생한 문제를 표시하는 표준 코드입니다. 차량 ECU는 특정 문제를 감지하면 해당 코드가 OBD-II 시스템에 저장됩니다.
DTC 코드 형식
DTC 코드는 보통 5자리 문자열로 구성되며, 다음과 같은 형식을 따릅니다:
P0301
각 자리수의 의미는 다음과 같습니다:
첫 번째 문자 (영문자): 문제의 주요 영역을 나타냅니다.
P
(Powertrain): 엔진 및 변속기 관련 문제C
(Chassis): 섀시 관련 문제 (제동, 조향 등)B
(Body): 차체 전장 장치 관련 문제 (에어백, 도어 등)U
(Network & Communication): 네트워크 및 통신 관련 문제
두 번째 숫자: 코드 유형
0
: 일반(OBD-II 표준)1~9
: 제조사 고유 코드
세 번째 숫자: 세부 시스템
0,1,2
: 연료 및 공기 혼합 제어3
: 점화 시스템4
: 배기가스 제어5
: 속도 제어 및 공회전 시스템6
: ECU 및 출력 신호7,8
: 변속기 관련
네 번째와 다섯 번째 숫자: 특정 문제를 나타내는 고유 코드
예제 코드 해석
- P0301: 1번 실린더에서 점화 실패 발생
- P0420: 촉매 변환기 성능 저하 감지
- U0100: ECU 간 통신 오류 발생
DTC 코드를 해석하면 차량의 어떤 부위에서 어떤 문제가 발생했는지를 정확히 파악할 수 있습니다.
3. 차량 진단 장치(ELM327)와 ESP32 IDF로 데이터 분석
ELM327 개요
ELM327은 OBD-II 데이터 인터페이스로, 차량의 OBD-II 포트에 연결하여 데이터를 읽어올 수 있습니다. Bluetooth, Wi-Fi, USB 버전이 있으며, 차량 ECU의 진단 정보를 조회할 때 사용됩니다.
ESP32 IDF를 이용한 OBD-II 데이터 분석
ESP32는 저전력, 고성능의 마이크로컨트롤러로, ELM327과 연결하여 OBD-II 데이터를 읽고 분석할 수 있습니다.
1. ESP32 IDF 환경 설정
ESP32를 사용하여 OBD-II 데이터를 분석하려면 먼저 개발 환경을 설정해야 합니다.
# ESP-IDF 설치
git clone --recursive https://github.com/espressif/esp-idf.git
cd esp-idf
./install.sh
. ./export.sh
2. OBD-II 데이터 요청 코드 작성
다음은 ESP32가 ELM327과 통신하여 차량 데이터를 읽는 예제 코드입니다.
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "esp_system.h"
#include "esp_log.h"
#include "driver/uart.h"
#define TXD_PIN (GPIO_NUM_17)
#define RXD_PIN (GPIO_NUM_16)
#define UART_NUM UART_NUM_1
void obd2_task(void *arg) {
const char *request = "010C\r"; // 엔진 RPM 요청
uart_write_bytes(UART_NUM, request, strlen(request));
char response[128];
int length = uart_read_bytes(UART_NUM, (uint8_t *)response, 128, 100 / portTICK_PERIOD_MS);
if (length > 0) {
response[length] = '\0';
ESP_LOGI("OBD", "Received: %s", response);
}
vTaskDelete(NULL);
}
void app_main() {
uart_config_t uart_config = {
.baud_rate = 9600,
.data_bits = UART_DATA_8_BITS,
.parity = UART_PARITY_DISABLE,
.stop_bits = UART_STOP_BITS_1,
.flow_ctrl = UART_HW_FLOWCTRL_DISABLE
};
uart_driver_install(UART_NUM, 256, 0, 0, NULL, 0);
uart_param_config(UART_NUM, &uart_config);
uart_set_pin(UART_NUM, TXD_PIN, RXD_PIN, UART_PIN_NO_CHANGE, UART_PIN_NO_CHANGE);
xTaskCreate(obd2_task, "obd2_task", 4096, NULL, 5, NULL);
}
이 코드를 실행하면 ESP32가 OBD-II 포트에서 데이터를 읽어 차량의 RPM 정보를 가져올 수 있습니다.
결론
자동차 진단 시스템에서 OBD-II와 CAN 통신은 필수적인 기술이며, DTC 코드 해석을 통해 차량의 문제를 빠르게 파악할 수 있습니다. ELM327과 ESP32를 활용하면 차량 데이터를 직접 읽고 분석할 수 있어 차량 유지보수와 진단에 큰 도움이 될 것입니다.
'CAN > CAN 기초' 카테고리의 다른 글
CAN과 LIN(Local Interconnect Network) 비교 및 통합 (0) | 2025.03.07 |
---|---|
CAN 리버스 엔지니어링 (자동차 및 산업용 기기 분석) (0) | 2025.03.06 |
자동차 CAN 네트워크 심화 분석 (0) | 2025.03.04 |
CAN 통신의 미래와 최신 동향 (0) | 2025.03.03 |
CANopen 및 J1939 프로토콜 (0) | 2025.03.02 |