とってもお手軽なロボット教材を作るよ（Scratch + Mabeee)

# ロボット教材つくるよ！
小学１年生の息子をロボット格闘技「[ロボワン](http://robo-one.com)」の予選に連れて行ったら、すっかりロボットの魅力にとりつかれてしまったよ:robot:　彼のお気に入りロボは「[シンプルファイター](http://robo-one.com/rankings/view/127)」とのことで、家でも弟を相手にロボットになりきってロボワンごっこざんまいだ。
「自分でもロボットをつくって[岡本先生](http://www.robotyuenchi.com/staff.html)に弟子入りしたい！」というので、親としては「[LEGO マインドストーム](https://www.lego.com/ja-jp/products/themes/mindstorms)」でも買ってあげようかな？とも思ったけど、、、まずは親がDIYの姿勢を見せるべく、家にあるもの(＋α)で、お手軽なロボット教材を作ってみることにしたよ。 I :hearts: STEM!!

# 使うもの・作るもの
少し前に「[はじめてのプログラミング](http://amzn.asia/1LObN2p0)」という本を息子に買ってあげたので、なんとなくScratchには興味を持っているようだ。また、過去に衝動的に２本も買ってしまったIoT乾電池「[Mabeee](https://mabeee.mobi)」が机の引き出しに眠っているので、これも使うよ！

 * プログラミング教材 Scratch2.0(オフライン版）
 * IoT乾電池 Mabeee ２本

また、みんな大好き100円ショップで以下のものを揃えたよ！
  * プチ電車　２台（モーター付きの駆動車）
  * リモートシャッター

プチ電車は台車部分（モーター＆ギア＆タイヤ）が欲しいだけなので、裸にしたよ。（図右下）

![IMG_8327.JPG](https://qiita-image-store.s3.amazonaws.com/0/160451/bff24023-6bde-b608-2911-0e6b279ee14a.jpeg)

これらを使って、**「Scratchでプログラミング可能なロボットカー」**を作るよ！

# 仕組み
ScratchにはHTTP拡張機能があり、これを使うとHTTPリクエストを投げるブロックが簡単につくれるんだ。また、MabeeeはMac向けにREST APIでMabeeeが操作できる「[MaBeeeMacApp](https://github.com/novars-jp/MaBeeeMacApp)」を提供しているよ。これを連携させればScratchからMabeeeを制御することができそうだね。
さらに、「[わずか300円でIoTボタンを作る方法](https://qiita.com/vimyum/items/8b7548ca8cf45383c5b0)」に書いた方法と組み合わせることでリモートシャッターとScratchも連携できそうだ。

これらの連携により、**「リモートシャッターのボタンを押す→Scratchでかいたプログラムが実行→ScratchのプログラムでMabeeeを制御してロボットカーが動作」**ということをするよ。

なお、Scratchから直接MabeeeMacAppにリクエストを投げるにはメッセージ形式などが違うので、ScrathとMabeeeMacAppの間にAPIサーバを立てるよ。APIサーバはMabeeeの初期処理（スキャン、接続）も担当するよ。

# つくりかた
## Scratchにオリジナルブロックを追加
Qiita記事「[Python で軽量サーバを作って Scratch 2 のHTTP拡張を待ち受けてみる](https://qiita.com/memakura/items/fb48d7f6fb6b4b88b5bb)」を参考に、以下のファイル(`mabeee.s2e`)を作成するよ。

```json 
{
    "extensionName": "cheap IoT",
    "extensionPort": 12345,
    "blockSpecs": [
        [" ", "でんち %m.mabeeeId をうごかす", "start", 1], 
        [" ", "でんち %m.mabeeeId をとめる", "stop", 1], 
        [" ", "でんち %m.mabeeeId のはやさを %n にする", "setSpeed", 1, 50],
        ["b", "準備ができた", "ready"],
        ["b", "ボタンがおされた", "push"],
    ],  
    "menus": {
        "mabeeeId": [1, 2], 
    },  
}
```

`extensionPort`にはAPIサーバのポート番号を設定するよ。ScrachのHTTP拡張はAPIサーバの`/poll`に対して定期的にリクエストを投げてポーリングする仕様なんだ。下はコメント付きの抜粋だよ。詳細はこちらの[解説PDF](https://wiki.scratch.mit.edu/w/images/ExtensionsDoc.HTTP-9-11.pdf)を参照だ。

```js
[ " ",  // 種別：ScarachからAPIに対してリクエストを送信するブロック
  "でんち %m.mabeeeId のはやさを %n にする", //%mは"menus"からプルダウン選択、%nは数値入力
  "setSpeed", // APIのパス。この場合、localhost:12345/start/%m/%n　にリクエスト。
  1, 50 // %m、%nのデフォルト値
],
[ "b", // 種別：ポーリングのボディに含まれる値(boolean)を取得するブロック
  "準備ができた", 
  "ready"　// ポーリング時に取得する名前
],
```

作成したファイルをScrachに読み込むよ。左上のメニュー「ファイル」をShiftキーを押しながらクリックすると、裏メニュー？的に「じっけんてきなHTTPかくちょうをよみこむ」が表示されるから、ここから作成したファイルを読み込もう。すると、「そのた」ブロックとして定義したブロックが表示さるよ。

<img width="703" alt="スクリーンショット 2017-10-22 9.20.18.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/275f2522-4f1b-fe66-31fa-0a339e0e5189.png">

## MaBeeeMacAppを準備
[こちらのサイト](https://github.com/novars-jp/MaBeeeMacApp)からダウンロードしてね。解凍してダブルクリックするだけで実行できるよ。実行後はステータスバーに電池マークが表示されるよ。時々おちるから、ステータスバーを確認しよう。

## ScratchからのリクエストをMabeeMacAppにわたすAPIサーバー
APIサーバでは主に３つのことを担当するよ。

 * ScratchからのAPIリクエストを変換してMabeeeMacAppに送信
 * 初期処理（MabeeeMacAppとMabeeeとの接続など）を実施し、完了をScratchに通知
 * リモートシャッターのボタンが押されたことをScratchに通知

APIサーバでは、起動時にMabeeeデバイスのスキャン・接続を行うよ。接続が完了するとScratchからのポーリングに対して変数`ready`を`true`で応答するようにしているよ。これでScratchの「準備ができた」ブロックを監視してMabeeeとの接続処理が完了したか判定できるね。
また、リモートシャッターからAPIリクエストが来た場合は、ポーリングに対して変数`push`を`true`で応答するよ。同様にScratchの「ボタンがおされた」ブロックを監視してリモートシャッターのボタンが押されたかどうか判定できるね。

ポーリングに対する応答は具体的には下記のようなコードになるよ(Node.js + Express)。

```js
// Scratchによるポーリングへの応答
app.get('/poll', function (req, res) {
    // レポーターブロックへ値を返す
    res.send(`ready ${isReady}\npush ${isPush}`);
});

```
APIサーバー全体の[ソースコード](https://gist.github.com/vimyum/d5469c14204132891a1adb595f7eb183)はGistに上げておくよ。

## リモートシャッターのボタン操作をScratchに通知する
[わずか300円でIoTボタンを作る方法](https://qiita.com/vimyum/items/8b7548ca8cf45383c5b0)」で、リモートシャッターのボタンを押すとHTTPリクエストをなげる方法をかいたね。先ほどのAPIサーバにリクエストを投げて、APIサーバではポーリングに応答する値を変えるため、`isPush`変数をtrueにしているよ。

# 完成！Scratchでプログラムできるロボットカー:red_car:！
うごかす車体は100円ショップで買って来たプチ電車を裸にして、適当に切ったダンボールにはめ込めば完成だ。左右の電車をバラバラに制御できるから、方向転換も自由自在だ。
![IMG_8335.JPG](https://qiita-image-store.s3.amazonaws.com/0/160451/63b1bb5a-c003-ad49-761d-9f1ee377c3c0.jpeg)

あとは、Scratchでお試しプログラムを書いてみるよ。はじめてScratchを使ったけど、雰囲気でなんとなくかけちゃうよ。Scratchすごい！
<img width="471" alt="スクリーンショット 2017-10-21 14.59.49.png" src="https://qiita-image-store.s3.amazonaws.com/0/160451/8991c09b-df0e-7d96-5807-8da5de033fe0.png">

実際に動かした様子！再起動とか不要でScratchに書いたプログラムがすぐにロボットカーに反映されるのでとっても楽しいです :smile: 

<blockquote class="twitter-tweet" data-lang="en"><p lang="ja" dir="ltr">Scratchでロボットカー<a href="https://t.co/Pqq8bEwod7">pic.twitter.com/Pqq8bEwod7</a></p>&mdash; sagara (@vimyum) <a href="https://twitter.com/vimyum/status/921940456526643201?ref_src=twsrc%5Etfw">October 22, 2017</a></blockquote> <script async src="//platform.twitter.com/widgets.js" charset="utf-8"></script>