Come controllare 2 stepper con 2 easydriver

Ciao a tutti ,
Dopo aver risolto molti problemi del mio progetto grazie al vostro aiuto chiedo ancora un altro consiglio:
Ho una easidriver e una bigeasydriver e una pololi A4983
Tutte e tre pilotano dei motori stepper uno da 1 A uno da 1,7 A e uno da 0,7A tutti e tre i driver utilizzano dir e stepper
Come faccio a distinguere l’azionamento del dir del motore 1 2 3?
Ho provato a dare un nome numerico come init dir 1 ma mi da errore come potrei fare?
Grazie in anticipo

Vorrei usare i tre motori con questo codice:

int shutter_on = 200; //tempo di pressione per attivare la cam, da settare intorno i 100 e 300
int shutter_off = 1500; // tempo di attesa prima di attivare il motorino

int wakeup = 1000; //Tempo fuoco acceso
int wakewait =200; //time between wake and shutter

int outpin = 13; //uscita per lo scatto
int wakepin = 12; //uscita per la messa a fuoco

// init motorino
int DIR_PIN =7;
int STEP_PIN =5;
int SLEEP = 6;      // PIN 12 = SLP

int delayTime = 500;

void setup() {
// init dei pin per lo scatto
pinMode(outpin, OUTPUT); //outpin gives output
pinMode(wakepin, OUTPUT); //wakepin gives output

// Tempo scatto Otturatore
shutter_on = 4000;

// init dei pin per il motorino
pinMode(DIR_PIN, OUTPUT);
pinMode(STEP_PIN, OUTPUT);
pinMode(SLEEP, OUTPUT); // set pin 12 to output


}

/////////// Loop ////////////

void loop(){


  
digitalWrite(wakepin, HIGH); //turn wakeup/focus on
delay(wakeup); //keep focus
digitalWrite(wakepin, LOW); //turn wakeup off
delay(wakewait); //wait
digitalWrite(outpin, HIGH); //press the shutter
delay(shutter_on); //wait the shutter release time
digitalWrite(outpin, LOW); //release shutter
delay(shutter_off); //wait for next round


 

  //rotate a specific number of microsteps (8 microsteps per step)
  //Avanti a 200 step 
  digitalWrite(SLEEP, HIGH);              // Sveglia il motore.

  rotate(-4000, 1);
  digitalWrite(SLEEP, LOW);                 // Spegne il motore
  delay(2000); 
 
}

void rotate(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN,dir); 

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(usDelay);
  }

}

non capisco il tuo problema. Ogni Driver ( easidriver, bigeasydriver e pololi A4983 ) lo colleghi con i suoi pin ai dei pin di arduino percui 2 (o 3) per il primo , altri per il secondo e ancora altri per il terzo. Ciao Uwe

uwefed: non capisco il tuo problema. Ogni Driver ( easidriver, bigeasydriver e pololi A4983 ) lo colleghi con i suoi pin ai dei pin di arduino percui 2 (o 3) per il primo , altri per il secondo e ancora altri per il terzo. Ciao Uwe

Ciao Uwe,e rigrazie sempre del tuo prezioso aiuto! Si il problema non è il collegamento che è già stato fatto quindi: Motore 1 su DIR pin 2 e STEP pin33 Motore 2 su pin 5 e 7 motore 3 su pin 8 e 10 GND collegati assieme e inseriti su gnd di arduino

mi rimane il problema del codice se do gli init del primo motore int DIR_PIN =2; int STEP_PIN =3; arduino ed il codice interpreta che la direzzione e passi valgono per i pin 2 e 3 e ci siamo ma se voglio una differente velocità e rotazione per gli altri motori come posso fare se il dir e step li ho già assegnati ai pin 2 e 3? C'è il modo da nominare DIR_PIN MOTORE2 =5 E STEP_PIN MOTORE2=7;?

Ciao, se non ho capito male il tuo problema si riduce alla sola creazione di altre quattro variabili (o meglio sarebbe fare dello costanti) per indicare a che pin hai collegato gli altri motori, poi con delle strutture condizionali (if, switch) che più ritieni opportune piloti il motore che desideri. Ad esempio int DIR_PIN_M1 =2; int STEP_PIN_M1 =3; int DIR_PIN_M2 =5; int STEP_PIN_M2 = 7; int DIR_PIN_M3 = 8; int STEP_PIN_M3 =10;

if (Condizione per muovere motore 1){ digitalwrite(STEP_PIN_M1, HIGH); delay(100); digitalwrite(STEP_PIN_M1, LOW); } if (Condizione per muovere motore 2){ digitalwrite(STEP_PIN_M2, HIGH); delay(100); digitalwrite(STEP_PIN_M2, LOW); } if (Condizione per muovere motore 3){ digitalwrite(STEP_PIN_M3, HIGH); delay(100); digitalwrite(STEP_PIN_M3, LOW); }

@ marcotroi Ma usi una libreria o programmi i pin da te? Se é il secondo caso allora fabpolli Ti ha giá risposto. Ciao Uwe

fabpolli:
Ciao, se non ho capito male il tuo problema si riduce alla sola creazione di altre quattro variabili (o meglio sarebbe fare dello costanti) per indicare a che pin hai collegato gli altri motori, poi con delle strutture condizionali (if, switch) che più ritieni opportune piloti il motore che desideri. Ad esempio

Allora ho creato le variabili nominando i motori
// init motorino
int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int SLEEP = 6; // PIN 12 = SLP
int DIR_PIN_M2 =2;
int STEP_PIN_M2 =3;
e fin quì va tutto bene

int shutter_on = 200; //tempo di pressione per attivare la cam, da settare intorno i 100 e 300
int shutter_off = 1500; // tempo di attesa prima di attivare il motorino

int wakeup = 1000; //Tempo fuoco acceso
int wakewait =200; //time between wake and shutter

int outpin = 13; //uscita per lo scatto
int wakepin = 12; //uscita per la messa a fuoco

// init motorino
int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int SLEEP = 6;      // PIN 12 = SLP
int DIR_PIN_M2 =2;
int STEP_PIN_M2 =3;

int delayTime = 500;

void setup() {
// init dei pin per lo scatto
pinMode(outpin, OUTPUT); //outpin gives output
pinMode(wakepin, OUTPUT); //wakepin gives output

// Tempo scatto Otturatore
shutter_on = 4000;

// init dei pin per il motorino
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);
pinMode(SLEEP, OUTPUT); // set pin 12 to output
pinMode(DIR_PIN_M2, OUTPUT);
pinMode(STEP_PIN_M2, OUTPUT);

}

/////////// Loop ////////////

void loop(){


  
digitalWrite(wakepin, HIGH); //turn wakeup/focus on
delay(wakeup); //keep focus
digitalWrite(wakepin, LOW); //turn wakeup off
delay(wakewait); //wait
digitalWrite(outpin, HIGH); //press the shutter
delay(shutter_on); //wait the shutter release time
digitalWrite(outpin, LOW); //release shutter
delay(shutter_off); //wait for next round


 

  //rotate a specific number of microsteps (8 microsteps per step)
  //Avanti a 200 step 
  digitalWrite(SLEEP, HIGH);              // Sveglia il motore.

  rotate_M1(4000, 0.5);
 
  digitalWrite(SLEEP, LOW);                 // Spegne il motore
  delay(2000);

}



void rotate_M1(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M1,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M1, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M1, LOW);
    delayMicroseconds(usDelay);
}



}

Però se inserisco una void rotate_M2(int steps, float speed){
distinguendo la rotate da rotate_M2
mi da errore

Scatto_Movimento_con_2_motori.cpp: In function ‘void rotate_M1(int, float)’:
:86: error: a function-definition is not allowed here before ‘{’ token
:105: error: expected `}’ at end of input

Il codice che mi da errore è questo:

int shutter_on = 200; //tempo di pressione per attivare la cam, da settare intorno i 100 e 300
int shutter_off = 1500; // tempo di attesa prima di attivare il motorino

int wakeup = 1000; //Tempo fuoco acceso
int wakewait =200; //time between wake and shutter

int outpin = 13; //uscita per lo scatto
int wakepin = 12; //uscita per la messa a fuoco

// init motorino
int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int SLEEP = 6;      // PIN 12 = SLP
int DIR_PIN_M2 =2;
int STEP_PIN_M2 =3;

int delayTime = 500;

void setup() {
// init dei pin per lo scatto
pinMode(outpin, OUTPUT); //outpin gives output
pinMode(wakepin, OUTPUT); //wakepin gives output

// Tempo scatto Otturatore
shutter_on = 4000;

// init dei pin per il motorino
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);
pinMode(SLEEP, OUTPUT); // set pin 12 to output
pinMode(DIR_PIN_M2, OUTPUT);
pinMode(STEP_PIN_M2, OUTPUT);

}

/////////// Loop ////////////

void loop(){


  
digitalWrite(wakepin, HIGH); //turn wakeup/focus on
delay(wakeup); //keep focus
digitalWrite(wakepin, LOW); //turn wakeup off
delay(wakewait); //wait
digitalWrite(outpin, HIGH); //press the shutter
delay(shutter_on); //wait the shutter release time
digitalWrite(outpin, LOW); //release shutter
delay(shutter_off); //wait for next round


 

  //rotate a specific number of microsteps (8 microsteps per step)
  //Avanti a 200 step 
  digitalWrite(SLEEP, HIGH);              // Sveglia il motore.

  rotate_M1(4000, 0.5);
  rotate_M2(4000, 0.5);
 
  digitalWrite(SLEEP, LOW);                 // Spegne il motore
  delay(2000);

}



void rotate_M1(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M1,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M1, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M1, LOW);
    delayMicroseconds(usDelay);
}

void rotate_M2(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M2,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M2, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M2, LOW);
    delayMicroseconds(usDelay);
}

}

@uwefed si li programmo io.

Il messaggio di errore lo dice. Perché manca una parentesi graffa chiusa prima di "void rotate_M2(int steps, float speed){"

Certi errori non possono essere localizzati precisamente dal compiler perché come in questo caso le possibilitá di mettere la parentesi graffa sono piú di una.

Ciao Uwe

Funzionaaaa :smiley:
Grazie ai vostri aiuti!

Ora sorge un altro problema e cioè perchè la rotate_M2(40000, 0.5); si aziona e finito i giri si aziona la rotate_M1(40000, 1);?
Io vorrei che i due motori girassero contemporaneamente. :grin:

// init motorino
int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int SLEEP = 6;      // PIN 12 = SLP
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;


void setup() {



// init dei pin per il motorino
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);
pinMode(SLEEP, OUTPUT); // set pin 12 to output
pinMode(DIR_PIN_M2, OUTPUT);
pinMode(STEP_PIN_M2, OUTPUT);

}

/////////// Loop ////////////

void loop(){

  digitalWrite(SLEEP, HIGH);              // Sveglia il motore.
  rotate_M2(40000, 0.5);
  rotate_M1(40000, 1);
  
 
  
  delay(000);
digitalWrite(SLEEP, LOW);                 // Spegne il motore
}



void rotate_M1(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M1,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M1, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M1, LOW);
    delayMicroseconds(usDelay);
}
}
void rotate_M2(int steps, float speed){
  //rotate a specific number of microsteps (8 microsteps per step) - (negitive for reverse movement)
  //speed is any number from .01 -> 1 with 1 being fastest - Slower is stronger
  int dir = (steps > 0)? HIGH:LOW;
  steps = abs(steps);

  digitalWrite(DIR_PIN_M2,dir); 
  

  float usDelay = (1/speed) * 70;

  for(int i=0; i < steps; i++){
    digitalWrite(STEP_PIN_M2, HIGH);
    delayMicroseconds(usDelay); 

    digitalWrite(STEP_PIN_M2, LOW);
    delayMicroseconds(usDelay);
}

}

Ciao, per come è costruito il codice è normale che giri prima un motore e poi l'altro, quando entri in un ciclo for (ad esempio) ci resti finchè questo non termina. Quindi il tuo codice richiama la funzione per far muovere M1 e resta dentro tale funzione finchè non esce dal for, poi richiama la rotazione di M2. per ottenere la rotazione contemporanea dei due motori dovresti ripensare il codice con un unico ciclo e sanza l'uso dei delay (che bloccano il codice) ma con la funzione millis e relativi controlli. [OT] il tuo codice si comporterebbe allo stesso modo anche se non stesse girando su un micro ma su un pc dotato di processore multicore, ma in tal caso potresti ricorrere alla programmazione multithread senza dover cambiare il codice più di tanto. [/OT]

Ciao

fabpolli:
Ciao, per come è costruito il codice è normale che giri prima un motore e poi l’altro, quando entri in un ciclo for (ad esempio) ci resti finchè questo non termina. Quindi il tuo codice richiama la funzione per far muovere M1 e resta dentro tale funzione finchè non esce dal for, poi richiama la rotazione di M2.
per ottenere la rotazione contemporanea dei due motori dovresti ripensare il codice con un unico ciclo e sanza l’uso dei delay (che bloccano il codice) ma con la funzione millis e relativi controlli.

Allora ho trovato il sistema per farli andare contemporaneamente solo che non riesco a dargli 2 velocità differenti. =(
Ho settato
int speedMotor1 = 60;//Velocità Motore1
int speedMotor2 = 90;//velocità Motore 2
Ma i motori sembrano girino sempre uguale tutti e due mentre io vorrei scegliere velocità diverse per ogni uno! :fearful:

// init motorino
int DIR_PIN_M1 =7;
int STEP_PIN_M1 =5;
int DIR_PIN_M2 =3;
int STEP_PIN_M2 =2;


int speedMotor1 = 60;//Velocità Motore1
int speedMotor2 = 90;//velocità Motore 2




void setup() {
pinMode(DIR_PIN_M1, OUTPUT);
pinMode(STEP_PIN_M1, OUTPUT);
pinMode(DIR_PIN_M1, OUTPUT);
digitalWrite(DIR_PIN_M1, HIGH);// comando direzione HIGH Avanti LOW Indietro Slider
pinMode(DIR_PIN_M2, OUTPUT);
digitalWrite(DIR_PIN_M2, LOW);// comando Pan HIGH Sinistra LOW Destra
pinMode(DIR_PIN_M2, OUTPUT);
pinMode(STEP_PIN_M2, OUTPUT);
}

void loop() {
  
      digitalWrite(STEP_PIN_M1, HIGH);
      delayMicroseconds(speedMotor1);
      digitalWrite(STEP_PIN_M1, LOW);
      delayMicroseconds(speedMotor1);
  
      digitalWrite(STEP_PIN_M2, HIGH);
      delayMicroseconds(speedMotor2);
      digitalWrite(STEP_PIN_M2, LOW);
      delayMicroseconds(speedMotor2);

   
  }

Ciao, dal codice che hai inviato secondo me a te sembra che i motori ruotino contemporaneamente solo perchè il delay è basso, ma in realtà il codice del loop attiva il motore 1, attende 60 microsecondi, disattiva il motore 1 e attende altri 60 microsecondi e solo dopo esegue la solita cosa per il motore 2 (cambia solo il delay da 60 a 90) e poi rinizia. Quindi credo che se tu aumenti il delay ti renderai conto che in realtà gira prima il motore 1 e poi il due e cos' via in modo ciclico. Credo che per far ciò che vuoi tu debba simulare il pwm da codice dando impulsi di high e low ai motori senza delay ma utilizzando la funzione millis per determinare accensioni e spegnimenti asincroni dei due motori in modo indipendente, una cosa del tipo:

if (millis()+60>last_M1_enabled && not M1_enabled){
   digitalWrite(STEP_PIN_M1, HIGH);
   last_M1_enabled=millis();
   M1_enabled=true;
}  
if (millis()+90>last_M2_enabled && not M2_enabled){
   digitalWrite(STEP_PIN_M2, HIGH);
   last_M2_enabled=millis();
   M2_enabled=true;
}
if (millis()+60>last_M1_enabled && M1_enabled){
   digitalWrite(STEP_PIN_M1, LOW);
   last_M1_enabled=millis();
   M1_enabled=false;
}  
if (millis()+90>last_M2_enabled &&  M2_enabled){
   digitalWrite(STEP_PIN_M2, LOW);
   last_M2_enabled=millis();
   M2_enabled=false;
}

Non avendo du motori e due driver non ho avviamente provato il codice postato e non è neppure otimizzato, la cosa descritta si può fare meglio e con meno istruzioni ma ho ritenuto il codice così scritto più comprensibile. Il codice postato non è la simulazione del pwm da software ma dovrebbe fare al caso tuo per iniziare a ttenere ciò che desideri. Ciao

fabpolli: Credo che per far ciò che vuoi tu debba simulare il pwm da codice dando impulsi di high e low ai motori senza delay ma utilizzando la funzione millis per determinare accensioni e spegnimenti asincroni dei due motori in modo indipendente, una cosa del tipo:

Ciao Fabio, ho provato ad inserire il tuo codice nel mio alla fine del loop ma mi da i seguenti errori e quindi non posso provare a far girare i motori. Dove sbaglio nell'inserire il codice in un posto sbagliato?Ho provato ad inserirlo anche sia nel setup sia nelle variabili ma niente. =(

Errori:; Movimento_2_motori.cpp: In function 'void loop()': Movimento_2_motori:35: error: 'last_M1_enabled' was not declared in this scope Movimento_2_motori:35: error: 'M1_enabled' was not declared in this scope Movimento_2_motori:40: error: 'last_M2_enabled' was not declared in this scope Movimento_2_motori:40: error: 'M2_enabled' was not declared in this scope Movimento_2_motori:45: error: 'last_M1_enabled' was not declared in this scope Movimento_2_motori:45: error: 'M1_enabled' was not declared in this scope Movimento_2_motori:50: error: 'last_M2_enabled' was not declared in this scope Movimento_2_motori:50: error: 'M2_enabled' was not declared in this scope

Ciao, gli errori di compilazione che hai ottenuto derivano dal fatto che non hai definito le variabili booleane che ho messo nel codice, devi dichiararle e a quel punto le puoi utilizzare. La dichiarazione la puoi far locale nel loop o globali all'esterno delle procedure. Il codice che ho postato lo scritto senza provarlo, quindi potrebbero essere presenti altri errori... ad ogni modo se posso darti un consiglio una volta che riesci a compilare correttamente e a verificare che il funzionamento sia quello desiderato modifica il codice per ottimizzarlo il più possibile e renderlo ancora più aderente alle specifiche che ti sei prefissato, in questo modo risuciresti a capir ancor meglio come funziona e a smaliziarti sempre più nella programmazione di arduino!

Ciao