re
on y accède par une sub adresse comme le reste, c'est toujours la même et on reçoit a la queue leu leu les différentes valeurs dans l'ordre spécifié sur la DS.
Cela utilise le mode burst read de l'I²C
JR
-----
re
on y accède par une sub adresse comme le reste, c'est toujours la même et on reçoit a la queue leu leu les différentes valeurs dans l'ordre spécifié sur la DS.
Cela utilise le mode burst read de l'I²C
JR
l'électronique c'est pas du vaudou!
J'ai vu que dans la datasheet il y a un registre pour activer la fifo pour les données d'accélération, mais je n'ai pas trouvé le buffer.
Aussi, est ce que ducoup le buffer remplace les adresses des registres d'accéléromètre gyro etc? et dans ce cas j'imagine que les registres sont lus dans l'ordre comme tu viens de le dire.
"Mode burst" signifie juste que les données arrivent dans l'ordre des registres?
bonjour,
le mode burst signifie qu’après avoir adressé la FIFO il suffit d'enchainer les read pour recevoir une nouvelle valeur c'est beaucoup plus rapide que la lecture à l'unité des registres.
La fifo est à l'adresse 0x74.
JR
l'électronique c'est pas du vaudou!
Bonjour, merci pour ta réponse JR. Donc effectivement je connaissais ce mode mais je ne savais pas qu'il se nommait mode "burst". J'ai maintenant 2 question :
Où as-tu trouvé l'adresse? (numero de page datasheet stp)
Et ce matin j'ai commencé le code pour transmettre mes données aux micros esclave pour qu'il puise ordonner aux vérins s'il faut monter ou descendre :
en revanche le compilo me renvoie "condition always TRUE" ou FALSE, à cause de mes valeurs négatives dans mes conditions je ne sais donc pas comment l'écrire pour que le compilo l'accepte.Code:CODE: if (axeY >= (-1200)) { sens = 1; } else if (axeY <= (-1400)) { sens = 2; } else sens = 0; if (axeX >= (-200)) { sens2 = 1; } else if (axeX <= (-400)) { sens2 = 2; } else sens2 = 0;
Dernière modification par gienas ; 24/01/2023 à 13h48. Motif: Ajouté les balises code, obligatoires pour les programmes
J'ai réussi à lire la FIFO et avoir les données, en revanche elles n'arrivent pas dans le bon ordre de temps en temps, faudrait-il faire un reset du buffer?
voici ma fonction qui lit les données actuellement :
/////////////////////////////////////////////////////////
//MPU READ//
////////////////////////////////////////////////////////
void Read_Sensor (int8 REG_add)
{
int MSB ;
int LSB;
int16 AxeX;
int16 AxeY;
int16 AxeZ;
i2c_start();
i2c_write(0xD0);
i2c_write(REG_add);
i2c_start();
i2c_write(0xD1); //start with the address in read mode
MSB = i2c_read();
LSB = i2c_read();
AxeX = make16(MSB, LSB);
MSB = i2c_read();
LSB = i2c_read();
AxeY = make16(MSB, LSB);
MSB = i2c_read();
LSB = i2c_read(0);
AxeZ = make16(MSB, LSB);
i2c_stop();
printf("\n\r axe X: %Ld",AxeX);
printf("\n\r axe Y: %Ld",AxeY);
printf("\n\r axe Z: %Ld",AxeZ);
}
J'ai encore un peu avancé, mais toujours quelques soucis persistent voici mon code :
Et voici ce que je reçois:Code:///////////////////////////////////////////////////////// //MPU READ// //////////////////////////////////////////////////////// void Read_Sensor (int8 REG_add) { int MSB ; int LSB; int16 AxeX; int16 AxeY; int16 AxeZ; float fAxeX, fAxeY, fAxeZ; i2c_start(); i2c_write(0xD0); i2c_write(REG_add); i2c_start(); i2c_write(0xD1); //start with the address in read mode MSB = i2c_read(); LSB = i2c_read(); AxeX = make16(MSB, LSB); MSB = i2c_read(); LSB = i2c_read(); AxeY = make16(MSB, LSB); MSB = i2c_read(); LSB = i2c_read(0); AxeZ = make16(MSB, LSB); i2c_stop(); fAxeX = (float)AxeX/16384.0; fAxeY = (float)AxeY/16384.0; fAxeZ = (float)AxeZ/16384.0; printf("\n\r axe X: %f",fAxeX); printf("\n\r axe Y: %f",fAxeY); printf("\n\r axe Z: %f",fAxeZ); }
comme vous pouvez le voir il arrive que les valeurs de Z et Y s'inversent, de plus il me semble que je ne suis pas censé recevoir des valeurs aussi hautes
Si quelqu'un a une idée du problème, merci de répondre ^^ .
bonjour,
un lien interessant concernant le pilotage d'un Drone CrazyFlie avec un ESP32
c'est donc pas un PIC ,
mais la partie capteur donne beaucoup de renseignements
bonjour,
quelle est la valeur de REG_add?
JR
l'électronique c'est pas du vaudou!
Je viens de regarder ton lien, il me semble que la personne utilise une manière différente, ça ne m'aide pas beaucoup pour mon problème actuel mais merci quand même ^^
Bonjour JR, dans REG_add j'ai mis l'adresse du buffer de la fifo. Les valeurs que je reçoit sont à peu près correct mais je vois bien que de temps en temps il mélange les valeurs.
Re
il faut se synchroniser sur le bit data ready, le LSB à l'adresse 0x3A.
JR
l'électronique c'est pas du vaudou!
Je vois ce que tu veux dire, il faut que mon micro lise le capteur uniquement quand ce bit data_ready est à 1?
Mais est ce que cela est utile sachant que je n'utilise pas la pin INT sur mon capteur? ou alors les deux n'ont rien à voir?
re
non tu n'es pas obligé d'utiliser la pin INT, mais il faudra tout de même activer la fonction , LSB registre 0x38.
JR
l'électronique c'est pas du vaudou!
Ah je vois, mais je l'ai déjà activé voici mon init :
Code:void MPU6050_Init() { write_reg(PWR_MGMT_1, 0x01); delay_ms(100); write_reg(CONFIG, 0x00); delay_ms(10); write_reg(GYRO_CONFIG, 0x18); // Pourquoi configurer Gyro et pas Accé delay_ms(10); write_reg(ACCEL_CONFIG, 0x00); // test 24/11 delay_ms(10); write_reg(SAMPLE_DRATE, 0x07); delay_ms(10); write_reg(INT_ENABLE, 0x01); delay_ms(10); write_reg(FIFO_EN, 0x40); delay_ms(100); write_reg(FIFO_CONFIG, 0x08); delay_ms(100); }
Je remarque aussi que je n'obtiens plus de valeurs négatives lorsque je rajoute la division par 16384.0 et qu'en plus de ça les valeurs ne varient pas vraiment selon le capteur comme si elles changeaient aléatoirement dans le registre.
Sans la division j'obtiens ce genre de valeur