Ciao a tutti,
mi sono spostato di qui e ringrazio i "ragazzi" di li (sezione hardware) per l'aiuto ad un problema che pensavo di aver risolto ma causa poca memoria devo rivedere l'approccio...
in breve:
Arduino nano
DRV8825
Stepper 17 da 400 step
un asse con passo 1.0mm/giro
tramite "selezione" posso avere una di queste velocità:
if (Manual == 1) { MSpeed = 15000;}
if (Manual == 2) { MSpeed = 8000; }
if (Manual == 3) { MSpeed = 6000; }
if (Manual == 4) { MSpeed = 5000; }
if (Manual == 5) { MSpeed = 4000; }
if (Manual == 6) { MSpeed = 2000; }
if (Manual == 7) { MSpeed = 1000; }
if (Manual == 8) { MSpeed = 800; }
if (Manual == 9) { MSpeed = 600; }
if (Manual == 10) {MSpeed = 250; }
quanto premo e tengo premuto un pulsante il motore gira ad una velocità definita da "selezione"
come lo rilascio si ferma...:
while (digitalRead(forwardButton) == HIGH && digitalRead(limitSwitches) == HIGH)
{
int i;
digitalWrite(dir, HIGH); // comando avanzamento slitta
{
digitalWrite(doStep, LOW);
digitalWrite(doStep, HIGH);
delayMicroseconds(MSpeed);
}
}
ora il mio intento (gentilmente con il vostro aiuto dato che io non ci riesco) sarebbe di mettere una rampa di accelerazione e decelerazione tramite una sola variabile a cui posso cambiare la rampa...
in breve un valore che va da 1 a 10 dove 1 è rampa dolce e 10 rampa brusca
non serve nulla di estremamente preciso e a prova di calcoli basta solo che funzioni
Tra lo step low e high dovresti mettere un delay, fai valere MSpeed la metà così hai la stessa velocità.
Per l'accelerazione usi una variabile (acc) in cui parti da un numero alto (tipo 5000) e fai delayMicroseconds(MSpeed + acc);
nel ciclo while inserisci un if(acc >1) acc -= x; dove per x metti un numero che sarà poi quanto velocemente dovrà accelerare, un numero basso accelera piano, un numero alto accelera velocemente. Non è il massimo come sistema di accelerazione ma sicuramente il più semplice da implementare
Per le decellerazione è un po' più complicato in quanto dovrebbe avvenire dopo il rilascio del pulsante e quindi essere molto breve se vuoi un discreta precisione sulla posizione raggiunta, molto lunga se non ti interessa proprio dove va a fermarsi il motore decellerando o nulla se quando viene rilasciato il pulsante il motore si deve fermare di colpo.
alla fine ho intrapreso una strada leggermente diversa dalla tua basata sulle mie modeste conoscenze...
quello che mi piace è che se rilascio il pulsante prima di avvento raggiungimento velocità massima il sistema decelera di pari passo con l'accelerazione...
quello che non mi piace è che il codice è sia brutto da vedere che penso "sprechi" memoria inutilmente ma non saprei come migliorarlo...
se qualche anima pia ha voglia potrebbe tornare utile (spero) anche ad altri
comunque grazie mille per l'aiuto
Roberto
int MSpeed = 500; //Vel MAX
int MSpeed0 = 10000; //Vel MIN
int Acc = 80; //Accelerazione
int ff = MSpeed0;
int fff = MSpeed ;
int CostAcc = 0;
int x = 0;
int AA = 0;
#define forwardButton A2
#define backButton A3
#define dirpinPin 2
#define stepPin 3
void setup() {
// Serial.begin(115200);
}
void loop()
{
CostAcc = (MSpeed0 - MSpeed) / Acc;
int a = 1;
fff = MSpeed ;
while (digitalRead(forwardButton) == HIGH )
{
digitalWrite(dirpinPin, HIGH);
if ( a <= (Acc)) //Accellerazione
{
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, LOW);
delayMicroseconds(ff);
// Serial.print(a); Serial.print(" MSpeed >> "); Serial.print(ff);
// Serial.println("");
ff = (ff - CostAcc) ;
AA = 1;
}
if ( a > (Acc)) //Veloctià costante
{
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, LOW);
delayMicroseconds(MSpeed);
// Serial.print(a); Serial.print(" MSpeed == "); Serial.print(MSpeed);
// Serial.println("");
AA = 2;
}
a = a + 1;
}
if (AA == 1 ) //Decelerazione "breve"
{
AA = 0;
x = a - 1;
// Serial.print("Conteggio Accellerazione "); Serial.println(x);
if (x < (Acc))
for (int i = 1; i <= (x); i++)
{
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, LOW);
ff = (ff + CostAcc) ;
delayMicroseconds(ff);
// Serial.print(i); Serial.print(" MSpeed << "); Serial.print(ff);
// Serial.println("");
}
// Serial.println("");
}
if (AA == 2 ) //Decelerazione "completa"
{
AA = 0;
for (int i = 1; i <= (Acc); i++)
{
digitalWrite(stepPin, HIGH);
digitalWrite(stepPin, LOW);
fff = (fff + CostAcc) ;
delayMicroseconds(fff);
// Serial.print(i); Serial.print(" MSpeed <<<< "); Serial.print(fff);
// Serial.println("");
}
Serial.println("");
// Serial.print(" MSpeed0 <<<< "); Serial.print(MSpeed0); Serial.println("");
// Serial.print(" ff <<<< "); Serial.print(ff); Serial.println("");
ff = MSpeed0;
// Serial.print(" ff <<<< "); Serial.print(ff); Serial.println("");
}
}
Ma questa libreria l'hai già vista? https://www.airspayce.com/mikem/arduino/AccelStepper/
Mi sembra di capire che tu usi un driver a singolo impulso (un EasyDriver o simile) invece di pilotare direttamente le fasi per cui non so se questa libreria funziona ma potrebbe essere utile per calcolare accelerazioni e decelerazioni.