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 ---

Boussole Numérique !

Forum général sur le langage C !

Modérateur : Jérémy

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

Avatar de l’utilisateur
paulfjujo
Maître
Maître
Messages : 3296
Enregistré en : juillet 2015
Localisation : 01800
Contact :

Boussole Numérique !

Messagepar 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.
Aide toi, le ciel ou FantasPic t'aidera

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

besqueut
Membre
Membre
Messages : 1
Enregistré en : septembre 2018

Boussole Numérique !

Messagepar 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.

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

Jérémy
Administrateur du site
Administrateur du site
Messages : 2764
Enregistré en : juillet 2015
Localisation : Dans le sud
Contact :

Boussole Numérique !

Messagepar 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 !!!

Avatar de l’utilisateur
paulfjujo
Maître
Maître
Messages : 3296
Enregistré en : juillet 2015
Localisation : 01800
Contact :

Boussole Numérique !

Messagepar 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 ?)
Aide toi, le ciel ou FantasPic t'aidera


Retourner vers « Langage C »

Qui est en ligne

Utilisateurs parcourant ce forum : Majestic-12 [Bot] et 3 invités