WRX micro:bitを車両で使う その28 新バージョン(v2.0)のI2C通信

2020年12月26日micro:bit,社外部品・DIY

前回はmicro:bitの新バージョン(v2.0)で追加されたマイクやスピーカーなど、ハード的な部分を試してみました。今回はプロセッサー等も変わった事で、処理能力の向上が目に見えて分かる物なのか試してみる事にしました。・・・が。

スポンサーリンク

※この記事はmicro:bitの新バージョン(v2.0)でI2C通信のバグについて書いていますが、記事公開後にバグが修正され、解決出来る方法があります。詳しくは下記記事を見て下さい。

ELM327を介した車両OBD2との通信

これまでにmicro:bitのシリアル通信(RS232C)を使用してELM327と通信し、ATコマンドを送る事で車両OBD2から各種データを取得する事を行っていました。この際、LCDモジュールを利用して受信内容や結果を表示させていましたが、LCDモジュールはI2C通信(端子19、20)に繋いで使用していました。

ELM327への通信は、その時々の車両情報を得る為に繰り返しデータ要求を行いますが、PLC(FA用機器)を使用した場合は1回の要求に休止時間を与えないと高速過ぎてしまいます。ただしmicro:bitの場合は休止時間を与えるほどに高速には処理出来ないので、その必要はありませんでした(それでもELM327の通信ランプから0.1秒サイクル程度には通信していそう)。

結果の表示にはLCDモジュールの代わりに4桁の7セグLEDも利用しましたが、7セグLEDは通常の端子で制御出来ます。7セグLEDを利用した時には特に繰り返しの速度に変化は見られないのですが、LCDモジュールを利用してシリアル通信とI2C通信を同時に行う形になると、さすがにELM327の通信ランプの点滅も遅くなりました(0.2秒サイクルくらい?)。上記はエンジン回転数を7セグLEDに表示しています。

PLCによるエンジン回転数の取得については上記記事にて。

新バージョン(v2.0)のI2C通信

旧バージョン(~v1.5)のmicro:bitのI2C通信(端子19、20)は、磁気センサーと加速度センサーとの共有になっていましたが、新バージョン(v2.0)では独立しています。micro:bit公式の資料にv2.0の場合v1.3の場合(v1.5では変更無し)のハードウェアブロック図が掲載されていて、v2.0ではI2Cはinternalとexternalの2系統になっています。

この事からLCDモジュールを利用した時のELM327との通信においても、繰り返しの速度が向上する事が期待出来ます。そこで同じプログラム(v2.0では1度Microsot MakeCode等で開いてプログラムを更新する必要アリ)を新旧のmicro:bitに書き込み、同じ構成でELM327との通信を行えば、新バージョンのmicro:bitの処理能力がどの程度向上したかを確認出来そうです。ただしあくまで通信を絡めた上なのでプロセッサー等の個々の能力向上は分からず、単純に通信がボトルネックになってしまうかもしれません。探せば円周率などを計算するプログラムなどがあるのかもしれませんが。

準備

以前作ったプログラムを新旧のmicro:bitに書き込み、シリアル通信(RS232C)の為のTTLコンバーターやLCDモジュールを接続して、まずは机上で確認します。

過去に実際に車両に接続して成功しているプログラムなので、特に問題はありませんでした。上記は旧バージョンのmicro:bitで、ELM327には乾電池で12Vを供給しています。ELM327に電源を入れるとバージョンが送信され、LCDモジュールに表示されました。まだ車両データを取得していないので下側の数値は適当な数値です。

次に全く同じプログラムを新バージョンのmicro:bitにも書き込みます。シリアル通信等のハード部分は何も変えていません。新旧のmicro:bitをブレイクアウトボードで差し替えただけですが、LCDモジュールに文字が出ません。

LCDモジュールの利用方法については上記記事にて。

原因を探る

何も変えていないプログラムとハードなのに、LCDモジュールの表示がおかしい。違いと言えば先のI2C通信が磁気センサーと加速度センサーから独立したという点です。micro:bitは磁気センサーと加速度センサーもI2Cで通信していてそれぞれにアドレスを持っています。LCDモジュールにもアドレスがあり、使用している物では「0x27」となっています。

前回記事で初期状態のmicro:bitで実行されるデモプログラムでは、ちゃんと振るや傾けるは機能していたので、internalのI2C通信は出来ていると思われます。何かI2C通信の状態を調べる方法が無いかとネット上を探した所、I2Cデバイスの使用中アドレスを調べて、LEDに表示するPythonプログラムを公開してくれているサイトがありました(「micro:bit I2Cアドレス 確認」で検索)。これを利用させて頂き、新旧のmicro:bitで試してみます。

まずは旧micro:bitです。LEDには[25、30、39](大括弧を含む)と表示されました(上記では「9」が見えています)。micro:bit公式のI2Cに関する資料(v1.5とv1.3)によると25(0x19)は加速度センサー、30(0x1e)は磁気センサー、LCDモジュールは39(0x27)なので正しい事が分かりました。

そして新micro:bitでは・・・。何も出てきません([]だけで数字が無い)。同じく先のI2Cに関する資料(v2)では、新バージョンのアドレスは加速度センサーが0x19か0x1F、磁気センサーは0x1Eか0x1Fである事が記載されています。デモプログラムでは各センサーは機能していた事から、本来はアドレスもある筈です。

micro:bit公式には回路図エッジコネクタに関する資料もありますが、そもそも基本的に旧バージョンとの互換性に問題は無い事が謳われており、I2Cの使用方法が変わってしまう事の方が問題です。

問題は認識されている?

プログラムの互換性に関する公式の資料から、問題点を報告出来るGitHubが案内されています。ここにはI2Cに関してハングアップや通信開始?に問題がある様な報告があります。またmicropythonのGitHubにも「i2c.scan()」でフリーズするともあります。

やはり新バージョンも出たばかりなのでバグという事でしょうか?とりあえず現状では手が出ないので、ファームウェアの更新を期待するしかなさそうです。また結局、I2C通信を含めた新旧micro:bitでの処理能力の差を見るという目的は、当面果たせそうにありません。

追記

Microsot MakeCode(pxt-microbit)のGitHubにもI2C通信の問題を指摘する内容があります。ここまで色々と調べていましたが、私の購入したmicro:bitだけでなく、他のmicro:bit(v2.0)でも「問題がある」という事が分かったので、とりあえず安心しました。問題があるままでは困りますが・・・。

その他(ファームウェアについて)

ファームウェアの更新については以前の記事で書いています。更新方法に違いはありませんが、現状でのファームウェアを確認してみます。公式ではここここに資料とダウンロードリンクが掲載されていますが、現在(2020年12月)ではv2.0は「0255」、v1.5は「0249」となっています。

上記は私が持っている旧バージョン(v1.5)です。この中で「Interface Version」がファームウェアのバージョンになりますが、・・・公式よりもバージョンが上がっています。以前の記事でファームウェアを更新した際には、確か「0253」や「0250」もあった記憶ですが、なぜか現在は見当たりません。

変わって上記は今回購入した新バージョン(v2.0)です。「0255」とあるので公式にもある最新になっています。

「micro:bit」関連記事

以下は「micro:bit」タグの記事一覧です(投稿順)。現在の記事とこれ以降に投稿した記事も含みます。「その24」までの記事ではmicro:bit本体のバージョン「1.5」を使用しています。

その他

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

注記

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