Содержание
- 1 Комплектующие
- 2 Необходимые материалы
- 3 Исходный код программы
- 4 Калибровка
- 5 Назначение связки гироскоп и акселерометр
- 6 Шаг 1: немного теории
- 7 Шаг 1. Компоненты для подключения акселерометра к Arduino
- 8 Arduino and MPU6050
- 9 Тестирование
- 10 Принципиальная электрическая схема
- 11 Работа схемы
- 12 Подготовка приложения на Android
- 13 Подключение гироскопа к Arduino
- 14 Исходный код программы на С
- 15 Программы
- 16 Схема проекта
- 17 Шаг 5: комбинирование и фильтрация данных
- 18 Тестирование работы измерителя уровня
- 19 Капуста на ленивые голубцы
- 20 Калибровка mpu6050
Комплектующие
Создаётся данный датчик или МК, в зависимости от того, что вы собрались приобретать, из компонентов ATmega328.
Распиновка модуля Arduino MPU 6050
Так, в нём имеются:
- 14 штук различных пинов и цифровых выходов, половина из которых являются ШИМ-выходами.
- Специальные кварцевые резонаторы до 16 МГц мощностью.
- Встроенный вход под usb-кабель, который позволит вам сэкономить не только время, но и деньги, которые вы могли бы потратить на покупку адаптера.
- Контакты и распиновка для стандартного питания с нулем, фазой и заземлением.
- Контакты для сброса до заводских настроек, при которых весь машинный код и данные будут стёрты. Это полезно в том случае, если вы напортачили с программой и модуль превратился в бесполезную груду железа, и просто как экономия времени, если необходимо сменить прошивку.
- ICSP контакт, который необходим для того, чтобы запрограммировать машинный код, который будет находиться внутри системы.
Все эти компоненты и составляют Arduino гироскоп, позволяя ему выполнять свои базовые функции. Но как же запрограммировать систему, если вы до этого не имели опыта работа с данными МК?
Необходимые материалы
Кран делают из профиля длиной 7 м. Лучше всего использовать материал, толщина стенок которого составляет 7 мм. Механизм должен быть прочным, поэтому стоит выбирать профиль с сечением 80×80 мм.
Для изготовления грузоподъемного устройства также потребуется несколько труб. Подходят изделия по 700 мм, сечение которых составляет от 76 до 99 мм.
Для сооружения крана потребуется домкрат, можно взять с ВАЗа. Лучше всего использовать устройство, которое рассчитано на подъем грузов весом до 5 т. Для сооружения механизма необходимы 4 пластины толщиной 8 мм.
Для самостоятельной сборки крана нужно иметь следующий набор инструментов:
- дрель;
- инвертор для сварки;
- гаечные ключи;
- болгарку.
Сборка механизма не отличается сложностью, поэтому ее легко выполнить своими силами. или любое другое устройство после сборки можно покрасить.
Исходный код программы
Перед загрузкой кода программы в плату 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 |
/* 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(); } |
Калибровка
mpu6050_get_raw_no_calibr.py
На самом деле присутствуют и другие погрешности. Например, трехосевые датчики должны располагаться взаимно перпендикулярно. Но при производстве трудно добиться абсолютной точности, поэтому этот угол также имеет определенные допуски и влияет на погрешность. Кроме того показания датчиков с трех осей могут иметь разную пропорциональность. В данном случае наибольшая погрешность из-за смещения относительно нуля.
В примере я предусмотрел процедуру калибровки. Скрипт калибровки: mpu6050_calibr.py. Калибровка выполняется в два этапа. Сначала датчик должен быть неподвижен. Подразумевается, что угловые скорости равны нулю. Калибруется гироскоп. Затем калибруется акселерометр. Нужно его не спеша поворачивать во всех направлениях. Эта процедура занимает около минуты. После чего функция калибровки выдает вычисленные значения, которые нужно прописать в скрипте. На этом калибровка закончена. После калибровки погрешность значительно снизится. См. Скрипт: mpu6050_get_raw.py. В этом скрипте в следующих строках указываются калибровочные данные:
Назначение связки гироскоп и акселерометр
Для начала давайте разберёмся, зачем Arduino mpu 6050 (Gy-521) вообще нужен и что собой представляет гироскоп-акселерометр в целом. Такой датчик все мы видели в смартфонах, и там он выполняет следующие функции:
- Позволяет замерять шаги. Акселерометр способен отслеживать резкие движения устройства, а в зависимости от его настройки и чувствительности, считать некоторые из них за шаг.
- Измеряет поворот экрана. Здесь уже оба устройства работают в паре. Ведь когда вы поворачиваете смартфон набок, картинка должна изменить свою ориентацию для пользователя, и лишь с помощью гироскопа удаётся определить угол наклона, под которым ПО это должно будет сделать.
- Компас, карты и навигация. Акселерометр с гироскопом позволяют определить ориентацию устройства в пространстве, что необходимо в различных приложениях для мобильной навигации.
Вот и выходит, что данный датчик подойдёт для тех проектов, в которых вам необходимо измерить ориентацию или движения прибора в пространстве, без точных данных о его местоположении. Это может быть, как самодельная линейка со встроенным уровнем, чтобы пользователь мог определить, насколько ровно стоит та или иная мебель, так и устройство для кровати, встроенной в стену, включающее свет, когда она выдвигается.
Но применить модуль можно и с большей выдумкой, например, для измерения количества оборотов в секунду и регуляции мощности охладительной системы или автоматизации различных процессов.
Всё зависит исключительно от вашей выдумки и конкретного проекта.
Смотрите по теме: Подключаем гироскоп-акселерометр (MPU-6050) к плате Arduino
Чаще всего гироскоп для Ардуино применяется в системах автоматизации под так называемые «смартхаусы» (умные дома — прим. ред.), являясь своеобразным переключателем. Передавая определённые данные в МК, который затем отправляет их по блютуз-модулю к другому устройству, он может управлять всей техникой в доме.
Ещё один простой способ применения – использование вместо датчика движения на дверях, для включения света и кондиционирования, когда вы возвращаетесь домой.
Шаг 1: немного теории
Самобалансирующийся робот похож на перевернутый маятник. В отличие от обычного маятника, который продолжает колебаться, после того как его толкают, этот перевернутый маятник не может оставаться сбалансированным сам по себе. Он просто упадет.
Рассмотрим балансировку карандаша на указательном пальце, который является классическим примером балансировки перевернутого маятника. Мы двигаем пальцем в направлении падения карандаша. Аналогично и с самобалансирующимся роботом, нужно вращать колеса в направлении, в котором он падает что бы удерживать центр тяжести робота над точкой поворота.
Для управления моторами нам понадобится информация о текущем состоянии робота. Нужно знать направление, в котором робот падает, угол наклона и скорость, с которой он падает. Вся эта информация может быть получена с помощью датчика MPU6050. Обработав данные с датчика, на драйверы моторов подаются соответствующие управляющие сигналы что бы поддерживать равновесие.
Шаг 1. Компоненты для подключения акселерометра к Arduino
Для проекта понадобятся несколько компонентов:
Микроконтроллер Arduino UNO R3
МК создан с использованием материалов контроллера ATmega328:
- цифровые входы и выходы в количестве 14 штук, причем половина приходится на ШИМ-выходы;
- аналогичные входы, количество – 6 штук;
- резонатор на основе кварца, мощностью 16 МГц;
- встроен usb-вход;
- контакт для подключения питания;
- на МК располагается кнопка, с помощью которой возможен сброс данных и кода;
- контакт для программирования данных, находящихся внутри схемы, именуемый ICSP.
Старт работы начинается с подачи электрического питания в плату. Пользователь подключает к плате со схемой блок питания или зарядное устройство. Также процедура осуществляется с помощью usb-кабеля, который подключен к компьютеру и микроконтроллеру. Для разработки программы понадобится бесплатная среда программирования – Arduino IDE.
Внимание! Пользователь разрабатывает приложения с использованием Ардуино, только если платы совместимы с архитектурой микроконтроллера. В противном случае программа не заработает.. Пользователь создает в бесплатной среде код, затем его компилирует и загружает проработанную программу в пространство памяти в Ардуино
Язык, на котором программируется код, Wiring максимально приближен к популярному среди программистов языку – C++. Кроме того МК поддерживает версии для осей Виндовс, Мак ОС и Линукс
Пользователь создает в бесплатной среде код, затем его компилирует и загружает проработанную программу в пространство памяти в Ардуино. Язык, на котором программируется код, Wiring максимально приближен к популярному среди программистов языку – C++. Кроме того МК поддерживает версии для осей Виндовс, Мак ОС и Линукс.
Модуль датчика для гироскопа акселерометра на Аrduino с 3 осями – GY-521 (MPU-6050)
В основе компонента лежит микросхема MPU-6050. В комплект входят 2 предмета – гироскоп и акселерометр. Данные устройства перед конструированием обрабатываются и затем переносятся прямиком в микроконтроллер через интерфейс
Модуль датчика помогает определять место и перемещение инструмента в пространстве. Измеряются дифферент и углы крена посредством вектора силы тяжести и скорости в процессе вращения. Также включена функция измерения температурного режима. Перемещение определяется линейным ускорением и угловой скоростью. Полная картина рисуется по 3 осям.
Компонент нередко сравнивают с человеческим вестибулярным аппаратом, который помогает людям чувствовать силу тяготения и удерживать равновесие.
Макетная плата, предназначенная для прототипирования
Отладка – неотъемлемая часть построения электронных схем. Макетная плата незаменима для конструкции электронной аппаратуры. Ранее в изобретательстве использовали традиционные макетные платы, но сейчас широко распространены макетные платы, которые удобны тем, что не требуют дополнительных спаек.
Таким образом, процесс сборки и отладки электронной схемы в разы ускоряется: не приходится часто использовать паяльник, чтобы поменять сломанные радиодетали.
Материал для изготовления беспаечных макетных плат – пластик. Кроме того, все контакты надежно скреплены к плате, поэтому частые переключения не испортят элемент.
Соединительные провода папа-папа
Обычные провода папа-папа нам подойдут, еще их называют провода-перемычки. Такие стоят недорого и продаются везде, на любом рынке или в любом онлайн-магазине для радиолюбителей.
Arduino and MPU6050
Let’s take a look how we can connect and read the data from the MPU6050 sensor using the Arduino. We are using the I2C protocol for communication with the Arduino so we need only two wires for connecting it, plus the two wires for powering.
You can get the components needed for this Arduino Tutorial from the links below:
- MPU6050 IMU …………………………..…. Amazon / Banggood / AliExpress
- Arduino Board ………………………….….. Amazon / Banggood / AliExpress
- Breadboard and Jump Wires ………… Amazon / Banggood / AliExpress
Disclosure: These are affiliate links. As an Amazon Associate I earn from qualifying purchases.
Тестирование
После отладки необходимо провести тестирование. В чём разница? При тестировании вы точно знаете, что программный код работает без лагов и багов, но вам необходимо убедиться, что в нём нет логических ошибок.
С акселерометром и гироскопом проще всего использовать программы 3Д рендеринга показаний, вроде ShowGY521Data, которые позволят в реальном времени увидеть, как железо позиционируется в пространстве. В случае неисправностей всегда можно подправить нулевой уровень и уменьшить чувствительность акселерометра, который также влияет на конечную модель отображения устройства.
Принципиальная электрическая схема
Прежде всего, подключите датчик MPU 6050 к Ардуино. Соединения MPU6050 и Arduino заключаются в следующем:
- Подключите VCC к MPU6050 к выходу 5V на Arduino.
- Подключите GND на MPU6050 к GND на Arduino.
- Подключите SCL к MPU6050 к A5 на Arduino.
- Подключите SDA к MPU6050 к A4 на Arduino.
Штыри A4 и A5 на Ардуино предназначены для связи SPI. Вот почему мы подключили SCL и SDA на MPU6050 к A5 и A4 на Arduino. После подключения к MPU6050 и Arduino подключите сервомотор к Ардуино. Соединения для серводвигателя и Arduino следующие:
- Подсоедините желтый провод серводвигателя к контакту 2 на Arduino.
- Подключите красный провод серводвигателя к контакту 5V на Arduino.
- Подключите черный провод серводвигателя к GND на Arduino.
Работа схемы
Схема шагомера на ATtiny85 и акселерометре MPU6050 представлена на следующем рисунке.
Взаимодействие между MPU6050, OLED дисплеем м платой Arduino осуществляется с помощью протокола I2C. Поэтому контакт SCLPin (PB2) микроконтроллера ATtiny85 подключен к контактам SCLPin датчика MPU6050 и OLED дисплея. Аналогичным образом, контакт SDAPin (PB0) микроконтроллера ATtiny85 подключен к контактам SDAPin датчика MPU6050 и OLED дисплея. Две кнопки подключены к контактам PB3 и PB4 микроконтроллера ATtiny85. Эти кнопки используются для скроллинга или изменения текста на экране дисплея.
Подготовка приложения на Android
Приложение на Android для нашего проекта мы разработали с помощью бесплатной программной среды Processing IDE, программирование в которой очень похоже на программирование в Arduino. Ранее на нашем сайте программную среду Processing мы использовали в следующих проектах:
- игра в Ping Pong на основе Arduino;
- радар на Arduino;
- проект виртуальной реальности на Arduino.
В этом проекте вы можете скачать либо готовый APK файл приложения, не утруждая себя погружением в среду Processing, либо можете скачать исходные коды приложения если все таки хотите в нее погрузиться и изменить что либо в нашей программе.
Примечание: это приложение будет корректно работать если только Bluetooth устройство имеет имя “HC-06”. Чтобы установить приложение на смартфон разрешите в нем установку приложений из непроверенных источников.
Объяснение кода приложения для Android
Внутри скачанного ZIP файла вы найдете папку, в которой находятся все изображения и другие данные, необходимые для работы android приложения.
В следующей строке кода программы мы указываем с каким Bluetooth устройством необходимо автоматически соединиться приложению.
bt.connectToDeviceByName(«HC-06»);
1 | bt.connectToDeviceByName(«HC-06»); |
Внутри функции draw(), которая представляет собой бесконечный цикл, мы будем рисовать изображения и печатать текст на экране смартфона в зависимости от данных, принимаемых по Bluetooth.
void draw() //The infinite loop
{
background(0);
imageMode(CENTER);
image(logo, width/2, height/1.04, width, height/12);
load_images();
textfun();
getval();
}
1 |
voiddraw()//The infinite loop { background(); imageMode(CENTER); image(logo,width2,height1.04,width,height12); load_images(); textfun(); getval(); } |
Также помните о том, что в программе для Arduino мы разделили передаваемые данные на три части и поместили их все в диапазон от 0 до 255. Здесь же мы должны распаковать эти данные и вернуть им нормальные значения.
if (info<100 && info>0)
x = map(info, 0, 100, -(width/1.5)/3, +(width/1.5)/3);//x = info;
else if (info<200 && info>100)
y = map(info, 100, 200, -(width/4.5)/0.8, +(width/4.5)/0.8);//y = info;
else if (info>200)
temp = info -200;
println(temp,x,y);
1 |
if(info<100&&info>) x=map(info,,100,-(width1.5)3,+(width1.5)3);//x = info; elseif(info<200&&info>100) y=map(info,100,200,-(width4.5)0.8,+(width4.5)0.8);//y = info; elseif(info>200) temp=info-200; println(temp,x,y); |
Подключение гироскопа к Arduino
Аппаратная платформа Arduino тем и хороша, что для большого количества стандартных датчиков можно найти готовые программные решения. Не является исключением и данное устройство .
Хотя в общей сложности GY-521 имеет 8 контактов для демонстрации совместной работы с Arduino UNO достаточно всего четырех проводов, остальные контакты нужны для более сложных вариантов взаимодействия . В данном простейшем случае в качестве ведущего устройства выступает плата Arduino UNO. Выводы SDA и SLC гироскопа подключаются соответственно к контактам A4 и A5 платы Arduino . Именно через эти выводы на Arduino UNO реализован данный интерфейс.
Вообще-то линии интерфейса I2C должны быть соединены с шиной питания через резисторы сопротивлением 4,7 кОм , но в случае одного датчика на макетной плате, все работало и так. Два варианта программы для Arduino, которые опрашивают гироскоп-акселерометр GY-521 можно скачать здесь .
Гироскоп-акселерометр питается напряжением 3,3 В от Arduino, ток потребления составляет около 5 мА.
На плате гироскопа-акселерометра располагается индикатор питания.
Испытания гироскопа
В мониторе последовательного порта Arduino IDE. Видно, что если прикоснуться к микросхеме на плате датчика рукой, то датчик покажет рост температуры.
Гироскоп-акселерометр GY-521
При изменении ориентации модуля в пространстве изменяется показания акселерометра, отображающие, вдоль какой оси (X,Y,Z соответственно) прибора действует ускорение свободного падения.
Влияние резкого поворота вдоль каждой из осей на показания гироскопа.
Помимо самого очевидного применения в летательных аппаратах гироскоп-акселерометр может оказаться полезным в умной одежде, всевозможных устройствах управления, балансирующих роботах , системах сигнализации и т.п. Одним словом интересное и недорогое устройство с широкими возможностями. Автор обзора — Denev.
- Блум Д. Изучаем Arduino: инструменты и методы технического волшебства: Пер. с англ. — СПб.: БХВ-Петербург, 2015. — 336 с.
- http://robocraft.ru/blog/communication/780.html
- http://forumdvrobot.ru/forum/3-41-1
- https://ngin.pro/index.php?newsid=188
- http://arduinoprojects.ru/2014/10/подключение-гироскопа-gy-521-mpu-6050-к-arduio/
- https://arduino-kit.ru/catalog/id/modul-3-h-osevogo-giroskopa-i-akselerometra-gy-521-mpu-6050
- https://mysku.ru/blog/china-stores/40178.html
- http://playground.arduino.cc/Main/MPU-6050#sketch
- http://robocraft.ru/blog/projects/570.html
Исходный код программы на С
Arduino
#include «TinyWireM.h»
#include «TinyOzOLED.h»
int accelX, accelY, accelZ;
char mpu = 0x68;
float vectorprevious;
float vector;
float totalvector;
int Steps = 0;
void setup() {
TinyWireM.begin();
OzOled.init();
OzOled.clearDisplay();
OzOled.setNormalDisplay();
OzOled.sendCommand(0xA1); // установки ориентации дисплея
OzOled.sendCommand(0xC8);
TinyWireM.beginTransmission(mpu);
TinyWireM.write(0x6B); // установка регистра питания
TinyWireM.write(0b00000000); // отключаем спящий режим
TinyWireM.endTransmission();
TinyWireM.beginTransmission(mpu);
TinyWireM.write(0x1B); // конфигурация регистров гироскопа
TinyWireM.write(0x00000000); // 250° per second range (default)
TinyWireM.endTransmission();
TinyWireM.beginTransmission(mpu); //адрес I2C гироскопа
TinyWireM.write(0x1C); // конфигурация регистров акселерометра
TinyWireM.write(0b00000000); // 2g range +/- (default)
TinyWireM.endTransmission();
}
void loop() {
getAccel();
vector = sqrt( (accelX * accelX) + (accelY * accelY) + (accelZ * accelZ) );
//OzOled.printString(«Vec:», 0, 2);
//OzOled.printNumber(vector, 0, 5, 2);
totalvector = vector — vectorprevious;
//OzOled.printString(«Pre:», 0, 4);
//OzOled.printNumber(vectorprevious, 0, 5, 4);
//OzOled.printString(«Diff:», 0, 6);
//OzOled.printNumber(totalvector, 0, 5, 6);
if (totalvector > 6){
Steps++;
}
//String Step_count = String(Steps);
//char data;
//Step_count.toCharArray(data, 2);
//OzOled.printBigNumber(data, 6, 2, 3);
OzOled.printString(«Steps», 0, 4);
OzOled.printNumber(Steps, 0, 8, 4);
vectorprevious = vector;
delay(600);
//OzOled.clearDisplay();
}
void getAccel() {
TinyWireM.beginTransmission(mpu); //адрес I2C гироскопа
TinyWireM.write(0x3B); // регистр данных акселерометра
TinyWireM.endTransmission();
TinyWireM.requestFrom(mpu, 6); // считываем 6 байт, 2 for each DoF
accelX = TinyWireM.read() << 8|TinyWireM.read();
accelY = TinyWireM.read() << 8|TinyWireM.read();
accelZ = TinyWireM.read() << 8|TinyWireM.read();
// OzOled.printNumber(accelX, 0, 0, 0);
// OzOled.printNumber(accelY, 0, 0, 2);
//OzOled.printNumber(accelZ, 0, 0, 4);
}
1 |
#include «TinyWireM.h» intaccelX,accelY,accelZ; charmpu=0x68; floatvectorprevious; floatvector; floattotalvector; intSteps=; voidsetup(){ TinyWireM.begin(); OzOled.init(); OzOled.clearDisplay(); OzOled.setNormalDisplay(); OzOled.sendCommand(0xA1);// установки ориентации дисплея OzOled.sendCommand(0xC8); TinyWireM.beginTransmission(mpu); TinyWireM.write(0x6B);// установка регистра питания TinyWireM.write(0b00000000);// отключаем спящий режим TinyWireM.endTransmission(); TinyWireM.beginTransmission(mpu); TinyWireM.write(0x1B);// конфигурация регистров гироскопа TinyWireM.write(0x00000000);// 250° per second range (default) TinyWireM.endTransmission(); TinyWireM.beginTransmission(mpu);//адрес I2C гироскопа TinyWireM.write(0x1C);// конфигурация регистров акселерометра TinyWireM.write(0b00000000);// 2g range +/- (default) TinyWireM.endTransmission(); } voidloop(){ getAccel(); vector=sqrt((accelX*accelX)+(accelY*accelY)+(accelZ*accelZ)); //OzOled.printString(«Vec:», 0, 2); //OzOled.printNumber(vector, 0, 5, 2); totalvector=vector-vectorprevious; //OzOled.printString(«Pre:», 0, 4); //OzOled.printNumber(vectorprevious, 0, 5, 4); //OzOled.printString(«Diff:», 0, 6); //OzOled.printNumber(totalvector, 0, 5, 6); if(totalvector>6){ Steps++; } OzOled.printString(«Steps»,,4); OzOled.printNumber(Steps,,8,4); vectorprevious=vector; delay(600); //OzOled.clearDisplay(); voidgetAccel(){ TinyWireM.beginTransmission(mpu);//адрес I2C гироскопа TinyWireM.write(0x3B);// регистр данных акселерометра TinyWireM.endTransmission(); TinyWireM.requestFrom(mpu,6);// считываем 6 байт, 2 for each DoF accelX=TinyWireM.read()<<8|TinyWireM.read(); accelY=TinyWireM.read()<<8|TinyWireM.read(); accelZ=TinyWireM.read()<<8|TinyWireM.read(); // OzOled.printNumber(accelX, 0, 0, 0); // OzOled.printNumber(accelY, 0, 0, 2); //OzOled.printNumber(accelZ, 0, 0, 4); } |
Программы
Без программы модуль будет не более чем грудой железа, которая не выполнит ни одной функции. Базовые библиотеки для взаимодействия с другими МК можно найти на официальном сайте или в интернете, но, помимо них, вам потребуется вспомогательный код. С его помощью можно настроить взаимодействие между акселерометром и тем же блютуз модулем, без которого, в большинстве проектов, он станет бесполезен.
Мы воспользуемся готовой библиотекой для Arduino MPU 6050, которую написал Джефф Роуберг.
В целом, многие поступают и другим путем, правда далеко не все умеют программировать на С++, поэтому перед пользователем, который хочет написать программу для работы с гироскопом, открывается два пути:
- Найти уже готовый шаблон или библиотеку. Для этого потребуется всего пара секунд и подключение к интернету, но не стоит забывать, что готовые решения пишутся, зачастую, столь же неопытными инженерами. Поэтому, по возможности, проверяйте, насколько качественный код вы скачиваете. Смотрите отзывы о библиотеке, если есть такая возможность, и старайтесь скачивать их на зарубежных форумах. Там и выбор будет больше, и куда выше вероятность найти действительно качественную библиотеку.
- Написать функции и методы для работы системы своими силами. Этот вариант подойдёт лишь тем, кто ранее имел дело с языком С++ и понимает все нюансы работы с Ардуино. Все необходимые вспомогательные библиотеки можно скачать в интернете, а всё остальное вы можете подогнать под свои нужды. Такой способ идеально подходит для тех, кто хочет реализовать собственный проект, не имеющий аналогов. Ведь в таком случае найти заготовленный код под него будет крайне сложно, даже если быть готовым править большую его часть.
Вернемся к нашей библиотеке. После того как вы скачали библиотеку гироскопа вам нужно сделать следующее.
Нужно распаковать/извлечь эту библиотеку, взять папку с именем «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 представлена на следующем рисунке.
В следующей таблице представлены соединения между датчиком MPU6050 и платой Arduino Nano.
Датчик MPU6050 | Плата Arduino Nano |
VCC | +5V |
GND | GND |
SDA | A4 |
SCL | A5 |
В следующей таблице представлены соединения между сервомоторами и платой Arduino Nano.
Плата Arduino Nano | Сервомоторы | Адаптер питания |
D2 | Servo 1 Orange (PWM Pin) | — |
D3 | Servo 2 Orange (PWM Pin) | — |
D4 | Servo 3 Orange (PWM Pin) | — |
D5 | Servo 4 Orange (PWM Pin) | — |
GND | Servo 1,2,3,4 Brown (GND Pin) | GND |
— | Servo 1,2,3,4 Red (+5V Pin) | +5V |
Гибкий датчик имеет 2 контакта – они не имеют полярности. Поэтому один контакт датчика подключен через подтягивающий резистор 10 кОм к контакту A0 платы Arduino, а другой – к контакту земли платы Arduino.
Шаг 5: комбинирование и фильтрация данных
Один из наиболее популярных методов совмещения данных с акселерометра и гироскопа – это использование комплементарного фильтра. Данные с гироскопа и акселерометра содержат шумы, у гироскопа ещё есть так называемый дрейф нуля. Комплементарный фильтр компенсирует дрейф нуля гироскопа за счёт использования данных с акселерометра и является фильтром высоких частот для гироскопа и фильтром низких частот для акселерометра.
currentAngle = 0.9934 * (previousAngle + gyroAngle) + 0.0066 * (accAngle)
0.9934 и 0.0066 являются коэффициентами фильтра для интервала времени 0.75с. Фильтр нижних частот пропускает через него любой сигнал, длительность которого превышает эту длительность, а фильтр верхних частот пропускает любой сигнал, длина которого меньше этой длительности. Отклик фильтра можно настроить, выбрав правильную постоянную времени. Понижение постоянной времени позволит увеличить горизонтальное ускорение.
Устранение ошибок смещения акселерометра и гироскопа
Загрузите в Arduino скетч MPU6050_calibration.ino для калибровки смещений MPU6050. В скетче FullCode.ino в функции setup() есть следующие строчки:
mpu.setYAccelOffset(1593);
mpu.setZAccelOffset(963);
mpu.setXGyroOffset(40);
В этих строчках замените числа на полученные при калибровке.
Тестирование работы измерителя уровня
После того как аппаратная часть проекта будет готова загрузите программу (приведенную в конце статьи) в плату Arduino. В коде программы вы можете снять комментарии со строк Serial.println и наблюдать за ходом выполнения программы в окне монитора последовательной связи.
После загрузки кода программы в плату Arduino запустите Android приложение для этого проекта на вашем смартфоне. Приложение должно автоматически установить соединение с вашим модулем HC-06 и на экране смартфона должна высветиться надпись “Connect to: HC-06” как показано на следующем рисунке.
Сначала все значения гироскопа будут установлены в 0 поскольку в программе мы первым делом производим калибровку гироскопа. Далее, по мере того, как вы будете наклонять конструкцию в разные стороны, значения гироскопа также будут меняться. А значения температуры с самого начала будут показываться реальные. Более подробно работа проекта показана на видео, приведенном в конце статьи.
Теперь вы можете помещать макетную плату с собранным устройством на любые поверхности и проверять действительно ли они являются ровными.
Капуста на ленивые голубцы
Ленивые голубцы получаются вкусными и сочными, если правильно нарезать капусту:
- Для ленивых голубцов подойдет любая капуста, но вкуснее и мягче они получатся из листьев молодых зеленых кочанов. Нужно вымыть капусту и обобрать верхние подвявшие, испорченные листья.
- Разрезать кочан на 4-8 частей, вырезать кочерыжку так, чтобы листья не развалились, и нашинковать толстой соломкой.
Калибровка mpu6050
Калибровка гироскопа и акселерометра – это очень важный шаг. Приведенные значения для гироскопа имеют вид: “gyro_x_scalled = ”, так как для получения угла поворота относительно оси по данным угловой скорости, необходимо провести интегрирование. Если “gyro_x_scalled” содержит ошибку или неверно выбрана база, эта ошибка также интегрируется и превращается в значительную погрешность в результате. Так что в идеале измерения должны показывать нуль, если гироскоп не движется вокруг каких-либо осей координат. На практике добиться идеала практически невозможно, так что наша задача – минимизировать эту ошибку. Кроме того, для компенсации «дрифта», можно использовать акселерометр для расчета угла наклона, сравнения полученных данных с результатами гироскопа и последующей компенсацией данной погрешности. Расчет угла будет рассмотрен в этой статье отдельно ниже.
На рисунках далее показано использование функции MPU6050_OffsetCal() непосредственно в программе в Arduino IDE.
Скетч Arduino для калибровки платы акселерометра/гироскопа MPU6050:
Результат работы скетча для калибровки в серийном мониторе