Problemi con controllo NEMA 17

salve a tutti sono nuovo del mondo Arduino e dell’elettronica in generale, ho solo qualche nozione di base con Python ma sto provando ad assemblare un sistema composto da tre NEMA 17 per controllare i movimenti di una fotocamera.

Il mio sistema è così composto:

Arduino Uno R4 wifi

CNC shield V3

driver TMC 2208 v1.2

NEMA 17 mod. 17HE08-1004S

alimentatore 3V-12V 5A

MacBook Air M1 2020

sistema operativo OSX 14.4

IDE V 2.3.4

Ho settato vref dei TMC 2208 a 0,73v e controllato la corrente in entrata sulla CNC a 12,4V ma con qualsiasi codice che ho trovato e che provo a caricare sull’arduino non riesco a far muovere i motori. Al massimo riesco a attivare la coppia dei motori nel senso che quando provo a muoverli con le dita oppongono grande resistenza. I motori non scaldano.

// Definizione dei pin per i 3 assi
// Pin modificati per CNC Shield V3
#define X_STEP_PIN 2  // STEP PIN su X.STEP
#define X_DIR_PIN 5   // DIR PIN su X.DIR
#define Y_STEP_PIN 3  // STEP PIN su Y.STEP
#define Y_DIR_PIN 6   // DIR PIN su Y.DIR
#define Z_STEP_PIN 4  // STEP PIN su Z.STEP
#define Z_DIR_PIN 7   // DIR PIN su Z.DIR
#define ENABLE_PIN 8  // Pin ENABLE

// Configurazione dei motori
#define STEPS_PER_REV 200    // Passi per rivoluzione per NEMA 17
#define MICROSTEPS 16        // Microstepping impostato sui driver A4988
#define SPEED_DELAY 1000     // Delay aumentato per debug

void setup() {
  Serial.begin(115200);
  
  // Configurazione pin come output
  pinMode(X_STEP_PIN, OUTPUT);
  pinMode(X_DIR_PIN, OUTPUT);
  pinMode(Y_STEP_PIN, OUTPUT);
  pinMode(Y_DIR_PIN, OUTPUT);
  pinMode(Z_STEP_PIN, OUTPUT);
  pinMode(Z_DIR_PIN, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  
  // Abilita i driver (LOW = abilitato)
  digitalWrite(ENABLE_PIN, LOW);
  
  // Test iniziale dei pin
  testPins();
  
  Serial.println("CNC Shield pronta!");
  printCommands();
}

void testPins() {
  // Test di ogni pin
  Serial.println("Test dei pin...");
  
  // Test X
  Serial.println("Test pin X...");
  digitalWrite(X_DIR_PIN, HIGH);
  for(int i = 0; i < 10; i++) {
    digitalWrite(X_STEP_PIN, HIGH);
    delay(100);
    digitalWrite(X_STEP_PIN, LOW);
    delay(100);
  }
  
  // Test Y
  Serial.println("Test pin Y...");
  digitalWrite(Y_DIR_PIN, HIGH);
  for(int i = 0; i < 10; i++) {
    digitalWrite(Y_STEP_PIN, HIGH);
    delay(100);
    digitalWrite(Y_STEP_PIN, LOW);
    delay(100);
  }
  
  // Test Z
  Serial.println("Test pin Z...");
  digitalWrite(Z_DIR_PIN, HIGH);
  for(int i = 0; i < 10; i++) {
    digitalWrite(Z_STEP_PIN, HIGH);
    delay(100);
    digitalWrite(Z_STEP_PIN, LOW);
    delay(100);
  }
  
  Serial.println("Test pin completato");
}

void printCommands() {
  Serial.println("Comandi disponibili:");
  Serial.println("X+ : Muove X in senso orario");
  Serial.println("X- : Muove X in senso antiorario");
  Serial.println("Y+ : Muove Y in senso orario");
  Serial.println("Y- : Muove Y in senso antiorario");
  Serial.println("Z+ : Muove Z in senso orario");
  Serial.println("Z- : Muove Z in senso antiorario");
  Serial.println("T : Test sequenziale di tutti i motori");
  Serial.println("D : Debug pin status");
}

void moveMotor(int stepPin, int dirPin, bool direction, int steps) {
  Serial.print("Movimento motore: STEP=");
  Serial.print(stepPin);
  Serial.print(" DIR=");
  Serial.print(dirPin);
  Serial.print(" Direction=");
  Serial.println(direction ? "HIGH" : "LOW");
  
  digitalWrite(dirPin, direction ? HIGH : LOW);
  
  for(int i = 0; i < steps; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(SPEED_DELAY);
    digitalWrite(stepPin, LOW);
    delayMicroseconds(SPEED_DELAY);
    
    if(i % 50 == 0) {  // Feedback ogni 50 passi
      Serial.print(".");
    }
  }
  Serial.println("\nMovimento completato");
}

void debugPinStatus() {
  Serial.println("\nStato dei pin:");
  Serial.print("X_STEP (PIN ");
  Serial.print(X_STEP_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(X_STEP_PIN));
  
  Serial.print("X_DIR (PIN ");
  Serial.print(X_DIR_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(X_DIR_PIN));
  
  Serial.print("Y_STEP (PIN ");
  Serial.print(Y_STEP_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(Y_STEP_PIN));
  
  Serial.print("Y_DIR (PIN ");
  Serial.print(Y_DIR_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(Y_DIR_PIN));
  
  Serial.print("Z_STEP (PIN ");
  Serial.print(Z_STEP_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(Z_STEP_PIN));
  
  Serial.print("Z_DIR (PIN ");
  Serial.print(Z_DIR_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(Z_DIR_PIN));
  
  Serial.print("ENABLE (PIN ");
  Serial.print(ENABLE_PIN);
  Serial.print("): ");
  Serial.println(digitalRead(ENABLE_PIN));
}

void testAllMotors() {
  Serial.println("Inizio test completo...");
  
  Serial.println("\nTest motore X...");
  moveMotor(X_STEP_PIN, X_DIR_PIN, true, STEPS_PER_REV);
  delay(1000);
  
  Serial.println("\nTest motore Y...");
  moveMotor(Y_STEP_PIN, Y_DIR_PIN, true, STEPS_PER_REV);
  delay(1000);
  
  Serial.println("\nTest motore Z...");
  moveMotor(Z_STEP_PIN, Z_DIR_PIN, true, STEPS_PER_REV);
  delay(1000);
  
  Serial.println("Test completato!");
}

void loop() {
  if (Serial.available() > 0) {
    String command = Serial.readStringUntil('\n');
    command.trim();
    
    int steps = STEPS_PER_REV * MICROSTEPS / 4; // Un quarto di giro
    
    Serial.print("Comando ricevuto: ");
    Serial.println(command);
    
    if (command == "X+") {
      Serial.println("Movimento X+");
      moveMotor(X_STEP_PIN, X_DIR_PIN, true, steps);
    }
    else if (command == "X-") {
      Serial.println("Movimento X-");
      moveMotor(X_STEP_PIN, X_DIR_PIN, false, steps);
    }
    else if (command == "Y+") {
      Serial.println("Movimento Y+");
      moveMotor(Y_STEP_PIN, Y_DIR_PIN, true, steps);
    }
    else if (command == "Y-") {
      Serial.println("Movimento Y-");
      moveMotor(Y_STEP_PIN, Y_DIR_PIN, false, steps);
    }
    else if (command == "Z+") {
      Serial.println("Movimento Z+");
      moveMotor(Z_STEP_PIN, Z_DIR_PIN, true, steps);
    }
    else if (command == "Z-") {
      Serial.println("Movimento Z-");
      moveMotor(Z_STEP_PIN, Z_DIR_PIN, false, steps);
    }
    else if (command == "T") {
      Serial.println("Avvio test completo...");
      testAllMotors();
    }
    else if (command == "D") {
      debugPinStatus();
    }
    else {
      Serial.println("Comando non riconosciuto");
      printCommands();
    }
  }
}

Buonasera e benvenuto nella sezione Italiana del forum,

cortesemente, come prima cosa, leggi attentamente il REGOLAMENTO di detta sezione, (... e, per evitare future possibili discussioni/incomprensioni, prestando molta attenzione al punto 15), dopo di che, come da suddetto regolamento (punto 16.7), fai la tua presentazione NELL'APPOSITA DISCUSSIONE (... quello che vedi in blu è un link, fai click su di esso per raggiungere la discussione) spiegando bene quali esperienze hai in elettronica e programmazione, affinché noi possiamo conoscere la tua esperienza ed esprimerci con termini adeguati.

Grazie,

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposita discussione, nel rispetto del succitato regolamento nessuno ti risponderà (eventuali risposte o tuoi ulteriori post, verrebbero temporaneamente nascosti), quindi ti consiglio di farla al più presto. :wink:

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