Go Down

Topic: codice avanzamento progressivo stepper (Read 456 times) previous topic - next topic

torn24

#15
Oct 21, 2019, 03:45 pm Last Edit: Oct 21, 2019, 04:08 pm by gpb01
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 :)
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

docdoc

#16
Oct 21, 2019, 04:01 pm Last Edit: Oct 21, 2019, 04:08 pm by gpb01
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 :)
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
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

gpb01

#17
Oct 21, 2019, 04:09 pm Last Edit: Oct 21, 2019, 04:10 pm by gpb01
Cortesemente restiamo sulle questioni "puramente tecniche" e lasciamo da parte qualsiasi eventuale giudizio sul modo di porsi delle persone. Grazie   :)

Guglielmo
Search is Your friend ... or I am Your enemy !

1oniudra2

Si certo la sequenza riprende il valore calcolato  quindi se x=1
x=2*x = 2 ora la sequenza prende il valore 2 quindi 2*2=4 4*2=8 8*2=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.

gpb01

#19
Oct 22, 2019, 11:56 am Last Edit: Oct 22, 2019, 11:56 am by gpb01
Se scrivi così come riporti:

Code: [Select]
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 ;)

Guglielmo
Search is Your friend ... or I am Your enemy !

1oniudra2

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.
Code: [Select]


 #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.

Code: [Select]


#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.

gpb01

#21
Oct 22, 2019, 12:45 pm Last Edit: Oct 22, 2019, 12:47 pm by gpb01
Quello che scrivi nel tuo while(), con il for() si scrive:

Code: [Select]
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
Search is Your friend ... or I am Your enemy !

docdoc

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:
Code: [Select]
#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:
Quote
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() :

Code: [Select]

  for(int val=500; val < 50000; val +=500)
  {
    myStepper.step(val);
    delay(1000);
  }
Alex "docdoc" - ** se ti sono stato d'aiuto, un punto karma sarà gradito, clicca su "add" qui a sinistra, vicino al mio nome ;) **

AmericanDreamer

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

gpb01

#24
Oct 22, 2019, 04:22 pm Last Edit: Oct 22, 2019, 04:24 pm by gpb01
... 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 ... ::)
Search is Your friend ... or I am Your enemy !

AmericanDreamer

#25
Oct 22, 2019, 04:29 pm Last Edit: Oct 22, 2019, 04:34 pm by AmericanDreamer
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

gpb01

#26
Oct 22, 2019, 04:33 pm Last Edit: Oct 22, 2019, 04:34 pm by gpb01
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 :().

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
Search is Your friend ... or I am Your enemy !

AmericanDreamer

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
Code: [Select]
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

AmericanDreamer

#28
Oct 22, 2019, 05:18 pm Last Edit: Oct 22, 2019, 05:19 pm by AmericanDreamer
ecco
così magari funziona
Code: [Select]

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

torn24

#29
Oct 23, 2019, 06:35 am Last Edit: Oct 23, 2019, 08:06 am by torn24
Quote
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! :)

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 :) .

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

Go Up