電子工作/IoT連載 の3本目です。
初めに
こんにちは。フューチャーの井上です。
過去にこんな記事を書いています。
今回は、M5Stackというマイコンモジュールを使って、「バイクの各種情報を簡単に表示できたらいいな」という”思い付きを形にしていく過程”を記事にしようと思います。
概要
結果として、車両データロガーのようなものを作りました。
車でレースをする人のにはなじみ深い、いわゆるデータロガーで取るようなデータの一部を表示します。モックアップとしてM5Stackで実装し、実際に実装する際に考慮すべき点などをこれで確認しました。
以下のような流れで制作しています。これは、仕事で何かを作る際にやることと一緒だと思います。
やりたいことを決める
現在、私はバイクを3台所有しています(HONDA GROM/HONDA V-Twin Magna/HONDA CB150R)。以前私は車でレースをしていたのですが、バイクは市販のままだと車両データがほとんど見れないのです。ある程度同じような情報が見たいな、と思っていました。
四輪のレース時は、以下のような情報を取っていました。
- 加速度(旋回/加速の強度を見れる)
- 傾き(地形の影響を見れる、操作の滑らかさを確認できる)
- エンジン状態(回転数、燃料消費量、スロットル開度、etc…)
四輪の車においてはOBD2という自動車診断規格があり、そこから車内ネットワークであるCAN Busにアクセスして情報を取得できます。
CAN(Controller Area Network)とは、(ざっくりと説明すると)車載機器に使われるネットワークのことです。CANプロトコルを使い、車載機器間の通信を行います。例えばエンジンからは回転数情報を取得することができ、メーターがこの値を表示することで例えば「運転席のメーターにエンジン回転数が表示される」ようになります。逆に言うと、偽のデータを送り付けることで車両に異常を起こすことが可能です(セキュリティの領域)。
OBD2は、自動車診断企画です。上記CANはOBD2で使用されるプロトコルの一つで、故障診断用端末を接続しデータを吸い出すことを主な目的としています。日本では、四輪車量は2008年以降の新車に義務付け、二輪車両は2020年12月以降の新車に義務付けがされました。最近車両を買った方がいれば、ダッシュボードや運転席前部にコネクタが隠されているはずです。尚、適当に触ってしまうと機器故障と判断され、ディーラー持ち込み修理になる可能性があるのでお勧めはしません。
私が最近買ったバイク(GROM)にはOBD2が装備されているらしいことを知ったので、そこから情報を取得して、記事にしようと思います。
四輪でのOBD2経由でデータ取得/書き換えの記事は世の中にあふれていますが、二輪のものはあまりありません。何ができるのか、辺りを調べることは良いアウトプットになりそうです。
以下をゴールにしようと思います。
- バイクに設置する、データロガーを作ろう
- 以下の機能を実装する
- 傾斜を表示する(ロール/ピッチ)
- 加速度を表示する(X/Y軸の加速度)
- エンジン状態を表示する(OBD2経由で取得・四輪なら取得できる)
- 燃料消費量
- 100kmでの燃料消費量(L/100km)
- 1時間での消費量(L/h)
- 燃料圧力(kPa)
- 車速(km/h)
- ブースト圧(bar)
- 回転数(rpm)
- 燃料消費量
- 以下の機能を実装する
最初の躓き
データが取得できることをまずは確かめたいので、このようなプロジェクトで使いやすいM5Stackというマイコンモジュールを使います。
M5Stackとは、WiFiやBlutoothの機能を備えたCPUに、液晶ディスプレイやボタンや入出力ピンなどを一通り搭載した、小型のマイコンモジュールです。”Stack”と名前がついているように、専用モジュールを積み重ねて機能拡張ができます。
M5Stackを使ってバイクのCAN-Bus情報を見ようと思ったのですが、なんと、
M5Stack用の CAN Busユニットが売り切れ でした。
本企画の根幹を揺る問題ですが、この記事は書かないといけません。
故に、OBD2を使わずに車両状況を見るものを作ってみます。
M5Stackを使うと以下の情報が単体で取得できます。また、追加のセンサーがUnitとして販売されているので、今回はGPS Unitを使ってみようと思います。
- M5Stack本体
- M5StickC Plus
- 内蔵センサ
- 6軸IMU
- 加速度(X/Y/Z軸)
- 傾斜角度(ピッチ/ロール)
- 6軸IMU
- 表示機能
- 液晶(135 x 240)
- LED x1
- 追加のUnit
- GPS Unit
- 経度緯度
- 速度、コース
- 時刻
- GPS Unit
当初の実装目標を変更し、以下を実現できるものにしようと思います。
- 取得する/表示するもの
- 加速度(X/Y軸)
- 急な加減速は安全運転ではない、レース時は同じ場所で同じような加減速をすることでタイムが安定する)
- 傾斜角度(ピッチ/ロール)
- ロール不足は車両の能力を生かし切れていない、ピッチが大きい場合はサスペンションセッティングの変更が必要
- 山道などでどの程度の坂なのか、が判別できる(燃費に影響)
- 現在時刻
- 時刻は見えた方が良いよね(バイクのメーターにも表示されているけど)
- 車速
- 今は使わないけど、サーキットでは位置情報などと合わせて安定した周回ができているかの判断になる
- GPS情報
- 補足している衛星数とGPS受信ステータスは見えたほうが良い
- 加速度(X/Y軸)
- 取らないもの
- 加速度(Z軸)
- Z軸(上下動)はジャンプでもしない限り不要なので実装しない
- 緯度経度情報
- M5Stackの制約を考えると、プロトタイプなので、まだ要らない
- 利用するM5StickC PlusにはSDカードなどの記録媒体が無いので、ローカル記録ができない
- 画面表示領域が狭い、経度緯度を見ても人間には分かりづらい(要PCでのデータ加工)
- M5Stackの制約を考えると、プロトタイプなので、まだ要らない
- 加速度(Z軸)
どのように「見せるか」を決める
M5StackC Plusの液晶(125 x 240)は小さいので、表示方法を考えないといけません。
項目 | 数値必須 | 見やすくする必要性 |
---|---|---|
加速度 | None | 数値自体より、推移を見たい |
傾斜度 | None | 数値自体より、推移を見たい |
現在時刻 | Yes | なくてもいいけど… |
車速 | Yes | 汎用的に言えば、数字出しておけばいいのでは |
GPS:補足衛星数 | Yes | デバッグ的に見れれば良さそう |
GPS:ステータス | None | デバッグ的に見れれば良さそう |
グラフと数値の組み合わせで表現をすれば良さそうなので、一旦イメージを書き出してみます。
運転しながら見えるサイズなのかは少し疑問ですが、とりあえずは実装してみましょう。
実装する
M5Stackは、UIFlow/microPythonかArudino IDEで開発する必要があります。
今回はプログラミング知識が少なくてもできるように、UIFlowを使います。UIFlowは各ブロックを組み合わせてプログラミングできるツールです。ブラウザでのオンライン利用も可能なので、実機が無くても一部試してみることは可能です。
まずは、画面を設計します。
- 左側のハードウェア風の画像で、テキストボックス(Label)や線などを配置していきます。
- バーグラフは、線を位置を指定して再描画することで表現します。
- 水平儀の位置は、赤い色の円のオブジェクトを再描画して表現します。
次に、データを取得できるようにし、表示位置のラベルに記載するようにします。
- 定期的に更新されるように Timer オブジェクトを利用します。
- 電源を切りやすいように、AボタンにPowerOffを割り当てます。
できたものが以下のです。
ブロック構成で、日本語でアクションが書かれているので、プログラミングの知識が無くても理解できそう/作れそう ですね。
UIFlowで作ったものを、microPythonに変換することもできます。
但し、UIFlowとmicroPythonは交互に行き来はできない為、microPythonで修正を行うとUIFlowに反映することはできず、以降はmicroPythonで構築することになります。
試用する
センサやプログラムの設計はできたので、さっそく実車で使用してみます。
まずはバイク(V-TwinMagna)のETCカードホルダに乗せてみましたが、ちょっと水平が取れてないので修正が必要ですね。
あと、絶望的に見辛いです。表示面を運転者側に傾けても、結構距離があるので文字が小さいので見えません。
次に別のバイク(GROM)に乗せてみます。ETCアンテナベースをミラーステーに付け、そこに養生用のテープで巻きつけます。
これもやっぱり、見辛いですね。高さの関係で見えはするのですが、文字サイズ的に読み取るのは難しいですね。
(画像を拡大すると、表示されている部分が見えます)。。
視認性が悪いですね。ですが、動作は問題なく行われました(運転中に撮影はできないので画像はありません)。
改善案
実際に屋外で使ってみたことで、(分かってはいたけど)以下の問題が明確に判明しました
- 視認性の問題
- 設置角度が運転者方向に向いていないので、のぞき込む必要がある。
- 表示器を分離する必要がある。
- M5Stack自体を傾ける場合、内蔵センサの補正が必要で、制度が下がる。外付けの加速度センサで水平を出す必要がある。
- 輝度が足りず、日照下では見えない。
- 7Segment LEDなどを使うか、屋外用のディスプレイを使う必要がある = 表示器とセンサは分離する。
- 電子ペーパーなら視認性は良いが、紫外線耐久性や表示更新頻度で不安がある。
- 設置角度が運転者方向に向いていないので、のぞき込む必要がある。
- データ誤差があると推定される
- センサーを水平に保てていない場合、加速度等低く見積もられる = センサー設置時の水平確認
- データが記録できない
- MicroSD等が使えるものを使う
- エンジン情報が取れない
- CAN Busへのアクセスが必要 = 部品を買おう(売り切れ)
以上から、今後は以下のように更新していく予定です。
- 表示機能を別に用意する
- LEDテープや7Segment LEDの方が見やすいものもある
- センサーは内臓ではなく、別部品で用意する
- 設置自由度も上がる
- 記録媒体が使えるデバイスに置き換える
- M5StickC Plusではなく、M5Stack(Basic等)などのMicroSDが使える筐体を利用する
- Raspberry Piに乗り換える
- CAN Busに接続する
- バイクの診断ポートをOBD2変換し、OBD2経由でアクセスする
- 部品を買う
さいごに
こんな感じでプロトタイプ作って改善していくのは楽しいですね。
思い付きを形にすることが最近は簡単にできるので、やってみましょう!
- M5Stackは簡単にプログラムできるし、いろいろなセンサ(UNIT)がそろっているので、思い付きを形にしやすいですね!
弊社ではデバイスの開発をするプロジェクトもあり、おそらくこのように「やりたい事」「プロトタイプ」「改善」を回して開発をしていると思われます(私はそのようなプロジェクトにまだ参加していませんのですが…)。
ここまで読んだ方なら興味があると思いますので、ぜひ採用担当者等にご相談ください。関連する方を紹介してもらえるかもしれません。
参考リンク
- M5Stack
- https://m5stack.com/
- 用途に合わせて色々なシリーズがあります。
- 基本的にGPIOと表示系とボタンがあり、単体で活用しやすいモジュール構成になっています。
- プログラミングは、UIFlow/MicroPythonかArudinoのものを利用します。
- 同様なものに micro:bit - https://microbit.org/ja/ があります。
- https://m5stack.com/
- UIFlow
- https://m5stack.com/uiflow
Get Started FREE
ボタンから試すことができます。APIキー
は指定せず、Device:
は適当なものを指定すれば使えます。
- https://m5stack.com/uiflow
- CAN Bus
- O’REILLYの「カーハッカーズ・ハンドブック –車載システムの仕組み・分析・セキュリティ–」辺りが参考になります。
- 売っている店
- ホンダ