Scratch Remote SensorとM5StickC/M5Stack Grayとの連携
https://gyazo.com/7e19d71d348bbf3362340f8ded0788fe
はじめに
M5StickC/M5Stack Gray(以下、M5St*)とScratch 1.4 Remote Sensorとの連携を実現しました
デモを交えて、解説します
まだ問題が残ってるので、ご意見いただけたら幸いです
M5StickCってなあに?
https://gyazo.com/9055c595042ccb0f95725c1ff01af377
色々なものがいっしょになったIoT(Internet of Things)デバイス (赤字はむとうおすすめポイント)
マイコン: ESP32
ネットワーク: WiFi/Bluetooth
ディスプレイ: 0.96インチ 80×160
センサー: 加速度+ジャイロ(計6軸), ボタンスイッチx2,マイク
その他: バッテリー(80mAh), IR送信(赤外線リモコン), LED
付属物: 腕時計型マウント, LEGO互換マウント, 壁掛けマウント
M5Stack Gray(Faces)ってなあに?
https://gyazo.com/321ab5dd9d2de74506c851b5907e26cd
M5Stack Gray(Faces)は、M5Stackの仲間では多機能なデバイス(赤字はむとうおすすめポイント; Facesの場合)
マイコン: ESP32
ネットワーク: WiFi/Bluetooth
ディスプレイ: 320x240 TFT
センサー: 加速度+ジャイロ+磁気(計9軸), ボタンスイッチx3
その他: バッテリー(150mAh), microSD, スピーカ
付属物(Faces): キーボード, 電卓キー, ゲーム用キー
Scratchってなあに?
https://gyazo.com/b7a86c844cc5f87f51061fb0ea30a465
Scratch: ブロックベースのプログラミング環境
教育目的などでよく利用される
意外と変態的な言語: オブジェクト指向, 並列処理, イベント(メッセージ)ベース
ブロックで組むので、typoによるシンタックスエラーフリー
プログラムのシェア/フォーク(リミックス)のためのプラットフォームも提供
Scratch専用SNS環境もあり
以下のような3つのバージョンがある
table:Scratch
バージョン 実装言語 Remote Sensor オンライン版 オフライン版
1.4 Smalltalk(Squeak) o x o
2 Adobe flash x o o
3 HTML5 x o o
今回は、後述のScratch Remote Sensor Protocolが使える1.4を使います
Scratch Remote Sensor Protocolってなあに?
Scratch 1.4だけで使える
ScratchとTCP/IPが使える外部との連携機能
Scratch側では、TCP 42001で待受する
複数センサーの同時接続も可能
(ほぼ)テキストベースでScratchと通信ができる
パケット構成
<size: 4 byte><msg: size byte>
size: 後ろのmsgが何バイトあるか
msg: テキスト形式のメッセージ
二種類のメッセージ(コマンド)
メッセージを送る
broadcast "メッセージ"
変数の値を変更する
sensor-update "変数名" 値
変数名と値は複数指定も可能
https://gyazo.com/dbe77008ce27cc6616058aed1e1e01be
Scratch側から送られるメッセージ
メッセージ"test"を送り、
変数aの値を0から1に変えた時
code:shell
$ telnet localhost 42001
(snip)
broadcast "test"sensor-update "a" 0 sensor-update "a" 1
Scratch側では、以下の手順で有効化
[調べる]カテゴリ
[スライダセンサーの値]を右クリック
[遠隔センサー接続を有効にする]を選択
https://gyazo.com/a40e28768a7c3d6998f5d20d3ff10337
Scratch Remote SensorとM5St*の連携プログラム
Scratch Remote Sensorを使ってM5St*とScratchの間で双方向のデータのやり取り
M5St*のセンサー情報をScratchに送って使う
Scratchのイベントや変数をM5St*に送って使う
M5St*のプログラムは、Arduino IDEを使って作成
M5StickC版とM5Stack(Gray)版の違いは…
ハードウエアの違いに対する対処(M5StickC.hとM5Stack.h)
加速度やジャイロなどの取扱方法
Gray(Faces)はキーボードの取扱も追加
変数のssid, password, hostは、適宜、自分の環境に合わせて設定してください。
M5StickCとScratchのデータのやりとり
ScratchとM5StickCのデータのやりとりは、以下のとおり(【カッコ】内はGray版)
Scratch→M5StickC
変数r,g,b: それぞれ、Red(赤), Green(緑), Blue(青)で指定された色を送る
変数s:sで指定された文字列を送る
変数l:lの値(0/1)でLEDの消灯/点灯をする
M5StickC→Scratch
変数(ax, ay, az):x方向, y方向, z方向の加速度の値を送る
変数(gx, gy, gz):x方向, y方向, z方向のジャイロの値を送る
変数v: 0-255の乱数を送る
イベントBtnA, BtnB,【BtnC】:ボタンA, B, 【C】が押されたことを知らせる
【イベントKey_a, Key_b, ...: キーボードのa,b,...が押されたことを知らせる】
デモ
https://www.youtube.com/watch?v=9VmtaLVe28o
Scratch→M5StickC
Scratch: 変数r,g,bを0-255の乱数で作成
M5StickC: r,g,bの値でバックグラウンドの色を変更
Scratch: 変数sの値を0-255の乱数で作成
M5StickC: sの値を文字列として表示
Scratch: 変数lを0-1の乱数で作成
M5StickC: lの値でLEDを消灯(0)や点灯(1)
M5StickC→Scratch
M5StickC: 加速度データを変数ax,ay,azに
Scratch: 変数ax,ayにしたがってScratch Catの座標(x,y)を変更する
M5StickC: ボタンがA,Bが押された時BtnA,BtnBというメッセージを送る
Scratch: BtnAが押された時に、Scratch Catのコスチュームを次のものに変更する
M5StickC: ジャイロデータを変数gx,gy,gzに
Scratch: なにもしない
M5StickC: 変数vに0-255の乱数を入れて送る
Scratch: なにもしない
これからやりたいこと&困っていること
やりたいこと
Scratch 2と3では、Bluetoothでの接続が可能
M5St*のBluetoothは使えないかなぁ?
困っていること
ネットワークの通信がたまに切れる
再接続は実装しているけど、まだ動きがなんかあやしい
データの送受に、それなりのディレイがある
M5St*側にwaitが必要?
おわりに
M5St*とScratch 1.4 Remote Sensor Protocolで、通信をおこないました
簡単なデモプログラムを動かしてみました
M5St*とScratchで遊ぶと、楽しい!!
参考文献
新しいものから古いものへの順で並んでいます。
M5St*とScratch Remote Sensor
M5StickC
Q&A
質疑応答があれば追加