반응형

 

앞으로 자동차 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으로 읽을 수 있을줄 알았는데 막상 들어가보니 아날로그...

 

엔진과 트랜스미션하고 주고받는 정보는 어느정도 있는거 같아서 기어 단수 상태를 읽어 들이도록 만들어 보았다.

반응형

+ Recent posts