Spiegazione di programmazione ad un principiante

Buona sera a tutti, sono un neofita del mondo arduino e sto cercando di svolgere un piccolo progetto per il mio hobby di falegnameria.
Vorrei attivare un motore passo passo a seconda dei parametri che inserisco tramite un display e tre bottoni
il primo per aumentare il valore
il secondo per diminuire
il terzo per confermare

al momento i parametri da inserire sono tre

lo spessore della lama
la lunghezza della tavola
il numero dei denti

il codice che ho scritto è il seguente

#include <LiquidCrystal.h> 
LiquidCrystal lcd(2, 3, 4, 5, 6, 7); 
#define bottonesu 11 
#define ok 12 
#define bottonegiu 13 
int lama = 3;

void setup() {
  pinMode(bottonesu, INPUT);
  pinMode(ok, INPUT);
  pinMode(bottonegiu, INPUT);
  lcd.begin(16, 2);
  
  lcd.setCursor(0, 0);
  lcd.print("SPESSORE LAMA");
  lcd.setCursor(0, 1);
  lcd.print("mm 3");
}

void loop() {
  int pinsu = digitalRead(bottonesu);
  int pinok = digitalRead(ok);
  int pingiu = digitalRead(bottonegiu);
  int fasi = 1;
  int tavola = 200;

  for ( int i = 0 ; i < 4 ; i++){
    if (pinsu == HIGH && (fasi == 1 )) { 
    lama ++; 
    lcd.setCursor(3, 1); 
    lcd.print (lama);
    }
      else if (pingiu == HIGH && (fasi == 1)) { 
      lama --; 
      lcd.setCursor(3, 1); 
      lcd.print(lama); 
      }
        else if (pinok == HIGH && (fasi == 1)){ 
     
        lcd.clear();
        lcd.setCursor(0, 0);
        lcd.print("MISURA TAVOLA");
        lcd.setCursor(0, 1); 
        lcd.print("mm ");
        lcd.setCursor(3, 1);
        lcd.print(tavola);
        fasi ++;
        }

///////////////////////////SECONDA FASE//////////////////////////////////////////////////////
if (pinsu == HIGH && (fasi == 2)) { 
tavola ++;
lcd.setCursor(3, 1); 
lcd.print(tavola); 
}
  else if (pingiu == HIGH && (fasi == 2)) { 
  tavola --; 
  lcd.setCursor(5, 1); 
  lcd.print(tavola);
  }
    else if (pinok == HIGH && (fasi == 2)) {
    lcd.clear();
    lcd.setCursor(0, 0);
    lcd.print("NUMERO DENTI");
    lcd.setCursor(0, 1);
lcd.print("10");
    fasi ++;
    }
}
}

il risultato è il seguente
mi appare la scritta spessore lama e sotto mm3, e con i tasti me lo fa modificare, poi se premo il tasto di conferma mi salta la seconda fase e va in automatico alla terza fase, cioè numero denti, con sotto scritto 10. Se poi provo a modificare quel 10 con il bottone + o - non mi fa modificare il dieci ma mi scrive accanto ad un carattere di distanza.

Per completezza vi metto anche lo schema di montaggio
In fine vi chiedo di non darmi la soluzione spiattellata, ma di farmio capire dove sbaglio.
grazie a tutti.

Buongiorno,
essendo il tuo primo post, nel rispetto del regolamento della sezione Italiana del forum (… punto 13, primo capoverso), ti chiedo cortesemente di presentarti IN QUESTO THREAD (spiegando bene quali conoscenze hai di elettronica e di programmazione ... possibilmente evitando di scrivere solo una riga di saluto) e di leggere con molta attenzione tutto il su citato REGOLAMENTO ... Grazie. :slight_smile:

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non sarà fatta la presentazione nell’apposito thread, nessuno ti potrà rispondere, quindi ti consiglio di farla al più presto. :wink:

Piperino:
poi se premo il tasto di conferma mi salta la seconda fase e va in automatico alla terza fase

L'idea di scomporre in fasi è ottima, anzi forse anche l'unica percorribile, però:

  1. le variabili 'fasi' e 'tavola' non vanno reinizializzate ad ogni giro di loop, 'lama' è gestita correttamente
  2. dei pulsanti andrebbe rilevato solo l'istante di pressione (confrontando lettura nuova con vecchia) e non testato solo se è premuto, altrimenti ad ogni giro di loop (che dura poche decine di microsecondi) viene rilevata una nuova pressione.
  3. il for non ha alcuna utilità
  4. in parallelo alla resistenza di ogni pulsante va collegato anche un condensatore 100nF per eliminare i rimbalzi di chiusura e apertura che verrebbero letti come pressioni multiple.

Dividi il rogramma in fasi, com'è adesso, ma con lo schema di una macchina a stati. Comincia con lo stato 1 (o fase1 che va benissimo). In questa fase si aumenta/diminuisce lo spessore della tavola, si aumenta/diminuisce la lunghezza della tavola e si aumenta/diminuisce il numero dei denti. Avrai bisogno di quattro pulsanti: 1) per aumentare; 2) per diminuire; 3) per cambiare menu sul display; 4) per passare alla fase2.

Il tuo programma all'inizio presenta un display così

SPESSORE LAMA
mm 3

Con il pulsante 3 alterni il display così

MISURA TAVOLA
mm 200

NUMERO DENTI
n. X

SPESSORE LAMA
mm 3

ciclicamente. Per ciascun display con i pulsanti 1 e 2 aumenti o diminuisci i valori. Sarebbe bene prevedere per ciascuna serie di valori un min e un max.

Con il pulsante 4 passi alla fase 2.

Se ti va bene posso darti una mano. Butta giù uno schema di programma anche in italiano.

Ciao,
P.

Edit: Incrociato con Claudio_FF

Buona sera, credo di aver fatto un po di casino nel forum e chiedo scusa, con il mio progetto sono andato avanti e vi ringrazio dei consigli che mi avete dato.
Adesso ho un'altro problema che non riesco a risolvere, e avevo aperto una discussione pensando di fare cosa utile ad altri che potrebbero avere il mio solito problema, e un Moderatore mi ha suggerito di continuare la discussione qui, quindi faccio un semplice copia e incolla sperando di non fare altra confusione.

Ho collegato un motore passo passo al mio microcontroller, l'ho programmato ma il motore gira solo in una direzione, al momento credo che non ci siano altri dettagli se non lo schema di montaggio e il codice

void setup() {
int step;
pinMode(8,OUTPUT);
pinMode (9 ,OUTPUT); 
digitalWrite (8 , LOW);
digitalWrite (9 , LOW);
}

void loop (){

delay (1000);
digitalWrite (8 , LOW);
digitalWrite (9 , LOW);
for ( int step = 0 ; step <=2000; step++){
  digitalWrite (9 , HIGH);
  delayMicroseconds(1000);
  digitalWrite (9 , LOW);
}
delay (1000);
digitalWrite (8 , HIGH);
digitalWrite (9 , LOW);
for ( int step = 0 ; step <=1600; step++){
  digitalWrite (9 , HIGH);
  delayMicroseconds(1000);
  digitalWrite (9 , LOW);
}
}

Un'ultima cosa che penso posso assere importante, il motore passo passo a 4 fili nero verde la prima coppia e sono attaccate a l 1b 1a del driver e rosso e blu che sono attaccate al pin 2a 2b il motorino gira in senso orario, se scambio una di quelle di fili coppie il motorino gira in senso opposto.
Grazie mille a tutti

Piperino:
Buona sera, credo di aver fatto un po di casino nel forum e chiedo scusa ...

... e NON hai finito di farlo :smiley: :smiley: :smiley:

Ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Scusa ma se magari ci dicessi anche quale stepper stai usando potremmo darti qualche altra indicazione.

Tra l'altro se usi uno stepper perché non usi la libreria Stepper???

docdoc:
Scusa ma se magari ci dicessi anche quale stepper stai usando potremmo darti qualche altra indicazione.

Nema 17 stepper Motor, Longruner motore passo-passo bipolare 2 a 64oz. in (45NCM) 42 x 40 mm corpo 4-lead W/1 m cavo e connettore con staffa di montaggio per stampante 3D hobby CNC LD08

Tra l'altro se usi uno stepper perché non usi la libreria Stepper???

Ho provato a a guardare diversi siti e video e li ho copiati ma non ho mai trovato nessuno che usano librerie

Ok, bene, oltre al NEMA 17 vedo dallo schema (che non avevo neanche guardato perché mancavano già altre info) che usi un driver A4988, non hai bisogno di altro. Ma specifica sempre tutti gli elementi del tuo progetto quando chiedi consigli! :wink:

Il programma che hai postato è praticamente identico a quello che viene proposto come esempio, l'unica cosa che noto è che tu nel tuo sketch usi i pin 3 (STEP) e 4 (DIR) mentre nello schema hai indicato 9 (STEP) e o (DIR)...

Verifica bene i collegamenti e facci sapere intanto qual è la situazione reale e l'esito delle prove facendo riferimento magari prima a quella pagina che ti ho linkato...

Piperino:

void setup() {

int step;
pinMode(8,OUTPUT);
pinMode (9 ,OUTPUT);
digitalWrite (8 , LOW);
digitalWrite (9 , LOW);
}

void loop (){

delay (1000);
digitalWrite (8 , LOW);
digitalWrite (9 , LOW);
for ( int step = 0 ; step <=2000; step++){
  digitalWrite (9 , HIGH);
  delayMicroseconds(1000);
  digitalWrite (9 , LOW);
}
delay (1000);
digitalWrite (8 , HIGH);
digitalWrite (9 , LOW);
for ( int step = 0 ; step <=1600; step++){
  digitalWrite (9 , HIGH);
  delayMicroseconds(1000);
  digitalWrite (9 , LOW);
}
}

docdoc perdonami non ti seguo, nel codice che ho sopra quotato uso il pin 8 per direction e pin 9 per step, e ho visto che è uguale anche nello schema

Si, scusami tu, avevo scaricato sia il tuo codice sia un esempio da quella pagina ed ho scambiato i due listati perché sono praticamente identici...

In pratica se vai a QUESTA pagina c'è proprio un esempio esattamente con lo stesso stepper e lo stesso driver.

Lì troverai anche il programmino di esempio che fa esattamente quello che stai cercando di fare: carica quello (dopo aver adattato la configurazione dei pin che vedi alle righe 8 e 9, quindi impostando stepPin
e dirPin) e dicci cosa succede.

docdoc:
Si, scusami tu, avevo scaricato sia il tuo codice sia un esempio da quella pagina ed ho scambiato i due listati perché sono praticamente identici...

In pratica se vai a QUESTA pagina c'è proprio un esempio esattamente con lo stesso stepper e lo stesso driver.

Lì troverai anche il programmino di esempio che fa esattamente quello che stai cercando di fare: carica quello (dopo aver adattato la configurazione dei pin che vedi alle righe 8 e 9, quindi impostando stepPin
e dirPin) e dicci cosa succede.

docdoc mi dispiace dirti che è tutto come prima se cambio il codice nei passi da fare e nella velocità il motore lo esegue, ma gira sempre nel solito verso
Un'altra volta ho provato a invertire i fili di una coppia dello stepper e gira nel modo opposto

Piperino:
se cambio il codice nei passi da fare e nella velocità il motore lo esegue, ma gira sempre nel solito verso

Cosa significa "cambio il codice nei passi da fare e nella velocità"? Non toccare niient'altro, tu cambia solamente quelle due righe con i pin che tu usi, o, meglio, imposta il tuo progetto ESATTAMENTE come quell'esempio e verifica se a te funziona. Se non ti funziona, allora o hai sbagliato qualcosa nel cablaggio (fai una foto magari) o hai un driver difettoso, non mi viene in mente nient'altro perché il progetto di esempio è molto semplice.

E alla fine il problema non era il codice, non erano nemmeno i collegamenti, ma era il driver sciupato.
Grazie mille a tutti, ci sentiamo per il prossimo problema :slight_smile:

Beh, bene, in fondo era una delle due possibilità che ti avevo elencato, no? :wink:

GCD! :smiley: (Good Coding, Dude!)

Buona sera a tutti, continuo a scrivere qui per un nuovo quesito ma per il solito progetto, spero di non combinare casini.
Sto cominciando a pensare alla realizzazione del progetto definitivo e mi sono messo in cerca di alcuni pulsanti da poter usare, e mi sono imbattuto in una marea di pulsanti.
Potete aiutarmi nella scelta?
a quali parametri devo stare attento?
a me servono dei bottoni a impulso , non di quelli accendi e rimangono accesi
Sapete consigliarmi uno store dove si compra bene?
Grazie mille a tutti ancora

Beh i pulsanti sono pulsanti, non è che ci sia poi molto da verificare...

La maggior parte dei componenti li ho acquistati su eBay da EBM Store, il venditore è sempre stato molto rapido ed efficiente nelle spedizioni (appena arrivi a 6.50€ di spese di spedizione spedisce automaticamente con corriere, quindi rapidissimo), ed il materiale è sempre di buona qualità ed a prezzi buoni.

PS: non sono in alcun modo affiliato a quel negozio, ma mi sono trovato sempre bene, ed anche molti altri qui hanno espresso la stessa opinione, per cui ti consiglio di iniziare da lì.

Buongiorno, il problema del giorno è che io ho un display I2C LCD 2004 20 x 4 che guido con la libreria LiquidCrystal_I2C, quello che vorrei sapere se sulla riga di un display posso concatenare una variabile e una stringa, ho fatto una ricerca su diversi siti, ma non sono riuscito a trovare niente.
Grazie mille anche per oggi

Piperino:
a me servono dei bottoni a impulso , non di quelli accendi e rimangono accesi

Quelli che chiami a impulso si possono chiamare monostabili o normalmente aperti o normalmente chiusi, quelli che rimangono accesi in realtà sono interruttori a pulsante.

vorrei sapere se sulla riga di un display posso concatenare una variabile e una stringa

Basta fare due scritture in due punti diversi del display.

Piperino:
Buongiorno, il problema del giorno è che io ho un display I2C LCD 2004 20 x 4 che guido con la libreria LiquidCrystal_I2C, quello che vorrei sapere se sulla riga di un display posso concatenare una variabile e una stringa, ho fatto una ricerca su diversi siti, ma non sono riuscito a trovare niente.

Certamente, o fai print separate, ad esempio:

  int valore = 132;
  char msg[] = "Messaggio";
  lcd.setCursor(0,1);
  lcd.print(valore);
  lcd.print(" ");
  lcd.print(msg);

Oppure puoi anche fare cose più complesse, ti basta usare una variabile stringa (ossia "char []" non "String" mi raccomando!) nella quale accumulare il risultato, usando la sprintf().
Ad esempio:

  int valore = 132;
  char msg[] = "Messaggio";

  char linea[40];
  sprintf(linea, "%d %s", valore, msg);
  lcd.setCursor(0,1);
  lcd.print(linea);