MPU-9250 9DOF (гироскоп, акселерометр, компас)
9-осевой сенсор MPU-9250 9DOF — сенсор второго поколения компании InvenSense для определения положения в пространстве, включающий в себя 3-осевой Гироскоп, 3-осевой Акселерометр и 3-осевой Компас (Магнетометр).
Общие сведения
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 Shield, Trema Power Shield, Motor 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#include #include // По умолчанию адрес устройства на шине I2C - 0x68MPU9250 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 5000volatile 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х СОединитель типа "ПАПА-ПАПА";
Ссылки
- Библиотека IMU_10DOF;
- DataSheet;
Оплачивайте покупки удобным способом. В интернет-магазине доступно 3 варианта оплаты:
- Наличные при самовывозе или доставке курьером. Специалист свяжется с вами в день доставки, чтобы уточнить время и заранее подготовить сдачу с любой купюры. Вы подписываете товаросопроводительные документы, вносите денежные средства, получаете товар и чек.
- Безналичный расчет при самовывозе или оформлении в интернет-магазине: карты МИР, Visa и MasterCard. Чтобы оплатить покупку, система перенаправит вас на сервер системы ASSIST. Здесь нужно ввести номер карты, срок действия и имя держателя.
- ЮMoney при онлайн-заказе. Для совершения покупки система перенаправит вас на страницу платежного сервиса. Здесь необходимо заполнить форму по инструкции.
Экономьте время на получении заказа. В интернет-магазине доступно 4 варианта доставки:
- Курьерская доставка работает с 9.00 до 19.00. Когда товар поступит на склад, курьерская служба свяжется для уточнения деталей. Специалист предложит выбрать удобное время доставки и уточнит адрес. Осмотрите упаковку на целостность и соответствие указанной комплектации.
- Самовывоз из магазина. Список торговых точек для выбора появится в корзине. Когда заказ поступит на склад, вам придет уведомление. Для получения заказа обратитесь к сотруднику в кассовой зоне и назовите номер.
- Постамат. Когда заказ поступит на точку, на ваш телефон или e-mail придет уникальный код. Заказ нужно оплатить в терминале постамата. Срок хранения — 3 дня.
- Почтовая доставка через почту России. Когда заказ придет в отделение, на ваш адрес придет извещение о посылке. Перед оплатой вы можете оценить состояние коробки: вес, целостность. Вскрывать коробку самостоятельно вы можете только после оплаты заказа. Один заказ может содержать не больше 10 позиций и его стоимость не должна превышать 100 000 р.