LoginSignup
3
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-08-27

まえがき

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

本題

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

機器概要

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

手順

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

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

Arduino IDEを開き,スケッチ/ライプラリをインクルード/.zip形式のライプラリをインストール... からDLしたファイルをインストールする
image.png
ワイヤレスキーボードとしてのプログラムを作成する
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をアタッチ
image.png

3.PCで実行確認

PCとデバイスをBluetoothで接続する
設定/Bluetoothとその他のデバイスで接続を確認
image.png
UnityでDemoを実行して動作確認する

4.HoloLens2にビルド

まずHoloLens2とデバイスをBluetoothで接続する(ここが本命)
接続を確認!!
HoloLens2_Bluetooth.jpg
あとはアプリケーションをビルドして完了!!

実行例

あとがき

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

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

参考

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

3
1
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
3
1