0
КОРЗИНА
0 ТОВАРА
 MPU-9250  9DOF (гироскоп, акселерометр, компас) для Arduino ардуино

MPU-9250 9DOF (гироскоп, акселерометр, компас)

3-осевой Гироскоп, 3-осевой Акселерометр и 3-осевой Компас (Магнетометр) Подробнее...
Модификация
Скоро в продаже Артикул: # 969
1290 ₽
Возможен безналичный расчёт для юридических лиц при оформлении заказа
Сообщить о поставке на e-mail:
{{ status }}
  • Доставка товаров по России, Белоруссии, Казахстану
  • Возможен безналичный расчёт для юридических лиц при оформлении заказа
Количество:
Перейти в корзину и оформить заказ.
Telegram
WhatsApp
Обсудить вопросы приобретения, не технические!
*Доступно общение только текстовыми сообщениями, звонки и аудио сообщения не обслуживаются
Онлайн
Описание товара
Подробное описание товара

Общие сведения

9-осевой сенсор MPU-9250 9DOF — сенсор второго поколения компании InvenSense для определения положения в пространстве, включающий в себя 3-осевой Гироскоп, 3-осевой Акселерометр и 3-осевой Компас (Магнетометр).

Характеристики

  • Микросхема : MPU9250
  • Интерфейс: I2C (400кГц) / SPI (1 МГц)
  • Буфер: FIFO 512B
  • Рабочие диапазоны гироскопа: ±250, ±500, ±1000, ±2000 °/с;
  • Рабочие диапазоны акселерометра: ±2, ±4, ±8, ±16 g;
  • Рабочий диапазон магнитометра: ±4800 мкТл;
  • Напряжение питания: 2,4–3,6 В;
  • Рабочий ток: гироскоп – 3,2 мА, акселерометр – 450 мкА, магнитометр – 280 мкА;
  • Размер: 15мм х 25мм

Подключение

Подключить сенсор к микроконтроллеру Вы можете одним из 2 способов:

  • по шине I2C: используя 4 контакта VCC, GNG, SCL, SDA
  • по шине SPI: используя 5 контактов VCC, GND, SCL, SDA, CS, SDO

Питание

Для удобства подключения к Arduino воспользуйтесь Trema ShieldTrema Power ShieldMotor Shield или Trema Set Shield.

Входное напряжение питания 3,3 В или 5 В постоянного тока, подаётся на выводы VCC и GND модуля.

Подробнее о сенсоре

Микросхема сенсора MPU-9250 9DOF состоит из 2 чипов: MPU-6500 — чип, включающий в себя 3-осевой гироскоп и акселерометр и AK8963 — чип, включающий в себя 3-осевой компас и интегрированный Digital Motion Processor (DMP). DMP с помощью алгоритмов Motion Fusion обрабатывает данные с сенсоров и передаёт их внешнему микроконтроллеру по шине I2C/SPI.

Данный сенсор является одним из самых миниатюрных в мире (3мм*3мм*1мм). Используется в смартфонах, планшетах, носимых датчиках и других устройствах. Если к модулю добавить барометр, получится сенсор на 10 степеней свободы.

Может использоваться для создания дронов, роботов, 3-мерных контроллеров, а так же в системах, поддерживающих управление жестами.

Обратите внимание, что в микросхеме MPU9250 определение осей у Гироскопа и Акселерометра одно, а у Магнитометра другое!

Для работы с сенсором вам понадобится библиотека IMU_10DOF. При необходимости Вы так же можете ознакомиться с DataSheet'ом.

Примеры

Калибровка компаса и вывод значений осей в монитор порта.

Подключим сенсор через I2C.

  • VDD - подключается к выводу 5V Arduino UNO.
  • GND - подключается к выводу GND Arduino UNO.
  • SCL - подключается к линии тактирования SCL шины I2C или к выводу A5 Arduino UNO.
  • SDA - подключается к линии данных SDA шины I2C или к выводу A4 Arduino UNO.

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

#include <Wire.h>
#include <I2Cdev.h>
#include <MPU9250.h>
// По умолчанию адрес устройства на шине I2C - 0x68
MPU9250 accelgyro;
I2Cdev   I2C_M;
uint8_t buffer_m[6];
int16_t ax, ay, az;
int16_t gx, gy, gz;
int16_t   mx, my, mz;
float heading;
float tiltheading;
float Axyz[3];
float Gxyz[3];
float Mxyz[3];
// время выполнения предварительной калибровки
#define sample_num_mdate  5000
volatile float mx_sample[3];
volatile float my_sample[3];
volatile float mz_sample[3];
static float mx_centre = 0;
static float my_centre = 0;
static float mz_centre = 0;
volatile int mx_max = 0;
volatile int my_max = 0;
volatile int mz_max = 0;
volatile int mx_min = 0;
volatile int my_min = 0;
volatile int mz_min = 0;
void setup()
{
    //подключаемся к шине I2C (I2Cdev не может сделать это самостоятельно)
    Wire.begin();
    // инициализация подключения в Мониторе порта
    // ( 38400бод выбрано потому, что стабильная работа наблюдается и при 8MHz и при 16Mhz, поэтому
    // в дальнейшем выставляйте скорость согласно ваших требований)
    Serial.begin(38400);
    // Инициализация устройства
    Serial.println("Initializing I2C devices...");
    accelgyro.initialize();
    // Подтверждение подключения
    Serial.println("Testing device connections...");
    Serial.println(accelgyro.testConnection() ? "MPU9250 connection successful" : "MPU9250 connection failed");
    delay(1000);
    Serial.println("     ");
    // Предварительная калибровка магнитометра
    Mxyz_init_calibrated ();
}
void loop()
{
    getAccel_Data();             // Получение значений Акселерометра
    getGyro_Data();              // Получение значений Гироскопа
    getCompassDate_calibrated(); // В этой функции происходит калибровка магнитометра
    getHeading();                // после чего мы получаем откалиброванные значения углов поворота
    getTiltHeading();            // и наклона
    Serial.println("calibration parameter: ");
    Serial.print(mx_centre);
    Serial.print("         ");
    Serial.print(my_centre);
    Serial.print("         ");
    Serial.println(mz_centre);
    Serial.println("     ");
    Serial.println("Acceleration(g) of X,Y,Z:");
    Serial.print(Axyz[0]);
    Serial.print(",");
    Serial.print(Axyz[1]);
    Serial.print(",");
    Serial.println(Axyz[2]);
    Serial.println("Gyro(degress/s) of X,Y,Z:");
    Serial.print(Gxyz[0]);
    Serial.print(",");
    Serial.print(Gxyz[1]);
    Serial.print(",");
    Serial.println(Gxyz[2]);
    Serial.println("Compass Value of X,Y,Z:");
    Serial.print(Mxyz[0]);
    Serial.print(",");
    Serial.print(Mxyz[1]);
    Serial.print(",");
    Serial.println(Mxyz[2]);
    Serial.println("The clockwise angle between the magnetic north and X-Axis:"); // "Угол поворота"
    Serial.print(heading);
    Serial.println(" ");
    Serial.println("The clockwise angle between the magnetic north and the projection of the positive X-Axis in the horizontal plane:"); // "Угол наклона"
    Serial.println(tiltheading);
    Serial.println("   ");
    Serial.println();
    delay(1000);
}
void getHeading(void)
{
    heading = 180 * atan2(Mxyz[1], Mxyz[0]) / PI;
    if (heading < 0) heading += 360;
}
void getTiltHeading(void)
{
    float pitch = asin(-Axyz[0]);
    float roll = asin(Axyz[1] / cos(pitch));
    float xh = Mxyz[0] * cos(pitch) + Mxyz[2] * sin(pitch);
    float yh = Mxyz[0] * sin(roll) * sin(pitch) + Mxyz[1] * cos(roll) - Mxyz[2] * sin(roll) * cos(pitch);
    float zh = -Mxyz[0] * cos(roll) * sin(pitch) + Mxyz[1] * sin(roll) + Mxyz[2] * cos(roll) * cos(pitch);
    tiltheading = 180 * atan2(yh, xh) / PI;
    if (yh < 0)    tiltheading += 360;
}
void Mxyz_init_calibrated ()
{
    Serial.println(F("Before using 9DOF,we need to calibrate the compass first. It will takes about 1 minute."));  // Перед использованием сенсора необходимо произвести калибровку компаса. Это займёт около минуты.
    Serial.print("  ");
    Serial.println(F("During  calibrating, you should rotate and turn the 9DOF all the time within 1 minute."));   // На протяжении всего времени калибровки Вам необходимо вращать сенсор во все стороны.
    Serial.print("  ");
    Serial.println(F("If you are ready, please sent a command data 'ready' to start sample and calibrate."));      // Если Вы готовы, для начала калибровки отправьте в Мониторе Порта "ready". 
    while (!Serial.find("ready"));
    Serial.println("  ");
    Serial.println("ready");
    Serial.println("Sample starting......");
    Serial.println("waiting ......");
    get_calibration_Data ();
    Serial.println("     ");
    Serial.println("compass calibration parameter ");
    Serial.print(mx_centre);
    Serial.print("     ");
    Serial.print(my_centre);
    Serial.print("     ");
    Serial.println(mz_centre);
    Serial.println("    ");
}
void get_calibration_Data ()
{
    for (int i = 0; i < sample_num_mdate; i++)
    {
        get_one_sample_date_mxyz();
        /*
        Serial.print(mx_sample[2]);
        Serial.print(" ");
        Serial.print(my_sample[2]);                            // здесь Вы можете увидеть полученные "сырые" значения.
        Serial.print(" ");
        Serial.println(mz_sample[2]);
        */
        if (mx_sample[2] >= mx_sample[1])mx_sample[1] = mx_sample[2];
        if (my_sample[2] >= my_sample[1])my_sample[1] = my_sample[2]; // Поиск максимального значения
        if (mz_sample[2] >= mz_sample[1])mz_sample[1] = mz_sample[2];
        if (mx_sample[2] <= mx_sample[0])mx_sample[0] = mx_sample[2];
        if (my_sample[2] <= my_sample[0])my_sample[0] = my_sample[2]; // Поиск минимального значения
        if (mz_sample[2] <= mz_sample[0])mz_sample[0] = mz_sample[2];
    }
    mx_max = mx_sample[1];
    my_max = my_sample[1];
    mz_max = mz_sample[1];
    mx_min = mx_sample[0];
    my_min = my_sample[0];
    mz_min = mz_sample[0];
    mx_centre = (mx_max + mx_min) / 2;
    my_centre = (my_max + my_min) / 2;
    mz_centre = (mz_max + mz_min) / 2;
}
void get_one_sample_date_mxyz()
{
    getCompass_Data();
    mx_sample[2] = Mxyz[0];
    my_sample[2] = Mxyz[1];
    mz_sample[2] = Mxyz[2];
}
void getAccel_Data(void)
{
    accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);
    Axyz[0] = (double) ax / 16384;
    Axyz[1] = (double) ay / 16384;
    Axyz[2] = (double) az / 16384;
}
void getGyro_Data(void)
{
    accelgyro.getMotion9(&ax, &ay, &az, &gx, &gy, &gz, &mx, &my, &mz);
    Gxyz[0] = (double) gx * 250 / 32768;
    Gxyz[1] = (double) gy * 250 / 32768;
    Gxyz[2] = (double) gz * 250 / 32768;
}
void getCompass_Data(void)
{
    I2C_M.writeByte(MPU9150_RA_MAG_ADDRESS, 0x0A, 0x01); // активируем магнетометр
    delay(10);
    I2C_M.readBytes(MPU9150_RA_MAG_ADDRESS, MPU9150_RA_MAG_XOUT_L, 6, buffer_m);
    mx = ((int16_t)(buffer_m[1]) << 8) | buffer_m[0] ;
    my = ((int16_t)(buffer_m[3]) << 8) | buffer_m[2] ;
    mz = ((int16_t)(buffer_m[5]) << 8) | buffer_m[4] ;
    Mxyz[0] = (double) mx * 1200 / 4096;
    Mxyz[1] = (double) my * 1200 / 4096;
    Mxyz[2] = (double) mz * 1200 / 4096;
}
void getCompassDate_calibrated ()
{
    getCompass_Data();
    Mxyz[0] = Mxyz[0] - mx_centre;
    Mxyz[1] = Mxyz[1] - my_centre;
    Mxyz[2] = Mxyz[2] - mz_centre;
}

Комплектация

  • 1х сенсор MPU-9250;
  • 1х СОединитель типа "ПАПА-ПАПА";

Ссылки

Товары
Первой необходимости и другие вещи, которые могут пригодиться!
В наличии
130
Скоро в продаже
165
В наличии
296
В наличии
ИК-приёмник (Trema-модуль): Управление проектами на расстоянии с помощью обычного ИК-пульта от телевизора или другой техники Подробнее
194
В наличии
442
В наличии
Цифровой датчик температуры и влажности высокой точности (Trema-модуль): Позволяет получать показания температуры и влажности по одной линии данных. Подробнее
620
В наличии
262
В наличии
Датчик линии QRD1114 / Аналоговый (Trema-модуль): Сенсор для определения цвета поверхности по шкале от чёрного до белого Подробнее
190
В наличии
2941
В наличии осталось 3 шт.
ORP-метр, FLASH-I2C: Подробнее
3970
В наличии
TDS/EC-метр для воды с щупом (Trema-модуль Flash-I2C): Солемер и кондуктометр для определения минерализации и электропроводности воды Подробнее
1469
Скоро в продаже
Резистор давления (12 мм), FSR402: Сопротивление резистора давления снижается с увеличением силы, приложенной к его поверхности. Подробнее
794
В наличии
453
В наличии
Доплеровский датчик движения RCWL-0516: Определять движение объектов (препятствий), которые полностью или частично отражают радиоволны Подробнее
227
Или перейти в корзину и оформить заказ.
Гарантии и возврат Используя сайт Вы соглашаетесь с условями
Есть вопрос?