USBセンサを使ってみよう 〜Phidgets活用講座 実践編 (2)〜 |
作成日: 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月」を指します. ここでは,物理的なセンサ(スライダー)を用いて,複数のリスト(Webページなど)を閲覧するシステム「PhidgetBrowser」と,光センサを利用して,ユーザの状態に応じたスクリーンセーバーの制御を行うシステム「PhidgetSaver」について紹介します. USBセンサを使ってみよう(PhidgetApplication編)も参考にしてください. |
|
連載目次 |
|
PhidgetApplicationの紹介(1) | |||||||||||||||||||||||||||||||||
|
2. PhidgetSaver | ||||||
PhidgetSaverは,光センサを利用して,ユーザの状態に応じたスクリーンセーバーの制御を行うシステムです.図3に示すように, コンピュータの利用が中断される(ユーザの手がキーボード付近から離される)と,光センサがユーザの影の変化を検出し,自動的にスクリーンセーバーが起動 します.さらに,コンピュータの利用が再開される(ユーザの手がキーボード付近に置かれる)と,自動的にスクリーンセーバーを解除します. ここでは,PhidgetSaverのハードウェア/ソフトウェアについて説明します. なお,ソフトウェアのダウンロードはこちらから行えます. | ||||||
|
||||||
ハードウェア | ||||||
PhidgetSaverは,PhidgetBrowserと同様,InterfaceKitと一つのセンサ(光センサ)を用意するだけ で利用することができます.光センサ(CDS)はぷらっとホームで販売されているInterfaceKit Packageには標準で含まれており,Phidgetsの公式サイトでも7CDNと安価に購入できます. 光センサをInterfaceKitのポート0に接続し,InterfaceKitとPCをUSBケーブルで接続するだけで,ハードウェアの準備は完了です.ここでは,光センサをノートパソコンのパームレスト部分に取り付けています. |
||||||
ソフトウェア | ||||||
PhidgetSaverのソフトウェアは,PhidgetServerに接続するTCPクライアントとして,Rubyを用いて記述しています.PhidgetSaverを利用するためには,Cygwinから以下のように入力します. %./PhidgetSaver.rb オプションの設定などは,PhidgetBrowserとほぼ同様です. ここでは,ソースコードの主要部分を参照しながら,PhidgetServerの処理の流れについて簡単に説明します.なお,PhidgetBrowserと共通する説明については割愛します. |
||||||
1. PhidgetServerへの接続 | ||||||
TCPSocketクラスを用いて,PhidgetServerに接続します. | ||||||
2. 受信したコマンドを解析 | ||||||
受信したコマンドを解析し,光センサの状態を検出します.光センサの入力が特定の閾値を上回った/下回った場合,スクリーンセーバーの起動/終了処理を行います. | ||||||
def main ... if check_brightness (level) start_screen_saver else stop_screen_saver end ... end def check_brightness?(level, threshold = 200) flag = false flag = true if level > threshold end |
||||||
3. スクリーンセーバーの起動 | ||||||
スクリーンセーバーが起動中でない場合,cygstartコマンドを用いて起動します.ここでは,Windows標準のスクリーンセーバーのひとつ,"logon.scr"を起動しています. | ||||||
def start_screen_saver (file = "logon.scr") if(!@saver_working) system "cygstart #{file}" @saver_working = true end end |
||||||
4. スクリーンセーバーの終了 | ||||||
スクリーンセーバーが起動している場合,キーボードイベント(シフトキー)を発生させて,スクリーンセーバーを終了します. Windows上でのキーボードイベントの生成は,Win32APIの"keybd_event"か,"SendInput" 関数を利用します.両者の違いは,SendInputはWindows2000から搭載されたより高機能な関数であり,マウスやその他のハードウェアのイ ベントも生成することができる点です. ここでは,シフトキーイベントを生成するだけが目的ですので,よりシンプルなkeybd_event関数を用いた方法を紹介します.(なお,後述するPhidgetMouseでは,SendInputを用いてマウスイベントを生成しています.) |
||||||
def stop_screen_saver if(@saver_working) Win32.send_keybd_event(Win32::VK_SHIFT) Win32.send_keybd_event(Win32::VK_SHIFT, Win32::KEYEVENTF_KEYUP) @saver_working = false end end module Win32 extend DL::Importable typealias "DWORD", "unsigned long" typealias "BYTE", "unsigned char" typealias "ULONG", "unsigned long" KEYEVENTF_KEYUP = 0x02 VK_SHIFT = 0x10 dlload "user32.dll" extern "void keybd_event(BYTE, BYTE, DWORD, ULONG)" def send_keybd_event(bVk, dwFlags = 0) keybd_event(bVk, 0, dwFlags, 0) end module_function :send_keybd_event end |
||||||
[次へ->PhidgetApplicationの紹介(2)]
[デバイスぶらり旅]