Fluo Scratchチュートリアル1

Fluoチュートリアル1では画面上のボタンをクリックした回数を数えましたが、このチュートリアルでは、Fluoを用いてUSB接続した「なのぼーど」のデータを処理する方法について学び、スイッチを押した回数を数えるグラフを作成します。
なのぼーど」は「ちっちゃいものくらぶ」で販売されている、Scratch用の外部センサーボードです。実際に利用するにはドライバのインストールが必要な場合がありますので、チュートリアルを始める前に準備を済ませておいてください。(参考サイト:「なのぼーどの動作確認」)また、FluoのベースであるPharoシステムの制約から、「なのぼーど」を抜き差ししたりスリープさせるとオープンに失敗することがあります。オープン時にエラーが生じる場合には、PharoシステムをSave&Quitさせ、再度起動しなおしてください。

目次

  1. グラフを開く
  2. SensorBoardのプロキシとトピックを追加する
  3. 「なのぼーど」と接続してみる
  4. SensorBoardDataトピックノードを使う
  5. 数値データを比較する
  6. 真偽値データをtickに変換する
  7. まとめ

グラフを開く

チュートリアル1で作成したグラフを開きます。サイドメニューの「open/グラフを開く」を押してClickCounterを選びます。

ClickCounter
ClickCounter

誤って元のグラフに上書き保存しないように、サイドメニューの「save as/名前をつけてグラフを登録」を押して、「SensorBoardButton」という名前で登録しておくのが良いでしょう。

SensorBoardのプロキシとトピックを追加する

「なのぼーど」はScratchのセンサーボードと呼ばれるUSBインターフェースボードの互換機です。Fluo Scratchではセンサーボード関連のプロキシやトピックを提供しているので、手軽に利用することができます。

SensorBoardButton
SensorBoardButton

以下の手順で図のようなグラフを作成します。

  1. 「new proxy/新しいプロキシ」をドラッグしたら適当な場所でドロップし、メニューからSensorBoardProxyを選びます。
  2. 同様に「new topic/新しいトピック」を使ってメニューのScratchからSensorBoradButtonを選びます。
  3. SensorBoardProxyからSensorBoardButtonへのアークを作成します。
  4. SensorBoardButtonからMonitorBehaviorへのアークを作成します。

「なのぼーど」と接続してみる

後の操作を行う前に、「なのぼーど」とPCを接続しておきましょう。冒頭の参考サイトを参考にしながらドライバのインストールを確実に行っておいてください。
SensorBoardProxyのプロパティにあるport欄をクリックすると、ポート名の一覧が表示されるので「なのぼーど」が接続されたポートを選んでください。Windowsの場合はCOM3、Linuxの場合は/dev/ttyUSB0、Macの場合は/dev/cu.usbserialなどが該当するでしょう。(数値は異なる場合があります)
SensorBoardProxyのプロパティにあるオープン/クローズをクリックし、白から灰色に変えます。「なのぼーど」上のLEDが点灯したのを確認したら、スイッチを押したり離したりしてMonitorBehaviorのプロパティ上の値が「control=on」や「control=off」に変化することを確認しましょう。
「なのぼーど」のボタンと、ButtonBehaviorの動作は同じことがわかりましたので、SensorBoardTopicからのアークをMonitorBehaviorからControlToControlに接続しなおせば、ボタンを押した回数がカウントされるようになるはずです。

SensorBoardButton
SensorBoardButton

ButtonBehaviorを用いたときと異なり、SensorBoardのボタンを素早く押すと正しくカウントされない場合があります。
これは、Fluoが1/100秒に1度ずつSensorBoardのデータを取得しているため、1/100秒未満のボタンの変化を正しく知ることができないからです。(一般的な利用にはこれで十分でしょうが、時間間隔を変更することも可能です。)
同じ理由から、いわゆる「チャタリング」も防止しています。

SensorBoardDataトピックノードを使う

「なのぼーど」からボタンの状態を得るのにSensorBoardButtonというトピックノードを用いました。これ以外にも別の方法でボタンの状態を得ることができます。「なのぼーど」にはライトセンサーやスライダーセンサーなど多様なセンサーが搭載されており、それらを扱うには別の方法を用いなければなりません。
そこで、SensorBoardDataというトピックノードを用いて、ボタンの状態を得ることにしましょう。

SensorBoardCounter
SensorBoardCounter

以下の手順で図のようなグラフを作成します。

  1. 「new topic/新しいトピック」を使って、メニューのScratchからSensorBoradDataを選びます。
  2. SensorBoardDataのプロパティで、sensorをbuttonに設定します。
  3. SensorBoardProxyからSensorBoardDataへのアークを作成します。
  4. SensorBoardDataからMonitorBehaviorへのアークを作成します。

SensorBoardProxyのオープン/クローズをクリックすると、MonitorBehaviorには「data=100」と表示されるはずです。「なのぼーど」上のスイッチを押すと、押している間だけ「data=0」となり、離すと「data=100」に戻るでしょう。「なのぼーど」上のセンサーのデータは0から100までの値として得ることができます。ボタンの場合、押した状態=100、離した状態=0というデータが得られることになります。

数値データを比較する

SensorBoardDataを用いると、センサーのデータを0から100までの数値として得ることができます。CounterBehaviorがカウントするには、この数値からtickというメッセージを作り出さなければなりません。どのようにすべきでしょうか?
まずは押されたかどうかを判定します。ここではデータが50より小さければ「押された」50より大きければ「離された」という風に判定することにします。これを実現するには、グラフにノードを追加します。

SensorBoardCounter
SensorBoardCounter

以下の手順でグラフを修正します。

  1. 「new behavior/新しいビヘイビア」を使って、メニューのboolean compareからComparatorBehaviorを選びます。
  2. ComparatorBehaviorのプロパティで、演算子を”<“に設定します。
  3. ComparatorBehaviorのプロパティで、引数を”50″に設定します。
  4. SensorBoardDataからのアークをComparatorBehaviorへ接続しなおします。
  5. ComparatorBehaviorからMonitorBehaviorへのアークを作成します。

ComparatorBehaviorは受け取ったデータと内部のデータを設定された演算子に従って比べ、その結果をtrueまたはfalseというデータに変換します。
上の図では、SensorBoardDataからの(0から100までの)データと50を比べます。演算子が”<“なので、SensorBoardDataからのデータが50より小さければtrue、大きければfalseとなります。
SensorBoardProxyをオープンすれば、ボタンを押すとMonitorBehaviroがtrueになり、離すとfalseになることが確認できます。

真偽値データをtickに変換する

後はtrueというデータを、CounterBehaviorが受け取るtickに変換すれば良いわけです。

今までtickを「メッセージ」と呼んでいました。FluoがベースにしているSmalltalkでは、オブジェクト間のやりとりは全て「メッセージ」を通じて行っていますので、これは正しい表現です。
しかし、SensorBoardDataからのデータも正確には「メッセージ」なので、この用語を用いると混乱しかねません。Fluoでは、tickやon/offのようなデータを持たない「メッセージ」を、「コントロール」と呼んでいます。一方で数値などのデータはそのまま「データ」と呼びます。以後、tickはtickコントロールと呼ぶので注意してください。

trueやfalseのような真偽値は、数値と同じ「データ」です。データをtickのようなコントロールに変換するには、DataToControlというビヘイビアノードを用います。
しかし、単にtrueをtickに変換しただけでは問題が生じます。というのも、SensorBoardDataからのデータは頻繁に得られ、ComparatorBehaviorがその都度trueかfalseに変換します。もし、ボタンが押されていればtrueというデータが連続して生じ、そのままtickに変換するとたくさんのtickがCounterBehaviorに送られることになります。(結果としてCounterBehaviorは押した回数以上の値になるでしょう。)
SensorBoardButtonビヘイビアは、onやoffが連続しないように内部で調整されています。同様にtrueやfalseが連続して生じないように工夫する必要があります。そこで、これを行うためにRemoveDupulicatesBehaviorを用います。最終的なグラフは以下のようになります。

SensorBoardCounter
SensorBoardCounter

以下の手順でグラフを修正します。

  1. 「new behavior/新しいビヘイビア」を使って、メニューのdata convertからRemoveDuplicatesBehaviorを選びます。
  2. 「new behavior/新しいビヘイビア」を使って、メニューのdata convertからDataToControlを選びます。
  3. ComparatorBehaviorからのアークをRemoveDuplicatesBehaviorへ接続しなおします。
  4. RemoveDuplicatesBehaviorからCounterBehaviorへのアークを作成します。
  5. SensorBoardButtonからControlToControlへのアークを削除します。

最後のステップを行わないと、ボタンを押すたびにカウンタが2つずつ増えていきます。実際に「なのぼーど」で動作を確認してみましょう。
チュートリアルの最初でグラフをSensorBoardCounterとして登録しているなら、サイドメニューの「save/グラフの登録」を押して登録します。
そうでなければ、「save as/名前をつけてグラフの登録」を選び、ダイアログボックスに「SensorBoardCounter」と入力してOKボタンを押して登録してください。

まとめ

このチュートリアルでは、Fluoを用いてボタンのデータを処理する方法について学びました。

  • SensorBoardProxy, SensorBoardButton, SensorBoardDataの動作について学びました。
  • ComparatorBehaviorを使って、データの比較を行う方法について学びました
  • データとコントロールの違いについて学びました。
  • DataToControlを使って、trueをtickに変換する方法について学びました。
  • 名前をつけてグラフを登録する方法について学びました。

演習

  1. SensorBoardDataのセンサーをbutton以外のもの(例えばsliderやlight、micなど)に変えてみて、動作がどのように変わるか調べなさい。
  2. 拍手をした回数を数えるプログラムを作り、その動作について考察しなさい。