概要
コンパスセンサーはデバイスの向きを検出するセンサーデバイスです。
名前空間:Microsoft.Devices.Sensors
System.Object
+--Microsoft.Devices.Sensors.SensorBase<CompassReading>
+--Microsoft.Devices.Sensors.Compass
Tips
コンパスセンサー(地磁気センサー)で方角を取得する
コンパスセンサーはデバイスの向きを検出するセンサーデバイスです。電子コンパスとも呼ばれたりもします。
CurrentValueChangedイベントでは、検出された磁界についての情報がCompassReadingオブジェクトで通知されます。
Windows Phone OS 7.0時代に発売された端末は、基本的にコンパスセンサーが搭載されておりません。実際に方角を取得する前にCompass.IsSupportedメソッドでコンパスセンサーがサポートされている(搭載されている)端末であるかどうかを判定します。
Compass compass; private void btnCompass_Click(object sender, RoutedEventArgs e) { // 実行する端末でコンパスセンサーが利用可能か調べる if (!Microsoft.Devices.Sensors.Compass.IsSupported) { throw new NotSupportedException("Not Supported device"); } // センサーのオブジェクト生成 compass = new Compass(); // センサーの値を更新の間隔を100ミリ秒に設定 compass.TimeBetweenUpdates = TimeSpan.FromMilliseconds(100); // CurrentValueChangedイベントのハンドラを設定 compass.CurrentValueChanged += compass_CurrentValueChanged; // コンパスセンサーのデータ取得を開始 compass.Start(); }
コンパスセンサーの向きを取得する
日本では大体5~10度のズレがあることを前提に、HeadingAccuracyプロパティで取得した地理的な北と地磁気北との誤差が15度以上の場合は、センサーから取得してきた値を採用しないようにガードを入れています。
デバイスの周りに磁石や金属があるとセンサーが干渉してしまい、正確な値を取得出来なくなってしまうようなので注意が必要です(端末を8の字を振らせるようにユーザーに注意を施しても良いかもしれません)。
コンパスセンサーは、北極点の方向を地理的な北(真北)と方位磁石が指す北(磁北)を取得することが出来ます。
CurrentValueChangedイベントのハンドラには、引数としてSensorReadingEventArgs
MagnetometerReadingプロパティでXYZ軸の磁束密度をマイクロテスラ単位で取得する事が出来ます。
void compass_CurrentValueChanged(object sender, SensorReadingEventArgs<CompassReading> e) { // UI要素を変更したいのでUIスレッド上で実行させる Deployment.Current.Dispatcher.BeginInvoke(() => { // 地磁気北からの時計回りの方位を取得する var v = e.SensorReading.MagneticHeading; labelMagneticHeading.Text = string.Format("{0:0.0000}", v); }); }