CAN 통신

CAN 기반 센서 네트워크 구축 (실전 프로젝트)

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

CAN 기반 센서 네트워크 구축 (실전 프로젝트)

1. 개요

CAN(Controller Area Network)은 자동차, 산업용 장비, 로봇 및 다양한 임베디드 시스템에서 널리 사용되는 통신 프로토콜입니다. 이번 포스팅에서는 여러 개의 센서를 CAN 네트워크로 연결하고 데이터를 수집 및 분석하는 시스템을 구축하는 방법을 설명하겠습니다. 또한, Python과 PCAN을 활용하여 데이터를 로깅하는 실습도 함께 진행하겠습니다.

2. 프로젝트 목표

  1. 여러 개의 센서를 CAN 네트워크로 연결
  2. 데이터를 실시간으로 수집하고 분석하는 시스템 구축
  3. Python과 PCAN을 활용하여 데이터 로깅 및 모니터링

3. 준비물

이 프로젝트를 진행하기 위해 다음과 같은 장비와 소프트웨어가 필요합니다.

3.1 하드웨어

  • CAN 인터페이스 장치 (예: PCAN-USB, MCP2515 기반 모듈)
  • CAN 지원 센서 (예: 온습도 센서, 가속도 센서 등)
  • 마이크로컨트롤러 (예: STM32, ESP32, Arduino)
  • CAN 트랜시버 (예: MCP2551)
  • CAN 케이블 및 종단 저항 (120Ω)

3.2 소프트웨어

  • Python 3.x
  • PCAN-Basic 라이브러리 (PEAK-System에서 제공)
  • can 패키지 (python-can)
  • Jupyter Notebook 또는 터미널 환경

4. CAN 네트워크 구축

4.1 CAN 통신 개념

CAN은 버스 토폴로지를 기반으로 한 다중 액세스 프로토콜입니다. 모든 노드가 동일한 CAN 버스에 연결되며, 메시지 기반 통신을 수행합니다. 각 메시지는 고유한 ID를 가지며, 우선순위에 따라 충돌을 방지하는 CSMA/CA 방식을 사용합니다.

4.2 하드웨어 연결

  1. CAN 트랜시버 연결

    • 센서와 마이크로컨트롤러를 CAN 트랜시버(MCP2551)와 연결합니다.
    • CAN_H 및 CAN_L 라인을 통해 모든 장치를 연결합니다.
    • 네트워크의 양 끝단에는 120Ω 종단 저항을 추가합니다.
  2. 센서 데이터 송신 노드 설정

    • 마이크로컨트롤러를 프로그래밍하여 센서 데이터를 CAN 메시지로 변환하고 전송하도록 설정합니다.
  3. PCAN을 이용한 데이터 수신 및 로깅

    • Python과 PCAN을 이용하여 CAN 메시지를 수신하고 데이터를 분석합니다.

5. CAN 데이터 로깅

5.1 CAN 데이터 송신 예제 (마이크로컨트롤러)

아래는 MCP2515 모듈을 이용하여 CAN 메시지를 송신하는 코드입니다.

#include <stdio.h>
#include "driver/twai.h"
#include "esp_err.h"
#include "esp_log.h"

#define TAG "CAN" // 로그 태그

void init_can() {
    twai_general_config_t g_config = TWAI_GENERAL_CONFIG_DEFAULT(GPIO_NUM_21, GPIO_NUM_22, TWAI_MODE_NORMAL);
    twai_timing_config_t t_config = TWAI_TIMING_CONFIG_500KBITS();
    twai_filter_config_t f_config = TWAI_FILTER_CONFIG_ACCEPT_ALL();

    if (twai_driver_install(&g_config, &t_config, &f_config) != ESP_OK) {
        ESP_LOGE(TAG, "CAN 드라이버 설치 실패");
        return;
    }

    if (twai_start() != ESP_OK) {
        ESP_LOGE(TAG, "CAN 드라이버 시작 실패");
        return;
    }
    ESP_LOGI(TAG, "CAN 초기화 완료");
}

void send_can_message() {
    twai_message_t message;
    message.identifier = 0x100;
    message.flags = TWAI_MSG_FLAG_NONE;
    message.data_length_code = 8;
    uint8_t data[8] = {10, 20, 30, 40, 50, 60, 70, 80};
    memcpy(message.data, data, 8);

    if (twai_transmit(&message, pdMS_TO_TICKS(1000)) == ESP_OK) {
        ESP_LOGI(TAG, "CAN 데이터 전송 완료");
    } else {
        ESP_LOGE(TAG, "CAN 데이터 전송 실패");
    }
}

void app_main() {
    init_can();
    while (1) {
        send_can_message();
        vTaskDelay(pdMS_TO_TICKS(1000));
    }
}

5.2 Python을 활용한 PCAN 드라이버 설치 및 설정

Python에서 python-can 라이브러리를 활용하여 CAN 데이터를 수집하고 분석하는 코드를 작성해보겠습니다.
PEAK-System에서 제공하는 PCAN 드라이버를 설치한 후, python-can 라이브러리를 설치합니다.

pip install python-can

5.3 Python을 활용한 데이터 수신 및 로깅

Python에서 python-can을 이용하여 CAN 데이터를 수신하는 코드를 작성해보겠습니다.

import can
import time

def receive_can_messages():
    bus = can.interface.Bus(channel='PCAN_USBBUS1', bustype='pcan', bitrate=500000)
    print("CAN 메시지 수신 시작...")
    try:
        while True:
            message = bus.recv()
            if message:
                print(f"ID: {hex(message.arbitration_id)}, 데이터: {message.data}")
            time.sleep(0.1)
    except KeyboardInterrupt:
        print("CAN 메시지 수신 종료")
        bus.shutdown()

if __name__ == "__main__":
    receive_can_messages()

5.4 데이터 저장 및 분석

수집된 CAN 데이터를 CSV 파일로 저장하고 Pandas를 이용해 분석할 수도 있습니다.

import pandas as pd
import can

def log_can_data(output_file="can_data.csv"):
    bus = can.interface.Bus(channel='PCAN_USBBUS1', bustype='pcan', bitrate=500000)
    data_list = []
    try:
        while True:
            message = bus.recv()
            if message:
                data_list.append([message.timestamp, message.arbitration_id, message.data])
                print(f"Logged: {message.timestamp}, ID: {message.arbitration_id}, Data: {message.data}")
    except KeyboardInterrupt:
        df = pd.DataFrame(data_list, columns=["Timestamp", "ID", "Data"])
        df.to_csv(output_file, index=False)
        print(f"데이터 저장 완료: {output_file}")
        bus.shutdown()

if __name__ == "__main__":
    log_can_data()

6. 결론

이번 포스팅에서는 CAN 네트워크를 구축하고 Python과 PCAN을 활용하여 데이터를 수집 및 분석하는 방법을 살펴보았습니다. 앞으로는 데이터 분석을 위한 추가적인 필터링 기법과 실시간 모니터링을 위한 GUI 시스템을 구축하는 방법도 다룰 예정입니다.

반응형