Upgrade to Pro — share decks privately, control downloads, hide ads and more …

M5Stack CoreS3のIMUセンサーでPCマウ スを動かす

Sponsored · Ship Features Fearlessly Turn features on and off without deploys. Used by thousands of Ruby developers. →

M5Stack CoreS3のIMUセンサーでPCマウ スを動かす

M5Stack CoreS3のIMUセンサーでPCマウスを動かす
//localboast Tokyo
https://localboast-tokyo.connpass.com/event/406024/

Avatar for tomokusaba

tomokusaba PRO

November 04, 2026

More Decks by tomokusaba

Other Decks in Technology

Transcript

  1. はじめに:ジャイロセンサーを使った空中 操作への挑戦 • 背景として、通常のマウス操作は身体的に困難な方でもまた違った形では操 作可能になる可能性があります。 • そうしたことへ対応するため、汎用的なIoT機器であるM5Stackを使って 実現可能であるかどうかの検証です。 • 課題:

    加速度計の値から直接角度を計算してカーソルに変換しようとすると、 思ったように動きませんでした。 • 解決策: 「持ち替え」や「手首のひねり」があってもカーソルが自然に追従する よう、ジャイロ(角速度)を主体とした独自の信号処理を構築しました。
  2. 操作の基本:CoreS3の「持ち方」とカーソ ル方向の対応 • 持ち方: 画面を上向きにし、先端(+Y方向)をPCへ向ける「テレビ のリモコン」のような持ち方を想定しています。 動作 ジャイロの符号 カーソル 先端を右へ旋回

    gz < 0 右(X+) 先端を左へ旋回 gz > 0 左(X-) 先端を上げる gx > 0 上(Y-) 先端を下げる gx < 0 下(Y+) 先端方向を軸にひねる gy のみ 移動なし 傾けたまま静止 バイアス補正後ゼロ 停止
  3. センサーが表すもの:回転・重力・方位 ジャイロ ◎ 採用 加速度計 ◦ 補助 速く回す 地磁気センサー ×

    未使用 支持力(上向き) =大きい値 ω N 磁北を CoreS3 指す 重力(下向き) 測るもの:回転の速さ(角速度 °/秒) 意味:向きが「どれだけ速く変わってい るか」。止まれば0 本実装:カーソルの移動速度を作る(主 役) 測るもの:重力を含む加速度(g) 意味:静止時は上向きの支持力。「どち らが上か」が分かる 本実装:姿勢の基準と静止判定のみ 測るもの:地球の磁場(μT) 意味:磁北の向き。水平面での「方位」 が分かる 本実装:画面のMAG表示のみ。カーソ ルには不使用
  4. センサーの種類と使い分け:失敗した取り 方と成功した取り方 加速度計 重力を含む加速度(上向きの支持力)を測る ジャイロ 回転の速さ=角速度(°/秒)を測る ✕ うまくいかなかった取り方 ◦ うまくいった取り方

    取り方:加速度の値から直接角度を計算し、 カーソルへ変換 速度:ジャイロ(角速度)からカーソルの移動 速度を作る 結果:思ったように動かなかった 加速度の役割:姿勢の基準と静止判定だけに使 う 理由:加速度は重力方向しか分からず、持ち替 え・ひねり・振りで値が乱れる 結果:持ち替えや手首のひねりでも自然に追従
  5. CoreS3のセンサー構成:BMI270のど の値を採用したか ジャイロ BMI270内蔵 加速度計 BMI270内蔵 地磁気センサー BMM150 3軸・16bit 測定範囲

    ±125〜±2000 °/s 出力レート 25 Hz〜6.4 kHz ◎ 採用(主役) 3軸・16bit 測定範囲 ±2/4/8/16 g 出力レート 0.78 Hz〜1.6 kHz ◦ 補助的に採用 3軸の地磁気センサー(BMM150)。傾き補償し た磁気方位を計算し、画面のMAG表示に使用 カーソル計算には入力しない(別経路) gz→左右、gx→上下の移動速度に 変換(400Hzで取得) 姿勢の基準(up方向)と静止判定の み。角度の積分は不使用 × カーソルには未使用 表示専用。絶対方位は不要 出典:M5Stack公式ドキュメント(CoreS3)、Bosch Sensortec BMI270データシート、m5stack-ble-mouse解説記事
  6. 静止判定の条件 判定 定数 既定値 意味 最短時間 kCalibrationDurationUs 1000000 (1秒) この時間が経つまで確定しない

    最小サンプル数 kCalibrationSamples 400 400 サンプル集めるまで確定 しない 角速度上限 kCalibrationMaxRateDps 5.0°/秒 これを超えたら静止していない と判断
  7. 姿勢補正の実装:手首のロール(ひねり)を 吸収する仕組み • 支持力の活用: 加速度計が測る上向きの支持力をupベクトルとし て扱います。 • 射影による補正: 角速度を「現在の姿勢でのup成分(yaw)」と 「right成分(pitch)」へ射影します。

    • 効果: 手首をひねった状態(ロール)でも、左右への旋回は横移動、 上下への振る舞いは縦移動として保たれます。 • フォールバック: 大きく振るなどして重力が信頼できない状態に なった場合は、補正を一時停止して本体軸に逃がします。
  8. HIDレポート化:小数の移動量を捨てずに ±127の制限を守る • 課題: BLE HIDマウスとして1回に送信できる移動量は signed char の範囲(±127)に制限されます。 •

    解決策 • 信号処理で得た移動量を浮動小数点数として蓄積します。 • 送信時(約8ms間隔)には、整数部分のみを±127に制限して取り出しま す。 • 取り出しきれなかった端数(小数)や、±127を超過した分は捨てずに次 回へ持ち越します。
  9. UXの統合:タッチ操作やシェイクとの自然 な共存と排他制御 • 基本方針: 「画面に触れている間」や「仮想ボタンを押している間」 は空中マウスの移動を停止します。 • シェイクでオン/オフ: 本体を強く短く振る(3.0g以上を連続検 出)と、空中操作の一時停止・再開を切り替えられます。

    操作 動作 1本指でなぞる カーソル移動 1本指タップ / 長押し 左クリック / 右クリック 2本指タップ / 上下になぞる 右クリック / ホイールスクロール HOLD / DRAG トグル 左ボタン固定のオン/オフ(空中ドラッグ用)
  10. PyCon mini Tokyo with PythonAsia conference 日本とアジアのPythonコミュニティが交流する1日 2026/12/12(土) 10:00〜19:00 会場

    日本語・英語の2トラック GMO Yours・フクラス 渋谷フクラス16階 基調講演 Seth Larson / Mike Fiedler (Python Software Foundation) 一般 1,500円 学生 500円 パトロン 10,000円 参加登録はconnpassへ(事前決済) pyconjp.connpass.com/event/404336/
  11. 開催日のお知らせ PyCon mini Shizuoka 2027 2027/2/27(土) 会場 B-nest & 静岡市コクリ

    前回と同じ会場です。ぜひ予定の確保をお願いします! #pyconshizu 2027でお会いしましょう! 参加・プロポーザル・スポンサーの募集は追って告知します。 pycon-shizu.connpass.com/event/409477/ 詳細はconnpassへ