
前回はBluetoothキーボードライブラリを使ってM5StackをBluetoothキーボード化してみた。今回は同じ開発者が提供しているBluetoothマウスライブラリを使って、Bluetoothマウス化してみる。
https://github.com/T-vK/ESP32-BLE-Mouse
Zip形式でライブラリを追加しておく。
マウスの操作方法はジョイスティックを使う等色々考えられるが、今回はMPU9250のジャイロセンサーを使用する。I2C接続で繋いでおく。

M5Stackの種類によってはジャイロセンサー内蔵タイプもあるので、そういったモデルであれば完全にM5Stack単体で済む。M5Stackの種類については下記サイトが分かり易くまとめられている。
スケッチは以下の通り。持ち方を考えて、M5Stackを上下逆にしている。ボタンCは左クリック、ボタンAは右クリック、ボタンBを押しながら傾けるとスクロールにしている。ジャイロセンサーもライブラリで簡単に使えるので、スケッチもこれだけで済む。
#define M5STACK_MPU9250 #include <M5Stack.h> #include <BleMouse.h> #define GYRO_CHECK_INTERVAL 10 #define GYRO_CHECK_INTERVAL_WHEEL 30 BleMouse bleMouse("M5 GyroMouse"); bool blestate = false; bool wheelmode = false; int gyrointerval = GYRO_CHECK_INTERVAL; signed char mousex, mousey, mwheel; int ipitch, iroll, iyaw; float pitch, roll, yaw; char chbuff[32]; unsigned long current_millis, last_millis = 0; void showstate(char *txt) { M5.Lcd.setCursor(0, 120); M5.Lcd.fillRect(0, 120, 320, 20, BLACK); M5.Lcd.printf(txt); } void showgyro(char *txt) { M5.Lcd.setCursor(0, 140); M5.Lcd.printf(txt); } void setup() { M5.begin(); M5.Power.begin(); bleMouse.begin(); M5.Lcd.clear(BLACK); M5.Lcd.setRotation(3); M5.Lcd.setTextSize(2); M5.Lcd.println("Gyro Mouse"); M5.Lcd.println("C: Left"); M5.Lcd.println("B: Wheel (Hold)"); M5.Lcd.println("A: Right"); showstate("Disconnected"); M5.IMU.Init(); } void loop() { M5.update(); current_millis = millis(); if (bleMouse.isConnected()) { if (!blestate) { blestate = true; showstate("Connected"); } if (current_millis - last_millis > gyrointerval) { M5.IMU.getAhrsData(&pitch, &roll, &yaw); sprintf(chbuff, "%.1f %.1f %.1f ", pitch, roll, yaw); ipitch = (int)pitch; iroll = (int)roll; iyaw = (int)yaw; showgyro(chbuff); if (wheelmode) { mousex = 0; mousey = 0; if (abs(ipitch) >= 10) mwheel = (signed char)(ipitch / 10); } else { mousex = (signed char)((iroll < 0 ? min(0, iroll + 10) : max(0, iroll - 10)) / 10); mousey = -1 * (signed char)((ipitch < 0 ? min(0, ipitch + 10) : max(0, ipitch - 10)) / 10); mwheel = 0; } bleMouse.move(mousex, mousey, mwheel); last_millis = current_millis; } if (M5.BtnA.wasPressed()) { bleMouse.press(MOUSE_RIGHT); } else if (M5.BtnA.wasReleased()) { bleMouse.release(MOUSE_RIGHT); } else if (M5.BtnB.wasPressed()) { wheelmode = true; gyrointerval = GYRO_CHECK_INTERVAL_WHEEL; } else if (M5.BtnB.wasReleased()) { wheelmode = false; gyrointerval = GYRO_CHECK_INTERVAL; } else if (M5.BtnC.wasPressed()) { bleMouse.press(MOUSE_LEFT); } else if (M5.BtnC.wasReleased()) { bleMouse.release(MOUSE_LEFT); } } else { if (blestate) { blestate = false; showstate("Disconnected"); } } }
PCとペアリングして操作した様子を動画に撮ってみた。GPD MicroPCとペアリングしようとしてみたが、なぜかこちらは上手くペアリングできなかった。
This post is also available in: 英語