Pharoでフィジカルコンピューティング(1)

これはSmalltalk Advent Calendar 2014の12/9の記事です。
教科書的なイメージだとSmalltalkでフィジカルコンピューティングするとは思えないけど、それっぽいことをする人向けの情報になればと思います。
ScratchのSensor Board(PicoBoardやなのぼーど)、Gainer、ArduinoなどをPharoで制御するパッケージがあるので、その辺の情報をまとめておきます。
Sensor BoardとGainerについては拙作のパッケージを、Arduino(Firmata)については他の方のパッケージを(別の記事で)紹介します。
なお、デバイスをPC等に接続するために必要なドライバやインストール方法などの情報は、適宜参照して適切なものを導入しておいてください。おそらく他のツール(なのぼーどならScratch、Gainer miniならProcessing等)で使えることを確認した後で以下を試された方が良いでしょう。

Sensor BoardとGainerのためのパッケージ導入

Sensor Boardは「なのぼーど」、Gainerは「Gainer mini」しか実績はありませんが、拙作のパッケージで扱うことができます。
Pharo 3.0でWorkspaceを開き、以下を選択してDo itします。

Gofer new
  url: 'http://smalltalkhub.com/mc/oohito/Fluo/main';
  package: 'Fluo Devices';
  load.

Fluo Devicesのパッケージには他のデバイス用のクラスも入っていますが、それらについて後日紹介する予定です。

Sensor Boardの使い方

インスタンス生成

ScratchSensorBoard new

インスタンス生成するにはScratchSensorBoardクラスにnewメッセージを送る。

SensorBoardへの接続(connect)と解除(disconnect)

ScratchSensorBoardオブジェクトに対し、ポート名を引数として#connectOnPort:メッセージを送ると接続できる。また、#disconnectメッセージを送ると解除できる。

| sensor |
sensor := ScratchSensorBoard new.
sensor connectOnPort: '/dev/cu.usbmodem'.
sensor disconnect.

上記のポート名はサンプルです。実際のポート名はOSにより異なります。

SensorBoardデータの取得(1)

以下のメッセージを送ることで、ScratchSensorBoardのデータを取得する。

  • #button — ボタンが押されればTrue、離されていればFalseを返す
  • #slider — スライダーセンサの値を0から100の範囲で返す
  • #sound — サウンドセンサの値を0から100の範囲で返す
  • #light — ライトセンサの値を0から100の範囲で返す
  • #registanceA,#registanceB,#registanceC,#registanceD — A,B,C,Dの抵抗値を0から100の範囲で返す

SensorBoardではセンサー入力の取得のみ対応しています。なのぼーどで拡張されたサーボの制御や超音波センサには対応していません。

SensorBoardデータの取得(2)

ブロックを設定することでScratchSensorBoardの情報を取得する。
1つのパラメータを持つブロックを引数として#receiveBlock:メッセージを送ると、SensorBoardからデータを受信する度に受信データを引数としてブロックが評価される。

| sensor |
sensor := ScratchSensorBoard new
sensor connectOnPort: '/dev/cu.usbmodem'.
sensor reeiveBlock: [:data| Transcript show: data; cr].

Sensor Boardの互換デバイスについて

阿部さんが日本で買えるScratchセンサーボードというページで互換デバイスを紹介しています。
なのぼーど以外のデバイスでも標準的な機能は使えると思います。

Gainerの使い方

インスタンス生成

Gainer new

インスタンス生成するにはGainerクラスにnewメッセージを送る。

Gainerへの接続(connect)と解除(disconnect)

Gainerオブジェクトに対し、ポート名を引数として#connectOnPort:メッセージを送ると接続できる。また、#disconnectメッセージを送ると解除できる。

| gainer |
gainer := Gainer new.
gainer connectOnPort: '/dev/cu.usbmodem1411'.
gainer disconnect.

上記のポート名はサンプルです。実際のポート名はOSにより異なります。

Gainerからのデータの取得(1)

以下のメッセージを送ることで、Gainerの入力ポートのデータを取得できる。

  • #button — ボタンが押されればTrue、離されていればFalseを返す
  • #digitalAt: — 指定したディジタルピンの値をTrue/Falseで返す
  • #analogAt: — 指定したアナログピンの値を0から255の範囲で返す

ディジタルピン、アナログピンの番号は0から3までの範囲で指定します。

Gainerからのデータの取得(2)

ブロックを設定することでGainerの情報を取得することもできる。
1つのパラメータを持つブロックを引数として#receiveBlock:メッセージを送ると、Gainerからデータを受信する度に受信データを引数としてブロックが評価される。

| gainer |
gainer := Gainer new
gainer connectOnPort: '/dev/cu.usbmodem1411'.
gainer reeiveBlock: [:data| Transcript show: data; cr].

Gainerへのデータの設定

以下のメッセージを送ることで、Gainerの出力ポートへデータを設定できる。

  • #led: — 引数に指定した真理値によってLEDを点灯(True)・消灯(False)する
  • #digitalAt:put: — 指定したディジタルピンを真理値で指定した状態にする
  • #analogAt:put: — 指定したアナログピンを0から255の値に設定する

ディジタルピン、アナログピンの番号は0から3までの範囲で指定します。

以上です。
Arduino(Firmata)については後日紹介します。