[라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 3.4 관성센서(MPU6050) 예제

메카 2017-11-20 (월) 23:09 8개월전 659  


 

라즈베리파이 강좌

  안드로이드 씽스(Android Things) 시작하기 - 3.4 관성센서(MPU6050) 예제






  안녕하세요. 메카솔루션 알도입니다.

  오늘은 6축 관성센서 MPU6050 사용법에 대해서 알아보겠습니다. MPU6050은 6축 관성센서로서 가속도 센서 3축, 각속도 센서 3축 그리고 온도에 따른 센서 특성 변화를 보정하기 위해 온도센서가 하나 들어있습니다. 관성 센서의 가장 흔한 예는 스마트 폰입니다. 화면 회전 기능을 활성화시키면, 스마트 폰을 가로로 기울였을 때 화면도 가로로 바꿀 수 있습니다. 게임을 할 때 스마트 폰의 기울기로 컨트롤을 하는 때도 많습니다. 이런 스마트폰의 기울기를 측정할 때 사용하는 것이 관성센서입니다. 본래 관성센서는 스마트폰이 등장하기 이전부터 차량이나 항공기, 선박 등을 포함한 모든 모바일 시스템에서 사용됩니다. 스마트 폰의 경우처럼 모바일 시스템은 지상에 고정되어 있지 않기 때문에, 자신의 현재 자세나 운동 상태를 알기 어려운데, 관성센서를 이용하면 이를 해결할 수 있습니다.



  본래 관성센서는 스마트폰이 등장하기 이전부터 차량이나 항공, 우주, 선박 등을 포함한 모든 모바일 시스템에서 사용됩니다. 스마트 폰의 경우처럼 모바일 시스템은 지상에 고정되어 있지 않기 때문에, 자신의 현재 자세나 운동 상태를 알기 어려운데, 관성센서를 이용하면 이를 해결할 수 있습니다.


 


 

     MPU6050 6축 관성센서 예제


 준비물

  이번 강좌를 위해서는 다음과 같은 준비물들이 필요합니다.


    - 라즈베리파이 3

    - Micro USB 전원

    - 모니터(필수는 아닙니다.)

    - 다음 셋 중 하나는 반드시 필요합니다.

시리얼 컨버터

공유기 + 랜선

랜카드(이더넷 포트) + 랜선


 

 

 

 

 GY-521 MPU6050 모듈

 M-F(수-암) 점퍼

 


  안드로이스 씽스를 준비하는 방법은 아래 포스트를 참고하세요.


    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 1.1 시리얼로 초기화하기

    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 1.2 공유기를 통해 초기화하기

    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 1.3 직접 연결하여 초기화하기


  초기 연결과 프로젝트 생성/업로드 부분은 아래를 참고하세요.


    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 2. Hello World


  지난 포스트인 LED를 주기적으로 켜고 끄기는 아래를 참고하세요.


    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 3.1 LED & 버튼 예제

    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 3.2 LED & 버튼 예제

    [라즈베리파이 강좌] 안드로이드 씽스(Android Things) 시작하기 - 3.3 서보모터 예제


 

 회로 연결하기


  MPU6050은 관성센서 칩의 이름이고 일반적으로 보호회로, LED 등과 함께 PCB기판 위에 올린 GY521 모듈을 사용하는데, 통상적으로 GY621보다는 MPU6050으로 통칭해서 부릅니다.

 


  아래와 같이 라즈베리파이와 MPU6050을 연결합니다. 


  라즈베리파이의 GPIO2/SDA1은 MPU6050의 SDA에 연결되고, GPIO3/SCL1은 MPU6050의 SCL에 연결됩니다. 



 코드 작성하기

  완성된 프로젝트는 깃허브에서 다운로드 받을 수 있습니다.


    https://github.com/mechasolution/mpu6050test


  MPU6050의 I2C 주소는 0x68입니다만, 데이터 시트에서 찾기도 쉽지 않고, 주소를 알더라도 장치의 정상 작동 여부를 확인할 필요가 있기 때문에 아래 링크의 i2c-address-scanner를 사용하면 연결되 i2c 장치와 그 주소를 확인할 수 있습니다.


    https://github.com/dennisg/i2c-address-scanner


  우측의 녹색 Clone or download 버튼을 누른 후 Download Zip을 누르시거나 아래 링크로 다운로드를 받으시면 됩니다.


    https://github.com/dennisg/i2c-address-scanner/archive/master.zip


  다운로드 받으시고 압축을 해제하신 후에 안드로이드 스튜디오에서 [Menu]-[File]-[Open]을 누릅니다. 압축을 해제한 폴더로 찾아가서 OK를 누르면 프로젝트가 열립니다. MPU6050이 연결된 상태에서 업로드를 하시면 Android Monitor에서 다음과 같은 결과를 확인할 수 있습니다.


 

 그래들 설정
  아래 쪽 dependencies에 다음 내용을 아래 그림과 같이 추가해줍니다. GPIO는 기존의 안드로이드에 포함되어 있는 내용이 아니기 때문에 Things Support Library를 추가해줘야 합니다. MPU6050은 기존에 제공되는 라이브러리가 없어, 메카솔루션에서 개발해서 배포 중입니다. 아래 링크로 가시면 배포 중인 라이브러리에 대한 정보를 얻을 수 있습니다.


dependencies {
    ...
     provided 'com.google.android.things:androidthings:0.5.1-devpreview'
     compile 'com.mechasolution:mpu6050:0.1'
}
 


 매니페스트 설정
  아래와 같이 <application .... >이 끝나는 부분에 아래 코드를 입력합니다.

<application>
     <uses-library android:name="com.google.android.things"/>

     ...
</application>
 


  주기적으로 MPU6050의 값을 읽어오기 위해 mpu6050과 쓰레드 클래스 객체를 선언해줍니다. While문 내부는 후에 채우도록 하겠습니다.

Private mpu6050 mMpu6050 = new mpu6050();
Thread mThread = new Thread() {
    public void run() {
        while (true) {
            // put your main code here, to run repeatedly:
        }
    }
};
 


  초기화를 하려면 먼저 생성된 mMpu객체의 함수 Open()을 하면 됩니다. Open 후에 주기적으로 값을 읽어올 수 있도록 Thread를 시작합니다.

try {
    mMpu.open();
} catch (IOException e) {  e.printStackTrace(); }
mThread.start();


 
  이제 쓰레드 함수 내에서 센서 값을 읽어보도록 하겠습니다. 센서 값은 mpu6050 클래스의 getAccelX(), getAccelY(), getAccelZ(), getGyroX(), getGyroY(), getGyroZ() 그리고 getTemp()를 통해 가져올 수 있습니다. 아래와 같이 쓰레드 함수 내부를 작성해 줍니다.

Thread mThread = new Thread() {
    public void run() {
          while (true) {
               // put your main code here, to run repeatedly:
          try {
               Log.i("Acel", String.format(
                    "%f \t %f \t %f",
                    mMpu.getAccelX(), mMpu.getAccelY(), mMpu.getAccelZ()));
               Log.i("Gyro", String.format(
                    "%f \t %f \t %f",
                    mMpu.getGyroX(), mMpu.getGyroY(), mMpu.getGyroZ()));
               Log.i("Temp", String.format("%f", mMpu.getTemp()));
          } catch (IOException e) {  e.printStackTrace();  }

          try {
               Thread.sleep(1000);
          } catch (InterruptedException e) {  e.printStackTrace();  }
     }
}
};

 

모바일 버전으로 보기