◯ はじめに
前回(
https://minkara.carview.co.jp/userid/3661994/blog/48450663/)こんな話をしていた。
早速ちょっと手詰まり感でてきたのでアプローチを変えてみようと思い、ELM327のリバースエンジニアリングやSAE J1979 DAやISO 15765-2といった規格文書を読んでみて色々分かってきたので、メモを残しておく。
◯ ELM327

正攻法で地道にやるのも飽きてきたので、市販のELM327+Carscannerアプリを使って各値を表示させつつ、ELM327のピンから物理的にCAN信号を傍受して、ELM327と車載ECUとの間の通信がどうなっているかを把握することにしました。
実際に傍受できたリクエストとレスポンスをまとめて、代表的なデータを含めて記載したものがコチラ。
自分が欲しいデータについて、Descriptionの列に色を塗った。基本的にレスポンスを返してくれるのは18DAF101くんのようだ。
ここで、PID 0C, 0D, 5Bに関してはレスポンスが1フレームに収まっているが、9Aに関しては挙動が異なっている模様。でも知識的にこれ以上分からん。。。
◯ ISO 15765-2
こういうのは教科書を読みましょうということで、ISOを参照してみましょう。
分かったこと:
・レスポンスデータの1バイト目の上位ニブルがPCItypeというパラメータで、そのフレームの役割を示す
・PCItype=0:SF (Single Frame):1フレームで完結するレスポンス
・PCItype=1:FF (First Frame):複数フレームに跨るレスポンスの最初のフレーム
・PCItype=2:CF (Consecutive Frame):複数フレームに跨るレスポンスの続き
・レスポンスデータの1バイト目の下位ニブル(FFの場合は2バイト目も)がそのレスポンスのデータ長を示している。
・FFの場合はFF自身だけでなくCFに載るデータも含めたデータの全長が示される。

ということで、PID 0x9Aのレスポンスについては
・FF+CFの2フレームで構成される
・データの全長は8バイト
・表のデータ例だと、FFに07 00 41 BF、CFに00 06のペイロードが載っている
データの見方がわかったので、データの読み方を調べてみましょう。
◯ SAE J1979 DA
OBD法規に引用されているSAE J1979に、具体的なデータの詳細が書いてあります。それを元に読み解いた結果がこちら。

というわけで、CDEFのData Byteを読み取れば良いということが分かった。
なお、CDはFF、EFはCFのペイロードになっている。
◯ おわりに
とりあえず仕様は理解したので、これに合わせてArudinoくんに動いてもらうように躾けが必要ですね。
具体的には、受信したフレームがSF, FF, CFのどれなのかを判別し、FF, CFの場合は連続するそれらのペイロードを連結してデータを再構成する。
ただしこういった処理をする場合は今のようにメインのLoop関数の中で逐次処理するやり方ではおそらく不可能。CAN受信をタイマー割り込みに変えて、そっちで格納した変数をLoop側で処理するという構成になると思う。一発でそこまで行くのは厳しいので、とりあえず次回はCAN受信をタイマー割り込みにするところあたりから。。。
Posted at 2025/05/29 23:06:30 | |
トラックバック(0) | 日記