610t が 2021年02月27日15時45分34秒 に編集
お魚のコードの間違いを修正。
本文の変更
# はじめに 小学校でもプログラミングを取り入れた授業がはじまり、ブロックベースプログラミング言語のScratchなどが使われていることが多いようです。 Scratchには、[micro:bit](https://microbit.org/)やLEGOのプログラミング可能なシリーズなどの機器が利用できるような拡張機能が用意されています。 **でも、M5Stackの様なマイコンボードも使ってみたいと思いませんか?** ここでは、M5Stackの仲間たちとScratchをつないで、情報のやり取りをする仕組みであるM5Scratchについてご紹介し、簡単なゲームを作ってみます。 # 使った技術たち 今回のシステムを作成するために、以下のような技術を使いました。 - M5Stackの仲間たち(M5S) - Scratch 1.4 ここで、簡単に説明します。 ## M5Stackってなあに? [M5Stack](http://m5stack.com/)は、M5Stack社が作っている多機能マイコンボードです。 [M5StickC](https://www.switch-science.com/catalog/5517/)/[M5Stack Basic](https://www.switch-science.com/catalog/3647/)/[M5Stack Gray](https://www.switch-science.com/catalog/3648/) ([Faces ](https://www.switch-science.com/catalog/3649/))/[ATOM Matrix](https://www.switch-science.com/catalog/6260/) などは、M5Stackの仲間たち(以下、**M5S**)です。 各機種ごとの比較は、[【M5Stack】スペック比較をしてみた ~オススメ品を紹介~](https://haratta-tech-lab.com/m5stack-spec/)などを参考にしてみてください。 M5Sには、以下のような特徴があります。 - **ちっちゃくて、かわいくて**、 - **ディスプレイ**が最初から付いていたり(機種による)、 - 無線の**WiFiやBluetooth**が使えたり、 - **加速度やジャイロや地磁気**が取れる**IMU**があったり(機種による)、 - **ボタンスイッチ**もあったり、 - **温度計**もあったり、 - **バッテリー**があったり、 - **拡張モジュール**や**GROVE**で色々拡張できたり、 - **LED**もついていたり(機種による)、 - (Facesのみ)**キーボード**や**ゲームパッド**、**電卓キー**があったり、 他にも、とってもたくさん仲間たちがいるよ!! ![M5Stackの仲間たち(M5S)](https://camo.elchika.com/37416fa2acdd8efb039cfe987ed65ed9f7f70203/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32633361343463322d626630612d343637382d626265332d3736393635396530393637322f34643263616233632d346564362d346632352d393233632d656136373161313962386165/) ## Scratchってなあに? [Scratch](https://scratch.mit.edu/)はプログラミング教育などでよく利用されるブロックを並べてコードを作成する言語です。 今では、Scratch 3.0というバージョンがHTML5対応のWebブラウザ経由で利用できるようになっています (https://scratch.mit.edu/) 。他にもScratch 2.0というFlash上で動いていたバージョンもありました。 さらに、インターネットにつながっていないオフラインでも利用できるバージョンがそれぞれにあります。 今回は、後述のScratch遠隔センサーを利用するために、少し古いバージョンであるScratch 1.4を使います。 Scratch 1.4には、以下のような特徴があります。 - Scratch遠隔センサーが使える。 - オフラインで使える。 - Windows, Linux, FreeBSD, NetBSD, macOS(pyonkee)をはじめとする様々なOSで動作可能。 - ベースになっているのがSqueak(Smalltalk)で、それを使って魔改造が可能。 ![Scratch 1.4のイメージ](https://i.gyazo.com/f9864a61999c548038a003bfbe3c511a.png) ### Scratch遠隔センサーってなあに? Scratchの古いバージョンであるScratch 1.4では、[Scratch Remote Sensor Protocol]( https://en.scratch-wiki.info/wiki/Remote_Sensors_Protocol) (遠隔センサープロトコル)を使って、ネットワーク経由でScratchとインタラクションする仕組みが用意されています。 Scratch遠隔センサープロトコルには、以下のような特徴があります。 - TCP/IP (ポート42001)経由でデータのやり取り - テキストベースのプロトコル - メッセージのやり取り: `broadcast "メッセージ"` - 変数のやり取り: `sensor-update "変数" "値" ...` ![Scratch遠隔センサーを使ったインタラクション](https://camo.elchika.com/dc3eb01bf1d24e98ffc1f6a9a661db037d692bfa/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32633361343463322d626630612d343637382d626265332d3736393635396530393637322f30363339363031392d643233322d343635632d626636382d633666373664363230616364/) Scratch側での準備は、遠隔センサーを有効にすることだけです。 - 調べる->"スライダセンサーの値"を右クリック->"遠隔センサー接続を有効にする"を選ぶ ![Scratch遠隔センサーを有効にする](https://camo.elchika.com/49ca407481074603fcf5ef04a29bdb7b969824f6/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32633361343463322d626630612d343637382d626265332d3736393635396530393637322f33366137636539342d643738372d343431362d626366322d663135643937666332656235/) # M5Scratch **M5Scratch**は、M5Stackの仲間を表す**M5S**と、**Scratch**をあわせて作った造語です(**M5Scratch=M5S+Scratch**)。 M5Scratchは、Arduino IDEで作った、M5SとScratchとのやり取りを行うプログラムです。 Scratch側には改造は不要で、Scratch遠隔センサーを有効にするだけで動作します。 実際のコードは、 github https://github.com/610t/Arduino/tree/demo/M5Scratch を見て下さい (デモ用プログラムは、demoブランチで開発しています)。 詳しい説明やM5Scratchの改造の方法は、[M5Scratchに関するなにか](https://scrapbox.io/M5S/M5Scratch%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%81%AA%E3%81%AB%E3%81%8B)を見てください。 ![M5Scratchのプログラム(一部)](https://i.gyazo.com/9741ce6147d44b2fa6f1e90409a2cee1.png) 以下、M5SとScratchの情報のやりとりに関して簡単に説明します。 この情報のやりとりは、現在のバージョンのM5Scratchで実装しているものになりますが、もちろん改造をすることで、他のセンサーやアクチュエータの機能を利用することもできます。 ## ScratchからM5Sへの情報伝達 ScratchからM5Sへの情報伝達は、以下の図のようになっています。 ![ScratchからM5Sへの情報伝達](https://i.gyazo.com/c6f4f58e85ea0083034a4fe8b378ab4d.png) Scratch側で特定の変数の値を変更することで、M5S側にその変更が`sensor-update`で通知されます。 また、イベントを送ると、`broadcast`でそのイベントが通知されます。 Scratchのどの変数に従ってM5S側でどんな動作をするのかを実装するためには、Arduino IDE上のM5Scratchプログラムで、受け取るデータやイベントを実装します。 Scratch側では、単に送りたい変数の値を変更したり、メッセージを送ったりするだけです。 現在のところは、以下のような情報をScratchから受け取り、その情報を利用しています。 - `sensor-update` - 色データ(`r`,`g`,`b`): 円の色を指定 - 座標(`x`,`y`): 猫の座標 - 角度`t`: 猫の向いている方向 - ズーム`z`: 猫の大きさの倍率 - LED点滅(`l`): LEDを点灯/消灯(1/0) - 文字列(`s`): 文字列`s`を画面に表示 - `broadcast` - broadcast内容を画面に表示 ## M5SからScratchへの情報伝達 M5SからScratchへの情報伝達は、以下の図のようになっています。 ![M5SからScratchへの情報伝達](https://camo.elchika.com/8a4b084dd1348c2ec30fb0abec1c63f29051ba78/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32633361343463322d626630612d343637382d626265332d3736393635396530393637322f66376336306336372d313166662d343865382d386537662d393662303037623732663661/) Scratch側で、受け取るデータやイベントを実装します。 - `sensor_update`: ブロック[`ax`センサーの値]などで利用できます。 - `broadcast`: ブロック[`BtnA`を受け取った時]などで利用できます。 データやイベントを送る部分は、Arduino IDE側で実装します。 現状では、以下のような値をScratchに送っています。 - `sensor_update` - IMU(加速度(`ax`,`ay`,`az`)+ジャイロ(`gx`,`gy`,`gz`)+(Grayのみ)地磁気(`mx`,`my`,`mz`)) - IMUの値を使った、なんちゃって方位(`heading`)や`pitch`, `roll`, `yaw`など - 温度センサー(`temp`) - `broadcast` ボタン(`BtnA`,`BtnB`,`BtnC`)、キーボード(`Key_*`) # ゲームを作ろう!! M5Scratchは、以下の写真のように、現状でも色々なM5Sで動くようになっています。 ![M5Scratchが動いている様子](https://camo.elchika.com/e29f8566ba10d49322c833ec769d838fd0a98d5e/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32633361343463322d626630612d343637382d626265332d3736393635396530393637322f36366538306532302d376166362d346664352d626439352d663836353936336561306137/) 以下でM5Scratchを使った二つの作品を紹介します。 ## ネコちゃんにプレゼントを届けよう!! 以前 [DojoCon2020](https://dojocon2020.coderdojo.jp/)[プログラミングコンテスト](https://dojocon2020.coderdojo.jp/contest)用に作った、[発表動画](https://youtu.be/tUXKSZtTxOE)(3分弱)を見てください。 このデモでは、円周上をぐるぐる動いているScratch Cat(ネコちゃん)に、M5Sの加速度センサーを使ってプレゼントを操作することでネコちゃんにプレゼントを届けています。 @[youtube](https://youtu.be/tUXKSZtTxOE) このコードについては、[M5Scratchってなぁに?](https://scrapbox.io/CoderDojoNara/M5Scratch%E3%81%A3%E3%81%A6%E3%81%AA%E3%81%81%E3%81%AB%EF%BC%9F)をご覧ください。 以下のように、複数のM5Sを同時につなぐことも可能です。 ただ、M5S側のコード(*M5Scratch.ino*)を変更しない限り、IMUのある機種を複数つなぐと、Scratch側の動作は不安定になります。 ![複数のM5Sをつなぐ](https://i.gyazo.com/ef2c43a189718851765035eaff17e8bc.jpg) ## お魚がネコちゃんから逃げるゲーム 今度は、お魚になって、ネコちゃんから逃げるゲームを作ってみます。 ![ゲームのイメージ](https://i.gyazo.com/59b0430af8b37f5a1f8171ced5473efe.png) ネコちゃんは、乱数を使ってでたらめに動く、いわゆるランダムウォークをしています。 あなたは、お魚になって、ネコちゃんに食べられないように逃げましょう。 ネコちゃんから逃げた時間が左上に表示されている得点(score)になります。 ボタンスイッチAを押してねこちゃんを挑発すると、ボーナスで10点追加されます。 このゲームは、以下のような簡単なコードで作成することができます。 ![ネコちゃんのコード](https://i.gyazo.com/66a2cd9f9f8836f193807703b19092d3.gif)
![魚のコード](https://camo.elchika.com/6f837406ca15930395822f4d3c90f4d6c7156159/687474703a2f2f73746f726167652e676f6f676c65617069732e636f6d2f656c6368696b612f76312f757365722f32633361343463322d626630612d343637382d626265332d3736393635396530393637322f33386662346331642d633530652d343433632d383236372d363565313261303861663030/)
![お魚のコード](https://i.gyazo.com/bde69c898a8c77fd7fec1811ee0e8877.gif)
# おわりに M5Stackの仲間たちとScratchをつないで、遊んでみました。 加速度センサーなどを使って、Scratch側のスプライトを動かすと、色々なプロジェクトが作れそうで、楽しいです。 ## これからの野望 以下のような野望があります。 - ワークショップなんかをやって、子供たちにも使ってもらいたい。 - GPIOを使うようにして、LEDをチカチカさせたり、センサーを追加して使えるようにしたい。 - 他のM5S(M5Stick C Plus、 ATOM Lite、M5Stack Tough)やWio Terminalなどのマイコンボードでも動くようにしたい。 - 現在、普通に使われていバージョンであるScratch 3で使えるようにしたい。 - [ Scratchを改造しよう](https://otona-scratch.champierre.com/books/1/posts)(500円)に説明が!! - micro:bitとScratchをつなぐ拡張機能の[Microbit More](https://lab.yengawa.com/project/microbit-more-v2/)という前例がある。 - Bluetooth Low Energy経由でつながるので、今みたいにScratchホストのIPアドレスを指定しなくていい。