TouchDesignerとmicro:bitの連携

[BBC micro:bit](https://microbit.org/ja/)にはデフォルトでセンサーが組み込まれています。
他のArduino等の基盤と比べ、比較的容易に色々なアプリケーションと連携することができます。（過去[Unityとの連携の記事](https://qiita.com/atsonic/items/6164175e34f267722bf9)を書きました。）

今回はmicro:bitをコントローラーとしてTouchDesignerで配置した3Dモデルを動かしてみます。

##micro:bit
まずはmicro:bitのプログラムですが、2台のmicro:bitを使います。
1台はUSBでPCに接続しレシーバーとして使います。もう1台を電池につなぎコントローラーとします。

###コントローラー
![sender.png](https://qiita-image-store.s3.amazonaws.com/0/31194/37c4ac66-9c1b-c88a-df4b-822c647dd93e.png)
内容はとても簡素です。
最初に2台のmicro:bitを通信させるためのグループの設定をします。（番号はなんでも大丈夫です）
そして入力部品から**傾斜**の部品を2つエディターに追加し、それぞれ**ピッチ**と**ロール**とします。その2つの部品を文字列として繋げ、変数に格納し、最後にその変数を、ずっと送信する様にブロックを繋げます。
この、入力部品を文字列に繋げるあたりはこちらの記事[Heart for micro:bit and Processing](https://rantonse.no/en/blog/2017-03-11)を参考にしました。

###レシーバー
![reciever.png](https://qiita-image-store.s3.amazonaws.com/0/31194/f5738d06-72e3-9683-6892-f9c5ff045620.png)
PCに繋いだレシーバーはもっと単純です。
最初にコントローラーと同じグループの設定をし、無線で文字列を受信したらシリアルでそのままその文字列を書き出す様にします。

これでmicro:bit側は準備完了で、それぞれのプログラムをmicro:bitにインストールします。

##TouchDesigner
<img width="982" alt="スクリーンショット 2018-10-23 11.21.36.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/4d2eb9de-77e3-0a4d-8c64-82135c59b839.png">
ネットワークは上図の様になっています。右側のSOPは動かす3Dモデルで、今回の連携には左側のDAT群が必要になります。

###Serial DAT
<img width="50%" alt="スクリーンショット 2018-10-23 11.21.52.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/61da119b-8c13-5561-be19-97312cf985fd.png">
ここで設定しなくてはいけないのが**Port**と**Baud Rate**です。
Portは各端末ごとに変わりますが、micro:bitを挿しているUSBのポートを指定します。Baud Rateは**115200**を指定します。
<img width="50%" alt="スクリーンショット 2018-10-23 11.22.02.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/e21b0f0a-1852-af80-ff39-3ad783194cfc.png">
それと**Received Data**タブの**Maximum Lines**はデフォルトで10になっていますが、micro:bitでは毎フレーム1行の書き出しになるので合わせて**1**にします。

###Convert DAT
Serial DATで取得した文字列を分割してテーブルデータにします。
Serial DATでは**ピッチ/ロール**という形式で「/（スラッシュ）」で繋いでいるので「/」で分割しテーブルデータに変換します。
<img width="50%" alt="スクリーンショット 2018-10-23 11.22.13.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/017edc8a-93b4-a2bd-77ad-51f187fefc7e.png">
**Split Cells at**のデフォルトが「\（バックスラッシュ）t」となっていますが、これを「/（スラッシュ）t」と変更します。そうするとOPのなかが2行2列のテーブルになると思います。

###Select DAT
Convert DATから2つのSelect DATを繋いでピッチとロールのデータに分けます。
<img width="50%" alt="スクリーンショット 2018-10-23 11.22.22.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/fa7b335a-7a4e-c845-f21d-204bdfbd19ec.png">
ここでは**Start Row Index/End Row Index**（行）、**Start Col Index/End Col Index**（列）の値を変更して、それぞれ使用する値を選択します。
Convert DATのテーブルでは0行目は項目名なのでピッチ/ロール共にStart Row Index/End Row Indexは実データのある**1行目**を指定します。
また**ピッチは0列目**、**ロールは1列目**なので各DATで適切な数値にします。

###DAT to CHOP
<img width="50%" alt="スクリーンショット 2018-10-23 11.22.39.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/deea4328-b4e1-0cdb-55fd-cb86ec592d03.png">
ここで変更したのは**First Row Is**と**First Column Is**の部分を**Value**にしたところです。データによっては項目になっているセルがあるので無視（Ignore）を選択しますが、今回はSelect DATが実データのみなので両方Valueになっています。

###Transform SOP
<img width="50%" alt="スクリーンショット 2018-10-23 11.22.53.png" src="https://qiita-image-store.s3.amazonaws.com/0/31194/d87593bd-b05b-4500-f7c6-b5d9fa910ca1.png">
最後Transform SOPのRotateにピッチとロールの各DAT to CHOPの参照を入れて完成です。rzは逆方向に傾いてしまうのでマイナスにしています。（ryに180と入っていますが、用意した3Dモデルが元々後ろ向きだったので向きを変えるために入れている数値です）

これでTouchDesignerを外部からコントロールできるようになって、作るものの幅が広がりそうですね:raised_hands:

[![IMAGE ALT TEXT HERE](https://qiita-image-store.s3.amazonaws.com/0/31194/ebba6d65-5262-864c-fc6b-9cdd76e9a9bc.png)](https://www.youtube.com/watch?v=HqcV46XjY40)