Применение ардуино гироскопа на основе микросхемы mpu 6050

Содержание

Исходный код программы

Перед загрузкой кода программы в плату Arduino не забудьте скачать и установить библиотеку для работы с гироскопом MPU6050.

Arduino

/*
MPU6050 Library: https://github.com/jarzebski/Arduino-MPU6050 (c) 2014 by Korneliusz Jarzebski
*/
#include <Wire.h> //библиотека для связи по протоколу IIC
#include <MPU6050.h> //библиотека для работы с MPU6050
#include <SoftwareSerial.h>// библиотека последовательной связи
SoftwareSerial BT(10, 11); // RX, TX
MPU6050 mpu;
unsigned long timer = 0;
unsigned long timer2 = 0;
float timeStep = 0.01;
float pitch = 0;
float roll = 0;
float yaw = 0;
float temp =0;
void setup()
{
Serial.begin(115200);
BT.begin(9600); // инициализируем последовательную связь с модулем Bluetooth на скорости 9600 бод/с
// инициализируем MPU6050
while(!mpu.begin(MPU6050_SCALE_2000DPS, MPU6050_RANGE_2G))
{
Serial.println(«Could not find a valid MPU6050 sensor, check wiring!»);
delay(500);
}

mpu.calibrateGyro(); // старт калибровки гироскопа
mpu.setThreshold(3); // устанавливаем чувствительность гироскопа
}
void loop()
{
timer = millis();
//считываем данные температуры и гироскопа
Vector norm = mpu.readNormalizeGyro();
temp = mpu.readTemperature();
// рассчитываем показатели Pitch, Roll и Yaw
pitch = pitch + norm.YAxis * timeStep;
roll = roll + norm.XAxis * timeStep;
yaw = yaw + norm.ZAxis * timeStep;
// Print values
Serial.print(» Pitch = «);
Serial.print(pitch);
Serial.print(» Roll = «);
Serial.print(roll);
Serial.print(» Yaw = «);
Serial.print(yaw);
Serial.print(» Temp = «);
Serial.print(temp);
Serial.println(» *C»);
delay((timeStep*1000) — (millis() — timer)); // используем интервал 0.01 секунды для считывания данных
if ((millis()-timer2) > 200)
send_BT();
}
void send_BT()
{
int t;
int x;
int y;
if (roll>-100 && roll<100)
x = map (roll, -100, 100, 0, 100);
if (pitch>-100 && pitch<100)
y = map (pitch, -100, 100, 100, 200);
if (temp>0 && temp<50)
t = 200 + int(temp);

BT.write(x);
BT.write(y);
BT.write(t);
timer2 = millis();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70

/*
    MPU6050 Library: https://github.com/jarzebski/Arduino-MPU6050  (c) 2014 by Korneliusz Jarzebski  
*/
#include <Wire.h> //библиотека для связи по протоколу IIC
#include <MPU6050.h> //библиотека для работы с MPU6050
#include <SoftwareSerial.h>// библиотека последовательной связи

SoftwareSerialBT(10,11);// RX, TX

MPU6050mpu;

unsignedlongtimer=;

unsignedlongtimer2=;

floattimeStep=0.01;

floatpitch=;

floatroll=;

floatyaw=;

floattemp=;

voidsetup()

{

Serial.begin(115200);

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

// инициализируем MPU6050

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

{

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

delay(500);

}

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

mpu.setThreshold(3);// устанавливаем чувствительность гироскопа

}

voidloop()

{

timer=millis();

//считываем данные температуры и гироскопа

Vectornorm=mpu.readNormalizeGyro();

temp=mpu.readTemperature();

// рассчитываем показатели Pitch, Roll и Yaw

pitch=pitch+norm.YAxis*timeStep;

roll=roll+norm.XAxis*timeStep;

yaw=yaw+norm.ZAxis*timeStep;

// Print values

Serial.print(» Pitch = «);

Serial.print(pitch);

Serial.print(» Roll = «);

Serial.print(roll);

Serial.print(» Yaw = «);

Serial.print(yaw);

Serial.print(» Temp = «);

Serial.print(temp);

Serial.println(» *C»);

delay((timeStep*1000)-(millis()-timer));// используем интервал 0.01 секунды для считывания данных

if((millis()-timer2)>200)

send_BT();

}

voidsend_BT()

{

intt;

intx;

inty;

if(roll>-100&&roll<100)

x=map(roll,-100,100,,100);

if(pitch>-100&&pitch<100)

y=map(pitch,-100,100,100,200);

if(temp>&&temp<50)

t=200+int(temp);

BT.write(x);

BT.write(y);

BT.write(t);

timer2=millis();

}

Код Ардуино

Теперь перейдем к нашему скетчу:

#include <Wire.h>
#include <MPU6050.h>
#include <Servo.h>   

Servo sg90;          
int servo_pin = 2;

MPU6050 sensor ;
int16_t ax, ay, az ;
int16_t gx, gy, gz ;

void setup (){ 
sg90.attach ( servo_pin );

Wire.begin ( );

Serial.begin  (9600); 

Serial.println  ( "Initializing the sensor" ); 

sensor.initialize ( ); 

Serial.println (sensor.testConnection ( ) ? "Successfully Connected" : "Connection failed"); 
delay (1000); 

Serial.println ( "Taking Values from the sensor" );
delay (1000);
}
void loop (){ 

sensor.getMotion6 (&ax, &ay, &az, &gx, &gy, &gz);
ax = map (ax, -17000, 17000, 0, 180) ;
Serial.println (ax);
sg90.write (ax); 
delay (200);
}

1Описание модуля GY-291 с акселерометром ADXL345

Акселерометр – это устройство, которое позволяет измерить динамическое и статическое ускорение по трём осям X, Y и Z. Благодаря статическому ускорению можно определить положение в пространстве (акселерометр как датчик поворота), а благодаря динамическому (движение или встряска) – направление ускорения.

Цифровой акселерометр ADXL345 – это 3-осевой акселерометр с высоким разрешением (13 бит) по осям с пределом до ±16g. Модуль обладает пониженным энергопотреблением и малыми размерами. Информационный обмен с модулем осуществляется по последовательным интерфейсам I2C или SPI (3- или 4-проводной).

Существует множество модулей для Arduino с акселерометром ADXL345. Модуль может выглядеть, например, так:

Внешний вид модуля GY-291 с цифровым акселерометром ADXL345

Показанный модуль имеет название GY-291. У модуля имеются следующие выводы:

Вывод модуля Назначение Подключать к выводу Arduino
SPI I2C
GND Земля GND GND
VCC Питание +3,3V +3,3V
CS Выбор ведомого интерфейса SPI 10
INT1 Выход прерывания 1 (*)
INT2 Выход прерывания 2 (*)
SDO Данные от ведомого 12
SDA Данные от мастера интерфейса SPIШина данных интерфейса I2C 11 A4
SCL Шина тактирования 13 A5

(*) Работы с прерываниями ADXL345 касаться в этой статье не будем. Вот есть хорошая статья, в которой достаточно подробно описан вопрос работы с прерываниями.

В зависимости от выбранного интерфейса – SPI или I2C – подключение модуля будет соответствующим, как показано в таблице. Но в обоих случаях очень простым.

Рассмотрим структуру регистров микросхемы ADXL345:

Карта регистров цифрового акселерометра ADXL345

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

Регистр управления питанием цифрового акселерометра ADXL345

Как видим, бит D3 (Measure) переключает акселерометр в режим измерения.

Полезные ссылки

2+

Ардуино – популярнейшая система для одноимённых МК, позволяющая любому желающему, даже без специального образования, воплотить в жизнь проект, о котором он давно мечтал. Будь то автоматизированная теплица или простая система выключения света по хлопку в умном доме.

Но естественно, сам микроконтроллер не способен выполнять все функции, и для этого к нему необходимо покупать датчики, коих на рынке более нескольких десятков разновидностей. Об одном из таких, а именно мы рассмотрим гироскоп Ардуино, и пойдёт речь. Что это такое, в каких проектах его можно применить и как настроить опишем ниже.

А если вам хочется больше практики — посмотрите наши уроки: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino или Гироскоп с помощью Arduino 101.

Выбор гироскопа: частота опроса и шумы

Есть два критерия, которые нужно учитывать при выборе полетного контроллера с конкретным гироскопом, это частота работы и чувствительность к шумам (электро- и механическим).

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

Серия гироскопов ICM работает лучше и плавнее, чем MPU6000 на 32KHz, но из-за шумных двигателей и регуляторов оборотов производительность ICM будет ниже, чем MPU6000. Например, ICM20602 на Raceflight Revolt V2 или ICM20689 на Kakute F4, оба этих гироскопа могут работать на частоте 32KHz, но с регуляторами оборотов, которые генерируют много шума, они работать будут хуже, чем MPU6000. По этой причине на полетные контроллеры устанавливают сетевые фильтры для частичного удаления шумов.

Чтобы частично убрать механические шумы (вибрацию), полетный контроллер следует устанавливать на резиновые подушки или любой другой пористый материал, который сможет гасить вибрацию, например кусок резины или вспененного материала.

Инструменты

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

  1. Паяльник. Хорошим выбором станут приборы с регулируемой мощностью, их можно приспособить к любой ситуации.
  2. Проводники. Естественно, датчик необходимо будет подсоединять к МК, и для этого не всегда подходят стандартные пины.
  3. Переходник под usb-порт. Если на вашем микроконтроллере нет встроенного порта, побеспокойтесь о том, чтобы его можно было подключить к ПК другим способом. Ведь вам необходимо будет подгружать дополнительные библиотеки и новую прошивку в ваш проект.
  4. Припой, канифоль и прочие мелочи, в том числе изолированное рабочее пространство.
  5. Сам чип и МК, а также, при необходимости, корпус будущего устройства. Наиболее опытные инженеры предпочитают распечатывать оболочку для своих проектов на 3Д принтере, однако, если вы живёте в крупном городе, не обязательно тратиться. Можете поискать компании, дающие в аренду принтеры.

Стоит понимать, что дальномер Arduino относится к приборам бесконтактного типа и способен обеспечивать точные измерения. Но всё же не стоит забывать, что профессиональные устройства используют совершенно другие технологии и проходят длительную калибровку под все материалы, а соответственно, в любом случае, окажутся лучше. Также у нашего проекта будет ограниченный диапазон измерения расстояний, от 0.03 до 4 метров, что подойдёт не во всех случаях.

Но, что хорошо, на работу устройства не оказывается никакого влияния со стороны ЭМ излучений и солнечной энергии

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

Но если вы захотите в итоге собрать законченное устройство — вам пригодится всё что мы указали выше.

Программы

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

Мы воспользуемся готовой библиотекой для Arduino MPU 6050, которую написал Джефф Роуберг.

В целом, многие поступают и другим путем, правда далеко не все умеют программировать на С++, поэтому перед пользователем, который хочет написать программу для работы с гироскопом, открывается два пути:

  1. Найти уже готовый шаблон или библиотеку. Для этого потребуется всего пара секунд и подключение к интернету, но не стоит забывать, что готовые решения пишутся, зачастую, столь же неопытными инженерами. Поэтому, по возможности, проверяйте, насколько качественный код вы скачиваете. Смотрите отзывы о библиотеке, если есть такая возможность, и старайтесь скачивать их на зарубежных форумах. Там и выбор будет больше, и куда выше вероятность найти действительно качественную библиотеку.
  2. Написать функции и методы для работы системы своими силами. Этот вариант подойдёт лишь тем, кто ранее имел дело с языком С++ и понимает все нюансы работы с Ардуино. Все необходимые вспомогательные библиотеки можно скачать в интернете, а всё остальное вы можете подогнать под свои нужды. Такой способ идеально подходит для тех, кто хочет реализовать собственный проект, не имеющий аналогов. Ведь в таком случае найти заготовленный код под него будет крайне сложно, даже если быть готовым править большую его часть.

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

Нужно распаковать/извлечь эту библиотеку, взять папку с именем «MPU6050» и поместить ее в папку «library» в Arduino. Для этого перейдите в место, где вы установили Arduino (Arduino -> libraries) и вставьте свою папку в папку библиотек. Возможно, вам также придется сделать то же самое, чтобы установить библиотеку I2Cdev, если у вас еще нет ее на вашем Ардуино. Для её установки выполните ту же процедуру, что и выше. Вы можете скачать I2Cdev на нашем сайте по этой ссылке.

Если вы всё сделали правильно, при открытии IDE Arduino вы можете увидеть «MPU6050» в:

Файл -> Примеры.

Затем откройте пример программы из меню:

Файл -> Примеры -> MPU6050 -> Примеры -> MPU6050_DMP6.

Затем вы должны загрузить этот код в свой Ардуино. После загрузки кода откройте последовательный монитор и установите скорость передачи в бодах как 115200. Затем проверьте, видите ли вы что-то вроде «Инициализация устройств I2C . » («Initializing I2C devices . «) на последовательном мониторе.

Если вы этого не сделаете, просто нажмите кнопку сброса. Теперь вы увидите строку с надписью «Отправить символы, чтобы начать программирование и демо DMP» («Send any character to begin DMP programming and demo»). Просто введите любой символ на последовательном мониторе и отправьте его, и вы должны начать видеть значения поступающие с MPU 6050.

Также можно, например, воспользоваться скетчем ниже, который пересчитывает координату X и Y и выводит в консоль (монитор последовательного порта):

Когда X и Y равны 180 — гироскоп в горизонтальной плоскости:

Вот вы определились с выбором и уже написали всё необходимое ПО, пришла пора его протестировать. Для этого, естественно, необходимо собрать всё вместе.

Необходимые детали и узлы

Прежде чем приступить к сборке квадрокоптера своими руками, необходимо обзавестись всеми необходимыми деталями. Мозгом нашей самоделки станет полетный контроллер Arduino Uno. Его возможностей более чем достаточно для того, чтобы управлять беспилотником.

Помимо микроконтроллера, нам понадобятся:

  • Аккумулятор (лучше несколько) на 3.7В
  • Плата MPU-6050 (на ней установлены гироскоп и акселерометр)
  • Транзистор ULN2003A
  • Коллекторные двигатели с полым ротором 0820
  • Провода

Необходимо сделать несколько замечаний. Так как мы собираем дешевый самодельный дрон, то наш выбор пал на коллекторные движки с полым ротором (так называемые coreless motors). Они далеко не так надежны, как бесколлекторные двигатели, но зато гораздо дешевле стоят. Кроме того, можно обойтись без дополнительных контроллеров скорости.

Зато невозможно обойтись без гироскопа и акселерометра. Гироскоп необходим для того, чтобы квадрокоптер мог удерживать заданное направление движения, тогда как акселерометр используется для измерения ускорения. Без этих устройств управлять коптером было бы гораздо сложнее (если вообще возможно), так как именно они предоставляют данные для сигнала, регулирующего скорость вращения винтов.

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

Назначение связки гироскоп и акселерометр

Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:

  1. Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
  2. Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
  3. Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.

Вот и выходит, что данный датчик подойдёт для тех проектов, в которых вам необходимо измерить ориентацию или движения прибора в пространстве, без точных данных о его местоположении. Это может быть, как самодельная линейка со встроенным уровнем, чтобы пользователь мог определить, насколько ровно стоит та или иная мебель, так и устройство для кровати, встроенной в стену, включающее свет, когда она выдвигается.

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

Всё зависит исключительно от вашей выдумки и конкретного проекта.

Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino

Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.

Ещё один простой способ применения – использование вместо датчика движения на дверях, для включения света и кондиционирования, когда вы возвращаетесь домой.

Функции в программе Arduino для работы с mpu6050

MPU6050_ReadData()

Эта функция считывает данные с акселлерометра, гироскопа и датчика температуры. После считывания данных, значения переменных (temp_scalled, accel_x_scalled, accel_y_scalled, accel_z_scalled, gyro_x_scalled, gyro_y_scalled and gyro_z_scalled) обновляются.

MPU6050_ResetWake()

Эта функция сбрасывает настройки чипа на значения по-умолчанию. Рекомендуется использовать сброс настроек перед настройкой чипа на выполнения определенной задачи.

MPU6050_SetDLPF(int BW)

Эта функция настраивает встроенный фильтр низких частот. Переменная int BW должна содержать значения (0-6). Пропускная способность фильтра будет изменяться в соответствии с представленной ниже таблицей.

int BW Пропускная способность фильтра
0 или Any бесконечность
1 184
2 94
3 44
4 21
5 10
6 5

Если int BW не в диапазоне 0-6, фильтр низких частот отключается, что соответствует установке – бесконечность.

MPU6050_SetGains(int gyro,int accel)

Эта функция используется для установки максимального значения шкалы измерений

int gyro Макс. знач.[угол/с] int accel Макс. знач. [м/с2]
250 2g
1 500 1 4g
2 1000 2 8g
3 2000 3 16g

MPU6050_ReadData()

Эта функция использует масштабные коэффициенты для расчета результата. Если не используются значения (0-3), MPU6050_ReadData() отобразит необработанные значения с датчика с погрешностью калибровки. Для получения обработанных значений, установите переменные для калибровки (accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC, gyro_y_OC and gyro_z_OC) в нуль.

MPU6050_OffsetCal()

Эта функция позволяет откалибровать акселерометр и гироскоп. Рассчитанные значения записываются в переменные accel_x_OC, accel_y_OC, accel_z_OC, gyro_x_OC, gyro_y_OC и gyro_z_OC для дальнейшей коррекции. Для проведения калибровки необходимо расположить оси x и y axes платы MPU6050 в горизонтальной плоскости, а ось z – перпендикулярно к основанию. Даже незначительные перемещения платы во время калибровки понижают точность расчета базовой точки. Ось z калибруется относительно силя земного притяжения — 9.81 м/с2 (1g), что учтено в коде.

4Разбор показаний цифрового акселерометра ADXL345

Посмотрите на фотографию ниже. На плате модуля нарисованы три оси: X, Y и Z. Они показывают направление осей акселерометра. Направления осей обусловлены расположением микросхемы ADXL345 на плате. В данном случае ось X акселерометра направлена горизонтально вправо, ось Z направлена горизонтально на нас, ось Y – вертикально вверх.

Акселерометр ADXL345 на макетной плате

А вот что выводит наш скетч в монитор последовательного порта среды Arduino IDE (надо уточнить, что данный вывод наблюдается в режиме покоя – акселерометр неподвижно лежит на столе в положении, как на приведённом фото):

Данные ускорений по X, Y, Z акселерометра ADXL345 в мониторе последовательного порта Arduino IDE

В трёх столбцах представлено значение статического ускорения, измеренное акселерометром по осям X, Y и Z, соответственно. В среднем столбце – показания оси Y – значения больше, чем в двух других. Эти значения даны в условных отсчётах, как они записаны в регистрах акселерометра. Акселерометр ADXL345 имеет несколько диапазонов измерений. Давайте посмотрим на сводную таблицу диапазонов и разрешений датчика акселерометра:

Параметры датчика ADXL345

Напомню, что g – это ускорение свободного падения, численно равное примерно 9,81 метр в секунду за секунду (м/с2).

Диапазон по умолчанию – от −16g до &plus;16g (размах 32g). Согласно таблице, на этот диапазон ускорений приходится 13 бит точности или 213 = 8192 отсчёта. Таким образом, на 1 отсчёт приходится ускорение 32g/8192 = 0,00390625g=0,00390625×9,81 ≈ 0,038 м/с2. Имея это в виду, получается, что в данном выводе скетча ускорение составляет:

Ось акселерометра Ускорение по оси, м/с2
X 0,76
Y 10,4
Z −0,12

Что ж, вполне логично. Ось Y направлена вертикально, т.е. вдоль вектора силы земного притяжения, и значение ускорения примерно равно константе g. Ускорения по осям X и Z, которые лежат в одной горизонтальной плоскости, примерно одинаковы и находятся около 0. Из-за кривизны стола, на котором стоит датчик, значения немного отличаются. Если бы я выровнял акселерометр по уровню, то его показания были бы более точные. В идеальном случае по оси Y должно быть ускорение 9,8 м/с2, а по осям X и Z – 0.

Кроме того, датчик ADXL345 имеет возможность тонкой настройки и калибровки. В данном примере мы этого не делали, а использовали акселерометр с заводскими настройками, как есть. Отсутствие калибровки также может вносить некоторые искажения в показания датчика. Рекомендую применять специальные библиотеки Arduino, которые упрощают взаимодействие с акселерометром ADXL345, в частности, позволяют проводить тонкую настройку.

Скачать библиотеку ADXL345

В архиве также лежит техническое описание (datasheet) на цифровой акселерометр ADXL345. Установка библиотеки производится путём копирования разархивированной папки с библиотекой в директорию libraries среды Arduino IDE.

скачать библиотеку Arduino для акселерометра ADXL345 с Depositfiles.

Arduino и датчик MPU6050

Файл, приведенный ниже, будет работать с цифровыми датчиками ускорения MPU6050, которые подключены к плате Arduino через I2C протокол по адресу 0x68. Работоспособность проверена на платах Arduino Uno и Arduino Mega. Данный файл заголовка требует файл Wire.h перед добавлением “gyro_Accel.h”. Кроме того, перед вызовом встроенных функций, надо инициализировать шину I2Cс помощью команды Wire.begin();.

Программа для Arduino с файлом заголовка и примером расположены на Github

Логи версии:

Версия 0.1 beta (Дата:2014-06-22): Сам файл заголовка для калибровки и чтения данных с датчика MPU6050 через i2c протокол и пример использования заголовочного файла для расчета угла.

Версия 0.2 beta (Дата:2014-10-08): Исправлены баги в файле примера. “accel_x_scalled” и “accel_y_scalled” теперь возвращают корректные значения углов.

Пример работы для Arduino и XOD

В качестве мозга для считывания показаний с датчика рассмотрим платформу из серии Arduino, например, Uno.

  • Как начать работу с Arduino?

  • Как начать работу с XOD?

Схема устройства

Подключите гироскоп к пинам питания и шины I²C — SDA и SCL на платформе Uno. Для коммуникации используйте
соединительные провода «мама-папа»

Для быстрой сборки и отладки устройства возьмите плату расширения Troyka Shield, которая одевается сверху на Arduino Uno методом бутерброда. Для коммуникации используйте трёхпроводной шлейф «мама-мама», который идёт в комплекте с датчиком.

С Troyka Slot Shield провода не понадобятся вовсе.

Вывод данных

В качестве примера выведем в Serial-порт угловую скорость вокруг собственных осей X, Y, Z.

gyro-read-data.ino
// Библиотека для работы с модулями IMU
#include <TroykaIMU.h>
 
// Создаём объект для работы с гироскопом
Gyroscope gyroscope;
 
void setup() {
    // Открываем последовательный порт
    Serial.begin(9600);
    // Выводим сообщение о начале инициализации
    Serial.println("Gyroscope begin");
    // Инициализируем гироскоп
    gyroscope.begin();
    // Выводим сообщение об удачной инициализации
    Serial.println("Initialization completed");
}
 
void loop() {
    // Выводим угловую скорость в градусах в секунду относительно оси X
    Serial.print(gyroscope.readRotationDegX());
    Serial.print("\t\t");
    // Выводим угловую скорость в градусах в секунду относительно оси Y
    Serial.print(gyroscope.readRotationDegY());
    Serial.print("\t\t");
    // Выводим угловую скорость в градусах в секунду относительно оси Z
    Serial.print(gyroscope.readRotationDegZ());
    Serial.print("\t\t");
    Serial.println();
    delay(100);
}

Установка платы датчика Холла

Во-первых, для реализации тахометра, мне нужен был небольшой неодимовый магнит, который нужно было прикрепить на вал шпинделя. Перерыл все ящики — я ничего подходящего не нашел. Зато нашел старый, нерабочий cd-rom от ноутбука. Вот в нем, в катушке электромагнита открывания, как раз и нашел, то, что нужно — небольшой, прямоугольный неодимовый магнит!

Определив высоту и полярность, я приклеил магнит к валу на «суперклей» и обтянул вал с магнитом термоусадкой. На копус шпинделя приклеил прокладку, а уже на прокладку — плату. Как видите — получилось довольно аккуратно. Защитный колпачек в процессе обдумывания, так что, пока без него

How Accelerometer Works?

To know how accelerometers work, it is often useful to imagine a ball inside a 3D cube.

Suppose, the cube is in outer-space where everything is in weightless state, the ball will simply float in the middle of the cube.

Now let’s imagine each wall represents particular axis.

If we suddenly move the box to the left with acceleration 1g(A single G-force 1g is equivalent to gravitational acceleration 9.8 m/s2), no doubt the ball will hit the wall X. If we measure the force that the ball applies to the wall X, we can get an output value of 1g on the X axis.

Let’s see what happens if we put that cube on Earth. The ball will simply fall on the wall Z and will apply a force of 1g, as shown in the picture below:

In this case the box isn’t moving but we still get a reading of 1g on the Z axis. This is because the gravitational force is pulling the ball down with force 1g.

The accelerometer measures the static acceleration of gravity in tilt-sensing applications as well as dynamic acceleration resulting from motion, shock, or vibration.

How MEMS Accelerometer Works?

MEMS(Micro Electro Mechanical Systems) accelerometer consists of a micro-machined structure built on top of a silicon wafer.

This structure is suspended by polysilicon springs. It allows the structure to deflect at the time when the acceleration is applied on the particular axis.

Due to deflection the capacitance between fixed plates and plates attached to the suspended structure is changed. This change in capacitance is proportional to the acceleration on that axis.

The sensor processes this change in capacitance and converts it into an analog output voltage.

Расчет угла с помощью гироскопа mpu6050

Данные с гироскопа имеют вид:

В дальнейшем в статье мы будем рассматривать все на примере оси x. Для расчета угла необходимо проинтегрировать переменную “gyro_x_scalled”

является количеством итераций

Так же стоит отметить, что на каждом временном промежутке цикла значение “gyro_x_scalled” остается одинаковым. Существует насколько подходов и методов интегрирования для компенсации и этой погрешности, но мы их детально не будем рассматривать.

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

Мы предполагаем, что начальные углы относительно осей x, y, z после калибровки равны 0, 0 и 90 градусов соответственно, так что для итерации n=0:

Значение T (время каждой итерации) и динамика самого гироскопа (как быстро и насколько нелинейно изменяются углы), значительным образом влияет на точность расчетов. Чем медленнее изменяются углы и чем меньше промежуток между итерациями, тем более точным будет результат. В этом смысле жаль, что платы Arduino достаточно медленные, кристаллы у них работают с частотой 16 МГц и снятие измерений каждые 10-20 мс становится достаточно затруднительным (учитывая тот факт, что процессор занят не только расчетом угла, но и другими параллельными задачами). Мы можем использовать T в виде переменной или константы, я, лично, предпочитаю использовать константу для каждого цикла. В проекте динамические факторы не учитывались, просто использовалась частота итераций с разрывом в 20 мс (0.02 с).

Модуль gy-6500 гироскоп/акселерометр mpu-6500 — » интернет-магазин arduino

Модуль GY-6500 это 3-х осевой гироскоп и 3-х осевой акселерометр на микропроцессоре MPU-6500. 6DOF Axis Sensor Module (RKP-GY-6500-MPU6500).

  • Модуль характеризуется низким потреблением, низкой стоимостью и высокой производительностью.
  • В основе модуля RKP-GY-6500-MPU6500 заложен чип MPU-6500, что позволяет интегрировать шести осевую обработку движения проектируемого робота.
  • Алгоритмы MotionFusion обрабатывают все внутренние сенсоры и собирают полный набор данных.
  • Для наиболее точного трекинга быстрых и медленных движений возможно самостоятельно запрограммировать необходимые режимы: ±250, ±500, ±1000, ±2000°/сек для гироскопа, а также ±2g, ±4g, ±8g, ±16g для акселерометра.
  • Обмен данными с роботизированным контроллером управления осуществляется по шине IIC (I2C).

Посмотреть DataSheet микросхемы MPU6500 (формат PDF размер 1 MБ)

Характеристики модуля GY-6500:Модуль: GY-6500Чип: MPU-6500, 16 битный АЦП, 16-ти битный вывод данныхНапряжение питания: 3 — 5 ВольтИнтерфейс: стандартный I2C (400кГц) / SPI (1 МГц) протокол связиРабочие диапазоны акселерометра: /- 2G, /- 4G, /- 8G, /- 16 GРабочие диапазоны гироскопа: /- 250, /- 500, /- 1000, /- 2000°/с Рабочий ток: гироскоп – 3,2 мА, акселерометр – 450 мкАТок в режиме сна: 8 8 мкА (гироскоп акселерометр)Габариты: 25 х 16 x 3 ммВес модуля: 2 граммаДиаметр отверстий для монтажа: 3 мм (2 шт.)Шаг распиновки: 2.54 мм

Комплектация:Модуль GY-6500 — 1 шт.Линейки с контактами (пинами) — 1 шт.»