屋根裏部屋SE > 日産デュアリス > デジタルタコメーターの自作 > ECUのハックその2

<トップページに戻る>



日産デュアリス 作業メモ
車内LAN解析 & 外部メータ作成

デュアリスのECUをハック − その2
[2008/05/03〜2013/03/21 K2000]


CANプロトコルコンバータを1Mb/sに対応させる手段の模索

CANの信号はELM327の手前までは明らかに来ています。 でもELM327が認識しない。
そもそもの話、1Mb/s以下である可能性もあります。

ということで、ELM327に代わる方法を考えてみます。
おおざっぱに思いつくのは以下の三点。

1.ELM327に代わる石を探す。
2.CAN対応のPIC18系やdsPICを使う。
3.1Mb/sに対応した製品(CAN232等)を買う。


私的に3の既製品を買う線はパスです。今回の失敗に加えて新たな回路作りにかかる出費を加算しても既製品を買う方がはるかに割高(自作の場合は費用の大半が汎用開発ツールだし改造の自由も利く)。それに1Mb/sの線もハズレだったら今度こそ洒落になりません。なにより、ここまで来たら意地です。

となると次は1ですが、これがなかなか良いのが見つかりません。そもそもOBDに特化したプロトコルコンバータの個人販売なんて一部の製品を除いてマニア向け以外の何者でもないので需要なんてあって無いようなものです。要するに手頃な石が見つけられなかっただけですが・・・てことで1もパスです。

残るのは2のCANを搭載したPIC――私が最初、真っ先に敬遠した方法です。
理由は、手持ちのPICライタ(秋月版)が全くアップグレードされなくなってしまったため目的のPICに書き込めないことと(※現在はバージョンアップして更新されています^^)、CANに関して無知過ぎたことの2点。でもCANの知識はEML327のお陰で相当付きました。目的のPICに書き込む手段も(今後のためにも)PICライタを買い換えれば済む話です。この線で行きましょう。

そうなるとPICライタはどれを選ぶかですが、安価で主要なところとしてはマルツパーツのMPIC06-KIT、そして本家MICROCHIP社製のPICkit2。手軽さで言えばMPIC06に軍配は上がりますが、対応PICの数や信頼性、今後のことを考えたらPICkit2を選ぶべきでしょう。送料は$15(USD)で少々高いのですが、日本では入手しにくいPICやICが安く買えるので、それらと一緒に買えば割安です。

ということでPICkit2に決定。ついでにMCP2551の買い増しと大容量EEPROMチップ、そして日本ではあまり種類が売られていないCAN対応PICを同時注文。

注文してわずか3日で石だけ到着。早(笑)
更に2日違いでPICkit2も到着。

早速入手したPIC18F2480にテスト書込み。USB供給電源なので別途電源を用意する必要がないのが便利です。ICSP接続が基本コンセプトなので後々その辺のことを考えないといけませんけど、さすが純正品といったところでしょうか。PICを接続するだけで種類を認識するし、書き込みも安定しています。書込み速度もベラボウに速い。秋月PIC散々使ってきましたけど、もう戻ることは無いでしょう(^^;



下準備
PIC外してライタで焼いてという作業に慣れてしまっているせいか、ICSP接続が便利なのは判りますが落ち着かないのでZIFソケット(ゼロプレッシャーソケット)版を作りました。

表向きはすっきりしてますけど裏は悲惨です。真面目に配線してたら死ねるのでポリウレタン銅線でザクザク繋げています。8/18/28/40pinのPICに対応。抵抗はZIFソケットの下。PICkit2を直刺しで使ってますけど後に手が空いたらケーブルを作る予定。



次にPIC開発に使う言語ですが、さすがに今回はアセンブラなんか使ってられないのでCコンパイラを使います。ちなみに私が使っているのはmikroC。

初めて触ったPIC-Cがコレで、すっかり慣れてしまったというのもありますが、第一候補として挙げていたMPLAB-C18のCANライブラリがワケわかんねー状態でmikroC最高と思ってしまっただけです。

問題は試用版の容量制限。16F系は2KB制限ですが18F系はどうやら4KBに上がってるようでテスト的なプログラムなら問題なく組めるのですが、これが制御系まで入れようとすると全然足りない(つまり容量の大半がライブラリで消費されている)――PIC開発はいつもはアセンブラか、もしくはmikroCを使うことがあっても2KBを超えるプログラムなんてそうそう書かないので正直購入を迷っているところ。さてどうしたものか・・・。

次はUSBモジュール経由でPIC-PC接続をするため転送可能なボーレートをチェック。PIC16F628の内蔵オシレータ(4MHz)で接続した時は 19,200bps が限界でした。そこで、PIC18F2480にHS10MHzを接続してPLL-ON、内部的に40MHz駆動させてどこまで安定した通信ができるかをチェックしてみました。というか面倒であまり詳しくは調べていないのですが、少なくとも 256Kbps は全く問題なし。今回の用途としては十分すぎる速さです。



ブレッドボードでテスト
前回はいきなり基板を作って、あげくの果てには失敗に終わったので、今回はしっかりブレッドボードでテスト。とはいえ前回よりも更に簡単な回路です。

まずはPIC側の接続設定を決めるためVC++で検知プログラムを書いて走らせます。ELM327の時に作った検査プログラムの流用。こんなの手でコツコツやってたらボケます。そして接続すること0秒。

キッキタ━━━(゜∀゜)━━━!!!!
いきなりビンゴ!3週間ELM327と睨めっこしてウンもスンとも言わなかったコンソールがゲロのように大量のスパゲティを吐き出しています。

でも受信データが少し妙な気が・・・実際、車を走らせてロギングしても流れているCANデータはほとんど変化しない。というか複数のIDで半端じゃない量のデータを吐き出してるのに内容が全て同じ。

原因はすぐに判明。
今回は作業が完全に手探りなので、とりあえず全メッセージを受信していた為。つまり通信レートが一致せず破損したデータだろうが何だろうが無視して受信しろって命令していたのですな。

というか・・・そうなると、やはり1Mb/sになるよう計算で求めた設定が合っていないということになる。つまりCONSULT-IIIは1Mb/sじゃないということ?

つことで、今度はオプション設定を加え、更に通信レートを動的に手動で行えるように修正して実行。すると今度は全く受信しなくなりました。そこで適当にレートを変更していくと・・・
キキキキキキキタ━━━( ゜∀゜)━━━!!!!

今度こそ間違いなく意味のありそうなデータがゾクゾクと流れ込んで来ました(画像2枚目)。ログを解析してみるとキーオンで複数のIDからシーケンスらしき動作をしているデータが見つかり、たぶんコレで間違いないかと。ある特定の通信設定以外では全く受信しないので、もしかしたらコレがデュアリスの(というかCONSULT-IIIの?)ベスト設定なのかもしれず。

結論として、CONSULT-IIIは1Mb/sではありませんでした。
もっと言ってしまえば500kb/s以下。



データ解析

恐ろしく膨大な数字の羅列ばかり見ていても埒があかないので、流れてくるデータを視覚的に掴めるよう簡単なCANモニターを作成しました。 Win2000とVC++。

さすがに走りながら見ることはできないので、受信内容を表示すると共にファイルに記録するデータロガーとして作成。もちろんログの再生機能付き。

おかげでかなり絞り込むことができました。
そこで、抽出したデータを更に分類するためのモニターを追加(画像2枚目)。この時点で速度や回転数、アクセル踏量、燃料、温度、ブレーキ、サイドブレーキ、シフトポジションなど、主要な情報をあらかた見つけることができました。

ちなみに、どの情報も表示用と内部データは1:1ではないので(特に速度や回転数)、何度か走行試験を繰り返しながら割合を求めました。

解析には多少時間を掛けましたが(正直ものすごく時間の掛かる作業だと予想していた)、解析アプリのおかげで割と早く終わりました。



表示系開発(LEDメータ)
実現性が一気に高まったところで、制御系開発は一時休止――次はナイト2000のギラギラコンソールを実現するためのLED制御モジュールを作成します。

PIC16F628で多連LEDアレイの制御と7seg制御をさせます。


とりあえず作ったのが写真の表示器。上の長いアレイが回転数。中断アレイはCVT比、下段アレイは燃費。左3桁7セグは速度、右の7セグはシフトポジション――こんな大量のダイナミック表示器をユニバーサル基板で真面目に配線してたら死んでしまうのでZIFソケット版PICライタ同様、0.26mmのポリウレタン銅線でザクザク配線しています。思ったより綺麗にできたので、表側から見たら配線が全く見えません。
そして、最も肝心なCAN信号の解析と表示制御をする基板を作成します。

使用するPICは18F2480。

正直、CAN制御系PICのプログラムは大したことありません。CAN-PC間は既に繋がっているしデータ解析も済んでいます。あとは解析した通りの内容でCAN信号を表示信号に変換して出力するだけです。

この表示器に表示制御基板を付けるのですが、ワッパを大きくしたくないので基板2枚重ねで作ります。二つの基板を繋ぐのは50pinのエッジコネクタ。表示内容については、あらかた表示制御PICにやらせてCAN制御PICは取得したデータを一方的に表示制御PICに垂れ流すだけの構造にします。

同じ要領でCAN制御基板も繋げたら回路完成。CAN制御基板には前章で作った電源用DC-DCコンバータも付いています。というか制御系に必要なパーツはMCP2551とPICだけなのでコンバータ基板にCAN制御回路を組んでしまいました。

最後に基板をカットして完成。
高さ50mm、横幅150mm、厚さ25mm。

<動画 wmv>
点灯テスト : 起動
点灯テスト : 制御系-表示系間通信テスト



ケース作成
所詮は素人工作なので基板剥き出しでも構わないのですが、このままだとLEDが非常に見辛い。昼間は消灯セルも白くてよく見えないし、夜間は眩しい。

そこで使うのが自動車用のスモークフィルム。
十数年前にCR-Xに貼るつもりで購入したスモークフィルムがあったのですが、透過度2%というアホすぎる暗さで夜間でも暗くなってしまう・・・ということで13%のフィルムを新たに購入。これはLEDに直接貼り付けないで、これから作成するケースの内側に貼ることにしました。

てことで作成したのが写真のケース。毎度お馴染み切断したアクリル板の組み合わせです。塗装も含めて所要時間4時間。塗装には速乾性のマットスプレー黒とクリアを使用。ただ、いくら速乾性とはいえ自然乾燥では1回に4、50分はかかるので、ホコリの付着に注意しながら扇風機を使用。

どうでしょう。生基板では8か0かよくわかりませんが、スモークを通しているのではっきり0とわかります。それに透過度13%なので、あまり暗くならずに視認性だけが上がりました。

回転数表示のLEDアレイは、10個毎にメモリを付加。LED1コ=100回転になります。デュアリスはレッドゾーンが6000回転程度だし、今まで乗ってきた感じでも4000回転を超えることは殆どないので、MAXで4800回転まで表示させるようにします。

1個だけブルーLEDを使っているシフトポジション表示は、P=P、R=A、N=−、D=0、1〜6=1〜6と表示。速度表示はゼロサプレスのBCD。CVTギア比はパーセンテージ。燃費はどれだけ燃料を噴射しているかをバーグラフ表示。エンブレ使用中は燃料がカットされるので燃費表示が消えます。

CANバスに勝手に流れているデータを拾い読みしているだけなので、CANバスの負荷はゼロ。おまけに速度やタコ表示はパルス計算ではないので表示更新もダイレクトで速いです。
ということで、自作デジタルタコメータの完成です。

<動画 wmv>
起動テスト : 夜間、イグニッションのみ。
表示テスト : パーキング状態でアクセル。
走行テスト : ゼロ発進から3000回転まで踏んだ状態(荒れ地なのでロードノイズ酷い)。
走行テスト : 停止状態でシフトをドライブ→マニュアル→ドライブ、低速発進。



ケース作成 その2 (2010/07/31追記)

まる2年以上、最初に作ったケースで頑張ってきましたが、せっかく作った実用性の高いデジタルタコメータ。 ケースにも少しこだわりを入れたくなってきました。

ということで、本日(2010/07/31)公開した 「アクリル曲げ加工用ヒーターの自作」 というコーナーで作成した同ヒーターを使って、本格的なケースを作ってみました。

ちなみに、この筐体を作るために1日だけデュアリスからこのデジタルタコメータを外したのですが、走行中、不安で不安で仕方ありませんでした。 デュアリスのオリジナルメーターを見る癖がすっかり無くなっていたので、今何キロで走ってるのか、どのくらいの燃料を噴出してるのか・・・気になって大変でした。 もはや必需品です。


今回使用したのは、アクリサンデー社製の硬質アクリル板、アクリサンデーEXガラス色透明3mm厚という、ガラスよりも耐久性に優れたアクリル板です。

本当は2mm厚が欲しかったのですが、たまたま見ていたホームセンターに2mm厚が無かったので仕方なく3mm厚を選択。

製作記の詳細は制作解説をしているページをご覧頂くとして、若干の設計ミスはあったものの無事完成。


今だから書けますが、これまで使っていたケースは実のところ騒音の温床になっていました。 あり合わせのパーツを使って切り張りで作ったケースなので剛性に難があったんですな。 土台なんか押し寿司を押さえつける「竹の板」を加工したものでしたし、走行中「ピキピキ」とか「コツコツ」とか異音を発しては、ノイズ対策に追われたものです。

今回は無駄なく、回路がきっちり収まるように作ったので異音も全くなし(曲げ加工したアクリル板自体が回路を押さえつけるバネの役目をしている)。 見栄えも悪くないし、ようやく完璧なものができました。

<動画 wmv>
エンジン始動、シフトチェンジ、エンジン停止
エンジン始動、その2




CANバス解析システムのBluetooth無線化&Android化 (2013/03/20追記)

Androidアプリ開発とBluetooth無線の勉強がてら、車両のCANバス信号をBluetoothで飛ばしてAndroidでリアルタイム表示するシステムを試作してみました。 ちなみに試したAndroid端末は2012年版Nexus7(4.2.2)と、Softbank 006SH(2.3.3)。



BluetoothモジュールはSeeed studioSerial Port Bluetooth Moduleを使用。その名の通りBluetoothモジュールとAndroid間で無線シリアル通信ができちゃう便利なモジュールです。駆動電圧は3.3V。

最近は省電力系が流行っていて3.3Vなど電圧低めのモジュールが増えてますが、やはり5VはラクチンなのでSparkFunのレベルコンバータを経由してPICマイコンとBluetoothモジュールを接続。3.3Vはレギュレータで作成。

やり方は簡単で、いつもの通りMCP2551のようなCANトランシーバを車両CANバスに接続し、CAN信号をPICで拾い、レベルコンバータ経由でUART接続されたBluetoothモジュールに送信、BluetoothモジュールとAndroidはシリアル通信用にペアリングされているので、ベタデータを送受信できる、というものです。



CAN-Bluetooth回路、PICマイコンのプログラム、Android側のアプリ開発など、過去の開発データやプログラムコードがかなりの割合で再利用できたので想像以上にアッサリと移植できましたが、Androidのグラフの高速表示で苦労しました。

元祖VC++版の解析プログラムは処理だけでなく表示系も全てコードで記述していたので簡単にAndroidに移植できたので、写真を見ても判る通り表示内容はVC++版とまるっきり同じになっています。 問題はグリッド表示で、機種依存を無くすためAndroidSDK標準のGridViewを使用しているんですが、これが糞重いのです。 結局、この重いGridViewをどれだけ軽くできるかが今回のアプリ開発の課題になりました。

<動画 YouTube>
● 車両に接続 (軽量化前に撮影したもので、スクロールが若干カクついている)
● 軽量化後にログデータの高速表示





 


<トップページに戻る>

データの無断転載/無断使用を禁じます