Зависает ARDUINO в связке с гироскопом MPU 6050

Пумба

✩✩✩✩✩✩✩
26 Мар 2024
4
0
Коллеги подскажите, столкнулся с простой вещью, но не могу понять что происходит
Зависает ARDUINO в связке с гироскопом MPU 6050. Скетч с сайта ALEXGYVER что работа с DMP , что по таймингу.
Из наворотов подлючен диспей 1602 , без i2c .
Но плата виснет наглухо. Причем и UNO и MEGA. Куда копать?
Заказал второй MPU 6050 конечно на тесты, буду его так же подключать, но вдруг кто сталкивался.
 

vortigont

★★★★★★✩
24 Апр 2020
1,018
532
Saint-Petersburg, Russia
искать ошибку в коде, "зависает наглухо" это обычно всего лишь попадание в какой-то цикл из которого неправильно написан выход
 
  • Лойс +1
Реакции: poty

Пумба

✩✩✩✩✩✩✩
26 Мар 2024
4
0
Оформи код соответствующим тэгом
Даже если выкинуть дисплей и отправить все в порт , то через 20 мин тоже заснет.. или зависнет
Код с DMP взят с AlexGyver сайта, без фантазий по факту.

@vortigont,


#include "I2Cdev.h"
#include "MPU6050_6Axis_MotionApps20.h"
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd1(0x27, 16, 2);// display 2
byte degree[8] = {
0b00000,
0b00110,
0b01111,
0b00110,
0b00000,
0b00000,
0b00000,
0b00000
}; // символ градуса
MPU6050 mpu;
volatile bool mpuFlag = false; // флаг прерывания готовности
uint8_t fifoBuffer[45]; // буфер
void setup() {
Serial.begin(115200);
while (!Serial); /Waiting for Serial output on Serial Monitor/
Serial.println("\nI2C Scanner");
lcd1.begin(16,2);//initialize LCD1
lcd1.backlight();// turn the backlight ON for the LCD1
lcd1.createChar(0, degree);
lcd1.clear();
lcd1.print("Let's GO GYRo ...");
//
Wire.begin();
//Wire.setClock(1000000UL); // разгоняем шину на максимум
// инициализация DMP и прерывания
mpu.initialize();
// состояние соединения
Serial.println(mpu.testConnection() ? "MPU6050 OK" : "MPU6050 FAIL");
delay(2000);
mpu.dmpInitialize();
mpu.setDMPEnabled(true);
attachInterrupt(0, dmpReady, RISING);
byte err, adr; /variable error is defined with address of I2C/
int number_of_devices;
Serial.println("Scanning.");
number_of_devices = 0;
for (adr = 1; adr < 127; adr++ )
{
Wire.beginTransmission(adr);
err = Wire.endTransmission();
if (err == 0)
{
Serial.print("I2C device at address 0x");
if (adr < 16)
Serial.print("0");
Serial.print(adr, HEX);
Serial.println(" !");
lcd1.clear();
lcd1.setCursor(0,0);
lcd1.print("I2C device 0x");
lcd1.setCursor(0,1);
lcd1.print(adr,1);
delay(500);
number_of_devices++;
}
else if (err == 4)
{
Serial.print("Unknown error at address 0x");
if (adr < 16)
Serial.print("0");
Serial.println(adr, HEX);
}
}
if (number_of_devices == 0)
Serial.println("No I2C devices attached\n");
else
Serial.println("done\n");
delay(5000); /wait 5 seconds for the next I2C scan/
}
// прерывание готовности. Поднимаем флаг
void dmpReady() {
mpuFlag = true;
}
void loop() {
// по флагу прерывания и готовности DMP
if (mpuFlag && mpu.dmpGetCurrentFIFOPacket(fifoBuffer)) {
// переменные для расчёта (ypr можно вынести в глобал)
Quaternion q;
VectorFloat gravity;
float ypr[3];
// расчёты
mpu.dmpGetQuaternion(&q, fifoBuffer);
mpu.dmpGetGravity(&gravity, &q);
mpu.dmpGetYawPitchRoll(ypr, &q, &gravity);
mpuFlag = false;
// выводим результат в радианах (-3.14, 3.14)
Serial.print(degrees(ypr[0])); // вокруг оси Z
Serial.print(',');
Serial.print(degrees(ypr[1])); // вокруг оси Y
Serial.print(',');
Serial.print(degrees(ypr[2])); // вокруг оси X
Serial.println();
lcd1.clear();
lcd1.setCursor(0,0);
lcd1.print("Z=");
lcd1.setCursor(6,0);
lcd1.print("X=");
lcd1.setCursor(12,0);
lcd1.print("Y=");
lcd1.setCursor(0,1);
lcd1.print(degrees(ypr[0]),1);
lcd1.setCursor(6,1);
lcd1.print(degrees(ypr[1]),1);
lcd1.setCursor(12,1);
lcd1.print(degrees(ypr[2]),1);
delay(50);
// для градусов можно использовать degrees()
}
}
 

vortigont

★★★★★★✩
24 Апр 2020
1,018
532
Saint-Petersburg, Russia
Для начала научитесь оформлять код на форме соответствующими тегами.

if (mpuFlag && mpu.dmpGetCurrentFIFOPacket(fifoBuffer))
если хотя бы одно из этих условий не выполнится, то получится что у вас всё "зависло". Пишите "скетчи" сами, а не хватайте что попало - при отсутствии прерываний периодически проверяйте состоянии сенсора, контролируйте размер фифо очереди, вероятно где-то она переполняется и всё залипает.
 
  • Лойс +1
Реакции: Пумба