スタンプ型デバイス(4) ~今度こそHoloLens2とBluetoothで通信~


まえがき

前回はシリアル通信がうまくいかずに失敗した.
かなり悩んだ末に,新たな手法を試すことにした.

本題

HoloLens2のBluetooth接続はワイヤレスマウス,ワイヤレスキーボードを主にサポートしている.
前回のまとめから,デバイスを一種のキーボードとして認識させてはどうだろうかという考えに至った.
現在位置の取得はいったん保留として入力デバイスとして機能させることを優先する.

機器概要

・Windows10 Laptop
・Unity 2019.3.2f1
・HoloLens2
・Arduino IDE
・Visual Stadio 2019
・スタンプ型デバイス(M5StickC)

手順

1.デバイス側のプログラム作成

ワイヤレスキーボードとして機能させるためのライプラリを作成してくださっている方がいるので,利用させていただく
このリンクからライプラリをZIP形式でDLする

Arduino IDEを開き,スケッチ/ライプラリをインクルード/.zip形式のライプラリをインストール... からDLしたファイルをインストールする

ワイヤレスキーボードとしてのプログラムを作成する
ON/OFFスイッチをCtrlキーとして割り当てる

BleKeyboard.ino
#include <M5StickC.h>
#include <BleKeyboard.h>

BleKeyboard bleKeyboard;
const int buttonA = 26; //pinの番号
String chipname = "Stamp";
char Key = KEY_LEFT_CTRL; //Ctrlキー

void set(){
  M5.begin();
  Serial.begin(115200);
  //画面表示
  M5.Lcd.setCursor(0*0, 0*0);
  M5.Lcd.setRotation(3);
  M5.Lcd.fillScreen(BLACK);
  M5.Lcd.printf("Bluetooth: %s\n", chipname);
  M5.Lcd.printf("Ver: %s %s\n", __DATE__, __TIME__);
  M5.Lcd.println();
  M5.Lcd.printf("State:");
  //pinの設定
  pinMode(buttonA,INPUT_PULLUP);  //指定のpinを入力に設定
  bleKeyboard.begin(); //Bluetooth接続を開始
}

void setup() {
  set();
}

void loop() {
   if( M5.Axp.GetBtnPress() == 2 ){  // 電源ボタンクリック
   bleKeyboard.end(); //Bluetooth接続を終了
   M5.Axp.DeepSleep(1000000); // 1秒スリープ(リセット)
   set();
  } 
  if (bleKeyboard.isConnected()) { //Bluetoothで接続できたら
    if(digitalRead(buttonA) == LOW){ //スイッチが押されたとき
      //Serial.println("ON "); //USBのポートに「ON」送信
      M5.Lcd.setCursor(8*5, 8*3); //本体画面のカーソルを調整
      M5.Lcd.printf("ON "); //本体画面に「ON」表示
      bleKeyboard.press(Key);  //Ctrlキーを押す
    }else{
      //Serial.println("OFF"); //USBのポートに「OFF」送信
      M5.Lcd.setCursor(8*5, 8*3); //本体画面のカーソルを調整
      M5.Lcd.printf("OFF"); //本体画面に「OFF」表示
      bleKeyboard.releaseAll(); //すべてのキーを離す
    }

   delay(100); //0.1s時間を空ける
   }
}

このプログラムでは前回と異なり,PCとデバイスで1対1の接続が確立される

2.Unity側のプログラム作成

今度は受信するためのプログラムを作成する
前回のscriptより簡潔で分かりやすい

ColorSwitch.cs
using UnityEngine;
using System.Collections;
using System.Collections.Generic;

public class ColorSwitch : MonoBehaviour
{
    int num = 0;
    public Material[] array = new Material[5]; //変化させる色の配列
    public GameObject obj; //色を変更するobject

    private void Update()
    {
        if (Input.GetKeyDown(KeyCode.LeftControl))  //Ctrlキーを押した瞬間に実行
        {
            //オブジェクトの色を用意したMaterialの色に変更する
            obj.GetComponent<Renderer>().material.color = array[num].color;
                num++;
                if(num > 4) num = 0;
        }
    }
}

空のGameObjectを作成し,Eventとして先ほどのscriptをアタッチする
適当にマテリアルを割り当てる
対象のobjectとしてCubeをアタッチ

3.PCで実行確認

PCとデバイスをBluetoothで接続する
設定/Bluetoothとその他のデバイスで接続を確認

UnityでDemoを実行して動作確認する

4.HoloLens2にビルド

まずHoloLens2とデバイスをBluetoothで接続する(ここが本命)
接続を確認!!

あとはアプリケーションをビルドして完了!!

実行例

あとがき

念願のHoloLens2と連携することが出来た😆😆😆
使えるとなったら後はいろいろ活用していくだけです!!
もしアイデアとかあったらいただけるとありがたいです.

今後の方針🤔
位置の取得が課題となっている
・デバイス自体をマーカーとして認識させる(Vuforia)
・ワイヤレスキーボードではなくワイヤレスマウスとして実装する(相対位置になるが)
・特定範囲内で赤外認識(あんまり意味ない)

参考

・M5StickC
ESP32をBluetoothキーボードやマウスにする
Keyboard (Arduino用のコード使い方)
1から自作キーボードを作ってみた
KeyboardModifiers
・Input
UnityのInputで入力を扱う