progetto per tesi

buongiorno a tutti :slight_smile:
cerco il vostro aiuto per la mia tesi di laurea sto’ realizzando un picco braccio a due assi, ho copiato qualche progetto qua e la mettendo insieme questo

 #include <LiquidCrystal.h>



#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
#define Relay 24

int ritardo_veloce = 360 ;
int velocita = 0 ;
unsigned int distanza = 0;



LiquidCrystal lcd(46, 48, 56, 60, 61, 62);

void setup() {
  

lcd.begin(16,2);

 lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("  Carlotta ");
lcd.setCursor(0,1); // vai alla posizione 0,1 dell'LCD...
lcd.print("  Valente");
delay(2000);
lcd.clear();

lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("   ATTENZIONE");
lcd.setCursor(0,1); // vai alla posizione 0,0 dell'LCD... 
lcd.print(" AZZERARE ASSE");
delay(4000);
lcd.clear();

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

void loop()
{
lcd.setCursor(0,1); // vai alla posizione 0,1 dell'LCD... 
lcd.print("ASSE X 0,");
  if (digitalRead (pulsante_reset) == 0 ) {

//AZZERAMENTO
    
    pos_iniziale() ; // esegue procedura di posizionamento iniziale al fine corsa
   
     digitalWrite(Relay, LOW );
    delay(1000);
    step(STEP_PIN, 7166, DIR_PIN, true, velocita); //esegue 7166 passi in avanti veloce
 
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
   digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN

lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
lcd.print("ASSE AZZERATO");


}
  if (digitalRead (X_MAX ) == 0 ) {
    // azzera l'asse sul display
 
  step(STEP_PIN, 7168, DIR_PIN, false, velocita); //esegue 10000 INDIETRO 
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
  lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
lcd.print("ERRORE ASSE");
  
  }

//LAVORO
  
  if (digitalRead (pulsante_start ) == 0 ) {
   delay (1000);
    // esegue ciclo
  digitalWrite(Relay, LOW );
delay(2000);
    step(STEP_PIN, 1133, DIR_PIN, true, 360); //esegue 1133 passi in avanti veloce
    step(STEP_PIN, 303, DIR_PIN, true, 1250); //esegue 303 passi in avanti lento
    step(STEP_PIN, 1436, DIR_PIN, false, velocita); //esegue 1436 passi in avanti
    delayMicroseconds(5);
    
    digitalWrite(ENABLE_PIN, HIGH ); //abilita ENABLE_PIN

digitalWrite(Relay, HIGH );
 delay(500);
 
   lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("CICLO ESEGUITO");
delay(600);
  }
}

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

 distanza = i / 4 * 1.5 ; // calcoli la distanza in mm
lcd.setCursor(9,1); // vai alla posizione 9,1 dell'LCD... 
lcd.print(distanza);
}
}

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() {
 



}

vorrei integrare questo menu’ per poter cambiare velocita’ e numero di step

 #include <LiquidCrystal.h>
 
// Initialize the library with the numbers of the interface pins
LiquidCrystal lcd(8, 9, 4, 5, 6, 7);
 
//States for the menu.
int currentMenuItem = 0;
int lastState = 0;
 
void setup() {
   //Set the characters and column numbers.
   lcd.begin(16, 2);
   //Print default title.
   clearPrintTitle();
}
 
void loop() {
  //Call the main menu.
  mainMenu();
}
 
void mainMenu() {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead (0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0,0);
 
  //Check analog values from LCD Keypad Shield
  if (x < 100) {
    //Right
  } else if (x < 200) {
   //Up
    state = 1;
  } else if (x < 400){
   //Down
    state = 2;
  } else if (x < 600){
    //Left
  } else if (x < 800){
    //Select
    state = 3;
  }
 
  //If we are out of bounds on th menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 4) {
   currentMenuItem = 0; 
  }
 
   //If we have changed Index, saves re-draws.
   if (state != lastState) {
      if (state == 1) {
         //If Up
          currentMenuItem = currentMenuItem - 1; 
          displayMenu(currentMenuItem);
      } else if (state == 2) {
         //If Down
          currentMenuItem = currentMenuItem + 1;  
          displayMenu(currentMenuItem);
      } else if (state == 3) {
         //If Selected
         selectMenu(currentMenuItem); 
      }
      //Save the last State to compare.
      lastState = state;
   } 
   //Small delay
  delay(5);
}
 
//Display Menu Option based on Index.
void displayMenu(int x) {
     switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("-> prima distanza");
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("-> prima velocita");
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("-> seconda distanza");
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("-> seconda velocita");
        break;
    }
}
 
//Print a basic header on Row 1.
void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0,0);
  lcd.print(" HACKSHED.CO.UK ");
  lcd.setCursor(0,1); 
}
 
//Show the selection on Screen.
void selectMenu(int x) {
   switch (x) {
      case 1:
        clearPrintTitle();
        lcd.print ("Selected Opt 1");
        //Call the function that belongs to Option 1
        break;
      case 2:
        clearPrintTitle();
        lcd.print ("Selected Opt 2");
        //Call the function that belongs to Option 2
        break;
       case 3:
        clearPrintTitle();
        lcd.print ("Selected Opt 3");
        //Call the function that belongs to Option 3
        break;
      case 4:
        clearPrintTitle();
        lcd.print ("Selected Opt 4");
        //Call the function that belongs to Option 4
        break;
    }
}

spero in un vostro aiuto :-*

Ciao, non so se hai già visto, ma in "Megatopic" c'è QUESTO thread, di ben 15 pagine, dedicato ad una libreria che permette facilmente di creare Menu (e sottomenu) molto dettagliata, supportata e ben discussa nel suddetto thread.

Prova a guardarla, magari ti semplifica quello che vuoi fare.

Guglielmo

grazie Guglielmo

Questo è lo sketch di gestione menu, adattato, provalo, poi vediamo di integrarlo nel tuo programma

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int currentMenuItem = 0;
int lastState = 0;
int distanza_1 = 1133 ;
int distanza_2 = 303 ;
int distanza_3 = 1436 ;
int veloc_1 = 360 ;
int veloc_2 = 1250 ;
int veloc_3 = 330 ;
int stato = 0;
byte finito = 0 ;

void setup() {
  lcd.begin(16, 2);
  clearPrintTitle();
  lcd.print("scorrere Up/Down");
}

void loop() {
  //Call the main menu.
  mainMenu();
  if (finito == 1) {
    lcd.print("scorrere");
    finito = 0 ;
  }
}

void mainMenu() {
  //State = 0 every loop cycle.
  int state = 0;
  //Refresh the button pressed.
  int x = analogRead (A0);
  //Set the Row 0, Col 0 position.
  lcd.setCursor(0, 0);

  //Check analog values from LCD Keypad Shield
  if (x < 100) {
    //Right
  } else if (x < 200) {
    //Up
    state = 1;
  } else if (x < 400) {
    //Down
    state = 2;
  } else if (x < 600) {
    //Left
  } else if (x < 800) {
    //Select
    state = 3;
  }

  //If we are out of bounds on th menu then reset it.
  if (currentMenuItem < 0 || currentMenuItem > 7) {
    currentMenuItem = 0;
  }

  //If we have changed Index, saves re-draws.
  if (state != lastState) {
    if (state == 1) {
      //If Up
      currentMenuItem = currentMenuItem - 1;
      displayMenu(currentMenuItem);
    } else if (state == 2) {
      //If Down
      currentMenuItem = currentMenuItem + 1;
      displayMenu(currentMenuItem);
    } else if (state == 3) {
      //If Selected
      selectMenu(currentMenuItem);
    }
    //Save the last State to compare.
    lastState = state;
  }
  //Small delay
  delay(5);
}

//Display Menu Option based on Index.
void displayMenu(int x) {
  switch (x) {
    case 1:
      clearPrintTitle();
      lcd.print ("prima distanza");
      break;
    case 2:
      clearPrintTitle();
      lcd.print ("prima velocita");
      break;
    case 3:
      clearPrintTitle();
      lcd.print ("seconda distanza");
      break;
    case 4:
      clearPrintTitle();
      lcd.print ("seconda velocita");
      break;
    case 5:
      clearPrintTitle();
      lcd.print ("terza distanza");
      break;
    case 6:
      clearPrintTitle();
      lcd.print ("terza velocita");
      break;
    case 7:
      clearPrintTitle();
      lcd.print (" Esci da menu");


      break;
  }
}

void clearPrintTitle() {
  lcd.clear();
  lcd.setCursor(0, 0);
  //  lcd.print(" HACKSHED.CO.UK ");
  //  lcd.setCursor(0,1);
}

//Show the selection on Screen.
void selectMenu(int x) {
  switch (x) {
    case 1:
      lcd.setCursor(0, 1);
      lcd.print (distanza_1);
      delay(300);
      stato = 0 ;
      while ( stato <= 3 ) {
        stato = incrementa();
        if (stato == 1 ) {
          distanza_1 ++ ;
          posiziona();
          lcd.print (distanza_1);
        }
        if (stato == 2 ) {
          distanza_1 -- ;
          posiziona();
          lcd.print (distanza_1);
        }
        delay(150);
      }
      break;
    case 2:
      lcd.setCursor(0, 1);
      lcd.print (veloc_1);
      delay(300);
      stato = 0 ;
      while ( stato <= 3 ) {
        stato = incrementa();
        if (stato == 1 ) {
          veloc_1 ++ ;
          posiziona();
          lcd.print (veloc_1);
        }
        if (stato == 2 ) {
          veloc_1 -- ;
          posiziona();
          lcd.print (veloc_1);
        }
        delay(150);
      }
      break;
    case 3:
      lcd.setCursor(0, 1);
      lcd.print (distanza_2);
      delay(300);
      stato = 0 ;
      while ( stato <= 3 ) {
        stato = incrementa();
        if (stato == 1 ) {
          distanza_2 ++ ;
          posiziona();
          lcd.print (distanza_2);
        }
        if (stato == 2 ) {
          distanza_2 -- ;
          posiziona();
          lcd.print (distanza_2);
        }
        delay(150);
      }
      break;
    case 4:
      lcd.setCursor(0, 1);
      lcd.print (veloc_2);
      delay(300);
      stato = 0 ;
      while ( stato <= 3 ) {
        stato = incrementa();
        if (stato == 1 ) {
          veloc_2 ++ ;
          posiziona();
          lcd.print (veloc_2);
        }
        if (stato == 2 ) {
          veloc_2 -- ;
          posiziona();
          lcd.print (veloc_2);
        }
        delay(150);
      }
      break;
    case 5:
      lcd.setCursor(0, 1);
      lcd.print (distanza_3);
      delay(300);
      stato = 0 ;
      while ( stato <= 3 ) {
        stato = incrementa();
        if (stato == 1 ) {
          distanza_3 ++ ;
          posiziona();
          lcd.print (distanza_3);
        }
        if (stato == 2 ) {
          distanza_3 -- ;
          posiziona();
          lcd.print (distanza_3);
        }
        delay(150);
      }
      break;

    case 6:
      lcd.setCursor(0, 1);
      lcd.print (veloc_3);
      delay(300);
      stato = 0 ;
      while ( stato <= 3 ) {
        stato = incrementa();
        if (stato == 1 ) {
          veloc_3 ++ ;
          posiziona();
          lcd.print (veloc_3);
        }
        if (stato == 2 ) {
          veloc_3 -- ;
          posiziona();
          lcd.print (veloc_3);
        }
        delay(150);
      }
      break;
    case 7:
      lcd.setCursor(0, 0);
      lcd.print ("Premere SELECT");
      lcd.setCursor(0, 1);
      lcd.print (" per uscire");
      delay(300);
      stato = 0 ;
      while ( stato != 3 ) {
        stato = incrementa();
        delay(150);
        finito = 1 ;
        
      }
      lcd.clear(); 
        break;
  }
}
int incrementa() {
  stato = 0;
  int x = analogRead (A0);
  if (x < 50) return 1 ;  // Right ;
  if (x < 195) return 4 ;  // Up
  if (x < 350) return 5 ;   // Down
  if (x < 555) return 2 ;  // Left ;
  if (x < 790) return 3 ;  // Select
  if (x > 900) return 0 ;
//  else return 0 ;
  }

void posiziona() {
  lcd.setCursor(0, 1);
  lcd.print ("      ");
  lcd.setCursor(0, 1);
}

grazie @brunello ho caricato lo sckech funziona tranne il fatto che quando vai nei vari menu' e cerchi di cambiare il valore inizia ad incrementare/decrementare da solo il valore

Prova questo, è il misto dei due sketch

inizia ad incrementare/decrementare da solo il valore

Questo è un problema del valore che riporta l’analogRead(). I valori cambiano da modello a modello di Shield LCD. Vedi un po’ se ora è migliorato

Ho dovuto cambiare la numerazione di qualche pin, controllali.

Ps: la scelta dei valori si puo’ fare solo all’inizio, visto che nel loop principale hai usato talmente tanti delay da rendere impossibile usarla altrimenti

Allego il file, perche’ è troppo lungo

carl_valente.ino (10.4 KB)

ho caricato inizia a contare e non mi fa entrare nel menu dopo un po' mi da errore asse e continua a contare all'infinito :confused:

innanzi tutto controlla che valori riporta quando premi i tasti

#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);


int stato = 0;
byte finito = 0 ;

void setup() {
  lcd.begin(16, 2);
  lcd.clear();
    
}

void loop() {
int aaa= incrementa();
lcd.setCursor(10,1);
if (aaa == 0 ) lcd.print("Niente");
if (aaa == 1 ) lcd.print("Right");
if (aaa == 2 ) lcd.print("Left");
if (aaa == 3 ) lcd.print("Select");
if (aaa == 4 ) lcd.print("Up");
if (aaa == 5 ) lcd.print("Down");
delay (500);
}
  

int incrementa() {
  stato = 0;
  int x = analogRead (A0);
  lcd.setCursor(0,1);
  lcd.print("                 ");
  lcd.setCursor(5,1);
  lcd.print(x);
  if (x < 100) return 1 ;  // Right ;
  if (x < 200) return 4 ;  // Up
  if (x < 400) return 5 ;   // Down
  if (x < 600) return 2 ;  // Left ;
  if (x < 800) return 3 ;  // Select
  if (x > 900) return 0 ;
//  else return 0 ;
  }

Poi, hai controllato i pin a cui hai collegato la tua roba, come ti dicevo alcuni li ho dovuti cambiare

si ho cambiato i pin del display 46, 48, 56, 60, 61, 62 il pin dei tasti da a0 con 13 ho provato il test del display che hai postato ora anche in precedenza e corrisponde con i tasti che schiaccio ::)

si ho cambiato i pin del display 46, 48, 56, 60, 61, 62

il 56 e’ gia’ usato
#define STEP_PIN 56 // era messo sul 54 ( A0 ) ora è su A2

il pin dei tasti da a0 con 13

???

mi dai la parte di sketch dove hai modificato le assegnazioni

Stiamo parlando di una mega2560 , giusto ?

si mega 2560 e ramp 1.4

#include <LiquidCrystal.h>



#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
#define Relay 24
#define Relay_1 26

int ritardo_veloce = 600 ;
int velocita = 0 ;
unsigned int distanza = 0;



LiquidCrystal lcd(46, 48, 56, 60, 61, 62);

void setup() {
 {
 
}

lcd.begin(16,2);

 lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print(" CARLOTTA");
lcd.setCursor(0,1); // vai alla posizione 0,1 dell'LCD...
lcd.print("VALENTE");
delay(2000);
lcd.clear();

lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print("   ATTENZIONE");
lcd.setCursor(0,1); // vai alla posizione 0,0 dell'LCD... 
lcd.print(" AZZERARE ASSE");
delay(4000);
lcd.clear();

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

void loop()
{
  lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
lcd.print(" IN ATTESA.....");
lcd.setCursor(0,1); // vai alla posizione 0,1 dell'LCD... 
lcd.print("ASSE X 0,     mm");
   if (digitalRead (pulsante_reset) == 0 ) {


//AZZERAMENTO
    
    pos_iniziale() ; // esegue procedura di posizionamento iniziale al fine corsa
   
     digitalWrite(Relay, LOW );
    delay(1000);
    step(STEP_PIN, 7166, DIR_PIN, true, 160); //esegue 7166 passi in avanti veloce
 
  attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
   digitalWrite(ENABLE_PIN, HIGH ); //disabilita ENABLE_PIN

lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
lcd.print(" ASSE AZZERATO.");
delay(4000);
 
}
  if (digitalRead (X_MAX ) == 0 ) {
    // azzera l'asse sul display
 
 // step(STEP_PIN, 7168, DIR_PIN, false, velocita); //esegue 10000 INDIETRO 
  //attachInterrupt(digitalPinToInterrupt(X_MIN), err_finecorsa, LOW); // riabilita interrupt basso
  //lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... casomai cambia riga e colonna se serve
//lcd.print("   ERRORE ASSE");
  
  }

//LAVORO
  
  if (digitalRead (pulsante_start ) == 0 ) {
   delay (1000);
    // esegue ciclo
    digitalWrite(Relay_1, LOW  );
  digitalWrite(Relay, LOW );
delay(2000);
    step(STEP_PIN, 3100, DIR_PIN, true,200); //esegue 1315 passi in avanti veloce
  //  delayMicroseconds(5);
    
  digitalWrite(Relay_1, HIGH );
 
    step(STEP_PIN, 2310, DIR_PIN, true, 350); //esegue 584 passi in avanti lento
    delay(10);
 step(STEP_PIN, 2310, DIR_PIN, false, 200); //esegue 1899 passi in avanti
    delayMicroseconds(5);
digitalWrite(Relay_1, LOW );
    
    step(STEP_PIN, 3100, DIR_PIN, false, 200); //esegue 1899 passi in avanti
   delayMicroseconds(5);
    
    digitalWrite(ENABLE_PIN, HIGH ); //abilita ENABLE_PIN
digitalWrite(Relay_1, LOW );
digitalWrite(Relay, HIGH );
 delay(500);
 
  lcd.setCursor(0,0); // vai alla posizione 0,0 dell'LCD... 
lcd.print(" CICLO ESEGUITO");
delay(4000);

  }

}

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

 distanza = i / 80 * 1.5 ; // calcoli la distanza in mm
lcd.setCursor(9,1); // vai alla posizione 9,1 dell'LCD... 
lcd.print(distanza);
}
}

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() {
 



}

questo e il mio scketch testato e funzionante. questo e quello che ho trovato in rete

 // For RAMPS 1.4
#define X_STEP_PIN         54
#define X_DIR_PIN          55
#define X_ENABLE_PIN       38
#define X_MIN_PIN           3
#define X_MAX_PIN           2

#define Y_STEP_PIN         60
#define Y_DIR_PIN          61
#define Y_ENABLE_PIN       56
#define Y_MIN_PIN          14
#define Y_MAX_PIN          15

#define Z_STEP_PIN         46
#define Z_DIR_PIN          48
#define Z_ENABLE_PIN       62
#define Z_MIN_PIN          18
#define Z_MAX_PIN          19

#define E_STEP_PIN         26
#define E_DIR_PIN          28...........
#define E_ENABLE_PIN       24 ............

#define SDPOWER            -1
#define SDSS               53
#define LED_PIN            13

#define FAN_PIN            9

#define PS_ON_PIN          12
#define KILL_PIN           -1

#define HEATER_0_PIN       10
#define HEATER_1_PIN       8
#define TEMP_0_PIN          13   // ANALOG NUMBERING
#define TEMP_1_PIN          14   // ANALOG NUMBERING

Ma la shield LCD allora l’hai collegata con dei cavetti, non la usi come shield

Comunque il problema ( a occhio ) e’ che la shield usa il pin A0 per il tastierino. A0 su una mega si puo’ scrivere anche 54
e tu questo pin lo usi gia’

#define STEP_PIN   54

Quindi, o sposti lo STEP_PIN su un’altro pin ( e assegni quello nuovo al programma )
Ma se usi il driver a bordo della RAMP e’ difficile,

Oppure colleghi un filo che va dal pin A0 della shield LCD a un pin analogico della Mega.
Puoi usare A3, A4, A5 e da A9 a A15 , basta che poi informi lo sketch su che pin analogico hai collegato il cavetto
in questa riga
#define analog_pin A0 // deve diventare… xx

carl_valente.ino (10.5 KB)

grazie per l'aiuto che mi stai dando..... ho provato a spostare sul pin A15 il problema persiste appena esco dal menu' oppure attendo per poter eseguire il comando di start oppure azzeramento inizia il ciclo da solo all'infinito

ho provato a spostare sul pin A15 il problema persiste appena esco dal menu' oppure attendo per poter eseguire il comando di start oppure azzeramento inizia il ciclo da solo all'infinito

Non ho capito niente. Fammi capire una cosa: 1) Hai una Mega con sopra montato una RAMPS 1.4 ? 2) Come ti ho chiesto prima, la SHIELD LCD l'hai collegata alla RAMPS con dei cavetti ? Se le risposte alle precedenti sono SI, dove lo hai fisicamente collegato il cavetto dal pin A0 della Shield LCD , sulla RAMPS ? Se lo avessi collegato al pin A15, che corrisponde al Thermistore2 ( pin 6 del connettore appposito )..... no, su quel pin c'e' una resistenza di PullUp inserita nella scheda, non lo puoi usare puoi usare A3, A4, che sono riportati sulla RAMPS nel connettore AUX1 ( vedi foto ) E dopo dici al programma su che pin lo hai messo

Brunello: Ma la shield LCD allora l'hai collegata con dei cavetti, non la usi come shield

Comunque il problema ( a occhio ) e' che la shield usa il pin A0 per il tastierino. A0 su una mega si puo' scrivere anche 54 e tu questo pin lo usi gia'

#define STEP_PIN   54

Quindi, o sposti lo STEP_PIN su un'altro pin ( e assegni quello nuovo al programma ) Ma se usi il driver a bordo della RAMP e' difficile,

Oppure colleghi un filo che va dal pin A0 della shield LCD a un pin analogico della Mega. Puoi usare A3, A4, A5 e da A9 a A15 , basta che poi informi lo sketch su che pin analogico hai collegato il cavetto in questa riga

define analog_pin A0 // deve diventare..... xx

buongiorno si uso la ramp connessa alla mega... comunque stamattina ho cambiato mega e tutto funziona correttamente sara' guasta, funziona anche se connetto al pin 13, 14, 15 per sicurezza ho saldato direttamente alla mega pin A4 :D se posso chiederti solo un altro piccolo aiuto....... vorrei inserire come prima voce del menu' azzera asse, senza utilizzare un tasto esterno che in questo caso e #define pulsante_azzeramento 14 // pin Y_MIN ed eseguire questa procedura da menu'

grazie @brunello del tuo aiuto ho fatto un po’ di modifiche ho aggiunto altri due movimenti ampliato il menu’ tranne per l’azzeramento che non ci sono riuscita adesso il menu’ e sempre disponibile premendo i tasti up/down, ho spostato tutto sulla prima riga così vedi il valore che hai e sotto quello che stai impostando ho allegato il file corretto

p.s non era un problema della mega guasta avevo inserito errore asse e impazziva da solo :-[

carl_valente.ino (12.4 KB)

Cerca di eliminare i delay. :)

Mi ha consigliato anche @Brunello di eliminare i delay per dare dei ritardi cosa posso usare