Гироскоп GY-521 (на основе MPU-6050)
- Войдите на сайт для отправки комментариев
Пт, 11/10/2013 - 01:13
Доброго времени суток уважаемые пользователи, не подскажите как работает вот этот прибор
А именно меня интересует как получить из него значения угловых скоростей по трём осям (показание гироскопов) и линейных ускорений (показание акселерометров).
ПС: большая просьба если вы решили подкинут мне данную ссылку
http://playground.arduino.cc/Main/MPU-6050 и предложить мне попробовать "скетч" с этой ссылки, то не объясните ли мне что за значения там получаются и как их конвертировать в (нормальные) уг. скорости и лин. ускорения
MPU-6050 Read accel, temp and gyro, error = 0 accel x,y,z: 172, -440, 15100 temperature: 29.588 degrees Celsius gyro x,y,z : 363, 200, -769,
Есть пример использования MPU-6050 на роботе
В сообщении 86 чел. выложил код для ардуины
Спасибо большое, очень хороший пример, я хоть и не разобрался в нём до конца, но он натолкнул меня на "правильную" мысль... теперь осталось узнать как задаются режимы измерений гироскопа (в документации написано что их 4: ±250, ±500, ±1000, and ±2000°/sec)
тоже хочу разобраться с микросхемой MPU6050
Прочитал на форуме
Подключил акселерометр-гироскоп и магнитометр. С магнитометром пока не пробовал.
При отладке заметил, что в состоянии покоя значения акселерометра плавают.
А значения гироскопа стабильны. Поэтому решил для коррекции движения прямо
использовать показания оси Z. Скорректировал программу объезда препятствий.
Робот стал ездить прямо.
Библиотеку для работы с акселерометром-гироскопом взял из интернета.
Только добавил настройку фильтра низких частот до 10 Гц + децимацию.
С гироскопом работаю по прерываниям для стабильности показаний.
Коррекцию выполняю каждую 1/10 секунды.
Коррекция чего (акселерометра или гироскопа) и на основании чего? В чем природа возникающей ошибки, которую нужно корректировать ?
Человек пишет про коррекцию прямолинейного движения робота
Ошибка, это когда правое колесо вращается быстрей левого и робота начинает уводить в сторону. Купил MPU-6050 у нас и все у него заработало
У этого датчика нулевое положение гироскопа задано или его можно самому установить?
У меня датчик будет находиться не в горизонтальном положении, а в наклонном (все три оси будут под углом к горизонтальной поверхности) и мне надо как-то определять последующие изменения углов по осям
А есть у кого-нибудь код для этого гироскопа gy-521 + выравнивание двигателей с пояснениями на русском? Теория по обработке данных с гироскопа+акселерометра понятна благодаря вот этой статье:http://masters.donntu.edu.ua/2013/fkita/perebeinos/diss/index.htm#p6 особенно про комплементарный фильтр.
Есть пока только алгоритм: посылаем данные с gy-521 на ардуино, обрабатываем их комплементарным фильтром, если данные по оси Х у нас не равны начальным значениям Х в минусовую зону, то включается двигатель, с помощью PIN9 на Ардуино, а если данные не равны начальным значениям по оси Х в плюсовую зону, то включается PIN10. (Вчера автор пояснил статьи на которую я сслыку дал, что неплохо бы пи или пид регулятор использовать, для достижения нужных оборотов у двигателей, но это уже следующий разговор)
Здраствуйте, нужна помошь по этому девайсу
Я умею считатывать данные с GY 521 в виде 2 байт по 8 бит на каждое измерение затем следующая на каждую скорость, ускорение и температуру процедура:
ax = (H<<8)+L; - это теперь 16 битное слово сдержащее угловую скорость по координате х
теперь возникает вопрос какой бит содержит знак, а какие биты дробную часть если она есть измеряемой скорости?
А скетч свой не скините? Интересно глянуть. Помочь пока не могу, только начал осваивать.
Есть какой нибудь простой способ определить с помощью этого акселерометра начало движения и остановку?
Или не стоит браться?
Больно уж много проблем.
В автомобиль хочу сконструировать ДХО, чтобы сами включались при начале движения и сами выключались при остановке.
ГПС модуль дорого, да и для такой задачи как из пушки по воробьям.
да почему нет. при движении даже с равномерной скоростью все равно есть тряска небольшая и соответственно изменение ускорения. а когда стоишь почти нет, если конечно не включать громко музыку или трясти машину
если определить правильно уровень вибраций для движущейся и стоячей машины то в принципе реально. условия написать правильно и все, с учетом вибраций и времени
Сегодня доковырял сабж. Работает как ожидалось. Гироскоп из неё хреновенький, азимут уходит дето со скоростью 0,01-0,1град/сек. Остальные углы наверно также, но они корректируются по гравитации. Для коррекции азимута нужен магнитометр. К стати кто знает какой датчик магнитного поля можно подключать напрямую? Два дня ковыряния дали такие впечатления: Штука сложная со стороны матобработки первичных данных с датчиков. ПДФки можете даже не качать, безтолковые и не нужные, всё уже написано до нас, ищем и отбираем работоспособные библиотеки.
Принципиально есть два подхода - получаем сырые данные с датчиков по I2C и сами обрабатываем жуткой матиматикой типа фильтра калмена или кватернионами, возможно и фильтры попроще сгодятся, ищите MPU6050_raw.ino и прикручивайте математику к нему сами. Второй подход - используем DMP, это спецпроцессор внутри датчика уже спрятан. Он сам общитает c первичными датчиками, общитывает их и выдает по I2C более гладкие данные, их тоже можна обработать, например выделить чистое ускорение, без гравитации, и это уже намного проще. Проблема в том, что код в DMP надо самим залить при инициализации, его код - не опенсорс 8) Не пугаемся, гуглим MPU6050_6Axis_MotionApps20.h или аналоги и MPU6050.ino. Там все есть, и код и инит. Откомпилировано это все занимает в раене 20кбайт. Еще в любом случае нужны либы на I2C и MPU6050.h В сети их много, тока с ошибками. Найденая либка I2C делала все, даже DMP заливала корректно, все работало, попробовал откалибровать - попа. Оказалось word не правильно передает, и при записи офсета тока старший байт пишется 8х. В общем ищите в сети, отлаживайте, писать самому не надо. Еще MPU6050_raw.ino работает без прерываний а MPU6050.ino через прерывания, хоть и странноватенько. Только взводится флажек старта в обработчике, а прием из основного цикла.
Про ДХО - это мысль! Можна даже на двигатель ставить датчик и ловить скопом все - вибрацию, ускорения и повороты. Если есть чтото - едем и светим. К тому же в интерфейсах мелькала настройка параметров для детектирования движения. И даже вроде как можно прерывание генерить по такому случаю. Тогда работа сильно упростится. Может попробую завтра.
Еще по подключению. В сети бурление по поводу того, что сабж на 3.3В и подключать напрямую на 5В низзя. Игнорте, подключайте, выдыхайте работает без проблем.
Поделитесь рабочими либами
Да пожалуста - https://cloud.mail.ru/public/6f54703223ff%2FMPU6050.ZIP. Как уже писал, либы не мои, только I2Cшную поковырял малость. Вопрос по ходу. Цеплять такое - http://www.dx.com/p/three-axis-magnetic-field-electronic-compass-sensor-module-for-arduino-148734#.VCSDHMYz_nM к сабжу никто не пробовал?
Спасибо. Попробую сегодня
А то мне попадаются библиотеки, у них небольшой дреф по оси Z
Так с осью Z у всех всегда плохо. (Если не про линейное ускорение говорить) В общем и с другими осями на самом деле не лучше, но там дрейф нуля можно компенсировать по данным о векторе силы тяжести. Пошаманив матиматикой дрейф нуля сводится на нет. А по Z так не получится, нужен еще какой вектор не паралельный оси Z. Как вариант - магнитное поле земли. Собственно потому и спрашивал выше про датчик магнитного.
Понял, спасибо
UPD выложили здесь: http://carduino.ru/product_info.php?products_id=1954
Привет! не сочтите за некропостера, но у меня проблема с тем же самым модулем GY-521. подключился я к нему вроде правильно, адрес 0х68, прочитал его ячейки, всё вроде как в даташите, смог записать, тоже всё норм, отправил 0х00 в адрес 0х6В слип офф, но у меня по прежнему нули в ячейках с 0х3В до 0х48. и почему то по адресу 0х3А значение 0х01, хотя прерывания не включал. и еще, сразу после прошивки в ячейках с 0х3В до 0х48 вроде какие то значения появляются, но не меняются, а залипают, а при снятии и подаче питания всегда там нули, пока снова не прошьёшь. подозреваю брак гироскопа, но вдруг нет? помогите если кто может
С осью Z вряд ли что-то получится. А для других показаний отлично работает фильтр Калмана! Я находил где-то пример скетча, с фильтром вообще идеально.
robomaker, а arduino видит этот датчик? Эта утилитка его находит? http://playground.arduino.cc/Main/I2cScanner
Так я и говорю, с датчиком удалось связаться как на чтение, так и на запись, просто как то не корректно сам датчик сообщает искомые 14 байт гиро+температуру+аксель. они либо нули, либо рандомные значения застывшие. при этом я могу менять и проверять регистр who i am и повер менеждмент 1, который я ставлю в 0. я не ардуиной пользуюсь, а просто атмегой32, но сути это не меняет.
всё, я разобрался, горелые микросхемы вся партия попалась
Подскажите,есть ли у кого опыт управления какой-либо нагрузкой,в зависимости от угла? Ну например в том же роботе который на колесах балансирует.Я вот подрубил GY-521 нашел библиотеки и скетч вот отсюда http://arduinoprojects.ru/2014/10/%D0%BF%D0%BE%D0%B4%D0%BA%D0%BB%D1%8E%D1%87%D0%B5%D0%BD%D0%B8%D0%B5-%D0%B3%D0%B8%D1%80%D0%BE%D1%81%D0%BA%D0%BE%D0%BF%D0%B0-gy-521-mpu-6050-%D0%BA-arduio/
как мне использовать нагрузку? Пробовал так:если угол больше 180 например,то плавно загорается диод,и чем ближе к 270,тем ярче,и нааборот. Не работает,виснет,начинает вроде работать потом виснет всё.
Пробовал скетч с оф сайта ардуино http://playground.arduino.cc/Main/MPU-6050#info,там тоже ничего не работает ,какие-то глюки ,цикл виснет и всё.
Может как-то надо по другому?Нигде что-то не найду ничего по этому поводу.
цеплял сервопривод, при повороте модуля он тоже поворачивался, каких либо особенностей нет.
Добрый день!
Ребят, возникла проблема с GY-521.
Arduino DUE плата
Подключаю вот так:
VCC-5v
GND-GND
SCL-SCL(21)
SDA-SDA(20)
Загружаю скетч, который описан на http://playground.arduino.cc/Main/MPU-6050 и уже обсуждался в самом первом сообщении
На выходе имеется постоянный повтор данных, которые ни фига не меняются, как платку не крути.
Кто-нибудь в курсе, как это пофиксить?
И вот ещё вопрос:
Вот тут подключается сабж, всё работает.
http://arduinoprojects.ru/2014/10/подключение-гироскопа-gy-521-mpu-6050-к-arduio/
Что за значения показываются на экране?
Это метры в секунду^2, линейные скорости, что это за цифры?
Спасибо большое, очень хороший пример, я хоть и не разобрался в нём до конца, но он натолкнул меня на "правильную" мысль... теперь осталось узнать как задаются режимы измерений гироскопа (в документации написано что их 4: ±250, ±500, ±1000, and ±2000°/sec)
мне тоже очень хочется узнать ответ на этот вопрос. люди!! помогите пожалуйста!!! 250 град/с ну ооочень мало. если в руке вертеть - показания зашкаливают(((
учите физику, например юлу:)
FS_SEL=0 ±250 º/s
FS_SEL=1 ±500 º/s
FS_SEL=2 ±1000 º/s
FS_SEL=3 ±2000 º/s
http://www.seeedstudio.com/wiki/images/b/b1/MPU6050.pdf
http://www6.in.tum.de/pub/Main/TeachingWs2015SeminarAuonomousFahren/RM-MPU-6000A.pdf
https://code.google.com/p/multiwii/source/browse/branches/Modular_MWC/MPU6050_module/MPU6050.ino?r=791
мм, т.е. я должен послать команду на сам гироскоп..
попробовал написать эту команду в сетапе - он выдал ошибку про MPU6050_ADDRESS, что нет такого.
вставил вместо MPU6050_ADDRESS собственно I2c-адрес гировскопа - 0x68
в итоге другая ошибка:
что я делаю не так? и как, допустим, мне указать FS_SEL=2 или 1, а не 3?
использую скетч примера MPU6050_raw
я отсюда увидел, что чтобы изменить конфигурацию, нужно записать в гироскопе по адресу 0x1B значение 0x18, что в двоичном виде выглядит как 00011000 (где единицы, там собственно и FS_SEL сидит... так вот. если взять средние единицы, то я думаю, что будет следующая картина:
я правильно понимаю?
тогда на пол-вопроса я ответил сам.. вот только как ошибку исправить?(((
на это
компилятор ругается..
не помогает
если что, код вот:
accelgyro.setFullScaleGyroRange(MPU6050_GYRO_FS_2000);
Все уже написано до нас :(
Спасибо огромное) эта команда работает!) А можно подробнее, где вы взяли эту команду? Ткните меня носом, где эти команды описаны, буду очень признателен)
От золотой вопрос! Я заходя в тему как раз думал о том, что надо бы не искать самому а рассказать как найти.
В общем рассуждаем так: оно гдето есть! мы оптимисты, ищем не чтото очень оригинальное а способ сконфигурировать MPU6050. Такие штуки должны быть на 99%. Логично его искать в либке соответствующей. Все либы у меня лежат d:\arduino-1.0.6\libraries\.. И MPU6050 там же. Любая либа содержит файл *.h с именем совпадающим с именем либы. Т.е. искать будем в d:\arduino-1.0.6\libraries\MPU6050\MPU6050.h. Признаки по которому ищем это текст "GYRO_GONFIG", его части "GYRO", "GONFIG" , ну и на худой конец - "0x1B". Дальше любимым способом поиска - я тоталкомандером, поиском в файле ищем упоминание нужного. Ожидаем чтото начинающееся на "set" "ini" "load". И внимательно смотрим на найденное. Мне попалось MPU6050_GYRO_FS_250. А значение 250 мне встречалось у вас, и рядом лежит требуемое MPU6050_GYRO_FS_2000! Ок. Осталось найти куда его пихать. Опять поиск по файлам, ищем где встречается"MPU6050_GYRO_FS_" но уже по всему каталогу MPU6050, находим в mpu6050.cpp такое
void MPU6050::initialize() {
слишком подробно, но огромное спасибо)
всем привет , порыля по инету нашёл как минимум 4 скетча на этот гироскоп , но вот в чём прикол , сначало просто проверил модуль этим скетчем.
Всё было прекрасно , скетч работал , ардуина получала данные , но я использовал его просто для проверки , спустя месяца 3 , наконец решил использовать его , но скетч уже не работал , в мониторе порта выяснилось , что данные посылаются от балды.
Нашул другой светч , и данные снова посыпались , всё было хорошо , но пока я с ним разбирался , он перестал работать. (к не счастью посеял исходник).
Решил загрузить пример калмана для проверки и появилась вот эта ошибка , exit status 1
'i2cWrite' was not declared in this scope , при компеляции.
Может кто обьяснить , как от этого избавится ?
Предложение выкинуть гироскоп временно не расматриваю.
Чтобы не плодить новую тему
Имеется сабжевый гироскоп, подключенный к Pro Mini 3.3V 8 MHz (пробовал также 5V 16 mHz).
GND-GND
VCC-VCC
SDA-A4
SCL-A5
Код:
смысл в чем - в горизонтальном положении i равно 150-152, при малейшем отклонении на любую ось значение i уменьшается, при этом выдается соответствующее сообщение в Serial,+ мыргает ламочка, и как только гироскоп возвращается в горизонталь - ламочка тухнет. Так вот - это все идеально работает, когда ардуина подключена к USB - все просто изюмительно. Но если подключить ардуину к батарейке (+ на RAW и - на GND) - то гироскоп не отрабатывает (сразу начинает моргать лампочкой, как будто значение i меньше 150. Подключенный "на горячую" разъем USB показывает, что значение i=0). При этом если стартовать через USB, потом подключить батарею, и потом отключить USB - то все работает корректно. В чем может быть затык?
Внешнее питание - 3,7В, 4.2 В, 8.4 В, 9 В. - результат одинаков.
Вопрос снят. Дело было не в батарейке и не в пайке. Оказалось, что почему-то не сбрасывался гироскоп после отключения и обратного включения питания от батареи. Если после включения от батареи нажать ресет - то потом все корректно работает. Добавил функцию программного ресета в код - все заработало.
есть мысль сделать автосигнализацию на этом модуле. то есть защиту от поддомкрачивания авто, угона и как датчик удара.
модуль еще не купил. насколько точно гироскоп может уловить изменение ?
и может ли акселерометр фиксировать вибрацию от ударов ?
и заранее чтобы не молотить горы материала, какую бибилиотеку проще взять за основу?
я настраивал на фиксацию любого изменения положения относительно горизонта. Шкала чувствительности достаточно гибкая, на доли градусов реагирует. Могу скинуть скетч в ЛС с описанием чего оно и как делает
AlexAxel, скиньте плз
2 harbor
недоступна отправка ЛС, видимо, не заслужил пока ))
короче - код в моем сообщении выше можно брать за основу
суть в чем: у датчика есть параметры, которые постоянно отслеживают положение датчика относительно горизона (те, которые начинаются на Ас). Если правильно горизонтировать датчик - то будет иметься постоянное значение по всем трем осям, для оси Z - это значение 0 при горизонтировании датчика "мордой вниз (когда пины для подключения торчат вверх)", и 15600 - при горизонтировании "мордой вверх". При изменении положения относительно горизонта в любом направлении достаточно учитывать изменения , которые принимает значение параметра AcZ. Изменения параметров АсХ и АсY интересны только в том случае, когда надо отследить наклон в определенную сторону. У меня значение параметра датчика делится на 100 перед обработкой (т.е. я оперирую значениями от 0 до 156, мне подобной точности достаточно), и датчик я располагаю "мордой вверх", т.е. горизонтальное значение - 156. И если его наклоняют так, что AcZ падает ниже 150 - то загорается ламочка. это примерно 4-5 градусов отклонение
Итак, в вашем случае достаточно выбрать, в каком положении датчик будет находиться (пинами вверх или вниз), и в вышеприведенном скетче подставить действия при изменении, вместо мырганья лампочки, ну и чувствительность подобрать, соответственно.
Параметры Gy* лучше не использовать, т.к. они в состоянии покоя равны 0, изменяются в момент наклона, а потом снова на 0 возвращаются. Т.к. домкрат слишком плавная штука, то изменения положения датчиком вряд ли учуются. Зато сильный порыв ветра может качнуть машину, и будет сработка
короче - код в моем сообщении выше можно брать за основу
Прощу прощения у ТС за то, что влез в его тему, но вопрос также по GY521.
Уважаемый AlexAxel, Ваш код работает, только чуть попробовал увеличить чувствтельность - все нравится. Вот вопрос в следующем: как к данному коду "прикрутить" обнуление горизонта при включении питания устройства. Другими словами, не всегда получается установить объект (автомобиль) в горизонтальной плоскости. Нужно заставить датчик считать свое положение в момент загрузки программы в МК и уже это положение использовать как "0". Это возможно? Если да - то прошу помочь мне с этим, т.к. у меня не хватает ума на "борьбу" с данным девайсом.
Реально ли использовать модуль для работы только в двух осях - крен и тангаж? В общем, относительно линии горизонта, вертикально и вокруг горизонтальной линии модуля, идущей в горизонт?
Второй вопрос, нет готовых примеров с выводом в привычные градусы?)
Спасибо
Реально ли использовать модуль для работы только в двух осях - крен и тангаж? В общем, относительно линии горизонта, вертикально и вокруг горизонтальной линии модуля, идущей в горизонт?
Второй вопрос, нет готовых примеров с выводом в привычные градусы?)
Спасибо
Logik, доброго дня! Хотел спросить у товарища Logik, способ подключения внешнего магнитометра к MPU-6050. Какие флаги нужно выставить чтобы DMP считывал как мастер с второго I2C данные магнитометра. А после высчитывал и устранял дрейф оси Z. И нужно ли вообще это и возможно ли вообще это? Я к тому что на зарубежных сайтах пишут что это не работает. А если так , то куда смотреть!?) Где найти код который подправит Гироскоп и акселерометр с помощью магнитометра?
А я так и не подключил. Но что помню - к XCL и XDA магнетометр подключается. Это по факту шина i2c. И использовать правильный DMP с поддержкой магнитометра, такие попадались вроде.
Logik, доброго времени!) А можете подсказать как имея на руках все углы и магнитные данные устранить дрейф по оси Z? Я имею в виду при помощи центрального процессора, тако как Atmega на ардуине. Какие интегралы почитать?)
Logik, доброго времени!) А можете подсказать как имея на руках все углы и магнитные данные устранить дрейф по оси Z? Я имею в виду при помощи центрального процессора, тако как Atmega на ардуине. Какие интегралы почитать?)
фнч по компасу + фвч по гироскопу
rkit, прошу прощения, расскажите пожалуйста по подробнее про фнч и фвч. Это абревиатура чего? И как с помощью этого можно решить данную проблему? :)
rkit, как я понимаю это фильтры низких чатсот и высоких частот? Но как эти фильтры могут мне помочь? Дело в том что я нашел очень хороший код с точным расчётом, но у него есть дрейф по оси Z. Это по Гиро и акселерометру. Что по магнитометру, то он выдает разные данные на осях от -2000 или -1500 до 1500 или 2000. Это не важно. Главное это точность повторяемости, а она оч хорошая. И как имея эти данные вернуть потерянные 10 градусов на вычислениях акселерометра и гироскопа?(достаточно запустить и угол начинает плыть по пол градуса в пару секунд, пошевелить и он начинает уже по два градуса бежать, хотя устройство без движения) Я бы рад поискать сам, но я даже не знаю куда тыкнутся. По какой теме податься не знаю.
Дрейф гироскопа это низкочастотная помеха, шум компаса это высокочастотная. Отбрасываешь от каждого соответствующую помеху, совмещаешь результат, получаешь большую точность. За пять минут с гуглом ты теорию не изучишь, на это нужны месяцы.