Make.

OBD2(CAN)で自動車と通信(スケッチ編)

Pocket

ここでは、Arduinoを自動車と接続して通信するプログラムについて解説します。
シールドや、回路の解説は、「OBD2(CAN)で自動車と通信(回路編)」を参考にしてください。

【注意】車の通信を妨害する恐れもあるため、最悪事故や故障につながります。ここで解説する方法は、自己責任で実施してください。


ライブラリの準備

ArduinoがCANコントローラMCP2515と通信するためのライブラリを作成して、公開されているため、それを使用します。
OBD2(CAN)で自動車と通信(回路編)で紹介したシールド、自作した回路のすべてて使用可能なライブラリになります。

以下からライブラリをダウンロードします。
MCP_CAN_lib
サイト内の[Download Zip]からZipファイルをダウンロードしたファイルを解凍し、Arduinoのライブラリフォルダに格納するだけです。


CAN信号の受信

ライブラリをインストールしたら、以下のスケッチ(コード)をArduinoで動作させてみましょう。
CANシールドを通して、車両のOBD2コネクタに接続するとCAN信号をArduinoで受信して、確認することができます。

// CAN受信のサンプル
// 
// 受信したCAN信号をシリアルで送信する

// ライブラリヘッダのインクルード
#include <mcp_can.h>
#include <SPI.h>

//設定値
#define CS_PIN  (10) // CSを10ピンとする(変更可能)
#define INT_PIN (9)  // INTを9ピンとする(変更可能)

long unsigned int rxId;
unsigned char len = 0;
unsigned char rxBuf[8];

MCP_CAN CAN0(CS_PIN);      

void setup()
{
  Serial.begin(115200);
  CAN0.begin(CAN_500KBPS); // CANの通信速度を500kbpsにする 
  pinMode(INT_PIN, INPUT); // 割り込みのためのピンを設定
  Serial.println("MCP2515 Library Receive Example...");
}

void loop()
{
    if(!digitalRead(INT_PIN))   // 受信割り込みが発生したら、CANデータをReadする
    {
      CAN0.readMsgBuf(&len, rxBuf);              
      rxId = CAN0.getCanId();                    
      Serial.print("ID: ");
      Serial.print(rxId, HEX);
      Serial.print("  Data: ");
      for(int i = 0; i<len; i++)                
      {
        if(rxBuf[i] < 0x10)
        {
          Serial.print("0");
        }
        Serial.print(rxBuf[i], HEX);
        Serial.print(" ");
      }
      Serial.println();
    }
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

ArduinoとCANシールドが2台あれば、次に解説するCAN信号の送信を受信することで、車に接続しないで確認することができます。
00225


CAN信号の送信

※車両に接続して、CAN信号を送信すると、車両の動作に影響を与える可能性があります。以下の確認は自己責任でお願いします。

以下のスケッチ(コード)を実行すると、CAN信号を繰り返し送信します。

// CANの送信サンプル
//
// CAN信号を送信し続ける

// ライブラリヘッダのインクルード
#include <mcp_can.h>
#include <SPI.h>

#define CS_PIN  (10) // CSを10ピンとする(変更可能)

MCP_CAN CAN0(CS_PIN);

void setup()
{
  Serial.begin(115200);
  if(CAN0.begin(CAN_500KBPS) == CAN_OK) Serial.print("can init ok!!\r\n");
  else Serial.print("Can init fail!!\r\n");
}

unsigned char stmp[8] = {0, 1, 2, 3, 4, 5, 6, 7};
void loop()
{
  // 送信データ:  ID = 0x00, 標準フレーム, データ長=8
  CAN0.sendMsgBuf(0x00, 0, 8, stmp);  
  delay(100);                       // send data per 100ms
}

/*********************************************************************************************************
  END FILE
*********************************************************************************************************/

Pocket