Получение данных с MPU9250 ========================== MPU9250 — 9-осевой инерциальный модуль: - акселерометр (3 оси, ускорения); - гироскоп (3 оси, угловые скорости); - магнитометр AK8963 (3 оси, магнитное поле). Расположение в кубсате — шина I²C. Адрес зависит от уровня на пине ``AD0``: ``0x68`` (по умолчанию) или ``0x69`` (при ``AD0`` к ``VCC``). Магнитометр AK8963 «спрятан» внутри MPU9250 на отдельном I²C bus и становится виден на основной шине по адресу ``0x0C`` только после того, как акселерометр включит ``BYPASS`` (это делает скетч). Тестовый скетч -------------- .. literalinclude:: ../../../examples/mpu9250_read/mpu9250_read.ino :language: cpp :caption: examples/mpu9250_read/mpu9250_read.ino Скетч: будит MPU, переключает в bypass-режим, инициализирует AK8963 в непрерывном чтении 100 Гц, и пять раз в секунду печатает 9 чисел. .. note:: Скетч использует жёстко заданный адрес ``0x68``. В финальной прошивке ``main_full_arduino`` адрес определяется автоматически (``0x68`` или ``0x69``). Если этот тест выдаёт ``MPU9250 init failed``, а ``i2c_scanner`` показывает ``0x69`` — модуль на этом конкретном экземпляре с ``AD0=HIGH``. Поправьте константу ``MPU_ADDR`` в скетче с ``0x68`` на ``0x69`` и перезалейте. В реальной миссии это значения не имеет — ``main_full`` сам подберёт. Как запустить ------------- 1. Залейте скетч. 2. Откройте Serial Monitor на скорости **115200**. Что должно быть видно --------------------- Старт:: AK8963 OK. ax,ay,az,gx,gy,gz,mx,my,mz Если магнитометр не запустился (это бывает на некоторых клонах MPU):: AK8963 (magnetometer) init failed. Accel/Gyro may still work, mag may be unavailable. ax,ay,az,gx,gy,gz,mx,my,mz Дальше — пять строк в секунду:: -120,80,16380,12,-5,3,128,-340,212 -110,76,16384,10,-7,2,130,-338,210 ... Это сырые 16-битные значения. Чтобы их интерпретировать: - ``ax/ay/az``: ±32768 ≈ ±2 g (диапазон по умолчанию). На неподвижной плате одна ось должна показывать ≈ 16384 (это +1 g — гравитация). - ``gx/gy/gz``: ±32768 ≈ ±250 °/с. На неподвижной плате — около нуля с шумом ±20. - ``mx/my/mz``: магнитное поле, ±32768 ≈ ±4912 µT. Зависит от ориентации к северу. Ручная проверка --------------- - **Положите кубсат ровно.** ``az`` должен быть около ``+16384``, ``ax``/``ay`` — около нуля. Переверните вверх ногами — ``az`` уйдёт к ``-16384``. - **Покачайте.** Значения акселерометра должны заметно прыгать. - **Поверните вокруг вертикальной оси.** ``gz`` отклонится от нуля пропорционально скорости вращения. - **Поднесите магнит.** ``mx``, ``my``, ``mz`` зашкалят (значения «упрутся» в ±32767). Если все значения по нулям и не реагируют — модуль не инициализирован, вернитесь к :doc:`coding-i2c-check`. .. note:: Финальная прошивка ``main_full`` читает только акселерометр и гироскоп — магнитометр в неё пока не интегрирован. Этот тест шире, чем то, что использует CubeSat в полёте.