※動画の埋め込みがわからず、いちいちリンク飛ぶ必要があり、なかなか見ずらくなってしまっています。いつか改善します。
Body Interface
2023年4月から取り組んでいるプロジェクトです。 “全身デバイス”を実現するため段階的に様々な機能を試していきます。
各章のタイトル下にリポジトリのリンクが張ってあります。
1.手でスライド送り
初めに作成しようとしたのが、”指パッチンでスライドを送る”デバイスです。
指っパッチンをトリガーにするため、勢いでボタン押下、パッチンの音、などを考えましたが、指パッチンのメカニズムを調べてみると、指先や手の腹にモノを入れてしまうとうまく音が出ないとのことでした。よってパッチンではなく、ジェスチャーをトリガーにしようと考えました。
ジェスチャーでやるにしても、手段はいくつかあります。まず思いつくのは「モーキャプ」でしょう。しかし私が目指す(好きな)のはウェアラブル。
よってとりあえず「加速度センサ」を使うことにしました。
では次、いかにしてスライドを送りましょう。単純ですが、思いつくのは「キーボード」でした。調べてみると、[ESP32 BLE keyboard.h]なるライブラリがあるではありませんか。
よって使うマイコンはESP32です。
ESP32でIMUを使いウェアラブルにしたい。
このすべてを解決してくれるものがありました。(持っていた)
M5Stick C Plusです。
そこで数日掛けカタカタ打ちまくった結果…..
できました。
少し見栄えは悪いですが、初号機、プロトタイプとしては十分でしょう。
- 機能
ボタンを押している間に手を振ると ←/→ のキーコードを送信する。
で、これにショートカットキーなどいろいろ追加してUIとかもいろいろやったのがこれ
- 機能
4つのモードを設定 (Presentation,Browsing,Media,Selectable) 各モードでそれぞれ扱うキーやショートカットが異なる Selectableモードでは (プリセットの中から使えるキーを選択可能)
Presentation | Browsing | Media | Selectable | |
---|---|---|---|---|
ボタン1 + 振り | 方向キー←/→ | 方向キー↑/↓ | トラック送り/戻し | 方向キー←/→ |
ボタン2 + 振り | ウィンドウ遷移 | ブラウザ進む/戻る | 音量大/小 | ブラウザ進む/戻る |
ボタン1 + ボタン2 | 再生/停止 | F5キー | 再生/停止 | Selectable |
動画は末尾にあります。
2.手でマウス操作
BLE keyboard.h なるライブラリの作者が BLE mouse.h なるライブラリをも紹介していたので次はマウス。
1で作った方は、ジェスチャーなのでなんとなくで動き判定を行っていましたが、さすがにマウスとなると、x軸方向y軸方向のカーソル移動を分ける必要があるのでもう少し厳密に加速度センサを扱わなければなりませんね。
そこで観察してみました。
航空学科じゃないので詳しくなかったのですが、色々調べながらやったところ
という数式によって得られるそうでこいつらの値と、軸速度gyro_nもとってくると…
水平で固定上下/左右 |
右ひねりで固定上下/左右 |
|
---|---|---|
roll | 0 | ~-60,60~ |
pitch | 0 | 0 |
yaw | 0 | ~-60,60~ |
gyroX | -200~200/-100~100 |
0/-200~200 |
gyroY | -100~100/0 |
0/0 |
gyroZ | -200~200/0 |
-200~200/0 |
と分かった。よってこれらの値を用いてマウスカーソルのピクセル移動を、以下の式で導出した。
(本来はsinΘ,cosΘを使いたかったが、処理に時間がかかるとのことで、2次と3次の近似式で代用している。)
※(Gx,Gz)=(gyroX,gyroZ)
それらを実装したものがこちら。
- 機能
マウスの基本機能(カーソル移動、右左中央クリック、ドラッグ、スクロール)が全てできる。
ボタン1+振り | ボタン2 | ボタン1+2+振り | |
---|---|---|---|
水平 | カーソル移動 | 左クリック | ドラッグ |
右ひねり | スクロール | 右クリック | 中央ボタン+移動 |
動画
動画1
雑に撮った動画です。(YouTube)
動画2
※これを技育博で展示した。その時の紹介動画。(Twitter)
技育博展示 資料と様子