micro:bit（マイクロビット）と拡張基盤とUnityで遊んでみる

#micro:bitとは
[以前記事で紹介した](http://qiita.com/Sase/items/cbae0084d1147b9e9c64)chibi:bitと特に仕様は変わらず
BBC（英国放送協会）が主体となって作っている教育向けマイコンボードです。
仕様は25個のLED、2個のボタンスイッチのほか、加速度センサーと磁力センサー、BLE機能を搭載したマイコンボードです。
今回micro:bitは日本の技適通った事でスイッチサイエンスで発売になった訳です
[スイッチサイエンス](https://www.switch-science.com/catalog/3380/)
chibi:bitとの違い
・本家
・安く手に入る　大体２千円ぐらい
・サポートしている拡張基盤が多い

開発環境は以前と変わらずブラウザ型のエディターになります
ブロックエディターとコードエディターが選べます
どちらでも自由に開発できます
[micro:bit日本語開発環境](https://makecode.microbit.org/
)

#今回目指すもの
micro:bitをWiiUっぽいコントローラーとしてUnityと連携してみたいと思います
以前はchibi:bitからシリアル通信を送るだけでしたが、今回受ける所までやってみたいと思います

#開発環境
・Windows１０
・Unity2017.1.0

#用意する物
・[micro:bit](https://www.switch-science.com/catalog/3380/)
・[SparkFun gamer:bit(拡張基盤)](https://www.switch-science.com/catalog/3384/)

#セットアップ
こちらを参考
http://qiita.com/Sase/items/cbae0084d1147b9e9c64

#micro:bit側の実装
[micro:bit日本語開発環境](https://makecode.microbit.org/)を開きます
ブロックエディターを選ぶ
SparkFun gamer:bit(拡張基盤)のパッケージを追加します
やり方
https://learn.sparkfun.com/tutorials/microarcade-kit-experiment-guide/installing-the-gamerbit-package-for-microsoft-makecode

初期化
![bandicam 2017-08-08 16-21-36-004.jpg](https://qiita-image-store.s3.amazonaws.com/0/158441/52dee2bf-eba2-98cc-32ad-51f511067397.jpeg)

入力処理
一部をUpDate関数の中で組んでます
上を押した時　マイフレームLED処理をすると重くなるので、押した瞬間だけLED処理が走るようにしています
![bandicam 2017-08-08 22-20-19-454.jpg](https://qiita-image-store.s3.amazonaws.com/0/158441/b9fd342c-1fb7-d5cf-9655-37fa7dd91277.jpeg)

シリアル通信送信処理
![bandicam 2017-08-08 22-26-24-638.jpg](https://qiita-image-store.s3.amazonaws.com/0/158441/b393951c-3ecb-b3a4-0772-87cbc6cd69d3.jpeg)

シリアル通信受信処理
ITEMってゆう文字列が受信されたらITEM_GET_STATEを変えてLEDのアニメーションが実行されるようになっています
LEDのアニメーション処理をシリアル通信受信処理の中で組まずUpDate関数に書いている理由は
なぜかその中で組むと余計に数回呼ばれたので組んでいないです　多分バグかも
![bandicam 2017-08-08 16-26-10-068.jpg](https://qiita-image-store.s3.amazonaws.com/0/158441/4544fd8f-ae80-c862-5fb3-15db1bf94633.jpeg)

余談ですが、以前の記事のブロックエディターでキャスト（int->string）が出来なかったのですが、micro:bitのエディターではブロック側でもキャストできました。
ちなみにこんな感じ

![bandicam 2017-08-08 16-42-39-776.jpg](https://qiita-image-store.s3.amazonaws.com/0/158441/0a3be6fe-11ec-d8d5-99fc-73ad08c2856e.jpeg)

ここまで実装完了
hexファイルをダウンロードしてきて、micro:bitをusb接続してストレージとしてPC上に出てきたら、先ほど
ダウンロードしてきたhexファイルをコピペして焼き付ける。

完成形のhexファイルgithubに上げました
https://github.com/SatoSeiichi/micro-bit_GameController

ちなみにhexファイルにしてもプロジェクトとしてブラウザエディターで開けます

#シリアル通信の動作確認
こちらを参考
http://qiita.com/Sase/items/cbae0084d1147b9e9c64

#Unity側の実装
最初にシリアル通信の受信部分のスクリプトの実装します。
こちらをお借りしました。文字列が切れる事がなくなりました
https://gist.github.com/asus4/86d48b80c295db826e37eef99d5438b2

次にオブジェクトにシリアル通信の値を反映するスクリプトの実装します
動かしたいオブジェクトにObjRotation.csをアタッチする

```csharp:ObjRotation.cs

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using AppKit;
using System.Text;

public class ObjContllol : MonoBehaviour {
	ArduinoSerial serial;
	Vector3 rotation;
	public string portNum;
	public Transform rotationObj;
	public string massage;

	enum MOVE_STATE
	{
		UP,
		DOWN,
		LEFT,
		RIGHT,
	}

	void Start()
	{
		serial = ArduinoSerial.Instance;
		bool success = serial.Open(portNum, ArduinoSerial.Baudrate.B_115200);
		if (!success)
		{
			return;
		}
		serial.OnDataReceived += SerialCallBack;
	}
	void OnDisable()
	{
		serial.Close();
		serial.OnDataReceived -= SerialCallBack;
	}
	// Update is called once per frame
	void Update () {
	}

	void SerialCallBack(string m)
	{
		objMove (m);
		objRotation(m);
		massage = m;
	}

	void objRotation(string message)
	{
		string[] a;

		a = message.Split("="[0]);
		if(a.Length != 2) return;  
		int v = int.Parse( a[1]);
		switch(a[0])
		{
		case "pitch":
			rotation = new Vector2(v, rotation.y);
			break;
		case "roll":
			rotation = new Vector2( rotation.x, v);
			break;
		}
		Quaternion AddRot = Quaternion.identity;
		AddRot.eulerAngles = new Vector3( -rotation.x, 0, -rotation.y );

		transform.rotation = AddRot;
	}

	void objMove(string message)
	{
		string[] a;

		a = message.Split("="[0]);
		if(a.Length != 2) return;  
		int v = int.Parse( a[1]);
		string m = a [0];
		if (m == "button") {
			
			string mc = a [1];

			//a_button
			if (mc [0] == '1') {
				print ("a_button");
			}
			//b_button
			if (mc [1] == '1') {
				print ("b_button");
			}
//			//y_button
			if (mc [2] == '1') {
				print ("y_button");
				rotationObj.GetComponent<Renderer> ().material.color = Color.blue;
			}
			//x_button
			if (mc [3] == '1') {
				print ("x_button");
				rotationObj.GetComponent<Renderer> ().material.color = Color.red;
			}
			//up
			if (mc [4] == '1') {
				print ("up");
				transform.SetPositionAndRotation (transform.position + (Vector3.up * 0.05f), transform.rotation);
				rotationObj.GetComponent<Renderer> ().material.color = Color.green;
			}
			//dawn
			if (mc [5] == '1') {
				print ("dawn");
				transform.SetPositionAndRotation (transform.position + (Vector3.down * 0.05f), transform.rotation);
				rotationObj.GetComponent<Renderer> ().material.color = Color.magenta;
			}
			//left
			if (mc [6] == '1') {
				print ("left");
				transform.SetPositionAndRotation (transform.position + (Vector3.left * 0.05f), transform.rotation);
				rotationObj.GetComponent<Renderer> ().material.color = Color.yellow;
			}
			//right
			if (mc [7] == '1') {
				print ("right");
				transform.SetPositionAndRotation (transform.position + (Vector3.right * 0.05f), transform.rotation);
				rotationObj.GetComponent<Renderer> ().material.color = Color.cyan;
			}

		}
	}

	void OnTriggerEnter(Collider co)
	{
		Destroy (co.gameObject);
		serial.Write ("ITEM");
		Debug.LogError("item_get");
	}
}
````

以上です。

完成Unityプロジェクトをgithubに上げました
https://github.com/SatoSeiichi/micro-bit_unity

結論
　Unityでシリアル通信をするならこちらのコードを参考にしよう
　https://gist.github.com/asus4/86d48b80c295db826e37eef99d5438b2

#デモ動画
シリアル通信処理変更前
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr"><a href="https://twitter.com/hashtag/microbit?src=hash&amp;ref_src=twsrc%5Etfw">#microbit</a>  と <a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> で遊んでみる<br>うーん やっぱ2017にしてもシリアル通信はダメやなー 思い切ってBLE通信をやってみるかな <a href="https://t.co/4njbtq3NSk">pic.twitter.com/4njbtq3NSk</a></p>&mdash; SASE (@SaseKubrick) <a href="https://twitter.com/SaseKubrick/status/894843058625232896?ref_src=twsrc%5Etfw">2017年8月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


シリアル通信処理変更後
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">やったー！ シリアル通信処理を変更したらましになった！ <a href="https://twitter.com/hashtag/microbit?src=hash&amp;ref_src=twsrc%5Etfw">#microbit</a>  <a href="https://twitter.com/hashtag/unity?src=hash&amp;ref_src=twsrc%5Etfw">#unity</a> <a href="https://t.co/ZWXVpGwxTl">pic.twitter.com/ZWXVpGwxTl</a></p>&mdash; SASE (@SaseKubrick) <a href="https://twitter.com/SaseKubrick/status/894915235412193281?ref_src=twsrc%5Etfw">2017年8月8日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>