CAN制御機器の製作(3) リレー・ノード(1)

まずは簡単なところからリレーを制御するCANノードを製作します。

●CAN制御プログラムの概略

CANコントローラを制御するために、専用ライブラリを用意しています。これを使えば、CANコントローラをあまり意識せずに通信ができます。まずは送受信の処理を簡単に説明しておきます。

まず、送信の際は、送信バッファ(変数領域)へメッセージを用意して送信要求を出します。これで、適当なタイミングで送信が行われます。送信が完了したかをチェックして送信処理は終わりです。

また、受信の際は受信を常に監視しておいて、受信があったらデータを受信バッファ(変数領域)から取り出しそれを処理します。

ここで使用するライブラリは”wCan2515.h”です。書籍「Arduino実験キットで楽ちんマイコン開発」で解説しているものですが、ソースファイルは無償配布しています。

●ライブラリ wCan2515のメンバ

おもなメンバ関数を挙げておきます。

  • wCan2515(byte sck, byte si, byte so, byte ss, byte rate) コンストラクタ(ポート番号設定)
  • init(byte rate) CAN コントローラの初期化(rate のデフォルト値 “CAN_125KBPS”)
  • setOpMode(byte mode) CAN コントローラの動作モードを設定
  • setMask(byte mask_num, word val) 受信ID マスクの設定
  • setMask(word val) 受信ID マスクの設定(mask0 専用)
  • setFilter(byte filter_num, word val) 受信ID フィルタの設定
  • setFilter(word val) 受信ID フィルタの設定(filter0 専用)
  • setFilterMode(byte buf_num, byte mode) フィルタ・モードの設定
  • setTxBuf(byte buf_num, word message, byte dat[8], byte dat_siz, byte dtfrm) 送信バッファにメッセージ、データを設定する
  • txReq(byte buf_num) 送信要求
  • word getRxBuf(byte buf_num, byte dat[14], byte &size, byte &dtfrm) 受信バッファからメッセージ、データを読み出す
  • byte checkTxComp(byte buf_num) 送信完了チェック
  • onReceive() CAN 受信ハンドラ登録
  • onTxCmp1(void) CAN 送信完了ハンドラ登録(送信バッファ0 用)
  • onTxCmp2(void) CAN 送信完了ハンドラ登録(送信バッファ1 用)
  • onTxCmp3(void) CAN 送信完了ハンドラ登録(送信バッファ2 用)

CANコントローラのMCP2515には送信バッファが3本、受信バッファが2本内蔵されていますが、ここではそれぞれ1個ずつ使います。

ライブラリの使い方はノードのプログラムの際に説明します。とりあえず、ここではリストだけ挙げておきます。

●リレーノード

コントローラにArduinoを使います。ここではCQカチャduinoのWSN282(AVR部)を使用します。CANコントローラにWSN292、リレーはArduinoのディジタル出力ポートで駆動できるものなら何でも良いのですが、ここではWSN352を使います。他のArduino(互換機含む)、リレー回路を使う場合は、ポート番号だけ合わせておいてください。

通信の動作確認がしたいだけなら、リレーの代わりにLEDをつなぐだけでも良いでしょう。

使用するディジタルポート

  • D2 WSN292-SCK
  • D3 WSN292-DI
  • D4 WSN292-DO
  • D5 WSN292-SS
  • D6 リレー(CH1)のON/OFF用出力ポート(WSN352など)
  • D7 リレー(CH2)のON/OFF用出力ポート
  • D8 リレー(CH3)のON/OFF用出力ポート
  • D9 リレー(CH4)のON/OFF用出力ポート
  • D10 リレー(CH5)のON/OFF用出力ポート

D7~D10はリレー増設用のポートです。リレーを接続すれば使えるようにリザーブにしておきます。

●リレー・ノードの動作

このノードは、ホストからコマンドを受けるだけの一方通行の動作です。受信したメッセージに従って対象リレーをONまたはOFFにします。

●ホスト・ノード

リレーなど各機器(ノード)へコマンドを送出したり、各機器の状態(温度など)を読み出すノードです。今回はリレー番号とON/OFFのコマンドを送出するだけです。

部品点数を減らすために、まずは、シリアルコマンド(Arduino IDEのSerial Monitorで送信可)で制御するようにします。ArduinoにCQカチャduinoを使用している場合は、USB回路が必要なため、作動中もWSN283(P2:USB/電源部)も必要です。リレーノードの方は、プログラムのダウンロードが済んだらWSN283は不要です。

コマンドの内容はリレー番号とリレーのON/OFFです。今回は次のようなコマンドにしました。

  • “r1″ リレー1 ON
  • “r2″ リレー2 ON
  • “r3″ リレー3 ON
  • “r4″ リレー4 ON
  • “r5″ リレー5 ON
  • “n1″ リレー1 OFF
  • “n2″ リレー2 OFF
  • “n3″ リレー3 OFF
  • “n4″ リレー4 OFF
  • “n5″ リレー5 OFF

Arduino-IDEのSerial Monitorの送信欄に”r1″と入して[送信]をクリックするとリレー1がONします。同様に”n3″ [送信]でリレー3がOFFします。

全体の接続図を示します。なお、今回は2つのWSN292が終端になるため、両基板のターミネータを有効に設定しておきます。

p282_283_292_352

ノードを増やす場合は、この終端と終端の間のバス線(CAN-H、CAN-L)から支線を並列に引き出して、そこにノードをぶら下げます。終端抵抗は必ず、バスの両終端にないといけません。

●CANメッセージ(コマンド)の定義

CANノード間で使用するメッセージを定義します。今回のメッセージはホスト・ノードからすると送信、リレー・ノードからすると受信ということになります。

コマンドのフォーマットは前回決めたとおり、”xxx xccc cccc“です。また、リレーノードの識別番号は”1″と定義しているので、”xxxx” = “0001″となります。

あとはリレー番号とON/OFFの区別です。 ccc ccccの最下位ビットをON=”1″ / OFF=”0″とします。上位3ビットにリレーの番号を入れることにします。未使用ビットは”0″にします。

そうすると、ccc ccccの部分は

リレー1の場合、 ON = “001 0001″、OFF=”001 0000″

同様にリレー2では、 ON = “010 0001″、OFF=”010 0000″ 同様となります。

一般形はノード識別番号を”n”、リレー番号を”m”、ON=”1″ / OFF=”0″ を”f”とすると

メッセージID = n<<7 + m<<4 + f

となります。そのままコーディングで使えるように展開してリテラル(定数)にしておきます。ついでに関数を作っておきます。”makeMsg()”はノード番号、リレー番号、ON/OFF(“1″/”0″)からメッセージを動的に作る関数です。値の範囲チェックはしていないため、範囲外の値を入れると破綻しますので注意してください。

// CANメッセージ リレー操作
#define cmRELAY1_OFF 0x090   // &quot;000 1001 0000&quot;
#define cmRELAY1_ON  0x091   // &quot;000 1001 0001&quot;
#define cmRELAY2_OFF 0x0A0   // &quot;000 1010 0000&quot;
#define cmRELAY2_ON  0x0A1   // &quot;000 1010 0001&quot;
#define cmRELAY3_OFF 0x0B0   // &quot;000 1011 0000&quot;
#define cmRELAY3_ON  0x0B1   // &quot;000 1011 0001&quot;
#define cmRELAY4_OFF 0x0C0   // &quot;000 1100 0000&quot;
#define cmRELAY4_ON  0x0C1   // &quot;000 1100 0001&quot;
#define cmRELAY5_OFF 0x0D0   // &quot;000 1101 0000&quot;
#define cmRELAY5_ON  0x0D1   // &quot;000 1101 0001&quot;
#define cmRELAY6_OFF 0x0E0   // &quot;000 1110 0000&quot;
#define cmRELAY6_ON  0x0E1   // &quot;000 1110 0001&quot;

// 動的にメッセージを作る関数(範囲オーバしないよう注意)
int makeMsg(int node, byte rynum, byte on_off) {
  return node&lt;&lt;7 + rynum &lt;&lt;4 + on_off;
}

次回よりCANライブラリの使い方と実際のプログラムを説明します。


CANについては下記書籍で説明していますのでよろしければ、ご覧ください。
書籍「動かして学ぶCAN通信」 → 書籍紹介ページ

ArduinoのCAN関係の記事は下記書籍でも扱っています(WSN292など使用)。CANなどの専用ライブラリに付いても解説しています。
書籍「Arduino実験キットで楽ちんマイコン開発」 → 書籍紹介ページ

図やテキストの無断転写はお断りします。

コメントは受け付けていません。