CAN制御機器の製作(1)

この連載ではCAN通信を利用してリモートで何かを動かします。
Arduino(CQカチャ;WSN282)にWSN292やWSN220などのCANモジュールをつないで複数のCANノードを作り、リモートでリレーを操作したり、温度などを測定しようと考えています。
CANは一種のネットワークですので、複数のデバイスをいろいろぶら下げてみたいと思います。

●CANとは

ごく簡単に説明します。CANというのは、もともとは自動車に搭載されているネットワークのことで、聞いたことがある人も多いと思います。

CANは2本の通信線で通信します。ノードと呼ばれるCANデバイスをバスに複数ぶらさげることができます。一般型の図を次に示します。

can-node

各ノードにはマスタ、スレーブという関係はありません。通常は中心にマスタ的なものをおいて、そこからコマンドを出したり、データを要求するようなつくりにすることが多いと思いますが、各ノードが勝手に(何等かのイベントが発生したタイミングで)通信を始めることができます。したがって、マスタ的なものはポーリングしなくてもイベントを検知するこができます。

ビットレートは決まっていませんが、ロースピードCANでは125Kbpsというのが標準のようです。

近距離用のネットワークですが、数百メートルといった中距離でも使用できます。実際、筆者は、遊園地の仕掛け制御でバスの全長が2~300mのものを動かしたことがあります(現在も2施設で稼働中)。ノードは40個ぐらいつながっています。
ビットレートは125Kbpsでした。信号線のインピーダンスを下げるなどすれば、500mぐらいはいけるようです。

データ長は可変ですが、最大8バイトと、大きなデータを転送するのいには向いていません。したがってコマンドや簡単なデータのやり取りしかできません。

自動車の中では、ワイパーやパワーウインドなどの機器の制御にはロースピードCAN、エンジンやブレーキなどの制御系ではハイスピードCANが搭載されているものがあるそうです。その場合、それぞれの機器がCANノードということになります。

●CAN信号

CANは電源をのぞき、2本の信号線(CAN-H, CAN-L)をつなぐだけで通信できます。2本は平衡(ディファレンシャル)信号で、ノイズの影響を受けにくくなっています。バスの電圧は、規格上は2.5Vを基準に±1Vと5V回路で作動させるのにも好都合です。

CANコントローラIC、CANトランシーバICは安価に入手できるため、ノードを安価に製作することができます。なお、機器間で通常、GNDは接続する必要はありません。2本の信号線の電圧差で信号を伝達します(自動車の内部のようにノードの電源を共用すれば、結果的にGNDは接続されます)。

電位差のある状態をドミナント、ない状態をレセッシブと言いますが、とりあえずはあまり気にしなくてよいでしょう。波形の模式図を次に示します。

can-wave

●フレーム

データはフレームという単位でやり取りされます。データ・フレーム、リモート・フレーム、エラー・フレーム、オーバ・ロード・フレームの4つがあります。よく使うのがデータ・フレームです。

データ・フレームのフォーマットを次に示します。

can-frm

フレームには11ビット(標準IDの場合)の識別用のフィールドがあり、これで通信内容を識別します。このフィールド部分をメッセージID(アービトレーション・フィールド)といいます。それ以外に制御用ビットやDLC(データ長)ビットなどが続き、さらにデータ本体が最大8バイト、CRCと続きます。これらをひっくるめてメッセージと呼ぶことがありあます。データ長が0バイトという場合もあります。

フレームにはCRCなどが含まれていて結構複雑ですが、CANコントローラがすべて処理してくれるので心配はありません。実際の波形ではビットスタッフなどが含まれる場合がありますが、そのあたりもアプリレベルでは意識する必要はありません。

エラーフレームは文字通り、エラー発生時に送出されるフレーム、リモート・フレームは、相手方にデータ・フレームを要求するための、データ長0のフレームです。

どういうメッセージをやり取りするかは機器間の取り決めにもよるのですが、データ・フレームをリモート・フレーム代わりに使えばデータ・フレームだけでも通信できます。

●メッセージIDと優先順位

I2Cなどと違い、CANではデバイスを特定するアドレスのようなものはありません。したがって、メッセージは相手方がどう受け取るかで意味を持ってきます(自分に関係のないメッセージは読み捨てる)。

また、メッセージIDを数値として見たときに数値の小さい方がメッセージの優先順位が高くなります。ただし、これは、複数のノードが全く同時に違うメッセージをCANバスへ送出したときの話で、基本的には早いもの勝ちです。あとから遅れて送出しようとしたノードは、先に送出されたメッセージが送出を終わるのを待ってから送出を始めるように作動します。

優先順位の判定はアービトレーション「調停」といいます。仕組みは値の小さいものが大きいものを上書きして小さいものが残るという単純なものです(電気回路のワイヤードANDの原理による)。通常、専用コントローラを使うため、あまり意識する必要はありません(CANコントローラが自動でやってくれる)。

●使用機材について

当連載では筆者が製造、販売している基板を利用していますが、他社製Arduino(互換機)やディスクリートパーツを自分で集めて製作することもできます。回路図は公開していますので、自分でつくる場合はそれを参考にしてください。なお、CANコントローラにMCP2515、トランシーバにMCP2551を使用しています。いずれもDIPタイプが販売されてるため、ブレッドボードでも製作可能です。また、筆者作成のArduino用の専用ライブラリも用意していますので、簡単に制御できます。

回路図は製品ページよりダウンロードできます。


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

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

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

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