Акселеромето mma7361 "сбиваются показания"

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Добрый день!

Про акселерометр думаю можно уже не рассказывать за исключением одного, в состоянии покоя он определяет своё положение относительно 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);
}

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

а может я подключил что не так ... да, кстати я его к 5v подключил, если это имеет значение)))

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
nevkon
Offline
Зарегистрирован: 20.01.2015

Если я правильно понял на выходе идет аналоговый сигнал. собственно 15-20 единиц для ардуиновской ацп нормальная точность особенно если подключать навесным монтажом. А вот питание сомневаюсь что правильное - у него по даташиту 2.2-3.6 вольт разброс.

nevkon
Offline
Зарегистрирован: 20.01.2015

Какая у вас выбрана точность? В любом случае следует обратить внимание на изменение опорного напряжения ацп.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

trembo

Оч полезно, как же я жил без этого .... повнимательней прочитайте мой текст в начале плз!

bsdshneg
Offline
Зарегистрирован: 21.10.2014

nevkon

Да, вот что до "шатаний" и "наклонов"

x: 3	y: 2	z: 7
x: 1	y: -2	z: 5
x: 1	y: -1	z: 5
x: 2	y: 0	z: 7
x: 2	y: 2	z: 5
x: 0	y: -1	z: 4
x: 3	y: 0	z: 2
x: 2	y: 2	z: 5
x: 2	y: -1	z: 4
x: 2	y: 1	z: 4
x: 0	y: 1	z: 3
x: 3	y: 3	z: 5
x: 3	y: 2	z: 4
x: 2	y: 0	z: 4
x: 1	y: 1	z: 5
x: 3	y: 3	z: 4

а вот так после в состоянии покоя

x: -22	y: -22	z: -21
x: -20	y: -20	z: -18
x: -25	y: -22	z: -21
x: -25	y: -22	z: -19
x: -23	y: -21	z: -18
x: -23	y: -23	z: -20
x: -24	y: -22	z: -21
x: -23	y: -22	z: -19
x: -24	y: -21	z: -20
x: -22	y: -21	z: -19
x: -24	y: -21	z: -21
x: -22	y: -21	z: -25
x: -23	y: -25	z: -21
x: -22	y: -23	z: -20
x: -23	y: -22	z: -21
x: -21	y: -20	z: -21
x: -21	y: -20	z: -18
x: -25	y: -20	z: -20
x: -21	y: -21	z: -19
x: -21	y: -20	z: -19
x: -22	y: -20	z: -18
x: -23	y: -21	z: -19
x: -23	y: -22	z: -20
x: -22	y: -23	z: -21

напряжение-то на ацп не меняется в момент вращения (((

если выполнить сброс и датчик опять откалибруется - всё ок .. 

 

Да, дополню - сбивается если делать резкие движеня ... т.е. всё-таки сам датчик ((( интересно есть-ли лекарство от этого? Или может знает кто аналог с олее стабильной работой?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Акселерометр измеряет ускорение

Гироскоп измеряет положение в пространстве.

3-х осевой акселерометр MMA7361(MMA7260)
Измеряет как ускорение так и углы по осям X,Y,Z
Воспринимает силу тяжести как ускорение.
Поэтому по направлению этой силы можно более-менее достоверно знать угол наклона микросхемы относительно земли

Более-менее достоверно....... вот вы и измеряете, по-моему.....

 

bsdshneg
Offline
Зарегистрирован: 21.10.2014

trembo

Да, всё так, но даже если я возьму макетку и покатаю по столу с пол минутки (т.е. задействую именно акселерометр) и потом оставлю лежать - все показания так же сбиваются .. (((

Focus
Offline
Зарегистрирован: 05.04.2015

Незнаю как там работает акселерометр, но опорное напряжение, при питании от усб не стабильное. скочат показания аналоговых температурных датчиков, потенциометров и т.д. необходимо или использовать внутреннее опорное 1.1в или подать на плату (Vin) больше 7 вольт. В первом случае входное напряжение на аналоговом входе не должно превышать 1.1в. Вариант с внешним опорным не рассматриваю, никчему это )

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Ускорение насколько я помню из школы  - изменение скорости за единицу времени   
G= 9,81 метр делённое на секунду в квадрате.
Акселерометр как раз и измеряет G

Гироскоп показывает угол наклона по трём осям к  какому-то начальному ( например горизонталь-вертикаль-поворот)
Roll,  Yaw,  Pitch   http://allrcflight.com/airplane-turning-tendencies/

Конечно, с помощью акселерометра и какой-то там математики можно посчитать, примерно посчитать, эти углы в пространстве,
но с каждым пересчётом ошибка будет накапливаться.
Я так думаю это вы и наблюдаете
Кстати несколько лет назад баловался с wii ( вроде так звали), он тоже что-то показывал похожее на правду.
A Jeka_TM вроде даже танк на нём сделал....

nevkon
Offline
Зарегистрирован: 20.01.2015

Стандартный пример тоже пробовали? Он также работает?

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Да, стандартный так же ...

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

bsdshneg, что делает калибровка?

Пытается измерить вектор g и вычесть его из последующих показаний?

А Вы уверены, что после того, как Вы немного подвигали прибор, его наклон относительно горизонта не изменился? Если изменился, после вычитания старого g вы получаете не только шум, а шум + разницу старого и нового векторов.

Судя по приведенной таблице именно это у Вас и происходит.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

andriano

Вот и мне кажется, что где-то "накапливается" ошибка и она в итоге и выдаёт такую разницу ... суть калибровки в вычислении среднего значения за Х количество раз и минусует это значение для выведения нуля ... если есть "правильная" калибровка - буду рад увидеть/понять )))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bsdshneg пишет:
я возьму макетку

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

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Puhlyaviy

Есть конструктивные предложения? Флуд я тоже разводить могу!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bsdshneg пишет:

Puhlyaviy

Есть конструктивные предложения? Флуд я тоже разводить могу!


А вы не видите предложения? Прочитайте еще несколько раз, до полного понимания.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Puhlyaviy

То что было написано выше, я уже увидел, за что авторам постов огромное спасибо, а это я обращался именна к Вам!

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

bsdshneg пишет:

Puhlyaviy

То что было написано выше, я уже увидел, за что авторам постов огромное спасибо, а это я обращался именна к Вам!


Так вы мой пост и перечитывайте до полного понимания.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Puhlyaviy пишет:
bsdshneg пишет:

Puhlyaviy

То что было написано выше, я уже увидел, за что авторам постов огромное спасибо, а это я обращался именна к Вам!

Так вы мой пост и перечитывайте до полного понимания.

Я прям прозрел от такого .. огромное спасибо! =D

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

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

bsdshneg
Offline
Зарегистрирован: 21.10.2014

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

 

Блин, вот зза это спасибо!!! .... что-то и не подумал ...

Arhat109
Offline
Зарегистрирован: 26.05.2015

Не пробовали калибровать "периодически" ... есть такое понятие как скольжение нуля, со временем уплывать может. Насколько сильно? да фиг его знает как оно в этом датчике.

bsdshneg
Offline
Зарегистрирован: 21.10.2014

Хочу заказать вот такой - GY 521

а по этому акселерометру вот что получилось http://www.youtube.com/watch?v=J3klz8BcvJs делал из разряда "чисто поржать" из подручных материалов, так что не судите строго ))))))))))))

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

bsdshneg пишет:

andriano

Вот и мне кажется, что где-то "накапливается" ошибка и она в итоге и выдаёт такую разницу ... суть калибровки в вычислении среднего значения за Х количество раз и минусует это значение для выведения нуля ... если есть "правильная" калибровка - буду рад увидеть/понять )))

Вы определитесь, что именно Вы собираетесь калибровать.

У меня создается впечатление, что Вы калибруете не сам датчик, а его текущее положение. Соответственно, как только датчик сдвигается, его положение изменяется и калибровка нарушается.

Никакого накапливания ошибки не происходит, просто калибровка нарушается в тот момент, когда Вы сдвигаете датчик с места.

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011
Perdimonocle
Offline
Зарегистрирован: 19.10.2012

ссылка на видео

Я использую в этой конструкции акселерометр MMA7361. С "показаниями" тоже возникаю проблемы...

Я в исходной точке калибрую акселерометр, затем сдвигаю пластину до изменения значения по оси Х до 80.

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

do
  {
    motorA.runReverse(35);
    delay(100);
    X_levgolen = AcceleroLevgolen.getXAccel();
    Y_levgolen = AcceleroLevgolen.getYAccel();
    Z_levgolen = AcceleroLevgolen.getZAccel();
    Serial.print("\nx: ");
    Serial.print(X_levgolen);
    Serial.print(" \ty: ");
    Serial.print(Y_levgolen);
    Serial.print(" \tz: ");    
    Serial.print(Z_levgolen);
    Serial.print("\tG*10^-2");
  } while (AcceleroLevgolen.getXAccel() <= 80); 
  delay(100); 
  motorA.stop();   
  delay(1000); 

И если с первой частью (код выше) нет никаких проблем, то с возвращением в исходную точку, а точнее с остановкой в исходной точке, они возникают. Причём, в монитор порта выводятся подходящие данные (близкие к начальным при калибровке), но условие для остановки "не срабатывает"... Поэтому (надеюсь, что пока) добавил в условие выхода из цикла дополнительное условие остановки по другому датчику, а мне очень надо это реализовать по акселерометру.

do
  {
    motorA.runForward(35);
    delay(50);
    X_levgolen = AcceleroLevgolen.getXAccel();
    Y_levgolen = AcceleroLevgolen.getYAccel();
    Z_levgolen = AcceleroLevgolen.getZAccel();
    Serial.print("\nx: ");
    Serial.print(X_levgolen);
    Serial.print(" \ty: ");
    Serial.print(Y_levgolen);
    Serial.print(" \tz: ");    
    Serial.print(Z_levgolen);
    Serial.print("\tG*10^-2");
  } while ((AcceleroLevgolen.getXAccel() >= 0) || (digitalRead(IKlevkoleno) == LOW));
  delay(500); 
  motorA.stop();   
  delay(2500); 

Помогите, пожалуйста! Почему условие (AcceleroLevgolen.getXAccel() >= 0) в цикле while не срабатывает?

Perdimonocle
Offline
Зарегистрирован: 19.10.2012

Решил проблему с помощью "старого-доброго" акселерометра MMA7361.

Осталось отфильтровать шум, появляющийся в движении, фильтром Кальмана...

Ardfun
Offline
Зарегистрирован: 22.05.2016

А какую максимальную перегрузку параметр G может измерять данный акселерометр ?