Motori Stepper con EasyDriver v4.4

Ciao a tutti, sto costruendo un robot che utlizza 4 motori stepper (Wantai Nema 17 Stepper Motor 42BYGHW609), ognuno collegato ad un driver (Easydriver v4,4).
E' collegato ad una batteria da 12 V che rilascia all incirca 7 Ah.
Su internet ho trovato un infinità di sketch, ma quello che cerco io è un codice che faccia partire i motori piano piano per poi andare veloce e rimanere tale finche non gli dico di fermarsi.
Ho studiato la libreria AccelStepper molto accuratamente ma nonsotante i miei molteplici esperimenti riesco a farlo partire subito veloce e io voglio che prima parta piano per poi accelleraare.
Qualcuno mi può aiutare?
Grazie infinite :slight_smile: :slight_smile:
motori

Driver

ELKri:
Ho studiato la libreria AccelStepper molto accuratamente ma nonsotante i miei molteplici esperimenti riesco a farlo partire subito veloce e io voglio che prima parta piano per poi accelleraare.

Premesso che al AccelStepper non è molto efficiente come controllo degli stepper motori, è dipendente dal ciclo loop e non riesce a raggiungere elevate velocità di stepping, già con 1000 step al secondo va in crisi, però fa esattamente quello che chiedi, ovvero fa girare uno stepper per tot passi con la desiderata accelerazione e velocità.
Se non ottieni quello che speri o stai sbagliando nell'uso della libreria oppure gli chiedi troppo, posta lo sketch che stai usando.

Questo è il codice delle ruote anteriori, non metto quelle posteriori perchè è uguale :slight_smile: ...c'è in mezzo anche il bluetooth...

#include <AccelStepper.h>
#include <SoftwareSerial.h>
#include <Wire.h>

int rx = 3;
int tx = 2;
int y;

int button=13;
int stato;
byte x;

SoftwareSerial bluetooth(rx, tx);

AccelStepper stepperAnteriore2(AccelStepper::DRIVER, 11, 12);
AccelStepper stepperAnteriore1(AccelStepper::DRIVER, 5, 4);

int spdA1 = 0;
int spdA2 = 0;

int signA2 = 1;
int signA1 = -1;

void setup()
{  
  Serial.begin(9600);
  bluetooth.begin(9600);
  stepperAnteriore1.setAcceleration(2000.0);
  stepperAnteriore2.setAcceleration(2000.0);
  stepperAnteriore1.setMaxSpeed(4000);
  stepperAnteriore2.setMaxSpeed(4000);
  stepperAnteriore1.setSpeed(0);
  stepperAnteriore2.setSpeed(0);
    
 
 /* Wire.begin(8);
  Wire.onReceive(receiveEvent);
  pinMode(button, INPUT);*/
}

void loop()
{  

 /* stato = digitalRead(button);
  if (stato == 1) { 
  x=1;
  } 
  else if (stato==0) { 
    x = 0;
  }

 if (y == 1) { sign = 0; }
 else { */
   
  char c;
  while(bluetooth.available()) {
    c = bluetooth.read();
    /*if (c == 'K') {  // Avanti
      
      stepperAnteriore1.setAcceleration(200.0);
      stepperAnteriore2.setAcceleration(200.0);  
      signA = 1;
      stepperAnteriore1.moveTo(10000);
      stepperAnteriore2.moveTo(10000);
      stepperAnteriore1.run();
      stepperAnteriore2.run();    
      
    }*/
    if (c == '4') {  // Andatura normale
      delay(500);

      signA2 = 1;      
      signA1 = -1;
       for (int spd = 0; spd <1000; spd++) {
            spdA1 = spd;
            spdA2 = spd;
            stepperAnteriore1.setSpeed(signA2 * spdA1);
            stepperAnteriore2.setSpeed(signA1 * spdA2);
          }
      /*spdA1 = 500;
      spdA2 = 500;

      Speed(signA1, signA2);*/
    }
    
    if (c == 'r') {
      stepperAnteriore1.setAcceleration(100.0);
      stepperAnteriore2.setAcceleration(100.0);  // Indietro+
      delay(1000);
      signA2 = -1;
      signA1 = 1;
      Speed(signA1, signA2);
      
    }
    if (c == 's' || y == 1) {  // Stop
      signA1 = 0;
      signA2 = 0;      
      Speed(signA1, signA2);
      
    }
    if (c == '1') {  // Rallenta
      delay(1000);
      if (spdA1 >=1000) { spdA1 = 500;} else { spdA1 += 100; }
      if (spdA2 >=1000 ) { spdA2 = 500;} else { spdA2 += 100; }
     
      Speed(signA1, signA2);   
    }

    if (c == '2') {  // Curva a destra 

      spdA1 = 250;
      spdA2 = 1000;

      Speed(signA1, signA2);
    }
    if (c == '3') {  // Curva a sinistra
 
      spdA1 = 1000;
      spdA2 = 250;

      Speed(signA1, signA2);
    }

      if (c == 'K') {  // Curva a sinistra
        
          spdA1 += 5;
          spdA2 += 5;
      
          Speed(signA1, signA2);
          stepperAnteriore1.runSpeed();
  stepperAnteriore2.runSpeed();
        }

  }
  stepperAnteriore1.runSpeed();
  stepperAnteriore2.runSpeed();

 /* Wire.beginTransmission(2); // transmit to device #8
  Wire.write(x);              // sends one byte
  Wire.endTransmission();    // stop transmitting
 }*/
}

void Speed (int signA1, int signA2){
    
    stepperAnteriore1.setSpeed(signA2 * spdA1);
    stepperAnteriore2.setSpeed(signA1 * spdA2);
}
/*void receiveEvent(int howMany) {
  while (1 < Wire.available()) { // loop through all but the last
    char c = Wire.read(); // receive byte as a character
    Serial.print(c);         // print the character
  }
  y = Wire.read(); 
}*/

GRAZIE DI TUTTO

La runSpeed() non usa l'accelerazione, devi usare i comandi per il movimento ad una determinata posizione quali runToPosition() oppure runToNewPosition(long position), nel caso di un robot sono ottimali in quanto ti consentono di implementare la base per la navigazione verso coordinate vettoriali.

Quindi che codice mi consigli di usare? Io voglio che il mio robot dopo che gli hai mandato il segnale continui ad andare.
Il comando runToPosition() sposta le ruote a x posizione, ma io non voglio che si fermi, io voglio che continui fino a che non gli ordino un nuovo comando.
Lo sketch per farlo andare ce l ho, il problema è che parte subito alla massima velocità invece che gradualmente.

I casi sono due, o stai realizzando un robot oppure una macchinina radiocomandata :slight_smile:
La differenza tra le due è che un robot è una macchina totalmente autonoma, non è richiesto l'intervento umano, nel caso del robot è di vitale importanza pianificare i percorsi e come tale avere qualcosa che gestisce automaticamente la distanza da percorrere, con relativi profili trapezoidali di movimento, è una grande comodità.

In sostanza sto creando un macchina telecomandata

Nessun consiglio?

Nel tuo caso non puoi usare la accelstepper perché non è compatibile col funzionamento che chiedi.

Puoi chiarire meglio? :o :fearful:

C'è poco da chiarire, se non usi il comando con la posizione non hai la gestione dell'accelerazione.

Grazie mille, vedrai che in qualche modo risolverò :slight_smile: :slight_smile: