WRX OBD2のアクセル開度によるSIドライブ自動変更機能の自作
長らく手を付けていなかったOBD2関連ですが、久しぶりにELM327とPLCを使用してこれまでとは異なる事を行ってみました。これまでのOBD2関連では車両から取得できるPID項目が分かり、次は複数のPIDを同時に取得する方法を考えようと思っていましたが、時間が掛かりそうでなかなかやる気が出ません。また先月はSIドライブ・DCCDスイッチの増設を行いましたが、実際に車両へ設置した後に今回のPLCを利用した方法を思い付いてしまいました。
SIドライブ・DCCDスイッチの増設
SIドライブ・DCCDスイッチの増設については下記の記事を含めて4回に分けて記事を書いています。同時にそれまで別の位置に付けていた、増設ハザードスイッチやドラレコ電源用スイッチもまとめましたが、実際に車両へ設置してみた所、いまいち使い勝手の向上になっていない気がしました。当初はSIドライブの「I」モードへの変更機能だけを考えていましたが、どうせならと「S」や「S#」、DCCDまで含めた結果、結局は余計なスイッチが増えて「邪魔」になってしまいました。
・・・実に短命でした。取り付けた当初はもう少し位置を調整すれば使い易くもなるかと思いましたが、一度感じてしまった「何か違う」感が大きかったです。ただしSIドライブの「I」モードへの変更スイッチとハザードスイッチ、ドラレコ電源スイッチはどうしても欲しいので、今後スイッチの数を減らした形で改めてスイッチボックスを作り直す予定です。
PLCを利用する
SIドライブ・DCCDスイッチの増設を行ってからもう1つ思った事は、OBD2から情報を取得する為に使用しているPLCの利用でした。折角タッチパネル一体型で入出力もあるのだから、PLCからSIドライブやDCCDの変更を行ってみても面白いかもしれません。しかしPLCのタッチパネル上にスイッチを並べるだけでは、先のスイッチボックスとあまり変わらないので、OBD2からの情報とSIドライブの変更を組み合わせてみる事にしました。
想定する機能
今回は車両のOBD2からアクセル開度を取得し、踏み込み量によってSIドライブを「I」から「S」、または「S#」に自動で切り替える機能を作成してみます。
- エンジン始動(IGN電源ON)後、自動でSIドライブを前回までのモードに切り替える(有効/無効あり)。
- タッチパネル上に「I」「S」「S#」スイッチを置き、手動で任意に切替が出来る。
- アクセル開度の増分が設定値(2種類)以上の時に、SIドライブを「S」または「S#」に切り替える(有効/無効あり)。
- SIドライブを「S」または「S#」に切り替えた後、アクセル開度の増分が「0」以下となったら「I」へ戻す。
主な機能は上記の4点とします。またOBD2からの情報でアクセル(スロットル)開度に関連する項目は幾つかありますが、今回はPIDで「11」の「スロットル位置(%)」を利用してみます。
車両SIドライブ信号への配線
利用するPLCには入力8点と出力4点があります。出力は10Aのリレー接点になっているので、別途リレーを用意する必要はありませんが、4点しか無いのでDCCDの切り替えまでを行う事は出来ません。ただし今回想定する機能が上手くいっても車両に常設するつもりはなく、あくまで実験なのでDCCDは繋がない事にしました(自動的に変更する目的も無いので)。
これまでOBD2関連で車両に接続していた形に加え、上記の様にPLCの出力端子に車両のSIドライブ信号線に繋がる配線を行いました。配線と言ってもかなり適当ですが、SIドライブの各モードとする出力に増設のスイッチボックスの時と同じ様に「S」では抵抗無し、「I」は1kΩ、「S#」は3.67kΩとなる様に抵抗を入れています。
OBD2からスロットル位置(%)の取得
これまでのOBD2関連では、実際にエンジン回転数(PID:0C)を取得してPLC上でも表示する事が出来ていました。今回はスロットル位置(PID:11)となりますが、取得方法自体は同じで最初に要求するコマンドを「010C」から「0111」に変えるだけです。ただしエンジン回転数で返される答えは2バイト、スロットル位置は1バイトである違いと、その答えからさらに計算を行う為の計算式も異なります。
また前回のOBD2関連の記事で、スロットル位置(%)はアクセルを踏んでいない状態でも計算後の数値は「13.7%」、踏み込むと「78.4%」で0~100%にはなっていませんでした。本来であればこれを0~100%になるように補正する必要もありますが、今回は「増分」で考えるので補正は行いません。
タッチパネル画面とラダープログラム
まずは必要な機能に基づくタッチパネル画面を作成します。上記は動作中のメインとなる画面です。a.はOBD2から取得したリアルタイムのスロットル位置(%)、b.はSIドライブを「S」へ切り替えるスロットル位置の「増分設定値(%)」、c.は同じく「S#」へ切り替える「増分設定値(%)」、d.は現在のSIドライブモード表示、e.~g.は手動による切り替えの為のスイッチです。
さらに上記の設定画面も用意します。a.ではELM327は車両OBD2ポートに繋ぐと16番ピンの常時電源を常に消費してしまうので、PLCで残り1つとなった出力を使って電源ON/OFFを行おうと考えましたが、実際には接続しておらず(別途ケーブルや加工も必要なので)プログラム内で条件として使用しています。b.はELM327から車両OBD2への情報取得(スロットル位置)の開始、d.はエンジン始動後の初期SIドライブ自動変更の有効/無効、e.はスロットル位置の増分によるSIドライブ自動変更の有効/無効、c.とf.はそれぞれOBD2の情報取得とスロットル位置の増分を判定する時間間隔(単位は100ms、「10」で1秒)の設定値です。
ラダープログラムではOBD2から取得したスロットル位置を、設定画面f.の時間間隔で「現在」と「1つ前」で比較し、その差がメイン画面のb.またはc.以上になった時にSIドライブを「S」または「S#」に切り替える様にします。またその後はスロットル位置の差が0%以下(減少)になったら「I」へ戻します。
設定画面d.の初期SIドライブ自動変更を有効にしている場合は、タッチパネルのスイッチで任意に変更した場合のSIドライブモードを記憶しておき、次回のエンジン始動後に再びそのSIドライブモードに自動で変更します。
車両でのテスト
ある程度までラダープログラムを作成したら、実際に車両に接続してみて確認します。ラダープログラムだけ眺めていても実際に接続しないとプログラムミスや気が付かない事も多いので、ノートPCも車に持ち込みます。やはり直す点も多くありましたが、OBD2からのスロットル位置の取得や計算は最初から問題無く出来ていました。ただしELM327に送信するコマンドは初回は「0111」、以降の繰り返しは「0D(CR、リターンコード)」で済むのですが、初回は返される内容が異なるのでその初回は読み飛ばす処理をしていたり、エンジン回転数と同様に内容はアスキーコードなのでアスキーコードから16進数、16進数から10進数、十の位と一の位を組み合わせて計算、という事も行っています。
結果は動画で撮りました。最初はエンジンは掛けずにイグニッション電源のみを入れて行っています。カチカチと音がしていますが、これはPLC内のリレーが動作する音です。また実際の切り替え動作にはさらに条件(切り替え可能な時間間隔など)を入れています。
ちなみに車両側のSIドライブ切替スイッチでもこれまで通りモード変更は可能ですが、この場合はPLC側では変更された事は認識出来ないので、タッチパネルの表示との相違が出てしまいます。OBD2では車両メーカーで独自に利用されている「拡張サービス、PID」がある様で、スバルの場合もこの拡張からSIドライブの現在値を知る事が出来る場合がある様ですが、この部分は私の車両での利用可/不可含め、まだ確認していません。
実走行
テストで上手く動作したので実際に走行してみましたが、実走行でも思っていた以上にちゃんと機能しました。アクセル開度の判定時間間隔を「1秒」とする事で、細かなアクセルワークによる開度の増減は無視される形になっています。従ってブリッピングを行ってもSIドライブは変更されませんでした。逆に言うと変更のレスポンスは悪いという事になりますが、判定時間間隔を短くして変更の為の増分設定値を多めに設定するという方法もありそうです。
気になった点は低速(発進)時やシフトアップの際、アクセルを踏み足す場合に必要以上にSIドライブが変わってしまう点でした。この辺りはOBD2から速度やクラッチスイッチ(拡張PIDにはありそう)を読み取って条件に加えれば解決出来そうな問題です。ただ先でも書きましたが実験なのでこれ以上は行わないつもりです。また車の運転は個人差もあるので、誰にでも合う様に設定や条件を決めるのは難しいだろうなとも感じました。
※今回の走行ではOBD2から情報を取得し、PLCにてSIドライブを自動で切り替えているだけです。後付けのスロットルコントローラーの様に直接アクセル開度を変更する物ではありません。
その他
普段はシフトダウンするシーンでもシフトダウンはせず、1つくらい高いシフトのままでもSIドライブが変わる事で楽に走行出来てしまいます。ただシフト操作を行う楽しさを減らしてしまいますし、実際はそもそもPLCのリレーのカチカチ音や、車両のSIドライブ切替時のピコピコ音がうるさくて常設には耐えられません。燃費も悪くなりそうです。SIドライブを自動で変更する製品も以前から幾つか既に発売されていますが、自分には必要の無い機能だとも改めて思いました。
折角のPLCなので複合的な機能を併せ持つ形にまで出来れば・・・と思っていますが、安全面も考慮する必要があるので色々難しくなりそうです。PLC自体ももう少し高機能な機種が欲しかったりしますが、個人で買うにはちょっと高価になってしまいます。次に単発で何かテーマが思い付けばやってみようと思います。
「OBD2」関連記事
以下は「OBD2」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。
- 「セカイモン」でドイツから商品を購入
- WRX OBD2で車両情報を取得する その1 OBD2とは
- WRX OBD2で車両情報を取得する その2 ELM327の電源とRS232Cの配線
- WRX OBD2で車両情報を取得する その3 ELM327と「とある機器」の接続
- WRX OBD2で車両情報を取得する その4 通信テスト用のプログラムと画面
- WRX OBD2で車両情報を取得する その5 ELM327からの応答
- WRX OBD2で車両情報を取得する その6 ELM327との通信テスト完了
- WRX OBD2で車両情報を取得する その7 その他のATコマンドと調査用コマンド
- WRX OBD2で車両情報を取得する その8 ELM327を車両OBD2に接続する
- WRX OBD2で車両情報を取得する その9 OBD2のPIDを調べる
- WRX OBD2で車両情報を取得する その10 その他のPIDとエンジン回転数の取得
- WRX OBD2で車両情報を取得する その11 アスキーコードを数値に変換
- WRX OBD2で車両情報を取得する その12 正しいエンジン回転数取得の様子
- WRX OBD2で車両情報を取得する その13 エンジン回転数以外の項目とメーター表示
- WRX OBD2で車両情報を取得する その14 エンジン回転数以外の項目の返信内容
- WRX OBD2で車両情報を取得する その15 複数PIDの取得テスト
- WRX OBD2のアクセル開度によるSIドライブ自動変更機能の自作
- WRX OBD2で車両情報を取得する その16 複数PIDの取得の様子
- WRX OBD2で車両情報を取得する その17 エンジン回転数と車速からギア位置を判定する
- WRX OBD2ポート(OBD2コネクター)からの電源について
- WRX OBD2で車両情報を取得する その18 OBD2の分岐ケーブルについて
その他
ブロック形式でプログラミングが行える、教育用「micro:bit」も始めてみました。micro:bitでもELM327と接続して車両OBD2ポートからの情報取得を試しています。
- WRX micro:bitを車両で使う その16 シリアル通信(RS232C)を行う
- WRX micro:bitを車両で使う その19 ELM327の車両との通信を確認する
- WRX micro:bitを車両で使う その20 アスキーコード16進数から数値10進数への変換
- WRX micro:bitを車両で使う その21 車両からエンジン回転数を得る
- WRX micro:bitを車両で使う その40 フルカラーLED(WS2812B)でメーターを作る
micro:bit全体の記事は以下から始まります。
注記
- OBD2の仕様は各メーカーや車両で異なる部分があります。メーカーや車両によってはアフターマーケット製品による利用を推奨していない場合や、利用した場合による不具合発生の可能性を示している事があります。
- このブログ内で書いている内容はあくまで私の車両、私の利用する製品や機器での場合です。他メーカーや他の車両をはじめ、同じメーカーの車両または製品、機器であっても記事内容の保証、責任を負う事は出来ません。
- 記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で、利用する車両などへの適合を確認し、自己判断と自己責任の下で利用して下さい。
- OBD2やELM327、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。
- ELM327はElm Electronics Inc.の登録商標です。その他のブランド名または製品名は各所有者の商標です。