Подключаем акселерометр / гироскоп MPU-6050 (GY-521) к ARDUINO и серво двигателям (стабилизатор для камеры)

Немного информации по проекту : 

Датчик  MPU-6050 содержит в себе интегрированный 3х-осевой акселерометр и построен на базе MEMS  3х-осевом MEMS-гироскопе. С помощью гироскопа мы можем измерить угловое ускорение тела на собственной оси, а с помощью акселерометра мы можем измерить ускорение тела вдоль одного направления. Он очень точен, поскольку он имеет 16-разрядный AD (от аналого-цифрового) преобразователя для каждого канала. Поэтому он захватывает оси  x, y и z одновременно. Датчик имеет стандартный протокол связи I²C, поэтому его легко подключить к ардуино .


Датчик MPU-6050 даже не стоит дорого, возможно, он самый дешевый на рынке, особенно учитывая тот факт, что он сочетает в себе акселерометр и гироскоп.

Я отобрал самые дешевые варианты на алиэкспресс :

Купить  MPU-6050   http://ali.pub/26g64n 

Для удобства ардуино уно http://ali.pub/26g69b  

Сервоприводы SG 90  http://ali.pub/26g6ek  

(Я рекомендую использовать более с мет. шестернями )

  VG996R     http://ali.pub/26g6jf 

Комплект из 4 штук - дешевле http://ali.pub/26g6mc 



Схематика и характеристики датчика гироскопа :

mpu6050-assi

Вот некоторые особенности датчика MPU-6050:

Чип со встроенным 16-разрядным АЦП-преобразователем

Диапазон измерения гироскопа: ± 250, 500, 1000 и 2000 ° / с

Диапазон измерения акселерометра: +2, +4, +8, +16 г

Интерфейс: I²C

Питание: от 3 до 5 В

Вы можете найти спецификацию MPU-6050 ЗДЕСЬ.


Для моих тестов я купил модуль GY-521 - плату с обвесом . Ниже приведена схема подключения модуля GY-521 для тех, кто хочет разобраться :

GY-521


Рассмотрим подробнее работу датчика с платой Ардуино :

           

Ардуино , гироскоп и 2 серво привода :      Prog_GY-521_Servo_Schema

GY-521Arduino Uno
VCC3.3V
GNSGND
SCLA5
SDAA4

Подключение на схеме и на макетке для лучшего визуального восприятия :


Prog_GY-521_Servo_BreadBoard


Как видно из электрической схемы, я приводил в действие два серводвигателя с внешним источником питания 5 В (это связано с тем, что  сервомоторы вместе потребляют более 500 мА (500 мА = максимальный ток, поставляемый USB-портом версии 2.0 )). Теперь перейдем к коду, чтобы загрузить в  Arduino.


// MPU6050 & Servo

// byDenisGeek


#include <SPI.h>

#include <Wire.h>

#include <Servo.h>

#define MPU 0x68  // I2C address of the MPU-6050


Servo ServoX, ServoY;

double AcX,AcY,AcZ;

int Pitch, Roll;


void setup(){

  Serial.begin(9600);

  ServoX.attach(8);

  ServoY.attach(9);

  init_MPU(); // Inizializzazione MPU6050

}

 

void loop()

{

  FunctionsMPU(); // Acquisisco assi AcX, AcY, AcZ.

    

  Roll = FunctionsPitchRoll(AcX, AcY, AcZ);   //Calcolo angolo Roll

  Pitch = FunctionsPitchRoll(AcY, AcX, AcZ);  //Calcolo angolo Pitch


  int ServoRoll = map(Roll, -90, 90, 0, 179);

  int ServoPitch = map(Pitch, -90, 90, 179, 0);


  ServoX.write(ServoRoll);

  ServoY.write(ServoPitch);



  Serial.print("Pitch: "); Serial.print(Pitch);

  Serial.print("\t");

  Serial.print("Roll: "); Serial.print(Roll);

  Serial.print("\n");


}


void init_MPU(){

  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);

  delay(1000);

}


//Funzione per il calcolo degli angoli Pitch e Roll

double FunctionsPitchRoll(double A, double B, double C){

  double DatoA, DatoB, Value;

  DatoA = A;

  DatoB = (B*B) + (C*C);

  DatoB = sqrt(DatoB);

  

  Value = atan2(DatoA, DatoB);

  Value = Value * 180/3.14;

  

  return (int)Value;

}


//Funzione per l'acquisizione degli assi X,Y,Z del MPU6050

void FunctionsMPU(){

  Wire.beginTransmission(MPU);

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

  Wire.endTransmission(false);

  Wire.requestFrom(MPU,6,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();  // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)

}






Я надеюсь этот материал вам был полезен , так же с вопросами и предложениями можно ко мне в группу : 

Подписывайся на Geek каналы :

➤ VK - https://vk.com/denis_geek

➤ VK - https://vk.com/club_arduino

➤ VK - https://vk.com/chinagreat

➤ VK - https://vk.com/solar_pover

➤ VK - https://vk.com/my_vedroid

➤ VK - https://vk.com/3dprintsumy

➤ Youtube - http://www.youtube.com/c/Danterayne



★ Моя партнёрка с Aliexpress ★

http://ali.pub/1j9ks1 

★ Получай 10.5% скидку с любой покупки на Aliexpress! ★

http://ali.pub/1lx67o

★ Полезное браузерное приложение для кэшбэка  ★

http://ali.pub/1lx637

  • Подключаем акселерометр / гироскоп MPU-6050 (GY-521) к ARDUINO  и  серво двигателям (стабилизатор для камеры)

Теги: Подключаем акселерометр, гироскоп, MPU-6050, (GY-521), ARDUINO, примитивный стабилизатор для камеры на Arduino, уроки по ардуино, сделай сам, денис