controllo motore passo passo

Salve a tutti, sono nuovo del forum e da poco mi sono avvicinato al mondo arduino. Dovrei realizzare un progetto per il controllo di un motore passo passo, lo scopo finale è quello di imporre un angolo di rotazione e far girare l'albero.
Il motore è un Nema 17 e il driver utilizzato è il ST-M5045.
Non ho familiarità con la libreria AccelStepper. Chi la conosce, sa se vi è qualche funzione per far girare il mio motore di un numero di gradi specifico.
Grazie

Ti invitiamo a presentarti (dicci quali conoscenze hai di elettronica e di programmazione) qui: Presentazioni
e a leggere il regolamento se non lo hai già fatto: Regolamento
Qui una serie di link utili, non inerenti al tuo problema:

Dopo esserti presentato dacci piú informazioni.
Dire "Nema 17" é come dire "Automobile bianca" non dice niente sui dati tecnici del motore ma definisce solo la misura della flange di montaggio e in grandissime linee la potenza del motore.
Che settaggio hai fatto sul ST-M5045?

Ciao Uwe

Grazie della risposta.
Il driver St-M5045 è settato a 3200 pulsazioni microstep 16 (posso anche cambiarla).
L'obiettivo finale è utilizzare un Nema 34 (http://www.robot-italy.com/it/3336-86sth156-nema-34-bipolar-gearless-large-stepper.html), ma per adesso sto provando su un nema 17 acquistato su amazon (https://www.amazon.it/WINOMO-NEMA-stampante-motore-passo-passo/dp/B0186T39NG/ref=sr_1_1?ie=UTF8&qid=1481885126&sr=8-1&keywords=nema+17+winomo).

Vorrei scrivere un programma che, inseguito alla ricezione di alcuni parametri quali l'angolo e la velocità di "sterzata", effettui il movimento, dopodiche resti in attesa dell'immissione dei nuovi parametri.

Qui un po' di info

Una volta definita l'accelerazione e la massima velocità puoi usare la funzione mystepper.moveTo(targetPosition); dove targetPosition è la tua destinazione.

Esempio: se piloti il motore in microstep 1/16 hai appunto, su un motore da 200 step/giro, 3200 microstep per 360 gradi. Ovvero 360/3200 = 0.1125 gradi/microstep.
Per spostarti ad esempio di 90° dovrai dare come targetPosition 90/0.1125 = 800 microstep

Dopo che ti sei presentato riapro questa discussioe.
Ciao Uwe

Grazie per la risposta. In realtà la funzione che fa girare il motore ad un'angolazione e ad una velocità da me voluta l'ho già fatta e funziona bene. Il mio problema è il controllo della posizione in retroazione. In pratica, Arduino deve capire quale è la posizione effettivamente raggiunta dal motore, in modo da confrontarla con il nuovo input (angolazione).
C'è un modo per saperlo o è necessario un decoder e quindi anche un driver adatto per un decoder?
Grazie

Il controllo della posizione lo fai con un encoder, però sei sicuro che ti serva? La posizione raggiunta dal motore è quella che imposti tu da codice a meno di perdita di passi, cosa però che non dovrebbe avvenire se tutto è dimensionato correttamente.

Parlo per esperienza diretta, ho una stampante 3d (commerciale) senza nessun controllo di posizione sui motori. Mai avuto problemi di perdita di passi.

Dato che in teoria, il "peso" da collegare al motore è abbastanza corposo, mi servirebbe avere il controllo dei passi. E' possibile utilizzare un encoder su un motore che non lo contiene al proprio interno?

Si, con un giunto elastico tipo questo.

Che cosa devi realizzare?

Aggiungo anche che la scelta dell'encoder deve essere ovviamente ponderata in base ai passi/giro che devi contare. Se lo stepper avanza di 3200 p/giro (stepper 200 passi pilotato a 1/16) non è il massimo usare un encoder da 2400 p/giro (encoder 600 p/giro in quadratura). Perdi risoluzione

Grazie. Se utilizzassi un giunto elastico, il feedback della posizione verrebbe inviato direttamente ad arduino?
Perdonami, non riesco a capire come questo giunto possa inviarmi un feedback.

Nono, il giunto elastico serve per trasmettere il moto dell'albero dello stepper all'albero dell'encoder. Viene definito elastico perchè permette di assorbire i disallineamenti che inevitabilmente si creano tra i due alberi che devono essere posti sullo stesso asse.

La rotazione la leggi dall'encoder :slight_smile:

Quindi l'encoder è collegato ad arduino?

Ed il giunto e l'encoder come sono collegati? E lo stesso giunto come è collegato al mio motore?

scusami.... è la prima volta che mi trovo a fare una cosa del genere

Quindi l'encoder è collegato ad arduino?

Si, cerca info sull'utilizzo degli encoder :slight_smile:

Il giunto va inserito da una parte sull'albero dello stepper, dall'altra parte sull'albero dell'encoder. Ci sono poi piccole viti, dette "grani", che permettono di stringere il giunto sugli alberi in modo da creare una rotazione solidale dei 3 elementi: albero stepper, giunto, albero encoder.

Non riesco a trovare un'immagine, si capirebbe al volo come devi fare

Un motore passo passo non perde singoli passi ma una volta superata la coppia massima lui si pianta e non va piú avanti.
Devi dimensionare il motore in modo che questo non accada.
Gli encoder rotativi per motore sono costosi ( un pezzo sopra i 100€) vedrei meglio usare un semplice potenziometro multigiri (hanno 10 giri) e controllare con un entrata analogica in modo grossolano se il motore si muove o é piantato.
Ciao Uwe

uwefed:
Un motore passo passo non perde singoli passi ma una volta superata la coppia massima lui si pianta e non va piú avanti.
Devi dimensionare il motore in modo che questo non accada.
Gli encoder rotativi per motore sono costosi ( un pezzo sopra i 100€) vedrei meglio usare un semplice potenziometro multigiri (hanno 10 giri) e controllare con un entrata analogica in modo grossolano se il motore si muove o é piantato.
Ciao Uwe

Che intendi per dimensionare il motore?
Il nema 34 che comprerò ha una coppia molto più grande del peso che effettivamente gli sarà collegato, quindi in teoria non dovrebbe perdere passi.

doppiozero:
Si, cerca info sull'utilizzo degli encoder :slight_smile:

Il giunto va inserito da una parte sull'albero dello stepper, dall'altra parte sull'albero dell'encoder. Ci sono poi piccole viti, dette "grani", che permettono di stringere il giunto sugli alberi in modo da creare una rotazione solidale dei 3 elementi: albero stepper, giunto, albero encoder.

Non riesco a trovare un'immagine, si capirebbe al volo come devi fare

Con l'encoder che mi hai consigliato, è possibile anche indicare uno "0 assoluto", ossia una posizione di partenza in cui il motore deve essere portato ad ogni startup?
Quello che devo realizzare è tipo un sistema di sterzo, quindi ogni volta che viene fornita corrente ad arduino lo "sterzo" deve portarsi in una posizione iniziale che per me sarebbe 0°.

Il nema 34 che comprerò ha una coppia molto più grande del peso che effettivamente gli sarà collegato

attenzione, coppia e peso sono due cose diverse. La coppia è una forza (peso) moltiplicata per una distanza (braccio). La si ricava dall'analisi (statica) del sistema meccanico.

è possibile anche indicare uno "0 assoluto", ossia una posizione di partenza in cui il motore deve essere portato ad ogni startup?

l'encoder che ti ho linkato non è assoluto, ossia con quello puoi sapere solo se ti sposti a dx o sx e di quanto. Per sapere quando arrivi a zero devi sommare o sottrarre sempre tutti gli spostamenti che fai e in caso di spegnimento salvare la posizione sulla eeprom. Ovviamente al minimo spostamento a "macchina spenta" perdi l'azzeramento. Una soluzione può essere, come sulla mia stampante 3d, posizionare dei microswitch a finecorsa in modo da avere su arduino un segnale che ti dica "ok, sei arrivato in questa posizione, ora sai dove ti trovi"

"nema 34" è la dimensione meccanica della flangia del motore e specifica solo in grande linee la potenza o coppia del motore e per niente le caratteristiche elettriche.

Ciao Uwe

doppiozero:
attenzione, coppia e peso sono due cose diverse. La coppia è una forza (peso) moltiplicata per una distanza (braccio). La si ricava dall'analisi (statica) del sistema meccanico.
l'encoder che ti ho linkato non è assoluto, ossia con quello puoi sapere solo se ti sposti a dx o sx e di quanto. Per sapere quando arrivi a zero devi sommare o sottrarre sempre tutti gli spostamenti che fai e in caso di spegnimento salvare la posizione sulla eeprom. Ovviamente al minimo spostamento a "macchina spenta" perdi l'azzeramento. Una soluzione può essere, come sulla mia stampante 3d, posizionare dei microswitch a finecorsa in modo da avere su arduino un segnale che ti dica "ok, sei arrivato in questa posizione, ora sai dove ti trovi"

Mi sono espresso male, volevo dire che il motore possiede una coppia molto grande, ed il carico che dovrà "pilotare" richiederebbe, invece, una coppia molto più bassa, quindi non vedo perchè il motore dovrebbe perdere i passi.
Il punto è che essendo un progettino di controlli, è molto probabile che la professoressa mi richieda di chiudere l'anello e quindi portare un feedback ad arduino.

Per questo motivo vorrei capire se esiste una sorta di encoder che mi dia lo 0 assoluto, e quindi ogni volta che viene riattaccata la corrente il motore si porti in una posizione di 0 gradi. grazie