HOLOLEN2とIOTデバイスを接続する方法。

前回Arduinoを紹介しましたが、Arduinoボードには接続モジュール（Wifi、Bluetooth）が付いていません。従いまして外部の接続を設定しなければなりません。例えば：Bluetoothモジュール HC-05、HC-06です。今回はESP32というボードでの接続方法をご紹介したいと思います。

今回のデモはHoloLens2とESP32ボードを接続してHololens２でLEDをON/OFFするようにご紹介します。

![HoloLen2とIoTデバイスを接続する方法。](https://onetech.jp/wp-content/uploads/2021/03/20.Final-IoT-Device-Control-Led-HoloLens.jpg)

##M5StickCとは
M5StickCはM5という会社が発売したIoTデバイスです。基本的にはESP32-PicoボードとIMUユニットとバッテリーと液晶画面を全部小さなデバイスに入れています。

開発フラットフォームはArduino、Micropython、UIFlowです。

今回Arduinoフラットフォームでの開発を紹介します。

Arduinoのインストール方法は下記のURLを参照ください。

 [https://onetech.jp/blog/unityでのarduino開発入門-6473](https://onetech.jp/blog/unityでのarduino開発入門-6473)

M5ライブラリをArduinoにインストールする方法

インストールしたArduinoを開く。

ファイル➞環境設定を選択する。

![M5ライブラリをArduinoにインストールする方法](https://onetech.jp/wp-content/uploads/2021/03/1.M5%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92Arduino%E3%81%AB%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B%E6%96%B9%E6%B3%95.jpg)

下記のURLを「追加のボートマネージャーのURL」に貼り付ける。

[https://dl.espressif.com/dl/package_esp32_index.json](https://dl.espressif.com/dl/package_esp32_index.json)

![下記のURLを「追加のボートマネージャーのURL」に貼り付ける。](https://onetech.jp/wp-content/uploads/2021/03/2.%E4%B8%8B%E8%A8%98%E3%81%AEURL%E3%82%92%E3%80%8C%E8%BF%BD%E5%8A%A0%E3%81%AE%E3%83%9C%E3%83%BC%E3%83%88%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%83%BC%E3%81%AEURL%E3%80%8D%E3%81%AB%E8%B2%BC%E3%82%8A%E4%BB%98%E3%81%91%E3%82%8B%E3%80%82.jpg)

次に、タスクバーからツール➞ボード➞ボードマネージャを選択する。

![ボードマネージャを選択する](https://onetech.jp/wp-content/uploads/2021/03/3.%E3%83%9C%E3%83%BC%E3%83%89%E3%83%9E%E3%83%8D%E3%83%BC%E3%82%B8%E3%83%A3%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B.jpg)

検索フィールドで「esp32」を検索してesp32ボードをインストールする。

![esp32ボードをインストールする](https://onetech.jp/wp-content/uploads/2021/03/4.esp32%E3%83%9C%E3%83%BC%E3%83%89%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B.jpg)

インストールできたら、ツール➞ボード➞M5Stick-Cを選択する。


![M5Stick-Cを選択する](https://onetech.jp/wp-content/uploads/2021/03/5.M5Stick-C%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B.jpg)

現在、M5Stick-Cのボードはインストール完了となりましたが、コードが書けません。

ライブラリをまだインストールしていないため、M5Stick-Cのライブラリをインストールしましょう。

 

タスクバーにスケッチ➞ライブラリをインクルード➞ライブラリを管理を選択する。

![ライブラリを管理を選択する](https://onetech.jp/wp-content/uploads/2021/03/6.%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E7%AE%A1%E7%90%86%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B.jpg)

ライブラリマネージャが表示され[m5stickc]で検索して「M5StickC」をインストールする。

![で検索して「M5StickC」をインストールする](https://onetech.jp/wp-content/uploads/2021/03/7.%E3%81%A7%E6%A4%9C%E7%B4%A2%E3%81%97%E3%81%A6%E3%80%8CM5StickC%E3%80%8D%E3%82%92%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%99%E3%82%8B.jpg)

現在、M5StickCの設定が完了しました。次はBluetoothとLEDのハンドルをご紹介いたします。

##次はLEDをM5StickCに設置する。
画像のように設置する。

LEDの短い方の足とGNDをつないで長い方の足とG26をつなぎます。

![次はLEDをM5StickCに設置する](https://onetech.jp/wp-content/uploads/2021/03/8.%E6%AC%A1%E3%81%AFLED%E3%82%92M5StickC%E3%81%AB%E8%A8%AD%E7%BD%AE%E3%81%99%E3%82%8B-e1616050664316.jpg)

##M5StickCプログラミング
PCとつないでコードを書きましょう。

![PCとつないでコードを書きましょう](https://onetech.jp/wp-content/uploads/2021/03/9.PC%E3%81%A8%E3%81%A4%E3%81%AA%E3%81%84%E3%81%A7%E3%82%B3%E3%83%BC%E3%83%89%E3%82%92%E6%9B%B8%E3%81%8D%E3%81%BE%E3%81%97%E3%82%87%E3%81%86-e1616050675770.jpg)

```C#:conect_hololens
#include <M5StickC.h>
#include <BluetoothSerial.h>
int led = 26;　//LEDの長い方の足のアドレス
char message;　//Hololensからの取得するデータ
String sta = “”;　//LEDの状態
BluetoothSerial bluetooth; //Bluetooth作成
void setup()
{
M5.begin();　//M5Stickの機能を立ち上げる
bluetooth.begin(“M5Led”); //Bluetoothのデバイス名を作成
pinMode(led, OUTPUT); //OUTPUTモードをLEDに設定
M5.Lcd.setRotation(3); //M5Stickの画面の回転を水平方向に設定
M5.Lcd.fillScreen(BLACK); //画面の色を黒くする
M5.Lcd.setTextSize(1); //フォントのサイズ
M5.Lcd.setCursor(40, 0); //表示する座標値
M5.Lcd.println(“test”); //表示内容
} 

void loop()
{
M5.update(); //M5StickC更新
while(bluetooth.available())　//Bluetooth接続がアクティブな場合
{
message = bluetooth.read();　//Hololensのデータを取得
if (message == ‘1’)　//データは１の場合、LED ON
{
digitalWrite(led,HIGH); // LED ON
message = ‘2’; // 1回だけLED処理
sta = “ON”;
}
else if (message == ‘0’) //データは0の場合、LED OFF
{
digitalWrite(led,LOW); // LED OFF
message = ‘2’;　 // 1回だけLED処理
sta = “OFF”;
}
}
M5.Lcd.setCursor(40, 40);
M5.Lcd.println(sta);　//現在の状態を画面に表示する
}
```

コードが完了しましたら、接続しているポート名を選択する。

![接続しているポート名を選択する](https://onetech.jp/wp-content/uploads/2021/03/10.%E6%8E%A5%E7%B6%9A%E3%81%97%E3%81%A6%E3%81%84%E3%82%8B%E3%83%9D%E3%83%BC%E3%83%88%E5%90%8D%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B.jpg)

最後にアップロードボタンを押して完了です。

![最後にアップロードボタンを押して完了です](https://onetech.jp/wp-content/uploads/2021/03/11.%E6%9C%80%E5%BE%8C%E3%81%AB%E3%82%A2%E3%83%83%E3%83%97%E3%83%AD%E3%83%BC%E3%83%89%E3%83%9C%E3%82%BF%E3%83%B3%E3%82%92%E6%8A%BC%E3%81%97%E3%81%A6%E5%AE%8C%E4%BA%86%E3%81%A7%E3%81%99.jpg)

HoloLens2プロジェクト作成
UnityHubを開いて新しいプロジェクトを始めます。

![UnityHubを開いて新しいプロジェクトを始めます](https://onetech.jp/wp-content/uploads/2021/03/12.UnityHub%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6%E6%96%B0%E3%81%97%E3%81%84%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E5%A7%8B%E3%82%81%E3%81%BE%E3%81%99.jpg)

下記のURLを開いてMicrosoftのMRTKライブラリを全部ダウンロードする。

https://github.com/Microsoft/MixedRealityToolkit-Unity/releases

![下記のURLを開いてMicrosoftのMRTKライブラリを全部ダウンロードする](https://onetech.jp/wp-content/uploads/2021/03/13.%E4%B8%8B%E8%A8%98%E3%81%AEURL%E3%82%92%E9%96%8B%E3%81%84%E3%81%A6Microsoft%E3%81%AEMRTK%E3%83%A9%E3%82%A4%E3%83%96%E3%83%A9%E3%83%AA%E3%82%92%E5%85%A8%E9%83%A8%E3%83%80%E3%82%A6%E3%83%B3%E3%83%AD%E3%83%BC%E3%83%89%E3%81%99%E3%82%8B.jpg)

プロジェクト作成が終わったら、Assets→Import Package→Custom Packageを選択する。

ダウンロードしたMRTKライブラリファイルを全部インポートする必要があります。

![Custom-Packageを選択する](https://onetech.jp/wp-content/uploads/2021/03/14.Custom-Package%E3%82%92%E9%81%B8%E6%8A%9E%E3%81%99%E3%82%8B.jpg)

全部をインポートしたら「Mixed Reality Toolkit」というメニューが表示され、「Add to Scene and Configure…」を選択して自動でシーンにHoloLensの基本的なオブジェクトが追加されます。

![Add-to-Scene-and-Configure…](https://onetech.jp/wp-content/uploads/2021/03/15.Add-to-Scene-and-Configure%E2%80%A6.jpg)

HoloLens用のプロジェクトの設定が完了です。

Bluetoothで接続
次はIoTデバイスを接続する方法をご紹介したいと思います。
新しいC#ファイルを作成する。

下記のコードは接続の部分となります。

```C#:connectUWP
public async void connectUWP()
    {
#if !UNITY_EDITOR
        bool success = true; //接続の結果、デフォルト値はtrue
        var devices = await DeviceInformation.FindAllAsync(RfcommDeviceService.GetDeviceSelector(RfcommServiceId.SerialPort)); //ペアリング済のデバイスの一覧を取得
        foreach(var device in devices)
        {
            if (device != null)
            {
                var service = await RfcommDeviceService.FromIdAsync(device.Id);
                if (service != null && service.Device.Name == m_UWPDeviceName)　//もしデバイス一覧の中でM5StickCがある場合、下記の処理を行う。m_UWPDeviceNameはArduinoのbluetooth.begin(「名前」)です。
                {
                    await Windows.ApplicationModel.Core.CoreApplication.MainView.CoreWindow.Dispatcher.RunAsync(Windows.UI.Core.CoreDispatcherPriority.Normal,
                        async () =>
                        {
                            if (m_StreamSocket != null) //StreamSocketはオープンしている場合、廃棄する
                            {
                                m_StreamSocket.Dispose();
                            }
                            m_StreamSocket = new StreamSocket();　//新しいStreamSocketを作成する
                            try
                            {
                                await m_StreamSocket.ConnectAsync(service.ConnectionHostName, service.ConnectionServiceName, SocketProtectionLevel.BluetoothEncryptionAllowNullAuthentication);　//M5StickCと接続する
                            }
                            catch
                            {
                                success = false;　//接続はエラーの場合、状態変数はfalseにする
                            }

                        });
                }
            }
        }
#endif
    }
```

次はHoloLensからIoTデバイスへデータを送信のしかたを紹介します。

```C#:sendUWP
public async void sendUWP(string message)
    {
#if !UNITY_EDITOR
        try
        {
            if (m_StreamSocket.OutputStream != null) //接続済の場合
            {
                m_DataWriterObject = new DataWriter(m_StreamSocket.OutputStream); //新しいDataWriterを作成。(WinformのStreamWriterと同じ)

                await WriteAsync(message);
            }
            else
            {
                Debug.Log("m_StreamSocket.OutputStream null");
            }
        }
        catch (Exception ex)
        {
            Debug.Log("sendUWP " + ex.Message);
        }
        finally
        {
            if (m_DataWriterObject != null) //送信完了の時、DataWriterを解除する
            {
                m_DataWriterObject.DetachStream();
                m_DataWriterObject = null;
            }
        }
#endif
    }

    private async Task WriteAsync(string msg)
    {
#if !UNITY_EDITOR
        if (msg.Length != 0)
        {
            try
            {
                m_DataWriterObject.WriteString(msg);　//送信のfunction
                await m_DataWriterObject.StoreAsync();
            }
            catch (System.Exception ex)
            {
                Debug.Log("WriteAsync " + ex.Message);
            }
        }
#endif
    }
```

簡単のON/OFFボタンを作成してみて上記の「sendUWP」機能で「１」と「０」を入れてLEDの電源をコントロールすることができます。

![onPressLedButton](https://onetech.jp/wp-content/uploads/2021/03/19.onPressLedButton.jpg)

##動画で紹介

<iframe width="760" height="435" src="https://www.youtube.com/embed/EicNIMOrrGg" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>
Video HoloLen 2とIoTデバイスを接続する方法。

以上となります。最後まで読んでいただいてありがとうございました！
Source: https://onetech.jp/blog/how-to-connect-hololen2-to-an-iot-device-11932