Bonjour à tous,
Je suis en train de faire un petit robot à deux roues motrice et une roue folle.
J'ai passé pas mal de temps à réussir à mesurer un régime, asservir la vitesse en réglant la boucle d'asservissement. Tout fonctionne nickel je suis assez content. Et maintenant je viens de passer l'après midi à optimiser ce code pour pouvoir l'utiliser sur deux moteurs....et ça ne marche pas.
Après une rapide investigation, je me suis rendu compte que c'est parce que je ne mesurais pas correctement le régime de mes roues. Après investigation (rapide) encore, je me suis rendu compte que l'Arduino me renvoyait presque uniquement que les changements d'états sur un seul moteur. D'où un calcul de régime erroné.
Pour plus de clarté, voici le code que j'ai utilisé pour isoler mon problème :
const int RPWM_Output_G = 5;
const int LPWM_Output_G = 6;
const int RPWM_Output_D = 7;
const int LPWM_Output_D = 8;
const byte encodeur_moteur[] = {2, 3};//Pin interruption de l'Arduino MEGA
volatile int compteur[2] = {0, 0};
void setup() {
Serial.begin(9600);
//Définition des sorties
pinMode(RPWM_Output_G, OUTPUT);
pinMode(LPWM_Output_G, OUTPUT);
pinMode(RPWM_Output_D, OUTPUT);
pinMode(LPWM_Output_D, OUTPUT);
//Pullup de l'Arduino
for (byte i = 0; i <= 1; i++)
{
pinMode(encodeur_moteur[i], INPUT_PULLUP);
}
attachInterrupt(digitalPinToInterrupt(encodeur_moteur[0]), interruption_moteur_G, CHANGE);
attachInterrupt(digitalPinToInterrupt(encodeur_moteur[1]), interruption_moteur_D, CHANGE);
}
void loop() {
//Je fais tourner mes deux moteurs
analogWrite(LPWM_Output_G, 20);
analogWrite(RPWM_Output_G, 0);
analogWrite(LPWM_Output_D, 20);
analogWrite(RPWM_Output_D, 0);
}
//A partir de là mes deux fonctions d'interruption
void interruption_moteur_G()
{
compteur[0] = compteur[0]++;
Serial.println("M0");
}
void interruption_moteur_D()
{
compteur[1] = compteur[1]++;
Serial.println("M1");
}
Le retour sur le port série est :
M-
M-
M++
M-
M++
M-
M++
M-
M++
M-
M++
M-
M++
M-
M++
M-
M++
M-
M++
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
M-
Donc je "vois" bien les top sur les deux roues au début et presque immédiatement ensuite tout disparaît.
Evidemment, si je supprime cette ligne
attachInterrupt(digitalPinToInterrupt(encodeur_moteur[0]), interruption_moteur_G, CHANGE);
Je ne vois que
M++
Et l'inverse est vrai.
J'en fais donc appel à vos compétences et votre expérience. Spontanément je dirais que c'est parce que l'Arduino MEGA ne calcule pas assez vite et en conséquence quand une première interruption est en cours, impossible de voir la seconde, mais je suis surpris car je peux faire tourner un seul moteur bien plus vite (consigne commande 512) sans avoir le moindre problème.
Du coup je ne comprends pas vraiment...
D'avance merci pour votre/vos retour(s)!