codice avanzamento progressivo stepper

Salve

I mio intento e’ quello di far avanzare progressivamente la rotazione di uno stepper ogni 100 millisecondi di una quantita’ come riportato.

#include<AccelStepper.h>


 

AccelStepper primomotore(AccelStepper::FULL2WIRE, 2, 5);       

void setup()
{
primomotore.setSpeed(10000);
primomotore.setAcceleration(5000);
primomotore.setMaxSpeed(20000); 
primomotore.move(-15000);
}

void loop()
{
if (primomotore.distanceToGo()==0)
 
 
  for( int x=1;x<10;x++)
  {   
primomotore.move(1500*x);
 delay(100);
  } 
 
primomotore.run();
}

Ho dei dubbi pero’…

Grazie

Quali dubbi?

Salve

Ho provato a farlo funzionare e ho notato che il primo movimento rispecchia quanto e' riportato nel setup ma poi
lo spostamento intervallato di 100 millisecondi e' sempre lo stesso cioe' di 1500.Per vederlo meglio ho provato a mettere 150*x che pero' ha confermato la non progressivita'.
Se ritieni che il codice sia corretto potrebbe essere un problema di scheda,di driver...non so...

Se qualcuno mi conferma che il codice riportato rispecchia le intenzioni di progressivita' nei giri lo ringrazio.
Questo per non acquistare in maniera ingiustificata una nuova scheda arduino.

Un opinione e come tale potrei sbagliarmi...
Per mio parere è difficile questo "problema" sia un problema della scheda arduino. Il processore esegue un programma ma non può dipendere dal processore risultati non previsti. Quindi non so se il problema sia la libreria il programma o altro, ma personalmente non penserei sia un problema di arduino.

A cosa serve quella riga nel loop

if (primomotore.distanceToGo()==0)

????

Io l'ho interpretata cosi':Il motore comincia a girare secondo l'istruzione scritta nel setup. Se il primomotore si trova ad una distanza 0 dall'arrivo e cioe' percorre quanto e' indicato nel setup
allora esegui il codice sotto scritto.Se al posto dello 0 mettessimo un valore K allora l'interpretazione suonerebbe: se il primomotore si trova ad una distanza k dall'arrivo esegui il codice sotto scritto.

Rimane pero' il dubbio sul codice completo scritto che in effetti e' semplice ma non funziona.Mi chiedevo il perche' nella speranza come scrive@ torn 4 che non sia la scheda.
In effetti io utilizzo arduino uno "compatibile"e ho notato che nella fila dei led uno rimane sempre rosso.
Non so come interpretarlo.Non e' certo un problema cambiarla se il problema fosse li'.

io non ho motori stepper, e non ho mai usato la libreria che usi tu

ma non mi sembra proprio che si usi come fai tu

ho dato uno sguardo alla documentazione e mi sembra che l'uso sia ben più "articolato"

ti conviene farlo anche a te, dare uno sguardo alla documentazione

Salve

Certo la libreria ha diverse opzioni ma al momento riesco con solo una o due funzioni della libreria a far muovere 3 stepper in maniera coordinata. Prima uno poi quando arriva a destinazione gli altri due uno dei quali rimane indietro ecc…
Per cui non penso che sia un problema di ignoranza della libreria anche se indubbiamente puo’ essere.
Per cercare di bypassare il problema sono uscito da questa libreria e ho optato per una soluzione semplice senza accelerazioni per verificare i miei dubbi.

#include <Stepper.h>
 
 
const int steps = 200;
 
 
Stepper myStepper(steps, 5,4);
 
void setup() {
 
  
 myStepper.setSpeed(2000);
 
  
}
 
void loop() 
{
 
 for(int x=1; x<1000; x=2*x)
 {
   myStepper.step(x);
  }
  
 delay(1000);
 
  
}
  

Ho ripetuto il ciclo for nella speranza di osservare degli incrementi di posizione del motore.
Interpreto cosi':
myStepper.step(1);
myStepper.step(4);
myStepper.step(6);
myStepper.step(8);
myStepper.step(10;
myStepper.step(12);
ecc.

Cioe’ la rotazione progressiva dovrebbe essere intervallata da 1 secondo.Quando arriva a 999 step dovrebbe ricominciare…
Niente da fare non lo fa.
Si sposta sempre della stessa quantita’.
Ecco allora ,mi sembra, che il problema stia proprio nella cattiva interpretazione di questo ciclo.
Suggerimenti…
Grazie.

diagnosi semplice: non sei capace di programmare in C

prognosi complessa,
se quando ti si dice di studiare rispondi che “anche se indubbiamente puo’ essere”,
non credo che la malattia sarà di pronta guarigione

C1P8:
diagnosi semplice: non sei capace di programmare in C

Ti invito a tenere questi “giudizi” per te! La prossima volta sarò meno tollerante …

Se si vede che l’utente ha delle difficoltà, al limite gli si segnala che forse ha qualche lacuna, gli si spiega dove sbaglia e magari gli si consiglia qualche buon testo da studiare.

Guglielmo

P.S.: REGOLAMENTO dal punto 16.2 al 16.4.

è esattamente quello che ho fatto:

cito:
ho dato uno sguardo alla documentazione e mi sembra che l'uso sia ben più "articolato"
che significa: hai sbagliato a usare la libreria
ovvero esattamente come dici tu: ho segnalato l'errore

cito:
ti conviene farlo anche a te, dare uno sguardo alla documentazione
che significa: vacci a guardare
ovvero, come dici tu: ho consigliato dove studiare

pero' adesso molliamo, OK?

PS ma non far sembrare che io abbia esagerato mettendo in neretto parole che in neretto non erano quando le ho scritte, grazie

Hai esagerato (e ti ho evidenziato dove) e NON sei stato di alcun aiuto all’utente …
… alla prossima risposta polemica ti becchi 7 giorni di BAN.

Guglielmo

Riporto il MP ricevuto:

C1P8:
il regolamento lo so leggere anch'io

16.2 proprio quello che mi contesti:
Dal loro canto i principianti si impegnino nello studiare almeno le basi di quanto vanno a fare (fondamenti di elettronica e basi della programmazione 'C') seguendo quanto indicato al precedente punto 16.1.

e all'ora? contesti a me?
se vuoi bannare fallo pure (per 7 giorni)
ma non sarò io a perderci
ma "prima" di bannare, pubblica questo PM, che sia chiaro perchè fai le cose

Dato che l'utente NON vuola capire e risponde in questo modo che tutti potete leggere, è stato applicato un BAN di sola lettura per un periodo di 7 giorni.

Possiamo proseguire la discussione tecnica.

Guglielmo

1oniudra2:
Cioe' la rotazione progressiva dovrebbe essere intervallata da 1 secondo.Quando arriva a 999 step dovrebbe ricominciare.. Niente da fare non lo fa.

Primo, interpreti male, perché con quel codice di fatto fai step con potenze di 2 (in quanto raddoppi sempre il precedente valore) ossia 1 2 4 8 16 32 64 128 256 512 (a 1024 esce)

myStepper.step(1);
myStepper.step(2);
myStepper.step(4);
myStepper.step(8);
myStepper.step(16);
myStepper.step(32);
myStepper.step(64);
ecc.

Secondo, hai messo il comando myStepper.step() dentro al for che viene eseguito alla masima velocità quindi quelle istruzioni le fa tutte in sequenza senza alcuna pausa (almeno per dare tempo allo stepper di ruotare degli step che gli hai detto).

Terzo, ma provare prima gli esempi della libreria, no? Ad esempio "stepper_speedControl.ino" e vedere se funziona come atteso, e quindi capire come lo fa???

Una precisazione doverosa! Un utente può conoscere i rudimenti, le basi del C ma quando si trova a che fare con una nuova libreria, mai usata prima, si ritrova con cose tutte nuove da dover imparare :slight_smile:
Personalmente non avendo mai usato questa libreria, pur ritenendo di conoscere i rudimenti del C, mi ritrovo allo stesso livello dell'autore del post.

--- eliminata frase che poteva dare adito a "flames" - gpb01

torn24:
Una precisazione doverosa! Un utente può conoscere i rudimenti, le basi del C ma quando si trova a che fare con una nuova libreria, mai usata prima, si ritrova con cose tutte nuove da dover imparare :slight_smile:

Si, vero, va sempre bene imparare, ma non è che ci si debba per forza affidare agli altri: nelle librerie sono inclusi apposta vari esempi, e c'è spesso anche la documentazione dettagliata della libreria. Io quando prendo una nuova libreria inizio dagli esempi e dalla documentazione (spesso su GitHub) e faccio qualche circuitino di prova, per capire. E solo se trovo difficoltà, chiedo.

--- eliminata parte che poteva dare adito a "flames" - gpb01

Cortesemente restiamo sulle questioni "puramente tecniche" e lasciamo da parte qualsiasi eventuale giudizio sul modo di porsi delle persone. Grazie :slight_smile:

Guglielmo

Si certo la sequenza riprende il valore calcolato quindi se x=1
x=2x = 2 ora la sequenza prende il valore 2 quindi 22=4 42=8 82=16 16*2=32 .....
Errore banale.
Per cio' che riguarda la seconda obiezione perfettamente daccordo quindi mi sembra di capire
che spostando il delay all'interno delle parentesi del for gli step calcolati si distanzino dal prossimo
di un secondo.Giusto?
Per la terza obiezione preferisco rimanere su questa questione con la speranza
di venirne fuori.
Sistemati i valori della sequenza ,messo il delay al suo posto cosa rimane da fare
perche' la progressivita'si sviluppi?
Grazie.
Ringrazio il moderatore per aver cancellato la mia risposta al sig. bannato
perche' a mente serena non l'avrei scritta.

Se scrivi così come riporti:

for(int x=1; x<1000; x=2*x)
 myStepper.step(x);

quel ciclo for termina li (al ‘;’) e il delay() che segue viene eseguito alla fine del for. Manca difatti la graffa che racchiude il blocco :wink:

Guglielmo