앞으로 자동차 CAN으로 간단하게 만들 것들이 많아질거 같아서 MCP2515를 이용하여 CAN 상태 값을 가져오는 예제를 시험삼아 만들어 보았다.
#include <mcp_can.h>
#include <SPI.h>
MCP_CAN CAN0(10); // CS 핀 설정
void setup() {
Serial.begin(115200);
if (CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_8MHZ) == CAN_OK) {
Serial.println("CAN 초기화 성공");
} else {
Serial.println("CAN 초기화 실패");
}
/*
// 마스크 및 필터 설정
CAN0.init_Mask(0, 0, 0x7FF);
CAN0.init_Mask(1, 0, 0x7FF);
CAN0.init_Filt(0, 0, 0x123);
CAN0.init_Filt(1, 0, 0x123);
CAN0.init_Filt(2, 0, 0x123);
CAN0.init_Filt(3, 0, 0x123);
CAN0.init_Filt(4, 0, 0x123);
CAN0.init_Filt(5, 0, 0x123);
*/
CAN0.setMode(MCP_NORMAL);
}
void loop() {
// CAN 데이터 송신
// // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
// unsigned char data[8] = { 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07 };
// CAN0.sendMsgBuf(0x00, 0, 8, data);
// delay(1000);
// // !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];
// CAN 데이터 수신
if (CAN0.checkReceive() == CAN_MSGAVAIL) {
CAN0.readMsgBuf(&rxId, &len, rxBuf);
Serial.print(rxId, HEX);
Serial.print("//");
for (int i = 0; i < len; i++) {
Serial.print(rxBuf[i], HEX);
Serial.print(" ");
}
Serial.println();
}
}
라이브러리는 coryjfowler의 mcp_can 라이브러리를 사용하였다.
내가 사용을 못하는건지 라이브러리 자체 버그인지 마스크하고 필터 함수가 먹히지 않아서 주석 처리하였다.
CAN 수신은 괜찮지만 송신측 코드는 잘못 사용하면 치명적(?) 동작을 만들 수 있으니 주의!!
테스트 차량은 TA모닝
테스트에 몇십만원을 태워 측정 장비를 살순 없으니 노가다로 데이터를 분석해본다.
구형 차량이라 그런지 CAN으로 할 수 있는게 많지 않다..
이런.. 계기판에도 CAN이 연결되어 있길래 계기판 정보를 CAN으로 읽을 수 있을줄 알았는데 막상 들어가보니 아날로그...
엔진과 트랜스미션하고 주고받는 정보는 어느정도 있는거 같아서 기어 단수 상태를 읽어 들이도록 만들어 보았다.
'공부 > 아두이노' 카테고리의 다른 글
[아두이노] ICSP핀을 이용하여 USB잭 없이 코드 업로드(ICSP 프로그래머 부트로더 굽기) (0) | 2024.11.29 |
---|---|
[아두이노] RFID-RC522를 이용한 RFID 태그 인식 (1) | 2024.07.23 |
[아두이노] 풀업 풀다운 저항 회로를 이용하여 입력 신호 플로팅 현상 해결 (0) | 2023.12.14 |
[아두이노] EEPROM 라이브러리를 이용한 비휘발성 메모리 저장 (0) | 2023.12.12 |
[아두이노] PWM 라이브러리를 이용한 MG90 서보모터 제어 (0) | 2023.12.12 |