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