정보
요청한 주제가 아래에 표시됩니다. 그러나 이 주제는 이 라이브러리에 포함되지 않습니다.

Windows Phone 8의 가속도계 센서에서 데이터를 가져오는 방법

2014-06-18

적용 대상: Windows Phone 8 및 Windows Phone Silverlight 8.1 | Windows Phone OS 7.1

 

이 항목에서는 가속도계 데이터의 수치를 표시하고 이를 그래픽으로 표현하는 가속도계 앱을 만드는 과정을 설명합니다.

참고참고:

이 항목에서 설명한 Microsoft.Devices.Sensors 네임스페이스의 API 외에도 Windows.Devices.Sensors 네임스페이스에서 유사한 클래스를 사용하여 휴대폰의 센서를 프로그래밍할 수도 있습니다.

이 항목에는 다음 단원이 포함되어 있습니다.

 

가속도계는 특정 순간에 장치에 적용되는 힘을 측정합니다. 이러한 힘은 사용자가 장치를 움직이고 있는 방향을 판단하는 데 사용됩니다. 가속도 값은 X, Y, Z축의 가속 구성 요소를 나타내는 3차원 벡터(중력 단위)로 표시됩니다. 가속도 방향은 장치에 상대적이므로, 장치가 테이블 면에서 위를 향하고 있으면 Z축에 -1g가 적용되고 장치가 테이블 상단에 수직으로 놓여 있으면 Y축에 -1g가 적용됩니다.

가속도계 센서는 휴대폰이 이동하여 발생하는 모든 힘과 중력을 감지합니다. Motion 클래스를 사용하여 액세스된 복합 동작 API는 장치 센서를 여러 개 사용해 장치 가속도에서 중력 벡터를 분리하고 장치의 현재 자세(요, 피치, 롤)를 손쉽게 확인할 수 있습니다.

다음 단계에서는 가속도계 앱을 만드는 방법을 보여 줍니다.

가속도계 앱을 만들려면

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

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

  3. MainPage.xaml 파일에서 "ContentPanel"이라는 Grid 요소에 다음 XAML 코드를 삽입합니다. 이 코드는 가속도계의 데이터를 가져오기 시작하는 버튼과 중지하는 버튼을 하나씩 만듭니다. 또한 숫자 값을 표시하는 데 사용되는 TextBlock 요소 세 개와, 읽은 데이터를 그래픽으로 표시하는 데 사용되는 Line 요소 세 개가 만들어집니다. 마지막으로 이 코드는 앱의 현재 상태를 표시하는 데 사용되는 상태 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 코드 숨김 페이지를 열고 페이지 맨 위의 다른 using 지시문에 센서 및 XNA Framework 네임스페이스에 대한 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에 액세스할 수 없는 백그라운드 스레드에서 호출됩니다. 따라서 이 이벤트 처리기는 Dispatcher.Invoke 메서드를 사용하여 UI 스레드에 지정된 코드를 호출합니다. 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. 에뮬레이터 도구 모음에서 오른쪽을 가리키는 화살표 아이콘이 두 개 있는 응용프로그램 도구 버튼을 클릭합니다.

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

  6. 기본 에뮬레이터 창에서 만든 가속도계 앱에서 시작 버튼을 클릭합니다.

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

표시: