Godzilla R32〜Over The Top Part 2
デジタル速度計をどうするか思索中に、日産診断ツール(Consult I)の情報を読み取りたくなる。純正コンサルト診断ツールは買えないので、自前でインターフェースとソフトウェアを揃える必要がある。この世の中似たようなことを考える寛容な先達が居て、双方共Structureは公開されていて、忍耐さえあればものになりそうな気にさせてくれる。時間はタップリあるので騙されたと思って実行しましょうか?While I am contemplating about the speedometer, I wish to utilize the Nissan Diagnostic Tool (Consult I). Since I can’t afford to buy the genuine Tool, I have got to develop the consult interface adapter together with software by myself. In terms of such hardware and software to deal with Consult I, of which both structures made by some predecessors are generously open to the public. It leads to make me trust in confidence that l can do as well as long as maintaining patience and momentum. Having been deceived, let’s move forward.
Catch Imageは本Threadとは全く関係ありません。俺が亡くなる前にパゴダのレストアを依頼する予定の近所の整備工場でレストア進行中の2000GT-Rの一枚。関東の整備工場からレストアを依頼されたもので、S20型エンジンはその関東の工場にあって門外不出との事。当然だわ。
何と、R32 GT-Rも同時レストア中。元北海道の個体でフレーム下部は錆でボロボロの状態。ジャッキをかけようとしたらフレームが抜けたので大事だと気づいたとの事。本当かいな。矢張り北海道の車は怖いね。
整備工場のオーナーは故夏木陽介の300SLをレストアした業界の有名人で腕は確か、現在3年待ちと大盛況。俺の存命中にレストア完了するかな?
それはさておき、座学から。
Consult I Diagnostic Tool
コンサルトI 診断ツールはシリアル通信(古くは RS-232C、最近はUSB系だが原理は同じ)にて情報をやり取りする。シリアル通信は1本の通信線でデータを送受信する通信方式で、クロックの周期(時計の役割)に呼応して、電圧レベル(HIGH/LOW)を連続的(Serial)に変化させて、データを1bitづつ転送する。転送速度は9600 bps (bit per second、若しくは Hz) で、1秒間に9600bitのデータを送る設定である。因みに、Bit単位の転送速度は1000ms/9600bit=104.2us/bitであるから、1000ms/104.2us/bit=9600Hzでbpと同意である。どうでも良い事だが。
下図が実際にシリアル通信で転送するBit Imageである。これらBitは内部のクロックに同期して送られる。縦軸は信号レベル。横軸は時間を示す。
転送ルールは決まっている。
- Start Bit
これから「データを送るよ」という開始の合図Bitの事。一方、受信側ではStart Bitを受信したら、「これからデーターがくる」と理解する。電圧レベルはLow - Data Bit
実際に送るDataの事。コンサルトのData長は8Bitである。1byteは8bitで構成。依って、2進数では00000000 から 11111111の値、10進数では0 から 255の値に限定される。シリアル通信で一度に送れる数値は1byteなので、 0 (00000000) 〜 255 (11111121)となる。255を超える数値は2回にわけて8bit(1byte) 毎に送る。所謂、MSB(最上位ビット)とLSB(最下位ビット)で送信され、MSBは上位の桁、LSBは下位の桁である。上位8bitと下位8bitを統合して目的の16bit数値を得る。Consult Iの場合、RPM、Injection Time、MAFの3項目については2回に分けて送信する。 - Stop Bit
開始の合図のStart Bitに対して、「データーの終わり」を示すBitである。信号レベルはHigh
今回、Platformとしての利用を予定しているArduino UNOもRS-232C系のシリアル通信が使われている。USBポートの側のATmega16U2マイコンがそのUSBシリアル変換の役割を担う。詰まり、Consult IとArduino相互間でシリアル通信の構築が容易な環境にある。
シリアル通信に於いて必要最小限の情報は、Clock、RX(受信データ)、Tx(送信データ)の3要素である。加えて、電源ソース(12V)とアースになる。幸運な事に、最重要のProtocolは開示されている。具体的なCommandの仔細の説明は割愛するが、下記の二種類の資料に則って忠実にプログラムを構築すれば良いだけだ。
Consult Software
有名どころのソフトウエアは中華製Nissan Consult III Plus、Aussie製Nissan Data Scan I、ECUTalkである。Consult III PlusはConsult II以降の対応なのでConsult Iでは使えない。DataScan Iは有料で50豪ドル程度だが俺には高値のカテゴリーに入る。同ソフトのAndroid版はラーメン代位なので敷居は低いが機能はかなり限定的。一方、ECUTalkは無料。利用するのはこれしかない。
今回最も悩んだのは、14Pinのコンサルトインターフェースのアダプターの入手だ。当初お手製のピンで取出していたが使い勝手が非常に悪く直ぐに外れるので使用を断念。
アダプター単体の通販を探したが見つからず。代替として、OBDII対応の14Pin-16Pin変換ケーブルを入手しようとするも1,100円もする。千数百円アップで、Consult I用の市販インターフェースが入手可能だ。中国本土からの発送で販売元の評価は悪く、最悪配達されない憂き目も危惧されるが、購入に踏み切る。一ヶ月以上かかると踏んでいたら何と一週間で配達される幸運。
早速、ECUTalkで作動を確認。数秒後にECUと同期し、表示項目の選択一覧表が表示される。任意の項目を選択して表示をクリックするとメーターの一覧が表示される。お手軽で気に入った。因みに、ECUの型番はケースの銘板の番号と同じ。また、機能限定のお試しPC版Nissan Datascan Iでも動作を確認するが、表示されるメーターは回転数と車速のみで全く使えない代物。
参考までにECUTalkの作動状況を示す。単なるパーツの稼働状況だけでなく、Fault Codeを表示・クリアできるのは有難い。更にROM吸出し機能があれば最高なのだが。
気をよくして、DataScan I Android版導入に向けて、手持ちのBluetooth Module(HC-05)をアダプターに組み込むことにする。
DataScan本家のサイトに記載あるSupported Adapterに記載あるBluetooth Moduleの導入方法を真似る。
Android版でアクセスを試みる。Bluetoothは接続できるが、ECU Initialization Failureが発生して同期できない。驚くことにPC版でもECUにアクセス不能と成る。電圧が足りないのかなと思い、本家サイトでは抵抗下流からRxを取り出しているが、抵抗上流に変更する。その結果、PC版でもECUにアクセスできるようになる。しかしながら、依然としてBluetoothでは同期できない。その後色々Tryした挙句、基盤を壊したようでPC版でも一切アクセス不能に陥る。調子に乗りすぎて遂に運にも見放された様だ。
ECU本体を壊したのではないかと焦ったが、通信程度でECU本体を破壊することはなかろうと勝手に思い込み放置する。
しかし、依然としてECU本体を壊したのではないかとの疑いを払拭できない。不安な日々を過ごす中、意を決して修繕に向けて取り掛かる。しかし、通信素子を破損している可能性が高い為修繕は諦め、破損した基盤を何とか再利用できないかと考える。
FT232RLモジュール上流には手を加えていないので、破損したのはFT232RLモジュール本体であろうと思料。試しにArduinoにTx、Rx、5V、Gndを接続し、ECUと同期できるか確認する。なんの事はない、アッサリとECUを認識する。ECUとコンサルトインターフェース回路本体は無事でホッとする。
癖があるが馬鹿安のUSB-TTL変換モジュール(CH340G)を早速入手し、ECUTalkとのアクセスを試みる。これも問題なし!
但し、使用に当たってはWindows10ではDriverを手動でInstallする必要がある。Ubuntuでは自動的に認識する。
因みに、取出口TXとRxは本来の意味とは逆ですね。回路を確認すると、TxはRx、RxはTxの回路から其々取りだしている。USB-TTLモジュール、並びにArduinoは其々受け手になる為、Tx/Rxを逆(クロス)するように接続する必要がある。接続を間違えないように敢えて表記を逆にしてある訳だ。
製品一式 基盤表 基盤裏 HC-05取付 USB-TTLでの接続確認
Consult Interface
手っ取り早いので、この壊れた基盤を使って作業を進めることにする。
ECUTalkでも機能的に充分だが、都度CF-J10を立ち上げる必要がある。運転中でも手軽にモニター出来るようにArduino環境下LCDに表示するシステムの構築を目指す。
Public Circuit
先ず、Breadboardに組込んでUSB-TTLでECUTalkの動作を確認する。公開されている回路図をそのままトレースするが問題無く動作する。
当初試作品の作製を考えていなかったが、この程度のものに市販品に頼るのは性格的に許せないので試作品を作成することにする。これが一ヶ月にも及ぶ苦悩の始まりとは露にも思わず。
出来上がった基盤はサイズを可也小さくできて自己満足の世界に浸る。然しながら、いざArduinoでの動作確認を試みるものの要のECUと同期できない。回路の結線に不具合があると思い、何度も見直すがおかしい処なし。テスターでClockの周波数を確認するが目的の周波数を発振。トランジスター、オペアンプもBreadboardで異常なしだった。どうした訳だと不思議に思うが、解決策もなく途方に暮れる日々。貧乏性で終いには夢まで出てくる始末。回路シュミレータまで使う気になれず自作を諦めようと思う事も。挙げ句の果てに、ECUのヒューズを切る羽目にも遭遇。これが判明する迄の地獄のようなひとときも体験。結局、公開されている回路図ではArduinoは使えないと判断する。
半田を繰り返した為、基盤は殆ど加工不能な状態。新規一転、基盤も新たに組み直すこととし、此れ迄は公開回路図を単にトレースするだけであったが回路をScratchから見直す。
改めて回路を眺めると、抵抗がゴチャゴチャしていて美しくない。何故か、この際スッキリさせようと気合が入る。
基本的な考え方として、既にECU内部でTx及びRx信号は処理済で、Nearな環境で送受信するのに複雑な処理は不要な筈だ。TTLでは問題なく稼働したにも関わらず、Arduinoでは何故不具合が発生するのか、合点がいかない。
ふと思い浮かんだのは、Arduinoでは入出力で電圧のHigh、Lowレベルが異なる事だ。例えば、5V電源の場合、Highレベルは入力では3V以上出力では5Vである。一方、入力Lowは2V以下出力は0Vである。詰り、ArduinoとTTLではデジタルON/OFFのLogic Levelが異なるのではないかと素朴な疑問を抱く。
Logic Level
頭のスッキリした明け方に猛勉強しました。Gistは以下。
ほぼ全ての公開されている回路図はPLMS回路に端を発しており、旧規格のRS-232Cの使用を引きずった設計である。驚くことに、RS-232CのLogic Levelは、Highが負電圧(-3〜-25V)、Lowが正電圧(+3〜+25V)と一風変わっている。因みに、PCも同様にLogic Levelは負電圧-13Vから正電圧+13Vへシフトする。一方、TTLは略称が示すようにBipolar Transistorと抵抗器で構築されたLogic回路であるが、Logic Lowは0-2V、Highは3-5Vである。それに対してArduinoも略似通っているが微妙にLevelが異なる。素晴らしい比較図を見つけたので紹介して置く。
詰り、Arduinoの方がTTLに比べてLogical Levelの許容範囲が限定的である事だ。これが動作差の要因と肌感覚で理解する。
Circuit Recap
原因が分かれば解決は早い。RS-232Cを引きずった回路故無駄が多かろうと、詳細に回路を見直す。
初めに、オペアンプLM358に於ける入力-PIN6は抵抗10kΩと4.7kΩで分圧され、所謂中点電圧は3.4V (=VCC5Vx10kΩ/(10kΩ+4.7kΩ))となっている。LM358の飽和電圧は3.7Vであるから、殆ど飽和電圧に等しい設定である事に気づく。信号の電圧を実測していないが、これでは入力+PIN5と入力-PIN6と間に有意な入力差を確保できない恐れがある。
有意な入力差を確立する基準電圧を5Vの半分の2.5Vと任意に定める。運良くあった手持ちの2.2kΩの抵抗を使って分圧する。この場合、Logic Levelの具体的なSwitching Behaviourは、入力+が入力-(2.5V)を上回ると、出力は上側飽和(3.7V)でONする。逆に、入力-を下回ると、出力下側飽和(0-0.6V)でOFFする。
抵抗間の流れる電流は最大1.1mA (=5V/4.4kΩ)と許容範囲内。一方、入力+PIN5の抵抗6.8KΩを流れる電流は最大0.7mA (=5V/6.8kΩ)となる。LM358のデーターシートによると定格電流は0.7mA、最大1.2mAとなっており定格通りの設定である。従って、抵抗6.8kΩの仕様は妥当、このままとする。
更に、出力PIN7の抵抗4.7kΩの必要性は必ずしも提起されないので有っても支障はないが削除する。
次に、Rx信号は12V Open Collectorに繋がる入力信号である。この場合のNPNトランジスターの用途は電流の増幅が目的ではなく、スイッチング動作の役割を担う。
仔細な動作状況は割愛するが、トランジスターをONすると、電圧VCEは0Vとなり、コレクターCからエミッターEへ電流が流れて、RX信号の受入れ準備が整う。
12Vオープンコレクターに繋がるコレクター抵抗RC=1kΩはスイッチング回路では一般的な数値であり、流れる電流は最大5mA (=5V/1kΩ)である。又、電圧降下は高々1V程度であるので、現状の設定にして置く。
ただ、トランジスターをOFFしても、ICBOの影響でコレクターCからベースB、更にエミッターEへ僅かに電流が流れ込む。これを防ぐ為に、通常、ベースBをOpenにしないでベースBとエミッターE間に抵抗RBE=1kΩ位を組み込む。今回の用途では必ずしも必要ないので、悪さをする場合は付ければ良いと割り切り、バッサリと削除する。
加えて、Tx回路同様入力抵抗4.7kΩも削除する。
贅肉を剃り落としたSkeltonな回路はSimpleで実に美しい。
一か八かこれでTryする。
日の出体操を終え取り掛かる。
緊張の一瞬というよりも、悟りの境地にいる冷めた心境でIgnitionをON。初期画面が切り替わると同時にLCD画面上にConnecting ECU Ok!が表示される。
よっしゃ!
配線を切り替え、引続きCF-J10 Windows10でECUTalkを立ち上げる。数秒後にGauge選択一覧表がLoad。DisplayをクリックするとGauge Meter一群が表示される。
やったー!
一発でクリア。最近体力・知力の減退が如実になる中、何とかクリアでき感無量。新たな気力が漲って来る。
総括すると、公開されている回路図はオペアンプの使用を睨んでUpdateしているものの、基本的設計はRS-232Cを引きずって最近の仕様にそぐわない。運良くTTL(T232RLやCH340G)ではWorkしたが、ArduinoではLogic Levelが若干厳しい設定故Workしなかったと思量。独善的な解釈かもしれないが。
その他の些細な設計上ポイントは以下
- 簡素化を図る為、Clock及びLogic回路用電源5VはシガーソケットのUSBより取得。TxのOpen Collector12Vはコンサルトコネクターより取り込む。GNDは診断コネクターとUSBでCommon。
- 153.6KHz同期クロック発生用にEXO-3を使用。この石は使い勝手が良い。残念ながら廃番でヤフオクで調達。
- 14Pinアダプター内に収まるようInterface小型化に成功。スケッチを何度もやり直して達成。
回路はArduinoと市販ソフト双方でWorkableだ。シミュレーターによる検証を経ていないので最適化されている自信はないが、参考までにインターフェースの概念回路図を紹介する。
不完全回路なBreadboard 概念回路図 基盤スケッチ 試作品
Inhouse Consult Scan System
Arduinoを利用したConsult Scan Systemの全体像を紹介する。LCD、Arduino、及び操作基盤を三段重に組み立てる。今後タッチボタンを操作基盤に取り付け画面操作を行う予定。不細工だが我ながら満足な出来栄え。Bluetooth接続によるタブレットでの操作が理想だが(iVD版開発)、そんな暇はない。
正面 側面
現状の機能はGaugeの表示のみ。ScanするGaugeは下記項目
項目 | 単位 | 備考 | |
1 | VSS | Kmh | |
2 | Coolant Temperature | ℃ | |
3 | Battery | V | |
4 | RPM | rpm | |
5 | Throttle | V | 基準0.5 |
6 | Injection Time | ms | 1-2@Idle |
7 | O2 | V | 0-1@Idle |
8 | MAF | V | |
9 | Ignition Timing | BDTC | 20@950 |
10 | AAC | % | |
11 | A/F | % | |
12 | A/F Self Learning | % | |
13 | Duty Cycle | % | 算定値 |
ECU接続中 ECU番号取得
Gauge Monitoring
20x4LCDでは最大13項目しか表示できずそれ以上は無理なのが難点。将来、Fault Code、Self Learningの機能を導入する腹積もりだが、果たしてそこ迄Momentumが持続するかが課題。
プログラミングは、Protocolに則して、Command、Gauge Part Register Numberを忠実に正しく組み入れれば問題ない。ポイントは以下
- 勘所は2箇所
- ECUの初期化
- Gauge Dataの読み込み
- Bit、Byteに関する基本的な知識が不可欠
- ECUとの同期はECUTalk同様5秒毎にTryし、1分間同期できなければTerminateする設定
- ゲージ表示は0.1秒毎に更新
- 意外に手間どったのはLCDへの表示の件。発想の転換で解決した。ヒントはGauge Parameter Variablesは全てfloat宣言する。
- Sketchは現状400行程度のBasicなもの。Elegant化を徹底的に図り、何れGithubで展開する予定。
最後に、Sketchの最初の要の部分を紹介する。Elegantでないβ版だが却って判読容易なCodeと思料。
boolean connectECU() {
int readByte;
timeStart = millis();
Serial.write(0xff); Serial.write(0xff); Serial.write(0xef);
do {
if (Serial.available() > 0) {
readByte = Serial.read();
}
if (millis() > (timeStart + 60000ul)) { // if time is over 1min (60000ms)
lcd.setCursor(0,3);
lcd.print("Timeout. Try later. "); //Terminate
// 1 3 5 7 9 1 3 5 7 9
exit(0);
}
} while (readByte != 0x10); //Initialization is acknowledged by ECU
Serial.write(0x30);
return (true);
}
Closing
先程、Fault関連の機能を追加する。Sketchは600行程度。未だFully Untestedな状態だが、Momentumが徐々に喪失してきているのが現状。
振り返えれば、当初楽勝と思いきや、公開されている回路図が万能でないことが分かる迄、無為な?1ヶ月を余儀なくされ、老齢に鞭打って座学をやり直し、早春2ヶ月間どっぷり籠って何とか完成。
近所の人からは、「春朧ろ隣は何をする人ぞ」と勘ぐられていると思うと心中穏やかでないが、村八分でも一向に気にしない立ち位置。週刊文春だったか新潮だったか著名人達の取材で、世間との付き合いを断った記事があったが、何と身軽になることかと再確認した次第。尤も愚妻初め愚女愚息FamilyとはLineで毎日やり取りしている。孫第二子も誕生し順風満帆!
中国本土、台湾からの配達日数は其々7日と10日と順調、新型コロナの影響は皆無。意外と出費したと反省。
項目 | 値段 |
Nissan-14 Adapter(本土) | 2,450円 |
USB-TTL変換アダプター(台湾) | 173円 |
20×4 Blue LCD(台湾) | 519円 |
送料(台湾) | 150円 |
EXO-3(ヤフオク) | 810円 |
総額 | 4,102円 |
Vigorously on the move!
Note 1: LCD Wiring to Arduino
I2Cなる便利なモジュールの存在を知らずに、ArduinoとLCDを直接接続するのに手間取ったので、接続方法につき共有しておく。尚、Arduino UNO互換品を使用したことを付記して置く。
LCD | Arduino |
VSS | GND |
VDD | 5V |
V0 | Diode経由GND |
RS | 11 |
RW | GND |
E | 9 |
D4 | 5 |
D5 | 4 |
D6 | 3 |
D7 | 2 |
A | 5V |
K | GND |
Setupにて、LiquidCrystal(RS, E, D4, D5, D6, D7)を宣言する。
悩ましい箇所はコントラスト(Vo)調整である。方法論として
- 可変抵抗10kΩの利用
調整幅0-5k、5-10kはInverted - Arduino PWM機能の活用
(〜表示のPin番号3,5,6,9,10,11の何処でも可)
SetupでanalogWrite(pin,contrast)と宣言の上、contrastを0(0V)~255(5V)間で調整する。俺的には140が好み - ダイオードの利用
が考えられる。可変抵抗は面倒、PWMは液晶のちらつきが目につくので、結局従来通りダイオード調整で対応する。
特に、LCDのAとKを接続するのを忘れないように。接続しないとバックライトが点灯しません。知らずにいて大分時間を無駄にする。
Note 2: NPN Transistor Works as a Switch
飽和電流
トランジスターが飽和モードになるとは、ベース電流に応じてコレクター電流が増加しない。詰り、トランジスター本来の機能である増幅機能を喪失する領域にあるという事。
飽和モードに至るベースを流れる最大の電流IBを求める。ここでhFEを200と定める。
コレクターとエミッター間の電圧VCEは0Vであるから、コレクター電流ICは次式で与えられる。IC=VCC/RC=5V/1kΩ=5mA
依って、飽和電流IBは、IB=IC/hFE=5mA/200=25μAとなる。
Transistor ON
入力電圧Vin=5V、即ち、トランジスターがONの場合の出力電圧Voutは次式で得られる。
IB=(Vin-VBE)/RB=(5V-0.7V)/10kΩ=430μA
これは飽和電流25μAより大きいからトランジスターは飽和モードにあり、出力電圧Voutは、0Vとなる。
Transistor OFF
入力電圧Vin=0V、即ち、トランジスターがOFFの場合、IB=IC=0Vであるから、出力電圧Voutは、Vout=VCC-(ICxRC)=5V-0=5Vとなる。
以上