Division By Zero

ゼロで割る

CANバスについて調べてみた

ある車載装置のロガーを作りたいという要望があって、インタフェースはCAN(Control Area Network)だということで少し調べてみた際のまとめ。

CANバスというのは車載装置でよく使われているバスの仕様の一つである。業界標準らしいが、すべての車で利用されている、というわけではない。また、一つの車でバスが一つというわけではなく、たとえば、エンジンやABSなどで一つ、ドアやシートなどで一つ、窓やミラーなどで一つ(あるいは右、左で二つ)、オーディオで一つ、などのように、複数のネットワークがあり、それらはゲートウェイでつながっていたり、いなかったりする。また、これらがすべてCANバスで統一されているわけでもない。

電気的には差動式でノイズに強い。CSMA/CA方式を採っていて、EthernetCSMA/CDと異なり、衝突した場合には優先される側があらかじめ決まっている。

MCP2515 CANコントローラーとMCP2551 CANトランシーバーを使えば、CANバスとの通信はできそうだ。PICかAVRなどのマイコンと組み合わせて工作している事例もWebを探せば見つかる。

もっとも、よく見るのはODB2ポートへの接続例。これは自動車メーカーが故障診断のためのプローブを接続するポートで、CANバスに限らず、先述のいろいろなバスにアクセスできる。ただ、アクセスの方法や、流れるCANメッセージの仕様が公開されているわけではなく、みんな自前で解析して使っているようだ。

前述のように、一台の車に複数のバスがある。ODB2ポートがつながっているバス上のコントローラーに「エンジンの情報を教えて」というリクエストをCANプロトコルで送ると、コントローラーがゲートウェイの先のバスにつながった装置から情報を取得して流してくれる。したがって、コントローラーに対するリクエストメッセージの作り方とレスポンスメッセージの読み方がわからないことには何ともならない。それでも、みんな自分の車にアクセスしたくて頑張っているようだ。

今回対象となる予定の車載装置のCANメッセージの仕様は明らかだし、流れてくるメッセージを(必要なら)フィルタリングしてロギングするだけ。ODB2の作例そのままというわけにはいかないが、大差ない。多分、簡単に作れるんじゃないかな、と思えたところで、今日は終了!