2020年4月23日からtoio™コア キューブが単体で販売されるようになった。それに合わせて「toio」ではじめよう、おうちでロボット開発キャンペーンというのをやっていたので応募してみたら「開発者向けマット(仮称)サンプル版」がスイッチサイエンスから送られてきたので、簡易カードの内容を読み取って音を出す何かを作ってみた。
購入したもの
簡易カードはA3の紙に印刷されているだけなので、自分で1つずつハサミで切り離す必要がある。ミシン目でも入っていてハサミなしで切り離せるようになっていたら便利かなと思った。
仕様
簡易プレイマット上の3×3(9マス)に置かれたオクターブx1/音長x1/音名x7枚の簡易カードを順に読み取り、最後に読み取った内容通りに音を出すようにする。
以下の例ならオクターブ5、音長1秒でCDEFGAB(ドレミファソラシ)と音が出るようにする。(オクターブなどについてはtoioの技術仕様を参照のこと)
簡易プレイマットの仕様(列/ 行指定)
今回もビジュアルプログラミングで実装し、移動命令は列/行指定を使用する。簡易プレイマットの仕様で以下のように列/行が設定されているので、スタート地点は(-2,1)、音を鳴らす地点は(2,-1)になる。プレイマットの端まで使おうとすると、たまに読み取りセンサーがプレイマット外に出て止まったりするので、端の1マスは使わないようにしている。
処理の流れ
処理の流れは以下のようにする。
- プレイマット上にキューブが置かれたら、(-2,1)へ移動する
- (-2,1)で右向きにする
- (2,1)へ移動しながら簡易カードの値を読み取る(3回)
- (2,1)で下向きにする
- (2,0)へ移動する
- (2,0)で左向きにする
- (-2,0)へ移動しながら簡易カードの値を読み取る(3回)
- (-2,0)で下向きにする
- (-2,-1)へ移動する
- (-2,-1)で右向きにする
- (2,-1)へ移動しながら簡易カードの値を読み取る(3回)
- (2,-1)で音を鳴らす
向きをいちいち変えなくても列/行指定で移動できるが、円を描くように移動しようとして無駄が多いので回転で向きを変えて直線的に動くようにする。
プログラム
ファイルはgithub(sample1.sb3)に上げておいた。
「マットに触れたとき」から始まる部分が移動と最後に音と鳴らす処理、「ずっと」から始まる部分が簡易カードの読み取り処理になっている。簡易カードが読み取れないときはNaNを返すのを利用してカード上かどうか判別するようにした。
「〜と言う」は必要ないが、入れると処理が見易い気がするので入れている。
移動先の列/行、音名、進行方向は予め以下のようにリストに入れているが、二次元配列が使えないので列/行は苦しい感じになった。Node.jsで書いてしまったほうが楽だったかなと思ったり思わなかったり。
実行結果
とりあえず期待通りの動作をするものができたが、簡易カードが固定されていないせいでキューブが空回りして読み取りがおかしなことになったりするので、簡易カードが滑らないように何か加工をしたほうがよさそう。