וובמאסטר - תיכנות ובניית אתרים

מדריך Windows Phone – שימוש בסנסור Accelerometer (חיישן זוית הטלפון)

arikp ,‏ מכללת סלע‏ ‏/‏ 17 יולי, 2011
F+
F-

מה זה סנסורים?

סנסור הוא רכיב חומרה המודד איזושהי תופעה פיזיקאלית כגון תאוצה בזויות שונות (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"
  xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  xmlns:phone="clr-namespace:Microsoft.Phone.Controls;assembly=Microsoft.Phone"
  xmlns:shell="clr-namespace:Microsoft.Phone.Shell;assembly=Microsoft.Phone"
  xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  xmlns: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();
    }
  }
}

 

תוצאת הרצת הקוד הנ"ל תראה כך:

מדריך Windows Phone – שימוש בסנסור Accelerometer

 

נשים לב שתמיד נקבל את הוקטור בעל הערכים (0, 1-, 0). זאת מאחר וההרצה שלנו מתבצעת על האמולטור ולא על מכשיר אמיתי.

כדי לאפשר לסמלץ סנסור Accelerometer אמיתי, נוסף לכלי הפיתוח בגרסתם העדכנית סימולטור לסנסור Accelerometer.

כדי לפתוח אותו יש ללחוץ על כפתור החץ האמולטור של Windows Phone:

מדריך Windows Phone – שימוש בסנסור Accelerometer

 

לאחר הפתיחה נוכל לשנות את הערך המוחזר מאובייקט ה Accelerometer ע"י הזזה וירטואלית של המכשיר:

מדריך Windows Phone – שימוש בסנסור Accelerometer

נשים לב שלאחר שהזזנו את המכשיר, הערכים שחוזרים ממד התאוצה משתנים לי הכיוון הנוכחי שלו.

arikp, מכללת סלע

אריק פוזננסקי הוא יועץ בכיר ומרצה בסלע. הוא השלים שני תארי B.Sc. במתמטיקה ומדעי המחשב בהצטיינות יתרה בטכניון. לאריק ידע נרחב בטכנולוגיות מיקרוסופט, כולל .NET עם C#, WPF, Silverlight, WinForms, Interop, COM/ATL, C++ Win32 ו reverse engineering.
תגיות: Windows Phone‏  /  SilverLight‏  /  מדריך‏  /  פיתוח‏  /  סלולארי‏  

תגובות בפייסבוק

תגובות למאמר



עוד במדריך

תגיות פופולאריות

X
הצטרף לעמוד שלנו בפייסבוק להישאר מעודכן!
וובמאסטר © כל הזכויות שמורות