| AVR Раздел по микроконтроллерам компании Atmel - AVR / ATtiny / ATmega / ATMega128 / ATxmega, вопросы по программированию в AVR studio и все, относящееся к AVR... |
Как считать данные с гироскопа MPU-6050?
17.06.2016, 18:30
|
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от Kopranych
|
|
Да а как их привести к явным значениям? Видел примеры вывода значений, у многих показаны еще с минусом значения как это преобразовать?
|
Минус означает, что ускорение направлено в обратную сторону относительно оси датчика.
Например, ось Z смотрит вниз (от "крышки" к дорожкам), тогда, перевернув датчик, Вы получите ОТРИЦАТЕЛЬНОЕ значение.
Так же и по другим осям.
› Да а как их привести к явным значениям?
Перемножить на значение шкалы в текущем режиме. Вроди бы, я ясно ответил на этот вопрос ДО того, как он был задан.
Нет?
›› В инструкции описано, что данные - это сырые значения и они зависят от "множителя" (или чувствительности) - это 250/500/1000/2000 градусов в секунду для гироскопа и 2/4/8/16g для акселерометра.
|
|
|
|
18.06.2016, 18:19
|
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от -Alan-
|
Минус означает, что ускорение направлено в обратную сторону относительно оси датчика.
Например, ось Z смотрит вниз (от "крышки" к дорожкам), тогда, перевернув датчик, Вы получите ОТРИЦАТЕЛЬНОЕ значение.
Так же и по другим осям.
› Да а как их привести к явным значениям?
Перемножить на значение шкалы в текущем режиме. Вроди бы, я ясно ответил на этот вопрос ДО того, как он был задан.
Нет?
›› В инструкции описано, что данные - это сырые значения и они зависят от "множителя" (или чувствительности) - это 250/500/1000/2000 градусов в секунду для гироскопа и 2/4/8/16g для акселерометра.
|
Почему же все-таки данные пляшут сами по себе, или это так и должно быть?
|
|
|
|
18.06.2016, 19:25
|
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от Kopranych
|
|
Почему же все-таки данные пляшут сами по себе, или это так и должно быть?
|
Что подразумевается под "пляшут"?
То что можно переключить предел измерений? Я прав?
Если так, то приведу простой пример:
У Вас есть вольметр на 1000 Вольт. Нужно изменить (точно) напряжение на пальчиковой батарейке.
А теперь есть прибор, в котором измерительный прибор - стрелочная головка. И ещё есть ручка выбора предела измерений... Дальше, надеюсь, поняли?

Вот Вам стрелка, которая может отклоняться на (в данном случае, +32767/-32768 делений), а цена деления зависит от положения "ручки" (в контексте MPU-6050 - значений регистров).
|
|
|
|
18.06.2016, 19:25
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от Kopranych
|
|
Да а как их привести к явным значениям?
|
Так же, как и тугрики АЦП. Определяется вес тугрика и умножается на измеренное количество.
Фильтров - вагон и маленькая тележка, на любой вкус. Гоголь в помощь.
Сообщение от Kopranych
|
|
данные пляшут сами по себе
|
А на сколько пляшут? А в процентах от шкалы?
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
18.06.2016, 21:23
|
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как считать данные с гироскопа MPU-6050?
|
|
|
|
18.06.2016, 21:29
|
|
|
Гуру портала
Регистрация: 06.05.2005
Адрес: Краснодар, возле укротворного моря.
Сообщений: 19,313
Сказал спасибо: 2,633
Сказали Спасибо 12,076 раз(а) в 6,082 сообщении(ях)
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от Kopranych
|
|
или я что то неправильно представляю
|
Напомню
Сообщение от akegor
|
|
А на сколько пляшут? А в процентах от шкалы?
|
А потом вопросы.
__________________
Не бейте больно, ежели чо, ну не удержался... А вааще,
"Мы за все хорошее, против всей х..., По лугам некошеным чтобы шли ступни,
Чтобы миром правила правда, а не ложь, Мы за все хорошее, нас не на...!
..." (Ленинград)
Я не несу ответственности за свои действия в Вашей голове.
|
|
|
|
18.06.2016, 21:48
|
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от akegor
|
Напомню
А потом вопросы.
|
Вот такие данные у меня идут, причем температуру раньше адекватно выводил где то 26 и реагировал на тепло и холод, а теперь просто 39...
И сами данные акселерометра и гироскопа непонятные
Последний раз редактировалось Kopranych; 18.06.2016 в 21:51.
|
|
|
|
19.06.2016, 07:22
|
|
|
Прописка
Регистрация: 05.12.2008
Адрес: Россия, Омск
Сообщений: 145
Сказал спасибо: 39
Сказали Спасибо 29 раз(а) в 22 сообщении(ях)
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от Kopranych
|
Да я понял вас на счет пределов измерений, а под словом пляшут я имею ввиду что модуль у меня лежит на столе в полном покое, а данные приходят по UART каждую итерацию разные т.е. как я себе представляю что если модуль в покое то и данные должны приходить одинаковые или я что то неправильно представляю
|
У меня тоже данные немного гуляют, это нормально.
Выше я уже говорил про фильтры, ибо у меня точно так же, поток данных достаточно хорошо прыгает.
Кстати, почему у Вас значения регистров только по одному байту? Они же 16-ти битные. И да, знаковые.
Посмотрите ещё раз мой пример - там я читаю 2 байта из регистров акселеромеитра и гироскопа, преобразовываю их в число и вывожу в консоль. У Вас почему-то только один байт и тот беззнаковый.
Плюс, я бы всё же добавил хотя бы фильтр со скользящим окном, чтобы получить тупейшее среднее значение.
|
Код:
|
int16_t avg_accel[16][3], avg_gyro[16][3]; // Объявляем 2-мерные массивы
int32_t avg_accel_summ[3], avg_gyro_summ[3];
‹...›
// После чтения данных из гироскопа и акселерометра:
avg_accel[i][0] = accel_raw_x;
avg_accel[i][1] = accel_raw_y;
avg_accel[i][2] = accel_raw_z;
avg_gyro[i][0] = gyro_raw_x;
avg_gyro[i][1] = gyro_raw_y;
avg_gyro[i][2] = gyro_raw_z;
i++;
if (i›15) i=0;
avg_accel_summ[0] = 0;
avg_accel_summ[1] = 0;
avg_accel_summ[2] = 0;
avg_gyro_summ[0] = 0;
avg_gyro_summ[1] = 0;
avg_gyro_summ[2] = 0;
for (j=0;j‹15;j++) {
avg_accel_summ[0] += avg_accel[j][0];
avg_accel_summ[1] += avg_accel[j][1];
avg_accel_summ[2] += avg_accel[j][2];
avg_gyro_summ[0] += avg_gyro[i][0];
avg_gyro_summ[1] += avg_gyro[i][1];
avg_gyro_summ[2] += avg_gyro[i][2];
};
avg_accel_summ[0] = avg_accel_summ[0] ›› 4;
avg_accel_summ[1] = avg_accel_summ[1] ›› 4;
avg_accel_summ[2] = avg_accel_summ[2] ›› 4;
avg_gyro_summ[0] = avg_gyro_summ[0] ›› 4;
avg_gyro_summ[1] = avg_gyro_summ[1] ›› 4;
avg_gyro_summ[2] = avg_gyro_summ[2] ›› 4;
// Получены средние значения за 16 выборок. |
Как пример. ОЧЕНЬ грубый псевдокод, но уровень шума будет ослаблен. Немного.
Хотите получать более стабильные данные - можете округлить несколько младших битов. Собственно, в выборке 24-битного АЦП приходится делать именно так, иначе последний байт можно даже не выводить на экран - он по большей части меняется. А после усреднения и удаления шумов - вполне можно.
|
|
|
|
19.06.2016, 11:32
|
|
|
Гуру портала
Регистрация: 27.10.2008
Адрес: ЕС
Сообщений: 10,821
Сказал спасибо: 919
Сказали Спасибо 4,289 раз(а) в 2,570 сообщении(ях)
|
Re: Как считать данные с гироскопа MPU-6050?
Применяйте фильтр Калмана. Могу подкинуть, если сами не нагуглите.
|
|
|
|
19.06.2016, 22:01
|
|
|
Частый гость
Регистрация: 16.05.2016
Адрес: Москва
Сообщений: 35
Сказал спасибо: 6
Сказали Спасибо 1 раз в 1 сообщении
|
Re: Как считать данные с гироскопа MPU-6050?
Сообщение от -Alan-
|
У меня тоже данные немного гуляют, это нормально.
Выше я уже говорил про фильтры, ибо у меня точно так же, поток данных достаточно хорошо прыгает.
Кстати, почему у Вас значения регистров только по одному байту? Они же 16-ти битные. И да, знаковые.
Посмотрите ещё раз мой пример - там я читаю 2 байта из регистров акселеромеитра и гироскопа, преобразовываю их в число и вывожу в консоль. У Вас почему-то только один байт и тот беззнаковый.
|
В консоль я уже вывожу как раз таки число преобразованное из двух байт младшего и старшего. А почему он идет без знака для меня тоже вопрос. КАК знак вывести?
Вот мой код с поправкой на обрезание двух младших битов да уже не так скачут показания
|
Код:
|
/////////////////////читаем показания акселерометра X,Y,Z и передаем их по UART///////
UART_write("ACCEL_X,Y,Z:");
int ACCEL_XH = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_XOUT_H, MPU_6050_ADDRESS_R);
int ACCEL_XL = (MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_XOUT_L, MPU_6050_ADDRESS_R))&0xFC;
int ACCEL_X = ACCEL_XH‹‹8|ACCEL_XL;
UART_transiever_itoa(ACCEL_X);
UART_write(" ");
int ACCEL_YH = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_YOUT_H, MPU_6050_ADDRESS_R);
int ACCEL_YL = (MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_YOUT_L, MPU_6050_ADDRESS_R))&0xFC;
int ACCEL_Y = ACCEL_YH‹‹8|ACCEL_YL;
UART_transiever_itoa(ACCEL_Y);
UART_write(" ");
int ACCEL_ZH = MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_ZOUT_H, MPU_6050_ADDRESS_R);
int ACCEL_ZL = (MPU_I2C_R(MPU_6050_ADDRESS_W,ACCEL_ZOUT_L, MPU_6050_ADDRESS_R))&0xFC;
int ACCEL_Z = ACCEL_ZH‹‹8|ACCEL_ZL;
UART_transiever_itoa(ACCEL_Z);
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////читаем показания гироскропа X,Y,Z и передаем их по UART//////////
UART_write(" GYRO_X,Y,Z:");
int GYRO_XH = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_XOUT_H, MPU_6050_ADDRESS_R);
int GYRO_XL = (MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_XOUT_L, MPU_6050_ADDRESS_R))&0xFC;
int GYRO_X = GYRO_XH‹‹8|GYRO_XL;
UART_transiever_itoa(GYRO_X);
UART_write(" ");
int GYRO_YH = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_YOUT_H, MPU_6050_ADDRESS_R);
int GYRO_YL = (MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_YOUT_L, MPU_6050_ADDRESS_R))&0xFC;
int GYRO_Y = GYRO_YH‹‹8|GYRO_YL;
UART_transiever_itoa(GYRO_Y);
UART_write(" ");
int GYRO_ZH = MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_ZOUT_H, MPU_6050_ADDRESS_R);
int GYRO_ZL = (MPU_I2C_R(MPU_6050_ADDRESS_W,GYRO_ZOUT_L, MPU_6050_ADDRESS_R))&0xFC;
int GYRO_Z = GYRO_ZH‹‹8|GYRO_ZL;
UART_transiever_itoa(GYRO_Z);
/////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////читаем показания термометра и передаем их по UART////////////////
UART_write(" TEMPERATUR:");
int TEMP_H = MPU_I2C_R(MPU_6050_ADDRESS_W,TEMP_OUT_H, MPU_6050_ADDRESS_R);
int TEMP_L = MPU_I2C_R(MPU_6050_ADDRESS_W,TEMP_OUT_L, MPU_6050_ADDRESS_R);
int TEMPERATUR = TEMP_H‹‹8|TEMP_L;
TEMPERATUR = TEMPERATUR/340+36;
UART_transiever_itoa(TEMPERATUR); |
|
|
|
|
Ваши права в разделе
|
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения
HTML код Выкл.
|
|
|
Часовой пояс GMT +4, время: 23:50.
|
|