CANネットワークとのインタフェースは MCP2551 と MCP2515 を組み合わせて使います。
いろいろとWebで参考資料を見てみましたが、ソースが多重マクロを使っていたりして少々読みにくいというか追うのが面倒でした。
そこで、本記事のマイコンのファームウェアは極力簡単に読めるように書いてみました。
OBD2コネクタはコネクタ単品を買うよりも OBD2延長ケーブル の類をケーブル切断して使ったほうが安いです。
5個のLEDと抵抗は付けなくてもOKです。通信に合わせてチカチカ光ると面白いですが。
データ受信の検知は、受信ステータスレジスタのポーリング機能を使えばINTピンの結線は不要になります。この場合は純粋なSPIの4本を配線するだけなのでI/Oポートを削減できます。
ECUからのデータをPCに送信する最低限の機能であれば、8ピンマイコンでいけそうですね。
12Vから5Vへの降圧はDC/DCコンバータを使用しています。
ここでシリーズレギュレータを使うと発熱が激しくなるので気を付けてください。
ひとまずトヨタ系のエンジン回転数、速度、冷却水温度の3つを取得できるようにしました。
上記3項目はスイッチで切り替えできます。
受信検知は MCP2515 のINTピンを使用し、このピンがLowになるとメッセージが受信バッファに格納されたことが分かります。
ECUに対するデータのリクエストは200msec間隔で行っていますので、それほど受信検知の処理に張り付かなくてもよいかと思います。
車に接続せず、単体でデバッグするときはソース上の _LOOPBACK_DEBUG_ を有効にすると MCP2515 はループバックモードになります。
ループバックモードは送信したデータがそのままループバック受信され、あたかもECUから受信したように扱えます。これは家で受信ロジックをデバッグするときに重宝します。
ECUから受信したデータはPCのシリアルポートに送信します。
通信条件は38,400bpsです。
PIC16F688用のソースとHexファイル
I/Oポートの定義や初期化のあたりを変更すれば他のマイコン、あるいはCCS以外のコンパイラにも対応できると思います。
最新バージョン
canconv110.zip 8.3KBytes
旧バージョン
canconv100.zip 8.3KBytes
(2018/02/19)エンジンをかける際に電源の電圧が変動し、マイコンの動作が不安定になるのを防ぐためにブラウンアウトリセットを有効にしました。