Scratchとmicro:bitでコイン選別AIロボットを作る

10円と100円を自動判別して振り分けるロボ

Scratch3.0にはmicro:bitと連携する標準の拡張機能が用意されています。ただし使えるmicro:bitの機能は、傾きセンサー、ボタン、P0~P2端子のタッチ、ScratchからのLEDの点灯に限定されています。
Scratch Teamのメンバーに機能を限定している意図を訊いてみたところ、「低い床」(入門のしやすさ)の理念により、なるべくブロックの数を増やしたくない、ということでした。
なるほどとは思いますが、一方でScratchには「広い壁」(広い応用範囲)「高い天井」(高度なプログラミング)の理念もあるわけで、 micro:bitの魅力は小さくて安価なボードにかかわらず、各種センサを搭載して、デジタル・アナログの入出力もできるところにあるのですから、できればフルに機能を使いたい。
という要望に応えて頂いたのが、 横川 耕二 さん開発の「Scratch-microbit-more」です。
https://lab.yengawa.com/project/scratch-microbit-more/

一方で、ScratchからTensorFlowで画像を機械学習できるようにした、凄い拡張機能が、 石原 淳也 さん開発の「ML2Scratch」です。
https://github.com/champierre/ml2scratch

この2つは共存できなかったのですが、つい最近お二人のコラボにより「ML2Scratch」の開発環境で「Scratch-microbit-more」の拡張機能が使えるようになり、機械学習+フィジカルコンピューティングが手軽に実現できるようになりました。
それぞれの使用方法は、上記のリンクをよくお読みください。

必要な材料は
・Webカメラ
・模型用サーボ(SG90)
・micro:bit
・電池ボックス(単4、または単3が3本入るもの)
・構造材(レゴを使いましたが、ボール紙でも何でもいいです)
・厚紙(コインを載せるテーブル用)
・セロハンテープ、両面テープ
・ワニ口クリップつきリード線

全体の構造はこんな感じ。

構造部分。

配線は、サーボの電源をmicro:bitと分けるようにします。micro:bitの電源はUSB端子からの供給で大丈夫です。電池のマイナス側、サーボのグラウンド(SG90の場合は茶色い線)を両方ともmicro:bitのGND端子に接続します。

システムが組み上がったら、ML2Scratchにコインの画像を学習させます。
ラベル1~3を使い、3種類の状態を学習させます。
ラベル1=10円の画像
ラベル2=100円の画像
ラベル3=コインがない画像

まず厚紙のテーブル上に10円玉を置き、画面に表示している状態で「ラベル1を学習する」のブロックをクリックします。「ラベル1の枚数」のチェックボックスをオンにしておくと、ステージ上にクリックした回数が表示されます。コインを裏返したり、向きを変えたりしながら10回程度クリックして学習させます。

ラベル2で100円玉を、ラベル3で何も置かない状態を同様に10回程度学習させます。

完了したら「学習データをダウンロード」をクリックしてファイルに保存しておきましょう。現在のML2Scratchはプログラムを終了すると学習結果がリセットされてしまうので、次回は保存しておいた学習データをアップロードして取り込みます。

学習が済んだら、テストしてみましょう。「ラベル1を受け取ったとき」のブロックで、10円を認識したときの動作が定義できます。ラベル2,3も同様です。
この例では、何もコインがないときはmicro:bit moreでサーボ角を90度(テーブルを水平位置)にし、10円を認識したらサーボ角を45度に傾け、100円を認識したら135度に傾けるようにしています。

ML2Scratchは、プログラムをクラウドに自動保存できませんので、プログラムはファイルメニューから自分のコンピューターに保存しておく必要があります。