Come inserire il controllo di velocità per nema 17 e Easy Driver?

Buonasera a tutti,
mentre attendevo l’arrivo della meccanica, ho avuto tempo per rispolverare un arduino mega e caricare lo sketch di un americano.

I componenti:

Nema 17
Easy Driver
Arduino Mega
LCD Nokia 5110
tastiera 4x4

in breve inserisci la quantità di movimento che deve fare il motore (espresso in mm) e poi dai invio; il motore parte e quando si ferma sul display appare la posizione corrente (quella che hai impostato).

Funziona tutto alla grande, sono anche riuscito a modificare/inserire un delay per la partenza e un led che blinka 4 secondi all’inizio e alla fine del movimento del nema 17.

Il fatto è che per quanto abbia provato a modificare lo sketch, non ci sono ovviamente riuscito.

Io vorrei solo inserire il controllo della velocità, nello stesso modo in cui si immette lo spostamento.

Di seguito il codice con le modifiche che ho apportato (spero di non aver fatto pasticci, perchè non vedo l’icone per postare i codici che ho visto nella guida):

#include <U8glib.h>

/* Arduino Control Stepper with Keypad and LCD

Created by Yvan / https://Brainy-Bits.com
This code is in the public domain...
You can: copy it, use it, modify it, share it or just plain ignore it!
Thx!

*/

#include "AccelStepper.h" // AccelStepper Library
#include <Keypad.h>  // Keypad Library
#include "U8glib.h"  // U8glib for Nokia LCD

// Variables to hold entered number on Keypad
volatile int firstnumber=99;  // used to tell how many numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;

// Variables to hold Distance and CurrentPosition
int keyfullnumber=0;  // used to store the final calculated distance value
String currentposition = "";  // Used for display on Nokia LCD


// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; // Arduino pins connected to the row pins of the keypad
byte colPins[COLS] = {31, 33, 35, 37}; // Arduino pins connected to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Keypad Library definition


// U8glib Setup for Nokia LCD
#define backlight_pin 11
U8GLIB_PCD8544 u8g(3, 4, 6, 5, 7);  // Arduino pins connected to Nokia pins:
                                    // CLK=3, DIN=4, CE=6, DC=5, RST=7
                                    
                                    
// AccelStepper Setup
AccelStepper stepper(1, A0, A1);  // 1 = Easy Driver interface
                                  // Arduino A0 connected to STEP pin of Easy Driver
                                  // Arduino A1 connected to DIR pin of Easy Driver
                                  


void setup(void) {

  //intialize the digital pin as an output.
  // Pin 13 has an LED connected on most Arduino boards:
  pinMode(13, OUTPUT);
    
  //  Light up the LCD backlight LEDS
  analogWrite(backlight_pin, 255);  // Set the Backlight intensity (0=Bright, 255=Dim)
    
  //  AccelStepper speed and acceleration setup
  stepper.setMaxSpeed(200);  // Not to fast or you will have missed steps
  stepper.setAcceleration(400);  //  Same here
  
  // Draw starting screen on Nokia LCD
  u8g.firstPage();
  do {
  u8g.drawHLine(0, 15, 84);
  u8g.drawVLine(50, 16, 38);
  u8g.drawHLine(0, 35, 84); 
  u8g.setFont(u8g_font_profont11);
  u8g.drawStr(0, 10, "ENTER DISTANCE");
  u8g.drawStr(62, 29, "MM");
  u8g.drawStr(4, 46, "cur-pos");
  }
  while( u8g.nextPage() );
  
}


void loop(){
  
  char keypressed = keypad.getKey();  // Get value of keypad button if pressed
  if (keypressed != NO_KEY){  // If keypad button pressed check which key it was
    switch (keypressed) {
      
      case '1':
        checknumber(1);
      break;
        
      case '2':
        checknumber(2);
      break;

      case '3':
        checknumber(3);
      break;

      case '4':
        checknumber(4);
      break;

      case '5':
        checknumber(5);
      break;

      case '6':
        checknumber(6);
      break;

      case '7':
        checknumber(7);
      break;

      case '8':
        checknumber(8);
      break;

      case '9':
        checknumber(9);
      break;

      case '0':
        checknumber(0);
      break;

      case '*':
        deletenumber();
      break;

      case '#':
        calculatedistance();
      break;
    }
  }

}

void checknumber(int x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd
    
  } else {
    if (secondnumber == 99) {  // Check if it's the second number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);

    } else {  // It must be the 3rd number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);

    }
  }
}

 
void deletenumber() {  // Used to backspace entered numbers
  if (thirdnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);

    thirdnumber=99;
  } 
  else {
    if (secondnumber !=99) {
      String displayvalue = String(firstnumber);
      drawnokiascreen(displayvalue);

      secondnumber=99;
   } 
   else {
     if (firstnumber !=99) {
       String displayvalue = "";
       drawnokiascreen(displayvalue);

       firstnumber=99;
      }
    }
  }
}
  
void calculatedistance() {  // Used to create a full number from entered numbers

    if (thirdnumber == 99 && secondnumber == 99 && firstnumber != 99) {
      keyfullnumber=firstnumber;
      movestepper(keyfullnumber);
    }
    
    if (secondnumber != 99 && thirdnumber == 99) {
      keyfullnumber=(firstnumber*10)+secondnumber;
      movestepper(keyfullnumber);
    }
    
    if (thirdnumber != 99) {
      keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
      movestepper(keyfullnumber);
    }
    
    resetnumbers(); // Reset numbers to get ready for new entry
  } 


void movestepper(int z) {  //  Move the stepper
  
  digitalWrite(13,HIGH);  // accendi led
  delay(500);            // attendi un secondo acceso
  digitalWrite(13, LOW);  // spegni led
  delay(500);            // attendi un secondo spento

  
      
  int calculatedmove=((z*1600)/80);  //  Calculate number of steps needed in mm
  stepper.runToNewPosition(calculatedmove);
  currentposition = String(z);

  digitalWrite(13,HIGH);  // accendi led
  delay(200);            // attendi un secondo acceso
  digitalWrite(13, LOW);  // spegni led
  delay(200);            // attendi un secondo spento
  
  
  
  u8g.firstPage();
  do {
    u8g.drawHLine(0, 15, 84);
    u8g.drawVLine(50, 16, 38);
    u8g.drawHLine(0, 35, 84); 
    u8g.setFont(u8g_font_profont11);
    u8g.drawStr(0, 10, "ENTER DISTANCE");
    u8g.drawStr(62, 29, "MM");
    u8g.drawStr(4, 46, "cur-pos");
    u8g.setPrintPos(57,47);
    u8g.print(currentposition);       
  }
  while( u8g.nextPage() ); 
}
                
void resetnumbers() {  // Reset numbers for next entry
  firstnumber=99;
  secondnumber=99;
  thirdnumber=99;
} 
  

void drawnokiascreen(String y) {

    u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(50, 16, 38);
      u8g.drawHLine(0, 35, 84); 
      u8g.setFont(u8g_font_profont11);
      u8g.drawStr(0, 10, "ENTER DISTANCE");
      u8g.setPrintPos(0,29);
      u8g.print(y);  // Put entered number on Nokia lcd    
      u8g.drawStr(62, 29, "MM");
      u8g.drawStr(4, 46, "cur-pos");
      u8g.setPrintPos(57,47); 
      u8g.print(currentposition);  //  Display current position of stepper
    }
      while( u8g.nextPage() );

}

>zerosound: Il codice va messo tra i tag CODE, che, in fase di edit, ti inserisce il bottone </> … primo a sinistra e NON tra altri tag.

Per questa volta ho corretto io, cortesemente la prossima volta presta più attenzione. :wink:

Guglielmo

P.S.: Per evitare futuri problemi, ti consiglio un’attenta lettura di tutto il REGOLAMENTO :slight_smile:

Lo sapevo che avrei fatto la prima figuraccia....si, ho visto la guida prima di postare, ma non leggevo bene il simbolo e lo cercavo nella zona indicata, senza accorgermi che stava li a sinistra...chiedo scusa.

Non so se il motore é adatto al driver. È come chiedi se devi far benzina o gasolio a una macchina lunga 4,5m. Ciao Uwe

uwefed:
Non so se il motore é adatto al driver. È come chiedi se devi far benzina o gasolio a una macchina lunga 4,5m.
Ciao Uwe

Ciao, si, il Nema17 si interfaccia benissimo con l’EasyDriver, ci ho fatto diversi progetti. Quello che non riesco a fare (perchè per quanti sfrozi abbia fatto non mi riesce di apprendere la programmazione di arduino, ma ci stò lavorando…) è riuscire a controllare ANCHE la velocità del motore…anche con un potenziometro, usando la tastiera solo per immettere la distanza. Altrimenti sarei costretto ad avere sempre un pc con me per modificare la velocità…
Ho provato ad inserire dei pezzi di sketch (per esempio di Mauro Alfieri, che ha usato il nema 17 e l’Easy driver) per controllare la velocità ma ovviamente non funzionano…

Potrei anche lasciarlo così, ma preferirei riuscire a modificare lo sketch.
Continuerò a provare a modificare lo sketch, ma se qualcuno può darmi una mano, mi farebbe piacere.

Buona giornata!

zerosound: Ciao, si, il Nema17 ...

Forse NON ti è chiaro che i numeri NemaXX indicano SOLO le dimensioni fisiche del motore, ma NON le sue caratteristiche, quindi, dire Nema17 e dire 42x42mm è la stessa cosa ... non è che aiuta molto ad aiutarti ... ::)

Guglielmo

P.S.: Nema 8 = 20x20mm, Nema 11 = 28x28mm, Nema 14 = 35x35mm, Nema 17 = 42x42mm, Nema 23 = 56.4x56.4mm, Nema 24 = 60x60mm, Nema 34 = 85x85mm.

Ok, giusto, preciso:

il progetto che ho realizzato, e va benissimo, è questo:
controllo stepper con tastiera e lcd nokia

il motore che stò usando riporta in targa 0,4A - 1,8°x step - alimentazione a 12V.

Stò comunque continuando a cercare e a provare a capire come inserire una parte di codice che mi permetta in qualche modo, anche senza l’uso della tastiera, di controllare la velocità. Ce la stò mettendo tutta e capisco che un forum è sempre bombardato da nuovi che chiedono una soluzione ai loro problemi.
Sto continuando a cercare tutorial anche di base.

Hai già visto QUESTO tutorial ? :)

Guglielmo

Si...o meglio, nel link che hai postato tu non c'è l'esempio del controllo della velocità, mentre nel link alla pagina di Brian c'è e lo stavo appunto seguendo (anche se alla pagina di brian ci sono arrivato nelle varie ricerche).

Vedrò di riuscire in qualche modo ad inserire il pezzo di codice mancante.

Grazie per l'attenzione ed i consigli. Buona giornata a tutti.

Bruno

Con l’aiuto di un amico sono riuscito ad aggiungere il controllo della velocità.

Lo stepper, tuttavia, con il carrello messo in verticale, non riusciva a tirare su il tutto, quindi ho dovuto sostituire la puleggia sullo stepper (originale 40T GT2) con una 20T GT2 (lasciando quella di rinvio a 40T GT2).
A livello meccanico lo stepper ha recuperato subito la potenza necessaria ma, per come era impostato lo sketch faceva solo la metà del percorso (giustamente).

Ho quindi sostituito "void movestepper(int z); " con “long calculatedmove=(z*40L);”, secondo un esempio postato qui sul forum (se non sbaglio da Guglielmo) e tutto è tornato a posto.

Usando questo slider nel mio studio di registrazione, per poi comporre i video, ho inserito anche una serie di lampeggi con due led in modo da avere il tempo di prendere posizione.

Lascio il codice in allegato, in caso servisse a qualcun’altro:

arduino slider.txt (11 KB)

zerosound: per come era impostato lo sketch faceva solo la metà del percorso (giustamente). Ho quindi sostituito "void movestepper(int z); " con "long calculatedmove=(z*40L);", secondo un esempio postato qui sul forum (se non sbaglio da Guglielmo) e tutto è tornato a posto.

Ok, non ho la minima idea del perchè il sostituire una funzione con una variabile faccia tornare corretto un calcolo che richiedeva giusto un x2. :grin: Comunque complimenti per aver postato il risultato e il codice, pochi si prendono la briga di farlo!

Ciao, intendi dire che avrei potuto moltiplicare (((z*1600)/80)*2)?.....la butto li perchè sono agli inizi...

Grazie; mi sembrava giusto pubblicarlo. Magari può servire a qualcuno che non è esperto come me.

Ho inserito un fine corsa e modificato lo sketch (in allegato).
Chiedo agli esperti se possono controllare se lo sketch che stò modificando (in questo momento non ho l’hardware con me e non posso testarlo) è scritto correttamente.

Arduino compila correttamente e non da nessun errore ma viste le mie conoscenze (e comunque potrei aver scritto fesserie che comunque non funzionerebbero all’atto pratico) non sono affatto sicuro di aver fatto la cosa giusta.
Ho definito due finecorsa ma per ora ne ho inserito solo uno, attivo, nello sketch.

Non voglio la soluzione, solo eventuali indicazioni in caso di errori, qualcosa che possa indirizzarmi a capire.
Vorrei riuscirci da solo (stò leggendo molte cose).

Grazie e buona giornata.

Bruno

modifica aggiunta limit01.txt (6.42 KB)