スタンプ型デバイス(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キーとして割り当てる
#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より簡潔で分かりやすい
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を実行して動作確認する
入力の仕方を変えてみた
— ゆーま (@sagirin262) August 27, 2020
(動作は変わらん) pic.twitter.com/evJZxJCd0E
4.HoloLens2にビルド
まずHoloLens2とデバイスをBluetoothで接続する(ここが本命)
接続を確認!!
あとはアプリケーションをビルドして完了!!
実行例
こいつ,HoloLens2でも使えるぞ😋😋😋#HoloLens2 #M5StickC #Unity #ArduinoIDE pic.twitter.com/OjEc5wD6Cw
— ゆーま (@sagirin262) August 27, 2020
あとがき
念願のHoloLens2と連携することが出来た😆😆😆
使えるとなったら後はいろいろ活用していくだけです!!
もしアイデアとかあったらいただけるとありがたいです.
今後の方針🤔
位置の取得が課題となっている
・デバイス自体をマーカーとして認識させる(Vuforia)
・ワイヤレスキーボードではなくワイヤレスマウスとして実装する(相対位置になるが)
・特定範囲内で赤外認識(あんまり意味ない)
参考
・M5StickC
ESP32をBluetoothキーボードやマウスにする
Keyboard (Arduino用のコード使い方)
1から自作キーボードを作ってみた
KeyboardModifiers
・Input
UnityのInputで入力を扱う
Author And Source
この問題について(スタンプ型デバイス(4) ~今度こそHoloLens2とBluetoothで通信~), 我々は、より多くの情報をここで見つけました https://qiita.com/t21m092/items/7ccf437b561199c0d42a著者帰属:元の著者の情報は、元のURLに含まれています。著作権は原作者に属する。
Content is automatically searched and collected through network algorithms . If there is a violation . Please contact us . We will adjust (correct author information ,or delete content ) as soon as possible .