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

加速度センサーからのデータを取得します。

Microsoft.Devices.Sensors名前空間のクラスを使用して位置情報を取得します。参照の追加ダイアログにて「Microsoft.Devices.Sensors」を参照しておきます。センサーからの情報はXNA FrameworkのVector3型で通知されるので、「Microsoft.Xna.Framework」も参照しておきます。usingディレクティブにも追加しておきましょう。

using System.Windows;
using System.Windows.Navigation;
using Microsoft.Devices.Sensors;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework;

ここでは、XYZ軸の出力を表示すれば良いのでTextBlcokをコントロールを3つ配置して、それぞれlabelX、labelY、labelZと名前をつけます。

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

下記のサンプルコードではページ遷移後にOnNavigatedToメソッドが実行され、Accelerometerインスタンスの生成をおこない、Startメソッドで加速度センサーデバイスからのデータ取得を開始します。

using System.Windows;
using Microsoft.Devices.Sensors;
using Microsoft.Phone.Controls;
using Microsoft.Xna.Framework;
 
namespace AccelerometerTest {
    public partial class MainPage : PhoneApplicationPage {
        // コンストラクター
        public MainPage() {
            InitializeComponent();
        }
 
        Accelerometer accelerometer;
 
        // ページ遷移されてきた時に呼び出される
        protected override void OnNavigatedTo(NavigationEventArgs e) {
 
            // インスタンスの生成
            accelerometer = new Accelerometer();
 
            // 加速度センサの値が変化時した際に通知されるイベントにハンドラを登録
            accelerometer.CurrentValueChanged += accelerometer_CurrentValueChanged;
 
            // 加速度センサーデバイスのデータ取得の開始
            accelerometer.Start();
        }

センサーからの値が変化するとCurrentValueChangedイベントが発生します。ここではイベントハンドラで値を受け取り、TextBlockコントロールに表示させています。別スレッドから通知される為、BeginInvokeメソッドを使用しています。

        // センサーからの新しい値が通知された時のイベントハンドラ
        void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e) {
 
            // UI要素を変更したいのでUIスレッド上で実行させる
            Deployment.Current.Dispatcher.BeginInvoke(() => {
                Vector3 v = e.SensorReading.Acceleration;
 
                labelX.Text = string.Format("{0:0.0000}", v.X);
                labelY.Text = string.Format("{0:0.0000}", v.Y);
                labelZ.Text = string.Format("{0:0.0000}", v.Z);
            });
        }

このページから別のページに遷移する際に、加速度センサーからのデータ取得を停止させる為に、Stopメソッドを使用します。

        // このページから別のページへ遷移する際に呼び出される
        protected override void OnNavigatedFrom(NavigationEventArgs e) {
            // 加速度センサーデバイスのデータ取得の終了
            accelerometer.Stop();
            accelerometer = null;
        }
    }
}

以上で、ページ遷移時から加速度センサーの出力値を表示し続ける処理が書けました。

テストの際には、Windows Phoneシミュレータに付属するテストツールを利用すると仮想的な重力加速度の値を取得することができます。