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
@Maifee Ul Asad, 👍0
Обсуждение2 ответа
Лучший ответ:
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
Я думаю, что 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
_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