Aller au contenu

Messages recommandés

Posté

Bonjour,
Je suis en train de concevoir une monture azimutale sur laquelle je vais placer une parabole afin de faire un radiotelescope DIY.

J'ai fini la monture, mais il me reste sa motorisation qui est compliquée. J'ai actuellement une Fysetc S6 v2.1, avec deux drivers QHV5160 et deux moteurs NEMA 23, mon soucis est que j'ai voulu coder un programme en C++ pour gérer le contrôle de la monture mais je n'arrive pas à le faire marcher, je reçois via le moniteur de série d'Arduino, que les drivers sont connectés, puis j'envoie une commande, je n'ai pas d'erreur mais j'ai aucune rotation, malgré le fait que l'arbre soit un peu plus rigide et c'est plus dur de le faire tourner avec ses doigts donc je me dis que le courant doit aller jusqu'au moteur mais je ne comprends pas pourquoi le moteur ne tourne pas.

Je joins mon programme à mon message, est-ce que quelqu'un aurait une idée ?
 

#include <AccelStepper.h>
#include <TMCStepper.h>
#include <SPI.h>

// PINOUT S6 V2.1 (connecteurs X-MOT / Y-MOT) 
#define AZ_STEP_PIN   PE11   // X_STEP_PIN
#define AZ_DIR_PIN    PE10   // X_DIR_PIN
#define AZ_CS_PIN     PE7    // X_CS_PIN 


#define ALT_STEP_PIN  PD8    // Y_STEP_PIN
#define ALT_DIR_PIN   PB12   // Y_DIR_PIN
#define ALT_CS_PIN    PE15   // Y_CS_PIN 

#define R_SENSE 0.075f
#define AZ_RUN_CURRENT_MA  1500
#define ALT_RUN_CURRENT_MA 1500

#define SOFT_SPI_MOSI PE14
#define SOFT_SPI_MISO PE13
#define SOFT_SPI_SCK  PE12

TMC5160Stepper az_driver(AZ_CS_PIN, R_SENSE, SOFT_SPI_MOSI, SOFT_SPI_MISO, SOFT_SPI_SCK);
TMC5160Stepper alt_driver(ALT_CS_PIN, R_SENSE, SOFT_SPI_MOSI, SOFT_SPI_MISO, SOFT_SPI_SCK);

AccelStepper az(AccelStepper::DRIVER, AZ_STEP_PIN, AZ_DIR_PIN);
AccelStepper alt(AccelStepper::DRIVER, ALT_STEP_PIN, ALT_DIR_PIN);

float azSpeed = 0;   // steps/s, signé (direction = signe)
float altSpeed = 0;

const float MAX_SPEED = 4000.0;

String inputBuffer = "";

#define MICROSTEPS 16

void setup() {
  Serial.begin(115200);
  az_driver.begin();
  az_driver.rms_current(AZ_RUN_CURRENT_MA);
  az_driver.microsteps(MICROSTEPS);
  az_driver.toff(5);           
  az_driver.en_pwm_mode(true);  
  az_driver.pwm_autoscale(true);

  alt_driver.begin();
  alt_driver.rms_current(ALT_RUN_CURRENT_MA);
  alt_driver.microsteps(MICROSTEPS);
  alt_driver.toff(5);
  alt_driver.en_pwm_mode(true);
  alt_driver.pwm_autoscale(true);

  // Test SPI
  Serial.print("AZ  test_connection=");
  Serial.print(az_driver.test_connection());
  Serial.print(" version=0x");
  Serial.println(az_driver.version(), HEX);

  Serial.print("ALT test_connection=");
  Serial.print(alt_driver.test_connection());
  Serial.print(" version=0x");
  Serial.println(alt_driver.version(), HEX);

  az.setMaxSpeed(MAX_SPEED);
  alt.setMaxSpeed(MAX_SPEED);

  Serial.println("READY");
}

void loop() {
  readSerial();

  az.setSpeed(constrain(azSpeed, -MAX_SPEED, MAX_SPEED));
  alt.setSpeed(constrain(altSpeed, -MAX_SPEED, MAX_SPEED));

  az.runSpeed();
  alt.runSpeed();
}

void readSerial() {
  while (Serial.available()) {
    char c = (char)Serial.read();
    if (c == '\n') {
      handleCommand(inputBuffer);
      inputBuffer = "";
    } else if (c != '\r') {
      inputBuffer += c;
    }
  }
}

void handleCommand(String cmd) {
  cmd.trim();

  if (cmd == "PING") {
    Serial.println("PONG");
  }
  else if (cmd == "STOP") {
    azSpeed = 0;
    altSpeed = 0;
    Serial.println("OK");
  }
  else if (cmd.startsWith("VEL,1,")) {
    azSpeed = cmd.substring(6).toFloat();
    Serial.println("OK");
  }
  else if (cmd.startsWith("VEL,2,")) {
    altSpeed = cmd.substring(6).toFloat();
    Serial.println("OK");
  }
  else if (cmd == "DIAG") {
    Serial.print("AZ  test_connection=");
    Serial.print(az_driver.test_connection());
    Serial.print(" version=0x");
    Serial.println(az_driver.version(), HEX);

    Serial.print("ALT test_connection=");
    Serial.print(alt_driver.test_connection());
    Serial.print(" version=0x");
    Serial.println(alt_driver.version(), HEX);
  }
  else if (cmd.startsWith("RAWSTEP,")) {
    int axis = cmd.substring(8).toInt();
    uint8_t stepPin = (axis == 1) ? AZ_STEP_PIN : ALT_STEP_PIN;
    uint8_t dirPin  = (axis == 1) ? AZ_DIR_PIN  : ALT_DIR_PIN;

    digitalWrite(dirPin, HIGH);
    for (int i = 0; i < 400; i++) {
      digitalWrite(stepPin, HIGH);
      delayMicroseconds(800);
      digitalWrite(stepPin, LOW);
      delayMicroseconds(800);
    }
    Serial.println("OK");
  }
  else {
    Serial.println("ERR");
  }
}



Merci d'avance,
Hugo

  • J'aime 1

Rejoignez la conversation !

Vous pouvez répondre maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous pour poster avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

  • En ligne récemment   0 membre est en ligne

    • Aucun utilisateur enregistré regarde cette page.
×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.