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).ここでは,ジョイスティック/つまみ/プッシュボタンなどを利用したオリジナルのデバイスでマウス入力を行う方法について,ハードウェア/ソフト ウェアの両面から説明します. なお,ソフトウェアのダウンロードはこちらから行えます. | ||
|
||
ハードウェア | ||
マウスとして利用できるセンサの組み合わせは多数考えられますが,ここでは,比較的スタンダードな形態として,ジョイスティック,つまみ(可変抵抗),三つのプッシュスイッチから構成されるハードウェアを製作します(図5). | ||
|
||
ジョイスティックとつまみは,ぷらっとホームで販売されている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に,ソフトウェアの概観を示します. | ||
|
||
1.ポートの設定 | ||
まず,ハードウェア(InterfaceKitのポート)とマウスの機能の対応付けを行います.
|
||
2.PhidgetServerへ接続する. | ||
|
||
3.マウスイベントを生成する | ||
|
||
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). 添付のタグにはコイン型/カード型/キーホルダー型などのさまざまな形状が用意されているため,用途に合わせて使い分けることができます.小物や日用品な どに組み込んで利用する際には小さいコイン型のタグを,ユーザの認証として利用する際には,持ち運びやすいカード型やキーホルダー型のタグを利用するとよ いでしょう. | ||
|
||
ソフトウェア | ||
それでは,PhidgetLauncherの使い方について説明していきます.PhidgetLauncherは,.Net Frameworkを用いて,C#で記述されています.図8に,ソフトウェアの概観を示します. | ||
|
||
1.PhidgetServerへ接続する. | ||
PhidgetServerへ接続します.詳細については,PhidgetMouseの説明を参照してください. | ||
2.IDの登録 | ||
|
||
3. IDとプログラム/ファイルの対応付け | ||
|
||
|
||
4. IDの認識とプログラムの起動/終了 | ||
|
||
|
||
5. IDの保存と読み込み | ||
|
||
[次へ->PhidgetApplicationの紹介(3)]
[デバイスぶらり旅]