月別アーカイブ: 2009年1月

HTC Touch Diamond タッチセンサー API

Touch Diamond には、触れただけで反応するタッチセンサーが付いています。
ボタンやカーソルキー周りがそうです。

このタッチセンサーの値を受け取るには HTCAPI.dll を呼び出します。
ウィンドウに関連付けされ、あとはモードを設定するだけでメッセージ (WM_USER~)
で通知が来るようです。
参考にさせていただいたのは加速度センサーの読み出し同様こちらです。

Scott’s Weblog Fun with the Diamond’s tilt sensor

タッチセンサーは左右に分かれており、それぞれ個別に座標値が取れます。

・中央のカーソルキーから左側、通話ボタンやホームボタン側
・中央のカーソルキーから右側、終了ボタンや ← (OK) ボタン側

座標値は左上が原点 (0,0) で、0~67 くらいの範囲。
ただし中央のカーソルキー周囲は回転のジェスチャーとして識別されるため座標が
取れません。

中央の決定ボタンは、座標が不正な範囲 (255,255) の状態で押されることで
判別できます。カメラのオートフォーカスで半押し状態がこれ。

タッチしたイベント (DOWN) と指を離したイベント (UP) が送られてくるだけで、
MOVE イベントがありません。押した座標、離した座標は取れますが、移動中の
イベントがないのでスライドによるスクロールなどには向いていないようです。

液晶面の感圧式タッチパネルだとスクロール等のスライドを指で行うのが
難しかったりするので、本当ならこちらのタッチセンサーでスクロールできたら
よかったのですが。

また左右のパネル両方同じイベント扱いなので、どちらかにタッチしてしまうと
DOWN 状態になります。座標は独立して取れるものの状態が共有なので、
マルチタッチのような使い方にも向いていないようです。

なお液晶面のタッチパネルとは別物なので、タッチボタンと液晶画面など別センサー
同士の同時タッチは可能です。

HTCNavClose() の引数は DWORD ではなく、HWND が正しいようです。
よって HTCNavSetMode() で与えた DWORD を Close() するのではなく、使い方としては
HTCNavOpen() に与えた HWND を指定して一度だけ Close() します。

中央の回転ジェスチャーは WM_USER + 200 だけでなく WM_USER + 201 にも何らかの
データが送られています。終了イベントのようですが、送られないこともあります。

いろいろ試したけど生の値が取れる方法はまだわかりません。
とりあえずボタン部分に触れただけで反応するような感度の良いアプリは作れると
思います。

同じ部分に指を置いても

(1) 触れる → タッチセンサー
(2) 押し込み → ボタン
(3) 触れたまま揺らす → 加速度センサー

といった使い分けもできるでしょう。

関連エントリ
HTC Touch Diamond のボタン部分とタッチセンサー
HTC Touch Diamond の加速センサー

HTC Touch Diamond の加速センサー

HTC Touch Diamond の加速センサーから値を読み出してみました。
参考にさせていただいたのは下記サイトのプログラムです。

Scott’s Weblog Fun with the Diamond’s tilt sensor

API は Touch Diamond に含まれている HTCSensorSDK.dll を呼び出しています。
取り出せる値は 3軸センサーのそれぞれの加速度 X Y Z。
ソースにはだいたい -1000~1000 程度の範囲で傾きと書かれていますが、
やはり重力加速度を表しているようです。
何もしない状態で ±1000 前後 (1G)。強く振ると ±2400 程度の値も取れます。

データの連続取得は 40msec 程度の間隔が必要です。
当初動かしたときは 1/30 や 1/60 sec でサンプリングしていたため、値が更新されず
少々悩みました。

使用しているセンサーはレジストリの DeviceVendor より Kionix KXSD9

direction=5  液晶背面方向 -Z
direction=4  液晶面方向   +Z
direction=1  左サイド     -X
direction=0  右サイド     +X
direction=2  下           +Y
direction=3  上           -Y

struct SENSORDATA {
    short   ax;
    short   ay;
    short   az;
    short   zero;
    int     AngleY;
    int     AngleX;
    int	    direction;
};

例えば机の上に水平に寝かせた状態だと、液晶背面方向が重力方向だから
az = -1000 前後に、direction が 5 になります。
SENSORDATA の最後の値はこのように、大まかな端末の向きをそのまま表して いるようです。
いるようです。
AngleX/AngleY はおそらく極座標か何かだと思いますが未調査。

関連エントリ
HTC Touch Diamond のボタン部分とタッチセンサー

HTC Touch Diamond のボタン部分とタッチセンサー

HTC Touch Diamond の画面の下、ボタンのあたりは一枚板になっています。
だけどボタン部分は押し込むことができて、ちょうど iPod のクリック&ホイール
みたいにカチッと反応するボタンが埋まっています。

この部分、アプリによっては押し込まなくても操作可能です。
カメラだとオートフォーカスの半押しができるし、Opera でカーソルのあたりを
丸くなぞるとズームできるし、その仕組みが不思議でした。
どうやらボタンの上、板の部分全体がタッチセンサーになっているようです。

液晶画面の方はこれまでのタッチパネルと同じ感圧式で、スタイラスが使えるし
ある程度圧力をかけないと反応しません。

ボタン側の方は iPhone/iPod touch のように指で触れるだけで反応するし、
スタイラスに反応しないため静電容量式だと思われます。

クリックボタンが押しにくくなるだけなのに、わざわざ一枚板になっている理由も
これでわかります。

PS3 のワイヤレスキーパッドみたいに、気がつかないところで使われている
タッチセンサーはこれからも増えそうですね。

タッチの情報を取得すれば、ズーム操作と重なるかもしれないけど
触れるだけで反応できるカーソルキーとか、
触れた場合と押し込んだ場合で動作が変わるボタンとか作れるかもしれません。
使いやすいかどうかは別として。

Touch Diamond には加速センサーが入っています。
3軸のセンサーのようで、Wii Remote 同様に重力加速度で傾きがわかります。
この情報にアクセスする方法を解析された方はいらっしゃるようで、
サンプルプログラムなどもおいてありました。

Scott’s Weblog

タッチセンサー情報が見れたのもこのプログラムのおかげです。