아두이노 Arduino

MPU6050 가속도 센서, 자이로 센서로 측정값 읽어 보기

끄적끄적아무거나 2021. 3. 12. 18:50
반응형

MPU-6050 센서란?


 

그림1

MPU-6050는 그림1과 같다. 모듈로 되어 있는 PCB 인데 내부에는 MEMS 가속도센서(Accelerometer)와 MEMS 자이로센서(gyro)를 포함하고 있다.

 

그림처럼 SCL, SDA 통신라인을 이용하는 I2C 통신을 사용한다. 

 

내부에 16비트 ADC 장치를 가지고 있어서 정밀한 결과를 출력해준다. 

 

참고로 나는 MPU-6050을 네이버 쇼핑에서 구입했는데 약 3천원 정도 했다. 

 

MPU6050에는 1024바이트 FIFO 버퍼가 있는데 만일 센서 값을 읽어서 버퍼에 저장하면 Arduino에 Interrupt 신호를 보내고 아두이노는 이 신호를 통해 버퍼에 데이터가 있음을 알고 읽어 온다. 

 

SCL, SDL 라인을 사용하면 MPU6050은 자동으로 I2C에서 Slave 역할을 한다. 내부에 자체 I2C 컨트롤러가 있어서 XDA, XCL 핀을 사용해서 다른 센서와 I2C 통신을 하여 마스터 역할을 할 수 있다. 그리고 받은 값은 다른 장치(아두이노)에 보낼 수 있다.

 

 

MPU-6050 간단한 예제 실행


 

그림2
그림3

 

그림2는 실제 연결한 사진이고 그림3은 fritzing 툴을 사용하여 간단하게 그린 화면이다.

 

I2C 통신을 사용하기 위해 아두이노 핀맵에서 통신 가능한 핀맵을 확인하여야 한다. Arduino uno(우노) 같은 경우 2개의 I2C 통신라인을 가지고 있다. A4(SDA), A5(SCL)이 기본 I2C 이다. 다른 핀을 사용하고 싶으면 pin map 을 검색해서 찾아보길 바란다. 

 

그리고 2번 핀에는 MPU6050의 Interrupt 핀을 연결 했다. 앞서 Interrupt를 FIFO에서 읽기 위해 사용한다고 언급하였다. 

 

나머지는 전원 연결 이다. 

 

코드>>

// 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(9600);
}
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);
}

 

결과화면>>

 

주석>>

setup에서 아두이노와 MPU6050과 I2C 통신을 시작한다. 그리고 컴퓨터와 Serial 통신을 시작한다. 속도는 9600bps이므로 속도를 여기에 맞추자.

 

loop에서는 MPU6050에서의 값을 레지스터에서 읽어오는데 읽은 값은 가속도센서와 온도와 GYRO 값이다. 우선 온도는 쉽게 알수 있어서 확인해 보았는데 지금 10도인데 결과에는 40도쯤 나와 있다.....뭔가 이상하다.... 나도 공부중이라 잘 모르는 부분이 많다 ㅠ 혹시 아시는 분 계시면 댓글 부탁~!!!

 

우선은 간단 예제는 여기서 정리하고 자세한 내용은 다른 코드도 확인하여 디버깅 후에 업데이트 하겠다.

 

해당 코드는 아래 링크에서 가져왔으니 필요한 사람은 참조하길 바란다. 쉬운 예제 이 외에도 여러 코드가 있다.

 

 

 

원문 link>>

playground.arduino.cc/Main/MPU-6050/#short

 

Arduino Playground - MPU-6050

MPU-6050 Accelerometer + Gyro Navigation Introduction The InvenSense MPU-6050 sensor contains a MEMS accelerometer and a MEMS gyro in a single chip. It is very accurate, as it contains 16-bits analog to digital conversion hardware for each channel. Therefo

playground.arduino.cc

 

반응형