Bienvenue aux nouveaux arrivants sur FantasPic !

- Pensez à lire les règles durant votre visite, il n'y en a pas beaucoup, mais encore faut-il les respecter .
- N’hésitez pas à faire des remarques et/ou suggestions sur le Forum, dans le but de l'améliorer et de rendre vos prochaines visites plus agréables.
- Vous pouvez regarder votre "panneau de l'utilisateur" afin de configurer vos préférences.
- Un passage par "l'utilisation du forum" est recommandé pour connaître les fonctionnalités du forum.

--- L’équipe FantasPic ---
Forum général sur le langage C !

Modérateur : Jérémy

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#1 Message par Jérémy » sam. 17 nov. 2018 10:50

Bonjour à tous,

JE souhaiterais ajouter sur mon robot, une boussole afin de connaitre son CAP et son orientation. A ma disposition je possède un module 9DOF . En essayant le module il me renvoie bien des valeurs.... des longues série de chiffres !

Je pense que la partie qui m’intéresse c'est le magnétomètre !

Les valeurs changent bien quand je tourne à plat la plaque sur lequel est implantée le module ( EasyPIC) . Je m'attendais à ce que seul, les valeurs de l'axe Z changent car je tourne bien a plat ( comme une boussole ). Mais en réalité deux sur les 3 changent beaucoup en tournant .

Connaissez vous un moyen ou la formule pour calculer l'angle par rapport au NORD magnétique, afin que j'en déduise un cap ?
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1136
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#2 Message par paulfjujo » sam. 17 nov. 2018 11:07

bonjour Jeremy et à tous,


je te souhaite bien du courage ..et du succes dans ta demarche.
j'ai testéune boussolle ( incluse dans un GPS) , s ans succes ..
tres compliqué (pour moi) pour obtenir quelque chose de sensé ..j'ai donc laissé tombé.

il faut aussi pre-initialiser le bidule en fonction de la longitude et latitude

extrait du source Clicker2_18F87J50_GPS_COMPAS_UBLOX_7N_LCD_EEprom1MB_160912.c
//http://www.magnetic-declination.com/
//Latitude: 45° 48' 34.8" N
//Longitude: 5° 3' 13.4" E
//Magnetic declination: +1° 19' => 0,020769? radian
// 1° -> 0,017453?
// 19 '= 0,316degres
// 1,316° => 0,022969 Radians

je ne sais pas si la precision (MikroC) de calcul Flottant 32 bits seulement est suffisante pour faire tous les calculs lié à cela.
Aides toi, le ciel ou Fantastpic t'aideras

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#3 Message par Jérémy » sam. 17 nov. 2018 11:23

Outchhh . Si t u y es frotté sans réussir .... ca risque d'être cossu mon histoire !!

J'ai vu quelques tuto avec arduino , ca doit bien être possible . Mais impossible pour le moment de trouver une formule donnant un cap .
Pourtant j'ai toutes les infos à ma disposition a savoir les 9 axes. grâce à la librairie de mikroC ;
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#4 Message par Jérémy » sam. 17 nov. 2018 11:48

J'ai trouve sur ce site :
http://tiptopboards.free.fr/arduino_for ... p?f=3&t=70

Ceci :

On affiche les 3 composantes X, Y, et Z du champ magnétique, le module, et l'angle de la boussole (à placer horizontalement).
Le module du vecteur magnétique M = sqr(X² + Y² + Z²).
L'angle = artan(y/x) est déduit des mesures X et Y. 
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#5 Message par Jérémy » dim. 18 nov. 2018 09:58

Cette formule m'a l'air de fonctionner !

Code : Tout sélectionner

    c9dof_readMag(  &magX,  &magY, &magZ );      // Je récupere les données du magnétometre
    Delay_10ms();

    Angle= atan2(magY,magX) * (180 / 3.14159265); // angle en degres
    
    if 
(Angle<0) {Angle=Angle+360;}
    
    FloatToStr_FixLen
(Angle, logText,6);          // J'affiche l'angle sur l'UART
    mikrobus_logWrite( logText, _LOG_TEXT );
    mikrobus_logWrite( "  ", _LOG_LINE );

    Delay_ms(100);


L'inconvénient c'est qu'il faut que le module soit bien à plat . Je vais creuser pour vérifier déjà que l’orientation est à peu prêt bonne. Et ensuite voir si avec les autres valeurs ( surtout celle du gyro), je peux pas améliorer les choses .
L'accélerometre ne doit pas être utile pour le CAP ; Par contre Ça aurait été un kiff de donné la vitesse du VHL grâce à lui ! ca risque d'être compliqué
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#6 Message par Jérémy » dim. 18 nov. 2018 10:19

<Ceci m'a l'air très prometteur :
https://sites.google.com/site/projethor ... gnetometre

Je vous tiens au jus
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
besqueut
Membre
Membre
Messages : 1
Enregistré en : septembre 2018

#7 Message par besqueut » lun. 19 nov. 2018 23:06

Jérémy a écrit :Cette formule m'a l'air de fonctionner !

Code : Tout sélectionner

    c9dof_readMag(  &magX,  &magY, &magZ );      // Je récupere les données du magnétometre
    Delay_10ms();

    Angle= atan2(magY,magX) * (180 / 3.14159265); // angle en degres
    
    if 
(Angle<0) {Angle=Angle+360;}
    
    FloatToStr_FixLen
(Angle, logText,6);          // J'affiche l'angle sur l'UART
    mikrobus_logWrite( logText, _LOG_TEXT );
    mikrobus_logWrite( "  ", _LOG_LINE );

    Delay_ms(100); 


L'inconvénient c'est qu'il faut que le module soit bien à plat . Je vais creuser pour vérifier déjà que l’orientation est à peu prêt bonne. Et ensuite voir si avec les autres valeurs ( surtout celle du gyro), je peux pas améliorer les choses .
L'accélerometre ne doit pas être utile pour le CAP ; Par contre Ça aurait été un kiff de donné la vitesse du VHL grâce à lui ! ca risque d'être compliqué

Oui : dans ce cas c'est simple et la formule est la bonne.

Dans le cas général, il faut calibrer le magnétomètre pour que ses 3 axes soient cohérents, au moins une fois, et de préférence de temps en temps.
https://github.com/kriswiner/MPU6050/wi ... alibration
Une fois fait, on peut mémoriser les valeurs de calibration et si on doit gagner de la place, supprimer le code de calibration.

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#8 Message par Jérémy » mar. 20 nov. 2018 17:50

Merci Besqueut pour votre réponse.

Je n'ai pas laissé tomber . je voulais juste me fabriquer une platine sympa pour expérimenter, mais comme à chaque fois je tombe sur un OS !
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
Jérémy
Administrateur du site
Administrateur du site
Messages : 2231
Âge : 39
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

#9 Message par Jérémy » jeu. 22 nov. 2018 17:27

Bonjour ,

Je viens de finir ma petite platine test, afin de mettre au point cette boussole.

Voici une partie du programme testé :

Code : Tout sélectionner


int16_t magX
, magY, magZ;

float Angle;

char T_Texte[ 30 ] = {0};

//############################     BOUCLE INFINIE     ##############################
 while(1){

    c9dof_readMag(  &magX,  &magY, &magZ );      // Je récupere les données du magnétometre
    Delay_10ms();

    Angle= atan2(magY,magX) * (180 / 3.14159265); // angle en degres
    if (Angle<0) Angle+=360;
     
    IntToStr
(magX, T_Texte);
    affiche_txt (1,40,T_Texte);
    
    IntToStr
(magY, T_Texte);
    affiche_txt (2,40,T_Texte);
    
    FloatToStr_FixLen
(Angle, T_Texte,5);          // J'affiche l'angle sur l'écran
    affiche_txt (3,40,T_Texte);
    
    Delay_ms
(300);

 


Voici les photos dans les 4 coins cardinaux . JE met la plaque bien a plat au bord de mon bureau comme référence disons. et je tourne de 90° à chaque photos.
angle affiché : 18.15°
2.jpg

angle affiché : 238.9°
20181122_165620.jpg

angle affiché : 120.2°
5.jpg

angle affiché : 69.86°
3.jpg


En plaçant une boussole ( celle du téléphone, j'en ai pas de vrai à la maison). les résultats ne sont pas du tout les mêmes . avec le téléphone, si je place bien au bord de mon bureau( comme sur la photo 1 , j'obtiens un angle de 185° ( hors sur la photo N°1 on voit qu'il affiche 18°) .

Dois je rajouter un offset ?
Ces mesures vous paraissent bonnes ?
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
C'est en faisant des erreurs, que l'on apprend le mieux !!!

Boussole Numérique !
paulfjujo
Avatar de l’utilisateur
Expert
Expert
Messages : 1136
Âge : 68
Enregistré en : juillet 2015
Localisation : 01800
Contact :

#10 Message par paulfjujo » jeu. 22 nov. 2018 20:57

Bonsoir Jeremy,

il y a peut etre un probleme de signe dans une des equations de calcul
185° => -180° => +5°
et donc un offset de 13 ?

depend beaucoup de la façon dont à été monté le capteur sur la click board et si les differents sens correspondent bien
avec la data sheet
humour!! montage fait en australie ( pole sud ?)
Aides toi, le ciel ou Fantastpic t'aideras


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Aucun utilisateur enregistré et 1 invité