放課後のtoioあそび：toioとmicro:bitでライントレースしてみた

この記事は「[toio™(ロボットトイ | toio（トイオ）) Advent Calendar 2019](https://qiita.com/advent-calendar/2019/toiotomo)」に参加している趣味のブログです。
[toio](https://toio.io/)と[micro:bit](https://microbit.org/ja/guide/)を連携させるための基本的な方法は[こちらの記事](https://qiita.com/akichika/items/8952a522d1209c05dcd7)を参考にしてください。

# toioとmicro:bitでライントレースロボットを作る

[前回の記事](https://qiita.com/akichika/items/8952a522d1209c05dcd7)ではmicro:bitを傾きコントローラーにしてtoioを動かしてみました。
今回は、toioの上にmicro:bitを搭載し、さらに白黒を判別するセンサーを用いて黒い線の上に沿って走るライントレースロボットを作ってみたいと思います。
絶対位置を全く使わないので全然toioらしくないのですが（笑）、ライントレースロボットはロボット工作の中でも古典的で定番でもあるので、一応toioとmicro:bitでも伝統にならってやってみたいと思います。
制御工学の基礎の基礎としても直観的でわかりやすいと思うので、ぜひ試してみてください。

完成イメージはこちらです。
<blockquote class="twitter-tweet"><a href=https://twitter.com/akichika/status/1203279019770142720/></blockquote>

また、これを実現するプログラムはとても簡単で、これだけです。なぜこれでライントレースができるのでしょうか？その秘密を知るにはぜひこの記事を詳しく読んでみてください。
<img width="534" alt="Visual_Programming__beta_-4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/2c3a2668-517e-83b4-16eb-1a9b38b2a3e1.png">

では、早速作ってみましょう。

# 必要なもの
- [toio コア キューブ](https://toio.io/platform/)（以降キューブ）　1台
- [micro:bit](https://www.switch-science.com/catalog/5263/) 1個
- [micor:bit用ケース](https://www.switch-science.com/catalog/5306/) 1個
- micro:bit用のMicro USBケーブル 1本
- [micro:bit用の電池ボックス（単4x2）](https://www.switch-science.com/catalog/5277/) 1個
- Mac　1台（※toio Visual ProgrammingのWindowsへの対応は2019年12月の予定とのこと）
- [A3用紙（32mmの太さの黒いラインを引いたもの）](https://www.dropbox.com/s/eonq6yakpiuf3r0/toio-vp_line-trace_track.pdf?dl=0)
- ライン検出センサー：[GROVE ラインファインダ v1.1](https://www.switch-science.com/catalog/3082/) 2個

※今回の組み立てに半田付けは必要ありません。

# ライン検出センサーについて
ライントレースロボット用のライン検出には白と黒の反射強度の違いを使って判別する方法が一般的です。これには一般的にフォトリフレクタという赤外線LEDと赤外線フォトダイオードを組み合わせたセンサーが使われます。
一般にこういったセンサーは反射強度の白と黒の間の閾値調整（検出レベルの調整）が必要なのですが、今回は調整用の半固定抵抗があらかじめ搭載されたキットを使うことでドライバーを回すだけで簡単に調整できます。

今回使用したセンサーの詳細はこちらをご覧ください。

[GROVE ラインファインダ v1.1](https://www.switch-science.com/catalog/3082/)
![IMG_1485.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/d7112112-a934-d652-ac6d-f70e4a9e09ab.jpeg)

![IMG_1490.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/3933f222-9b91-4465-572a-98f280098d06.jpeg)


# 準備
## micro:bitの準備
micro:bitをtoioと連携させるにはScratch LinkのインストールとHEXファイルの書き込みが必要です。詳しくは[こちらの記事](https://qiita.com/akichika/items/8952a522d1209c05dcd7)の「準備」を参照してみてください。

## センサーの配線

センサー側はコネクタがついているのですが、micro:bit側はコネクタがないので、センサーに付属のケーブルを半分に切ってリード線を剥いて配線します。
ワイヤーストリッパーなどを使って下記のように仕上げてください。
![IMG_1500.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/4c96c273-dcd9-0f6d-99c9-7ec27e1b94b5.jpeg)

今回センサーを2個使いますが、電源は同じ端子から引き出すので、電源（赤）とGND（黒）のリード線それぞれをより合わせてください。

## micro:bitへの配線
センサーのリード線を配線しますが、今回半田付けをしなくてよいようにネジ止めにて配線します。
下記のようにmicro:bitのワニ口クリップ用の端子にリード線を差し込み、さらにネジを差し込みます。
このままネジ（M3皿ネジやM3ナベ）でリード線を共締めすることでリード線を簡単に固定できます。
しっかりネジを緩みなく締め、リード線が周囲の端子に触れないように気をつけてください。
![IMG_1503.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/5f1702c1-bec8-43f5-11d3-66e2126208ae.jpeg)

![IMG_1507.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/b608f83a-641e-4b3f-5c70-f7e637643665.jpeg)

![IMG_1509.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/4b9506dd-12b9-8995-e410-134fa795f6b7.jpeg)

今回手近なねじの都合で2種類のねじが混ざっていますが、本来は1種類で統一して問題ありません。
![IMG_1511.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/851b662b-4296-d2a7-d6e2-7d985ea250e8.jpeg)

全体像はこうなります。
![IMG_1514.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/e397d38f-44e1-4a1a-6747-21a10cc26f79.jpeg)

最後に、micro:bitにケースを取り付け、さららに電池ボックスを取り付けて両面テープで固定します。
センサーのコネクタとケーブルも接続します。
![IMG_1561.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/70fd859c-021b-7c74-3870-b82e51c43ab5.jpeg)

![IMG_1556.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/9df31743-fc46-5e93-81d7-de4fa832e697.jpeg)


## 組み立て
レゴ®ブロックを使ってセンサーをマウントします。まずはキューブにベースとなるブロックを取り付けます。
下記のようなブロックを準備し取り付けてください。似たような配置になれば全く同じ部品でなくても構いません。
![IMG_1567.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/60d34413-81e4-e19c-c4b1-0b73a1365158.jpeg)

![IMG_1569.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/e6ec19ca-d72d-a912-688e-6f18698ef922.jpeg)

センサーとブロックの固定には両面テープを使用します。センサーが地面すれすれ（1㎜程度の隙間）になるように調整してください。
![IMG_1493.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/9199489f-afcd-9fb3-fbb8-c18b6aa7e114.jpeg)

![IMG_1498.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/1f943092-4b13-7694-c677-0380c84f0cc0.jpeg)

最後にmicro:bitを固定します。
![IMG_1587.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/f8849011-50d1-1140-8cb4-2b2e6b3a423e.jpeg)

![IMG_1576.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/51c0af58-de88-d09a-ebcf-c6611d389a73.jpeg)

これで完成です！

## センサーの微調整
まずラインを引いたA3用紙を準備してください。データは[こちらからダウンロード](https://www.dropbox.com/s/eonq6yakpiuf3r0/toio-vp_line-trace_track.pdf?dl=0)できますので、印刷して使用します。ロボットを走らせるトラックのデザインは自由に変えて問題ありませんが、線は100%の黒、幅は32mm、曲率はできるだけ緩やかにしてください。
紙の上にロボットを乗せ、精密ドライバー（＋）などを使いセンサーの半固定抵抗を白と黒の上で微調整します。白と黒を交互に検出してキビキビと切り替わるようにしっかり調整してください。

![IMG_1597.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/ee6dd377-e21e-a884-a24d-0e2feef455d5.jpeg)

![IMG_1601.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/65a07f8f-66ff-9df6-620f-59e410cf6517.jpeg)

うまく調整できると、下記のように白い部分ではLEDが赤く光り、黒い線の上では光らなくなります。
<blockquote class="twitter-tweet"><a href=https://twitter.com/akichika/status/1203332983773528069/></blockquote>

# プログラムを作る

なんと今回はたった2つのセンサーしか使わずにライントレースを行います。通常は3つ以上のセンサーを使うことが多いので、おそらくライントレースを実現できる最小限の構成となります。

アルゴリズムの概要はとても簡単で、


>・右のセンサーが白を検出した（＝ロボットがラインの右側にはみ出ている）
　→右のモーターだけを回して左折する
>・左のセンサーが白を検出した（＝ロボットがラインの左側にはみ出ている）
　→左のモーターだけを回して右折する
>・以上をずっと繰り返す

というものです。

これをVisualProgrammingで実現する場合、micro:bitの端子入力ブロックは変化があった時のみイベントが発生するので、下記のように変数を用いることで状態を保持（ラッチ）することができます。こうすることで、反転するまではずっと右折・左折どちらかに固定されて動き続けます。

<img width="483" alt="Visual_Programming__beta_-6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/583525b0-0537-6e5e-e9f3-af48fb5b26f9.png">

ピン番号はセンサーの左右の配線との対応をよく確認して選択してください。

<img width="248" alt="Visual_Programming__beta_.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/64a675ba-7ec3-85f7-a61b-7092ea9d594a.png">

そしてこれをモーターの動きに反映するのが下記のブロックになります。

<img width="495" alt="Visual_Programming__beta_-5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/c4131d97-38ae-6756-a448-352675f65683.png">

あらためて、全体としてはたったこれだけですが、ライントレースのプログラムの完成です！
<img width="1220" alt="Visual_Programming__beta_-3.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/dc9ba983-5886-8748-a332-bd3eddb1ffd4.png">


# ライントレースロボットを走らせてみる

それではラインを引いたA3用紙の上にロボットを乗せて、実際に走らせてみましょう。
VisualProgrammingの右上のスタート（緑の旗）を押せば走り始めます。
非常にゆっくりですが、無事にライントレースを実現することができました！
<blockquote class="twitter-tweet"><a href=https://twitter.com/akichika/status/1203279019770142720/></blockquote>

なお、スピードを速くすると制御が追い付かず脱線してしまいますので、この速度が限界かもしれません。
とはいえ、超ミニチュアでお手軽なライントレースロボットして、個人的には満足しています。


# 参考：micro:bitブロック

今回の例は、toioにそのままでは取り付けられない外部センサーをmicro:bitを使って連携させるサンプルとしても活用できるかと思います。付録としてtoioのVisualProgrammingで使えるmicro:bitブロックの全体像を紹介します。これは[Scratch3.0](https://scratch.mit.edu/)のmicro:bitブロックと同等になっています。

<img width="238" alt="Visual_Programming__beta_-2.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/33040/8b750f5a-6107-4203-0472-5771d6a82641.png">


# まとめ

今回はtoioとmicro:bitをVisual Programmingで連携させ、やや無理矢理にライントレースロボットを作ってみました。一般的なライントレースロボットに比べ、toioを使うと非常に手軽に組み立てて動かすことができます。また、たった2つのセンサーでも一応ライントレースロボットが作れるというのも、なかなか面白いポイントなのではないかと思います。

なお、今回はラインの検出をデジタル入力（白・黒の判定のみ）で行っていますが、回路をもっと作りこんでアナログ入力を用いれば、もっと柔軟で高速なライントレースを実現することもできます。残念ながらtoioのVisualProgrammingではmicro:bitのアナログ入力ブロックがないので、JavaScriptなど他の言語や開発環境を使う必要がありますが、興味のある方はチャレンジしてみてください。

また機会があればmicro:bitに周辺回路を取り付けた例をさらに深掘りしていろいろ作ってみたいと思います。それではまた！