본문 바로가기
아두이노 센서

[센서/가속도,자이로 센서] MPU-6050으로 만나는 각종 위치 및 움직임 관련 정보 센싱

by 작동미학 2015. 6. 17.
반응형

MPU6050 혹은 MPU-6050으로 불리는 3축 가속도, 자이로 센서를 탑재한 모듈을 통해 움직임을 측정할 수 있다.

 

▶ 이 가이드를 따라하면

- MPU-6050칩을 사용한 모듈에서 가속도 센서(Accelerometer) 및 자이로 센서(Gyro sensor) 값을 얻을 수 있다.

 

▶ 먼저 읽으면 좋은 글

- Arduino 일반 : http://bbangpan.tistory.com/1

 

▶ 부품 설명 및 회로 구성

Aliexpress에서 파는 GY-86, GY-521, GY-273 시리즈 등은 MPU-6050칩 등을 기반으로 다양한 위치, 자세 등을 측정할 수 있다. 즉 운동에 대한 제어를 할 수 있다. 여기서 사용할 GY-521의 경우에는 MPU-6050칩을 탑재하고 있고, 3축 가속도 센서와 자이로 센서를 지원한다(그리고 자이로 센서 값 보정을 위한 온도를 추가로 제공한다. 세밀한 제어를 위해서는 온도에 따른 보정이 필요하다고 한다). 각각 모듈을 자유도에 따라 6 DOF(Degree of Freedom/자유도, 3축 가속도센서+3축 자이로센서), 10 DOF(GY-86) 등으로 분류하는데, 각각 나침반 센서, 기압 센서 등을 조합하여 부착하고 있다. 가격은 MPU-6050의 경우는 3$전후이고, 10 DOF GY-86의 경우에는 20$까지 상승한다. 참조로 HMC5883L(GY-263에 탑재)칩은 나침반 센서를, MS5611칩은 기압을 측정할 수 있다.

<MPU-6050칩을 장착한 GY-521. 가운데 까만 칩이 MPU-6050이다. 모듈은 100원 동전 크기>

<좌측부터 GY-273, MPU-6050, GY-521(=MPU-6050), GY-88/Aliexpress구매>

MPU-6050의 경우는 3V~5V로 작동하며, 일반적으로 필요한 범위의 자이로(축이 기울어짐에 대한 속도, 초당 250~2000도) 센서와 가속도(3축 방향으로의 진행하는 가속도의 정도, 16g까지)값을 갖는다. 자세한 설명은 http://mechaworld.tistory.com/11 를 참조하면 좋다(전문적인 자세 보정을 위해서는 각 센서를 상호 보완하는, 10 DOF센서가 사용된다고 한다). 여기서는 별도 라이브러리 없이 I2C통신만으로 해당 값을 출력해보자. 연결은 VCC->5V, GND->GND, SCL->SCL, SDA->SDA로 연결하였다. 나머지 핀은 연결하지 않아도 무방하다.

<Arduino UNO와 GY-521(MPU-6050기반 모듈)을 연결>

사실 이러한 값을 얻어오는 것보다도, 실제 이 센서값을 해독하여 응용하는 것은 고급 기술에 속한다. 센서를 조합하여 정확한 위치를 구하고 잡음을 제거하는 등 다양한 노력이 필요한데, 이는 MPU-6050, 칼만필터 등의 키워드로 검색하여 추가로 확인하기를 추천한다.


▶ 소스 코드 입력 및 구동

Arduino Sketch 1.7.4버전에 Arduino UNO상에서 확인하였다. 아래 소스는 http://playground.arduino.cc/Main/MPU-6050 에서 발췌하였다. 컴파일하여 구동하면, 가속도값, 자이로센서값, 온도값 등을 구할 수 있다.

 

// MPU-6050 Short Example Sketch

// By Arduino User JohnChi

// August 17, 2014

// Public Domain

#include<Wire.h>

const int MPU=0x68; // I2C address of the MPU-6050

int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;

void setup(){

Wire.begin();

Wire.beginTransmission(MPU);

Wire.write(0x6B); // PWR_MGMT_1 register

Wire.write(0); // set to zero (wakes up the MPU-6050)

Wire.endTransmission(true);

Serial.begin(9600);

}

void loop(){

Wire.beginTransmission(MPU);

Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)

Wire.endTransmission(false);

Wire.requestFrom(MPU,14,true); // request a total of 14 registers

AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)

AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)

AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)

Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)

GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)

GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)

GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)

Serial.print("AcX = "); Serial.print(AcX);

Serial.print(" | AcY = "); Serial.print(AcY);

Serial.print(" | AcZ = "); Serial.print(AcZ);

Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //equation for temperature in degrees C from datasheet

Serial.print(" | GyX = "); Serial.print(GyX);

Serial.print(" | GyY = "); Serial.print(GyY);

Serial.print(" | GyZ = "); Serial.println(GyZ);

delay(333);

}

 

시리얼 모니터를 통해, 센서를 움직이며 값 변화를 보자. MPU-6050칩을 X,Y,Z방향으로 회전 및 가속해보자.아래 변화값을 확인할 수 있다.

<AcX~Z, Tmp, GyX~Z가 각각 가속도/온도/자이로 센서 값>

▶ 구매 가이드

MPU-6050모듈: http://www.aliexpress.com/wholesale?catId=0&initiative_id=SB_20150615063739&SearchText=MPU6050 ($3)

 

강의 키워드

Arduino UNO, 아두이노 우노, Gyro sensor, Accelerometer, 자이로 센서, 가속도 센서, MPU-6050, MPU6050, GY-521

반응형