メニュー
▼ アクセス(地図)
▼ Windowsアプリ開発 ▼ マイコン開発 ▼ CGI・PHP制作 |
▼ サイトマップ(全投稿記事)
▼ タイトル(画像一覧) ▼ 事業内容 |

お問い合わせメールフォームが開きます。
2016年01月10日
ArduinoでCAN-Busモニタ
Arduino+CAN-BUSシールド(Seeed Studio製)を使用してCAN通信モニタを作ってみました。
(Wikiサイト) http://wiki.seeedstudio.com/CAN-BUS_Shield_V2.0/
![]() | Seeedstudio CAN-BUSシールドV2、Arduino用 価格:3,260円 |

回路図

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
}

Message information を見ると送信データとの一致が確認できます。
Aruduino側で受信スケッチを書き込んでシリアルモニタで表示させました。

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

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

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

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

動作実験してみました。
見ると発振子が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 Nano ATmega328P CH340G 5V 16M」として売られているボードとの接続方法は


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

![]() | 10個 CANバスモジュール TJA1050レシーバ SPI Arduino対応 価格:2,770円 |
