Articles les plus consultés

mardi 2 octobre 2018

Mise en oeuvre du GY 26


La vitesse de transmission série du module GY 26 est de 9600bps.

Il s'agit bien d'un véritable compas (comparable a une bousole) et non pas un gyro-compas 3 axes (qu'il est d'ailleur difficile a configurer et est plutôt réservé pour la stabilisation des drones-hélico...)
Ce module là est bien facile a utiliser et est relativement bien précis, suivant mes tests.
Quand on envoie la "commande" (0x31) sur le port série, le module GY 26 répond par une trame de 8 octets au format ASCII dont voici le détail:

Octet0:0x0D              "Enter" en ASCII
Octet1:0x0A              "new line" en ASCII
Octet2:0x30~0x33     Chiffre des centaine de l'angle (0 à 3)
Octet3:0x30~0x39     Chiffre des dizaine de l'angle (0 à 9)
Octet4:0x30~0x39     Chiffre des unités de l'angle (0 à 9)
Octet5:0x2E               "point décimal" en ASCII
Octet6: 0x30~0x39     Chiffre de la décimale de l'angle (0 à 9)
Octet7: 0x00~0xFF     (somme de vérification)

Octet7= partie basse des octets (Octet0+ Octet1+ Octet2+……Octet6)

Exemple: <0x0D-0x0A-0x33-0x35-0x39-0x2E-0x36-0x1C> = 359.6°


Dans notre projet, seuls les octets 2,3 & 4 nous intéressent.
Nous allons créer un tableau "char" pour réceptionner nos 8 octets, car ils sont au format ASCII, puis nous capturerons les octets 2,3 & 4 pour les convertir au format "int".
 La valeur rendue va de 0° a 359°.


Voici un programme Arduino (Mega) de test:
_____________________________________________________________

/*
Gy-26 - Compass.
Base créee par Igor Araujo
Ce programme récupére les données d'une boussole électronique
et l'affiche sur le port serie vers l'ordinateur
a tester!!!
 Serial 2: 17 (RX) and 16 (TX)
*/

 // RX is digital pin 17 (connect to TX of other device)
 // TX is digital pin 16 (connect to RX of other device)

char ChaineBoussole[8];
int ResultatDegresBoussole = 0;
int compteur = 0;
byte Drapeau = 0;

void setup() {
  // Mise en route du port série et serie2
  Serial2.begin(9600);
  Serial.begin(9600);
  // test connection serie:
  Serial.println("Goodnight moon!");
}


void loop() {
  Lecture();
}

void Lecture() {
  // vidange tampon serie
  compteur = 0;
  while (Serial2.available()) {
      ChaineBoussole[compteur] = Serial2.read();
  }
  Drapeau = 0; // drapeau va bloquer le programme le temps que les datas soient transmis par le module
  // demande de réception datas
  Serial2.write(0x31);
  while (Drapeau == 0) {
    if (Serial2.available()) {
      ChaineBoussole[compteur] = Serial2.read();
      compteur = (++ compteur);
      if (compteur == 5) {
        ResultatDegresBoussole = (ChaineBoussole[2] - 48) * 100 + (ChaineBoussole[3] - 48) * 10 + (ChaineBoussole[4] - 48);
        Drapeau = 1;
      }
    }
  }
  Serial.println(ResultatDegresBoussole);
  delay(500);
}

Aucun commentaire:

Enregistrer un commentaire