Официальный сайт компании Arduino по адресу arduino.cc
Акселеромето mma7361 "сбиваются показания"
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 06/07/2015 - 10:52
Добрый день!
Про акселерометр думаю можно уже не рассказывать за исключением одного, в состоянии покоя он определяет своё положение относительно 3ёх осей. Суть вопроса вот в чём - после калибровки (ниже укажу как это делаю) он показывает 0 +/- 2, 3 единицы, но если его пошатать туда-сюда, понакланять, то показания улетают аж на 15-20 единиц в + или - .. это косяк моей калибровки или всё же косяк датчика?
Вот код
#include <AcceleroMMA7361.h> AcceleroMMA7361 accelero; int x; // положение по x int y; // положение по y int z; // положение по z int repeat = 500; // количество опросов для калибровки int dx = 0; // калибровочные значения int dy = 0; // калибровочные значения int dz = 0; // калибровочные значения //############################################# // функция калибровки void calibr() { long cx = 0; // полученные значения (сумма) long cy = 0; // полученные значения (сумма) long cz = 0; // полученные значения (сумма) int count = 0; // количество проходов Serial.print("Calibrate"); for (count = 0; count < repeat; count++) { cx = cx + accelero.getXRaw(); cy = cy + accelero.getYRaw(); cz = cz + accelero.getZRaw(); delay(10); } dx = cx / count; // находим среднее значение dy = cy / count; // находим среднее значение dz = cz / count; // находим среднее значение } //############################################# void setup() { Serial.begin(9600); accelero.begin(13, 12, 11, 10, A0, A1, A2); // подключаем акселерометр "SL - вывод из спячки", "ST - self test", "0G - чо-то вроде нулевого горизонта вроде", "GS - G select", "X", "Y", "Z" accelero.setSensitivity(HIGH); // установка чувствительности // accelero.calibrate(); calibr(); // калибруем мега-способом =D } void loop() { x = accelero.getXRaw() - dx; // значения с поправками y = accelero.getYRaw() - dy; // значения с поправками z = accelero.getZRaw() - dz; // значения с поправками Serial.print("\nx: "); Serial.print(x); Serial.print("\ty: "); Serial.print(y); Serial.print("\tz: "); Serial.print(z); delay(100); }
а может я подключил что не так ... да, кстати я его к 5v подключил, если это имеет значение)))
https://otvet.mail.ru/question/84404872
Или пошире https://www.google.ru/?gws_rd=ssl#newwindow=1&q=%D0%B0%D0%BA%D1%81%D0%B5...
Если я правильно понял на выходе идет аналоговый сигнал. собственно 15-20 единиц для ардуиновской ацп нормальная точность особенно если подключать навесным монтажом. А вот питание сомневаюсь что правильное - у него по даташиту 2.2-3.6 вольт разброс.
Какая у вас выбрана точность? В любом случае следует обратить внимание на изменение опорного напряжения ацп.
trembo
Оч полезно, как же я жил без этого .... повнимательней прочитайте мой текст в начале плз!
nevkon
Да, вот что до "шатаний" и "наклонов"
а вот так после в состоянии покоя
напряжение-то на ацп не меняется в момент вращения (((
если выполнить сброс и датчик опять откалибруется - всё ок ..
Да, дополню - сбивается если делать резкие движеня ... т.е. всё-таки сам датчик ((( интересно есть-ли лекарство от этого? Или может знает кто аналог с олее стабильной работой?
Акселерометр измеряет ускорение
Гироскоп измеряет положение в пространстве.
3-х осевой акселерометр MMA7361(MMA7260)
Измеряет как ускорение так и углы по осям X,Y,Z
Воспринимает силу тяжести как ускорение.
Поэтому по направлению этой силы можно более-менее достоверно знать угол наклона микросхемы относительно земли
Более-менее достоверно....... вот вы и измеряете, по-моему.....
trembo
Да, всё так, но даже если я возьму макетку и покатаю по столу с пол минутки (т.е. задействую именно акселерометр) и потом оставлю лежать - все показания так же сбиваются .. (((
Незнаю как там работает акселерометр, но опорное напряжение, при питании от усб не стабильное. скочат показания аналоговых температурных датчиков, потенциометров и т.д. необходимо или использовать внутреннее опорное 1.1в или подать на плату (Vin) больше 7 вольт. В первом случае входное напряжение на аналоговом входе не должно превышать 1.1в. Вариант с внешним опорным не рассматриваю, никчему это )
Ускорение насколько я помню из школы - изменение скорости за единицу времени
G= 9,81 метр делённое на секунду в квадрате.
Акселерометр как раз и измеряет G
Гироскоп показывает угол наклона по трём осям к какому-то начальному ( например горизонталь-вертикаль-поворот)
Roll, Yaw, Pitch http://allrcflight.com/airplane-turning-tendencies/
Конечно, с помощью акселерометра и какой-то там математики можно посчитать, примерно посчитать, эти углы в пространстве,
но с каждым пересчётом ошибка будет накапливаться.
Я так думаю это вы и наблюдаете
Кстати несколько лет назад баловался с wii ( вроде так звали), он тоже что-то показывал похожее на правду.
A Jeka_TM вроде даже танк на нём сделал....
Стандартный пример тоже пробовали? Он также работает?
Да, стандартный так же ...
bsdshneg, что делает калибровка?
Пытается измерить вектор g и вычесть его из последующих показаний?
А Вы уверены, что после того, как Вы немного подвигали прибор, его наклон относительно горизонта не изменился? Если изменился, после вычитания старого g вы получаете не только шум, а шум + разницу старого и нового векторов.
Судя по приведенной таблице именно это у Вас и происходит.
andriano
Вот и мне кажется, что где-то "накапливается" ошибка и она в итоге и выдаёт такую разницу ... суть калибровки в вычислении среднего значения за Х количество раз и минусует это значение для выведения нуля ... если есть "правильная" калибровка - буду рад увидеть/понять )))
угу, покатаю, покидаю и потом буду удивляться что это оно все дребезжит и ошибки накапливает.
один адепт церкви Синей Изоленты тут датчики в гирлянды собирал.. и мучил всех почему как только 5 датчик примотает ( паяльников он боялся) так все сразу глючит и не читается.
Puhlyaviy
Есть конструктивные предложения? Флуд я тоже разводить могу!
Puhlyaviy
Есть конструктивные предложения? Флуд я тоже разводить могу!
А вы не видите предложения? Прочитайте еще несколько раз, до полного понимания.
Puhlyaviy
То что было написано выше, я уже увидел, за что авторам постов огромное спасибо, а это я обращался именна к Вам!
Puhlyaviy
То что было написано выше, я уже увидел, за что авторам постов огромное спасибо, а это я обращался именна к Вам!
Так вы мой пост и перечитывайте до полного понимания.
Puhlyaviy
То что было написано выше, я уже увидел, за что авторам постов огромное спасибо, а это я обращался именна к Вам!
Я прям прозрел от такого .. огромное спасибо! =D
Ну если вам не очевидно, что вы используете аналоговый сенсор который подсоединяете через бредборд. И потом все это трясете. И ожидаете точности и стабильности... ну тогда конечно продолжайте гадать о скачках в показаниях.
попробуйте теорию заговора применить
Блин, вот зза это спасибо!!! .... что-то и не подумал ...
Не пробовали калибровать "периодически" ... есть такое понятие как скольжение нуля, со временем уплывать может. Насколько сильно? да фиг его знает как оно в этом датчике.
Хочу заказать вот такой - GY 521
а по этому акселерометру вот что получилось http://www.youtube.com/watch?v=J3klz8BcvJs делал из разряда "чисто поржать" из подручных материалов, так что не судите строго ))))))))))))
andriano
Вот и мне кажется, что где-то "накапливается" ошибка и она в итоге и выдаёт такую разницу ... суть калибровки в вычислении среднего значения за Х количество раз и минусует это значение для выведения нуля ... если есть "правильная" калибровка - буду рад увидеть/понять )))
У меня создается впечатление, что Вы калибруете не сам датчик, а его текущее положение. Соответственно, как только датчик сдвигается, его положение изменяется и калибровка нарушается.
Никакого накапливания ошибки не происходит, просто калибровка нарушается в тот момент, когда Вы сдвигаете датчик с места.
https://www.google.ru/?gws_rd=ssl#newwindow=1&q=self+balancing+robot+ard...
ссылка на видео
Я использую в этой конструкции акселерометр MMA7361. С "показаниями" тоже возникаю проблемы...
Я в исходной точке калибрую акселерометр, затем сдвигаю пластину до изменения значения по оси Х до 80.
И после небольшой паузы мне нужно вернуть пластину назад, до нулевых значений при калибровке. И в этой точке двигатель должен остановиться.
И если с первой частью (код выше) нет никаких проблем, то с возвращением в исходную точку, а точнее с остановкой в исходной точке, они возникают. Причём, в монитор порта выводятся подходящие данные (близкие к начальным при калибровке), но условие для остановки "не срабатывает"... Поэтому (надеюсь, что пока) добавил в условие выхода из цикла дополнительное условие остановки по другому датчику, а мне очень надо это реализовать по акселерометру.
Помогите, пожалуйста! Почему условие
(AcceleroLevgolen.getXAccel() >= 0)
в цикле while не срабатывает?Решил проблему с помощью "старого-доброго" акселерометра MMA7361.
Осталось отфильтровать шум, появляющийся в движении, фильтром Кальмана...
А какую максимальную перегрузку параметр G может измерять данный акселерометр ?