MPU-6050 с Arduino – вскрытие

Я работаю с MPU-6050 с Arduino Uno.

Я скопировал приведенный ниже код из Arduino Playground — MPU6050.

Код:

  // Краткий пример скетча MPU-6050
  // Пользователь Arduino JohnChi
  // 17 августа 2014 г.
  // Всеобщее достояние
  #include<Wire.h>
  const int MPU_addr = 0x68; // I2C-адрес MPU-6050
  int16_t AcX, AcY, AcZ, Tmp, GyX, GyY, GyZ;
  void setup() {
    Wire.begin();
    Wire.beginTransmission(MPU_addr);
    Wire.write(0x6B);  // регистр PWR_MGMT_1
    Wire.write(0);     // устанавливаем на ноль (пробуждает MPU-6050)
    Wire.endTransmission(true);
    Serial.begin(9600);
  }
  void loop() {
    Wire.beginTransmission(MPU_addr);
    Wire.write(0x3B);  // начиная с регистра 0x3B (ACCEL_XOUT_H)
    Wire.endTransmission(false);
    Wire.requestFrom(MPU_addr, 14, true); // запрашиваем всего 14 регистров
    AcX = Wire.read() << 8 | Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
    AcY = Wire.read() << 8 | Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
    AcZ = Wire.read() << 8 | Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
    Tmp = Wire.read() << 8 | Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
    GyX = Wire.read() << 8 | Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (ГИРО_XOUT_L)
    GyY = Wire.read() << 8 | Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
    GyZ = Wire.read() << 8 | Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (ГИРО_ZOUT_L)
    Serial.print("AcX = "); Serial.print(AcX);
    Serial.print(" | AcY = "); Serial.print(AcY);
    Serial.print(" | AcZ = "); Serial.print(AcZ);
    Serial.print(" | Tmp = "); Serial.print(Tmp / 340.00 + 36.53); //уравнение температуры в градусах Цельсия из таблицы данных
    Serial.print(" | GyX = "); Serial.print(GyX);
    Serial.print(" | GyY = "); Serial.print(GyY);
    Serial.print(" | GyZ = "); Serial.println(GyZ);
    delay(333);
  }

Во-первых, я хочу знать все подробности об этом коде. AcX, AcY, AcZ, GyX, GyY, GyZ что все это означает?

Было бы неплохо иметь какое-нибудь визуальное представление.

Во-вторых, если я изменю задержку с 333 на 500, вызовет ли это проблему?

Это глупый вопрос, потому что я не могу найти никакой цифры, связанной с числом 333, кроме 1000/3

, 👍0

Обсуждение

_Ac{XYZ}_ относится к ускорению, сообщаемому датчиком в направлениях x, y и z. _Gy{XYZ}_ относится к вращению (в секунду), сообщаемому датчиком вдоль осей x, y и z., @Christian Lindig

Задержка 333 мс — это просто число, вы можете сделать ее 2, 20 000 или что-то еще., @Jot

Я не могу найти никакой цифры, связанной с числом 333.... подумайте об этом немного..... какова цель loop()? ..... что произойдет, если вы установите задержку в 333 мс в loop()?, @jsotola

Спасибо всем ..., @Maifee Ul Asad

Как фильтровать значение в реальном времени? Кто-нибудь может мне сказать?, @Maifee Ul Asad


2 ответа


Лучший ответ:

1
AcX = Accelerometer data in X axis in floating point. 
AcY = Accelerometer data in Y axis in floating point. 
AcZ = Accelerometer data in Z axis in floating point. 
GyX = Gyroscope data in X axis in floating point. 
GyY = Gyroscope data in X axis in floating point.
GyZ = Gyroscope data in X axis in floating point

.

Второе исследование связи I2C и таблицы данных MPU 6050.

В-третьих, у вас есть какое-то значение задержки, поскольку оно определяет, насколько быстро вы хотите получать данные со всех осей из IMU.

,

Спасибо, я пытался переместить и повернуть объект в Unity, используя Arduino в качестве входных данных. Теперь у меня есть [это](https://github.com/maifeeulasad/Mouse-3D), вращение идеальное, но положение нет. Может быть, вы сможете мне в этом помочь., @Maifee Ul Asad


1

Я думаю, что AcX, AcY, AcZ, GyX, GyY, GyZ — это необработанные значения ускорения и гироскопа, полученные от mpu6050 в соответствующих направлениях. для их получения соблюдается определенная процедура.

 Wire.read();

означает, что два регистра считываются и сохраняются в одной переменной

   accelerometer_x = Wire.read()<<8 | Wire.read(); 

читает регистры: 0x3B (ACCEL_XOUT_H) и 0x3C (ACCEL_XOUT_L), то есть , он занимается побитовой операцией для сдвига значений на 8 бит влево (умножая их на 256). Это позволяет складывать («|» или «ored») двух данных для непрерывного вывода данных акселерометра !! Без этого вы не смогли бы увидеть возрастающие и уменьшающиеся значения наклона. Кроме того, печать просто отображает на экране мгновенные значения.

Если вы хотите углубиться в код, вы можете посетить этот сайт для построчного описания !!

https://www.mschoeffler.de/2017/12/09/example-application-gy-521-module-mpu-6050-breakout-board-and-arduino-uno/

 delay(500);

Все зависит от вашего проекта, я не вижу никаких проблем, если вы сделаете 333 go 500 !! Он просто стабилизирует вывод на экране немного дольше (на 0,5 секунды)

,

Как обработать эти необработанные значения до фактического значения?, @Maifee Ul Asad

@MaifeeUlAsad Вы всегда можете использовать библиотеку mpu6050 от jeffrowberg !! Он проделал отличную работу по обратному проектированию аспектов mpu6050 и представил их в перспективе. Вы можете использовать эскиз mpu6050_dmp6, чтобы получить реальные обработанные значения., @Hrithik Baishakhiya

вы также можете подключить библиотеку и использовать некоторые функции, такие как mpu.getmotion6(&ax, &ay,&az,&gx,&gy,&gz,), чтобы получить эти точные значения., @Hrithik Baishakhiya

Спасибо, я пытался переместить и повернуть объект в Unity, используя Arduino в качестве входных данных. Теперь у меня есть [это](https://github.com/maifeeulasad/Mouse-3D), вращение идеальное, но положение нет. Может быть, вы сможете мне в этом помочь., @Maifee Ul Asad