Moteur pas à pas et DRV8825, beaucoup de questions

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 :
s-l500

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 :face_with_raised_eyebrow:

Merci à vous pour le coup de main!

Bonsoir 01marc

Un truc bizarre dans ton montage pour ce qui est du signal ENABLE_PIN
Ton schéma dit:
image

D8

et ton programme:
#define ENABLE_PIN 4

Cordialement
jpbbricole

Ha oui, effectivement, j'ai oublié de mettre à jour le schéma! il est bien sur le pin4, ça me semblait plus pratique vu que j'ai 2 DRV8825 (un pour chaque moteur pour les tests) et une mémoire de poisson rouge.

Bonjour 01marc

J'ai essayé ton programme, uniquement la partie moteur, avec un NEMA17 et, pour autant que tes switches:
image
soient tous à ON = micros/pas à 32, la rotation est très fluide.

Test effectué et avec ce câblage:
image

Cordialement
jpbbricole

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.