Bonjour tous le monde !
Alors voila, dans une partie de mon projet, je dois piloter un microscope sur 4 axes, XYZR.
Pour se faire chaque axe est munis de moteur pas a pas nema 17.
Les axes XY commandé par un joystick.
J’utilise un Arduino méga + shield CNC v3 + 4 Drivers TMC2209.
J’avais plus ou moins réussis en utilisant la bibliothèque AccelStepper.
Dans la version précédant de mon projet, j’utilisais des drivers A4988 en 1/16 pas.
J’ai maintenant changé pour des TMC2209 en 1/67 pas (interpolé en 1/256 pas).
Je ne pouvais donc plus utilisé la bibliothèque AccelStepper car elle est limité en vitesse (4000 pas/s?)
J’ai alors entrepris d’apprendre à piloté les moteurs sans bibliothèque, mais avec des commandes d’impulsions. ![]()
J’ai réussi, mais je rencontre un problème…
Le code fait en sorte que plus on appuie sur le joystick, plus le moteur tourne vite (dans un 1er temps j’ai juste écris le code pour l’axe X de la position centrale, à une extrémité).
Mais le problème, c'est que lorsque le joystick arrive en buté, cela fonctionne, mais malgré les 5millis/s le moteur tourne doucement
:
// Configuration des broches pour les moteurs pas à pas
const int moteurXStepPin = 2;
const int moteurXDirPin = 5;
const int moteurYStepPin = 3;
const int moteurYDirPin = 6;
const int moteurVitesseRapide = 5;
const int moteurVitesseLente = 2000;
const int enPin = 8; // pin 8 pour activer les 4 drivers sur shield CNC
// Configuration des broches pour le joystick
const int joystickXPin = A8; // Broche analogique pour l'axe X
const int joystickYPin = A9; // Broche analogique pour l'axe Y
//===================================================================================================================================//
//====================================================== VOID SETUP ============================================================//
//===================================================================================================================================//
void setup() {
// Initialisation du moniteur série
Serial.begin(9600);
// Configuration des broches en sortie pour les moteurs
pinMode(moteurXStepPin, OUTPUT);
pinMode(moteurXDirPin, OUTPUT);
pinMode(moteurYStepPin, OUTPUT);
pinMode(moteurYDirPin, OUTPUT);
// Configuration du joystick en entrée
pinMode(joystickXPin, INPUT);
pinMode(joystickYPin, INPUT);
// Activation des 4 pins "EN" des 4 drivers du shield CNC
pinMode(enPin, OUTPUT);
digitalWrite(enPin,LOW);
}
//===================================================================================================================================//
//======================================================= VOID LOOP ============================================================//
//===================================================================================================================================//
void loop() {
// Lecture des valeurs du joystick
int joyX = analogRead(joystickXPin);
//int joyY = analogRead(joystickYPin);
//Mappage du Joysitck pour les vitesses moteur
// X moyenne a 522 -> Zone morte de 16 -> (514/530)
// Y moyenne a 539 -> Zone morte de 16 -> (531/547)
int vitesseXpos = map(joyX, 530, 945, moteurVitesseLente, moteurVitesseRapide);
//int vitesseXneg = map(joyX, 514, 107, moteurVitesseLente, moteurVitesseRapide);
//int vitesseYpos = map(joyY, 547, 950, moteurVitesseLente, moteurVitesseRapide);
//int vitesseYneg = map(joyY, 531, 125, moteurVitesseLente, moteurVitesseRapide);
// Si joyX sup 530, alors faire avancer moteur x en positif
if (joyX > 530){
digitalWrite(moteurXDirPin, HIGH); // Direction moteur
digitalWrite(moteurXStepPin, HIGH); // Une impulsion
delayMicroseconds(vitesseXpos); // Vitesse
digitalWrite(moteurXStepPin, LOW); // Fin impulsion
delayMicroseconds(vitesseXpos);
//Serial.println(vitesseXpos);
}
}
Par exemple quand je met juste cela dans le loop, le moteur tourne rapidement :
digitalWrite(moteurXDirPin, HIGH); // Direction moteur
digitalWrite(moteurXStepPin, HIGH); // Une impulsion
delayMicroseconds(5); // Vitesse
digitalWrite(moteurXStepPin, LOW); // Fin impulsion
delayMicroseconds(5);
Alors je me suis dit que peut être la condition if ralentissait de quelques millis/s le programme, donc j’ai essayer en mettant juste ce code dans le loop, avec une condition basique, et là le moteur tourne rapidement aussi, donc cela ne vient pas d’une condition :
if (0==0){
digitalWrite(moteurXDirPin, HIGH); // Direction moteur
digitalWrite(moteurXStepPin, HIGH); // Une impulsion
delayMicroseconds(5); // Vitesse
digitalWrite(moteurXStepPin, LOW); // Fin impulsion
delayMicroseconds(5);
//Serial.println(vitesseXpos);
}
C’est lorsque je demande à la condition d’aller chercher la valeur de « joyX » que le moteur tourne lentement arrivé en buté du joystick… :
void loop() {
// Lecture des valeurs du joystick
int joyX = analogRead(joystickXPin);
//int joyY = analogRead(joystickYPin);
//Mappage du Joysitck pour les vitesses moteur
// X moyenne a 522 -> Zone morte de 16 -> (514/530)
// Y moyenne a 539 -> Zone morte de 16 -> (531/547)
int vitesseXpos = map(joyX, 530, 945, moteurVitesseLente, moteurVitesseRapide);
//int vitesseXneg = map(joyX, 514, 107, moteurVitesseLente, moteurVitesseRapide);
//int vitesseYpos = map(joyY, 547, 950, moteurVitesseLente, moteurVitesseRapide);
//int vitesseYneg = map(joyY, 531, 125, moteurVitesseLente, moteurVitesseRapide);
// Si joyX sup 530, alors faire avancer moteur x en positif
if (joyX > 530){
digitalWrite(moteurXDirPin, HIGH); // Direction moteur
digitalWrite(moteurXStepPin, HIGH); // Une impulsion
delayMicroseconds(vitesseXpos); // Vitesse
digitalWrite(moteurXStepPin, LOW); // Fin impulsion
delayMicroseconds(vitesseXpos);
//Serial.println(vitesseXpos);
}
}
Je n’ai pas un très haut niveau en code.
Quand pensez vous, suis-je sur une mauvaise piste ? Une mauvaise façon de faire ? ![]()
Merci a tous ! ![]()