CAN/CAN 기초

자동차 진단(Diagnostic Trouble Code, DTC) 시스템과 CAN 통신

임베디드 친구 2025. 3. 5. 09:18
728x90
반응형

자동차 진단(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: 변속기 관련
  • 네 번째와 다섯 번째 숫자: 특정 문제를 나타내는 고유 코드

예제 코드 해석

  1. P0301: 1번 실린더에서 점화 실패 발생
  2. P0420: 촉매 변환기 성능 저하 감지
  3. 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를 활용하면 차량 데이터를 직접 읽고 분석할 수 있어 차량 유지보수와 진단에 큰 도움이 될 것입니다.

728x90
반응형