toioの開発環境・情報まとめ（公式&非公式） - 放課後のtoioあそび

#はじめに
![2019-12-10_18h32_26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/a052f6fe-07db-28c8-a7c6-071dcac51f9d.png)
※画像は[こちら](https://toio.github.io/toio-spec/)より引用

個人的な情報整理を兼ねてtoioファンとして開発環境などの情報を趣味の範囲でまとめました。現時点（2019/12/9）の個人的に知り得る公開情報を掲載しています。toio公式から出ているものに加え、ユーザーの皆さんが自由に作成された非公式情報もわかる限り掲載しています。あくまで趣味で書いていますので温かい目で見ていただければと思います。

# toio コア キューブの公式なハードウェア情報まとめ
ロボットトイtoio（トイオ）の中心的な存在である「toio コア キューブ（以降キューブ）」は32㎜角のキューブ型ロボットで、専用のプレイマットの上であれば絶対位置を取得することができるという特徴があります。リチウムイオン電池が内蔵されており、Bluetooth Low Energy (BLE）通信で制御ができるので、PCやスマートフォンなどのデバイスからも一定範囲で自由に制御できるようです。

下記の公式サイトから仕様一覧を見ることができますが、ここでは知り得る限りもう少し補足的な解説をしてみたいと思います。

[toio コア キューブの仕様(2019/12/9時点)](https://toio.io/platform/)※画像もここから引用
![2019-12-10_16h56_54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/3fae10c9-755a-c460-b91b-7a1ecfdfaa33.png)

[toio コア キューブ技術仕様(2019/12/9時点)](https://toio.github.io/toio-spec/)※画像もここから引用
![2019-12-10_17h14_46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/73a4fb3d-b210-8f1a-8a8b-31ae8491651f.png)


## キューブの入出力系をもう少し解説
toioのロボットとしての特徴であるセンサーやアクチュエータなどの入出力デバイスについて、少しだけ深堀してみたいと思います。

- [読み取りセンサー（入力）](https://toio.github.io/toio-spec/docs/ble_id)

専用プレイマットの上であれば瞬時にキューブの位置（絶対位置）を数㎜単位（公開された技術仕様からの概算）の精度で取得できるセンサーです。底面に丸い穴のような部分があり、そこから専用プレイマットの上の特殊パターンを読み取ることで位置を取得している模様です。また専用のカードなどの種類判別や、それらの上での向き（角度）も取得でき、光学式マウス（相対位置センサ）よりも幅広い情報を取得できます。

※位置を読み取れるのは「[トイオ・コレクション](https://toio.io/titles/toio-collection.html)」のマットだけとなっています。

- [モーター（出力）](https://toio.github.io/toio-spec/docs/ble_motor)

左右のモーター2つを使った[独立二輪操舵 (Power Wheeled Steering/PWS) 方式または対抗二輪方式](https://www.roboken.iit.tsukuba.ac.jp/platform/wiki/_media/ypspur-0.13.2.pdf)で前後動作と左右回転が可能です。いわゆる「ノンホロノミック駆動系」なので全方位移動はできませんが、直進や回転だけでなくなめらかな曲線に沿った動きなども活用することで2次元平面上の任意の位置・向きの場所に移動することができます。[公開された技術仕様](https://toio.github.io/toio-spec/docs/ble_motor)に速度カーブが書かれていますので参考にしてみてください。

ちなみにロボットの移動方法には[車輪型だけでも多種多様なものがあり](http://www.mech.tohoku-gakuin.ac.jp/rde/contents/course/robotics/wheelrobot.html)、それぞれにメリット・デメリットがあります。個人的にはこのネタの話だけでご飯が三杯食べられます。

- [モーションセンサー／6軸検出システム（入力）](https://toio.github.io/toio-spec/docs/ble_sensor)

加速度・ジャイロセンサーを内蔵しているため、キューブの傾きなどの状態やダブルタップ、衝突検知を行うことができます。キューブを手で持って浮いた状態だったり専用プレイマットがない状態でも状態検出に使えるので便利です。

- [機能ボタン（入力）](https://toio.github.io/toio-spec/docs/ble_button)

底面にソフトウェアからON/OFFを検出できるボタンがあります。

- [ランプ（出力）](https://toio.github.io/toio-spec/docs/ble_light)

いわゆるRGBのLEDが機能ボタンと一体化して底面に搭載されています。底面から下向き＆周囲に拡散されているので、キューブの上にモノが載っていても、下の方から光が漏れて見えます。

- [サウンド／スピーカー（出力）](https://toio.github.io/toio-spec/docs/ble_sound)

圧電スピーカーで比較的単純な音を鳴らすことができます。

---

キューブはシンプルに見えますが、実は以上のような多彩なセンサーやアクチュエーターが搭載されており、特にナビゲーションと呼ばれるようなロボット自身の位置・速度・経路などを制御するには十分な機能を有していると思います。

また、上部にはレゴ®ブロックを搭載できるので、さまざまなロボットアプリケーションのラピッドプロトタイピングに最適です。

# ソフトウェア開発関連の公式情報

## [通信技術仕様](https://toio.github.io/toio-spec/docs/ble_communication_overview.html)

![2019-12-10_17h32_05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/8b50f2d7-74d2-4418-746d-88d5408bda02.png)
※画像は[こちら](![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/61de90d4-0619-0195-0f6c-b53d99804a70.png)
)から引用

toioをBluetooth Low Energy (BLE）から制御するための[通信仕様/通信プロトコル](https://toio.github.io/toio-spec/docs/ble_communication_overview.html)がほとんど全部といっていいのではないかというくらい書かれています。
あくまで通信仕様なので、実際にこれを使ってキューブをPCやスマートフォンから制御するには各プログラミング言語での実装が必要ですが、下記に紹介するtoio.js等を用いるとJavaScriptに関してはすでに簡単なプロトコルが実装されたライブラリを使用可能です。
## ビジュアルプログラミング

![2019-12-10_17h41_27.png](https://d2l930y2yx77uc.cloudfront.net/production/uploads/images/16127384/picture_pc_66f0a84557280653cc706ba4e0a38281.gif)
※画像は[こちら](https://note.toio.io/n/nf6793e287772)から引用

toioには、ブロックを使って簡単にプログラミングができる「[ビジュアルプログラミング](https://toio.io/programming/visual-programming.html)」も用意されています。小学生などにも人気の[Scratch3.0](https://scratch.mit.edu/)と似ていてほぼ同等の書き方や機能を使うことができ、プログラミングに慣れていない方でも簡単にキューブを制御できます。[公式Note記事](https://note.toio.io/n/n600f973ee64e)に詳細な解説が書かれているのでぜひご覧ください。

## [toio.js](https://github.com/toio/toio.js)

![2019-12-10_17h35_47.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/5d6fa179-0733-b8a9-4b13-81d8ce0e8a8b.png)
※画像は[こちら](https://github.com/toio/toio.js)から引用

英語版ではありますが、toioの通信技術仕様の一部がJavaScriptで実装されており、手軽に扱うことができるライブラリとサンプルコードが[GitHub上で掲載されています](https://github.com/toio/toio.js)。オープンソースで開発されているようです。こちらを使った作例もQiita上などでは多く公開されています。

## 公式情報の中で知っておくと便利なもの

この項目は独断と偏見で気に入ったものを順次追加・更新していきたいと思います。

# [目標指定付きモーター制御](https://toio.github.io/toio-spec/docs/ble_motor#%E7%9B%AE%E6%A8%99%E6%8C%87%E5%AE%9A%E4%BB%98%E3%81%8D%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E5%88%B6%E5%BE%A1)

※画像は[こちら](https://toio.github.io/toio-spec/docs/ble_motor#%E7%9B%AE%E6%A8%99%E6%8C%87%E5%AE%9A%E4%BB%98%E3%81%8D%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E5%88%B6%E5%BE%A1)から引用
![2019-12-10_17h41_27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/2bcaca00-925e-c9e0-dc6e-9174b7355adf.png)

専用プレイマットの上でキューブの目標となる状態、つまり行きたい場所の位置・向き（角度）・速度などを指定すると、キューブがほぼ自律的に目標に向かって移動してくれます。ただし、あくまで目標は努力目標であって、実際にはマットの上に障害物があったりすると目標に到達できません。その場合は「タイムアウト」に設定した時間までは努力しますが、それ以降は処理を終了します。
また、移動タイプというものが三種類指定できるので、動き方の見た目や移動時間、搭載物を含めたエネルギー効率などを考えながら任意のものを選ぶこともできます。

![2019-12-10_17h56_45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/b6c2f85d-ba90-ffe8-5814-66b92132964d.png)
※画像は[こちら](https://toio.github.io/toio-spec/docs/ble_motor#%E7%9B%AE%E6%A8%99%E6%8C%87%E5%AE%9A%E4%BB%98%E3%81%8D%E3%83%A2%E3%83%BC%E3%82%BF%E3%83%BC%E5%88%B6%E5%BE%A1)から引用

自分は[移動ロボットの研究室出身だったので](https://www.roboken.iit.tsukuba.ac.jp/)すが、これは長年移動ロボットの基本機能として研究されてきた技術の一つでもあり、ものすごく刺さる機能の一つです。

※2019年秋に更新されたもので、バージョン2.1.0からの適用（トイオ・ドライブやトイオ・コレクション拡張パックなど以降でのシステムソフトウェアアップデート後利用可能）の機能のようなので、利用の際は事前にカートリッジ等によるアップデートが必要です。ご注意ください。



#開発環境・方法に関する非公式情報まとめ

toio開発者・ユーザーの皆さんによる非公式な開発環境や参考情報をまとめました。このQiitaの他にも検索すれば多数見つかりますが、全部中身を確認できていないので、独断と偏見で見つけたものをどんどん列挙していきたいと思います。動作保証やクオリティに関しては確認していないので、月並みな表現ですが各自の責任にてご利用ください。。今後も見つけ次第できる範囲で追加します。限界が来たらやめます。。

## toio.jsを触ってみた方々の例

- [toioのjavascriptライブラリが公開されたのでexample動かしてみた](https://qiita.com/KatsuShun89/items/5f86a9811565267f6b30)
- [キューブ型ロボットの toio を制御できる toio.js を触ってみた](http://tips.hecomi.com/entry/2019/06/21/005946)
- [toio playground (toio javascript libraryを使ってみた)](https://qiita.com/mnakada/items/6352c0c5dab4593798e5)
- [toio.jsをブラウザで動かしてみた](https://qiita.com/shinsuke-noguchi/items/037d729327232b6c0d33)
- [1分で始めるtoioプログラミング](https://qiita.com/shinsuke-noguchi/items/219d3b36ed3dd99c2ff7)
- [#toio を Alexa や micro:bit から操作する 〜概要編〜（JavaScriptライブラリを使ってみた）](https://qiita.com/youtoy/items/0ee56f5395e3f4c72c51)
- [ソフトウェア初心者がtoio.jsで作ってみた　5つの作例紹介](https://qiita.com/yuyaHirano/items/ddeb9d8bf7f844e52f1f)

※toio.jsの応用例はたくさんありすぎて十分掲載しきれません・・・

## Unityで動かした例
- [toio と Unity の連携](https://qiita.com/ito_ur_right/items/85062db988cfce14c4d7)

## Pythonで動かした例
- [toio を Mac + Python で制御できるライブラリつくった](https://qiita.com/mizumasa/items/2a350e4188a5904fa829)

## RaspberryPiで動かした例
- [Raspberry Pi で toio コアキューブをコントロールする（１回目）)](https://qiita.com/FiveOne/items/505f369d1f77fa846a8b)
- [Raspberry Pi で toio コアキューブをコントロールする（２回目）～ Notifyの処理+おまけ)](https://qiita.com/FiveOne/items/9d4a93abb9c5d23138ce)
- [Raspberry Pi で toio コアキューブをコントロールする（３回目）～ ID(位置情報)の処理](https://qiita.com/FiveOne/items/176f5ad73d8e383b3505)

# micro:bitと連携した例
- [放課後のtoioあそび：toioをmicro:bitと連携させてみた](https://qiita.com/akichika/items/8952a522d1209c05dcd7)
- [放課後のtoioあそび：toioとmicro:bitでライントレースしてみた](https://qiita.com/akichika/items/0ad1f0d01ad5cbfe83ad)
- [#toio を Alexa や micro:bit から操作する 〜概要編〜（JavaScriptライブラリを使ってみた）] (https://qiita.com/youtoy/items/0ee56f5395e3f4c72c51)

# ROSから動かした例
- [ROS講座105 toioをROSで操作する](https://qiita.com/srs/items/d7182f66f0d18ae0bdb1)

## M5Stackで動かした例
- [M5StackでtoioとBLE通信してみた](https://qiita.com/KatsuShun89/items/1d3d1ccae226a5b73da8)
- [toioと同じように動くWHILL Model CR](https://qiita.com/KatsuShun89/items/68fde7544ecfe36096d2)

## ESP32(Arduino環境)から動かした例
- [toioをESP32(Arduino環境)で動かす](https://note.com/vhideo/n/nff5e2845beb1)

## その他いろんなデバイスとの連携の例
- [放課後のtoioあそび：ゲームやロボコンに使えてビット演算が身近になる４ボタン自作キーボード「8421キーボード」の作り方](https://note.com/akichika/n/n3c0385ed0de4)
- [#toio を Alexa や micro:bit から操作する 〜概要編〜（JavaScriptライブラリを使ってみた）] (https://qiita.com/youtoy/items/0ee56f5395e3f4c72c51)


---

まだまだたくさんありますし、見つけた順なので「紹介されてない！」という方はご容赦ください＆ぜひご連絡下さい。2019年アドベントカレンダーが終了したらまた更新したいと思います。

この記事は、（余裕があれば）地道に更新したいと思います。

それではまた！