Décrypter hexa reçu

Bonjour !

J'ai un MPU 6050 bluetooth.
Je l'ai connecté à une carte arduino due, elle-même connecter à mon ordinateur.

J'ai ensuite utilisé une app android (bluetooth spp pro) qui me permet de recevoir par bluetooth les données du capteur (donc normalement accélération, etc etc).

Je capte bien quelque chose. J'ai sauvegardé ce que je reçois.
C'est de l'hexa. j'ai donc essayé de le convertir en ASCII mais cela reste illisible.

Help me please !

PS: en piece jointe, je met le fichier .txt qui comprend justement les données récupérées.

0920093142.txt (9.28 KB)

blabllou:
Bonjour !

J'ai un MPU 6050 bluetooth.
Je l'ai connecté à une carte arduino due, elle-même connecter à mon ordinateur.

J'ai ensuite utilisé une app android (bluetooth spp pro) qui me permet de recevoir par bluetooth les données du capteur (donc normalement accélération, etc etc).

vous avez aussi sans doute chargé un programme dans votre Arduino, non? la réponse à votre question se trouve dans le code source de ce point important que vous avez omis de joindre à votre post...

En fait, c'est un capteur déjà pré-programmé. Enfin il est censé l'être haha !
C'est un MPU 6050 avec bluetooth incorporé.
8 broches disponibles (4 seulement ont été soudé à des broches et sont GND VCC TX RX).
Je l'ai simplement branché à ma carte arduino elle meme branché à l'ordi.

J'ai ensuite activé le bluetooth de mon tel et je l'ai connecté directement sans avoir eu besoin de téléverser du code bluetooth etc. J'ai donc ensuité récupéré ces données.

lien sur le produit?

ce qu'il envoie doit être documenté quelque part :slight_smile:

BJY901 MPU6050 !
Justement, il est censé rendre les valeurs du gyro et de l'accéléromètre :o :o

Bonjour,
je confirme que la documentation peut se trouver facilement

J'ai la doc, la datasheet, le register map !
Mais je n'arrive pas à comprendre ce qu'il envoie.

Je vais profiter de ce sujet pour poser une deuxième petite question.
Est ce qu'il est possible en passant par les broches SDA et SCL de remettre à zéro le capteur et de le coder soi -même ?

J'aimerais que cela soit possible.

J'ai la doc, la datasheet, le register map !

Il faudrait que tu nous montre cette doc pour dissiper tout risque de confusion, car le module existe sous différentes formes

J'ai récuperer une doc sur internet également..
J'ai commandé sur amazon et il y avait deux liens qui devait me diriger vers des explications justement mais ils étaient morts.
Comme document j'ai ça (je les uploads)

Le register map a le titre de mpu 6000 mais quand on l'ouvre il correspond aussi au 6050.
datasheet : https://store.invensense.com/datasheets/invensense/MPU-6050_DataSheet_V3%204.pdf

RM-MPU-6000A-00v4.2.pdf (900 KB)

Regardez les réponses sur ce lien

vous pouvez téléchargez d'un google drive tout un répertoire de trucs. je ne ferais pas trop confiance au .exe venant d'un endroit inconnu mais il y a un bout de code arduino tout à fait parlant sur ce qui est envoyé sur le port série (et google translate peut vous aider avec les commentaires en chinois)

/*
This code is used for connecting arduino to serial mpu6050 module, and test in arduino uno R3 board.
connect map:
arduino   mpu6050 module
VCC    5v/3.3v
TX     RX<-0
TX     TX->1
GND    GND
note: 
because arduino download and mpu6050 are using the same serial port, you need to un-connect 6050 module when you want to download program to arduino.
 Created 14 Nov 2013
 by Zhaowen
 
 serial mpu6050 module can be found in the link below:
 http://item.taobao.com/item.htm?id=19785706431
 */

unsigned char Re_buf[11],counter=0;
unsigned char sign=0;
float a[3],w[3],angle[3],T;
void setup() {
  // initialize serial:
  Serial.begin(115200);
}

void loop() {
  if(sign)
  {  
     sign=0;
     if(Re_buf[0]==0x55)      //检查帧头
     {  
	switch(Re_buf [1])
	{
	case 0x51:
		a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*16;
		a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*16;
		a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*16;
		T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
		break;
	case 0x52:
		w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*2000;
		w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*2000;
		w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*2000;
		T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
		break;
	case 0x53:
        	angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0*180;
		angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0*180;
		angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
		T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
                Serial.print("a:");
                Serial.print(a[0]);Serial.print(" ");
                Serial.print(a[1]);Serial.print(" ");
                Serial.print(a[2]);Serial.print(" ");
                Serial.print("w:");
                Serial.print(w[0]);Serial.print(" ");
                Serial.print(w[1]);Serial.print(" ");
                Serial.print(a[2]);Serial.print(" ");
                Serial.print("angle:");
                Serial.print(angle[0]);Serial.print(" ");
                Serial.print(angle[1]);Serial.print(" ");
                Serial.print(angle[2]);Serial.print(" ");
                Serial.print("T:");
                Serial.println(T);
                break;
	} 
    }
  } 
}

void serialEvent() {
  while (Serial.available()) {
    
    //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code 
  
    Re_buf[counter]=(unsigned char)Serial.read();
    if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头              
    counter++;       
    if(counter==11)             //接收到11个数据
    {    
       counter=0;               //重新赋值,准备下一帧数据的接收 
       sign=1;
    }
      
  }
}

ce module existe avec 2 mcu : stm8 ou stm32
on a peut-être le même protocole, mais il serait bien que blabllou nous dise exactement ce qu'il a acheté

le datasheet du MPU-6050 est secondaire en un premier temps, car l'intérêt du module est justement d'en simplifier l'interfaçage au niveau du soft

J-M-L:
Regardez les réponses sur ce lien

vous pouvez téléchargez d'un google drive tout un répertoire de trucs. je ne ferais pas trop confiance au .exe venant d'un endroit inconnu mais il y a un bout de code arduino tout à fait parlant sur ce qui est envoyé sur le port série (et google translate peut vous aider avec les commentaires en chinois)

/*

This code is used for connecting arduino to serial mpu6050 module, and test in arduino uno R3 board.
connect map:
arduino  mpu6050 module
VCC    5v/3.3v
TX    RX<-0
TX    TX->1
GND    GND
note:
because arduino download and mpu6050 are using the same serial port, you need to un-connect 6050 module when you want to download program to arduino.
Created 14 Nov 2013
by Zhaowen

serial mpu6050 module can be found in the link below:
http://item.taobao.com/item.htm?id=19785706431
*/

unsigned char Re_buf[11],counter=0;
unsigned char sign=0;
float a[3],w[3],angle[3],T;
void setup() {
  // initialize serial:
  Serial.begin(115200);
}

void loop() {
  if(sign)
  { 
    sign=0;
    if(Re_buf[0]==0x55)      //检查帧头
    { 
switch(Re_buf [1])
{
case 0x51:
a[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.016;
a[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0
16;
a[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.016;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x52:
w[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0
2000;
w[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.02000;
w[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0
2000;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
break;
case 0x53:
        angle[0] = (short(Re_buf [3]<<8| Re_buf [2]))/32768.0180;
angle[1] = (short(Re_buf [5]<<8| Re_buf [4]))/32768.0
180;
angle[2] = (short(Re_buf [7]<<8| Re_buf [6]))/32768.0*180;
T = (short(Re_buf [9]<<8| Re_buf [8]))/340.0+36.25;
                Serial.print("a:");
                Serial.print(a[0]);Serial.print(" ");
                Serial.print(a[1]);Serial.print(" ");
                Serial.print(a[2]);Serial.print(" ");
                Serial.print("w:");
                Serial.print(w[0]);Serial.print(" ");
                Serial.print(w[1]);Serial.print(" ");
                Serial.print(a[2]);Serial.print(" ");
                Serial.print("angle:");
                Serial.print(angle[0]);Serial.print(" ");
                Serial.print(angle[1]);Serial.print(" ");
                Serial.print(angle[2]);Serial.print(" ");
                Serial.print("T:");
                Serial.println(T);
                break;
}
    }
  }
}

void serialEvent() {
  while (Serial.available()) {
   
    //char inChar = (char)Serial.read(); Serial.print(inChar); //Output Original Data, use this code
 
    Re_buf[counter]=(unsigned char)Serial.read();
    if(counter==0&&Re_buf[0]!=0x55) return;      //第0号数据不是帧头             
    counter++;     
    if(counter==11)            //接收到11个数据
    {   
      counter=0;              //重新赋值,准备下一帧数据的接收
      sign=1;
    }
     
  }
}

Il y a pas mal de bon truc dans ce que vous m'avez donné ! Merci !

Je vous donne le lien de mon achat su Amazon :
https://www.amazon.fr/gp/product/B01LY93OHS/ref=oh_aui_detailpage_o03_s00?ie=UTF8&psc=1

Le lien que j’ai donné comprend toutes les infos techniques nécessaires pour comprendre ce qui est envoyé sur le port série et comment transformer ces octets en information

il faut d'abord recevoir 11 octets pour avoir une trame complète

  • le premier doit être 0x55
  • le second définit le type de data reçu et peut être 0x51 , 0x52 ou 0x53 pour les 3 axes d'accélération, de vitesse angulaire et axes magnétiques plus la température sans doute.
  • le code montre les formules à utiliser et dans quels octets/bits sont rangés quels éléments

(leur code n'est sans doute pas super solide s'il y a un décalage sur le premier élément du buffer)

Le lien que j'ai donné

Bonjour,
... est celui du module à stm8

le lien de mon achat su Amazon

... c'est le module à stm32

... bon, c'est peut-être le même protocole, on verra bien
(le module acheté comprend des pads pour un capteur de pression, qui n'est pas implémenté)

À creuser donc!

Je reviens vers vous pour dire que je n'ai pas réussi à décrypter la moindre chose ! Merci quand même pour vos réponses :confused:

Bonjour,
peux-tu au moins nous montrer ce que tu as envoyé et reçu ?

blabllou:
PS: en piece jointe, je met le fichier .txt qui comprend justement les données récupérées.

Pour info, si vous regardez votre fichier vous avez

[color=red]55[/color] [color=green]51[/color] 06 00 19 FF 2D 08 [color=purple]BE 0E[/color] [color=orange]C5[/color]
[color=red]55[/color] [color=green]52[/color] 00 00 00 00 00 00 [color=purple]BE 0E[/color] [color=orange]73[/color]
[color=red]55[/color] [color=green]53[/color] 8D FB E9 FF 90 5A [color=purple]BE 0E[/color] [color=orange]CE[/color]
[color=red]55[/color] [color=green]54[/color] CB 00 33 FF B3 01 [color=purple]BE 0E[/color] [color=orange]26[/color]
[color=red]55[/color] [color=blue]51[/color] 04 00 1D FF 2E 08 [color=purple]C0 0E[/color] [color=orange]CA[/color]
[color=red]55[/color] [color=blue]52[/color] 00 00 00 00 00 00 [color=purple]C0 0E[/color] [color=orange]75[/color]
[color=red]55[/color] [color=blue]53[/color] 8E FB E9 FF 93 5A [color=purple]C0 0E[/color] [color=orange]D4[/color]
[color=red]55[/color] [color=blue]54[/color] CD 00 33 FF B3 01 [color=purple]C0 0E[/color] [color=orange]2A[/color]
etc....

en rouge vous avez le 55 qui est le marqueur de début de trame

ensuite vous avez un indicateur du contenu de la trame, les trames vont se répéter (vert et bleu ci dessus) 51 c'est l'accélération, 52 la vitesse angulaire, 53 le lacet, tangage roulis, 54 l'orientation magnétique

ensuite les 3 données sur deux octets à combiner par une formule magique (cf la doc). les octets sont en little endian, donc poids faible d'abord, puis poids fort

puis en violet c'est la température sur deux octets (x100)
enfin en orange c'est un checksum (la somme de tous les autres octets de la trame)

voilà :slight_smile:

Bonjour

j'ai trouvé la doc en ligne

j'ai récupéré un composant BJY901 MPU6050 Bluetooth

J'ai essayé avec l'aide de la doc et ça avait l'air de fonctionner.

blabllou:
Je vais profiter de ce sujet pour poser une deuxième petite question.
Est ce qu'il est possible en passant par les broches SDA et SCL de remettre à zéro le capteur et de le coder soi -même ?

J'aimerais que cela soit possible.

pas de soucis pour attaquer les registres directement en suivant la doc par I2C. j'arrive à les écrire et relire.

Voilà un bout de code à regarder (à vos risques et périls, ça n'a pas grillé le mien).

  • ça fonctionne sur un MEGA pour avoir 2 ports Séries

ça démontre

  • comment utiliser I2C pour configurer certains registres (un booléen pour sauter cette partie du code si vous voulez)

  • comment analyser ce que l'on reçoit sur le port Serie

Il ne reste plus qu'à vérifier si les valeurs obtenues ont un sens, j'ai utilisé les formules de la doc et ça me semble un peu farfelu pour le moment :slight_smile:


J'ai eu aussi à un moment une galère en jouant avec les registres et plus rien ne marchait. Voilà comment on fait reset sur son module (photo de mon module)

  • vous débranchez tout sauf la masse GND
  • vous mettez en contact la broche D2 et la broche VCC
  • vous alimentez Vcc (5V)
  • la LED doit s'allumer 2 secondes puis s'éteindre
  • c'est bon le reset est fait :slight_smile:

(attention aux court-circuits ! )

(enfin pour moi ça à marché, il a fallu essayer 2 ou 3 fois pour avoir un bon contact avant l'allumage avec un petit fil, faut pas bouger)

BJY901_MPU6050_I2C.ino (12.8 KB)