Android/iOSアプリのLightBlueでtoioコア キューブを動かしてみる

# Android/iOSでBLEを直に使ってtoioコア キューブを動かしてみます

　toioコア キューブはBLE通信で制御できるとてもかわいい二輪ロボットです。
https://toio.github.io/toio-spec/
　本来、toioコア キューブはtoioコンソールとセットで動かすものですが、toioコア キューブ単体で、スマートフォンや、ノートPC、はたまたRaspberry PiのようなシングルボードコンピュータなどのBLE通信で動かすこともできます。
　この記事ではスマートフォンのBLE通信を使ってtoioコア キューブを動かしてみます。

## スマートフォンでtoioコア キューブを動かしたい
　一番簡単な方法はweb bluetoothを使ってchromeブラウザからURLを開きtoio.jsを動かす方法です。
「[toio.jsをブラウザで動かしてみた](https://qiita.com/shinsuke-noguchi/items/037d729327232b6c0d33)」
　動かすだけならこれでOKですが、もうちょっと生っぽくというかBLE通信のプロトコルを直に使って動かしてみましょう。

## BLEの簡単な解説
- BLE機器ははセントラル、ペリフェラルの２種類あります。
- セントラルが、PCやスマートフォン、ペリフェラルが今回はtoioコア キューブにあたります。
- セントラルはペリフェラルの出すアドバタイジングパケットをみて、どういう素性の機器かを判別し、ペリフェラルに接続します。
- セントラルは接続したペリフェラルから、値を読み/書き/通知することのできるデータフィールドの情報を得ることができます。このデータフィールドのことをキャラクタリスティックといいます。
- キャラクタリスティックは以下の３つの性質をもちます。
- 読み(read)は値を読み込むことができるフィールドです。
    - 例えばバッテリー残量、ボタンを押したかどうかなどです。
- 書き(write)は値を書き込むことでペリフェラルの動作に変化を与えます。
    - 例えばLEDの色の変更、モーターの回転速度の変更などです。
- 通知(notify)は読み(read)に似ていますが、データフィールドの値に変化があったときにペリフェラルに値を通知します。
    - 例えばボタンを押したかどうか、モーションセンサによる衝突検知、読み取りセンサによるtoioコア キューブの置いてあるマットのIDやシールのIDの値が変化したときにどんどん通知されてきます。
- toioコア キューブの場合、読み(read)できるキャラクタリスティックは通知(notify)にも対応しています。
    - モーター、設定のようにwrite、read、notifyの全部に対応しているキャラクタリスティックもあります。
- BLEはほかにもいろいろありますが、とりあえずこれだけ知ってれば遊べます。
- Android/iOSアプリのLightBlueを使うと簡単にキャラクタリスティックの読み(read)、書き(write)、通知(notify)を試すことができます。
- Androidアプリ LightBlue
    - https://play.google.com/store/apps/details?id=com.punchthrough.lightblueexplorer&hl=ja
- iOSアプリ LightBlue
    - https://apps.apple.com/jp/app/lightblue-explorer/id557428110

## 準備するもの
- スマートフォン(AndroidかiOSのもの)
- LightBlueアプリをインストールする 前章のURLからそれぞれのOS用のアプリをインストールしてください。
- toioコア キューブ 1個
- 必要に応じて「トイオ・コレクション」のマットやステッカー

## さっそくやってみよう
以下ではAndroidアプリのLightBlueの画面を使って説明します。iOSアプリ版もほぼ変わらない操作です。

### LightBlueアプリを起動します。
- 起動時にbluetoothへのアクセス許可、あるいは位置情報へのアクセス許可の確認画面が出る場合は許可します。(許可しないとBLE通信ができないのでtoioコア キューブと通信できません)

<img alt="[Screenshot_20191201-224104.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/1025e168-5939-a635-49c7-2965f0524771.png" width=50%>
<img alt="[Screenshot_20191201-224113.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/3d0b0928-9087-b35f-1e0d-6d95b46b8a42.png" width=50%>


- 以下の画面が出たら、「toio Core Cube」をタップして選びます。
<img alt="[Screenshot_20191202-080759.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/8149af5d-b048-3f32-b592-488267f0e17f.png" width=50%>
- 「toio Core Cube」の下に出ている16進数はBLE機器ごとに割り当てられているアドレスです。このスクリーンショットでは下半分(3バイト分)を消していますが、実際には6バイト分あります。この6バイトで個体判別することができます。

### toioコア キューブと繋がった状態
<img alt="[Screenshot_20191202-080814.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/64e914ef-9c67-2544-4ef4-f803ee818de4.png" width=50%>

- toioコア キューブとつながるとこの画面になります。
- この画面を下の方にスクロールして、以下の赤枠のところを表示します。
<img alt="Screenshot_20191202-080907.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/13736952-4088-d96d-c8a3-7f8f53e9c151.png" width=50%>
- これがtoioコア キューブのキャラクタリスティックです。ここをタップするとキャラクタリスティックの選択画面が出ます。
<img alt="Screenshot_20191202-080927.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/b8fd2ee1-3c26-ad86-8aac-3b90c862601f.png" width=50%>

- この中から読み(read)/書き(write)/通知を受ける(notify)したいキャラクタリスティックを選びます。
- さて、ここでtoio コア キューブ 技術仕様のページの「[通信概要](https://toio.github.io/toio-spec/docs/ble_communication_overview)」のところを一度みてみましょう。
    - そこの「各種機能」のところの説明がこのキャラクタリスティックに対応しています。以下にキャラクタリスティックの選択画面の記載と技術仕様の説明の対応を示します。
    - 「[読み取りセンサー](https://toio.github.io/toio-spec/docs/ble_id)」ID Information
    - 「[モーター](https://toio.github.io/toio-spec/docs/ble_motor)」Motor Control
    - 「[ランプ](https://toio.github.io/toio-spec/docs/ble_light)」Light Control
    - 「[サウンド](https://toio.github.io/toio-spec/docs/ble_sound)」Sound Control
    - 「[モーションセンサー](https://toio.github.io/toio-spec/docs/ble_sensor)」Sensor Information
    - 「[ボタン](https://toio.github.io/toio-spec/docs/ble_button)」Button Information
    - 「[バッテリー](https://toio.github.io/toio-spec/docs/ble_battery)」Battery Informaiton
    - 「[設定](https://toio.github.io/toio-spec/docs/ble_configuration)」Configration

### バッテリー残量を読む

- 前章のキャラクタリスティック選択画面から「Battery Information」をえらびます。

<img alt="[Screenshot_20191202-080939.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/c24d8b64-5ccc-0611-2d2b-3b93abb7eaa1.png" width=50%>

- バッテリーのキャラクタリスティックについての説明が出ます。赤枠で囲ったところにReadableとあり、チェックマークがありますので、「読み」ができます。その下にはWritableとありますが×になっているので「書き」はできないことを示しています。さらに下のSupports notifications/indicationsにはチェックマークがついているので「読み」に加えて「通知」もできることがわかります。
- この画面を下のほうにスクロールしてREAD/INDICATED VALUEのところまできたら「READ AGAIN」ボタンをタップします。

<img alt="[Screenshot_20191202-081011.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/72ca87ee-5e11-a1c1-5dae-ad7b4722e66e.png" width=50%>

- バッテリー残量の値が読み出されて表示されます。16進数で「64」なので100ですね。(「[バッテリー](https://toio.github.io/toio-spec/docs/ble_battery)」の仕様も確認してみてください)

<img alt="[Screenshot_20191202-081024.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/277f0b33-cfe5-b21d-614f-25d0f8838cba.png" width=50%>

### LED(ランプ)を灯もす

- 今度は「書き」のほうをやってみます。戻るボタンで一旦、キャラクタリスティック選択画面まで戻って今度は「Light Control」を選びます。

<img alt="[Screenshot_20191202-081050.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/79741037-43df-3b91-f69e-7c38d44e4a8b.png" width=50%>

- 今度はWritableのみ有効なので「書き」しかできません。
- この画面を下の方にスクロールしてWRITTEN VALUEのところまできたら、toioコアキューブ仕様書の「[ランプ](https://toio.github.io/toio-spec/docs/ble_light)」のところを参照し、「書き込み操作」の「例」のデータ「03100101FF0000」を書き込んでみます。
    - 「例」では0.16秒間LED(ランプ)を赤く点灯するデータが示されています。
- 16進数で書き込んで「WRITE」ボタンをタップすると、toioコアキューブの底面のLED(ランプ)が0.16秒間赤く光ります。0.16秒は一瞬ですので気をつけてよく見ていてください。
<img alt="[Screenshot_20191202-081155.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/196d645b-3fc8-abb4-353b-1066399ece99.png" width=50%>

### ボタンの状態を読む、変化した通知をうける

- 続いて今度はボタンの情報を読んだり、通知を受け取れるようにしてみます。
- 戻るボタンで一旦、キャラクタリスティック選択画面まで戻って今度は「Button Information」を選びます。

<img alt="[Screenshot_20191202-081257.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/c800d98d-84f6-b8ca-5b92-0eaf78af39bf.png" width=50%>

- この画面を下の方にスクロールして、[READ AGAIN]のボタンをタップすると、タップした瞬間のtoio コア キューブ底面のボタンの状態(押している、押していない)を読み取ることができます。

<img alt="[Screenshot_20191202-081313.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/5a85de27-0de5-900c-530c-2b0e31eff009.png" width=50%>

- このスクリーンショットでの値は01 00、toio コア キューブのボタンは押されていません。
- toioコアキューブのボタンを押した状態で、もう一度[READ AGAIN]のボタンをタップすると、今度は01 80です。値の意味はtoio コア キューブ技術仕様書の「[ボタン](https://toio.github.io/toio-spec/docs/ble_button)」のところで調べてみましょう。

<img alt="[Screenshot_20191202-081327.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/0a3bec20-cfba-9962-75d9-b7d9f63f0ba2.png" width=50%>

- [READ AGAIN]のボタンのとなりの[SUBSCRIBE]ボタンをタップすると、通知(notify)を受けるようになります。値が変化したときに通知されます。
- この状態でtoio コア キューブのボタンを押したり離したりすると、状態が変化するタイミングで以下のように値が通知されてきます。

<img alt="Screenshot_20191202-081414.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/ee3b1d0b-f6d6-07e6-1147-eccb15363389.png" width=50%>

- 通知をやめるときは[UNSUBSCRIBE]ボタンをタップします。

<img alt="Screenshot_20191202-081355.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/e10eaac1-d955-d05e-4c65-fa3769380e74.png" width=50%>

### マットの上の座標などを通知させる

- ここまでくればもうわかりますね。戻るボタンで一旦、キャラクタリスティック選択画面まで戻って今度は「ID Information」を選びます。
- そして画面の下の方までスクロールしてから[SUBSCRIBE]ボタンをタップします。

<img alt="Screenshot_20191202-081536.png]" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/431649/036649f3-0c15-1b56-033d-2f2429d3f290.png" width=50%>

- toio コア キューブをマットに置いてみてください。また、位置を変えたり角度を変えたりしてみてください。ものすごい勢いで位置、角度データが通知されてくるのがわかります。
    - 通知されてきた値の意味はtoio コア キューブ技術仕様の「[読み取りセンサー](https://toio.github.io/toio-spec/docs/ble_id)」で確認してみてください。

## さいごに

　スマートフォン(Androido/iOS)のLightBlueアプリを使って、toio コア キューブと直接BLE通信して動かしてみました。あ、モーターは今回使ってないので「動いて」はいないですね。:sweat:
　まあ、toioコアキューブ技術仕様の「[モーター](https://toio.github.io/toio-spec/docs/ble_motor)」をみて、いろいろやってみてください。特に2.1.0になってからモーター制御コマンドでできることが増えていますのでなかなかやりがいがあると思います。
　ここまでわかってしまえばBLEでのtoio コア キューブのコントロールはそんなに難しくありません。Windows、Linux、MacOS、その他いろいろな環境で、お好みのプログラミング言語でtoio コア キューブを動かして楽しみましょう。