まずは簡単なところからリレーを制御する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が終端になるため、両基板のターミネータを有効に設定しておきます。
ノードを増やす場合は、この終端と終端の間のバス線(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 // "000 1001 0000" #define cmRELAY1_ON 0x091 // "000 1001 0001" #define cmRELAY2_OFF 0x0A0 // "000 1010 0000" #define cmRELAY2_ON 0x0A1 // "000 1010 0001" #define cmRELAY3_OFF 0x0B0 // "000 1011 0000" #define cmRELAY3_ON 0x0B1 // "000 1011 0001" #define cmRELAY4_OFF 0x0C0 // "000 1100 0000" #define cmRELAY4_ON 0x0C1 // "000 1100 0001" #define cmRELAY5_OFF 0x0D0 // "000 1101 0000" #define cmRELAY5_ON 0x0D1 // "000 1101 0001" #define cmRELAY6_OFF 0x0E0 // "000 1110 0000" #define cmRELAY6_ON 0x0E1 // "000 1110 0001" // 動的にメッセージを作る関数(範囲オーバしないよう注意) int makeMsg(int node, byte rynum, byte on_off) { return node<<7 + rynum <<4 + on_off; }
次回よりCANライブラリの使い方と実際のプログラムを説明します。
CANについては下記書籍で説明していますのでよろしければ、ご覧ください。
書籍「動かして学ぶCAN通信」 → 書籍紹介ページ
ArduinoのCAN関係の記事は下記書籍でも扱っています(WSN292など使用)。CANなどの専用ライブラリに付いても解説しています。
書籍「Arduino実験キットで楽ちんマイコン開発」 → 書籍紹介ページ
図やテキストの無断転写はお断りします。