Windows Phoneアプリケーション開発入門

第24回加速度センサーを使ってみよう!

はじめに

Windows Phone 7にはGPS、加速度センサー、電子コンパス、照度センサー等の各種センサーデバイスが搭載されており、現時点でアプリケーション向けに提供されている機能としては、GPS・加速度センサーを制御するAPIが公開されています。

Windows Moble 6.xの場合ですと、メーカーから技術情報を公開されることはほぼ無いため、自前で解析したりシリアルポートで通信させる必要があったのですが、標準でセンサーが使えるのは本当に嬉しいですね。

今回は加速度センサーを制御してみましょう。

加速度センサーにってなんだろう?

まずは加速度センサーについてです。

加速度センサーは、⁠重力方向に対する傾斜角を計測する」センサーで、現在端末が重力に対してどのような傾きになっているかや、傾きの変化を数値として取得することができます。

ノートPCにも搭載されており、衝撃などを検知してHDDを止めダメージを受けないように制御していたりします。携帯電話やスマートフォンでは瞬間的な「衝撃」を検知するものもありますが、加速度センサーの主な使用用途としては、端末の傾きに応じたコンテンツを提供することに使われています。

Windows Phone 7の標準機能でも利用されており、Picture Hubで写真を見ている時などは端末を立てた状態から横に回転させると表示される比率が変わったり、メール送信時のソフトキーボードの位置や形を変えたりなどができます。

さて、どのようにして回転されたことを認識するのでしょうか。端末をテーブルの上に載せて、液晶画面を天に向けて水平にしている時には、下の方向に対して常に1Gの重力が加わっている状態になっているためにZ方向に-1.00の出力が得られます。逆に液晶画面を地に向けるとZ方向に1.00の出力となります。

図1 テーブルに端末を置くと常に-1.00Gの出力
図1 テーブルに端末を置くと常に-1.00Gの出力

Windows Phone 7に搭載されている加速度センサーは、XYZ軸の3軸を認識できるセンサーです。それぞれ矢印の部分を天に向けた時にどの軸に対して1Gが加わるのかをまとめました。

図2 矢印の部分を天に向けた際に1Gが加わる軸
図2 矢印の部分を天に向けた際に1Gが加わる軸

またその際に出力されるXYZ軸の値は以下の通りになります。

デバイスの状態XYZ
液晶を天に向ける 0.00 0.00 -1.00
液晶を地に向ける 0.00 0.00 1.00
Landscapeで右側を天に向ける -1.000.00 0.00
Landscapeで右側を地に向ける 1.00 0.00 0.00
Portraitでトップを天に向ける0.00 -1.000.00
Portraitでトップを地に向ける0.00 1.00 0.00

縦向き(Portrait)に端末を持っている状態から右に端末をゆっくりと回転させて、横向き(Landscape)にした場合、Y軸の値が-1.00から正の値へ変化し、X軸の値は0.00から負の値へ変化していきます。

では、実際に実装してみましょう。

加速度センサーからのデータの取得

適当なプロジェクトを作ってください。XYZ軸の出力を表示するためのTextBlcokをそれぞれXTextBlock、YTextBlock、ZTextBlockと名前を付けて配置しておいてください。

図3 TextBlockを配置後のMainPage
図3 TextBlockを配置後のMainPage

加速度センサーAPIを使用するためにアセンブリの追加を行います。ソリューションエクスプローラーの参照を右クリックから「参照の追加」を選択して、.NETタブより「Microsoft.Devices.Sensors」を見つけて選択後OKを押します。

「Microsoft.Devices.Sensors」の名前空間を以下のように宣言しておいてください。

using Microsoft.Devices.Sensors;

加速度センサーの利用には、Microsoft.Devices.Sensors名前空間のAccelerometerクラスを使用します。以下のようにインスタンスフィールドを宣言します。

  public partial class MainPage : PhoneApplicationPage
  {
      // Constructor
      public MainPage()
      {
          InitializeComponent();
      }

      Accelerometer accelerometer;

次にApplicationPageのロード時にAccelerometerクラスのインスタンスを生成し、加速度センサーの値が変化したときに通知されるイベントのハンドラを登録します。Startメソッドでデータ取得を開始します。

      private void PhoneApplicationPage_Loaded(object sender, RoutedEventArgs e)
      {
          // インスタンスの生成
          accelerometer = new Accelerometer();
          // 加速度センサの値が変化時した際に通知されるイベントにハンドラを登録
          accelerometer.ReadingChanged += new EventHandler<AccelerometerReadingEventArgs>(accelerometer_ReadingChanged);
          // 加速度センサデバイスのデータ取得の開始
          accelerometer.Start();
      }

加速度センサーデバイスからデータを取得する処理フレームワーク内で完結しています。実際に取得したデータは、AccelerometerReadingEventArgsの形でイベントハンドラに渡されます。

そのまま取得した出力値を最初に配置したTextBlockに表示出来れば良いのですが、メインスレッドとは別のスレッド上でハンドラが呼び出されていますので、メインスレッド上で処理させるよう、Dispatcherを使用してメインスレッド上で処理を渡します。

      void accelerometer_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
      {
          // 別スレッドからのアクセスになるのでInvoke
          Deployment.Current.Dispatcher.BeginInvoke(() => MyReadingChanged(e));
      }

      void MyReadingChanged(AccelerometerReadingEventArgs e)
      {
          XTextBlock.Text = e.X.ToString("0.00");
          YTextBlock.Text = e.Y.ToString("0.00");
          ZTextBlock.Text = e.Z.ToString("0.00");
      }

アプリケーションの終了時に加速度センサーのデータ取得を停止させるために、AccelerometerクラスのStopメソッドを使用しています。

      private void PhoneApplicationPage_Unloaded(object sender, RoutedEventArgs e)
      {
          // 加速度センサデバイスのデータ取得の終了
          accelerometer.Stop();
          accelerometer = null;
      }

これで起動時から加速度センサーの出力値を表示し続けるアプリケーションの出来上がりです。

図4 実行結果(シミュレータ上での動作)
図4 実行結果(シミュレータ上での動作)

さいごに

既にWindows Phone 7 Marketplaceには、加速度センサーを使ったゲームがいくつもリリースされています。加速度センサーを利用したゲームやアプリケーションは、モバイル端末ならではの醍醐味ではないでしょうか。

今の流行りのAR(Augmented Reality)のアプリケーションなどもそのうちの一つですね。現在の状態だとWindows Phone 7では、直接Silverlightアプリからカメラプレビューのデータを取得することができませんが、ARの流れがWindows Phone 7にも来れば自然と公開されてくるのではないかと思います。

加速度センサーを使って、端末の動きをうまくアプリケーションに取り入れてくださいね。

以上で今回は終わりです。ありがとうございました。

おすすめ記事

記事・ニュース一覧