Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 – Описания, примеры, подключение к Arduino

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino Самолеты

Урок 12. управление сервоприводами с помощью гироскопа mpu6050 gy-521 – описания, примеры, подключение к arduino

Гироскоп может быть очень полезен в ваших проектах. Например, его можно использовать как устройство для управления вашими роботами. Сейчас мы рассмотрим один из простых примеров, который Вы с легкостью сможете адаптировать для своих задач.

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

В этом примере мы научимся управлять двумя серво приводами с помощью акселерометра, когда мы будем отклонять акселерометр Gy-521 (MPU6050) по координате X и Y сервоприводы будут поворачиваться на отклоненный угол.

В данном уроке нам понадобится:

Для реализации проекта нам необходимо установить библиотеки:

Сборка:

1) Подключаем Акселерометр Gy-521

Gy-521 (mpu6050)Arduino (Uno)
VCC 3.3 V
GNDGND
SCLA5
SDAA4

Для питания модуля необходимо использовать строго 3.3V! Для этого можно использовать преобразователь напряжения на 3.3V.

2) Сервоприводы подключаем следующим образом:

Arduino (uno)Servo 1Servo 2
5VКрасный (Центральный)Красный (Центральный)
GNDЧерный или Коричневый (Левый)Черный или Коричневый (Левый)
Pin8 – для servo 1
Pin9 – для servo 2
Белый или Оранжевый (Правый)Белый или Оранжевый (Правый)

Сервопривод рекомендуется питать от внешнего источника питания, если запитать сервопривод от ардуины, то могут возникнуть помехи и перебои в работе arduino. Организовать это можно с помощью источника питания 9V и комбинированного стабилизатора 5V ,3.3V.

Теперь, когда все подключено, приступим к загрузке скетча.

Скетч:

#include <Wire.h>
#include "Kalman.h"
#include <Servo.h> 
Servo myservoX; 
Servo myservoY; 
Kalman kalmanX;
Kalman kalmanY;
uint8_t IMUAddress = 0x68;
/* IMU Data */
int16_t accX;
int16_t accY;
int16_t accZ;
int16_t tempRaw;
int16_t gyroX;
int16_t gyroY;
int16_t gyroZ;
double accXangle; // Angle calculate using the accelerometer
double accYangle;
double temp;
double gyroXangle = 180; // Angle calculate using the gyro
double gyroYangle = 180;
double compAngleX = 180; // Calculate the angle using a Kalman filter
double compAngleY = 180;
double kalAngleX; // Calculate the angle using a Kalman filter
double kalAngleY;
uint32_t timer;
void setup() {
  Wire.begin();
  Serial.begin(9600);
myservoX.attach(8);  
myservoY.attach(9);
  i2cWrite(0x6B,0x00); // Disable sleep mode      
  kalmanX.setAngle(180); // Set starting angle
  kalmanY.setAngle(180);
  timer = micros();
}
void loop() {
  /* Update all the values */
  uint8_t* data = i2cRead(0x3B,14);
  accX = ((data[0] << 8) | data[1]);
  accY = ((data[2] << 8) | data[3]);
  accZ = ((data[4] << 8) | data[5]);
  tempRaw = ((data[6] << 8) | data[7]);
  gyroX = ((data[8] << 8) | data[9]);
  gyroY = ((data[10] << 8) | data[11]);
  gyroZ = ((data[12] << 8) | data[13]);
  /* Calculate the angls based on the different sensors and algorithm */
  accYangle = (atan2(accX,accZ) PI)*RAD_TO_DEG;
  accXangle = (atan2(accY,accZ) PI)*RAD_TO_DEG;  
  double gyroXrate = (double)gyroX/131.0;
  double gyroYrate = -((double)gyroY/131.0);
  gyroXangle  = kalmanX.getRate()*((double)(micros()-timer)/1000000); // Calculate gyro angle using the unbiased rate
  gyroYangle  = kalmanY.getRate()*((double)(micros()-timer)/1000000);
  kalAngleX = kalmanX.getAngle(accXangle, gyroXrate, (double)(micros()-timer)/1000000); // Calculate the angle using a Kalman filter
  kalAngleY = kalmanY.getAngle(accYangle, gyroYrate, (double)(micros()-timer)/1000000);
  timer = micros();
Serial.println();
    Serial.print("X:");
    Serial.print(kalAngleX,0);
    Serial.print(" ");
    Serial.print("Y:");
    Serial.print(kalAngleY,0);
    Serial.println(" ");
 myservoX.write((int)kalAngleX-90);
 myservoY.write((int)kalAngleY-90);
  // The accelerometer's maximum samples rate is 1kHz
}
void i2cWrite(uint8_t registerAddress, uint8_t data){
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.write(data);
  Wire.endTransmission(); // Send stop
}
uint8_t* i2cRead(uint8_t registerAddress, uint8_t nbytes) {
  uint8_t data[nbytes];
  Wire.beginTransmission(IMUAddress);
  Wire.write(registerAddress);
  Wire.endTransmission(false); // Don't release the bus
  Wire.requestFrom(IMUAddress, nbytes); // Send a repeated start and then release the bus after reading
  for(uint8_t i = 0; i < nbytes; i  )
    data [i]= Wire.read();
  return data;
}

Скачать скетч можно по этой ссылке

Видео:

Макетная плата, предназначенная для прототипирования

Отладка – неотъемлемая часть построения электронных схем. Макетная плата незаменима для конструкции электронной аппаратуры. Ранее в изобретательстве использовали традиционные макетные платы, но сейчас широко распространены макетные платы, которые удобны тем, что не требуют дополнительных спаек.

Таким образом, процесс сборки и отладки электронной схемы в разы ускоряется: не приходится часто использовать паяльник, чтобы поменять сломанные радиодетали.

Материал для изготовления беспаечных макетных плат – пластик. Кроме того, все контакты надежно скреплены к плате, поэтому частые переключения не испортят элемент.

Микроконтроллер arduino uno r3

МК создан с использованием материалов контроллера ATmega328:

  1. цифровые входы и выходы в количестве 14 штук, причем половина приходится на ШИМ-выходы;
  2. аналогичные входы, количество – 6 штук;
  3. резонатор на основе кварца, мощностью 16 МГц;
  4. встроен usb-вход;
  5. контакт для подключения питания;
  6. на МК располагается кнопка, с помощью которой возможен сброс данных и кода;
  7. контакт для программирования данных, находящихся внутри схемы, именуемый ICSP.
Смотрите про коптеры:  Syma X5UW инструкция на русском - страница 12

Старт работы начинается с подачи электрического питания в плату. Пользователь подключает к плате со схемой блок питания или зарядное устройство. Также процедура осуществляется с помощью usb-кабеля, который подключен к компьютеру и микроконтроллеру. Для разработки программы понадобится бесплатная среда программирования – Arduino IDE.

Внимание! Пользователь разрабатывает приложения с использованием Ардуино, только если платы совместимы с архитектурой микроконтроллера. В противном случае программа не заработает.

Пользователь создает в бесплатной среде код, затем его компилирует и загружает проработанную программу в пространство памяти в Ардуино. Язык, на котором программируется код, Wiring максимально приближен к популярному среди программистов языку – C . Кроме того МК поддерживает версии для осей Виндовс, Мак ОС и Линукс.

Модуль датчика для гироскопа акселерометра на аrduino с 3 осями – gy-521 (mpu-6050)

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

Модуль датчика помогает определять место и перемещение инструмента в пространстве. Измеряются дифферент и углы крена посредством вектора силы тяжести и скорости в процессе вращения. Также включена функция измерения температурного режима. Перемещение определяется линейным ускорением и угловой скоростью. Полная картина рисуется по 3 осям.

Компонент нередко сравнивают с человеческим вестибулярным аппаратом, который помогает людям чувствовать силу тяготения и удерживать равновесие.

Подключаем акселерометр / гироскоп 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 

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

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

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

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

           Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

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

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

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

Prog_GY-521_Servo_BreadBoard

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

Как видно из электрической схемы, я приводил в действие два серводвигателя с внешним источником питания 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)

}

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

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

Подписывайся на 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

Подключение гироскопа mpu6050 к arduino: схема и программа

#include<LiquidCrystal.h> // библиотека для работы с ЖК дсиплеем

LiquidCrystallcd(8,9,10,11,12,13);// номера контактов, к которым подключен ЖК дисплей

#include <Wire.h>

#include <MPU6050.h> // библиотека для работы с датчиком MPU6050 (ссылка для ее скачивания приведена в тексте статьи)

#define period 10000

MPU6050mpu;

intcount=;

charokFlag=;

bytedegree[8]={

  0b00000,

  0b00110,

  0b01111,

  0b00110,

  0b00000,

  0b00000,

  0b00000,

  0b00000

};// символ градуса

voidsetup()

{

  lcd.begin(16,2);

  lcd.createChar(,degree);

  Serial.begin(9600);// инициализируем последовательный порт для работы на скорости 9600 бод/с

  Serial.println(“Initialize MPU6050”);

  while(!mpu.begin(MPU6050_SCALE_2000DPS,MPU6050_RANGE_2G))

  {//если нет соединения с MPU6050, выдаем предупреждающие сообщения

    lcd.clear();

    lcd.print(“Device not Found”);

    Serial.println(“Could not find a valid MPU6050 sensor, check wiring!”);

    delay(500);

  }

  count=;

  mpu.calibrateGyro();// калибровка гироскопа

  mpu.setThreshold(3);

  lcd.clear();

  lcd.print(“MPU6050 Interface”);

  lcd.setCursor(,1);

  lcd.print(” Circuit Digest”);

  delay(2000);

  lcd.clear();

}

voidloop()

{

    lcd.clear();

    lcd.print(“Temperature”);

    longst=millis();

    Serial.println(“Temperature”);

    while(millis()<st period)

    {

      lcd.setCursor(,1);

      tempShow();

    }

    lcd.clear();

    lcd.print(“Gyro”);

    delay(2000);

    st=millis();

    Serial.println(“Gyro”);

    while(millis()<st period)

    {

      lcd.setCursor(,1);

      gyroShow();

    }

    lcd.clear();

    lcd.print(“Accelerometer”);

    delay(2000);

    st=millis();

    Serial.println(“Accelerometer”);

    while(millis()<st period)

    {

      lcd.setCursor(,1);

      accelShow();

    }

}

voidtempShow()//данные температуры

{

    floattemp=mpu.readTemperature();

    Serial.print(” Temp = “);

    Serial.print(temp);

    Serial.println(” *C”);

    lcd.clear();

    lcd.print(“Temperature”);

    lcd.setCursor(,1);

    lcd.print(temp);

    lcd.write((byte));

    lcd.print(“C”);

    delay(400);

}

voidgyroShow()//данные гироскопа

{

  //lcd.setCursor(0,0);

  lcd.clear();

  lcd.print(” X     Y     Z”);

  VectorrawGyro=mpu.readRawGyro();

  VectornormGyro=mpu.readNormalizeGyro();

  lcd.setCursor(,1);

  lcd.print(normGyro.XAxis,1);

  lcd.setCursor(6,1);

  lcd.print(normGyro.YAxis,1);

  lcd.setCursor(12,1);

  lcd.print(normGyro.ZAxis,1);

  Serial.print(” Xnorm = “);

  Serial.print(normGyro.XAxis);

  Serial.print(” Ynorm = “);

  Serial.print(normGyro.YAxis);

  Serial.print(” Znorm = “);

  Serial.println(normGyro.ZAxis);

  delay(200);

}

voidaccelShow()// данные акселерометра

{

// lcd.setCursor(0,0);

  lcd.clear();

  lcd.print(” X     Y     Z”);

  VectorrawAccel=mpu.readRawAccel();

  VectornormAccel=mpu.readNormalizeAccel();

  lcd.setCursor(,1);

  lcd.print(normAccel.XAxis,1);

  lcd.setCursor(6,1);

Смотрите про коптеры:  Обзор роботов-манипуляторов Universal Robots / Хабр

  lcd.print(normAccel.YAxis,1);

  lcd.setCursor(12,1);

  lcd.print(normAccel.ZAxis,1);

  Serial.print(” Xnorm = “);

  Serial.print(normAccel.XAxis);

  Serial.print(” Ynorm = “);

  Serial.print(normAccel.YAxis);

  Serial.print(” Znorm = “);

  Serial.println(normAccel.ZAxis);

  delay(200);

}

Подключение к arduino

Для интерфейса

I2C

у Ардуино имеются контакты A4 (SDA) и A5 (SCL), да-а, это те, которые расположены чёрти-где (на одной плате у меня они были справа от контроллера, на другой с левого края). В коде нужно использовать библиотеку Wire, прочитать о ней можно

. Минимальная схема во Fritzing такая:

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

… а значит у нас уже не 8 лишних штырьков, а целых двенадцать!

Соединительные провода папа-папа

Обычные провода папа-папа нам подойдут, еще их называют провода-перемычки. Такие стоят недорого и продаются везде, на любом рынке или в любом онлайн-магазине для радиолюбителей.

Тестирование

Термометр тестировать проще всего: залил скетч

, открыл монитор порта, выставил скорость на 9600, —

Вследствие нагревания феном для волос, значение

Tmp =

взлетело до 80. Далее покрутили в пространстве платкой — другие показания тоже изменяются, но это не наглядно.

Данные, выводимые вторым скетчем

InvenSense MPU-6050

June 2022

WHO_AM_I: 68, error = 0

PWR_MGMT_1: 40, error = 0

MPU-6050
Read accel, temp and gyro, error = 0
accel x,y,z: 12180, 9468, -9168
temperature: 22.153 degrees Celsius
gyro x,y,z: -462, -5303, -490,

MPU-6050
Read accel, temp and gyro, error = 0
accel x,y,z: 13204, 8928, -7420
temperature: 22.482 degrees Celsius
gyro x,y,z: 282, -2022, -956,

MPU-6050
Read accel, temp and gyro, error = 0
accel x,y,z: -1276, 7932, -16232
temperature: 22.435 degrees Celsius
gyro x,y,z: -1168, 1159, 1258,

MPU-6050
Read accel, temp and gyro, error = 0
accel x,y,z: 6216, 10604, -12796
temperature: 22.576 degrees Celsius
gyro x,y,z: -2161, 4363, 2176,

Более приятный глазу пример описан

Тестовая установка

, о котором

, был пересмотрен, урезан и сокращён (кстати, на этом фото заметно отличие в качестве металлизации отверстий обозреваемой платы и дешевой платы Ардуино):

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

если отсоединить

тентакли

шлейф от креплений, то откроются два ряда контактов, у которых нужно «поотламывать половинки», — в результате получится разъем, удобно вставляющийся в отверстия макетной платы. Для пущей надёжности, нужно проклеить корпус, т.к. держаться на одних контактах конструкция не будет.

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

всё ещё может напугать, но на самом деле бояться нечего:

Урок 12. Управление сервоприводами с помощью гироскопа MPU6050 Gy-521 - Описания, примеры, подключение к Arduino

спаял с обратной стороны контакты, прозвонил их тестером — и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ткнуть «не туда» и спалить девайс… Я так спалил Orange Pi PC =)

Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Характеристики:

— 16-битный АЦП,

— напряжение питания 3-5В,

— поддержка протокола «IIC» (может, I2C ?),

— диапазон ускорений: ± 2 ± 4 ± 8 ± 16g,

— диапазон «гиро»: ± 250 500 1000 2000 ° / s,

— покрытие иммерсионным золотом вместо лужения,

— ток при работе последнего примера составил 5.3 мА и 1.2 мА когда устройство не успело стартовать (питание на модуль было подано после выполнения setup() контроллером)

Шаг 1. компоненты для подключения акселерометра к arduino

Для проекта понадобятся несколько компонентов:

Шаг 2. схема подключения акселерометра к микроконтроллеру arduino

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

GY-521 (MPU-6050)Arduino Uno
VCC3.3 V
GNDGND
SCLA5
SDAA4
  1. Присоединяем модуль датчика к микроконтроллеру.
  2. На МК Ардуино загружаем проработанный код, представленный в разделе ниже.
  3. Открываем среду разработки Arduino IDE и мониторим последовательный порт.
  4. Сверяем выводимые данные акселерометра и гироскопа.
  5. Во время поворота датчика сведения не производят изменений.

Гироскоп – инструмент, который позволяет измерить реакцию тела на перемещение углов и вообще ориентации. Акселерометр же служит измерителем проекции ускорения, которое только кажется.

Заключение

Модуль датчика – устройство, которое широко используется во многих сферах человеческой жизни. С помощью датчика приводят в норму полет квадрокоптера, потому что гироскоп и акселерометр часто применяются в совокупности.

Модуль помогает скоординировать различные электронные устройства. Например, часто прибор встраивают в детектор движения и систему ориентирования, которая встраивается в роботы для управления. Другие подобные устройства с поддержанием сенсорной функции пользуются успехом в иных областях.

Оцените статью
Радиокоптер.ру
Добавить комментарий

Adblock
detector