[ARDUINO MEGA] Accelerometre MPU 6050 failed to connect

Bonjour

Je souhait faire fonctionner un accelerometre MPU6050, mais, quand je veux simplement le faire foncionner avec le code de base, il ne fonctionne pas et me met dans le moniteur série

Adafruit MPU6050 test!
Failed to find MPU6050 chip

J'ai suivi un tuto sur internet qui explique tout et comment le câbler, mais ne dit pas comment régler mon problème : Guide Arduino pour accéléromètre et gyroscope MPU-6050 (raspberryme.com)

Voici le code et merci d'avance :slight_smile:

// Basic demo for accelerometer readings from Adafruit MPU6050

#include <Adafruit_MPU6050.h>
#include <Adafruit_Sensor.h>
#include <Wire.h>

Adafruit_MPU6050 mpu;

void setup(void) {
  Serial.begin(115200);
  while (!Serial)
    delay(10); // will pause Zero, Leonardo, etc until serial console opens

  Serial.println("Adafruit MPU6050 test!");

  // Try to initialize!
  if (!mpu.begin()) {
    Serial.println("Failed to find MPU6050 chip");
    while (1) {
      delay(10);
    }
  }
  Serial.println("MPU6050 Found!");
  
  mpu.setAccelerometerRange(MPU6050_RANGE_8_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {
  case MPU6050_RANGE_2_G:
    Serial.println("+-2G");
    break;
  case MPU6050_RANGE_4_G:
    Serial.println("+-4G");
    break;
  case MPU6050_RANGE_8_G:
    Serial.println("+-8G");
    break;
  case MPU6050_RANGE_16_G:
    Serial.println("+-16G");
    break;
  }
  mpu.setGyroRange(MPU6050_RANGE_500_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {
  case MPU6050_RANGE_250_DEG:
    Serial.println("+- 250 deg/s");
    break;
  case MPU6050_RANGE_500_DEG:
    Serial.println("+- 500 deg/s");
    break;
  case MPU6050_RANGE_1000_DEG:
    Serial.println("+- 1000 deg/s");
    break;
  case MPU6050_RANGE_2000_DEG:
    Serial.println("+- 2000 deg/s");
    break;
  }

  mpu.setFilterBandwidth(MPU6050_BAND_21_HZ);
  Serial.print("Filter bandwidth set to: ");
  switch (mpu.getFilterBandwidth()) {
  case MPU6050_BAND_260_HZ:
    Serial.println("260 Hz");
    break;
  case MPU6050_BAND_184_HZ:
    Serial.println("184 Hz");
    break;
  case MPU6050_BAND_94_HZ:
    Serial.println("94 Hz");
    break;
  case MPU6050_BAND_44_HZ:
    Serial.println("44 Hz");
    break;
  case MPU6050_BAND_21_HZ:
    Serial.println("21 Hz");
    break;
  case MPU6050_BAND_10_HZ:
    Serial.println("10 Hz");
    break;
  case MPU6050_BAND_5_HZ:
    Serial.println("5 Hz");
    break;
  }

  Serial.println("");
  delay(100);
}

void loop() {

  /* Get new sensor events with the readings */
  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  /* Print out the values */
  Serial.print("Acceleration X: ");
  Serial.print(a.acceleration.x);
  Serial.print(", Y: ");
  Serial.print(a.acceleration.y);
  Serial.print(", Z: ");
  Serial.print(a.acceleration.z);
  Serial.println(" m/s^2");

  Serial.print("Rotation X: ");
  Serial.print(g.gyro.x);
  Serial.print(", Y: ");
  Serial.print(g.gyro.y);
  Serial.print(", Z: ");
  Serial.print(g.gyro.z);
  Serial.println(" rad/s");

  Serial.print("Temperature: ");
  Serial.print(temp.temperature);
  Serial.println(" degC");

  Serial.println("");
  delay(500);
}```

Salut!

un module avec sa bibliothèque en I2C correctement branché, on peut s'attendre à ce que ça marche.

tu aurais le courage de poster:

  • le modèle de ta carte
  • une vue de ton branchement

en toute logique, sur une connexion I2C "standard" tu dois brancher l'alimentation de ton module sur le +3,3V / +5V, la masse, et ensuite relier les pins SDA (données) sur la pin A4 et SCL (horloge) sur du A5.

au niveau du code (mais si tu as un module tout fait il en possède certainement), on ajoute par des résistances pull-up sur les 2 lignes SDA et SCL

pinMode(A4,INPUT_PULLUP);
pinMode(A5,INPUT_PULLUP);

mais la bibliothèque wire a du s'en occuper pour toi

on commence par vérifier ça?

sinon le coup classique avec nouveau capteur I2C: tu récupères l'adresse I2C (un format hexadécimal genre 0x40) et tu lances un sketch de type "scanner I2C" qui devrait t'afficher l'adresse correcte dans le serial monitor SI les connexions sont ok.

Bonjour
Merci de ta réponse
Voici le lien de mon accelerometre MPU 6050
https://www.amazon.fr/modules-MPU-6050-gyroscope-Gyroscope-Convertisseur/dp/B07XRK5FHP/ref=sr_1_2?__mk_fr_FR=%C3%85M%C3%85%C5%BD%C3%95%C3%91&crid=2B3ZRSBXCZG1L&keywords=mpu6050&qid=1678703025&sprefix=mpu+6050%2Caps%2C333&sr=8-2

Voici les photos de mon cablage :


J'ai testé un i2c scanner que j'ai trouve sur internet, et il m'affiche qu'aucun composant i2c est branché, si tu en as un à me conseiller je suis preneur

Cordialement

à la couleur des cables: échange A4 et A5

A4: SDA (les données)
A5: SCL l'horloge

alors attention, la puce posé sur ton module (le "vrai" MPU6050) fonctionne en 3,3V

y'a 2 options:

  • le module comprend un réhausseur de tension (à vérifier dans la datasheet du module lui même, y'aura aussi les infos sur les résistances pull up sur les connexions I2C) et donc tu n'as rien à faire.
  • il n'en contient pas et donc tu alimenterais un module 3,3V en 5V. Il faudra prévoir un pont diviseur de tension entre la sortie arduino +5V et l'entrée

sauf que je vois que ta UNO possède une sortie 3,3V. Cool
Attention, je me répète: c'est la datasheet qui aura raison, pas moi!

EDIT: I2C scanner arduino-i2c-scanner/I2CScanner.ino at master · todbot/arduino-i2c-scanner · GitHub

EDIT EDIT: je me fais les questions et les réponses, mais j'espère que ça pourra t'aider!
j'ai dégoté un schéma du circuit et j'arrive à voir:

  • régulateur de tension 5V->3,3V (tout en haut à gauche) donc pas de soucis pour une alimentation depuis la pin 5V de l'arduino;
  • résistances Pullup sur les 2 lignes SDA et SCL (tout en haut à droite), donc pas de soucis pour connecter en direct, et tu n'auras pas besoin de pinMode(SDA,INPUT_PULLUP); si d'aventure tu veux te passer de bibliothèque.

image

Conclusion: tiens nous au courant sur la correction des branchements SDA/SCL et du scan I2C!

Plutôt un régulateur LDO 3.3V, que l'on voit sur la photo.

Jamais de pont diviseur sur une alimentation.

SDA et SCL sont clairement inversés.

là je pêche par ignorance, merci pour la correction.

attends what? comment ça?
j'allais dire "oui mais ma mesure de voltage sur ma batterie, il est bien en pont diviseur?!?" mais j'imagine que tu parles d'un courant d'alimentation. Tu veux bien m'en dire plus?

Bonjour Granpete
le pont diviseur repose sur une hypothèse : courant de même valeur dans les deux résistances

Dans le cadre d'une mesure de tension ,la très faible valeur du courant entrant dans le convertisseur analogique/numérique valide l'hypothèse

Ce n'est plus le cas si un courant non négligeable sort du point de jonction des 2 résistances pour aller à l'extérieur


La sortie de ton pont diviseur est reliée à une entrée analogique, qui ne consomme absolument rien. La tension de sortie est donc fixe, car dans ce cas RL est pratiquement infinie.

Un module intelligent a une consommation qui varie, comme un µcontrôleur.
Lorsqu'il travaille, il consomme plus. Avec un pont diviseur, la tension de sortie sera donc variable en fonction de la consommation, puisque RL n'est ni infinie, ni fixe.

Mais comme la carte MPU6050 possède son propre régulateur 3.3V, la question ne se pose pas.

@hbachetti @al1fch merci ! :+1:

(arrache en catastrophe les résistances de sa breadboard) :grin:

Comme tu peux voir dans la datasheet : 6.3 Electrical and Other Common Specifications
En fonction de l'utilisation du MPU6050, le courant consommé varie entre :

  • 500µA : accéléromètre seul
  • 3.9mA : Gyroscope + Accelerometer + DMP

Un pont diviseur est donc impossible à calculer.

Merci de vos différentes réponses, ça m'éclaire un peu, mais j'ai un petit soucis, j'ai testé le code de i2c scanner et il me dit qu'une sous branche de la librairie wire n'est pas présente, ce problème est du à quoi

basic_readings:3:10: fatal error: utility/twi.h: No such file or directory
#include "utility/twi.h" // from Wire library, so we can do bus scanning
^~~~~~~~~~~~~~~
compilation terminated.
exit status 1
utility/twi.h: No such file or directory

et bah c'est que mon exemple était pourri désolé, c'était genre le 1er résultat google.
On va pas se laisser impressionner!

Celui là, c'est le dernier que j'ai utilisé (pour mon ESP32) et il vient de ma bibliothèque perso. Garanti roulé à la main sous les aisselles (edit: après avoir été copié du web, j'ai pas fait ça tout seul non plus...)

#include <Arduino.h>
#include <Wire.h>

void setup() {

  Wire.begin();
  Serial.begin(115200);
//  while (!Serial);
    
  Serial.println("\nI2C Scanner");
}

void loop() {
  SCAN();
}

void SCAN() {
  byte error, address;
  int nDevices;
  Serial.println("Scanning...");
  nDevices = 0;
  for (address = 1; address < 127; address++) {
    // The i2c_scanner uses the return value of
    // the Write.endTransmisstion to see if
    // a device did acknowledge to the address.
    Wire.beginTransmission(address);
    error = Wire.endTransmission();
    if (error == 0) {
      Serial.print("I2C device found at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.print(address, HEX);
      Serial.println("  !");
      nDevices++;
    } else if (error == 4) {
      Serial.print("Unknown error at address 0x");
      if (address < 16)
        Serial.print("0");
      Serial.println(address, HEX);
    }
  }
  if (nDevices == 0)
    Serial.println("No I2C devices found\n");
  else
    Serial.println("done\n");
  delay(5000);  // wait 5 seconds for next scan
}

Alors j'ai testé ton code aucune erreur niquel, mais petit probleme ça me detecte pas mon accelerometre ... x)
Capture d’écran 2023-03-13 140250

Bien. Parfait et zut à la fois.

tu as bien inversé tes fils A4 et A5 ?

je vais mettre le doute sur le programme que je t'ai filé. Tu crois que tu peux en trouver un (3ème!) sur le net par tes propres moyens? Au moins on sera sur que je l'ai pas modifié par erreur.

Je reviens avec de bonnes nouvelles

J'ai réussi à faire marcher mon accéléromètre correctement, et à l'importer dans mon code principal merci pour ton programme, ton temps et ton aide surtout :slight_smile:

oh! c'est trop bien :grinning:
un module qui fonctionne, ça change la vie!

mais du coup, qu'as tu fait pour le mettre en marche? (et garde en tête les petites astuces du scanner I2C pour les futurs modules)

Le probleme c'est que les A4 et A5 sont pour une arduino uno et moi j'ai une mega, donc je les ai branché aux broches 20 et 21 qui sont les broches SDA et SCL de la arduino mega

Oui je m'en souviendrai, merci encore :+1:

Tu l'aurais annoncé dès le départ ...
A relire absolument :

Décrivez les manipulations déjà effectuées pour débuguer ainsi que toute information pertinente (matériel concerné, OS utilisé, version IDE utilisée, schéma électronique du montage, alimentation, etc).

Pour la prochaine fois, tu auras peut-être appris à lire ...

et apprendre à parler plus gentiment ça fait pas parti des règles apparemment ...