2011年6月20日月曜日

Scratchの外部通信機能を参考にする

Wiimore(Wiiリモコン)関係を調べていて、ScratchではTCP 42001 portで双方向通信する機能が1.3版から含まれていることを知った。

参考:「Scratchに外から値を送ってみた」by いー ドット ぷりんとすったくとれーす さん

これを有効にするには、例によって「[スライダー▼]センサーの値」ブロックを長押しして現れる以下のメニュー


で「遠隔センサー接続を有効にする」を選択する。と、画面中央にこんなダイアログ


が出て、Scratchが42001番ポートをlistenするようになる。

フォーマットは単純な文字列(UTF-8エンコード)なのだが、その前に32bit幅のデータ長をペイロードとしてつけてやる必要がある。

通信は、以下のコマンドが定義されているので、それを文字列の最初に置く(大文字小文字区別なし、コマンドと引数の間は空白文字0x20)。

  • broadcast
  • update-sensor
「broadcast」コマンドは、Scratchにおけるメッセージ送信になる。外部からScratchのスクリプトを起動するのに使う。一方、「update-sensor」コマンドは、引数にとった文字列名の変数に、続く引数の値を代入する指令を送信する。例えばこんな感じ。Wiimoteの3軸加速度センサーの値を送るコマンドの例。

update-sensor "X軸傾き" 20 "Y軸傾き" -120 "Z軸傾き" 45

すると、これを受け取ったScratchは3つのセンサーに対応する変数「X軸傾き」「Y軸傾き」「Z軸傾き」を内部に作成し、値をそれぞれ20, -120, 45にする。値が数値の場合は10進数、文字列の場合はダブルクォート(")で囲む、真偽値の場合は直接trueまたはfalseと書く。また、上の例のように複数の変数の値をいちどに変更することができる。

使い方としては、まず「update-sensor」で値を送っておいて、「broadcast」で指示を送る。Scratchのブロックで、「[ ▼]を受け取ったとき」というもの


があるが、この下に、受け取った値を使って処理すべきことを書くことになる。例えば、
broadcast "移動"
というメッセージが外から送られてきたら、対応するスプライトをさきほどのX, Y, Zの傾きにしたがってすべるような移動をさせる、という感じ。

Scratchは、メッセージを使うことでイベント駆動のようなプログラムを作ることができる。だから、Wiimoteのボタンを押したら何かが起きる、といったスクリプトを作成するのは簡単だ。

一方ドリトルは、メッセージを監視するような機能を持たないので、例えばタイマーなどを使ってポーリングすることになる。それでもよければ、サーバ機能をオンにしたドリトルを立てておけば、そこが共有黒板になるので、Scratchと同じような形で値の受け渡しやコマンド送信ができるだろう。ScratchはP2Pで直接通信できるのに対して、ドリトルはサーバを介する必要がある点が異なる。