Controllo stepper motor nema 34 + driver + arduino

Buongiorno, Premetto che non sono molto pratico di programmazione di microcontrollori e ..... ho bisogno di aiuto per favore!

Vorrei motorizzare il carro del mio tornio comandandolo con: - arduino uno - 1 motore stepper nema 34 - il driver del motore stepper a cui dovranno arrivare i segnali di comando dall'arduino (direzione - pulse x la velocità) -alimentatore per motore e arduino

il semplice circuito di comando che vorrei è composto da: - 1 deviatore per selezionare il senso di marcia - 1 potenziometro per comandare la velocità di rotazione

Ho assemblato il tutto ed il motore gira con un codice molto spartano che ho trovato in rete mentre emetto un sibilo, più o meno intenso a seconda di quanto giro il potenziometro, ma non gira con il codice che ho scritto per implementare il deviatore che comanda il senso di rotazione. I codici sono questi:

int sensorPin = A0; int sensorValue = 0;

void setup() { pinMode(8, OUTPUT); //direction pin pinMode(9, OUTPUT); //step pin digitalWrite(8, LOW); digitalWrite(9, LOW); }

void loop() { sensorValue = analogRead(sensorPin); sensorValue = map(sensorValue,0,1023,3600,1); digitalWrite(9, HIGH); delayMicroseconds(sensorValue); digitalWrite(9, LOW); delayMicroseconds(sensorValue); }

codice per implementare deviatore per selezionare il verso di rotazione

void setup() { pinMode(8, OUTPUT); //direction pin pinMode(9, OUTPUT); //step pin digitalWrite(8, LOW); digitalWrite(9, LOW); // initialize serial communication at 9600 bits per second: Serial.begin(9600); }

void loop() {

sensorValue = analogRead(sensorPot); sensorValue = map(sensorValue,0,1023,3600,1);

int f = digitalRead(forward); int r = digitalRead(reverse); if(f == 1){ digitalWrite(8, LOW); digitalWrite(9, HIGH); delayMicroseconds(sensorValue);

digitalWrite(9, LOW);

delayMicroseconds(sensorValue); //Serial.println(sensorValue); } if(r == 1){ digitalWrite(8, HIGH); digitalWrite(9, HIGH); delayMicroseconds(sensorValue); digitalWrite(9, LOW); delayMicroseconds(sensorValue); //Serial.println(sensorValue); } }

Probabilmente c'è un metodo di programmazione più consono allo scopo... gentilmente qualcuno può indicarmelo? Grazie

se emette un sibilo e non gira significa che il motore è in stallo, ciò è dovuto al fatto che un motore passo passo non riesce a girare alla massima velocità partendo da fermo, deve partire piano e accelerare graduatamente fino alla velocità massima. Se non gira nemmeno a basse velocità allora i problemi possono essere altri.

P.S. Il codice lo dovresti inserire usando l’apposito tag < / > in alto a sinistra sopra gli smiles :wink:

Direi che la gestione del motore deve prevedere un pulsante di star e uno di stop, un potenziometro per la velocità, un selettore di direzione e un "fungo emergenza".

Mancano proprio queste cose per gestire il motore, non è tanto il programma, non puoi pensare di mettere un loop() del genere che acceso arduino aziona direttamente il motore.

Io farei qualcosa del genere, ovviamente non è provato POSSONO ESSERCI ERRORI

#define DIR 8 //pin dir
#define STEP 9 //pin step
#define START 10 //pin start
#define STOP 11 //pin stop
#define DIREZIONE 12 // pin selettore direzione carro PENSATO COME INTERRUTTORE A LEVETTA SWITCH CHE DA ZERO O UNO
int velocita=0;
bool AccesoSpento=false;
void setup() {
  pinMode(DIR,OUTPUT);
  pinMode(STEP,OUTPUT);
  /*i pin sono in pullup, quindi al pulsante bisogna collegare
   * solo il filo di massa senza usare resistenze FACILITA IL CIRCUITO
   */
  pinMode(STAR,INPUT_PULLUP); 
  pinMode(STOP,INPUT_PULLUP); 
  pinMode(DIREZIONE,INPUT_PULLUP); 
  digitalWrite(DIR,LOW);
  digitalWrite(STEP,LOW);                            
}

void loop() {

  velocita=analogRead(A0); // METTERE il pin analogico del circuito
  velocita=map(velocita,0,1023,100,1000); // mettere la gamma di velocita per il motore
  if(digitalRead(START)==LOW){

    AccesoSpento=true; // attiva il motore
  }
  else if(digitalRead(STOP)==LOW){

    AccesoSpento=false; //arresta il motore
  }
  /* Legge l'interuttore selezione di direzione e imposta
   *  la direzione a destra o a sinistra 
   */
  if(digitalRead(DIREZIONE)==LOW){

    digitalWrite(DIR,HIGH);
  }
  else {
     digitalWrite(DIR,LOW);
  }
  if( AccesoSpento){
      Move();
  }
}


void Move(){
  digitalWrite(STEP, HIGH);
  delay (velocita);              
  digitalWrite(STEP, LOW); 
  delay(velocita);


}