はじめに
Windows Phone 7にはGPS、加速度センサー、電子コンパス、照度センサー等の各種センサーデバイスが搭載されており、現時点でアプリケーション向けに提供されている機能としては、GPS・加速度センサーを制御するAPIが公開されています。
Windows Moble 6.xの場合ですと、メーカーから技術情報を公開されることはほぼ無いため、自前で解析したりシリアルポートで通信させる必要があったのですが、標準でセンサーが使えるのは本当に嬉しいですね。
今回は加速度センサーを制御してみましょう。
加速度センサーにってなんだろう?
まずは加速度センサーについてです。
加速度センサーは、「重力方向に対する傾斜角を計測する」センサーで、現在端末が重力に対してどのような傾きになっているかや、傾きの変化を数値として取得することができます。
ノートPCにも搭載されており、衝撃などを検知してHDDを止めダメージを受けないように制御していたりします。携帯電話やスマートフォンでは瞬間的な「衝撃」を検知するものもありますが、加速度センサーの主な使用用途としては、端末の傾きに応じたコンテンツを提供することに使われています。
Windows Phone 7の標準機能でも利用されており、Picture Hubで写真を見ている時などは端末を立てた状態から横に回転させると表示される比率が変わったり、メール送信時のソフトキーボードの位置や形を変えたりなどができます。
さて、どのようにして回転されたことを認識するのでしょうか。端末をテーブルの上に載せて、液晶画面を天に向けて水平にしている時には、下の方向に対して常に1Gの重力が加わっている状態になっているためにZ方向に-1.00の出力が得られます。逆に液晶画面を地に向けるとZ方向に1.00の出力となります。
Windows Phone 7に搭載されている加速度センサーは、XYZ軸の3軸を認識できるセンサーです。それぞれ矢印の部分を天に向けた時にどの軸に対して1Gが加わるのかをまとめました。
またその際に出力されるXYZ軸の値は以下の通りになります。
デバイスの状態 | X | Y | Z |
液晶を天に向ける | 0.00 | 0.00 | -1.00 |
液晶を地に向ける | 0.00 | 0.00 | 1.00 |
Landscapeで右側を天に向ける | -1.00 | 0.00 | 0.00 |
Landscapeで右側を地に向ける | 1.00 | 0.00 | 0.00 |
Portraitでトップを天に向ける | 0.00 | -1.00 | 0.00 |
Portraitでトップを地に向ける | 0.00 | 1.00 | 0.00 |
縦向き(Portrait)に端末を持っている状態から右に端末をゆっくりと回転させて、横向き(Landscape)にした場合、Y軸の値が-1.00から正の値へ変化し、X軸の値は0.00から負の値へ変化していきます。
では、実際に実装してみましょう。
加速度センサーからのデータの取得
適当なプロジェクトを作ってください。XYZ軸の出力を表示するためのTextBlcokをそれぞれXTextBlock、YTextBlock、ZTextBlockと名前を付けて配置しておいてください。
加速度センサーAPIを使用するためにアセンブリの追加を行います。ソリューションエクスプローラーの参照を右クリックから「参照の追加」を選択して、.NETタブより「Microsoft.Devices.Sensors」を見つけて選択後OKを押します。
「Microsoft.Devices.Sensors」の名前空間を以下のように宣言しておいてください。
加速度センサーの利用には、Microsoft.Devices.Sensors名前空間のAccelerometerクラスを使用します。以下のようにインスタンスフィールドを宣言します。
次にApplicationPageのロード時にAccelerometerクラスのインスタンスを生成し、加速度センサーの値が変化したときに通知されるイベントのハンドラを登録します。Startメソッドでデータ取得を開始します。
加速度センサーデバイスからデータを取得する処理フレームワーク内で完結しています。実際に取得したデータは、AccelerometerReadingEventArgsの形でイベントハンドラに渡されます。
そのまま取得した出力値を最初に配置したTextBlockに表示出来れば良いのですが、メインスレッドとは別のスレッド上でハンドラが呼び出されていますので、メインスレッド上で処理させるよう、Dispatcherを使用してメインスレッド上で処理を渡します。
アプリケーションの終了時に加速度センサーのデータ取得を停止させるために、AccelerometerクラスのStopメソッドを使用しています。
これで起動時から加速度センサーの出力値を表示し続けるアプリケーションの出来上がりです。
さいごに
既にWindows Phone 7 Marketplaceには、加速度センサーを使ったゲームがいくつもリリースされています。加速度センサーを利用したゲームやアプリケーションは、モバイル端末ならではの醍醐味ではないでしょうか。
今の流行りのAR(Augmented Reality)のアプリケーションなどもそのうちの一つですね。現在の状態だとWindows Phone 7では、直接Silverlightアプリからカメラプレビューのデータを取得することができませんが、ARの流れがWindows Phone 7にも来れば自然と公開されてくるのではないかと思います。
加速度センサーを使って、端末の動きをうまくアプリケーションに取り入れてくださいね。
以上で今回は終わりです。ありがとうございました。