MCP2515モジュールでCAN通信の実験1(Arduino)

〔マイコンのトップに戻る〕

CAN通信の基礎概要
PIC18F26K80のECANレジスタ内容
MCC操作でECAN 2.0Bプログラムを生成する
PICとPICでECAN通信の実験
MCP2515モジュールでCAN通信の実験2(PIC)

このページではMCP2515モジュール+ArduinoUNOの組み合わせをノード3として、
前ページの"PICとPICでECAN通信の実験"回路に配線し動作させて見ます。

MCP2515モジュールこれがMCP2515モジュールで、
MCP2515CANコント ローラTJA1050トランシーバ
搭載したCANインターフェイスモジュールで、
すごくお値段が安いです。
"MCP2515モジュール"とネットで検索すれば
いっぱい出てきます、これをArduinoとSPI通信で接続する
だけで簡単に扱えます。
又、MCP2515のクロックは8MHzとなっていて、
操作電源は5.0Vです。

モジュールの回路図
このモジュールの回路図です、尚、MCP2515日本語データシートはこちらです。

《配線図》

MCP2515モジュールとArduino配線図左図がArduinoUNOとのノード3配線図です。
電源は5.0Vです。
前ページの"PICとPICでECAN通信の実験"回路に
組み込みます。

SPIのCSピンはD10ピンと接続します。
INTピンはD2ピンと接続して割り込み入力とします。

J1ジャンパーピン
このピンを短絡させるとCANバスの終端抵抗120Ωが
施されます。
今回はPIC側で終端抵抗(102Ω)が取り付けて有るので
このピンはオープンのままです。



《MCP2515を動作させるライブラリについて》

MCP2515モジュールを動作させるライブラリとして、GitHubの"CAN_BUS_Shield-master"を使います。
これは、スイッチサイエンスで販売の”SeeedStudio CAN-BUSシールド V2”用の物ですが、
MCP2515を搭載しているので利用出来ます。
下記からダウンロード出来るファイルは、GitHubからダウンロードしたファイル(mcp_can.cpp)に
日本語でコメントを追記したファイルです。

↓ここからArduino用サンプルスケッチファイルをダウンロードして下さい。
[CAN_BUS_Shield-master.zip]
ライブラリの登録方法は、ここのペー ジの登録方法1を参照してインストールしましょう。

ここの実験で使用する実例サンプルスケッチは以下です。
[CAN_BUS_Shield-master]-[examples]-[CANrecv]-CANrecv.ino
 他ノードから半固定抵抗の値(ID:0x123)を受信してシリアルモニターに表示させるサンプル
[CAN_BUS_Shield-master]-[examples]-[CANremote]-CANremote.ino
 他ノードから半固定抵抗値(0x123)と温度値(0x124)を受信してシリアルモニターに表示さて、
 5秒毎にリモートフレーム(0x123)を発行します。

又、"mcp_can_dfs.h"内の記述に、
#define DEBUG_EN        1
が有るのでシリアルモニタにデバッグ文が表示されます、必要無ければコメント又は、
0に設定にしましょう。

《実験1》

@ ノード1とノード2にノード3の接続は終了していますね。

A ノード1とノード2のPICプログラムは前ページの"リモートフレーム"実験の物を利用します。

B ノード3(Arduino)には”CANrecv.ino”スケッチを書き込みましょう。

C Arduino IDE のシリアルモニタを起動して、ノード1のスイッチを押しましょう。

D ノード1のスイッチONで"リモートフレーム(ID:0x123)"を発行します、
  それを受けたノード2が半固定抵抗値の"データフレーム(ID:0x123)"を発行します。
  でぇ、識別子ID:0x123を受信したノード3がシリアルモニタに表示します。

実験1の結果
ノード1発行のリモートフレームも受信していますね。
ノード1接続のLCDも同じ値を表示していますね。

《実験2》

@ ノード2は、プログラムはそのままで使います。

ノード1に温度センサーを取り付けますA ノード1の回路からスイッチを取外し、温度センサーを取付けます。
  温度センサーはLM61CIZを使用しました。
  このセンサーの使い方はこちらを参照下さい。

B ノード1のプログラムは、"node1TEMP.c"をコンパイルして
  書き込んで下さい。
  ソースは↓からダウンロードしましょう。
  [node1TEMP.zip]

C ノード3(Arduino)には”CANremote.ino”スケッチを書き込みましょう。

D Arduino IDE のシリアルモニタを起動し、PIC側回路電源を入れましょう。

E 起動され約3秒後に、ノード1から1秒毎に温度センサー値(ID:0x124)が送信されるので、
  ノード3はそれを受信しシリアルモニタに表示します。
  ノード3は、約5秒毎に"リモートフレーム(ID:0x123)"を発行します、
  ノード2はリモートフレームを受信したら半固定抵抗値(ID:0x123)を送信するので、
  ノード3はそれを受信しシリアルモニタに表示します。

実験2の結果
ノード1接続のLCDにも温度値を表示しています。
半固定抵抗値(ID:0x123)の表示はLCDに行っていません。
"リモートフレーム"が正常に送信されれば”Send message Successful”と表示されます。
尚、PIC側の電源が入っていない時に"リモートフレーム"を発行した場合は、
”Message transmission timeout”が表示されます。


MCP2515 Baud Rate Tool

こちらの"seeedstudio"ページの最後の方に有る"MCP2515 Baud Rate Tool"のリンクから
ダウンロード出来るツールで、MCP2515の使用クロックとCANバス通信速度を入力するだけで、
MCP2515のビットタイミング設定レジスタ(CNF1/CNF2/CNF3)の設定値を計算してくれる便利かもな?
物を紹介して置きます。
ただぁ、中華系のツールらしくフォントが無いので崩れますがぁ....

MCP2515 Baud Rate Tool
@ "MCP2515"にチェックをいれます。
A CANバス通信速度を入力します。
B クロック(8/16/20MHz)を選択します。
C 計算ボタンをクリックします。
5行目でのビットタイミングは、NBT(Nominal Bit Time)=20TQ
[Sync Seg:1TQ] [PS(Propagation Seg):5TQ] [PS1(Phase Seg1):7TQ] [PS2(Phase Seg2):7TQ]
サンプルポイントはPS1とPS2の間で65.0%になります。
(尚、Sync Segは1TQ固定なので上の一覧には表示されていない)

"mcp_can_dfs.h"ファイルの設定では
#define MCP_8MHz_100kBPS_CFG1 (0x01)
#define MCP_8MHz_100kBPS_CFG2 (0xb4)
#define MCP_8MHz_100kBPS_CFG3 (0x06)
とツールの5行目の設定が選ばれていますがぁ、サンプルポイントは65%なのでぇ、
80%辺りを設定したいなぁと思った場合は15行目辺りをセットすればぁ良さげぇかもね。


《その他》

実験風景
実験2時の回路写真です。
左上のPICがノード2、
右下のPICがノード1その上がArduinoUNOでノード3です。
CANバス通信速度は100Kbps

"CAN_BUS_Shield-master"だがぁ、メッセージデータを受信したらCANINTF.RXnIFビットがセットされ
割り込みが発生するが、メッセージデータを受信後RXnIFビットをクリアしているプログラムの記述が
見当たらない、良いのだろうか?動作はしている様だがぁ...
データシートには"割り込みが発生するとINTピンがMCP2515によりLOWにドライブされMCUにより
割り込みがクリアされるまで保持します。"と書いて有るのだがぁ....




リンクの見直し(*1) 2020/03/19


【きむ茶工房ガレージハウス】
Copyright (C) 2006-2020 Shigehiro Kimura All Rights Reserved.