ScratchでLEGO Mindstormsを動かしてみる

前回：[機械学習×Scratch!? 使ってみた](https://qiita.com/Hiroki-Fujimoto/items/221d5394dc1b4887c437)

前回の投稿から期間が空いてしまったが、Scratchの続編。前回は[こちら](https://qiita.com/Hiroki-Fujimoto/items/221d5394dc1b4887c437)を参照してほしい。
今回は教育版 LEGO® MINDSTORMS EV3(以降EV3)をScratchを使って簡単な制御を行ってみる。次回はML2ScratchとEV3を組み合わせてAIロボットを作る予定。  

## 今回使うロボット・モデル
Scratchでは様々なデバイスを拡張機能として制御することができる。microbitやWeDo2.0などが挙げられるが今回はLEGO Mindstorms EV3を利用する。  
EV3はレゴブロックとモーターやセンサーをあわせて組み立てたロボットを、プログラムで自由に制御することができる製品である。詳しくは以下を参照してほしい。
[教育版レゴ® マインドストーム® EV3製品詳細](https://afrel.co.jp/product/ev3-introduction)


今回のEV3はトレーニングロボットと呼ばれるモデルを使用していく。
<img width="300" alt="21.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/0a6e1fe2-10c5-bc23-4236-2b6eaae3b9fe.png">

## Scratch上でEV3を使う準備 ScratchLink
Scratch3.0およびScratch3.0ベースでデバイスを制御するためには、ScratchLinkというソフトウェアをインストールする必要がある。以下の[サイト](https://scratch.mit.edu/ev3)から環境に合わせてインストールする。  

Windows環境ではMicrosoft Storeからインストールするか、セットアップファイルを直接ダウンロードしてインストールするか選択することができる。(今回はセットアップファイルを利用してインストールする。)
<img width="700" alt="4.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/a6408a8b-f491-4ea0-2e76-2ca90ba8849b.png">

ダウンロードしたファイルを解凍し、中のmsiファイルを実行する。  
<img width="400" alt="5.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/4ee089b8-8eb1-0239-667a-7aa8d974f7fd.png">
<img width="400" alt="6.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/eb101cf9-ddfa-08f0-b423-8df6a7a7fe9d.png">
セットアップのウィザードが開くので表示に從い進める。基本的に難しいことはないので問題ないと思う。最後のLaunch Scratch Linkの欄にはチェックをいれて「Finish」する。  
<img width="400" alt="7.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/604c2e9d-f1d1-30b1-1bc8-ffec84fb282e.png">
<img width="400" alt="8.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/9dbd57a2-7460-7208-d442-9c3608ff77d4.png">
<img width="400" alt="9.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/43c7efb1-1528-f095-0341-c91498f0f7e9.png">


ScratchLinkが起動されていると画面右下のツールバーにアイコンが表示される。  
<img width="400" alt="10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e9eaaf54-42c1-ec97-5677-3663b57cd9af.png">

## Scratch上でEV3を使う準備 拡張機能の追加とペアリング
続いてScratch上でEV3をBluetoothを用いてペアリングしていく。
まずは前回同様[こちら](https://stretch3.github.io/)からカスタムされたScratchを開く。（通常のScratchでもEV3を扱うことができるが、今後AI系の拡張機能も合わせて使っていくためここは統一してカスタムされたScratchを使っていく。）
ちなみに推奨されるブラウザはChrome。  
画面が開けたら左下のマークを選択してEV3の拡張機能を追加する。
<img width="600" alt="0.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/85c80658-7a9f-755a-a768-2a2c153ad30d.png">
<img width="700" alt="1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e17d6f05-55f0-04a5-0da9-6979f20f3fd2.png">

  
拡張機能を選択すると、すぐにペアリングの画面が出てくる。(追加されたブロックの欄にあるマークを選択することでペアリングも可能)
EV3の電源が入っていれば検索一覧にデバイスが表示されるので「接続する」を選択しペアリングを行う。  
<img width="300" alt="11.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/939e348d-8cd1-13bc-1c31-1f42fe1bfb53.png">
<img width="200" alt="10-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/dbc3339e-4b8f-8bfc-8144-6758d9e7abab.png">
  
続いて以下のようにPINコードを確認される。
<img width="300" alt="12.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/73ad3007-5a75-ad8e-772e-07ff0108c639.png">

それと同時にEV3の液晶ディスプレイを確認するとPCからの接続を許可するか聞かれるので許可し、続いてPINについても確認されるため「1234」の状態で決定する。  
<img width="300" alt="IMG_5718.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/1f713a85-0d51-f21f-67db-16b6088e207c.jpeg">
<img width="300" alt="IMG_5719.jpg" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e4de701f-d313-449a-af46-b6b1bc958b62.jpeg">

接続が完了すると以下のように表示されるので「エディターへ行く」を選択する。  
<img width="300" alt="13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/f76e1f68-0e22-2dc2-a952-512f5d82672a.png">
これでプログラムを作成し、実行する環境が整った。  

## 簡単なプログラムを作ってEV3を動かしてみる  
ここからは実際にScratch上でプログラムを作って、EV3を動かしてみる。
EV3を制御するプログラムを作る上でモーターやセンサーが接続されているポートを把握する必要がある。今回は以下のようにEV3にモーターが接続されている。
・左モータ　Bポート
・右モータ　Cポート
  
まずは以下のようにブロックを配置して、それぞれをクリックして動きを確認してみる。
<img width="900" alt="15.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/295c387e-1ef0-12af-243c-690182bd7c42.png">
配置したブロックを拡大すると･･･
<img width="900" alt="15-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/9ee4a29a-1ae2-aa95-9ffd-b373350cae18.png">

モーターの回転方向を制御するブロックは「こちら向き」「あちら向き」と少し分かりづらい表記になっているため実際に動かして動作を確認してみる。
左側のブロック「こちら向き」をクリックすると以下のように動作する。
<img width="300" alt="1.git" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/7b9156e7-10a6-48ff-8170-73c5638b9ab5.gif">
右側のブロック「あちら向き」をクリックすると以下のように動作する。
<img width="300" alt="2.git" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/2524b5b3-d1cf-ce67-930e-e8d31f3ae486.gif">
「こちら向き」が今回のロボットの形では前進になるため、今度は以下のようにプログラムを作り変えていく。BポートとCポートのモーターを同時に動作させるプログラムになっている。 
<img width="900" alt="16.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/04f5395d-f965-dc28-4de1-9286061f859c.png">
配置したブロックを拡大すると･･･
<img width="900" alt="15-1.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/649267fe-83dd-baa0-ad18-c822ab6e2757.png">

旗マークをクリックすると以下のように動作する。  
<img width="300" alt="3.git" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e9d3717d-6bef-c50a-5eaf-eba98ea592cc.gif">

ここまでのプログラムで前進・左右旋回の動かし方はわかった。また、「あちら向き」に変えることで後退させることもできるのがわかった。

## ScratchのスプライトとEV3の動きを連携させる  
では応用として、ここまで作ってきたEV3の動きとスプライトの動きを連携させるプログラムを作ってみる。
プログラムとしては以下のように作る。
・EV3をキーボードの矢印キーで操作する(前進・後退・左右旋回)
・スプライトの猫もEV3が動くのに合わせてステージ上で動く(座標・方向が変わる)
・スペースキーで猫を中央にリセットする  

プログラムを以下のように作った。  
<img width="900" alt="18.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/1fca6c40-f162-ffdc-8e60-1a85dab6b1bb.png">
<img width="900" alt="19.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/715e74f5-66af-f24e-658d-402d07cc494a.png">
<img width="900" alt="20.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/e678096a-d81b-4a5c-3e9a-5ea57eaa5757.png">

動作としては以下のようになる。  
<img width="900" alt="4.git" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/440646/426b299b-3c4f-58de-9ef2-ff95b9b5e0ee.gif">

猫の動きとEV3の操作を関連付けることができた。  
  
## まとめ  
今回は、モーターのみを使った制御をScratchと連携させて行った。使ってみた感じとしては、モーターやセンサーが接続されているポートをしっかり把握してブロックの設定を変えれば簡単に動かせる敷居の低さを感じた。またプログラムを作成してから実行するまでにコンパイルやファイル転送等を必要としないのもストレスを感じずにできている。応用としてここにセンサーの制御を交えることでさらに実現できる動きを拡張することができる。またセンサーで判断を前回利用したML2ScratchなどのAIによる制御に置き換えることもできる。次回以降は他のAIの拡張機能やEV3とAI拡張の連携を試していく。  

次回：[機械学習モデルとScratchを連携! TM拡張機能使ってみた](https://qiita.com/Hiroki-Fujimoto/items/631fdfc37d1b7e57c83f)