Problème lecture MPU6050

Bonjour,
Pour un projet et doit utiliser un gyroscope et de MPU6050 se semble bien pour ca
Mais soucis, j'avais anticiper la réception en regardant des tutos et tout me semblais simple
Mais depuis que je l'ai reçu absolument rien ne se passe ...
Je vous demande donc de l'aide pour savoir ou es les probleme ...

Dans chaque programme que je teste il y a " mpu.initialize(); " et c'est toujours a cette ligne que le programme de bloque ... enfin je ne vois pas d'autre piste

Merci e votre aide !

Bonjour,

Peux-tu poster la référence du matériel que tu as acheté, une photo du câblage et ton code ?

Câblage et code. Ca sent la bibliothèque pas déclarée. Comment tu sais qu'il "bloque", il ne veut pas téléverser, ou alors ... tu sais comment?
Sans schéma de câblage ni code, impossible d'aider.

Merci pour les réponses !

Voila le schema et le code :stuck_out_tongue:

Et je suppose que sa bloque ici parce que chaque fois que je teste un nouveau code tout ce qu sa passe avant marche mais pas la suite

Meme un programme de test de liaison i2c ne donne pas de resultats

Je suis avec un UNO et un Nano, et la puce c'est gy-521

// I2Cdev and MPU6050 must be installed as libraries
#include "I2Cdev.h"
#include "MPU6050.h"
#include "Wire.h"

/////////////////////////////////// CONFIGURATION /////////////////////////////
//Change this 3 variables if you want to fine tune the skecth to your needs.
int buffersize=1000; //Amount of readings used to average, make it higher to get more precision but sketch will be slower (default:1000)
int acel_deadzone=8; //Acelerometer error allowed, make it lower to get more precision, but sketch may not converge (default:8)
int giro_deadzone=1; //Giro error allowed, make it lower to get more precision, but sketch may not converge (default:1)

// default I2C address is 0x68
// specific I2C addresses may be passed as a parameter here
// AD0 low = 0x68 (default for InvenSense evaluation board)
// AD0 high = 0x69
//MPU6050 accelgyro;
MPU6050 accelgyro(0x68); // <-- use for AD0 high

int16_t ax, ay, az,gx, gy, gz;

int mean_ax,mean_ay,mean_az,mean_gx,mean_gy,mean_gz,state=0;
int ax_offset,ay_offset,az_offset,gx_offset,gy_offset,gz_offset;

/////////////////////////////////// SETUP ////////////////////////////////////
void setup() {
// join I2C bus (I2Cdev library doesn't do this automatically)
Wire.begin();
// COMMENT NEXT LINE IF YOU ARE USING ARDUINO DUE
TWBR = 24; // 400kHz I2C clock (200kHz if CPU is 8MHz). Leonardo measured 250kHz.

// initialize serial communication
Serial.begin(115200);

// initialize device
accelgyro.initialize();

// wait for ready
while (Serial.available() && Serial.read()); // empty buffer
while (!Serial.available()){
Serial.println(F("Send any character to start sketch.\n"));
delay(1500);
}
while (Serial.available() && Serial.read()); // empty buffer again

// start message
Serial.println("\nMPU6050 Calibration Sketch");
delay(2000);
Serial.println("\nYour MPU6050 should be placed in horizontal position, with package letters facing up. \nDon't touch it until you see a finish message.\n");
delay(3000);
// verify connection
Serial.println(accelgyro.testConnection() ? "MPU6050 connection successful" : "MPU6050 connection failed");
delay(1000);
// reset offsets
accelgyro.setXAccelOffset(0);
accelgyro.setYAccelOffset(0);
accelgyro.setZAccelOffset(0);
accelgyro.setXGyroOffset(0);
accelgyro.setYGyroOffset(0);
accelgyro.setZGyroOffset(0);
}

/////////////////////////////////// LOOP ////////////////////////////////////
void loop() {
if (state==0){
Serial.println("\nReading sensors for first time...");
meansensors();
state++;
delay(1000);
}

if (state==1) {
Serial.println("\nCalculating offsets...");
calibration();
state++;
delay(1000);
}

if (state==2) {
meansensors();
Serial.println("\nFINISHED!");
Serial.print("\nSensor readings with offsets:\t");
Serial.print(mean_ax);
Serial.print("\t");
Serial.print(mean_ay);
Serial.print("\t");
Serial.print(mean_az);
Serial.print("\t");
Serial.print(mean_gx);
Serial.print("\t");
Serial.print(mean_gy);
Serial.print("\t");
Serial.println(mean_gz);
Serial.print("Your offsets:\t");
Serial.print(ax_offset);
Serial.print("\t");
Serial.print(ay_offset);
Serial.print("\t");
Serial.print(az_offset);
Serial.print("\t");
Serial.print(gx_offset);
Serial.print("\t");
Serial.print(gy_offset);
Serial.print("\t");
Serial.println(gz_offset);
Serial.println("\nData is printed as: acelX acelY acelZ giroX giroY giroZ");
Serial.println("Check that your sensor readings are close to 0 0 16384 0 0 0");
Serial.println("If calibration was succesful write down your offsets so you can set them in your projects using something similar to mpu.setXAccelOffset(youroffset)");
while (1);
}
}

/////////////////////////////////// FUNCTIONS ////////////////////////////////////
void meansensors(){
long i=0,buff_ax=0,buff_ay=0,buff_az=0,buff_gx=0,buff_gy=0,buff_gz=0;

while (i<(buffersize+101)){
// read raw accel/gyro measurements from device
accelgyro.getMotion6(&ax, &ay, &az, &gx, &gy, &gz);

if (i>100 && i<=(buffersize+100)){ //First 100 measures are discarded
buff_ax=buff_ax+ax;
buff_ay=buff_ay+ay;
buff_az=buff_az+az;
buff_gx=buff_gx+gx;
buff_gy=buff_gy+gy;
buff_gz=buff_gz+gz;
}
if (i==(buffersize+100)){
mean_ax=buff_ax/buffersize;
mean_ay=buff_ay/buffersize;
mean_az=buff_az/buffersize;
mean_gx=buff_gx/buffersize;
mean_gy=buff_gy/buffersize;
mean_gz=buff_gz/buffersize;
}
i++;
delay(2); //Needed so we don't get repeated measures
}
}

void calibration(){
ax_offset=-mean_ax/8;
ay_offset=-mean_ay/8;
az_offset=(16384-mean_az)/8;

gx_offset=-mean_gx/4;
gy_offset=-mean_gy/4;
gz_offset=-mean_gz/4;
while (1){
int ready=0;
accelgyro.setXAccelOffset(ax_offset);
accelgyro.setYAccelOffset(ay_offset);
accelgyro.setZAccelOffset(az_offset);

accelgyro.setXGyroOffset(gx_offset);
accelgyro.setYGyroOffset(gy_offset);
accelgyro.setZGyroOffset(gz_offset);

meansensors();
Serial.println("...");

if (abs(mean_ax)<=acel_deadzone) ready++;
else ax_offset=ax_offset-mean_ax/acel_deadzone;

if (abs(mean_ay)<=acel_deadzone) ready++;
else ay_offset=ay_offset-mean_ay/acel_deadzone;

if (abs(16384-mean_az)<=acel_deadzone) ready++;
else az_offset=az_offset+(16384-mean_az)/acel_deadzone;

if (abs(mean_gx)<=giro_deadzone) ready++;
else gx_offset=gx_offset-mean_gx/(giro_deadzone+1);

if (abs(mean_gy)<=giro_deadzone) ready++;
else gy_offset=gy_offset-mean_gy/(giro_deadzone+1);

if (abs(mean_gz)<=giro_deadzone) ready++;
else gz_offset=gz_offset-mean_gz/(giro_deadzone+1);

if (ready==6) break;
}
}

Si vous avez un code plus simple pour tester je suis preneur !
Il me faut simplement l'angle sur chaque axes

Tu as plein de ressources et des choses très simples ici: Arduino Playground - MPU-6050.

A part ça, qu'est-ce qui s'affiche dans ton moniteur série ?

J'ai charger le premier code et regarder la suite mais rien de plus ... le moniteur est vide
Dans le doute j'ai recommander un arduino uno, peut être que le probleme viens de lui

Voila le code :

// MPU-6050 Short Example Sketch
// By Arduino User JohnChi
// August 17, 2014
// Public Domain
#include<Wire.h>
const int MPU_addr=0x68; // I2C address of the MPU-6050
int16_t AcX,AcY,AcZ,Tmp,GyX,GyY,GyZ;
void setup(){
Wire.begin();
Wire.beginTransmission(MPU_addr);
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); // set to zero (wakes up the MPU-6050)
Wire.endTransmission(true);
Serial.begin(9600);
}
void loop(){
Wire.beginTransmission(MPU_addr);
Wire.write(0x3B); // starting with register 0x3B (ACCEL_XOUT_H)
Wire.endTransmission(false);
Wire.requestFrom(MPU_addr,14,true); // request a total of 14 registers
AcX=Wire.read()<<8|Wire.read(); // 0x3B (ACCEL_XOUT_H) & 0x3C (ACCEL_XOUT_L)
AcY=Wire.read()<<8|Wire.read(); // 0x3D (ACCEL_YOUT_H) & 0x3E (ACCEL_YOUT_L)
AcZ=Wire.read()<<8|Wire.read(); // 0x3F (ACCEL_ZOUT_H) & 0x40 (ACCEL_ZOUT_L)
Tmp=Wire.read()<<8|Wire.read(); // 0x41 (TEMP_OUT_H) & 0x42 (TEMP_OUT_L)
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
GyY=Wire.read()<<8|Wire.read(); // 0x45 (GYRO_YOUT_H) & 0x46 (GYRO_YOUT_L)
GyZ=Wire.read()<<8|Wire.read(); // 0x47 (GYRO_ZOUT_H) & 0x48 (GYRO_ZOUT_L)
Serial.print("AcX = "); Serial.print(AcX);
Serial.print(" | AcY = "); Serial.print(AcY);
Serial.print(" | AcZ = "); Serial.print(AcZ);
Serial.print(" | Tmp = "); Serial.print(Tmp/340.00+36.53); //equation for temperature in degrees C from datasheet
Serial.print(" | GyX = "); Serial.print(GyX);
Serial.print(" | GyY = "); Serial.print(GyY);
Serial.print(" | GyZ = "); Serial.println(GyZ);
delay(333);
}

Mets des Serial.println("quelque chose") après chaque ligne pour voir où ça plante.

Apres "Wire.endTransmission(true);" il ne se passe plus rien, c'est ici que sa bug

Essaie ce code: i2cdevlib/MPU6050_raw.ino at master · jrowberg/i2cdevlib · GitHub

Meme soucis

J'ai
Initialdevices...
Initializing I2C devices...

dans le moniteur

OK. Maintenant, tu ne vas pas pouvoir échapper à une photo (et non pas un schéma) de ton montage.
Désolé, mais ça ne serait pas la première fois que quelqu'un inverse SDA et SCL... (que celui à qui ça n'est jamais arrivé lève la main)

Je pense avoir trouver le probleme !
J'ai fait tout les testes avec mon uno parce que les nanos ne veulent pas téléverser le code, pas un gros probleme, mais j'ai tester les entrées analogiques de l'uno mais elles donnes des valeurs complètent fausses !! Les entrées A2 A4 A5 ne marche pas donc le probleme viens d'ici a tout les coups ?
Il y a t'il un moyen d'utiliser les entrées A0 et A1 pour mon montage ?

Mais voila la photo quand même, si tu as un doute sur les câbles je les ai tester et ils sont tous bien :smiley:
Et j'ai retester les codes en changeant les 2 et même probleme :stuck_out_tongue:

Si tu as une Uno récente, les broches SDA et SCL sont aussi présentes à l'opposé de A4 et A5 (cherche un pinout sur le Web).

Non malheureusement je n'ai pas les 2 pins en plus a cote de AREF :confused:
Mais le probleme viens de ca ?
Aucun moyen de faire un changements de pins ?

Non. La photo est passée à la trappe.
Pas d'autre matériel sous la main ?

Mince :confused:
Non je n'ai rien d'autre, je vais attendre le nouveau uno et j’espère que le probleme sera résolu !
Mais au vu de ce que tu mas dit je suppose que le probleme viens vraiment de ca !

Il est pas tout jeune cet arduino ! Il en as connus des programmes :smiley: et j'ai surement du le cramer une fois :confused:

Salut, tu peux aussi essayer avec une autre bibliothèque que j'ai créé:

Ouvre l'exemple, et je pense que se sera une bonne base :wink:

Il n'y a seulement qu'une dizaine de ligne, a toi de voir...

Je vois ca ! Merci de votre aide !
Quand j'ai recu le nouvel arduino je reviens vers vous !