これは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)については後日紹介します。