Bonjour à tous,
Je suis en train de faire un système de mis au point avec des moteurs NEMA (17 et 14), un arduino Nano et un DRV8825 commandé par un nunchuk et je rencontre quelques difficultés.
Je vous précise tout de suite que le code n'est vraiment pas mon fort, j'ai essayé de prendre des choses par-çi par-là.
Le code fonctionne, le moteur fait ce que je lui demande...enfin presque, je m'explique :
- Avec le NEMA 17, je n'ai qu'un problème de vitesse mais je n'arrive pas à la régler.
Ce que je lui demande : lorsque je bouge l'axe Y du nunchuk, le moteur doit avancer à vitesse lente pour une mise au point fine, j'ai réglé la vitesse à 500 et le moteur vibre dans tout les sens.
Lorsque j'appuie sur le bouton C+axe Y, le moteur va en vitesse rapide ( à 000), plus de soucis.
Sauf que quand je modifie les vitesses dans le code, je constate 2 choses :
Que je mette la vitesse à 2000 ou 5000, il n'y a aucune différence, même si je la descend à 1000.
En ce qui concerne la vitesse lente, quand je change la valeur 200, le moteur va en vitesse rapide...
- Avec le NEMA 14, là c'est autre chose :
-Il a un courant/phase: 0,4 A, donc je dois le régler à 0.2V, sauf qu'à cette valeur, le moteur siffle aiguë très fort. Il ne siflle plus à partir de 0.06V en valeur basse et 0.5V en valeur haute.
Ca c'est pour les moteurs.
Au niveau du montage, j'ai aussi des choses bizarres :
En montage direct sur une BreadBoard, rien ne fonctionne alors que quand je mets le moteur sur la petite carte qui va bien, ça fonctionne. Ce n'est pas génant, je vais juste devoir revoir la conception du boitier, mais je ne comprends pas pourquoi ça ne fonctionne pas, mes branchement ont l'air ok.
Voici le code que j'utilise :
```cpp
#include <Wire.h>
#include <AccelStepper.h>
#define STEP_PIN 2
#define DIR_PIN 3
#define ENABLE_PIN 4
AccelStepper stepper(AccelStepper::DRIVER, STEP_PIN, DIR_PIN);
int prevYAxis = 0;
bool slowSpeed = false;
bool motorEnabled = true;
const int nunchukAddress = 0x52;
byte nunchukData[6];
int maxSpeed = 2000; // Vitesse maximale (en pas par seconde)
int slowSpeedValue = 200; // Vitesse lente (en pas par seconde)
bool previousButtonState = false; // État précédent du bouton Z
void nunchukInit() {
Wire.beginTransmission(nunchukAddress);
Wire.write(0xF0);
Wire.write(0x55);
Wire.endTransmission();
delay(1);
Wire.beginTransmission(nunchukAddress);
Wire.write(0xFB);
Wire.write(0x00);
Wire.endTransmission();
delay(1);
}
void nunchukGetData() {
Wire.requestFrom(nunchukAddress, 6);
int i = 0;
while (Wire.available()) {
nunchukData[i] = Wire.read();
i++;
}
Wire.beginTransmission(nunchukAddress);
Wire.write(0x00);
Wire.endTransmission();
delay(1);
}
void setup() {
Serial.begin(9600); // Initialise la communication série
stepper.setMaxSpeed(maxSpeed);
stepper.setAcceleration(750);
stepper.setEnablePin(ENABLE_PIN);
stepper.setPinsInverted(false, false, true);
Wire.begin();
nunchukInit();
}
void loop() {
nunchukGetData();
int yAxis = nunchukData[1];
// Activation du moteur dans le sens horaire
if (yAxis > 130 && prevYAxis <= 130) {
stepper.move(1);
stepper.setSpeed(slowSpeed ? slowSpeedValue : maxSpeed);
stepper.setPinsInverted(false, false, true); // Inversion du sens
Serial.println("Moteur dans le sens horaire");
}
// Activation du moteur dans le sens anti-horaire
if (yAxis < 125 && prevYAxis >= 125) {
stepper.move(1);
stepper.setSpeed(slowSpeed ? slowSpeedValue : maxSpeed);
stepper.setPinsInverted(true, true, false); // Inversion du sens
Serial.println("Moteur dans le sens anti-horaire");
}
if (yAxis >= 125 && yAxis <= 130) {
stepper.setCurrentPosition(0);
}
bool currentButtonState = (nunchukData[5] & 0x01) == 0; // Lecture de l'état actuel du bouton Z
if (currentButtonState != previousButtonState) {
// Il y a un changement d'état du bouton Z
if (currentButtonState) {
// Le bouton Z vient d'être enfoncé
// Effectuez les actions nécessaires ici
// Par exemple, activez ou désactivez le moteur
motorEnabled = !motorEnabled;
if (motorEnabled) {
stepper.enableOutputs();
Serial.println("Moteur activé");
} else {
stepper.disableOutputs();
Serial.println("Moteur désactivé");
}
}
}
if (nunchukData[5] & 0x02) {
slowSpeed = true;
} else {
slowSpeed = false;
}
prevYAxis = yAxis;
previousButtonState = currentButtonState;
stepper.runSpeed();
}
Voici mon schema :
Et voici la carte où je colle le DRV8825 :
Une question subsidiaire :
Mes Nano me font des trucs bizarres. Lorsque je veux téléverser le code, il me sort le message d'erreur port com. Le seul truc que j'ai trouvé, c'est de désinstaller le driver CH340 et de le réinstaller ensuite
Merci à vous pour le coup de main!