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 зависает.

, 👍1

Обсуждение

На самом деле, удаление прерывания полностью решает все!, @Dat Ha


1 ответ


1

Я добавил mpu.resetfifo после строк mpu.dmpGet.... С тех пор 2 разные системы работают не менее 5 часов и с установленным оригинальным штифтом прерывания

,