CAN 기반 센서 네트워크 구축 (실전 프로젝트)
1. 개요
CAN(Controller Area Network)은 자동차, 산업용 장비, 로봇 및 다양한 임베디드 시스템에서 널리 사용되는 통신 프로토콜입니다. 이번 포스팅에서는 여러 개의 센서를 CAN 네트워크로 연결하고 데이터를 수집 및 분석하는 시스템을 구축하는 방법을 설명하겠습니다. 또한, Python과 PCAN을 활용하여 데이터를 로깅하는 실습도 함께 진행하겠습니다.
2. 프로젝트 목표
- 여러 개의 센서를 CAN 네트워크로 연결
- 데이터를 실시간으로 수집하고 분석하는 시스템 구축
- 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 하드웨어 연결
CAN 트랜시버 연결
- 센서와 마이크로컨트롤러를 CAN 트랜시버(MCP2551)와 연결합니다.
- CAN_H 및 CAN_L 라인을 통해 모든 장치를 연결합니다.
- 네트워크의 양 끝단에는 120Ω 종단 저항을 추가합니다.
센서 데이터 송신 노드 설정
- 마이크로컨트롤러를 프로그래밍하여 센서 데이터를 CAN 메시지로 변환하고 전송하도록 설정합니다.
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 시스템을 구축하는 방법도 다룰 예정입니다.
'CAN 통신' 카테고리의 다른 글
CAN 데이터를 활용한 머신러닝 기반 예측 시스템(실전 프로젝트) (0) | 2025.03.13 |
---|---|
자동차 ECU와 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 |