Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
9
Help us understand the problem. What is going on with this article?
@norikawamura

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

More than 1 year has passed since last update.

はじめに

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

最後に

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

9
Help us understand the problem. What is going on with this article?
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.
Sign Up
If you already have a Qiita account Login
9
Help us understand the problem. What is going on with this article?