MPU6050 зависает/замораживается
Мне очень не хватает контактов прерывания на моем Arduino, потому что у меня есть проект, который уже использует много контактов Arduino, и для чтения данных DMP из MPU6050 вам всегда нужно использовать контакт прерывания. Я МНОГО искал в Интернете, и многие люди говорят, что невозможно получить данные DMP без PIN-кода прерывания. Некоторые люди также говорили, что единственный способ сделать это — это перепроектировать код MPU6050 (что я не знаю, как это сделать).
Но сегодня, играя с MPU6050, я наконец смог получить все его данные DMP без контакта прерывания, вам просто нужно соединить 4 контакта (VCC, GND, SCL и SDA). Загрузите приведенный ниже код в свой Arduino и убедитесь, что он работает!
#include "MPU6050_6Axis_MotionApps20.h"
MPU6050 mpu;
uint16_t packetSize;
uint16_t fifoCount;
uint8_t fifoBuffer[64];
Quaternion q;
VectorFloat gravity;
float ypr[3];
void setup() {
Wire.begin();
TWBR = 24;
mpu.initialize();
mpu.dmpInitialize();
mpu.setXAccelOffset(-1343);
mpu.setYAccelOffset(-1155);
mpu.setZAccelOffset(1033);
mpu.setXGyroOffset(19);
mpu.setYGyroOffset(-27);
mpu.setZGyroOffset(16);
mpu.setDMPEnabled(true);
packetSize = mpu.dmpGetFIFOPacketSize();
fifoCount = mpu.getFIFOCount();
Serial.begin(115200);
}
void loop() {
while (fifoCount < packetSize) {
fifoCount = mpu.getFIFOCount();
}
if (fifoCount == 1024) {
mpu.resetFIFO();
Serial.println(F("FIFO overflow!"));
}
else {
if (fifoCount % packetSize != 0) {
mpu.resetFIFO();
}
else {
while (fifoCount >= packetSize) {
mpu.getFIFOBytes(fifoBuffer, packetSize);
fifoCount -= packetSize;
}
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
Serial.print("ypr\t");
Serial.print(ypr[0] * 180 / PI);
Serial.print("\t");
Serial.print(ypr[1] * 180 / PI);
Serial.print("\t");
Serial.print(ypr[2] * 180 / PI);
Serial.println();
}
}
}
Есть только одна проблема: периодически Arduino без причины зависает в функции getFIFOBytes
. Я почти уверен, что это ошибка, потому что, когда вы вызываете слишком много раз getFIFOBytes
, по какой-то причине Arduino зависает.
@Samul, 👍1
Обсуждение1 ответ
Я добавил mpu.resetfifo после строк mpu.dmpGet.... С тех пор 2 разные системы работают не менее 5 часов и с установленным оригинальным штифтом прерывания
- Как подключить вывод INT MPU 6050?
- Как очистить буфер FIFO на MPU6050?
- Как сгенерировать аппаратное прерывание в mpu6050 для пробуждения Arduino из режима SLEEP_MODE_PWR_DOWN?
- MPU6050 не работает
- Понимание того, почему следует избегать «String» и альтернативных решений
- Объяснение кода MPU6050
- Как подключить MPU9250 к NodeMCU с помощью SPI или I2C Slave?
- Линейное ускорение от MPU 6050
На самом деле, удаление прерывания полностью решает все!, @Dat Ha