MPU-6050 자이로 가속도 센서
스펙
동작 전압 : 3~5V
통신 방식 : I2C
가속도 측정 범위 : +/- 250 500 1000 2000 (degree/sec)
자이로 측정 범위 : +/- 2g, +/- 4g, +/- 8g, +/- 16g
갱신 주기 : 4 ~ 8000 Hz
가속도 센서 기본 원리
MPU-6050은 3축의 가속도를 측정할수 있으며 지구의 중력가속도를 기준으로 얼마만큼 힘을 받는지 측정하는 센서입니다
아래의 참고 그림같이 X, Y, Z 축으로 구분하여 각 축의 중력가속도의 크기를 측정하여 어느 방향으로 회전된 상태인지 계산 할수 있게 됩니다
일반적으로 스마트폰의 가로 세로 모드의 자동 전환에 가속도 센서가 사용됩니다
아래 자이로 센서도 사물의 각을 측정하지만 가속도 센서와 다른점은 가속도 센서는 중력 가속도를 기준으로 회전을 알수 있지만 자이로 센서는 기준점이 없다는 점이 다를수 있습니다
자이로 센서 기본 원리
시간당 회전하는 X, Y, Z의 각도(각속도)를 측정합니다 물체가 회전 운동시 발생되는 코리올리 힘을 전기적 신호로 변환하는 방식으로 계산되며 만약 수평 상태에서 1초 동안 90도가 기울어 진다면 90 degree/sec의 각속도를 갖게 됩니다 자이로 센서는 이와 같은 각속도가 측정되며 사용자는 각속도를 갖고 사물의 기울기를 산출합니다
하드웨어 연결
일반적으로 아래와 같이 각 핀에 대한 설명이 보여집니다 (그렇지 않은 경우는 제조사 정보를 참조하여 주세요)
VCC는 MCU의 5v에 GND는 MCU의 GND에
SCL과 SDA는 각각 MCU의 SDL과 SDA에 해당하는 아날로그 핀에 연결합니다 (아두이노 나노의 경우는 A4핀이 SDA이며 A5핀이 SCL핀이 됩니다)
(클릭하면 확대)
제어
기본적으로 I2C 통신방식을 취하고 있기 때문에 센서 주소(0x68)로 I2C통신을 진행하며 아래와 같은 시퀀스로 동작합니다
위 순서중 ADDRESS는 다음 Register Map에서 참조할수 있습니다
ADDRESS를 지정하여 보내면 회신으로 해당하는 데이터 값이 들어오게 됩니다
아두이노 지원 (ATmega328P)
#include<Wire.h> const int MPUADDR=0x68; // MPU6050 I2C주소 int AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ; void setup() { Serial.begin(9600); Wire.begin(); Wire.beginTransmission(MPUADDR); Wire.write(0x6B); // PWR_MGMT_1 레지스터 Wire.write(0); // Wakes Up Wire.endTransmission(true); } void loop() { Wire.beginTransmission(MPUADDR); Wire.write(0x3B); // ACCEL_XOUT_H 레지스터 Wire.endTransmission(false); Wire.requestFrom(MPUADDR,14,true);// 0x3B로부터 14byte의 데이터를 요청 // High 8비트와 Low 8비트를 합쳐 16비트 값으로 각각의 값 저장 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(""); Serial.print(AcY); Serial.print(""); Serial.print(AcZ); Serial.println(); delay(300); } |