'Small Devices/쿼드콥터'에 해당되는 글 10건

  1. 2016.12.18 MPU-6050 이용하기
반응형

MPU-6050 은 3축의 자이로와 3축의 가속도를 센싱 할 수 있다. 다음의 그림을 보면

X, Y, Z 방향으로 기울기와 가속도를 알 수 있다. 가속도 센싱은 중력 방향과의 반대 방향일 떄 + 가 되고 중력 방향과 같은 방향일떄 -가 된다. 자이로는 회전하는 방향에 따라서 +/-가 된다.  본 포스팅에서 사용할 MPU6050 모듈은 Sparkfun에서 나온 모듈이다.

그림에서 보면 X,Y,Z 에 대한 방향 및 회전 방향이 그려져 있는데, 화살표 방향이 중력 방향과 반대 방향이면 +, 중력 방향이면 -가 되며, 회전 회살표 방향으로 회전할 경우 자이로 값이 +, 그렇지 않은 경우 -가 된다.


 Arduino Pro Mini와 Sparkfun MPU6050 모듈은 다음과 같이 연결한다.


 arduino pro mini는 A4 가 SDA, A5가 SCL이 된다. Arduino 예제는 


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_addr=0x68;  // I2C address of the MPU-6050

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

void setup(){

  Wire.begin();

  Wire.beginTransmission(MPU_addr);

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

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

  Wire.endTransmission(true);

  Serial.begin(115200);

}

void loop(){

  Wire.beginTransmission(MPU_addr);

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

  Wire.endTransmission(false);

  Wire.requestFrom(MPU_addr,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);

}


 실행 시키고 X,Y,Z 화살표 방향을 중력 방향을 중심으로 회전 시켜 보자. 자이로도 회전 방향으로 +, -로 변화하는 것을 확인 가능하다.


 MPU6050 센서를 통해서 들어오는 값은 16비트 크기를 가진다. 즉 각 값은 int16_t 의 값을 가진다. 16비트로 최대 -32768 에서 32767 의 정수 값을 표현 가능하다. 값의 의미는 데이터 Sheet를 참조해서 설명한다. (https://www.invensense.com/wp-content/uploads/2015/02/MPU-6000-Datasheet1.pdf)


[가속도 값의 의미]



MPU6050 datasheet를 보면 AFS_SEL 레지스터 값의 설정에 따라 측정되는 값이 달라짐을 알 수 있다. AFS_SEL=0일 경우 +-2g 까지 표현이 되는데 -2g는 -32768에 +2g는 +32767 에 매핑이 된다. 1g는 16384 가 되며 이는 중력 가속도와 동일한 값이다. 예를 들어 수평에서 움직이지 않고 가만히 있으면 +Z 값은 16384가 되는 것이다. +z 방향의 반대로 중력가속도만큼 가속도를 받으면 32767 이 된다.


 

[자이로 값의 의미]

자이로 센서의 값도 -32768에서 32767 값을 가질 수 있다. FS_SEL 레지스터가 =일 경우 -250 에서 +250까지 측정되며 이 값은 -32768에서 32767까지 매핑된다. 1초 동안 일정한 속도로 1도 회전하였다고 한다면 250도/s 는 32767 이므로 1도/s는 (32767/250) = 131이 된다.

반응형
Posted by alias
,