내보내기(0) 인쇄
모두 확장

방법: Windows Phone의 가속도계 센서에서 데이터 가져오기

2012-02-09

이 항목에서는 가속도계 데이터의 그래픽 표현 및 숫자 표시를 가능하게 하는 가속도계 응용프로그램을 만드는 과정에 대해 설명합니다.

가속도계는 어느 순간에 단말기에 적용되는 힘을 측정합니다. 이러한 힘은 사용자가 단말기를 움직이는 방향을 확인하는 데 사용할 수 있습니다. 가속 값은 X, Y, Z축의 가속 구성 요소를 나타내는 3차원 벡터로 표현됩니다(중력 단위). 가속도 방향은 장치에 상대적입니다. 예를 들어 평평한 테이블에 장치가 전면이 위로 향해 놓여 있으면 -1g가 Z축으로 적용되고 장치가 테이블 상단에 수직으로 놓여 있으면 -1g가 Y축에 적용됩니다.

가속도계 센서는 휴대폰의 움직임으로 인해 발생하는 힘에 따라 중력을 감지합니다. Motion 클래스를 사용하여 액세스되는 복합 동작 API는 여러 단말기 센서를 사용하여 단말기 가속도로부터 중력 벡터를 분리하고, 사용자가 단말기의 현재 자세(요, 피치, 롤)을 쉽게 확인할 수 있도록 합니다.

다음 단계는 가속도계 응용프로그램을 만드는 방법을 보여 줍니다.

가속도계 응용프로그램을 만들려면

  1. Visual Studio 에서 새로운 Windows Phone 응용프로그램 프로젝트를 만듭니다. 이 템플릿은 Windows Phone용 Silverlight 카테고리에 있습니다.

  2. 이 응용프로그램에는 센서 API 및 XNA Framework를 포함하는 어셈블리에 대한 참조가 필요합니다. 가속도계 데이터가 XNA Framework Vector3 개체 형태로 전달되기 때문입니다. 프로젝트 메뉴에서 참조 추가…를 클릭하고 Microsoft.Devices.SensorsMicrosoft.Xna.Framework를 선택한 다음 확인을 클릭합니다.

  3. MainPage.xaml 파일에서 "ContentPanel"이라는 Grid 요소에 다음 XAML 코드를 넣습니다. 이 코드는 2개의 버튼을 만듭니다. 그 중 하나는 가속도계에서 데이터 수집을 시작하고, 다른 하나는 데이터 수집을 중지합니다. 또한 숫자 값을 나타내는 데 사용할 TextBlock 요소 3개와 읽기 데이터를 그래픽으로 나타내는 데 사용할 Line 요소 3개도 만듭니다. 마지막으로, 이 코드는 응용프로그램의 현재 상태를 표시하는 데 사용할 상태 TextBlock 요소를 추가합니다.

    <Button Content="Start" Height="72" HorizontalAlignment="Left" Margin="20,10,0,0" Name="startButton" VerticalAlignment="Top" Width="160" Click="startButton_Click" />
    <Button Content="Stop" Height="72" HorizontalAlignment="Right" Margin="0,10,20,0" Name="stopButton" VerticalAlignment="Top" Width="160" Click="stopButton_Click"/>
    <TextBlock Height="30" HorizontalAlignment="Left"  Margin="20,100,0,0" Name="xTextBlock" Text="X: 1.0" VerticalAlignment="Top" Foreground="Red" FontSize="28" FontWeight="Bold"/>
    <TextBlock Height="30" HorizontalAlignment="Center"  Margin="0,100,0,0" Name="yTextBlock" Text="Y: 1.0" VerticalAlignment="Top" Foreground="Green" FontSize="28" FontWeight="Bold"/>
    <TextBlock Height="30" HorizontalAlignment="Right"  Margin="0,100,20,0" Name="zTextBlock" Text="Z: 1.0" VerticalAlignment="Top"  Foreground="Blue" FontSize="28" FontWeight="Bold"/>
    <Line x:Name="xLine" X1="240" Y1="350" X2="340" Y2="350" Stroke="Red" StrokeThickness="4"></Line>
    <Line x:Name="yLine" X1="240" Y1="350" X2="240" Y2="270" Stroke="Green" StrokeThickness="4"></Line>
    <Line x:Name="zLine" X1="240" Y1="350" X2="190" Y2="400" Stroke="Blue" StrokeThickness="4"></Line>
    <TextBlock Height="30" HorizontalAlignment="Center" Margin="6,571,6,0" Name="statusTextBlock" Text="TextBlock" VerticalAlignment="Top" Width="444" />
    
    
    
  4. 이제 MainPage.xaml.cs 코드 숨김 페이지를 열고 센서 및 XNA Framework 프레임워크 네임스페이스에 대한 using 지시문을 해당 페이지의 맨 위에 있는 다른 using 지시문에 추가합니다.

    using Microsoft.Devices.Sensors;
    using Microsoft.Xna.Framework;
    
    
  5. MainPage 클래스 정의의 맨 위에서 Accelerometer 형식의 변수를 선언합니다.

    public partial class MainPage : PhoneApplicationPage
    {
      Accelerometer accelerometer;
    
    
  6. 페이지 생성자에서 응용프로그램이 실행되고 있는 단말기의 가속도계 센서 지원 여부를 확인합니다. 모든 단말기가 모든 센서를 지원하지는 않으므로 센서를 사용하기 전에 항상 확인해야 합니다. 기존 페이지 생성자를 다음 코드로 바꿉니다.

    // Constructor
    public MainPage()
    {
      InitializeComponent();
    
      if (!Accelerometer.IsSupported)
      {
        // The device on which the application is running does not support
        // the accelerometer sensor. Alert the user and disable the
        // Start and Stop buttons.
        statusTextBlock.Text = "device does not support accelerometer";
        startButton.IsEnabled = false;
        stopButton.IsEnabled = false;
      }
    }
    
    
  7. 시작 버튼의 클릭 이벤트에 대한 처리기를 추기합니다. 위의 XAML 코드를 추가한 방식에 따라 Visual Studio 에서 이 처리기를 추가했을 수 있습니다. 이 경우 처리기 내부에서 모든 코드를 제거합니다. 처리기가 자동으로 추가되지 않았으면 다음 빈 함수를 복사하여 MainPage 클래스 정의에 붙여 넣습니다.

    private void startButton_Click(object sender, RoutedEventArgs e)
    {
                
    }
    
    
    
  8. 시작 버튼 클릭 처리기에서 가속도계 개체가 null인지, 초기화될 때까지 어떤 상태일지 확인합니다. 가속도계가 null이면 생성자를 사용하여 초기화합니다. 다음으로 TimeBetweenUpdates 속성을 설정하여 가속도계에서 데이터를 수신할 속도를 설정합니다. 기본값은 2밀리초입니다. 그리고 CurrentValueChanged 이벤트에 대한 처리기를 설정합니다. 다음 코드를 시작 버튼 클릭 처리기 내부에 붙여 넣습니다.

      if (accelerometer == null)
      {
       // Instantiate the Accelerometer.
        accelerometer = new Accelerometer();
        accelerometer.TimeBetweenUpdates = TimeSpan.FromMilliseconds(20);
        accelerometer.CurrentValueChanged+=new EventHandler<SensorReadingEventArgs<AccelerometerReading>>(accelerometer_CurrentValueChanged);
      }
    
    
  9. 이제 Start()()()() 메서드를 사용하여 가속도계를 시작합니다. Start에 대한 호출이 실패할 수 있으므로 이 호출을 try 블록에 넣어야 합니다. catch 블록에서 가속도계를 시작할 수 없음을 사용자에게 경고할 수 있습니다. 이 코드를 이전 코드 섹션 뒤에 나오는 시작 버튼 클릭 처리기에 붙여 넣습니다.

      try
      {
        statusTextBlock.Text = "starting accelerometer.";
        accelerometer.Start();
      }
      catch (InvalidOperationException ex)
      {
        statusTextBlock.Text = "unable to start accelerometer.";
      }
    
    
  10. 이제 CurrentValueChanged 이벤트 처리기를 구현합니다. 이 메서드는 TimeBetweenUpdates를 사용하여 지정한 빈도로 새 가속도계 데이터가 있는 시스템에서 호출됩니다. 처리기는 가속도계 데이터가 포함된 AccelerometerReading 개체를 수신합니다. 이 처리기는 UI에 대한 액세스 권한이 없는 백그라운드 스레드에서 호출됩니다. 따라서 이 이벤트 처리기는 UI 스레드에서 지정된 코드를 호출하는 Dispatcher.Invoke 메서드를 사용합니다. Dispatcher.Invoke는 다음 단계에서 정의할 UpdateUI를 호출하는 데 사용되며, AccelerometerReading 개체를 전달합니다.

    void accelerometer_CurrentValueChanged(object sender, SensorReadingEventArgs<AccelerometerReading> e)
    {
      // Call UpdateUI on the UI thread and pass the AccelerometerReading.
      Dispatcher.BeginInvoke(() => UpdateUI(e.SensorReading));
    }
    
    
  11. 가속도계 데이터를 사용자에게 보여 줄 UpdateUI 메서드를 구현합니다. 이 메서드는 데이터가 수신되고 있음을 나타내기 위해 첫 번째로 상태 TextBlock을 업데이트합니다. 세 개의 TextBlock 개체가 업데이트되어 센서의 각 축에 대한 가속도 숫자 값이 표시됩니다. 마지막으로, Line 개체가 업데이트되어 가속도를 그래픽으로 나타냅니다.

    private void UpdateUI(AccelerometerReading accelerometerReading)
    {
      statusTextBlock.Text = "getting data";
    
      Vector3 acceleration = accelerometerReading.Acceleration;
    
      // Show the numeric values.
      xTextBlock.Text = "X: " + acceleration.X.ToString("0.00");
      yTextBlock.Text = "Y: " + acceleration.Y.ToString("0.00");
      zTextBlock.Text = "Z: " + acceleration.Z.ToString("0.00");
    
      // Show the values graphically.
      xLine.X2 = xLine.X1 + acceleration.X * 200;
      yLine.Y2 = yLine.Y1 - acceleration.Y * 200;
      zLine.X2 = zLine.X1 - acceleration.Z * 100;
      zLine.Y2 = zLine.Y1 + acceleration.Z * 100;
    }
    
    
  12. 최종 단계는 사용자가 가속도계로부터의 데이터 수집을 중지할 수 있는 중지 버튼 클릭 처리기를 구현하는 것입니다. 다시 한 번, 편집기가 이 처리기를 자동으로 추가한 경우 콘텐츠를 다음으로 바꿉니다.

    private void stopButton_Click(object sender, RoutedEventArgs e)
    {
      if (accelerometer != null)
      {
        // Stop the accelerometer.
        accelerometer.Stop();
        statusTextBlock.Text = "accelerometer stopped.";
      }
    }
    
    

실제 Windows Phone 단말기가 있으면 간단히 응용프로그램을 빌드하고, 단말기에 배포한 후 단말기를 이리저리 움직여 가속도계 데이터 변화를 관찰할 수 있습니다. Windows Phone 에뮬레이터를 사용 중인 경우 응용프로그램을 테스트하려면 가속도계 에뮬레이터 도구가 필요합니다.

가속도계 에뮬레이터를 사용하려면

  1. Visual Studio 의 표준 도구 모음에 있는 Windows Phone 프로젝트에 대한 대상 선택에서 Windows Phone 에뮬레이터를 선택합니다.

  2. F5 키를 누르거나 디버그 메뉴에서 디버깅 시작을 클릭합니다.

  3. 에뮬레이터가 시작하고 가속도계 응용프로그램이 로드하기를 기다립니다.

  4. 에뮬레이터 도구 모음에서 오른쪽을 가리키는 2개의 화살표 모양 아이콘이 있는 추가 도구 버튼을 클릭합니다.

  5. 추가 도구 창에서 가속도계 탭을 선택합니다.

  6. 기본 에뮬레이터 창에서 만든 가속도계 응용프로그램의 시작 버튼을 클릭합니다.

  7. 추가 도구 창 주위의 분홍색 점을 이동하여 가상 휴대폰의 방향을 변경하고 기본 에뮬레이터 창에서 변화하는 데이터를 관찰합니다.

표시:
© 2014 Microsoft