День одинадцатый. Акселерометр

Вступление

Все устройства под управлением Windows Phone имеют акселерометр - небольшое аппаратное устройство, позволяющее определить положение телефона относительно земли. С помощью акселерометра легко смоделировать уровень нивелира. Кроме того, акселерометр можно использовать в интерактивных играх, управляя телефоном как штурвалом, рулем и т.д. Акселерометр также может реагировать на встряхивание или толчки (например, в игре Кости).

Акселерометр в Windows Phone является одним сенсорных устройств, который измеряется в трехмерной системе координат (X, Y, Z). Кроме того, учитывается притяжение земли (1G = 9.81 m/s2). В неподвижном состоянии, когда телефон лежит экраном вверх на столе, координаты по оси Z читаются как –1.0, а под двум других осям значения должны быть равным 0. Ниже представлена небольшая иллюстрация на эту тему:

Как считывать показания акселерометра

Получить значения от акселерометра очень просто. Для работы с акселерометром используется библиотека Microsoft.Devices.Sensors и пространство имен Microsoft.Devices.Sensors. В файле WMAppMinifest.xml нужно указать:


<Capability Name="ID_CAP_SENSORD" />

Создать новый объект Accelerometer.

Создать обработчик события ReadingChanged() для отслеживания изменения данных.

Передать значения события обратно в поток приложения.

Использовать полученные результаты по своему усмотрению.

Ниже представлен код файл MainPage.xaml.cs для примера работы с акселерометром. Мы создадим три TextBlock (XText, YText, and ZText) в файле MainPage.xaml, чтобы выводить значения на экран.


using System;
using System.Collections.Generic;
using System.Linq;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using Microsoft.Phone.Controls;
using Microsoft.Devices.Sensors;

namespace Day11_Accelerometer
{
	public partial class MainPage : PhoneApplicationPage
	{
		Accelerometer acc = new Accelerometer();
		
		// Constructor
		public MainPage()
		{
			InitializeComponent();
			acc.ReadingChanged += new EventHandler(acc_ReadingChanged);
			acc.Start();
		}

		void acc_ReadingChanged(object sender, AccelerometerReadingEventArgs e)
		{
			Deployment.Current.Dispatcher.BeginInvoke(() => ThreadSafeAccelerometerChanged(e));
		}

		void ThreadSafeAccelerometerChanged(AccelerometerReadingEventArgs e)
		{
			XText.Text = e.X.ToString("0.000");
			YText.Text = e.Y.ToString("0.000");
			ZText.Text = e.Z.ToString("0.000");
		}
	}
}

Эмуляция работы акселерометра

Понятно, что в эмуляторе тестировать акселерометр бесполезно, так как считается, что устройство лежит неподвижно на столе. Поэтому значение по оси будет равно –1. Существуют несколько способов эмулировать работу акселерометра:

Reactive Extensions - статья на MSDN (анг.), рассказывающая о фреймворке Reactive Extensions, который позволяет эмулировать работу акселерометра.

accelKitThis - интересная разработка. Вам предлагается скачать и распечатать раскройку телефона. Затем его надо склеить. Кроме того нужно скачать утилиту для работы с веб-камерой. После этого можете вращать склеенную игрушку перед камерой. На сайте разработчика есть ссылка на видеоролики, чтобы понять как работает технология. Смотрится забавно.

WiimoteLib - это библиотека для работы с пультом Wiimote. Так как Wiimote тоже имеет акселерометр, то можно поиграться с этой игрушкой. На сайте у меня есть статья Программирование для Wii, дающие базовые знания по работе с контроллером.

Windows Mobile Unified Sensor API - Некоторые телефоны под управлением Windows Mobile 6.5 (Samsung и HTC) имеют акселерометр. Если у вас как раз такой телефон, то можете его использовать в качестве источника данных для акселерометра. Попробуйте и этот способ.

Реклама