Incompatibilité entre SparkFunMPU9250-DMP.h et U8g2lib.h

Bonjour,

J'ai un problème bien au-delà de mes petites compétences.

Je veux faire un compte à rebours qui une fois à zéro afficherait le cap donné par le mpu9250.
J'utilise les bibliothèques
<U8g2lib.h>
<Arduino.h>
<SPI.h>
<SparkFunMPU9250-DMP.h>
<Chrono.h>
"OneButton.h"

Dans SparkFunMPU9250-DMP.h pour qu'elle fonctionne sur l'esp8266 et l'ESP32 j'ai suivi les conseils de plus compétent :
Go to your SparkFun library (this is usually Documents\Arduino\libraries\SparkFun_MPU-9250-DMP_Arduino_Library-master) navigate to src/util and edit the file
inv_mpu.h Somewhere at the beginning of file, just below the line that says
#define INV_MPU_H
add the following line:
#define min(X, Y) (((X) < (Y)) ? (X) : (Y))

La boussole fonctionne parfaitement seule dans un exemple.

L'écran et le compte à rebours fonctionnent également parfaitement tout seuls.

Lorsque je mets les deux ensemble, si j'appelle d'abord le compte à rebours, cela fonctionne, puis à l'appel de la lecture sur MPU le microcontrôleur reboot.

Si j'appelle d'abord la boussole, la ligne
if (imu.begin() != INV_SUCCESS)
en est la cause et si je vais dans la bibliothèque SparkFunMPU9250-DMP.h c'est en ligne 46
result = mpu_init(&int_param);
qui fait rebooter

mpu_init est dans inv_mpu.c
Après je ne sais pas pister

Donc cette bibliothèque MPU a quelque chose que l'ESP n'aime pas du tout

Pouvez-vous m'aider s'il vous plaît

Bonsoir

Pouvez-vous m'aider s'il vous plaît

Ce serait sans doute plus facile si tu donnais ton code entier ainsi que le câblage de l'écran et du MPU ainsi que la référence de l'écran

Les bribes d'infos sont rarement suffisantes et le problème est souvent ailleurs que dans l'endroit supposé par le demandeur d'aide

Après avoir retiré les parties qui fonctionnent ou ne sont pas utiles à la résolution du problème

/* Go to your SparkFun library (this is usually Documents\Arduino\libraries\SparkFun_MPU-9250-DMP_Arduino_Library-master)
navigate to src\util  and edit the file
inv_mpu.h    Somewhere at the beginning of file, just below the line that says 
#define _INV_MPU_H_
add the following line:
#define min(X, Y) (((X) < (Y)) ? (X) : (Y)) 

 * Sur ESP8266 Wemos D1 Mini
 * février 2022
 * 
 * MPU9250  ESP8266
 * VCC         3.3v 
 * GND         GND 
 * SCL/SCLK    D1 SCL
 * SDA         D2 SDA
 * 
 * Ecran :UC1701x 
 * 5    LedA vers 3.3v
 * 6    Vss GND
 * 7    Vdd 3.3v
 * 8    SCLK  D5 SCK   GPIO14  
 * 9    SDA   D7 MOSI  GPIO13  
 * 10   RS    D4 dc    GPIO 2
 * 11   Reset D3 reset GPIO 0
 * 12   CS    D8       GPIO 15  */
 
#include <U8g2lib.h>
#include <Arduino.h>
#include <SPI.h>
#include <SparkFunMPU9250-DMP.h>

U8G2_UC1701_MINI12864_F_4W_SW_SPI u8g2(U8G2_R2, /* clock=D5*/ 14, /* data=D7*/ 13, /* cs=D8*/ 15, /* dc=D2*/ 2, /* reset=D3*/ 0 );  
     
MPU9250_DMP imu;

void compas1(void){
      Serial.println("Reboot après ");
      delay(1000);
//==============================================  
// After here : reboot
//==============================================
   
   if (imu.begin() != INV_SUCCESS) {               
        Serial.println("imu.begin() Failed!");
        while (1) {
            Serial.println("Unable to communicate with MPU-9250");
            Serial.println("Check connections, and try again.");
            Serial.println();
            delay(5000);   }    }
    Serial.println("imu.begin() succeeded");
    imu.dmpBegin(DMP_FEATURE_6X_LP_QUAT |            // Enable 6-axis quat
        DMP_FEATURE_GYRO_CAL,                        // Use gyro calibration
        10);                                         // Set DMP FIFO rate to 10 Hz
   Serial.println("setup() completed");
   compas2();    }

void compas2(void){
   byte boucle =0;
   while (boucle == 0) {
        if (imu.fifoAvailable()) {
           if (imu.dmpUpdateFifo() == INV_SUCCESS) {
               imu.computeEulerAngles();
               Serial.println("R/P/Y: " + String(imu.roll) + ", " + String(imu.pitch) + ", " + String(imu.yaw)); 
               }  }  }  }

void setup(void) {
   Serial.begin(115200);
   u8g2.begin();
   Wire.begin();                                    
   compas1();
     }

void loop(void) {
  delay(10);    }

Résultat à la cnsole série :

Reboot après 

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

Exception (9):
epc1=0x40208270 epc2=0x00000000 epc3=0x00000000 excvaddr=0x3ffe893f depc=0x00000000

>>>stack>>>

ctx: cont
sp: 3ffffda0 end: 3fffffc0 offset: 0190
3fffff30:  0000000f 0000000f 3ffe85c8 40202879  
3fffff40:  40105e48 00ff7ea4 3ffefaa4 40204469  
3fffff50:  3ffeee60 3ffefaa4 3ffef2c8 3ffef994  
3fffff60:  3fffdad0 3ffef2c8 3ffef2c8 40203e00  
3fffff70:  40206105 000003e8 3ffef994 402060fa  
3fffff80:  3fffdad0 3ffef2c8 3ffef92c 40203b13  
3fffff90:  3fffdad0 00000000 3ffef328 40203ba3  
3fffffa0:  feefeffe feefeffe 3ffef980 402051f4  
3fffffb0:  feefeffe feefeffe 3ffe8618 40100e61  
<<<stack<<<

--------------- CUT HERE FOR EXCEPTION DECODER ---------------

 ets Jan  8 2013,rst cause:2, boot mode:(3,6)

load 0x4010f000, len 3460, room 16 
tail 4
chksum 0xcc
load 0x3fff20b8, len 40, room 4 
tail 4
chksum 0xc9
csum 0xc9
v00047d40
~ld
Reboot après 
                                      et on recommence......

Pour moi c'est la bibliothèque sparkfun qui ne supporte pas U8g2lib et non l'inverse U8g2lib étant parfaite, respectant toutes spécifications

Selon Sparkfun, cette librairie ne supporte que les processeur SAMD

Note : This library currently only supports and is tested on SAMD processors . It's a major part of the SparkFun 9DoF Razor IMU M0 firmware.

Par contre celle-ci, fonctionne sur ESP32

Elle est utilisé dans leur exemple d'application
https://learn.sparkfun.com/tutorials/sparkfun-9dof-imu-icm-20948-breakout-hookup-guide
Par contre elle n'exploite pas toutes les possibilités de l'IMU si j'ai bien compris.

/* Go to your SparkFun library (this is usually Documents\Arduino\libraries\SparkFun_MPU-9250-DMP_Arduino_Library-master)
navigate to src\util  and edit the file
inv_mpu.h    Somewhere at the beginning of file, just below the line that says 
#define _INV_MPU_H_
add the following line:
#define min(X, Y) (((X) < (Y)) ? (X) : (Y)) 

 * Sur ESP8266 Wemos D1 Mini
 * février 2022
 * 
 * MPU9250  ESP8266
 * VCC         3.3v 
 * GND         GND 
 * SCL/SCLK    D1 SCL
 * SDA         D2 SDA
 * 
 * Ecran :UC1701x 
 * 5    LedA vers 3.3v
 * 6    Vss GND
 * 7    Vdd 3.3v
 * 8    SCLK  D5 SCK   GPIO14  
 * 9    SDA   D7 MOSI  GPIO13  
 * 10   RS    D4 dc    GPIO 2
 * 11   Reset D3 reset GPIO 0
 * 12   CS    D8       GPIO 15  */
 
//#include <U8g2lib.h>                          <=== 1
#include <Arduino.h>
#include <SPI.h>
#include <SparkFunMPU9250-DMP.h>

//U8G2_UC1701_MINI12864_F_4W_SW_SPI u8g2(U8G2_R2, /* clock=D5*/ 14, /* data=D7*/ 13, /* cs=D8*/ 15, /* dc=D2*/ 2, /* reset=D3*/ 0 );  
//     ^===================
MPU9250_DMP imu;

void compas1(void){
    if (imu.begin() != INV_SUCCESS) {               
        Serial.println("imu.begin() Failed!");
        while (1) {
            Serial.println("Unable to communicate with MPU-9250");
            Serial.println("Check connections, and try again.");
            Serial.println();
            delay(5000);   }    }
    Serial.println("imu.begin() succeeded");
    imu.dmpBegin(DMP_FEATURE_6X_LP_QUAT |            // Enable 6-axis quat
        DMP_FEATURE_GYRO_CAL,                        // Use gyro calibration
        10);                                         // Set DMP FIFO rate to 10 Hz
   Serial.println("setup() completed");
   compas2();    }

void compas2(void){
   byte boucle =0;
   while (boucle == 0) {
        delay(10);
        if (imu.fifoAvailable()) {
           if (imu.dmpUpdateFifo() == INV_SUCCESS) {
               delay(10);
               imu.computeEulerAngles();
               Serial.println("R/P/Y: " + String(imu.roll) + ", " + String(imu.pitch) + ", " + String(imu.yaw)); 
               }  }  }  }

void setup(void) {
   Serial.begin(115200);
   //u8g2.begin();                     <====================
   Wire.begin();                                    
   compas1();
     }

void loop(void) {
  delay(10);    }

Oui mais ceci fonctionne parfaitement sur ESP8266 et ESP32 avec le define cité plus haut.
Dès que je décommente `//#include <U8g2lib.h> reboot perpétuel, preuve que les deux bibliothèques sont incompatibles et c'est pas U8g2, l'auteur respecte bien tout ce qu'il faut pour ne pas interférer avec d'autres bibliothèques. J'ai déjà eu ce genre de p c'était à chaque fois l'autre qui était en cause.
Malheureusement je suis incapable de trouver où

SparkFun 9DoF IMU Breakout - ICM-20948 (Qwiic) - SEN-15335 - SparkFun Electronics n'est pas disponible, x fois plus cher que le mpu et la SparkFun_ICM-20948_ArduinoLibrary semble désignée pour ce type d'IMU

J'ai essayé toutes sortes de bibliothèques pour le MPU9250, avec des calibrations, jamais je n'ai obtenu de résultats sur le cap magnétique aussi bons de celle de sparkfun.
Je veux un compas qui fonctionne sur un voilier pas que sur une table horizontale
J'essayerais bien sur esp32 mais faut que je dessoude tout et je n'ai que des ESP32-S2

Solution tordue : un esp8266 avec un mpu9250 qui envoie le cap en com série à un esp qui l'affiche sur un écran...
On va pas en venir là

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.