Top.Mail.Ru
Ответы

С++ ардуино нано

#include "I2Cdev.h" #include "MPU6050_6Axis_MotionApps20.h" MPU6050 mpu; uint8_t fifoBuffer[45]; // буфер void setup() { Serial.begin(115200); Wire.begin(); //Wire.setClock(1000000UL); // разгоняем шину на максимум // инициализация DMP mpu.initialize(); mpu.dmpInitialize(); mpu.setDMPEnabled(true); mpu.setXAccelOffset(-2033); // пишите свои оффсеты после калибровки mpu.setYAccelOffset(-315); mpu.setZAccelOffset(1118); mpu.setXGyroOffset(127); mpu.setYGyroOffset(-51); mpu.setZGyroOffset(-1); } void loop() { static uint32_t tmr; if (millis() - tmr >= 11) { // таймер на 11 мс (на всякий случай) if (mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) { // переменные для расчёта (ypr можно вынести в глобал) Quaternion q; VectorFloat gravity; float ypr[3]; // расчёты mpu.dmpGetQuaternion(&q, fifoBuffer); mpu.dmpGetGravity(&gravity, &q); mpu.dmpGetYawPitchRoll(ypr, &q, &gravity); // выводим результат в радианах (-3.14, 3.14) Serial.print(degrees(ypr[0])); // вокруг оси Z Serial.println(','); // для градусов можно использовать degrees() tmr = millis(); // сброс таймера } } }
Что делает этот код? Я не понимаю

По дате
По рейтингу
Аватар пользователя
Мыслитель
2мес

Этот код предназначен для работы с датчиком MPU6050 на платформе Arduino Nano. Датчик MPU6050 - это инерционный модуль, который содержит акселерометр и гироскоп, а также встроенный Digital Motion Processor (DMP), который обрабатывает данные с датчиков.

### Что делает код:

1. **Инициализация**:
- В `setup()` происходит настройка последовательного порта (Serial) для вывода данных, инициализация шины I2C (Wire), которая используется для связи с датчиком.
- Датчик MPU6050 инициализируется (`mpu.initialize()`), а затем включается его DMP (Digital Motion Processor) - `mpu.dmpInitialize()` и `mpu.setDMPEnabled(true)`.
- Устанавливаются калибровочные смещения (offsets) для акселерометра и гироскопа. Эти значения получены в результате калибровки датчика.

2. **Основной цикл (`loop()`)**:
- Код проверяет, прошло ли 11 миллисекунд с последнего чтения данных (таймер на 11 мс). Это нужно для стабильного обновления данных (примерно 90 Гц).
- Если в FIFO-буфере датчика есть новые данные (`mpu.dmpGetCurrentFIFOPacket(fifoBuffer)`), то:
- Извлекаются данные о кватернионе (`Quaternion q`), который описывает ориентацию датчика в пространстве.
- Рассчитывается вектор гравитации (`VectorFloat gravity`) на основе кватерниона.
- Рассчитываются углы Эйлера (Yaw, Pitch, Roll) в радианах (`float ypr[3]`). Эти углы описывают поворот датчика вокруг осей Z, Y и X соответственно.
- Угол рысканья (Yaw, вокруг оси Z) преобразуется в градусы (с помощью `degrees()`) и выводится в последовательный порт (Serial).

### Для чего это нужно:
Код позволяет получать ориентацию датчика MPU6050 в пространстве, в частности, угол рысканья (Yaw) вокруг вертикальной оси (Z). Это может использоваться, например, в системах стабилизации, навигации, управлении дронами или роботами.

### Важные моменты:
- Код выводит только угол Yaw (первый элемент массива `ypr`), но можно легко добавить вывод Pitch и Roll (второй и третий элементы `ypr`).
- Данные выводятся в градусах. Если нужно в радианах, можно убрать `degrees()`.
- Для корректной работы необходимо предварительно откалибровать датчик и подставить свои значения смещений (`setXAccelOffset`, `setYGyroOffset` и т. д.).

Аватар пользователя
Искусственный Интеллект
2мес

Всё жеш написано
...YawPitchRoll выводит.
В радианах

Аватар пользователя
Просветленный
2мес

ардуино чилинтано

Аватар пользователя
Знаток
2мес

Ты думаешь тут гиперазумы сидят