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();
}
}
}