
電子回路のクルマネタもだんだん無くなってきて、少し暇をしていたので、昔買った「9軸センサモジュール」を使って、姿勢を表示するアプリを作って遊んでみました。完成品はこんな感じです。
9軸センサモジュールで取得した加速度やジャイロのデータをPICマイコンで受信し、そのデータを回路内のBluetoothモジュールからiOS端末、今回はiPadへ送信します。受信したデータは自作のiPadアプリで計算・加工し、回路の向きを模した3Dグラフィックや、回転速度データ、加速度データを表示します。こういった流れで動作するシステムです。
回路構成はこんな感じです。PICマイコンがすべての制御を担い、9軸センサーとはI2C通信で、BluetoothモジュールとはUART通信でデータをやり取りしています。
一見複雑そうに見えますが、回路中にはデバッグ中に値を確認するためにパソコンとつなぐUSBシリアルや、PICの書き込み用ポートも用意しています。実際に完成品として作り込むなら、もっとシンプルな構成にできそうです。
今回使った各モジュール類は、すべて家にあった在庫品です。どれも10年近く前の古いモジュールばかりです。
例えば、9軸センサモジュールは2018年製で、この機種はすでに販売終了しています。Bluetoothモジュールも2019年製で、すでに後継機種が出ています。今回はお遊びなのでこれで十分ですが、実際に車両へ取り付けて継続的に使いたくなったら、最新のモジュールを使って作り直してみようと思います。
【9軸モジュール】
Bosch製のBMX055を使用しました。
9軸、つまり加速度3軸、ジャイロ3軸、磁気コンパス3軸のデータを取得できるモジュールです。
本来は、この3種類の3軸データを厳密に計算することで、そのときの姿勢や向きをより正確に取得できます。具体的には、磁気コンパスのデータも使用し、クォータニオンなどを用いてセンサーフュージョンを行うことで計算できます。
ただし、磁気コンパスはキャリブレーションが面倒なので、今回は使用しませんでした。今回は加速度とジャイロの2つを使って向きを計算しています。そのため、ヨー方向、つまり上方向を軸とした回転については固定表示とし、常に一定方向を向いています。
通信にはI2Cを使用し、マイコンとデータの送受信を行っています。
【Bluetoothモジュール】
Microchip製のRN4020というBluetooth Low Energy、BLE通信モジュールを使用しました。
このモジュールを使うことで、iPhoneやiPadと無線通信でデータを送受信できます。
UARTやI2Cが搭載されており、マイコンとの相性も良いです。このモジュールはすでに生産がされておらず後継機種としてRN4870などが出ています。設定は少々複雑ですが、覚えてしまえば応用の幅が広く、個人的には好みのモジュールです。
【PICマイコン】
Microchip製の16ビットマイコン、PIC24FJ64GA002を使用しています。
これもかなり古いマイコンです。後継機種も出ていますが、現在でも普通に流通しており、まだ現役で使えるマイコンです。在庫に32ビットマイコンもありますが、この程度であればオーバースペックかな?
RAMは8KBあり、メモリ領域に余裕があるのでかなり扱いやすいです。また、16ビットマイコンなので、演算も8ビットPICより素直に扱えます。
最近はあまり大掛かりな回路を作らず、スペースの都合もあって8ビットの小さいマイコンばかり使っていますが、たまにこういった16ビットPICを使うと、性能も高く使い勝手が良いと感じます。
これらのモジュールやマイコンを使って、Bluetooth経由でiOS端末へ向けて生データを送信します。
iPhoneやiPadで動くiOSアプリはいつものように、Mac環境のXcodeを使い、Swift言語で作成しました。今回は久しぶりのアプリ制作だったので、ちょっと本気でアプリを作ってみました。
まず、アプリ側のボタンを押して、回路とのBluetooth接続を確立します。接続に成功すると、回路側から0.1秒ごとに加速度とジャイロのデータが連続して送信されてきます。
送信されるデータは、9軸モジュールから取得した12バイトの生データです。今回は16ビットのマイコンを使っているので、姿勢の計算自体はマイコン側でも可能です。
ただ、iPhoneやiPadで計算したほうが圧倒的に速く、またBluetooth通信に大きなデータを乗せたくないため、複雑な計算はすべてiPad側で行っています。
メインのViewでは、姿勢を表すグラフィックや各種数値データが送られてきたタイミングの0.1秒ごとに更新されるようにしました。
【姿勢表示】
動きの3Dモデルはフリー素材使っています。この手の表示は飛行機がはまります。
回路には9軸センサーが取り付けられているため、回路を動かすと、それに合わせてグラフィックも同じ向きに回転します。加速度センサーは各軸にかかる重力の強さを検出するため、この動きは加速度データを使って計算しています。
今回は磁気コンパスを使っていないので、動きはロールとピッチのみです。ヨー方向は固定表示としています。
これで、コーナリング時にクルマが左右に傾いた際のロール値や、ブレーキ・加速時に変化するピッチ値が見えることに期待しています。
【ジャイロ】
ジャイロでは、回転速度のデータを取得できます。
gxのデータがロール方向の回転速度、gyがピッチ方向の回転速度、gzがヨー方向の回転速度を表しています。正負の値があるため、棒グラフでその強さを表示しています。単位は1秒あたりの角度です。
これで、コーナリング時のロールの速さや、ブレーキ・加速時のピッチの速さが数値として見えることに期待しています。
【回転強度】
回転速度は3軸に分かれているため、それらを合成して1つの数値として表示しています。
これにより、その瞬間にクルマへかかっている回転速度の大きさが分かります。言い換えれば、クルマにかかっている力の大きさのような指標として見られないかと期待しています。
手元に置いておもちゃとして遊ぶのも楽しそうですが、これを実際にクルマへ取り付けて試してみます。
おそらく「あっ、そう。」という感想だけで終わる可能性は高いです。
今回は久しぶりに、回路制作からiOSアプリ作成まで一通り行ったので、かなり自己満足しています。
もし実用性がありそうならiPadではさすがに少し大きいので、iPhoneアプリとして作り直そうと思います。
ブログ一覧 |
電子回路 | 趣味
Posted at
2026/05/01 07:58:09