[Autopilot avec Arduino] Erreur de code

chers tous,
Je suis entrain de travailler sur un projet, Kontiki (Seahorse Kontiki - Launching your Kontiki from the Beach - YouTube), le principe est dutiliser un Arduino et une HMC5883L pour controller son orientation. Jai trouve un code simillaire a mon projet, seulement quand je lance le code ca me donne des erreur alors aue j`ai bien telecharger la bibliotheque depuis le site GitHub - jarzebski/Arduino-HMC5883L: HMC5883L Triple Axis Digital Compass Arduino Library et je l ai mis sur le chemin suivant: C:\Users\DICH\Documents\Arduino\libraries.

Voici le code code:

#include <Wire.h>
#include <HMC5883L.h>
#include <Servo.h> 

#define SERVO  9
#define CENTER 100
#define GOAL   0

HMC5883L compass;
int      goal = GOAL;
float    declinationAngle = 0.212;    // Radians
Servo    myservo;


void setup() {


Serial.begin(9600);
myservo.attach(SERVO);
Wire.begin();
compass = HMC5883L();
// Set scale to +/- 1.3 Ga
int error = compass.SetScale(1.3);
if (error != 0)
 Serial.println(compass.GetErrorText(error));
// Set measurement mode to continous
error = compass.SetMeasurementMode(Measurement_Continuous);
if (error != 0)
 Serial.println(compass.GetErrorText(error));
}

void loop() {

int angle = getDegrees();
int error = goal - angle;
if (error >= 180)
 error -= 360;
if (error <= -180)
 error += 360;
// Update servo and keep with range of +/- 60
if (error > 60)
 error = 60;
if (error < -60)
 error = -60;
myservo.write(CENTER + error);
delay(10);
}

int getDegrees () {
MagnetometerScaled scaled = compass.ReadScaledAxis();
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(scaled.YAxis, scaled.XAxis) + declinationAngle;
// Correct for when signs are reversed.
if(heading < 0)
 heading += 2 * PI;
// Check for wrap due to addition of declination.
if(heading > 2 * PI)
 heading -= 2 * PI;
// Convert radians to degrees for readability.
return (int)  (heading * 180 / M_PI); 
}

Ci apres sont les erreurs:

Arduino : 1.8.1 (Windows 7), Carte : "Arduino/Genuino Uno"

C:\Users\DICH\Desktop\sketch_may20a\sketch_may20a.ino: In function 'void setup()':

sketch_may20a:23: error: 'class HMC5883L' has no member named 'SetScale'

int error = compass.SetScale(1.3);

                   ^

sketch_may20a:25: error: 'class HMC5883L' has no member named 'GetErrorText'

 Serial.println(compass.GetErrorText(error));

                        ^

sketch_may20a:27: error: 'class HMC5883L' has no member named 'SetMeasurementMode'

error = compass.SetMeasurementMode(Measurement_Continuous);

               ^

sketch_may20a:27: error: 'Measurement_Continuous' was not declared in this scope

error = compass.SetMeasurementMode(Measurement_Continuous);

                                  ^

sketch_may20a:29: error: 'class HMC5883L' has no member named 'GetErrorText'

 Serial.println(compass.GetErrorText(error));

                        ^

C:\Users\DICH\Desktop\sketch_may20a\sketch_may20a.ino: In function 'int getDegrees()':

sketch_may20a:50: error: 'MagnetometerScaled' was not declared in this scope

MagnetometerScaled scaled = compass.ReadScaledAxis();

^

sketch_may20a:52: error: 'scaled' was not declared in this scope

float heading = atan2(scaled.YAxis, scaled.XAxis) + declinationAngle;

                     ^

exit status 1
'class HMC5883L' has no member named 'SetScale'

Kind regards

Vous avez pris une autre library - qui n'est pas celle prévue pour ce code essayez celle ci

Merci de corriger votre post et de rajouter les tags de code

Merci J-M-L pour ta reponse. je suis sur aue je n ai pas fais la bonne manip. au fait, j ai pris les codes et je les ai enregistre en tant que .ino (puisque ce ne sont pas des fichiers telechargeables) et les enregistre sur les librairy de l arduino et sa me sort d autres erreurs:

Arduino : 1.8.1 (Windows 7), Carte : "Arduino/Genuino Uno"

C:\Users\DICH\AppData\Local\Temp\cc0nxo0d.ltrans0.ltrans.o: In function `__static_initialization_and_destruction_0':

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:9: undefined reference to `HMC5883L::HMC5883L()'

C:\Users\DICH\AppData\Local\Temp\cc0nxo0d.ltrans0.ltrans.o: In function `setup':

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:21: undefined reference to `HMC5883L::HMC5883L()'

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:23: undefined reference to `HMC5883L::SetScale(float)'

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:25: undefined reference to `HMC5883L::GetErrorText(int)'

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:27: undefined reference to `HMC5883L::SetMeasurementMode(unsigned char)'

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:29: undefined reference to `HMC5883L::GetErrorText(int)'

C:\Users\DICH\AppData\Local\Temp\cc0nxo0d.ltrans0.ltrans.o: In function `getDegrees':

C:\Users\DICH\Desktop\Arduino Projects\Using_HMC_To_COntrol_the_Servo/Using_HMC_To_COntrol_the_Servo.ino:50: undefined reference to `HMC5883L::ReadScaledAxis()'

collect2.exe: error: ld returned 1 exit status

Plusieurs bibliothèque trouvées pour "HMC5883L.h"
Utilisé : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example
Non utilisé : C:\Users\DICH\Documents\Arduino\libraries\Arduino-HMC5883L-master
exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_calibrate : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_calibrate
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_calibrate_MPU6050 : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_calibrate_MPU6050
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compass : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compass
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compass_MPU6050 : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compass_MPU6050
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compensation_ADXL345 : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compensation_ADXL345
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compensation_MPU6050 : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_compensation_MPU6050
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_processing : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_processing
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_processing_MPU6050 : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_processing_MPU6050
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_simple : C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_simple
Bibliothèque non valide trouvée dans C:\Users\DICH\Documents\Arduino\libraries\Processing : C:\Users\DICH\Documents\Arduino\libraries\Processing

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

Merci d avance pour l aide

Virez la première librairie de votre disque dur et installez la seconde la place et regardez ce qu'il se passe

Je vous remericie infiniment J-M-L pour vos efforts.

je viens d executer ce que vous m avez demande en supprimant l ancienne lib et de laisser que la nouvelle. apres verification du code ce me donne ces erreurs:

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp: In member function 'uint8_t* HMC5883L::Read(int, int)':

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:119:11: warning: address of local variable 'buffer' returned [-Wreturn-local-addr]

  uint8_t buffer[length];

          ^

In file included from C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:19:0:

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp: In member function 'char* HMC5883L::GetErrorText(int)':

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.h:36:21: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

#define ErrorCode_1 "Entered scale was not valid, valid gauss values are: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1"

                    ^

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:135:10: note: in expansion of macro 'ErrorCode_1'

  return ErrorCode_1;

         ^

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:137:9: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

 return "Error not defined.";

par contre je peux televerser le code mais quand je lance le moniteur de serie il reste blanc. Merci encore une fois pour votre aide

je regarderai un peu plus si vous modifiez vos post pour utiliser les tags de code :)

corrigez votre post ci dessus et rajoutez les code tags autour du code: [code][color=blue]// votre code ici[/color][/code].

ça doit ressembler à cela:// votre code ici (faites aussi ctrl-T (PC) or cmd-T (Mac) dans l'IDE avant de copier le code pour qu'il soit indenté correctement)

J’espère que j'ai bien compris la leçon :), est ce que c'et bon comme sa:

 // C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp: In member function 'uint8_t* HMC5883L::Read(int, int)':

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:119:11: warning: address of local variable 'buffer' returned [-Wreturn-local-addr]

   uint8_t buffer[length];

           ^

In file included from C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:19:0:

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp: In member function 'char* HMC5883L::GetErrorText(int)':

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.h:36:21: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

 #define ErrorCode_1 "Entered scale was not valid, valid gauss values are: 0.88, 1.3, 1.9, 2.5, 4.0, 4.7, 5.6, 8.1"

                     ^

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:135:10: note: in expansion of macro 'ErrorCode_1'

   return ErrorCode_1;

          ^

C:\Users\DICH\Documents\Arduino\libraries\HMC5883L_Example\HMC5883L.cpp:137:9: warning: deprecated conversion from string constant to 'char*' [-Wwrite-strings]

  return "Error not defined.";

Perdu - fallait modifier vos posts précédents pour la partie Code :slight_smile: mais bel effort

Bon j’ai fait le test - procédez comme suit

1/ Virez du répertoire des librairies téléchargées le téléchargement que je vous avais fait effectuer au post 1, mais conserver les fichiers quelque part ailleurs

2/ prenez votre code listé plus haut et créez un projet arduino.
Modifiez la ligne #include <HMC5883L.h> en #include "HMC5883L.h"

3/ sauvez le sous le nom “testCompass” par exemple → ça crée un répertoire testCompass avec dedans un fichier testCompass.ino

4/ quittez l’IDE.

5/ Téléchargez les deux fichiers de la librairie dont je vous parlais HMC5883L.h et HMC5883L.cpp (ou si vous n’avez pas mis à la poubelle dans la première étape, vous les avez dans le dossier)

6/ Placez ces 2 fichiers dans votre répertoire de projet testCompass

7/ relancer l’IDE en double clickant sur testCompass.ino au sein de votre répertoire

8/ l’IDE devrait afficher votre code, mais à côté vous devriez voir 2 onglets avec pour noms HMC5883L.h et HMC5883L.cpp

9/ compilez - ça devrait passer tout seul

10/ merci de corriger les codes ci dessus avec les tags (éditez vos posts et rajouter les tags) :slight_smile:

bonjour, ca ressemble à des lib non compatibles avec la version de l'ide.

warning: deprecated conversion from string constant to 'char*'

Bonjour J-M-L,

Merci beaucoup votre aide, je sais que j'ai fais le bon choix d'exposer mon projet sur ce forum je m’en doutais pas :)

je n'étais pas disponible pour un moment du coup j'ai pas pu exercé ce que vous m'avais demandé. aujourd’hui je vais appliqué cette manip et je vous feras par de la suite.

"les postes ont été corrigé :)"

Merci encore une fois.

Très cordialement.

Bonsoir J-M-L,

j ai exécuté ce que vous m avais demande a la lettre.
j ai eu cette erreur apres plusieurs tentatives de compilation:

C:\Users\DICH\Documents\Arduino\Dichtiki\HMC5883L_Example.ino:18:22: fatal error: HMC5883L.h: No such file or directory

 #include <HMC5883L.h>

                      ^

compilation terminated.

exit status 1
Erreur de compilation pour la carte Arduino/Genuino Uno

Merci encore fois pour votre aide precieuse.
cordialement

Pas vraiment à,la lettre on dirait… relisez l’étape 2 du post 7 - notez Le remplacement des <>par des “”

Je vous assure que je l ai fait

#include <Wire.h>
#include "HMC5883L.h"
#include <Servo.h> 

#define SERVO  9
#define CENTER 100
#define GOAL   0

HMC5883L compass;
int      goal = GOAL;
float    declinationAngle = 0.212;    // Radians
Servo    myservo;


void setup() {


Serial.begin(9600);
myservo.attach(SERVO);
Wire.begin();
compass = HMC5883L();
// Set scale to +/- 1.3 Ga
int error = compass.SetScale(1.3);
if (error != 0)
 Serial.println(compass.GetErrorText(error));
// Set measurement mode to continous
error = compass.SetMeasurementMode(Measurement_Continuous);
if (error != 0)
 Serial.println(compass.GetErrorText(error));
}

void loop() {

int angle = getDegrees();
int error = goal - angle;
if (error >= 180)
 error -= 360;
if (error <= -180)
 error += 360;
// Update servo and keep with range of +/- 60
if (error > 60)
 error = 60;
if (error < -60)
 error = -60;
myservo.write(CENTER + error);
delay(10);
}

int getDegrees () {
MagnetometerScaled scaled = compass.ReadScaledAxis();
// Calculate heading when the magnetometer is level, then correct for signs of axis.
float heading = atan2(scaled.YAxis, scaled.XAxis) + declinationAngle;
// Correct for when signs are reversed.
if(heading < 0)
 heading += 2 * PI;
// Check for wrap due to addition of declination.
if(heading > 2 * PI)
 heading -= 2 * PI;
// Convert radians to degrees for readability.
return (int)  (heading * 180 / M_PI); 
}

je l’ai changé sur le ce code mais pas sur les autres lib, est ce bien sa?

dans votre poste 10 le compilateur se plaint de

C:\Users\DICH\Documents\Arduino\Dichtiki\HMC5883L_Example.ino:18:22: fatal error: HMC5883L.h: No such file or directory

 #include [color=red]<[/color]HMC5883L.h[color=red]>[/color]

donc dans le fichier HMC5883L_Example.ino il y a des <> pas des “”

Merci pour votre réponse rapide.

je viens de changer cela sur HMC588"L_Example.ino et sa me sort ce nouveau message:

Arduino : 1.8.1 (Windows 7), Carte : "Arduino/Genuino Uno"

HMC5883L_Example:21: error: redefinition of 'HMC5883L compass'

 HMC5883L compass;

          ^

C:\Users\DICH\Documents\Arduino\Dichtiki\Dichtiki.ino:9:10: note: 'HMC5883L compass' previously declared here

 HMC5883L compass;

          ^

C:\Users\DICH\Documents\Arduino\Dichtiki\HMC5883L_Example.ino: In function 'void setup()':

HMC5883L_Example:26: error: redefinition of 'void setup()'

 void setup()

      ^

C:\Users\DICH\Documents\Arduino\Dichtiki\Dichtiki.ino:15:6: note: 'void setup()' previously defined here

 void setup() {

      ^

C:\Users\DICH\Documents\Arduino\Dichtiki\HMC5883L_Example.ino: In function 'void loop()':

HMC5883L_Example:49: error: redefinition of 'void loop()'

 void loop()

      ^

C:\Users\DICH\Documents\Arduino\Dichtiki\Dichtiki.ino:32:6: note: 'void loop()' previously defined here

 void loop() {

      ^

exit status 1
redefinition of 'HMC5883L compass'

Ce rapport pourrait être plus détaillé avec
l'option "Afficher les résultats détaillés de la compilation"
activée dans Fichier -> Préférences.

pénible…

j’ai pris le code de votre post #1 et j’ai changé les <> en “”

#include [color=red]"[/color]HMC5883L.h[color=red]"[/color]

j’ai pris les deux fichiers de cette librairie (le.h et le .cpp)

j’ai tout mis dans un répertoire pour créer des onglets dans mon projet


ça me donne le dossier en pièce jointe qui compile sans problème sur ma machine qui a les dernières versions des librairies, cartes et IDE

testCompass.zip (3.92 KB)

Oh parfait,

avec votre peice joint sa fonctionne sans code d'erreur; mais par contre rien ne se passe entre le servo et la HMC5883L meme le moniteur de serie reste blanc.

dich: Oh parfait,

avec votre peice joint sa fonctionne sans code d'erreur; mais par contre rien ne se passe entre le servo et la HMC5883L meme le moniteur de serie reste blanc.

ça je ne sais pas, je n'ai pas regardé votre code...

Alors quand je lance un code pour tester la HMC5883L le moniteur de serie réagie correctement:

//*************************************************************
//  demo_boussole
// D'après ARD_HMC5803L_GY273_Example 
// Source :  HobbyComponents.com
//
// Boussole numérique avec le module GY-273
// Compas digital Honeywell HMC5883L 
// Interface I2C interface --> Arduino
// Modifié tiptopboards.com 23 10 2014 - Rolland
//*************************************************************
#include <Wire.h>   //Librairie Wire pour la communication I2C
#define HMC5803L_Address 0x1E  //Adresse I2C du module

#define X 3  //Adresses de registres pour les données X Y et Z
#define Y 7
#define Z 5
double Xmagnetic;
double Ymagnetic;
double Zmagnetic;
double Module_magnetic;
double angle;

void setup() 
{
  Serial.begin(9600);
  Wire.begin();         //Initialisation de la livrairie Wire
    Init_HMC5803L();    //Initialiser le module boussole
}

// Boucle de mesures de champ magnétique
void loop() 
{
  Xmagnetic = HMC5803L_Read(X);  //lecture sur 3 axes et sortie sur le port sériel
  Ymagnetic = HMC5803L_Read(Y);
  Zmagnetic = HMC5803L_Read(Z);
  Serial.print(" ");
  Serial.print (Xmagnetic);
  Serial.print(" ");
  Serial.print (Ymagnetic);
  Serial.print(" ");
  Serial.print (Zmagnetic);

   //Module du champ
  Module_magnetic = Xmagnetic * Xmagnetic + Ymagnetic * Ymagnetic + Zmagnetic * Zmagnetic;
  Module_magnetic = sqrt(Module_magnetic);
  Serial.print(" M= ");
  Serial.print(Module_magnetic);
  
  //Calculer l'angle de la boussole à partir de X et Y (à plat)
  angle= atan2(Ymagnetic,Xmagnetic) * (180 / 3.14159265); // angle en degres
  if (angle<0) {angle=angle+360;}
  Serial.print("  ");  
  Serial.print("Angle  ");  //en degres
  Serial.println(angle);

 delay(100);
}


  
// === Fonction qui initialise le module boussole (à lancer une seule fois)
void Init_HMC5803L(void)
{
  /* Set the module to 8x averaging and 15Hz measurement rate */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(0x00);
  Wire.write(0x70);
         
  Wire.write(0x01);
  Wire.write(0xA0);   //Règle un gain de 5
  Wire.endTransmission();
}

// === Fonction qui lit le module boussole (registre d'un des 3 axes, retourne 16 bits)
int HMC5803L_Read(byte Axis)
{
  int Result;
   /* Initiate a single measurement */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(0x02);
  Wire.write(0x01);
  Wire.endTransmission();
  delay(6);
  
  /* Move modules the resiger pointer to one of the axis data registers */
  Wire.beginTransmission(HMC5803L_Address);
  Wire.write(Axis);
  Wire.endTransmission();
   
  /* Read the data from registers (there are two 8 bit registers for each axis) */  
  Wire.requestFrom(HMC5803L_Address, 2);
  Result = Wire.read() << 8;
  Result |= Wire.read();

  return Result;
}

ou est ce que sa peut venir?

comment vous alimentez votre moteur?