WindowsでのBluetoothLEマイコンとUnityの連携方法

# 初めに
2015/11/1に行われたOcuBen関西#02の「[WindowsとBluetoothLEマイコンでコントローラーを作ってみよう。](http://www.slideshare.net/akihiroueyama50/windowsbluetoothle)」のプログラムの説明です。
独自の入力機器の作成のためBluetoothLE搭載マイコンを用いてWindows上のUnityと連携させます。
medマイコン、VisualStudio、Unityの基本的な使い方に関しては詳しく説明しません。

# マイコン
マイコンとは小さなコンピューターです。
主に組み込み機器などに用いられていますが、安く使い方が簡単なため電子工作などにも利用できます。
- Arduino
- mbed
- PSoC
様々な種類のマイコンが販売されているので、性能や機能や値段と相談してください。
今回はmbedという種類のマイコンを利用します。
mbedの特徴はブラウザ上でプログラムからコンパイルまで行うことができ、開発環境の構築が容易であるところです。
https://developer.mbed.org/

# BluetoothLEの説明
Bluetooth Low Energy(BluetoothLE)とは低消費電力を目的としたBluetoothの新しい規格のことです。
スマートフォン、ノートパソコン、ウェアラブル端末、マイコン機器などに搭載されています。
参考　http://blog.fenrir-inc.com/jp/2013/09/bluetooth-le-firststep.html
Windowsデバイスでは、Windows8からBluetoothLEに関するライブラリ(WinRT)が提供されています。
WinRTはWindowsストア・アプリ用のライブラリのため、コンソールアプリとして使用する場合にはターゲットをWindows8以上にする必要があります。

# BluetoothLEとUnityの連携方法
UnityにはWindowsの提供する最新の.NETが導入されていないため、BluetoothLEを利用するためのWinRTがUnityでは利用できません。
そのためBluetoothLEマイコンとの通信を別のアプリで行い、そのアプリとUnityとをSocket通信で接続することでUnity上でBluetoothLEマイコンのデータを取得します。
## 使用機材
パソコン側
BluetoothLE対応のパソコン
Windows8.1(64bit)
Unity5.1.3(Socket通信ができればどのバージョンでも大丈夫だと思います)
VisualStudio2015

マイコン側
mbed HRM1017 https://www.switch-science.com/catalog/1755/
9自由度慣性計測装置 IMU Breakout https://www.switch-science.com/catalog/1702/
その他(電池、配線、基板)

mbedとIMUの接続方法はmbedのピン配置「[mbed-HRM1017をはじめよう](https://developer.mbed.org/teams/Switch-Science/wiki/mbed-HRM1017%E3%82%92%E3%81%AF%E3%81%98%E3%82%81%E3%82%88%E3%81%86)」とIMUのピン配置「[LSM9DS0 Hookup Guide](https://learn.sparkfun.com/tutorials/lsm9ds0-hookup-guide)」を合わせて接続してください
![DSC_0362.JPG](https://qiita-image-store.s3.amazonaws.com/0/86283/3a43564e-c4be-b8aa-6b0e-95677cfacb82.jpeg)


## BluetoothLE搭載マイコンのプログラム
BLE_APIとnRF51822のライブラリをインポートすることでBluetoothLEによる通信が行えます。
今回はIMUからの値を取得するためチップの型番であるLSM9DS0のライブラリもインポートします。
BluetoothLEモジュールとIMUの初期化と初期設定後、IMUからのセンサ情報を整形してBluetoothLEで送信しています。

プロジェクトは以下に置いておきます。
https://developer.mbed.org/users/akihiro0105/code/BLE_HRM1017_20151023_1/

## BluetoothLE通信用プログラム
WinRTはUnityで利用できないため、通信用のコンソールアプリを作成します。
**注意**
WinRTはWindowsストア・アプリ用のためターゲットをWindows8以上にする必要があります。
プロジェクト作成後、一旦プロジェクトを閉じ.csprojファイルをテキストエディタで開き
< TargetPlatformVersion>8.1< /TargetPlatformVersion>
を追加します。
再度プロジェクトを開き参照の追加からWindowsとSystem.Runtime.WindowsRuntimeを追加することでコンソールアプリからWinRTを利用することができます。
参考 [デスクトップ-アプリからのwinrt-api利用](https://ufcpp.wordpress.com/2012/09/18/%E3%83%87%E3%82%B9%E3%82%AF%E3%83%88%E3%83%83%E3%83%97-%E3%82%A2%E3%83%97%E3%83%AA%E3%81%8B%E3%82%89%E3%81%AEwinrt-api%E5%88%A9%E7%94%A8/)

```xml:ConsoleApplication1.csproj
<PropertyGroup>
    <Configuration Condition=" '$(Configuration)' == '' ">Debug</Configuration>
    <Platform Condition=" '$(Platform)' == '' ">AnyCPU</Platform>
    <ProjectGuid>{A07F5B52-B46C-44E9-A190-38AED5C23AE2}</ProjectGuid>
    <OutputType>Exe</OutputType>
    <AppDesignerFolder>Properties</AppDesignerFolder>
    <RootNamespace>ConsoleApplication1</RootNamespace>
    <AssemblyName>ConsoleApplication1</AssemblyName>
    <TargetFrameworkVersion>v4.5.2</TargetFrameworkVersion>
    <TargetPlatformVersion>8.1</TargetPlatformVersion>
    <FileAlignment>512</FileAlignment>
    <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  </PropertyGroup>
```

BluetoothLEの接続設定ののち、接続後に受信したセンサ情報をSocket通信にて送信します。
プロジェクトは以下に置いておきます。
https://github.com/akihiro0105/BluetoothLE_001
## Unityのプログラム
BluetoothLE通信用のコンソールアプリとSocket通信を行うことによってUnityにマイコンのセンサ情報を受け取らせます。
ネイティブアプリとして利用できるので、VR対応にも問題はありません。

<blockquote class="twitter-tweet" lang="ja"><p lang="ja" dir="ltr">BluetoothLEのmbedでパソコンと通信させてデータをUnityに持っていけた。&#10;これでモーションコントローラーが作れるはず… <a href="https://t.co/Se3FEMnmEZ">pic.twitter.com/Se3FEMnmEZ</a></p>&mdash; アキヒロ (@akihiro01051) <a href="https://twitter.com/akihiro01051/status/658190744998383616">2015, 10月 25</a></blockquote>
<script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>

プロジェクトは以下に置いておきます。
https://github.com/akihiro0105/Unity_BluetoothLE_001