2015/04/15

CANで社外メーター的なもの(2)

CANの工作をしようとして、一番最初に困ったのがデバッグ環境でした。

普通にPICで何かを作る場合、何につなぐにせよ大概はその場でデバッグができるわけですが、CANのものを作る場合は実車に繋がないと動作確認もできません。CANアナライザ?みたいなものは明らかにお高くて、普通の人には贖うことはできませんし。

かといって実機でデバッグをしようにも、いちいち駐車場まで出かけて車を出すのも面倒ですし、夜中に謎の基板を持って駐車場をうろうろしていたりすると、危ない人になってしまいます。

というわけで、ちょっと悩んだ挙句に、以前にアマゾンで千円で仕入れたELM327を治具にしてデバッグをすればいいじゃないか、と思いつきました。

追加で必要な物はこの二又になったOBD2ケーブルです。これもアマゾンでポチ。




この先の片一方にELM327を、もう片一方に自作メーターを接続すれば、電気的にはお互いが繋がったことになります。

CANの仕様的にはバスの両端に終端抵抗(120Ω)が必要なはずです(参考:フィールドバスの色々(その2)CAN(その1))。
ELM327はスタブ・ノードになるので終端はされていない気がしますが、ケーブル長もそれほどではないからか、特に問題なく動きました。

こうやってつなげばELM327から縦横無尽にCANパケットが出せて、デバッグもらくらくかというと実はそうでもなくて…。ELM327はあくまでCANスキャンツールなので、パケットを出す(OBD2のリクエストを出す)のは比較的自由にできますが、受け取り側はちょっと厳しくなっています。つまり、送信と受信は完全に対象ではなくて、基本的には「出した要求パケット(OBD2パケット)の応答を受け取る」目的で作られていて、任意のパケットを受け取るのはちょっとやりにくい感じになっています。

マニュアルには、回線モニタ系コマンド(AT MR、AT MA、AT MTなど)の記載があって、一見これらを使うと自由自在にパケットを受け取れそうに見えますが、実際には、スヌープだけするモードになっていてACKビットを出さないようです(CANプロトコルでは、受信者がACKビットを立てることで通信が成立するとのことです)。それだと送信側は受信者がいなくて送信に失敗したと認識するようで、結局うまく行きませんでした。

そういうわけで、結局、ELM327を自作基板デバッガとして使うにはだましだましやることになります。

29ビットモードの場合は、

  • 18DB33F1(ECU)へのリクエストをELM327で受け付けるよう設定(ACKするよう設定)
    これをやれば自作基板からFITにデータを送信した時に、送信エラーになることなく送信が可能(なはず)。ただし、ELM327からは自動ではリプライは来ません。
  • 18DAF111宛の送信ができるように設定
    ターミナルから送信データを入力すると、自作基板側に送られます。
    自作基板側で正しくフィルタ設定をして受信しておけば、あたかもELM327から(車から)来たリプライのように見えます。

上を実現するには、以下の様なATコマンドを打てば良いことになります。

AT SP 7       (プロトコルを CAN 29bitに設定。11bitと行ったり来たりするときには必要です)
AT CP 18      (送信時のヘッダの29ビットIDの上位桁を設定します)
AT SH DAF111    (送信時のヘッダの29ビットIDの下位桁を設定します)
AT CF 18DB33F1  (フィルタを設定して、18DB33F1を受け付けるようにします)

FITのOBD2は29ビットなので、テストすべきシーケンスは

(1)自作基板→ELM327(実車)
   自作基板からソフトウェアでID=18DB33F1でリクエストを送信
(2)自作基板←ELM327(実車)
   ELM327から、手入力で応答データを含んだパケットを打鍵、送信。
   ID=18DAF111のパケットになり、自作基板はあたかもリクエストへの返信だと思って画面表示
   (タイムアウトとかは適宜調整しないと、うまくいきませんが)

ということになります。自動で応答できないのが寂しいですが、ひと通り、「温度XX度のデータを受け取った時に自作基板が正しく応答するか」といったテストをすることはできます。

さて、FITのCANバスには、OBD2以外にもデータが常時流れています。
こちらこちらに大変詳しい情報がありますが、それらのパケットはCANの11ビットで流れています。OBD2のようにリクエスト・レスポンスの組ではなく、常時車から垂れ流しなので、受信テストだけできれば充分ですが、その場合には

AT SP 6    (CAN11ビット指定)
AT SH 158   (ヘッダのIDを158に設定)

といったコマンドを投入することになります。

その状態でELM327側からパケットデータを入力すると、11ビットの0x158というCAN IDで送信されるので、自作基板側でそれを受理するようにフィルタ設定しておけば、各種パケットに対する自作基板の応答をテストをすることができます。

ちなみに、こちらによると0x158は車速を送信してくるCAN IDです。

0 件のコメント: