WRX micro:bitを車両で使う その19 ELM327の車両との通信を確認する

micro:bit, OBD2, 社外部品・DIY

シリアル通信におけるRS232C通信については、TTLコンバーターを使用する事でmicro:bitとELM327間の通信は一応行う事が出来ました。今回は実際に車両のOBD2ポートにELM327を接続し、micro:bitの情報取得命令に対して、車両からの応答をLCDパネルで表示出来るか確認してみます。

スポンサーリンク

micro:bitでのTTLコンバーターを使用したRS232C接続については下記記事を見て下さい。

LCDパネルについて

先にmicro:bitで利用するLCDパネルについて補足します。購入したLCDパネルはkeyestudioの「2004 I2C Module(20文字×4行)」で、メーカーが案内している拡張機能では正式にサポートはされていません。「1602 I2C Module(16文字×2行)」はサポートしていますが2004はあくまで「互換性あり」なので、私が試した限りでは1行目が16文字までしか表示されませんでした。

そこで別メーカーが1602用に出している拡張機能では2004もサポートしている様子で、実際に利用してみても1行目の表示に問題は無かったので、現在はこちらの拡張機能を使用しています。

送信するデータ

今回micro:bitからELM327に送信するデータは、Aボタンで車両のエンジン回転数取得(010C)、Bボタンで直前に行ったOBD2への情報取得の再実行(0D:改行コード)、A+BボタンでOBD2ポートの16番ピンに供給されている車両常時電源の電圧取得(ATRV)の3つです。Aボタンでエンジン回転数を取得してからBボタンを押すと、再度エンジン回転数を取得する事になりますが、繰り返しAボタンを押してもエンジン回転数は取得出来ます。Bボタンでの場合は送受信するデータ量が異なるだけです。また電圧取得に対してはOBD2への情報取得ではなく、ELM327内での処理です。

ELM327に送信するデータでELM327内で処理するデータは頭に「AT」が付き、OBD2へ情報取得を行うデータは数値(サービスコード)から始まります。micro:bitから送信する場合も以前にPLCで行っていた時と基本的には全く同じです。ただしmicro:bitでは「1行書き出す」というブロックを使用すると、最後に改行コードが付け加えられるので、PLCの時に行っていた改行を表す16進数の文字コード「0D」は不要になります。

micro:bitのプログラムと通信結果

1回目

最初は上記の様なプログラムを組みました。LCDもこの時はまだkeyestudioで案内されている拡張機能(2004互換)を使用しています。LCDの4行を上手く使う為に改行を行う機能も付けています。

このプログラムで実際に、車両のOBD2ポートに接続したELM327へデータを送信してみた所、上記の様に「NO DATA」となってしまいました。室内でRS232Cの接続を行った際にはちゃんと「UNABLE TO CONNECT」となり、車両に対しては接続に行っているので腑に落ちない結果です。ちなみにELM327から受信したデータは「変数」を作り、バッファから文字列として一旦「変数」に代入した上でLCDに表示しています。「NO DATA」という事は、何も入っていない事になります(送信時にはクリアする)。

ただし何度か試していると、上記の様に「41 0C 0A F4」とデータが表示されました。これは正しいデータでエンジン回転数となる16進数「0AF4」は10進数で「2804」、OBD2の規格による計算式で4で割ると「701」でアイドリング状態だった実際の車両のエンジン回転数に一致します。

しかし室内でRS232Cの接続を行った際も同様でしたが、「UNABLE TO CONNECT」の前に「searching…」が無かったり、今回も本来はmicro:bitから送信した「010C」を最初にそのまま返信してくる表示がありません。やはりmicro:bit側でデータの取りこぼしがある様子です。

さらに何度か試している内に、今度は上記の様にまるでデタラメな内容が表示されてしまいました。根本的に何か問題がある様です。

2回目

プログラムを上記の様に変更しました。LCDの拡張機能も別メーカーの物に変更しています。改行を行う余計な機能はやめ、代わりに受信バッファーのサイズをLCDで表示出来る最大(20×4=80)にしてみました。さらに1回目のプログラムではデータの受信(読み取る)からLCDの表示まで「ずっと」のブロックで行っていましたが、これを「>」を読み取った時のタイミングで行う事にしました。

上記ではELM327は車両OBD2ポートに接続していますが、エンジンは始動しておらず常時電源のみの状態です。室内で試した状態と同じですが、今回は「010C」の返信から「searching…」も表示されています。文字化けした様な謎の記号がありますが、これはELM327から送信される「0D」の改行です。LCDパネルではこの様に表示され、改行も行われません(ELM327への設定で改行無しにも出来ます)。

続いてエンジンを始動してAボタンによる繰り返しの「010C」の送信に対しても、ちゃんと「010C」とその後のデータも毎回表示されました。各データの表示位置も変わらないので、必要なデータの抜き出しも出来そうです。

しかし「0D」による再実行は「NO DATA」になってしまいました。これは「0D」を文字列で送信(しかも「1行書き出す」ブロックなので、さらに改行をプラス)してしまっていたので明らかに間違いです。「0D」は改行(CR)を表す16進数の文字コードなので定数(数値)として送信する必要があります。

やはりmicro:bitはRaspberryPiなどと比較すると非力なので、シリアル通信やLCDパネルとの通信を同時に行いながら、「ずっと」のブロックによる連続の処理は荷が重い印象です。ELM327との繰り返しの送受信も、どの程度の頻度まで可能なのか不明です(あまり期待も出来ませんが)。

ちなみに「ATRV」を送信した結果です。

その他

とりあえず、車両OBD2からエンジン回転数のデータが受信出来て、必要なデータの位置も一定で得られる事が確認出来ました。次回はこのデータから実際に回転数を計算するプログラムを考える予定ですが、PLCの時も少々悩んだ点であり、micro:bitでどうやって処理させるのか、そもそも可能なのか?という点が課題になります。JavaScriptやMicroPythonでプログラムを書けば可能なのでしょうけれど、Microsoft MakeCodeのブロックで何とか実現したい所です。・・・私はそもそもプログラム言語は分かりません。

さらにメモリー容量も少ないので、プログラムの大きさにも制限が出て来てしまうかもしれません。micro:bitでBluetoothとLCDパネルの拡張機能を同時に使用すると、メモリーオーバーのエラーが出てしまいます(本体LEDに「020」のエラー表示)。そうなった場合はまたmicro:bitを2台使い、無線機能で役割分担する必要があります。

「micro:bit」関連記事

以下は「micro:bit」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。

その他

FA用PLCとELM327を使用した「OBD2」関連の記事は以下の記事から始まります。

注記

    • このブログ内で書いている内容はあくまで私の利用する製品(アプリ含む)や機器での場合です。他メーカーの製品や機器をはじめ、同じメーカーの製品・機器であってもバージョン違い等の場合もあるので、記事内容の保証や責任を負う事は出来ません。
    • 記事内で紹介している製品や、その他の類似製品を購入・利用する場合はそのメーカーや購入先で仕様等を確認し、自己判断と自己責任の下で利用して下さい。
    • 記事内で公開しているmicro:bit用プログラムは自由に利用・改変して頂いて構いません。ただし不具合やバグもありますので、プログラムを利用した際の故障や事故等についての保証や責任を負う事は出来ません。自己判断と自己責任の下で利用して下さい。
    • micro:bit製品やプログラミング、その他記事内容について個別の問合せや依頼を頂いても回答する事は出来ませんので、予め御了承下さい。
    • BBC micro:bitは、micro:bit教育財団の登録商標です。その他のブランド名または製品名は各所有者の商標です。