Help us understand the problem. What is going on with this article?

M5StickCでBluetooth接続のマウスを作成する

はじめに

M5StickCには加速度センサーが付いていて、傾きを検出できます。またボタンが2つでBluetooth接続ができるので、マウスを作成してみます。
※Arduino IDEでM5StickCの開発ができる環境は事前に作成しておく必要があります。
※「MPU6886」が搭載されているM5StickCを使用します。初期ロットは「SH200Q」とのことですが、
 恐らく「SH200I」のサンプルをベースにすれば同じことができると思います。

準備

①以下のサイトから「Bluetooth LE Mouse library for the ESP32」をZIPでダウンロードします。
https://github.com/T-vK/ESP32-BLE-Mouse
②「スケッチ」→「ライブラリをインクルード」→「.ZIP形式のライブラリをインストール...」でダウンロードしたZIPファイルを選択する。

①「スケッチ例」の「M5StickC」→「Basics」→「MPU6886」のサンプルをベースにします。
②別名で保存し、「ESP32 BLE Mouse」のライブラリをインクルードします。
③元のサンプルは加速度センサーの値を取得して表示するだけなので、ここにボタンの状態を取得してマウスの入力を送信する部分を追加します。

ソース

#include <BleConnectionStatus.h>
#include <BleMouse.h>

#include <M5StickC.h>

BleMouse bleMouse;
signed char mouse_x = 0;
signed char mouse_y = 0;
float mouse_min = 200;

float accX = 0;
float accY = 0;
float accZ = 0;

float gyroX = 0;
float gyroY = 0;
float gyroZ = 0;

float temp = 0;
void setup() {
  // put your setup code here, to run once:
  M5.begin();
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.setTextSize(1);
  M5.Lcd.setCursor(40, 0);
  M5.Lcd.println("BLE Mouse");
  //M5.Lcd.setCursor(0, 15);
  //M5.Lcd.println("  X       Y       Z");
  M5.MPU6886.Init();
  bleMouse.begin();
  while(bleMouse.isConnected() == false) {
    delay(100);
  }
}

void loop() {
  // put your main code here, to run repeatedly:
  //M5.MPU6886.getGyroData(&gyroX,&gyroY,&gyroZ);
  M5.MPU6886.getAccelData(&accX,&accY,&accZ);
  //M5.MPU6886.getTempData(&temp);

  //M5.Lcd.setCursor(0, 30);
  //M5.Lcd.printf("%.2f   %.2f   %.2f      ", gyroX, gyroY,gyroZ);
  //M5.Lcd.setCursor(140, 30);
  //M5.Lcd.print("o/s");
  //M5.Lcd.setCursor(0, 45);
  //M5.Lcd.printf("%.2f   %.2f   %.2f      ",accX * 1000,accY * 1000, accZ * 1000);
  //M5.Lcd.setCursor(140, 45);
  //M5.Lcd.print("mg");
  //M5.Lcd.setCursor(0, 60);
  //M5.Lcd.printf("Temperature : %.2f C", temp);

  M5.update();
  if(M5.BtnA.isPressed()){
    if(M5.BtnB.isPressed()){
      bleMouse.press(MOUSE_LEFT | MOUSE_RIGHT);
    }else{
      bleMouse.release(MOUSE_RIGHT);
      bleMouse.press(MOUSE_LEFT);
    }
  }else{
    if(M5.BtnB.isPressed()){
      bleMouse.release(MOUSE_LEFT);
      bleMouse.press(MOUSE_RIGHT);
    }else{
      bleMouse.release(MOUSE_LEFT | MOUSE_RIGHT);
    } 
  }

  mouse_x = 0;
  mouse_y = 0;
  if(accX * 1000 > mouse_min){
    mouse_x = -1 * (accX * 1000) / mouse_min;
  }
  if(accX * 1000 < mouse_min * -1){
    mouse_x = -1 * (accX * 1000) / mouse_min;
  }
  if(accY * 1000 > mouse_min){
    mouse_y = 1 * (accY * 1000) / mouse_min;
  }
  if(accY * 1000 < mouse_min * -1){
    mouse_y = 1 * (accY * 1000) / mouse_min;
  }

  bleMouse.move(mouse_x, mouse_y);

  //delay(50);
}

注意点

ペアリングがなかなかうまくいかないことがあります。
ペアリング後、一度M5StickCを再起動してから再接続するとうまくいくことが多いようです。

最後に

特にマウスカーソルを動かす部分はもう少し工夫が必要と思います。
とはいえ、パワポのページを進めるリモコンとかなら十分つかえそうな気がします。

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした