MPU 6050 가속도/회전 센서 알아보기 (I)

Technorati Tags: ,

image

MPU6050은 물체의 자세 또는 속도와 같은 모션을 감지하기 위한 6축센서입니다.

이 센서에서 나오는 정보는 아래 그림과 같이 XYZ 축 방향의 가속도 정보 3개와 XYZ 축 회전방향의 각속도정보 3개가 제공됩니다.

image_thumb1

저는 MPU6050을 사용하기 위해서 중국 알리를 통하여 GY-86이라는 IMU 보드를 주문하였습니다. Aliexpress(알리익스프레스)에서 약 14$ 정도에 구입가능하며 국내에서 구입하실 분은 IC Factory에서 약 2만3천원 정도에 구매가 가능합니다. 저는 딱히 급할 것이 없어서 알리를 통해 주문하였는데 배송은 약 20일 정도 걸렸습니다.

image

모양과 크기는 위와 같습니다. GY-86은 10 DOF 센서로서 MPU6050(6DOF 자이로 센서) + HMC5883( 3DOF 지자계 센서) + MS5611 (1 DOF 기압센서)로 구성이 되어 있습니다.  하지만 이밖에도 온도 보정을 위해 MPU6050과 MS5611로 부터 각 1개씩 온도값을 얻을 수 있습니다.  MPU6050에 대한 포스팅이므로 GY-86에 대해서는 여기까지만 다루겠습니다.

아두이노와 연결하는 방법을 알아보겠습니다. (Uno를 예로 설명하겠습니다.)

MPU6050은 I2C를 통하여 아두이노와 통신을 합니다.

Arduino Uno MPU6050
+5V VCC
GND GND
A5(SCL) SCL
A4(SDA) SDA

 

■ 아두이노에서 값을 읽어 오는 방법을 알아보겠습니다.

값을 읽어 오는 방법은 2가지가 있는데 첫째는 직접 레지스트리 주소로 부터 읽어 오는 방법과 두번째로는 MPU6050 라이브러리를 활용하는 방법입니다.

아래는 아두이노에서 MPU6050의 값을 불러오는 간단한 코드입니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include "MPU6050.h"
#include "Wire.h"
 
MPU6050 accelgyro;
 
int16_t ax, ay, az;
int16_t gx, gy, gz;
 
 
void setup() {
 
 
    Wire.begin();
    Serial.begin(38400);
 
    // initialize device
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
 
    // verify connection
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
 
}
 
void loop() {
 
    accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);
 
        Serial.print("a/g:\t");
        Serial.print(ax); Serial.print("\t");
        Serial.print(ay); Serial.print("\t");
        Serial.print(az); Serial.print("\t");
        Serial.print(gx); Serial.print("\t");
        Serial.print(gy); Serial.print("\t");
        Serial.println(gz);
 
 
}
cs

아두이노 IDE를 이용하여 코드를 업로드 한후 시리얼 모니터를 통하여 MPU6050에서 보내는 3개의 가속도 값과 3개의 각속도값이 들어 오는 것을 볼 수 있습니다.

image

위 그림에서와 같이 나열된 정수는 MPU6050내부의 ADC로 얻은 값을 그대로 보여준 것일 뿐 중력가속도와 같이 어떠한 물리적인 의미를 가지 않습니다.  따라서 이러한 값을 물리적으로 의미있는 값이 될 수 있도록 몇가지 절차를 거쳐야 합니다.

순서대로 나열하면,

1. 센서가 가지고 있는 옵셋 값을 적용하여 ADC 값을 Calibration(보정) 해 주어야 합니다.

2. 물리적으로 의미가 있는 단위계가 될 수 있도록 환산해 줍니다. ADC에서 나오는 정수를 m/s등의 물리량이 될 수 있도록 환산해 주는 것입니다.

3. 주변 온도에 의해 센서가 받는 영향을 보상해 줍니다.

4. 상보필터, 칼만필터, 저역통과필터(LPF)등의 방법을 이용하여 안정적인 출력값을 얻습니다.

이번 포스트 에서는 여기 까지 다루는 것으로 하고 다음 포스트에 이어서 진행 하겠습니다.

Oldest