מדריך Windows Phone – שימוש בסנסור Accelerometer (חיישן זוית הטלפון)
מה זה סנסורים?
סנסור הוא רכיב חומרה המודד איזושהי תופעה פיזיקאלית כגון תאוצה בזויות שונות (Accelerometer), מיקום נוכחי (GPS) ועוד.
על פי דרישות מיקרוסופט, בכל מכשיר התומך במערכת ההפעלה Windows Phone 7.0 חייבים להיות מותקנים הסנסורים הבאים:
- מד תאוצה (Acceleromter)
- מיקרופון
- GPS
- מצלמה
- רדיו
בנוסף, החל מגרסת מנגו (Windows Phone 7.1) חלק מהמכשירים יכולים להכיל גם את הסנסורים הבא:
- מצפן
- מד אוריינטציה (Gyro)
- מד תנועה
בפרק זה נלמד כיצד להשתמש בסנסור למדידת תאוצות (Accelerometer).
שימוש בסנסור Accelerometer
מד תאוצה או Accelerometer הוא סנסור שמודד את התאוצה שמופעלת על המכשיר. תאוצה נותנת לנו מדד לכוח שמופעל על המכשיר, זה יכול להיות כוח המשיכה או כוחות שהמשתמש מפעיל על המכשיר (לדוגמא הזזת המכשיר מצד לצד). מד התאוצה מחזיר לנו וקטור שמציין מהו ערך התאוצה בכל אחד מהצירים X, Y, Z.
כדי להשתמש בסנסור מסוג Accelerometer יש להוסיף לפרויקט reference לקבצים הבאים:
- Microsoft.Devices.Sensors.dll
- Microsoft.XNA.Framework
לאחר מכן נוכל ליצור משתנה מטיפוס Microsoft.Devices.Sensors.Accelerometer ולהירשם לאירוע שלו CurrentValueChanged, שיתרחש בכל פעם שיתקבל וקטור תאוצה חדש.
כדי להתחיל לקבל ערכים יש להפעיל את הפונקציה Start של האובייקט Accelerometer. אם נרצה להפסיק לעבוד עם הסנסור יש לקרוא לפונקציה Stop.
בדוגמא הבאה אנו מייצרים אובייקט מטיפוס Accelerometer ומפעילים אותו בעת לחיצה על כפתור "Start accelerometer". בעת קבלת מידע חדש אנו מדפיסים אותו למסך לשלושה TextBlock נפרדים.
נעיר כי הפונקציה שנרשמה לאירוע CurrentValueChanged מתקבלת על Thread נפרד מאשר ה Thread הראשי, ולכן יש להשתמש בפונקציית העזר Dispatcher.BeginInvoke בשביל לבצע את השינוי הויזואלי מה Thread הראשי, אחרת נקבל את השגיאה "Invalid cross-thread access".
להלן קוד הXAML של הדוגמא:
<phone:PhoneApplicationPage
x:Class="PhoneApp7.MainPage"
>="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
>:x="http://schemas.microsoft.com/winfx/2006/xaml"
>:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
>:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
>:d="http://schemas.microsoft.com/expression/blend/2008"
>:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
mc:Ignorable="d"
d:DesignWidth="480"
d:DesignHeight="768"
FontFamily="{StaticResource PhoneFontFamilyNormal}"
FontSize="{StaticResource PhoneFontSizeNormal}"
Foreground="{StaticResource PhoneForegroundBrush}"
SupportedOrientations="Portrait"
Orientation="Portrait"
shell:SystemTray.IsVisible="True">
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
<RowDefinition Height="Auto" />
</Grid.RowDefinitions>
<Grid.ColumnDefinitions>
<ColumnDefinition Width="*" />
<ColumnDefinition Width="*" />
</Grid.ColumnDefinitions>
<TextBlock
Grid.Row="0"
Grid.Column="0"
Text="X" />
<TextBlock
Grid.Row="0"
Grid.Column="1"
x:Name="xValue" />
<TextBlock
Grid.Row="1"
Grid.Column="0"
Text="Y" />
<TextBlock
Grid.Row="1"
Grid.Column="1"
x:Name="yValue" />
<TextBlock
Grid.Row="2"
Grid.Column="0"
Text="Z" />
<TextBlock
Grid.Row="2"
Grid.Column="1"
x:Name="zValue" />
<Button
Grid.Row="3"
Grid.Column="0"
Grid.ColumnSpan="2"
Content="Start accelerometer"
Click="Button_Click" />
</Grid>
</phone:PhoneApplicationPage>
וכן קוד ה #C:
using System.Windows;
using Microsoft.Devices.Sensors;
using Microsoft.Phone.Controls;
namespace PhoneApp7
{
public partial class MainPage : PhoneApplicationPage
{
Accelerometer _accelerometer;
// Constructor
public MainPage()
{
InitializeComponent();
_accelerometer = new Accelerometer();
_accelerometer.CurrentValueChanged += _accelerometer_CurrentValueChanged;
}
void _accelerometer_CurrentValueChanged(
object sender, SensorReadingEventArgs<AccelerometerReading> e)
{
this.Dispatcher.BeginInvoke(
delegate
{
xValue.Text = e.SensorReading.Acceleration.X.ToString();
yValue.Text = e.SensorReading.Acceleration.Y.ToString();
zValue.Text = e.SensorReading.Acceleration.Z.ToString();
});
}
private void Button_Click(object sender, RoutedEventArgs e)
{
_accelerometer.Start();
}
}
}
תוצאת הרצת הקוד הנ"ל תראה כך:
נשים לב שתמיד נקבל את הוקטור בעל הערכים (0, 1-, 0). זאת מאחר וההרצה שלנו מתבצעת על האמולטור ולא על מכשיר אמיתי.
כדי לאפשר לסמלץ סנסור Accelerometer אמיתי, נוסף לכלי הפיתוח בגרסתם העדכנית סימולטור לסנסור Accelerometer.
כדי לפתוח אותו יש ללחוץ על כפתור החץ האמולטור של Windows Phone:
לאחר הפתיחה נוכל לשנות את הערך המוחזר מאובייקט ה Accelerometer ע"י הזזה וירטואלית של המכשיר:
נשים לב שלאחר שהזזנו את המכשיר, הערכים שחוזרים ממד התאוצה משתנים לי הכיוון הנוכחי שלו.
תגובות בפייסבוק