【Scratch 2019】Scratch と micro:Maqueen を連携させる（2019/12/19）

この記事は 「[Scratch Advent Calendar 2019](https://qiita.com/advent-calendar/2019/scratch)」の 19日目の記事です。

今年の Scratch Advent Calendar には、既に以下の記事 3つを投稿していますが、また記事を書いてみようと思います。

- [機械学習・音声認識・デバイス連携の独自拡張（2019/12/6）](https://note.com/youtoy/n/nba3960d52ccb)
- [画像認識・デバイス連携・関連の独自拡張（2019/12/7）](https://note.com/youtoy/n/n8cae77447867)
- [Scratch と micro:bit で鳴き声がする動物パズルを作る（2019/12/12）](https://qiita.com/youtoy/items/91b6b8521bc2eead63d9)

## はじめに

何を書くか悩みましたが、最終的に上記のアドベントカレンダー用記事にも登場している、今年1番大活躍の [micro:Maqueen](https://wiki.dfrobot.com/micro:Maqueen_for_micro:bit_SKU:ROB0148-E(ROB0148)) 関連の話を書こうと思います。

具体的には、[Junya Ishihara（@ jishiha）さん](https://twitter.com/jishiha)が公開されている独自環境の Scratch で利用可能な、micro:Maqueen用の独自拡張「[Scratch2Maqueen](https://champierre.github.io/scratch2maqueen/)」の話になります。

## Scratch2Maqueen

### 関連ページ

Scratch2Maqueen について、Web上の関連ページを見てみます。
以下のページが、利用方法などの掲載があるページです。

- Scratch2Maqueen | scratch2maqueen
    - https://champierre.github.io/scratch2maqueen/
- champierre/scratch2maqueen: Control DFRobot Maqueen from Scratch
    - https://github.com/champierre/scratch2maqueen

上記のページから、使い方の部分を抜粋してみます。

> **Usage**
> ▼ Setup
>  1. You need the special hex file to be downloaded to your micro:bit. Open the MakeCode project below, then click Download to install the .hex file.
> »[MakeCode project:scratch2maqueen](https://makecode.microbit.org/90264-89137-18586-73605)
> 2. Open https://champierre.github.io/scratch3/.
> 3. Open “Choose an Extension” window and select “Scratch2Maqueen”.
> 4. Run [Scratch Link](https://scratch.mit.edu/microbit), then connect to the micro:bit set on Maqueen.
> 5. After you connect to the micro:bit, you need to calibrate the micro:bit compass. ([Calibrating the micro:bit Compass](https://support.microbit.org/support/solutions/articles/19000008874-calibrating-the-micro-bit-compass))

#### 使い始めるためのステップ

日本語でおおまかな流れを書くと、以下の通りとなるようです（元のものと一部、順番が違ってますが、前後しても大丈夫なところです）。

1. [指定された MakeCode のプロジェクトの内容](https://makecode.microbit.org/90264-89137-18586-73605)を micro:bit へ書き込む
2. PC で ScratchLink を起動する
3. PCで[独自環境に用意された Scratch](https://champierre.github.io/scratch3/) を開く
4. 上記 3 で開いた Scratch の拡張機能の選択画面で「Scratch2Maqueen」を選ぶ
5. Scratch と micro:bit との接続の操作をする
6. micro:bit でコンパスの調整が始まるので、micro:bit を決められた通りに動かして調整を完了させる ⇒ 詳細は「[この Webサイト](https://support.microbit.org/support/solutions/articles/19000008874-calibrating-the-micro-bit-compass)」を参照して実施
7. 調整が完了したら、Scratch と micro:bit がつながる

自分のはまりどころは、上記の 5〜6 のあたりで、Scratch との接続をするときに、コンパスの調整の操作を完了させて初めて接続が完了する、というところでした。
公式の Scratch 3.0 と micro:bit の接続では、micro:bit に所定のファイルを書き込んで、かつ、PC側で Scratch Link を起動していれば、あっさり Scratch と micro:bit の接続操作は完了できるので、そのイメージがあったせいか、「なぜか接続できない！？」と思った以上に迷ってしまいました。

無事に接続ができたところで、拡張機能を使うステップへ進んでいきます。

### 拡張機能で使えるブロック

#### Scratch の拡張

ここで、拡張機能でどんなブロックが利用可能かを、[独自で用意された Scratch環境](https://champierre.github.io/scratch3/)で見てみます。

拡張機能の一覧で、3番目に表示されています。

<img width="379" alt="Scratch_3_0_GUI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/512d1543-06aa-c92c-11ac-fa82a46f0f73.jpeg">

この拡張機能を選ぶことで表示されるブロックは以下のとおりです。

<img width="366" alt="Scratch_3_0_GUI2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e6779a15-bc51-8e3c-b18a-aff5a7974444.jpeg">
<img width="367" alt="Scratch_3_0_GUI3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ff00591c-7d67-6899-3b42-fc0ae81a4eb4.jpeg">

上から順に、このような処理のためのブロックが並んでいるようです。

- micro:Maqueen側の機能
    - モーター制御
        -  両輪をそれぞれ動かしたり止めたりするブロック
    - センサー利用
        - 超音波距離センサ
        - 底面のライントレース用センサ① 
        - 底面のライントレース用センサ②
    - 前面の単色LED関連
        - 左側LEDの ON/OFF
        - 右側LEDの ON/OFF
- micro:bit本体の機能
    - micro:bit上のボタンの押下関連
    - micro:bit上の LED 関連（アイコン表示、文字表示、表示を消す）
    - micro:bit内の センサ関連（照度、コンパス、加速度関連）

#### MakeCode の拡張機能との比較

ここで、[MakeCode用の拡張機能](https://github.com/DFRobot/pxt-maqueen)と簡単に比較してみます。
2020/12/19時点では、MakeCode で [micro:Maqueen の拡張機能](https://github.com/DFRobot/pxt-maqueen)を読み込むと、メニューの中に「MaqueenIR」と「Maqueen」
という 2つの追加項目が表示されるようです。

<img width="369" alt="Microsoft_MakeCode_for_micro_bit.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/e456c461-cc78-241a-d305-9a798e1be325.jpeg">

##### 項目「MaqueenIR」

「MaqueenIR」のほうは、赤外線受信関連の機能が 2つ並んでいました。

<img width="418" alt="IR1.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9dd2d3b9-bffb-18a3-af6a-25ac9217c810.jpeg">

1つ目のブロックは、ボタン押下を条件に処理を行うようなブロックになっているようですが、選択項目で出てくるものはプリセットされた赤外線リモコンのボタンという感じに見えました（実際に試せてないです・・・）。

<img width="378" alt="IR2.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/ac7beec2-38ee-723f-8e64-e83a8285c063.jpeg">

自分が micro:Maqueen を買ったころから拡張機能のバージョンアップが行われたのですが、こちらは以前はなかった項目のように思います（見落としていただけだったりして・・・）。

##### 項目「Maqueen」

「Maqueen」のほうは、モーター制御や LED制御などの色々な機能が並んでいます。

<img width="396" alt="IR3.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/9601dcda-5d3c-8078-de09-e08d2ca11729.jpeg">

具体的には、おおよそこんな感じです。

- 赤外線受信関連
- 超音波距離センサ関連
- タイヤを動かすモーターの制御
- サーボモーターの制御（※バージョン4以上）
- 底面のライントレース用のセンサ関連
- 前面の単色LED関連

また、底面にフルカラーLEDが4つついていますが、こちらは NeoPixel拡張を利用して制御する形です。また、ブザーもついているので、音を鳴らす処理も利用できます。

どんなセンサ等が組み込まれているかは、[スイッチサイエンスさんの Micro: Maqueen のページ](https://www.switch-science.com/catalog/4969/)を見るのが分かりやすいです。
以下、そのページからの一部抜粋です。

>- 赤外線グレースケールセンサ（High-Lowレベル）× 2
- ブザー × 1
- 赤外線受信機（NECデコーダ）× 1
- LEDライト（High-Lowレベル制御）× 2
- RGB LEDライト（1600万色）× 4
- SR04、SR04P超音波インタフェース（5 V）× 1
- I2Cインタフェース（3.3 V）× 1
- Gravity拡張インタフェース（P1、P2）× 2
- N20オールメタルギアモーター × 2

### 実際に試してみる

#### キー入力で走行を制御

それでは、Scratch と micro:Maqueen の連携を試してみます。
まずは、単純に「キーボードの矢印キーを押すと特定の方向に走る」というものをやってみました。

プログラムはこれだけです。

<img width="558" alt="Scratch_3_0_GUI.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/66277ff4-65ab-2a59-e606-160a22df01d0.jpeg">

そして、実際に動作させた様子がこちらになります。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr"><a href="https://twitter.com/jishiha?ref_src=twsrc%5Etfw">@jishiha</a> さんが提供されている、Scratch2Maqueen を試してみた動画。<a href="https://t.co/A2Ibz2MyrT">https://t.co/A2Ibz2MyrT</a> <a href="https://t.co/7zqXXKj3Zh">pic.twitter.com/7zqXXKj3Zh</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1207651146396889089?ref_src=twsrc%5Etfw">December 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

LEDの光り方が意図通りではないですが、全体としては思った通りの挙動になりました。

#### 超音波距離センサを使ってみる

あともう1つ、micro:Maqueen の持つ機能である、超音波距離センサを試してみます。
距離に関する設定をするブロックは、条件文の中で使うもののため、とりあえず「ずっと」ブロックの中に条件文を作って、そこで micro:Maqueen を停止させる契機として使ってみます。

プログラムは以下のとおりです。

<img width="550" alt="Scratch_3_0_GUIa.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/50868/04aaca7d-4500-c535-2be7-d42a13dfec8a.jpeg">

また、それを実際に動作させた様子を動画にしたものがこちらです。
動画の最初は、前に進んで後退してという動きをしますが、その後の部分では手がかざされたところで停止するのが分かるかと思います。

<blockquote class="twitter-tweet" data-conversation="none"><p lang="ja" dir="ltr">こちらは続き。<br>超音波距離センサを使ったものです。<br><br>障害物がなければ前後に移動して止まり、もし障害物があれば緊急停止してLEDが点灯するというもの。 <a href="https://t.co/INKQL3SP0p">pic.twitter.com/INKQL3SP0p</a></p>&mdash; you (@youtoy) <a href="https://twitter.com/youtoy/status/1207655544523128832?ref_src=twsrc%5Etfw">December 19, 2019</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

## おわりに

今回、Scratch と micro:Maqueen を連携させて、キーボードでの micro:Maqueen の操作をやってみたり、距離センサーを使ったプログラムを試してみました。
今回は、拡張機能の一部のみを試しましたが、様々ある拡張機能同士を混ぜて使ってみたら面白いことができそうで、何か考えて試してみようと思います。