USBセンサを使ってみよう 〜Phidgets活用講座 概要編 (3)〜
作成日: 2006/7/6  最終更新日: 2008/10/19



概要

このページの内容は,Software Design 2005年12月号 pp.114-121に掲載された, 「USBセンサを使ってみよう Phidgets活用講座(1)」をHTML化したものです.分量が多いため,三つのページに分割してあります.
本文中の「現在」などは「2005年10月」を指します.

ここでは,PhidgetServerの詳細仕様について紹介し,その応用例として,物理的なつまみを用いてWindows PCの音量調節を行うことができるシステム「PhidgetVolume」について説明します.USBセンサを使ってみよう(PhidgetServer編)も参考にしてください.

※新しいPhidgetデバイスやドライバに対応したPhidgetServer2.0を公開しました.(2008/10/19)

連載目次




PhidgetServerの詳細と応用
1. 通信仕様
ここでは,PhidgetServerの詳細な通信仕様を説明します.まず,基本仕様は以下のようになります.
  • 送受信文字列は全てASCIIテキスト形式.
  • コマンドは「デリミタ」で指定した区切り子("\r\n","\r","\n","\0")のいずれかで区切られる.
  • コマンド内の各要素はカンマ(",")で区切られる.
次に,各コマンドの構成は,以下のようになります.

<CommandType>,<PhidgetType>[,<CommandSubType>][,<Port>],<Data>

  • [ ]内はデバイスの種別により省略される.
  • <CommandType>は以下の5種類
    • Attach
    • Detach
    • In
    • Out
    • Threshold
  • <PhidgetType>は以下の5種類
    • Accel
    • InterfaceKit
    • RFID
    • Servo
    • Weight
  • <CommandSubType>は以下の2種類(InterfaceKitのみ)
    • Analog
    • Digital
PhidgetServer→クライアントへ送信するコマンドは,以下のようになります.
  • Attach,<PhidgetType>
    • デバイスが接続された.e.g.) Attach,InterfaceKit
  • Detach,<PhidgetType>
    • デバイスが切断された.e.g.) Detach,InterfaceKit
  • In,Accel,<Port>,<Data>
    • Accelerometerのチャンネル<Port>の入力が<Data>へと変化した.
    • e.g.)In,Accel,0,1.25
    • ※<Port>は0 or 1の整数.(X軸,Y軸に相当) <Data>は-2.00--2.00の小数.
  • In,InterfaceKit,Analog,<Port>,<Data>
    • InterfaceKitのアナログ入力<Port>が<Data>へと変化した.
    • e.g.) In,InterfaceKit,Analog,0,210
    • ※<Port>は0--7の整数.<Data>は0--1024の整数.
  • In,InterfaceKit,Digital,<Port>,<Data>
    • InterfaceKitのデジタル入力<Port>が<Data>へと変化した.
    • e.g.) In,InterfaceKit,Digital,7,1
    • ※<Port>は0--7の整数.<Data>は0 or 1の整数.
  • In,RFID,<Data>
    • RFIDが<Data>のIDを持つタグを認識した.
    • e.g.) In,RFID,0102ac4096
    • ※<Data>は10桁の文字列 or 0.0の場合はタグが認識されなくなった.
  • In,Weight,<Data>
    • WeightSensorの入力が<Data>へと変化した.
    • e.g.)In,Weight,10.5
    • ※<Data>は0.0--136.0の小数.(kg単位の重量)
クライアント→PhidgetServerへ送信するコマンドは,以下のようになります.
  • Out,InterfaceKit,<Port>,<Data>
    • InterfaceKitのデジタル出力<Port>を<Data>に変更する.
    • e.g.)Out,InterfaceKit,0,1
    • ※<Port>は0--7の整数.<Data>は0 or 1の整数.
  • Out,Servo,<Port>,<Data>
    • ServoMotorのチャンネル<Port>の出力を<Data>に変更する.
    • e.g.)Out,Servo,0,180
    • ※<Port>は0--3の整数.<Data>は0--180の整数.
  • Threshold,Accel,<Port>,<Data>
    • Accelerometerのチャンネル<Port>の入力の閾値を<Data>に変更する.
    • e.g.)Threshold,Accel,0,0.1
    • ※<Port>は0 or 1の整数.(X軸,Y軸に相当)<Data>は0.00--1.00の小数.
  • Threshold,InterfaceKit,<Port>,<Data>
    • InterfaceKitのアナログ入力<Port>の閾値を<Data>に変更する.
    • e.g.)Threshold,InterfaceKit,0,50
    • ※<Port>は0--7の整数.<Data>は0--1024の整数.
  • Threshold,RFID,<Data>
    • RFIDのタグ除去確認までの時間を,<Data>秒に変更する.
    • e.g.)Threshold,RFID,1.5
    • ※<Data>は1--100までの小数.
  • Threshold,Weight,<Data>
    • WeightSensorの入力の閾値を<Data>へと変更する.
    • e.g.)Threshold,Weight,0.5
    • ※<Data>は0.0--136.0の小数.(kg単位の重量)

最後に,クライアント→PhidgetServerにコマンドを送信する際の注意事項として,以下のような点が挙げられます.

  • コマンドに誤りがあった場合は無視される.(PhidgetServerはエラーを返さない.)
  • <CommandType>,<PhidgetType>,<SubType>は厳密に指定する必要がある.
    • 大文字/小文字は区別される.
    • スペースを入れない.
    • <Port>, <Data>は各コマンド毎に適切な範囲を指定する.
目次へ



2. PhidgetServerの活用例
ここでは,PhidgetServerの簡単な活用例として,PhidgetVolumeというシステムを製作してみます.PhidgetVolumeは,物理的なつまみを用いて,Windows PCの音量調節を行うことができます(図9). ここでは,PhidgetVolumeのハードウェア/ソフトウェアについて説明します.
図9 PhidgetVolumeの外観
PhidgetVolumeのハードウェア

PhidgetVolumeのハードウェアは,Windows PC,InterfaceKit,可変抵抗(つまみ),及びUSBケーブルの4点から構成されます. つまみはぷらっとホームで販売されているInterfaceKit Packageには標準で含まれており,Phidgetsの公式サイトでも7CDNと安価に購入できます.

つまみをInterfaceKitのポート0に接続し,InterfaceKitとPCをUSBケーブルで接続するだけで,ハードウェアの準備は完了です.

PhidgetVolumeのソフトウェア
PhidgetVolumeのソフトウェアは,PhidgetServerに接続するTCPクライアントとして,Rubyを用いて記述しています.ソフトウェアは,こちらからダウンロード可能です.ここでは,ソースコードの主要部分を参照しながら,PhidgetVolumeの処理の流れについて簡単に説明します.
1. PhidgetServerへの接続

TCPSocketクラスを用いて,PhidgetServerに接続します.

  require "socket"
  def main
    socket = TCPSocket.new("127.0.0.1", 4321)
    while line = gets
      parse(line.chomp)
    end
    socket.close
  end 
2. 受信したコマンドを解析
次に,受信したコマンドを解析し,つまみの状態を検出します.

解析対象のコマンドは,

  • In,InterfaceKit,Analog,0,[XXX]

というフォーマットになるため,以下のようなコードで[XXX]に代入される 数値を取得します.

 def parse(line)
    args = line.split(",")
    if args[0] == "In" and
       args[1] == "InterfaceKit" and
       args[2] == "Analog"
      case args[3]
      when "0"
        level = args[4].to_i
        set_volume(level)
      end
    end
  end
	
3. 音量を変更

最後に,取得した数値(=つまみの状態)をもとに,PCの音量を変更します. 音量の変更には,"MSWebDVD.MSWebDVD"というCOMオブジェクトを利用しています.

  require 'win32ole'


  VOLUME_MIN = -10000
  VOLUME_MAX = 0
  LEVEL_MAX = 1024
  LEVEL_ADJ = 10


  @dvd = WIN32OLE.new('MSWebDVD.MSWebDVD.1')


  def set_volume(level)
    volume = (level - LEVEL_MAX) * LEVEL_ADJ
    volume = [VOLUME_MIN, volume].min
    volume = [VOLUME_MAX, volume].max
    @dvd.Volume = volume
  end
  
目次へ



コラム2 PowerMateとPhidgetVolume

つまみ型の外部デバイスとしては,Griffin Technology社のPowerMateが有名です. PhidgetVolumeは手作り感あふれる外見で味はありますが,PowerMateのようなクールな質感もやはり捨てがたいものです. そこで,ブロンズ製の高級オーディオつまみ(秋葉原の千石電商にて約1500円で購入)をPhidgetVolumeの可変抵抗に取り付けてみました(図10). こうしたちょっとした工夫をするだけで,PowerMateにも負けない(?)クールなデバイスに見える,かもしれません.

図10 PowerMate(左)と改良版PhidgetVolume(右)
 
目次へ
 




3 おわりに

本稿では,PCから手軽に利用できるUSB接続のセンサー/アクチュエータ群,Phidgetsの概要と,Phidgetsをさまざまな言語から手軽に扱うことができるPhidgetServerというソフトウェアについて紹介しました. さらに,PhidgetServerのシンプルな活用例として,PhidgetsのつまみでPCの音量を制御できる,PhidgetVolumeというアプリケーションを紹介しました.

このように,PhidgetServerを利用すれば,RubyやFlashなどのさまざまな言語から容易にPhidgetデバイスを制御することが可能になります.

次回以降は,日曜ユビキタス環境の実現に向けて,PhidgetServerを用いたより実践的なシステムの構築について紹介していく予定です.

目次へ


[1] [2] [3]

[デバイスぶらり旅]