movimento di un asse

buongiorno a tutti.... scusatemi se chiedo a voi esperti di questo fantastico mondo, io da poco mi sono cimentato nel mondo di arduino, ho acquistato questo kit ramp 1.4 +nema 2560+lcd 12864 e motori nema 17 per una stampante 3 d visto la loro praticita' la vorrei convertire per un altra mia esigenza, e qui chiedo aiuto a voi nel limite del possibile.
vengo al dunque..... con un motore nema 17 dovrei far girare una madrevita in senso antiorario fino al raggiungimento del finecorsa indietro una volta ragiunto dovra' effettuare 5000 step in avanti e fermarsi (questo per azzerare l'asse con la pressione di un pulsante)fino alla pressione di un pulsante che gli fara compiere ad ogni pressione 2000 step alla max veocita', poi altri 1000 step a velocita' piu' lenta e tornare indietro alla max velocita' compiendo i 3000 step e posizionarmi per un nuovo ciclo che verra effettuato con la pressione di un pulsante. chiaramente avrò bisogno dei due finecorsa avanti e indietro per la sicurezza, utilizzando il finecorsa indietro con la pressione di un secondo tasto per prendere lo zero lei dovrebbe tornare indietro arrivare al finecorsa e effettuare x step per portarsi alla posizione da dove partire.
utilizzando il display mi servirebbe solo per settare gli step da far compiere quelli di azzeramento ecc

Prima di tutto hai scritto in un area dove NON dovevi scrivere (... ho spostato io il tuo post) ed era chiaramente indicato nel primo post dell'area ... QUI, poi, essendo questo il tuo primo post, ti chiederei cortesemente di presentarti QUI (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con attenzione il REGOLAMENTO ... Grazie.

Guglielmo

Bene....
ma la domanda qual'è ?

buona sera sig. Brunello, la domanda era se qualcuno mi poteva dare una mano nella stesura del codice oppure darmi qualche indicazione di qualche progetto che potessi apportare piccole modifiche per il mio scopo

Dubito riesci a trovare un progetto "simile" da modificare solo un poco. :o
Leggo nella presentazione che sei nuovo di Arduino. Secondo me dovresti imparare un pò alla volta, con l'obiettivo finale del progetto di cui sopra. Ma un passo alla volta. :slight_smile:

certo e una mia piccola sfida sto impazzendo da giorni riesco a far effettuare al motore i suoi passi ma per i finecorsa non ho trovato come implementarli al mio scopo :confused:

hai già scritto qualcosa , postalo

#define X_STEP_PIN         54
#define X_DIR_PIN          55
#define X_ENABLE_PIN       38


#define E0_STEP_PIN         26
#define E0_DIR_PIN          28
#define E0_ENABLE_PIN       24

#define E1_STEP_PIN         36
#define E1_DIR_PIN          34
#define E1_ENABLE_PIN       30


void setup() {
pinMode(X_STEP_PIN, OUTPUT);
pinMode(X_DIR_PIN, OUTPUT);
pinMode(X_ENABLE_PIN, OUTPUT);





pinMode(E0_STEP_PIN, OUTPUT);
pinMode(E0_DIR_PIN, OUTPUT);
pinMode(E0_ENABLE_PIN, OUTPUT);

pinMode(E1_STEP_PIN, OUTPUT);
pinMode(E1_DIR_PIN, OUTPUT);
pinMode(E1_ENABLE_PIN, OUTPUT);


}

void step(int stepperPin, int steps, int dirPin, boolean dir){
digitalWrite(dirPin,dir);
delay(02);
for(int i=0;i<steps;i++){
  digitalWrite(stepperPin, HIGH);
  delayMicroseconds(360);
  digitalWrite(stepperPin, LOW);
  delayMicroseconds(500);
}
}

void loop()
{

    digitalWrite(X_ENABLE_PIN, LOW );

digitalWrite(E0_ENABLE_PIN, LOW );
digitalWrite(E1_ENABLE_PIN, LOW );  
//numero step senso orario
step(X_STEP_PIN, 2000, X_DIR_PIN, true);

step(E0_STEP_PIN, 200, E0_DIR_PIN, true);  
step(E1_STEP_PIN, 200, E1_DIR_PIN, true);  
delay(200);
//numero ste antiorario
step(X_STEP_PIN, 2000, X_DIR_PIN, false);

step(E0_STEP_PIN, 200, E0_DIR_PIN, false);
step(E1_STEP_PIN, 200, E1_DIR_PIN, false);
delay(200);

}

**@raffaele_72: **ti ricordo che in conformità al regolamento, punto 7, devi editare (in basso a destra del post, bottone More → Modify) il tuo post e racchiudere il codice all’interno dei tag CODE (… sono quelli che in edit inserisce il bottone fatto così: </>, tutto a sinistra).

Guglielmo

nessuno puo' aiutarmi?

Pensavo che avessi iniziato la stesura del tuo sketch, non che fossi ancora a provare a far girare i motori

vai, comincia con il guardare questo, che come abbozzo và bene e devi solo svilupparlo
l’ho fatto con la procedura che avevi iniziato tu

#define STEP_PIN   54
#define DIR_PIN    55
#define ENABLE_PIN  38
#define X_MIN 3 // finecorsa giu D3
#define X_MAX 2 // finecorsa su D2
#define pulsante_azzeramento 14 // pin Y_MIN 
#define pulsante_start 15 // pin Y_MAX 
#define pulsante_reset 18 // pin Z_MIN
#define led 13 // pin LED

int ritardo_veloce = 360 ;
int velocita = 0 ;


void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  pinMode(X_MIN, INPUT_PULLUP);
  pinMode(X_MAX, INPUT_PULLUP);
  pinMode(pulsante_azzeramento, INPUT_PULLUP);
  pinMode(pulsante_start , INPUT_PULLUP);
  pinMode(pulsante_reset, INPUT_PULLUP);
  digitalWrite(ENABLE_PIN, LOW );
  attachInterrupt(digitalPinToInterrupt(X_MAX), err_finecorsa, LOW); // Interrupt per finecorsa alto
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // Interrupt per finecorsa basso
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW );
}

void loop()
{
  if (digitalRead (pulsante_reset) == 0 ) {
    pos_iniziale() ; // esegue procedura di posizionamento iniziale al fine corsa
    delay(200);
    step(STEP_PIN, 5000, DIR_PIN, true, 360); //esegue 5000 passi in avanti veloce
    attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
  }
  if (digitalRead (pulsante_azzeramento ) == 0 ) {
    // azzera l'asse sul display
  }
  if (digitalRead (pulsante_start ) == 0 ) {
    // esegue ciclo
    step(STEP_PIN, 2000, DIR_PIN, true, 360); //esegue 2000 passi in avanti veloce
    delay(200);
    step(STEP_PIN, 1000, DIR_PIN, true, 2000); //esegue 1000 passi in avanti lento
    delay(200);
    step(STEP_PIN, 3000, DIR_PIN, false, 360); //esegue 3000 passi in avanti
    delay(200);
  }
}

void step(int stepperPin, int steps, int dirPin, boolean dir, int velocita) {
  digitalWrite(dirPin, dir);
  delay(10);
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(velocita);
  }
}

void pos_iniziale() {
  detachInterrupt(digitalPinToInterrupt(X_MIN)); // disabilita Interrupt basso
  digitalWrite(DIR_PIN, 0 );
  delay(10);
  while (digitalRead (X_MIN) == HIGH ) { // gira indietro fino al fine corsa
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(ritardo_veloce);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(ritardo_veloce);
  }
}
void err_finecorsa() {
  digitalWrite(led, HIGH ); // accende il led per ERRORE FINECORSA
  digitalWrite(ENABLE_PIN, HIGH ); // disabilita il motore
  while (1); // blocca tutto ( va premuto il Reset di Arduino per ripartire )
}

adesso provo subito grazie :slight_smile:

grazie dell'aiuto funziona tutto perfettamente, l'unica cosa che l motore resta sempre in coppia con il suo riscaldamento

finito :slight_smile: ho apportato delle modifiche allo sketch per disabilitare il motore quando e in attesa posto lo sketch se può servire a qualcuno.

#define STEP_PIN   54
#define DIR_PIN    55
#define ENABLE_PIN  38
#define X_MIN 3 // finecorsa giu D3
#define X_MAX 2 // finecorsa su D2
#define pulsante_azzeramento 14 // pin Y_MIN 
#define pulsante_start 15 // pin Y_MAX 
#define pulsante_reset 18 // pin Z_MIN
#define led 13 // pin LED

int ritardo_veloce = 360 ;
int velocita = 0 ;


void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  pinMode(X_MIN, INPUT_PULLUP);
  pinMode(X_MAX, INPUT_PULLUP);
  pinMode(pulsante_azzeramento, INPUT_PULLUP);
  pinMode(pulsante_start , INPUT_PULLUP);
  pinMode(pulsante_reset, INPUT_PULLUP);
  digitalWrite(ENABLE_PIN, HIGH );
  attachInterrupt(digitalPinToInterrupt(X_MAX), err_finecorsa, LOW); // Interrupt per finecorsa alto
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // Interrupt per finecorsa basso
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW );
}

void loop()
{
  if (digitalRead (pulsante_reset) == 0 ) {
    pos_iniziale() ; // esegue procedura di posizionamento iniziale al fine corsa
    delay(200);
    step(STEP_PIN, 5000, DIR_PIN, true, 360); //esegue 5000 passi in avanti veloce
    attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
    digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN
  }
  if (digitalRead (pulsante_azzeramento ) == 0 ) {
    // azzera l'asse sul display
  }
  if (digitalRead (pulsante_start ) == 0 ) {
    // esegue ciclo
    step(STEP_PIN, 2000, DIR_PIN, true, 500); //esegue 2000 passi in avanti veloce
    delay(200);
    step(STEP_PIN, 1000, DIR_PIN, true, 800); //esegue 1000 passi in avanti lento
    delay(200);
    step(STEP_PIN, 3000, DIR_PIN, false, 500); //esegue 3000 passi in avanti
    delay(200);
    digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN
  }
}

void step(int stepperPin, int steps, int dirPin, boolean dir, int velocita) {
  digitalWrite(dirPin, dir);
  delay(10);
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(velocita);
     digitalWrite(ENABLE_PIN, LOW );  //disabilita ENABLE_PIN
  }
}

void pos_iniziale() {
  detachInterrupt(digitalPinToInterrupt(X_MIN)); // disabilita Interrupt basso
  digitalWrite(DIR_PIN, 0 );
  delay(10);
  while (digitalRead (X_MIN) == HIGH ) { // gira indietro fino al fine corsa
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(ritardo_veloce);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(ritardo_veloce);
     digitalWrite(ENABLE_PIN, LOW ); //disabilita ENABLE_PIN
  }
}
void err_finecorsa() {
 #define INVERT_X_DIR_MIN false
  digitalWrite(ENABLE_PIN, HIGH ); // disabilita il motore
  while(0); //blocca tutto ( va premuto il Reset di Arduino per ripartire )


}

Bravo, è sempre utile postare lo sketch finito :slight_smile:

Karma +1 a te. Mi pare Brunello ti ha aiutato, potresti dargli un +1 Karma

anche due spiegatemi come fare :slight_smile:

raffaele_72:
anche due spiegatemi come fare :slight_smile:

A sinistra del post di Brunello sotto al suo nome e avatar vedi quanti Karma ha. Li vicino in verde c'e' add, premilo

Forse mi sbaglierò, perchè è un pò di tempo che non programmo con una RAMPS, ma

digitalWrite(ENABLE_PIN,LOW );

abilita il chip dello stepper
mentre un HIGH lo disabilita.
e a me pare che tu lo abbia impostato al contrario in tutto lo sketch

e questa parte

void err_finecorsa() {
 #define INVERT_X_DIR_MIN false
  digitalWrite(ENABLE_PIN, HIGH ); // disabilita il motore
  while(0); //blocca tutto ( va premuto il Reset di Arduino per ripartire )
}

va completata. Mica puoi lasciare che se arriva al fine corsa devi resettare Arduino

Studia

EDIT
e questa che cos'e ?
#define INVERT_X_DIR_MIN false

non so il perché comunque funziona il motore l’ho giro a mano quando si trova in attesa ho solo sbagliato qui

  }
  if (digitalRead (pulsante_start ) == 0 ) {
    // esegue ciclo
    step(STEP_PIN, 2000, DIR_PIN, true, 500); //esegue 2000 passi in avanti veloce
    delay(200);
    step(STEP_PIN, 1000, DIR_PIN, true, 800); //esegue 1000 passi in avanti lento
    delay(200);
    step(STEP_PIN, 3000, DIR_PIN, false, 500); //esegue 3000 passi in avanti
    delay(200);
    digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN
  }

invece di low ho messo high ma funzionava… #define INVERT_X_DIR_MIN false durante le prove ho dimenticato di cancellarla ho corretto lo sketch ed e questo

#define STEP_PIN   54
#define DIR_PIN    55
#define ENABLE_PIN  38
#define X_MIN 3 // finecorsa giu D3
#define X_MAX 2 // finecorsa su D2
#define pulsante_azzeramento 14 // pin Y_MIN 
#define pulsante_start 15 // pin Y_MAX 
#define pulsante_reset 18 // pin Z_MIN
#define led 13 // pin LED

int ritardo_veloce = 360 ;
int velocita = 0 ;


void setup() {
  pinMode(STEP_PIN, OUTPUT);
  pinMode(DIR_PIN, OUTPUT);
  pinMode(ENABLE_PIN, OUTPUT);
  pinMode(X_MIN, INPUT_PULLUP);
  pinMode(X_MAX, INPUT_PULLUP);
  pinMode(pulsante_azzeramento, INPUT_PULLUP);
  pinMode(pulsante_start , INPUT_PULLUP);
  pinMode(pulsante_reset, INPUT_PULLUP);
  digitalWrite(ENABLE_PIN, HIGH );
  attachInterrupt(digitalPinToInterrupt(X_MAX), err_finecorsa, LOW); // Interrupt per finecorsa alto
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // Interrupt per finecorsa basso
  pinMode(led, OUTPUT);
  digitalWrite(led, LOW );
}

void loop()
{
  if (digitalRead (pulsante_reset) == 0 ) {
    pos_iniziale() ; // esegue procedura di posizionamento iniziale al fine corsa
    delay(200);
    step(STEP_PIN, 5000, DIR_PIN, true, 360); //esegue 5000 passi in avanti veloce
    attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
    digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN
  }
  if (digitalRead (pulsante_azzeramento ) == 0 ) {
    // azzera l'asse sul display
  }
  if (digitalRead (pulsante_start ) == 0 ) {
    // esegue ciclo
    step(STEP_PIN, 2000, DIR_PIN, true, 500); //esegue 2000 passi in avanti veloce
    delay(200);
    step(STEP_PIN, 1000, DIR_PIN, true, 800); //esegue 1000 passi in avanti lento
    delay(200);
    step(STEP_PIN, 3000, DIR_PIN, false, 500); //esegue 3000 passi in avanti
    delay(200);
    digitalWrite(ENABLE_PIN, LOW ); //abilita ENABLE_PIN
  }
}

void step(int stepperPin, int steps, int dirPin, boolean dir, int velocita) {
  digitalWrite(dirPin, dir);
  delay(10);
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepperPin, HIGH);
    delayMicroseconds(velocita);
    digitalWrite(stepperPin, LOW);
    delayMicroseconds(velocita);
     digitalWrite(ENABLE_PIN, LOW );  //abilita ENABLE_PIN
  }
}

void pos_iniziale() {
  detachInterrupt(digitalPinToInterrupt(X_MIN)); // disabilita Interrupt basso
  digitalWrite(DIR_PIN, 0 );
  delay(10);
  while (digitalRead (X_MIN) == HIGH ) { // gira indietro fino al fine corsa
    digitalWrite(STEP_PIN, HIGH);
    delayMicroseconds(ritardo_veloce);
    digitalWrite(STEP_PIN, LOW);
    delayMicroseconds(ritardo_veloce);
     digitalWrite(ENABLE_PIN, LOW ); //abilita ENABLE_PIN
  }
}
void err_finecorsa() {
 
  digitalWrite(ENABLE_PIN, HIGH ); // disabilita il motore
  while(1); //ferma la rotazione 


}

invece se vorrei integrare il display?