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

これはSmalltalk Advent Calendar 2014の12/12の記事です。
前回の記事では、拙作のパッケージを用いてPharoでScratch Sensor BoardとGainerを扱う方法について述べましたが、今回はArduinoを扱う方法について紹介します。

Physical Etoys

Smalltalkでさまざまなデバイスを動かすことについては、既に先行しているプロジェクトがあります。
Physical Etoysは、(Pharoのベースとなった)Squeakのビジュアルプログラミング環境であるeToys上で、Arduinoを始めとする多様なデバイスを扱うことができるようにするプロジェクトです。
ウェブサイトでも紹介されているように、Physical Etoysでは、以下のようなデバイスをサポートしています。聞いたことのないデバイスもありますが、SpheroやKinect、LeapMotionなど比較的新しいハードウェアも扱えることがわかります。

  • Femisapien
  • Isobot
  • Kinect
  • Lego Dacta Control Lab
  • Puerto paralelo
  • Roboquad
  • Robosapien
  • Sphero
  • Wiimote
  • Leap Motion

SqueakとPharoは親戚同士で、eToys関連のクラス以外ならかなり利用することができます。そこで、今回はPhysical Etoysを使ってArduinoを扱う方法について解説します。

Arduino

Arduinoの準備

ArduinoとはFirmataプロトコルで通信するため、Arduino IDEでArduinoにFirmataのスケッチをUploadしておく。とりあえずAllInputsFirmataで良い。

Arduinoパッケージの導入

ArduinoのパッケージはSqueakSource3から入手できるが、ここにあるのは古いものなのでうまく動かない。
面倒だが以下のようにする必要がある。
まずTerminalなどでgithubのリポジトリをcloneする。

git clone https://github.com/GIRA/PE

Pharoを起動後、Monticelloを開いて+Repositoryボタンを押し、filetree://を選んでcloneしたフォルダ内のPE/stを選ぶ。
リポジトリが開いたら、左側のペインでArduino-Coreを選び、右側のペインでArduino-Core.packageを選んでLoadボタンを押す。
次にBrowserでArduinoクラスを開き、initializeメソッドの中身をコメントアウトする。
また、ArduinoTypeクラスを開き、以下の内容のinitializeメソッドを登録する。

initialize
    digitalPins := 2 to: 13.
    analogPins := 0 to: 5

最後にWorkspaceで以下をDo itする。

ArduinoType initialize.

これで準備は完了。

Arduinoオブジェクトの生成

Arduinoオブジェクトを生成するには以下のようにする。

arduino := Arduino on: Firmata new.

接続と解除

#connectOnPort:と#disconnectを用いる。具体例は以下の通り。ポート部分はOS等にあわせて適切なものを指定する。

arduino connectOnPort: '/dev/cu.usbmodem1421'.
arduino disconnect.

ディジタル・アナログピンの制御

Arduinoのディジタル・アナログピンを操作するには、AttachableDeviceのサブクラスのオブジェクトに対してArduino上のピンをattachする。
例えば、pin13に接続されたLEDを扱うには、LightEmittingDiodeクラスのオブジェクトを生成してArduinoにattachする。

led := LightEmittingDiode new.
led attach: (arduino digitalPin: 13).

接続されたLEDをオン・オフするには以下のようにする。

led value: 1. "オン"
led value: 0. "オフ"

アナログピンの状態を調べるのは以下のようにする。

analog := Potentiometer new.
analog attach: (arduino analogPin: 1).
analog value. "値を読み取る"

なお、我が家の環境ではStuduinoはうまく使えなかった。