Fluoチュートリアル1では画面上のボタンをクリックした回数を数えましたが、このチュートリアルでは、Fluoを用いてUSB接続した「なのぼーど」のデータを処理する方法について学び、スイッチを押した回数を数えるグラフを作成します。
「なのぼーど」は「ちっちゃいものくらぶ」で販売されている、Scratch用の外部センサーボードです。実際に利用するにはドライバのインストールが必要な場合がありますので、チュートリアルを始める前に準備を済ませておいてください。(参考サイト:「なのぼーどの動作確認」)また、FluoのベースであるPharoシステムの制約から、「なのぼーど」を抜き差ししたりスリープさせるとオープンに失敗することがあります。オープン時にエラーが生じる場合には、PharoシステムをSave&Quitさせ、再度起動しなおしてください。
目次
- グラフを開く
- SensorBoardのプロキシとトピックを追加する
- 「なのぼーど」と接続してみる
- SensorBoardDataトピックノードを使う
- 数値データを比較する
- 真偽値データをtickに変換する
- まとめ
グラフを開く
チュートリアル1で作成したグラフを開きます。サイドメニューの「open/グラフを開く」を押してClickCounterを選びます。
誤って元のグラフに上書き保存しないように、サイドメニューの「save as/名前をつけてグラフを登録」を押して、「SensorBoardButton」という名前で登録しておくのが良いでしょう。
SensorBoardのプロキシとトピックを追加する
「なのぼーど」はScratchのセンサーボードと呼ばれるUSBインターフェースボードの互換機です。Fluo Scratchではセンサーボード関連のプロキシやトピックを提供しているので、手軽に利用することができます。
以下の手順で図のようなグラフを作成します。
- 「new proxy/新しいプロキシ」をドラッグしたら適当な場所でドロップし、メニューからSensorBoardProxyを選びます。
- 同様に「new topic/新しいトピック」を使ってメニューのScratchからSensorBoradButtonを選びます。
- SensorBoardProxyからSensorBoardButtonへのアークを作成します。
- 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に接続しなおせば、ボタンを押した回数がカウントされるようになるはずです。
ButtonBehaviorを用いたときと異なり、SensorBoardのボタンを素早く押すと正しくカウントされない場合があります。
これは、Fluoが1/100秒に1度ずつSensorBoardのデータを取得しているため、1/100秒未満のボタンの変化を正しく知ることができないからです。(一般的な利用にはこれで十分でしょうが、時間間隔を変更することも可能です。)
同じ理由から、いわゆる「チャタリング」も防止しています。
SensorBoardDataトピックノードを使う
「なのぼーど」からボタンの状態を得るのにSensorBoardButtonというトピックノードを用いました。これ以外にも別の方法でボタンの状態を得ることができます。「なのぼーど」にはライトセンサーやスライダーセンサーなど多様なセンサーが搭載されており、それらを扱うには別の方法を用いなければなりません。
そこで、SensorBoardDataというトピックノードを用いて、ボタンの状態を得ることにしましょう。
以下の手順で図のようなグラフを作成します。
- 「new topic/新しいトピック」を使って、メニューのScratchからSensorBoradDataを選びます。
- SensorBoardDataのプロパティで、sensorをbuttonに設定します。
- SensorBoardProxyからSensorBoardDataへのアークを作成します。
- SensorBoardDataからMonitorBehaviorへのアークを作成します。
SensorBoardProxyのオープン/クローズをクリックすると、MonitorBehaviorには「data=100」と表示されるはずです。「なのぼーど」上のスイッチを押すと、押している間だけ「data=0」となり、離すと「data=100」に戻るでしょう。「なのぼーど」上のセンサーのデータは0から100までの値として得ることができます。ボタンの場合、押した状態=100、離した状態=0というデータが得られることになります。
数値データを比較する
SensorBoardDataを用いると、センサーのデータを0から100までの数値として得ることができます。CounterBehaviorがカウントするには、この数値からtickというメッセージを作り出さなければなりません。どのようにすべきでしょうか?
まずは押されたかどうかを判定します。ここではデータが50より小さければ「押された」50より大きければ「離された」という風に判定することにします。これを実現するには、グラフにノードを追加します。
以下の手順でグラフを修正します。
- 「new behavior/新しいビヘイビア」を使って、メニューのboolean compareからComparatorBehaviorを選びます。
- ComparatorBehaviorのプロパティで、演算子を”<“に設定します。
- ComparatorBehaviorのプロパティで、引数を”50″に設定します。
- SensorBoardDataからのアークをComparatorBehaviorへ接続しなおします。
- 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を用います。最終的なグラフは以下のようになります。
以下の手順でグラフを修正します。
- 「new behavior/新しいビヘイビア」を使って、メニューのdata convertからRemoveDuplicatesBehaviorを選びます。
- 「new behavior/新しいビヘイビア」を使って、メニューのdata convertからDataToControlを選びます。
- ComparatorBehaviorからのアークをRemoveDuplicatesBehaviorへ接続しなおします。
- RemoveDuplicatesBehaviorからCounterBehaviorへのアークを作成します。
- SensorBoardButtonからControlToControlへのアークを削除します。
最後のステップを行わないと、ボタンを押すたびにカウンタが2つずつ増えていきます。実際に「なのぼーど」で動作を確認してみましょう。
チュートリアルの最初でグラフをSensorBoardCounterとして登録しているなら、サイドメニューの「save/グラフの登録」を押して登録します。
そうでなければ、「save as/名前をつけてグラフの登録」を選び、ダイアログボックスに「SensorBoardCounter」と入力してOKボタンを押して登録してください。
まとめ
このチュートリアルでは、Fluoを用いてボタンのデータを処理する方法について学びました。
- SensorBoardProxy, SensorBoardButton, SensorBoardDataの動作について学びました。
- ComparatorBehaviorを使って、データの比較を行う方法について学びました
- データとコントロールの違いについて学びました。
- DataToControlを使って、trueをtickに変換する方法について学びました。
- 名前をつけてグラフを登録する方法について学びました。
演習
- SensorBoardDataのセンサーをbutton以外のもの(例えばsliderやlight、micなど)に変えてみて、動作がどのように変わるか調べなさい。
- 拍手をした回数を数えるプログラムを作り、その動作について考察しなさい。