codice avanzamento progressivo stepper

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

Salve

Quando scrivo in genere riporto con un copia e incolla e spesso capita che pezzi di codice magari non vengono trascritti e aggiungendo pure errori di distrazione la confusione che creo e' tanta. E di questo me ne scuso.
Cerco di stare piu' attento e riportare il codice completo.

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

Ho provato in tutti i modi anche fuori logica come portare il delay fuori non mettere le graffe ecc.
Niente da fare non funziona.
Evidentemente sfugge qualche cosa ma non so cosa.

Ho bypassato il problema utilizzando il ciclo while prendendomi la liberta' di stoppare ad un certo punto.

#include <Stepper.h>
 
 
const int steps = 200;
int a=0; 
int val=500; 
Stepper myStepper(steps, 5,4);
void setup()
{
 pinMode(4,OUTPUT);
 pinMode(5,OUTPUT);
 myStepper.setSpeed(500); 
}


void loop() 
{
  if(a==0)
    
     while(val<100000) 
     {
      myStepper.step(val);
      val=val+500;
      delay(1000);
      if(val==50000) break;
      a=1;
    }
}

E questo funziona e allora perche' il ciclo for non lo fa?
Grazie.

Quello che scrivi nel tuo while(), con il for() si scrive:

for (val = 500; val < 100000; val+=500)
{
   myStepper.step(val);
   delay(1000);
   if (val == 50000) break;
   a=1;
}

comunque NON capisco quel break a 5000 ... non facevi prima a mettere come limite superiore <= 5000 ?

Non solo, così quel a=1; verrà eseguita (inutilmente) migliaia di volte :o

Guglielmo

Ok, andiamo per gradi.

Intanto ti prego, cerca di indentare correttamente, è una cosa che se ti abitui a farlo sempre, aiuterà te quando farai programmi più complessi, ma anche noi a leggere più facilmente il tuo codice.

Sono poche e semplici regole, metti DUE spazi ad ogni indentazione, allinea le graffe tra apertura e chiusura, ed evita di aggiungere tante inutili righe vuote. Tra l'altro l'IDE ti può aiutare, almeno all'inizio, perché se premi Ctrl-T te lo fa lui (ma abituati a scrivere direttamente tu).

Il tuo primo codice ad esempio diventa:

#include <Stepper.h>

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

Detto questo, noterai che se metti un delay di 1 secondo dentro al loop significa che prima fa solo 1 step (ossia un duecentesimo di giro, si e no 2 gradi) e poi aspetta 1 secondo, poi ne fa 2 (siamo sui 2 gradi e mezzo) ed un altro secondo, poi 4, poi 8, eccetera, insomma per avere un qualche movimento abbastanza visibile devi aspettare almeno 5 o 6 secondi!...

Poi con QUESTO codice tu dici "Niente da fare non funziona": beh dato che "qualcosa" lo fa (e quindi "funziona", anche se si tratta di movimenti mooolto lenti, non si tratta del problema iniziale che lamentavi), magari invece di dire solo "non funziona" è meglio se dici cosa fa, e cosa di diverso vorresti che faccia...

Nel secondo codice invece dici:

Ho bypassato il problema utilizzando il ciclo while prendendomi la liberta' di stoppare ad un certo punto.

Non è che hai "bypassato il problema", quel codice fa una cosa diversa (anzi due).

Primo, hai messo una variabile per smettere di muovere il servo dopo aver concluso il ciclo (mentre prima ricominciava ad ogni loop).

Secondo, il valore sello step parte da 500 per arrivare a 50.000 con passi da 500 (mentre prima andava con valori pari a potenze di 2 fino a superare 1.000)

Inoltre ci sono anche varie altre cosette poco logiche, ad esempio imposti a=1 all'interno del while e non alla fine, metti la if() con break a 50.000 quando la while() l'hai impostata a 100.000, e se una cosa vuoi farla eseguire solo una volta fai prima a metterla nel setup() invece che nel loop() dove sei costretto poi ad usare un flag...

In sostanza quel tuo codice abbastanza "originale" diciamo, corrisponde semplicemente a mettere questo nel setup() :

  for(int val=500; val < 50000; val +=500)
  {
    myStepper.step(val);
    delay(1000);
  }

ho letto con interesse, visto che ho ordinato uno stepper, che deve ancora arrivare
la libreria accellstepper non è di serie con arduino, giusto?
la devo scaricare dal loro sito airaspace->qualcosa
ma per muovere il motore a me mi sembra che il comando sia oggetto.run()
perchè oggetto.move() è non bloccante mentre runtoposition() è bloccante
non ci ho capito uno Jota
quel sito è illeggibile per me

AmericanDreamer:
... la libreria accellstepper non è di serie con arduino, giusto?
la devo scaricare dal loro sito airaspace->qualcosa ...

NO, NO e poi NO, lo volete capire che per NON avere problemi le librerie si scaricano dal "Library Manager" del IDE di Arduino che:

  1. vi scarica sicuramente la versione più aggiornata compatibile con l'IDE
  2. ve la mette nella giusta cartella

Apri il "Library Manager" (Sketch -> Include Library -> Library Manager), nello spazio per la ricerca, sulla destra, scrivi "AccelS" (bastano poche lettere) e ... la libreria appare tra quelle installabili.

Guglielmo

P.S.: ... e se una libreria NON la trovate nel "Library Manager" non è un bel segno, o è obsoleta, o scarsamente manutenuta e l'autore non si è preoccupato di farla includere nell'elenco ... ::slight_smile:

scusami, ancora inesperto, basta che leggi la mia ultima domanda e capisci
ma sempre come dico io mi sembra, è run() che muove non moveto()
però adesso è anche peggio, perchè sul sito almeno qualcoa da leggere c'è, da ide solo esempi si trovano, o sbaglio?
ùuna descrizione dei comandi non la trovo

ma poi comunque a parziale discolpa magari stamattina non andava mica il librarimanager
è tutto il giorno che ho qualche problema col sito di arduino

Un conto è scaricara la libreria (e devi fare come ti ho detto), un conto è avere della documentazione (... e ringrazia l'autore di quella libreria perché, di norma, nessuno scrive neanche una riga di documentazione :frowning:).

La documentazione è QUI e, i vari TAB in alto ti portano in vari tipi di documenazione ... le classi con i loro membri, i files e gli esempi ... direi molto ben fatta!

Guglielmo

libreria scaricata giusta o sbagliata che sia sempre la stessa documentazione è
è però nessuno la ha letta, perchè se la si fosse letta si sarebbe capito perchè il programma non va

void loop(){
  if (primomotore.distanceToGo() == 0)
// che significa se il motore non è ancora arrivato in posizione

    for ( int x = 1; x < 10; x++){
      primomotore.move(1500 * x);
// che dice la nuova posizione da raggiungere sarà 1500 per x      
      delay(100);
// aspetta un decimo di secondo
    }
// fine del for, ovvero calcola le altre otto nuove posizioni, e otto attese

  primomotore.run();
//adesso arrivaci, una volta sola, vale solo l'ultima posizione calcolata
// poi sccome x è re-inizializzata ad ogni loop, l'ultima posizione calcolata sarà sampre la stessa per ogni esecuzione di loop
// il motore si muove una volta sola di 9 passi assieme e poi basta
}

e adesso non ditemi in 8 che lo avevate già capito, perchè non mi piace subire lo stesso scherzo due volte
anchesì mi fa un male boia il piede, e mi incazzerei sul serio

ecco
così magari funziona

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

naturalmete x va dichiarata globale e inizializzata a 0

e adesso non ditemi in 8 che lo avevate già capito, perchè non mi piace subire lo stesso scherzo due volte

Be non conoscendo l'inglese mi devo affidare a un traduttore per capire la documentazione, ma la tua spiegazione sui metodi è più semplice e facile da capire, Grazie! :slight_smile:

Però noto che sbagli atteggiamento, prendi tutto come una gara a chi sia più bravo, come fosse una partita a scacchi, come se qualcuno dovesse riconoscere che sei bravo, probabilmente e il tuo carattere però...
Non era questa la filosofia di arduino, devi pensare al forum arduino e alla sua comunità come persone che vogliono condividere, pensa a chi sviluppa librerie complesse senza nessun compenso e le rende pubbliche,pensa ad esempio a la libreria di questo thread, tu hai capito come funziona ma c'è chi la scritta senza prendersi neanche un bravo :slight_smile: .

Anche io voglio riuscire a trovare la soluzione "un po tutti" :slight_smile: ma se riesco e l'utente la usa ho già ottenuto una vittoria personale :wink:

Quale spiegazione?
Ho scritto solo 2 righe di commento
Quelle?

Comunque non voglio essere il più bravo, so di non esserlo, e nemmeno sentirmi dire bravo (che comunque fa sempre piacere a tutti, a proposito grazie per il karma)

Volevo solo dire che non si ripetesse la storia di quella volta della stringa da accorciare, che mi era sembrata un po' patetica

Tanto di cappello comunque a chi ha scritto quella libreria, e pure la documentazione, dopo aver capito il giro del fumo, è leggibile

'Scolta a me, non affidarsi a traduttori strani , impara almeno un minimo di inglese, non è poi così difficile

Già adesso noi italiani parliamo una delle lingue più difficili in assoluto, scoprirai che l'inglese è più semplice

Non sono io l'autore del thread e della richiesta, quindi la tua risposta a me non serve :slight_smile: ma non sapendo lo scopo dei metodi move() e run() non potevo leggere il codice, se ne sai il significato arrivi alla stessa conclusione. Come mia risposta, per altro corretta, è che l'autore sospettava problemi con la scheda, e io ho risposto che è improbabile, ma da cercare errori nel programma o altro.

Salve

Vorrei ringraziare @AmericanDreamer perche' il codice postato rispecchia fedelmente la progressivita' desiderata.
E il moderatore per le utili informazioni su come scaricare al meglio la libreria accelstepper.

Sarebbe interessante che chi conosce bene questa libreria ne spiegasse i fondamenti in modo da aiutare piu' proficuamente chi e' ancora indietro. Anche se la documentazione non manca ritengo che chi ne e' padrone possa
essere molto piu' sintetico e mirato della documentazione stessa.