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



概要

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

ここでは,さまざまなセンサーを組み合わせて独自のマウスを構築できる「PhidgetMouse」と,Phidget RFIDリーダーを利用してアプリケーションを制御できる「PhidgetLauncher」という二つのシステムを紹介します. USBセンサを使ってみよう(PhidgetApplication編)も参考にしてください.

連載目次




PhidgetApplicationの紹介(2)
1. PhidgetMouse
PhidgetMouseは,InterfaceKitに接続したさまざまなセンサを介して,マウス入力をエミュレートするシステムです (図4).ここでは,ジョイスティック/つまみ/プッシュボタンなどを利用したオリジナルのデバイスでマウス入力を行う方法について,ハードウェア/ソフト ウェアの両面から説明します. なお,ソフトウェアのダウンロードはこちらから行えます.
図4 PhidgetMouseの外観
ハードウェア
マウスとして利用できるセンサの組み合わせは多数考えられますが,ここでは,比較的スタンダードな形態として,ジョイスティック,つまみ(可変抵抗),三つのプッシュスイッチから構成されるハードウェアを製作します(図5).
図5 PhidgetMouseのハードウェア

ジョイスティックとつまみは,ぷらっとホームで販売されているInterfaceKit Package #2に標準添付されています.また,Phidgetsの公式サイトでそれぞれ 25CDN, 7CDNで購入することも可能です. プッシュスイッチは,InterfaceKit Package #2にも数点付属していますが,ここでは,ミツミ電機製のタクトスイッチを利用しています.これは,千石電商のWebサイトなどで1つ20円程度で購入することができます.

今回のハードウェアでは,これらのデバイスを,ユニバーサル基板上にゲームパッドのように配置しています.ジョイスティックとつまみはビス で基盤に固定した上で,専用ケーブルでInterfaceKitのアナログ入力(ポート0,1,2)に接続します.タクトスイッチは,基盤に半田付けし, 適当なケーブルでInterfaceKitのデジタル入力(ポート1,2,3)に接続します.最後に,InterfaceKitとPCをUSBケーブルで 接続すれば,ハードウェアの準備は完了です.

ソフトウェア
次に,PhidgetMouseのソフトウェアの使い方について説明します.PhidgetMouseは,.Net Frameworkを用いて,C#で記述されています.図6に,ソフトウェアの概観を示します.
図6 PhidgetMouseのソフトウェア
1.ポートの設定
まず,ハードウェア(InterfaceKitのポート)とマウスの機能の対応付けを行います.
  • マウスのカーソル移動(X軸,Y軸),およびホイール操作は,アナログ入力のポート(0〜7)を指定します.
  • マウスクリック(左,ホイール,右)は,デジタル入力のポート(0〜7)を指定します.
  • 今回のハードウェアでは,ジョイスティックでマウスカーソルの移動(X軸,Y軸)を, つまみでホイールの回転(e.g. スクロール)を,三つのプッシュスイッチでクリック(左,ホイール,右)を制御します.よって,X軸,Y軸をアナログ入力0,1に,ホイール操作をアナログ入力2に割り当てます. また,三つのマウスクリックをそれぞれデジタル入力の1,2,3に割り当てます
2.PhidgetServerへ接続する.
  • PhidgetServerの動作しているIPアドレス/ポート番号を指定します.
  • 「接続」ボタンを押すことで,PhidgetServerに接続を試みます.
    • 接続に成功した場合,ステータスバーに「接続に成功しました」と表示され,「切断」ボタンがアクティブになります.
    • 接続に失敗した場合,ステータスバーに「接続に失敗しました」と表示されます.
3.マウスイベントを生成する
  • PhidgetServerからの入力は,ポートの設定に応じて解析され,「マウスの状態」に反映されます.
  • 「マウスイベントを生成する」チェックボックスをオンにすると,マウスイベントを生成します. 通常のマウスで行える操作(カーソル移動,ホイールスクロール,クリックなど)をほぼ完全に代替することができます.
4.設定の自動保存と読込み
  • ポートの設定などは,アプリケーションを終了すると自動保存され,次回起動時に自動的に読み込まれます.
マウスイベントの生成
Windows環境でのマウスイベントの生成するためには,Win32APIの"mouse_event"か"SendInput"とい う関数を利用します.Windows 2000/XPではSendInputの利用が推奨されていますので,今回はこちら利用しています.SendInputはマウスイベントに限らず,キー ボードやその他の入力デバイスのイベントも生成できる,便利な関数です. 以下,C#環境からマウスイベントを生成する方法について簡単に説明します. 詳細については,筆者のページのソースコードを参考にしてください.
1.DllImport,定数,構造体の宣言
SendInput関数,マウスイベント関連の定数,InputおよびMouseInput構造体を定義します.
  [DllImport("user32.dll", SetLastError=true)]
  static extern int SendInput(uint nInputs, Input []pInputs, int cbSize);
  
  const int INPUT_MOUSE = 0x00;
  const int  MOUSEEVENTF_MOVE =    0x0001;  
  const int  MOUSEEVENTF_LEFTDOWN =  0x0002;  
  const int  MOUSEEVENTF_LEFTUP =    0x0004;   
  const int  MOUSEEVENTF_RIGHTDOWN =  0x0008;  
  const int  MOUSEEVENTF_RIGHTUP =  0x0010;    
  const int  MOUSEEVENTF_MIDDLEDOWN = 0x0020;  
  const int  MOUSEEVENTF_MIDDLEUP =  0x0040;   
  const int  MOUSEEVENTF_ABSOLUTE =  0x8000;
  const int  MOUSEEVENTF_WHEEL =    0x0800; 
  const int WHEEL_DELTA = 120;
  
  [StructLayout(LayoutKind.Explicit)]
  struct Input 
  {
    [FieldOffset(0)]
    public int type;
    [FieldOffset(4)]
    public MouseInput mi;
    [FieldOffset(4)]
    public KeybdInput ki;
    [FieldOffset(4)]
    public HardwareInput hi;
  }
 
  struct MouseInput 
  {
    public int dx;
    public int dy;
    public int mouseData;
    public int dwFlags;
    public int time;
    public int dwExtraInfo;
  }
2. 受信したコマンドを解析
InterfaceKitから受信したコマンドを解析します.アナログポートのデータは, 相対値のマウス座標に換算します.MOUSE_ZERO_MINとMOUSE_ZERO_MAXの間の データは中立(移動なし)とみなします.
  const int MOUSE_ZERO_MIN = 400;
  const int MOUSE_ZERO_MAX = 500;
  const int MOUSE_RESOLUTION = 25;
  
  int x, y, z;
	
  private void Parse(string line)
  {
    int dwFlags = 0;
    string [] args = line.Split(",".ToCharArray());
       
    if(args[0] == "In" && args[1] == "InterfaceKit"){
      if(args[2] == "Analog")
      {
        int move = CalcRelativeMovement(int.Parse(args[4]), 
                     MOUSE_ZERO_MIN, MOUSE_ZERO_MAX, MOUSE_INTERVAL) ;
        switch(args[3]){
          case comboBoxMapX.Text:
            x = -(int)move ;
            break;
          case comboBoxMapY.Text):
            y = -(int)move; 
            break;
          case comboBoxMapW.Text)
            w =  move;
            break;
        }
      }
    ...
    }
    return dwFlags;
  }
	
  private int CalcRelativeValue(int data, int min, int max, int resolution)
  {
    int result = 0;
    if(data > max)
      result = (int)((data - max) / (float)resolution);
    else if (data < min)
      result = -(int)((min - data) / (float)resolution);
    return result;
  }
3. マウスイベントの生成
SendInput関数を用いて,マウスイベントを生成します
  private void CreateMouseEvent(int dwFlags)
  {
    Input input = new Input();
    input.type = INPUT_MOUSE;
        
    input.mi = new MouseInput();
    input.mi.dwFlags = dwFlags;
    input.mi.time = 0;
    input.mi.mouseData = 0;
 
    if((dwFlags & MOUSEEVENTF_MOVE) != 0)
    {
      input.mi.dx = x;
      input.mi.dy = y;  
    }
    else if ((dwFlags & MOUSEEVENTF_WHEEL) != 0)
    {
      input.mi.mouseData = w;        
    }
	    Input []inputs = new Input[1];
    inputs[0] = input;
    SendInput(1, inputs, Marshal.SizeOf(input));
  }
目次へ



2. PhidgetLauncher

PhidgetLauncherは,Phidget RFID(以下,リーダー)を利用したアプリケーション・ランチャーです(図).RFIDタグのIDを登録し,任意のファイルやプログラムと対応付けるこ とができます.一度対応付けが完了すれば,RFIDタグを置く/取り除くだけで,さまざまな操作を行うことができます.

機能的には,SoftwareDesign誌2005年1月号の記事で紹介した,FelicaLauncher(Felicaを利用したアプリケーションランチャー)と類似していますので,こちらも参考にしてください.

ここでは,PhidgetLauncherのハードウェア/ソフトウェアについて説明していきます. なお,ソフトウェアのダウンロードはこちらから行えます.

ハードウェア
PhidgetLauncherでは,リーダーと添付のタグをそのまま利用するため,特別な工作は必要ありません. リーダーをPCとUSB接続ケーブルで接続するだけで準備は完了です(図7). 添付のタグにはコイン型/カード型/キーホルダー型などのさまざまな形状が用意されているため,用途に合わせて使い分けることができます.小物や日用品な どに組み込んで利用する際には小さいコイン型のタグを,ユーザの認証として利用する際には,持ち運びやすいカード型やキーホルダー型のタグを利用するとよ いでしょう.
図7 PhidgetLauncherの外観
ソフトウェア
それでは,PhidgetLauncherの使い方について説明していきます.PhidgetLauncherは,.Net Frameworkを用いて,C#で記述されています.図8に,ソフトウェアの概観を示します.
図8 PhidgetLauncherのソフトウェア
1.PhidgetServerへ接続する.
PhidgetServerへ接続します.詳細については,PhidgetMouseの説明を参照してください.
2.IDの登録
  • リーダーにタグを置くと,「カードのID」欄に,IDが表示されます.
  • 次に,ID欄の横にある「IDを登録」ボタンを押すと,「登録ID」リストにIDが追加されます.
3. IDとプログラム/ファイルの対応付け
  • 「登録ID」リストに登録されているIDをダブルクリックすると,IDとプログラム/ファイルの対応付けウインドウが開きます(図9).
  • 「Name(IDの呼び名)」,ID認識/除去時それぞれの「Program」「Option(ファイル名やURL)」を指定します.「登録」ボタンを押せば,対応付けは完了です.
図9 IDとプログラムの対応付けの例 (タグの「認識」時にメーラーを起動 )
4. IDの認識とプログラムの起動/終了
  • 「イベントを生成する」チェックボックスがチェックされている場合,プログラムの起動/終了処理を実行します.
  • 「認識時の処理」が指定されている場合,特定のIDが認識される(タグが置かれる)と,外部プログラムやファイルが起動されます(図10).
  • 「除去時の処理」が指定されている場合,特定のIDが除去される(タグが取り除かれる)と,同様のイベントが発生します.
  • 外部プログラムは同時に一つしか起動されません.新しいIDが認識/除去された時点で,以前の外部プログラムは自動的に終了します.
図10 PhidetLauncherの動作例(メーラーの起動〜メールの作成)
5. IDの保存と読み込み
  • 「登録ID」リストに登録されたIDや対応付けの情報は,プログラム終了時に自動的に保存され,次回起動時に読み出されます.
目次へ

[次へ->PhidgetApplicationの紹介(3)]


[1] [2] [3] [4]

[デバイスぶらり旅]