2016年01月10日

ArduinoでCAN-Busモニタ

Arduino+CAN-BUSシールド(Seeed Studio製)

Arduino+CAN-BUSシールド(Seeed Studio製)を使用してCAN通信モニタを作ってみました。

(Wikiサイト) http://wiki.seeedstudio.com/CAN-BUS_Shield_V2.0/

Seeedstudio CAN-BUSシールドV2、Arduino用

価格:3,260円
(2020/6/11 21:12時点)
感想(0件)





回路図
ArduinoでCAN-Busモニタ


CAN通信は、車の故障診断コネクタ(OBD2コネクタ)にも使用される通信方式です。
(参考)https://vector.com/vj_ecu_jp.html

今回はCANのライブラリ(https://github.com/Seeed-Studio/CAN_BUS_Shield)を利用して試作してみました。

転送フォーマットであるデータフレームには2種類のフォーマットがあります。
(“標準フォーマット”と“拡張フォーマット”)

上記CANライブラリには “標準フォーマット” でのサンプルスケッチが用意されていますので、そのままAruduinoに書き込んで使用できます。
“拡張フォーマット” を使用する場合、少し変更が必要となります。

送信について、送信用関数の第1引数に拡張ID第2引数を "1" にすればOKです。
(全体のソースコードは上記ライブラリ内の /examples/send/send.ino を参照)

 CAN.sendMsgBuf( 0x123ABCDE, 1, 8, stmp );

受信については、特に変更は必要ないようです。
上記ライブラリ内の /examples/receive_check/receive_check.ino を少し修正してモニタ実験してみました。

#include <SPI.h>
#include "mcp_can.h"

unsigned char len;
unsigned char buf[8];

// Set CS to pin 10
MCP_CAN CAN(10);

//-------
void setup()
{
  Serial.begin(115200);

  // init can bus : baudrate=500k
  if(CAN_OK == CAN.begin(CAN_500KBPS))
  {
    Serial.println("CAN BUS Shield init ok!");
  }
  else
  {
    Serial.println("CAN BUS Shield init fail");
  }
}

//-------
void loop()
{
  // check if data coming
  if(CAN_MSGAVAIL == CAN.checkReceive())
  {
    // read data,  len: data length, buf: data buf
    CAN.readMsgBuf(&len, buf);

    // print the data
    Serial.print("ID:"); Serial.print(CAN.getCanId(), HEX);
    Serial.print(" LEN:"); Serial.print(len);
    Serial.print(" DATA:");
    for(int i = 0; i<len; i++)
    {
      Serial.print(buf[i], HEX); Serial.print(".");
    }
    Serial.println();
  }
}




送受信の確認を行うために 別のCANモニタツール・MA275(マイクロアプリケーションラボラトリー製)を利用しました。

Aruduino側から下記の送信スケッチを実行した場合です。


unsigned char stmp[8] = {1, 2, 3, 4, 0x0a, 0x0b, 0x0c, 0x0d};
void loop()
{
    CAN.sendMsgBuf(0x123ABCDE, 1, 8, stmp);
    delay(1000);         // send data per 1000ms
}


ArduinoでCAN-Busモニタ

Message information を見ると送信データとの一致が確認できます。



Aruduino側で受信スケッチを書き込んでシリアルモニタで表示させました。

ArduinoでCAN-Busモニタ

送信データは下記のTX1(拡張フォーマット)とTX2(標準フォーマット)ですが、上記の受信データと一致しています。

ArduinoでCAN-Busモニタ

なお拡張IDの値は「ID」タブの計算ツールで変換しています。(123->48C)

ArduinoでCAN-Busモニタ

トランジスタ技術 2011年8月号の 「点火タイミングや酸素濃度をチェック! CAN&K-line両対応! プリウス&フィット燃費チェッカの製作」 記事も参考になるかもしれません。
こちらはPIC、dsPICを使用して制作されています。

トランジスタ技術 2011年8月号



AliExpress から安価なCANモジュール(MCP2515 Bus CAN Module)を購入してみました。
US $11.70 / lot (5個の値段)
荷物は注文後1週間ほどで届きました。

(参考URL)
http://www.aliexpress.com/item/5pcs-lot-MCP2515-CAN-Bus-Module-TJA1050-receiver-SPI-For-51-MCU-ARM-controller-Free-shipping/32259606078.html

ArduinoでCAN-Busモニタ

動作実験してみました。
見ると発振子が8MHzになっています。(SeeedStudioは16MHz)

相互接続する場合は、16MHz側の速度を半分にすれば通信できますが
他の機器と接続する場合は通信速度の確認が必要です。

 CAN.begin(CAN_500KBPS)
   ↓
 CAN.begin(CAN_250KBPS)

2016年7月以降のライブラリでは、クロック周波数によるCAN通信速度の設定ができるようになっているようです。
(例) CAN0.begin(MCP_ANY, CAN_500KBPS, MCP_16MHZ)



Arduinoとの接続は回路図どおりに配線すればOKです。(写真の通り)

ArduinoでCAN-Busモニタ

ArduinoでCAN-Busモニタ

「Arduino Nano ATmega328P CH340G 5V 16M」として売られているボードとの接続方法は
ArduinoでCAN-Busモニタ
ArduinoでCAN-Busモニタ

動かして学ぶCAN通信 AVR,PIC,Arduinoを使ったCANコント (マイコン活用シリーズ) [ 中尾司 ]

価格:2,860円
(2020/6/11 21:11時点)
感想(1件)




10個 CANバスモジュール TJA1050レシーバ SPI Arduino対応

価格:2,770円
(2020/6/13 20:27時点)
感想(0件)








同じカテゴリー(マイコン開発)の記事
Fusion PCBでエレキー
Fusion PCBでエレキー(2020-04-01 19:00)


上の画像に書かれている文字を入力して下さい
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。

削除
ArduinoでCAN-Busモニタ
    コメント(0)