CANバスの物理層は差動通信で、RS485の様にマルチドロップ接続が可能。
自動車におけるノイズ環境でも通信が成立するように、トランシーバICには様々な対策が施されている。
一方で、基板にマイコンを複数載せて、例えばブロードキャストメッセージを含んだ通信をさせたいとなったとき、ハードウェアとしてデータリンク層にあたるコントローラが実装されていて、メッセージフィルタ等が可能なCANバスは魅力的だ。しかし、長くても1m未満の配線長で差動ドライバのバスを駆動するのは電力的なペナルティが大きい。
CANバスの構成 |
トランシーバーには5Vレベルと3.3Vレベルの製品があり、車載以外だと省電力化のために3.3Vバスを採用する例があるらしい。(電圧が低いほうがドミナント時の電流は下がるので)製品によってはフォールトトレラントのための様々な機能が付加されている。
トランシーバーをつかわず、UARTの様に単純に接続することもできる。過去にはこのようなアプリケーションノートがあった。
On-Board Communication via CAN without Transceiver
https://www.mikrocontroller.net/attachment/28831/siemens_AP2921.pdf
CANコントローラの入出力を1線式マルチドロップバスとしてつなぐことで、トランシーバーが無くても通信が可能になる。規格外の使い方ではあるけれど、大幅に単純、かつ省電力になる。
コントローラのみでの接続 |
R4 MinimaにはCANコントローラーが内蔵されているため、上記アプリケーションノートの様に接続してみた。ダイオード2個と数kΩのプルアップ抵抗だけでサンプルコードの通信ができた。https://docs.arduino.cc/tutorials/uno-r4-minima/can
とりあえず1Mbpsでも通信できていたけれど、Lowレベルの電位が下がり切っていないので、OD出力のバッファをTXに挟むとよいかもしれない。
https://github.com/sandeepmistry/arduino-CAN/blob/master/API.md
ライブラリの実装は以下で確認できる。
CANと呼ばずTWAIという名称のため気づきにくいけれど、CANコントローラ内蔵で安価なマイコンとしてはESP32がある。
二つだけではマルチドロップの利点があまりないので、複数繋いでテストしてみたい。
二つだけではマルチドロップの利点があまりないので、複数繋いでテストしてみたい。