12
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-13

#はじめに
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を再起動してから再接続するとうまくいくことが多いようです。

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

12
15
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
12
15

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?