🖱️

BLEマウスをつくって、iPadを制御しよう

2022/05/05に公開

ESP32を使って、BLEマウスを作りました。
iPadを制御します↓。

https://twitter.com/tw_kotatu/status/1522004404442103809

  • カーソルの移動
  • スクロール

関連記事

https://zenn.dev/kotaproj/articles/esp32_keyborad

↑以前作成したbleキーボートと技術的にはほぼ共通です。
マウス部分のみ記載します。

仕様検討

以下としました。

デバイス 動作 iPad側への送信
🕹ジョイスティック ←/→/↑/↓操作 マウスカーソルの移動
🕹スイッチ1 プッシュ/リリース マウス-左ボタン
スイッチ2 プッシュ/リリース マウス-右ボタン
スイッチ3 押下 スクロール UP
スイッチ4 押下 スクロール DOWN

🔧パーツ一覧

機材名 備考
ESP32評価ボード ESP32-WROVER 開発ボード/ESP32-WROOM 開発ボードのどちらでも可
🕹ボード ジョイスティックおよびスイッチセット - Amazonで購入
タクトスイッチ 3つ使用

接続図

MPU側でプルアップ設定を行うため、抵抗は不要です。

💻環境

VScode - PlatformIOを使用します。
PlatformaIOの環境構築は、↓にまとめておきました。

https://zenn.dev/kotaproj/articles/esp32_vscode_pio

ライブラリ - ESP32 BLE Mouse

ESP32をBLEキーボードにするために、下記のライブラリを使用します。

https://github.com/T-vK/ESP32-BLE-Mouse

インストール手順は、以下となります。

  • PlatformIO - Librariesを選択し、ESP32-BLE-Mouseを検索
  • ESP32-BLE-Keyboardを選択
  • "Add to Project"を選択
  • プロジェクトを指定 - 今回は、"esp32_mouse"というプロジェクトを指定
  • "Add"を選択
  • platformio.iniに下記が追加される

lib_deps = t-vk/ESP32 BLE Mouse@^0.3.1

これで、インクルードできるようになります。

#include <BleMouse.h>

📝手順

以下を記載します。

  • 筐体の作成
  • ソフト設計/コード

筐体の作成

3Dプリンタで筐体を作成しました。
親指で、🕹を制御できるように上に配置しました。
スイッチは、側面に配置しました。

https://zenn.dev/kotaproj/articles/a70464d8cd3540

ソフト設計/コード

以前作成したBleキーボードのプロジェクトをベースに作成しました。
FreeRTOSを使用しています。

タスク構成

タスク名 役割
スイッチ監視タイマー スイッチのDOWN/UPの変化を監視する
ジョイスティック監視タイマー ジョイスティックの変化を監視する
メッセージ管理タスク スイッチ/ジョイスティックのイベントをキーボード管理に通知
マウス管理タスク メッセージ管理から受けたイベントをBleマウス制御を送信

コード関連

コード自体は、githubにアップしてあります。
ポイントを記載します。

bleマウスライブラリ

初期化は以下のように行います。

#include <BleMouse.h>

static BleMouse s_xBleMouse;

s_xBleMouse.begin();

beginの後で、ペアリングできる状態になります。
iPadからペアリングを実施できます。

接続しているかどうかは以下で判定できます。

if (s_xBleMouse.isConnected())
{
    // !!!接続中!!!
}

マウスコマンドを送信する場合は、以下となります。

// 左ボタンクリック
s_xBleMouse.click(MOUSE_LEFT);

// 左ボタンマウスダウン
s_xBleMouse.press(MOUSE_LEFT);

// 左ボタンマウスアップ
s_xBleMouse.release(MOUSE_LEFT);

// カーソル移動 x:+10, y:+20
s_xBleMouse.move(10, 20, pxMessage->wheel, pxMessage->hWheel);

// ホイールの回転
s_xBleMouse.move(0, 0, 10, 10);

ホイールの補足です。
iPadに対してホイールを送信する場合、時間をあけて連続で送る必要があります。
以下が例です。

int32_t max_count = 30;
int8_t step = 1;    // +:正方向, -:逆方向

for (int32_t i = 0; i < max_count; i++)
{
    s_xBleMouse.move(0, 0, step, step);
    delay(5);
}

ジョイスティックおよびスイッチの監視は、前記事を参照願います。

コード全体

https://github.com/kotaproj/esp32_mouse

さいごに

キーボードにつづき、マウスも作ることができました。
コードには、ロータリーエンコーダの処理もありますが、
物理的に搭載するのが大変だったので諦めました。
趣味と実用が一緒になるのは、楽しいです。

参考URL

https://www.freertos.org/

https://github.com/T-vK/ESP32-BLE-Mouse

GitHubで編集を提案

Discussion