- Урок 12. управление сервоприводами с помощью гироскопа mpu6050 gy-521 – описания, примеры, подключение к arduino
- Макетная плата, предназначенная для прототипирования
- Микроконтроллер arduino uno r3
- Модуль датчика для гироскопа акселерометра на аrduino с 3 осями – gy-521 (mpu-6050)
- Подключаем акселерометр / гироскоп mpu-6050 (gy-521) к arduino и серво двигателям (стабилизатор для камеры)
- Подключение гироскопа mpu6050 к arduino: схема и программа
- Подключение к arduino
- Соединительные провода папа-папа
- Тестирование
- Тестовая установка
- Характеристики:
- Шаг 1. компоненты для подключения акселерометра к arduino
- Шаг 2. схема подключения акселерометра к микроконтроллеру arduino
- Заключение
Урок 12. управление сервоприводами с помощью гироскопа mpu6050 gy-521 – описания, примеры, подключение к arduino
Гироскоп может быть очень полезен в ваших проектах. Например, его можно использовать как устройство для управления вашими роботами. Сейчас мы рассмотрим один из простых примеров, который Вы с легкостью сможете адаптировать для своих задач.
В этом примере мы научимся управлять двумя серво приводами с помощью акселерометра, когда мы будем отклонять акселерометр Gy-521 (MPU6050) по координате X и Y сервоприводы будут поворачиваться на отклоненный угол.
В данном уроке нам понадобится:
Для реализации проекта нам необходимо установить библиотеки:
Сборка:
1) Подключаем Акселерометр Gy-521
Gy-521 (mpu6050) | Arduino (Uno) |
---|---|
VCC | 3.3 V |
GND | GND |
SCL | A5 |
SDA | A4 |
Для питания модуля необходимо использовать строго 3.3V! Для этого можно использовать преобразователь напряжения на 3.3V.
2) Сервоприводы подключаем следующим образом:
Arduino (uno) | Servo 1 | Servo 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:
- цифровые входы и выходы в количестве 14 штук, причем половина приходится на ШИМ-выходы;
- аналогичные входы, количество – 6 штук;
- резонатор на основе кварца, мощностью 16 МГц;
- встроен usb-вход;
- контакт для подключения питания;
- на МК располагается кнопка, с помощью которой возможен сброс данных и кода;
- контакт для программирования данных, находящихся внутри схемы, именуемый ICSP.
Старт работы начинается с подачи электрического питания в плату. Пользователь подключает к плате со схемой блок питания или зарядное устройство. Также процедура осуществляется с помощью 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
Схематика и характеристики датчика гироскопа :
Вот некоторые особенности датчика MPU-6050:
Чип со встроенным 16-разрядным АЦП-преобразователем
Диапазон измерения гироскопа: ± 250, 500, 1000 и 2000 ° / с
Диапазон измерения акселерометра: 2, 4, 8, 16 г
Интерфейс: I²C
Питание: от 3 до 5 В
Вы можете найти спецификацию MPU-6050 ЗДЕСЬ.
Для моих тестов я купил модуль GY-521 – плату с обвесом . Ниже приведена схема подключения модуля GY-521 для тех, кто хочет разобраться :
Рассмотрим подробнее работу датчика с платой Ардуино :
Ардуино , гироскоп и 2 серво привода :
GY-521 | Arduino Uno |
VCC | 3.3V |
GNS | GND |
SCL | A5 |
SDA | A4 |
Подключение на схеме и на макетке для лучшего визуального восприятия :
Как видно из электрической схемы, я приводил в действие два серводвигателя с внешним источником питания 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
Подключение гироскопа mpu6050 к arduino: схема и программа
#include<LiquidCrystal.h> // библиотека для работы с ЖК дсиплеем
LiquidCrystallcd(8,9,10,11,12,13);// номера контактов, к которым подключен ЖК дисплей
#include <Wire.h>
#include <MPU6050.h> // библиотека для работы с датчиком MPU6050 (ссылка для ее скачивания приведена в тексте статьи)
#define period 10000
MPU6050mpu;
intcount=0;
charokFlag=0;
bytedegree[8]={
0b00000,
0b00110,
0b01111,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
};// символ градуса
voidsetup()
{
lcd.begin(16,2);
lcd.createChar(0,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=0;
mpu.calibrateGyro();// калибровка гироскопа
mpu.setThreshold(3);
lcd.clear();
lcd.print(“MPU6050 Interface”);
lcd.setCursor(0,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(0,1);
tempShow();
}
lcd.clear();
lcd.print(“Gyro”);
delay(2000);
st=millis();
Serial.println(“Gyro”);
while(millis()<st period)
{
lcd.setCursor(0,1);
gyroShow();
}
lcd.clear();
lcd.print(“Accelerometer”);
delay(2000);
st=millis();
Serial.println(“Accelerometer”);
while(millis()<st period)
{
lcd.setCursor(0,1);
accelShow();
}
}
voidtempShow()//данные температуры
{
floattemp=mpu.readTemperature();
Serial.print(” Temp = “);
Serial.print(temp);
Serial.println(” *C”);
lcd.clear();
lcd.print(“Temperature”);
lcd.setCursor(0,1);
lcd.print(temp);
lcd.write((byte)0);
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(0,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(0,1);
lcd.print(normAccel.XAxis,1);
lcd.setCursor(6,1);
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 такая:
… а значит у нас уже не 8 лишних штырьков, а целых двенадцать!
Соединительные провода папа-папа
Обычные провода папа-папа нам подойдут, еще их называют провода-перемычки. Такие стоят недорого и продаются везде, на любом рынке или в любом онлайн-магазине для радиолюбителей.
Тестирование
Термометр тестировать проще всего: залил скетч
, открыл монитор порта, выставил скорость на 9600, —
Вследствие нагревания феном для волос, значение
Tmp =
взлетело до 80. Далее покрутили в пространстве платкой — другие показания тоже изменяются, но это не наглядно.
Данные, выводимые вторым скетчем
InvenSense MPU-6050
June 2023
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, -2023, -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,
Более приятный глазу пример описан
Тестовая установка
, о котором
, был пересмотрен, урезан и сокращён (кстати, на этом фото заметно отличие в качестве металлизации отверстий обозреваемой платы и дешевой платы Ардуино):
если отсоединить
тентакли
шлейф от креплений, то откроются два ряда контактов, у которых нужно «поотламывать половинки», — в результате получится разъем, удобно вставляющийся в отверстия макетной платы. Для пущей надёжности, нужно проклеить корпус, т.к. держаться на одних контактах конструкция не будет.
всё ещё может напугать, но на самом деле бояться нечего:
спаял с обратной стороны контакты, прозвонил их тестером — и можно подключать. Лично моя практика показывает, что лучше потратить пару секунд на предварительную проверку, чем ткнуть «не туда» и спалить девайс… Я так спалил 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 |
---|---|
VCC | 3.3 V |
GND | GND |
SCL | A5 |
SDA | A4 |
- Присоединяем модуль датчика к микроконтроллеру.
- На МК Ардуино загружаем проработанный код, представленный в разделе ниже.
- Открываем среду разработки Arduino IDE и мониторим последовательный порт.
- Сверяем выводимые данные акселерометра и гироскопа.
- Во время поворота датчика сведения не производят изменений.
Гироскоп – инструмент, который позволяет измерить реакцию тела на перемещение углов и вообще ориентации. Акселерометр же служит измерителем проекции ускорения, которое только кажется.
Заключение
Модуль датчика – устройство, которое широко используется во многих сферах человеческой жизни. С помощью датчика приводят в норму полет квадрокоптера, потому что гироскоп и акселерометр часто применяются в совокупности.
Модуль помогает скоординировать различные электронные устройства. Например, часто прибор встраивают в детектор движения и систему ориентирования, которая встраивается в роботы для управления. Другие подобные устройства с поддержанием сенсорной функции пользуются успехом в иных областях.