Modo migliore per far muovere un servo motore

Salve a tutti,
sto cercando un modo (economico) di far ruotare una puleggia molto lentamente (diciamo 180 gradi in un minuto) e in maniera più fluida possibile.
Dispongo di un motore servo, questo: https://www.steplab.net/p/servo-gobilda-dual-mode/
Ho visto che l'argomento è già stato trattato (Come fare per muovere un servo di 10° in 10 secondi in modo continuo? - #2 by system - in particolare il consiglio di astrobeed riassume bene il punto, ma il post è chiuso e mi servirebbe qualche approfondimento in più).

due questioni:
Ho capito che il comando writeMicroseconds prevede circa 2000 posizioni in 180 gradi, ma il servo motore ha una risoluzione di circa 20microsecondi (un movimento regolare che proceda 1 microsecondo alla volta sun un servo standard andrà a produrre solo rumore e calore, giusto?).

Altro problema, se chiedo al motore di percorrere un grado alla volta e metto un intervallo lungo tra i movimenti, avrò un andamento a scatti, e questo è normale (?). Ma essendo il motore sottoposto a tensione a causa del peso che solleva, quest'ultimo trascina il motore in maniera passiva rendendo il comportamento molto instabile.
Non so se mi sono spiegato, ma vi ringrazio per qualsiasi suggerimento e considerazione vogliate condividere riguardo l'andamento fluido di un servo motore.

Antonio

Sono 1000 posizioni cioè da 1000 a 2000 su 180 gradi ovvero da 1mSecondo a 2mSec , risoluzione software 1 uSecondo ma spesso quella reale è di 4 uSec quindi solo 250 posizioni su 180 gradi

Si, bè, nel caso specifico di questo motore sono 270° per un intervallo da 600 a 2400 microsecondi circa

Quindi 270 / 1800 = 0.15° ogni 1us incremento eseguito ogni 20ms con millis(). I conti tornano, se provi fa sapere come va.

Ciao.

yess! al momento riesco ad incrementare il valore di 1 us ogni 20ms e il movimento è abbastanza fluido. Per rallentarlo ancora non ho altro modo che aumentare di un poco l'intervallo tra gli spostamenti giusto?

Grazie per l'aiuto

Esatto, a me non viene in mente al momento altro modo di rallentarlo, ovviamente se lo rallenti di molto. cioè 1us ogni 40ms dimezzi la velocità ma il servo cambia posizione ogni 20ms e resta fermo i restanti 20ms.

Mi viene in mente il motore sincrono, ma lavora con corrente alternata e per variare la velocità devi variare la frequenza. Booo, non so perché mi è venuto in mente sto motore.

Ciao.

tanto mi sa che comunque rimane fermo per 20mS, non è la cadenza del segnale dei servo 20mS?
ovvero comunque il servo riceve ogni 20mS? che quindi aggiornarlo più spesso non risponde?
o sbaglio a interpretare?

No non sbagli. L'informazione è nel frame del segnale che si ripete ogni 20ms, quindi sta variando 1us ogni 20ms e se vuole farlo andare più lento di così non resta che tenerlo fermo 20ms, 40ms o 60ms ecc, o no?

Ciao.

Grazie a tutti per le risposte.
Il motore sincrono per ora non è un'opzione, invece comincio a temere che sia impossibile rallentare o velocizzare di poco, se l'unità di aggiornamento è sempre di 20ms.
Cioè:
se raddoppio lo spostamento la velocità si raddoppia (al momento l'incremento è al minimo, cioè di 1 us).
se raddoppio l'intervallo di tempo la velocità di dimezza.
E se volessi una differenza più piccola tra due motori con velocità diverse, da quel che capisco dai vostri suggerimenti, mettere un intervallo di 25ms non servirà a niente (o forse salterà un movimento ogni... 4?).

Una soluzione per farli sfasare potrebbe allora essere di mettere un percorso leggermente diverso tra i due motori, ad esempio uno compie 180 gradi e l'altro 170, ma preferivo variare la velocità.

Scusate ancora, nella scheda tecnica del motore leggo questi dati:

Corsa per µsec (fuori dalla scatola) 0,15 ° / μsec
Larghezza banda morta 4 μsec

cosa vogliono dire dire?

Grazie mille

A

aspetta

tante cose non quadrano:

cosa vuol dire che hai due servomotori che devono essere sfasati?, prima parlavi di uno...
poi leggo dal post 1 che il motore è sotto carico e non si muove con precisione, sei sicuro che la soluzione servo sia la giusta? non è che ti serve un motoriduttore? hai calcolato sforzi e coppie?
motore sincrono non andrebbe bene comunque, troppo lento, semmai passo-passo
tu puoi cambiare la posizione programmata del servo quando vuoi, comunque il servo prende il comando ogni 20 millisecondi, se lo comandi ogni 25 ci sarà una volta ogni tanto che tra due successivi comandi non c'è movimento,
se lo comandi ogni 15 invece ci sarà una volta ogni tanto che fa doppio passo, semplice
è certamente possibile rallentare o velocizzare di poco o tanto, solo che l'aggiornamento della posizione avviene ogni 20mS, se non ti sta bene non usi un servo
i dati di targa dicono, più o meno, che il servo cambia la sua posizione di 0,15 gradi per ogni microsecondo di differenza nel segnale PPM che lo comanda
la banda morta ti dice che tra se due consecutivi comandi differiscono per meno di 4 microsecondi il servo non si muove, 4 microsecondi sono mezzo grado circa
tradotto in soldoni: la precisione del movimento (fatto salvo eventuali problemi di sovraccarico, vedi prima) non sarà migliore di mezzo grado
se non ti basta come precisione non usare servo

Leggevo di servo digitali che possono essere rinfrescati 400 volte al secondo, cioè ogni circa 1/400 = 2.5ms, non è che cambia molto poiché la risoluzione è sempre quella di 1us. Esistono servo con 0 dead band, almeno così reclamizzano.

Ciao.

eh, tu hai ragione @Standardoil, ma la soluzione servo è l'unica che al momento mi posso permettere, quindi cerco di ricavare il meglio possibile da quello che ho.
Non ho spiegato tutto il progetto per non mettere troppa carne al fuoco, ma quello che vale per un motore poi io lo applico ad altri 2 motori con parametri leggermente diversi in modo da avere movimenti lenti di diversa durata, ma il discorso in generale non cambia.
Per quel che riguarda il carico, alla fine ho preso un motore con maggiore forza e il problema non si è più verificato. La domanda implicita era: se desidero che il motore sotto sforzo mantenga la posizione devo dargli continuamente la posizione, e non "metterlo in pausa" e mi pare che sia giusto, o no?
Il motoriduttore lo ho valutato, ma da quanto mi hanno detto, a parità di costi fa più rumore del servo, e il rumore è un fattore determinante per il mio progetto.

@Maurotec, a cercare tra le tecnologie si trovano meraviglie, ma il portafogli non segue i desideri :slight_smile:

Comunque grazie davvero a tutti per le spiegazioni che mi hanno aiutato molto!

ma dunque non ha senso imporre a questo motore delle variazioni di 1us ogni 20ms, tanto vale piuttosto variare di 4us in 80ms... (che poi era il succo della domanda nel topic)

metterlo in pausa? L'unico modo per metterlo in pausa è fare il detach, cioè l'opposto di attach. Mentre se non scrivi un nuovo valore tramite write, la libreria servo ha l'ultima posizione memorizzata e la invia ogni 20ms il servo allora cerca di mantenere la posizione.

Ciao.

Grazie @Maurotec, non lo sapevo. Quindi era proprio un problema di forza del motore.

Spiegati meglio

Scusami @Standardoil, mi hanno travolto nel lavoro e ho dovuto abbandonare per qualche giorno il progetto sui motori.

Spiegare meglio che cosa, la pausa del servo? Avevo pensato che usare un delay() per tenere fermo il motore lo mettesse in uno stato inattivo, di stop, come fosse spento, e che quella fosse la causa della perdita di posizione sotto sforzo, invece era solo il servo che era troppo debole.
Questo forse la dirà lunga sulle mie conoscenze di elettronica, ma son poi qui per questo :slight_smile:

se invece ti riferivi al post #13, mi chiedo se variare la posizione di un us alla volta con una rampa abbia senso dal momento che "se due consecutivi comandi differiscono per meno di 4 microsecondi il servo non si muove"

Sì e no

Quello è il limite superiore della banda morta
Magari il tuo in particolare si comporta meglio

Ha senso quindi fare un conto del genere?
Magari no, se l'alternativa è più semplice usala
Comunque non è sbagliato

Tira fuori uno schema e un programma, provali e valuta il risultato
Se ti soddisfa sei a posto
Se non ti soddisfa isoliamo i problemi e vediamone l'origine...

Buttata li al volo, ma se il movimento deve per forza essere fluido e molto lento, non sono meglio dei piccoli motoriduttori, magari con encoder sul motore e finecorsa sull'uscita per poter calcolare le varie posizioni ?

Mi sa che sarebbero piu economici che comperare servo con alte coppie, oltre al permettere movimenti anche lentissimi ma continui, cosa che i servo non credo possano fare.

Ad esempio, una cosa del genere, o altri simili ... se non ricordo male, un 6RPM di quella serie (che dovrebbe essere sui 20KG/cm o poco piu) ha un rapporto di 1000/1, con 11 impulsi per giro dell'encoder avresti 11000 impulsi di encoder per ogni giro dell'albero di uscita, se alimentato opportunamente con un ponte pilotato in PWM, prova a calcolare quanto lentamente potresti farlo andare, volendo ... e molto piu fluidamente di qualsiasi servo :wink:

Se poi non serve tutta quella coppia, ci sono anche molto piu piccoli (edit: ed anche piu economici , bisogna far passare tutti i venditori e confrontae anche le spese di spedizione)