CANOpen 마스터 및 슬레이브 개발
CANOpen 네트워크에서 노드는 일반적으로 마스터(Master)와 슬레이브(Slave)로 구성됩니다. 마스터는 네트워크를 제어하고 슬레이브 노드와의 통신을 조율하는 역할을 수행하며, 슬레이브는 마스터의 명령을 받아 동작하는 장치입니다. 이러한 구조는 CANOpen을 활용한 산업 자동화, 로봇 제어, 모터 드라이버 시스템 등 다양한 응용에서 핵심적인 역할을 합니다.
이 장에서는 STM32F429를 활용하여 CANOpen 마스터와 슬레이브 장치를 개발하는 방법을 실습합니다. STM32CubeIDE와 HAL 라이브러리를 이용하여 기본적인 CANOpen 프로토콜을 구현하고, CANOpenNode 및 CANFestival과 같은 오픈소스 라이브러리를 활용하여 보다 효율적인 개발 방법을 소개합니다.
먼저, CANOpen 마스터와 슬레이브의 기본 개념과 역할을 설명한 후, STM32F429에서 각각의 기능을 구현하는 절차를 살펴봅니다. 이후 실제 네트워크에서 데이터 교환을 수행하는 방법과 마스터-슬레이브 간의 통신을 설정하는 과정을 실습을 통해 익히게 됩니다. 이를 통해 CANOpen 기반 시스템을 설계하고 구현하는 데 필요한 기초 역량을 갖출 수 있습니다.
CANOpen Master 개발 (STM32 및 C 기반)
개요
CANOpen Master는 네트워크 내에서 슬레이브 장치들을 관리하고 데이터를 주고받는 역할을 합니다. 본 장에서는 STM32F429와 STM32CubeIDE, HAL 라이브러리를 활용하여 CANOpen Master를 개발하는 방법을 다룹니다.
CANOpen Master의 역할
- 네트워크 내 슬레이브 장치 검색 및 관리
- PDO (Process Data Object) 및 SDO (Service Data Object) 통신 수행
- 슬레이브의 상태 모니터링 및 제어
- 네트워크의 NMT (Network Management) 메시지 송수신
개발 환경 설정
하드웨어 준비
- STM32F429 보드
- CAN 트랜시버 (MCP2551 또는 TJA1050 등)
- CAN 네트워크 연결을 위한 배선
소프트웨어 준비
- STM32CubeIDE 설치 및 프로젝트 생성
- HAL 라이브러리를 이용한 CAN 설정
- CANOpen 라이브러리 (예: CANopenNode) 통합
STM32에서 CAN 초기화
STM32에서 CAN을 사용하려면 HAL 라이브러리를 이용하여 초기화해야 합니다. 기본적인 설정 절차는 다음과 같습니다.
void CAN_Config(void) {
CAN_HandleTypeDef hcan;
hcan.Instance = CAN1;
hcan.Init.Prescaler = 16;
hcan.Init.Mode = CAN_MODE_NORMAL;
hcan.Init.SyncJumpWidth = CAN_SJW_1TQ;
hcan.Init.TimeSeg1 = CAN_BS1_4TQ;
hcan.Init.TimeSeg2 = CAN_BS2_3TQ;
hcan.Init.AutoBusOff = ENABLE;
hcan.Init.AutoWakeUp = ENABLE;
hcan.Init.AutoRetransmission = ENABLE;
hcan.Init.ReceiveFifoLocked = DISABLE;
hcan.Init.TransmitFifoPriority = ENABLE;
if (HAL_CAN_Init(&hcan) != HAL_OK) {
// 오류 처리
}
}
CANOpen Master 기능 구현
NMT 메시지 전송
CANOpen Master는 네트워크 관리 메시지를 전송하여 슬레이브의 상태를 변경할 수 있습니다.uint8_t nmt_start_msg[2] = {0x01, 0x00}; // Start Remote Node, Node ID = 0 (전체 대상) CAN_TxHeaderTypeDef txHeader; txHeader.StdId = 0x000; // NMT 메시지 ID txHeader.RTR = CAN_RTR_DATA; txHeader.IDE = CAN_ID_STD; txHeader.DLC = 2; HAL_CAN_AddTxMessage(&hcan, &txHeader, nmt_start_msg, &txMailbox);
SDO 통신 구현
SDO를 이용하면 마스터가 슬레이브의 특정 오브젝트를 읽거나 설정할 수 있습니다.uint8_t sdo_read_msg[8] = {0x40, 0x00, 0x10, 0x00, 0x00, 0x00, 0x00, 0x00}; txHeader.StdId = 0x601; // 슬레이브 노드 ID가 1인 경우 txHeader.DLC = 8; HAL_CAN_AddTxMessage(&hcan, &txHeader, sdo_read_msg, &txMailbox);
PDO 전송
PDO는 실시간 데이터를 주고받을 때 사용됩니다.uint8_t pdo_msg[8] = {0xAB, 0xCD, 0x12, 0x34, 0x56, 0x78, 0x9A, 0xBC}; txHeader.StdId = 0x181; // Transmit PDO1, Node ID = 1 txHeader.DLC = 8; HAL_CAN_AddTxMessage(&hcan, &txHeader, pdo_msg, &txMailbox);
CANOpen 라이브러리 활용
STM32에서 CANOpen을 효과적으로 구현하기 위해 CANopenNode 같은 오픈소스 라이브러리를 사용할 수 있습니다.
CANopenNode 다운로드 및 프로젝트 통합
- CANopenNode GitHub에서 코드 다운로드
CANopenNode
를 STM32CubeIDE 프로젝트에 추가CO_driver_STM32.c
파일을 작성하여 HAL CAN 드라이버와 연동
CANopen Master 초기화 코드
CO_t *co = CO_new(NULL, NULL, NULL); CO_CANmodule_init(co->CANmodule, 0, CAN1); CO_NMT_init(co->NMT, co->EM, 1, NULL); CO_CANsetNormalMode(co->CANmodule);
마무리
본 장에서는 STM32에서 HAL과 CANopen 라이브러리를 이용하여 CANOpen Master를 개발하는 방법을 설명하였습니다.
'CAN > CAN Open' 카테고리의 다른 글
CANopen NMT 명령을 통한 노드 제어 (0) | 2025.08.14 |
---|---|
CANOpen Slave 개발 (STM32 MCU 활용) (0) | 2025.08.13 |
CANOpen STM32F429를 이용한 모터 제어 CiA 402 프로파일 (0) | 2025.08.11 |
CANOpen 노드 구성 및 테스트(STM32F429 활용) (0) | 2025.08.10 |
CANOpen 네트워크 테스트 및 디버깅 (0) | 2025.08.09 |