Bonjour à tous,
mon souci est le suivant :
dans le cadre d'un projet de validation de mon bts je dois programmer une partie d'une maquette qui fonctionnera à base de carte arduino mega 2560 (le projet doit être en langage objet c'est imposé, donc avec des classes ).
J'ai un message d'erreur que je ne comprend pas même après quelques recherches et je commence à être court en délai donc je m'adresse à vous en espérant que je serai débloqué.
Je réalise le code qui me permettra de contrôler les rotations d'un plateau qui sera fixé sur un moteur pas à pas. Donc je contrôle effectivement le plateau quand je code avec les standards d'arduino? Par contre en passant en langage objet j'obtiens quelques erreurs :
MoteurDuPlateau.cpp.o: dans la fonction « _GLOBAL__sub_D_stepDelay »:
/usr/share/arduino/MoteurPlateau.ino:14: définitions multiples de « retourPlateau »
MoteurPlateau.cpp.o:MoteurPlateau.cpp:34: défini pour la première fois ici
/usr/lib/gcc/avr/4.8.2/../../../avr/bin/ld: désactivation de la relâche: il ne pourra pas travailler avec des définitions multiples
MoteurDuPlateau.cpp.o: dans la fonction « _GLOBAL__sub_D_stepDelay »:
/usr/share/arduino/MoteurPlateau.ino:14: définitions multiples de « nbPas »
MoteurPlateau.cpp.o:MoteurPlateau.cpp:34: défini pour la première fois ici
MoteurDuPlateau.cpp.o: dans la fonction « _GLOBAL__sub_D_stepDelay »:
/usr/share/arduino/MoteurPlateau.ino:14: définitions multiples de « stepDelay »
MoteurPlateau.cpp.o:MoteurPlateau.cpp:34: défini pour la première fois ici
collect2: error: ld returned 1 exit status
voici le code de mon .cpp :
#include "MoteurPlateau.h"
// constructeur de la classe
MoteurPlateau::MoteurPlateau()
{
retourPlateau = 24;
}
//destructeur
MoteurPlateau::~MoteurPlateau()
{
}
//methode privées
//initialisation des broches en mode sortie
void MoteurPlateau::initialiserMoteurPlateau(){
pinMode(dir_A,OUTPUT);
pinMode(dir_B,OUTPUT);
pinMode(pwm_A,OUTPUT);
pinMode(pwm_B,OUTPUT);
}
// méthodes publiques
void MoteurPlateau::retournerPlateau(){
setNbPas(24);
// consiste à appeller la méthode actionnerPlateau() avec un pas de 24
actionnerPlateau(nbPas_);
}
void MoteurPlateau::stopperPlateau(){
digitalWrite(pwm_A,LOW);
digitalWrite(pwm_B,LOW);
digitalWrite(dir_A,LOW);
digitalWrite(dir_B,LOW);
}
void MoteurPlateau::actionnerPlateau(int nbPas) // ACTIONNE LE PLATEAU DANS LE SENS ANTI-HORAIRE
{
nbPas = 200;
//setNbPlateau(nbPas_);
// The function will run for the amount of times called in the method.
// This is accomplished by a while loop, where it will subtract 1 from the amount, after every run.
while(nbPas_!=0){
// Starting position (if repeated, ful step (4))
// EXPLINATION: in this case, both our power are high.
// Therefore both coils are activated, with their standard polarities for their magnetic fields.
digitalWrite(pwm_A,HIGH);
digitalWrite(pwm_B,HIGH);
digitalWrite(dir_A,HIGH);
digitalWrite(dir_B,HIGH);
delayMicroseconds(stepDelay);
//Half step (½)
// EXPLINATION: In this case, only out b-coil is active, still with it's stand polarity.
digitalWrite(pwm_A,HIGH);
digitalWrite(pwm_B,LOW);
digitalWrite(dir_A,HIGH);
digitalWrite(dir_B,LOW);
delayMicroseconds(stepDelay);
//Full step (1)
// EXPLINATION: In this case, the b-coil is activated as in previous cases.
// But the a-coil now has it's direction turned on. So now it's active, but with the reversered polarity.
// By continuing this pattern (for reference: http://www.8051projects.net/stepper-motor-interfacing/full-step.gif) , you'll get the axis to turn.
digitalWrite(pwm_A,HIGH);
digitalWrite(pwm_B,HIGH);
digitalWrite(dir_A,HIGH);
digitalWrite(dir_B,LOW);
delayMicroseconds(stepDelay);
// Half step (1½)
digitalWrite(pwm_A,LOW);
digitalWrite(pwm_B,HIGH);
digitalWrite(dir_A,LOW);
digitalWrite(dir_B,LOW);
delayMicroseconds(stepDelay);
// Full step (2)
digitalWrite(pwm_A,HIGH);
digitalWrite(pwm_B,HIGH);
digitalWrite(dir_A,LOW);
digitalWrite(dir_B,LOW);
delayMicroseconds(stepDelay);
// Half step (2½)
digitalWrite(pwm_A,HIGH);
digitalWrite(pwm_B,LOW);
digitalWrite(dir_A,LOW);
digitalWrite(dir_B,LOW);
delayMicroseconds(stepDelay);
// Full step (3)
digitalWrite(pwm_A,HIGH);
digitalWrite(pwm_B,HIGH);
digitalWrite(dir_A,LOW);
digitalWrite(dir_B,HIGH);
delayMicroseconds(stepDelay);
// Half step (3½)
digitalWrite(pwm_A,LOW);
digitalWrite(pwm_B,HIGH);
digitalWrite(dir_A,LOW);
digitalWrite(dir_B,HIGH);
nbPas--;
}
}
Comme je l'ai précisé si je m'abstiens de créer des classes et que je code de façon classique donc juste un void setup() et un void loop() ça fonctionne au poil. Donc pour moi même si le code de ma méthode actionnerPlateau n'est pas optimisé il est correct. mais je ne vois pas d'où peuvent venir les messages d'erreur que j'obtiens.
Est-ce que quelqu'un peut m’éclaircir un peu les idées surtout sur la signification du : « _GLOBAL__sub_D_xxx » ?
Merci d'avance pour votre aide.