Servomotore?

Oct 24, 2024 Last reply: 1 anno fa 18 Replies

Ultimamente mi sto interessando alla robotica semplice, quindi motori. Un campo completamente nuovo, quindi faccio fatica a seguire alcune cose basilari.



In questo post vi chiedo di aiutarmi a capire l'utilizzo dei servomotori nei piccoli robot. Per esempio, il robot più semplice per eccellenza è il BeeBot[1]. Non fa altro che andare avanti, indietro e ruotare su se stesso a destra o sinistra di 90°.



Per fare questi movimenti utilizza due motori. Accendendoli insieme nello stesso verso si sposta in avanti/indietro. Accendendoli insieme nel verso opposto effettua delle rotazione.



Sia i movimenti lineari che quelli rotazionali sono ben precisi: 15cm e



90°. Da quello che ho capito, una cosa del genere non si può ottenere con un normale motore in DC controllato in anello aperto, tipo applico una tensione per un certo tempo fisso. Questa strategia di controllo non potrebbe garantire che il robot si muova della lunghezza/angolo voluto con una precisione sufficiente.

Quindi immagino che anche in questo tipo di robot così semplici ci sia un servomotore. Se non ho capito male, il servomotore è un blocco con un normale motore DC con l'aggiunta di una sezione sensori ed una sezione di controllo in anello chiuso. Dal mondo esterno arriva l'informazione di comando (per esempio, fai una rotazione di 360°) e il servomotore, grazie al suo controller e sensori, effettua la rotazione voluta.



Volendo giocare con qualche servomotore per capire come funzionano, tipo con Arduino, cosa mi consigliate di acquistare?


[1]
formatting link

Il giorno Thu, 24 Oct 2024 09:00:36 +0200 pozz snipped-for-privacy@gmail.com ha scritto:

i "servo" intesi come black box sono sostanzialmente tutti uguali e intercambiabili, prendine uno da 10 euro anche nobrand.

Quelli normali sono ad anello chiuso. Gli mandi un impulso ricorrente (tipo 50 impulsi/sec) e l'impulso puo' essere largo da 1 a 2 ms (lo zero e' a 1,5 ms). L'elettronica interna al servo confronta questi impulsi con quelli generati internamente da un potenziometro e fa girare il motorino, collegato al potenziomnetro tramite una cascata di ingranaggi, finche' i due impulsi sono uguali - a quel punto il motore si ferma e il braccio avra' assunto una posizione che sara' proporzionale alla levetta del joystick.

Ma esistono anche servo APERTI in cui manca il potenziometro per cui il motore si ferma a 1,5 ms per ogni diverso valore continua a girare ininterrottamente avanti (1ms) o indietro (2ms), finche' non rimelli lo stick al centro. Si usano per esempio nelle barche a vela radiocomandate, per tirare o mollare le vele.

Una volta si facevano in casa, aprendo un servo normale e togliendo un ingranaggio. Adesso li trovi anche gia' fatti.

Il 24/10/2024 11:57, Giacobino da Tradate ha scritto:

Quando dici che i due impulsi sono uguali, cosa intendi? Immagino che il potenziometro nel servo non generi impulsi, ma una tensione analogica. Ed immagino che gli impulsi "esterni" vengano mediati per avere un'altra tensione analogica da confrontare con quella del potenziometro.

E cosa cambierebbe rispetto ad un normale motore DC a cui dai una tensione fissa positiva o negativa?

Tornando al discorso BeeBot di cui parlavo, secondo te è un servo? Perché da qualche parte[2] vedo che c'è una ruota forellata e lettura fascio IR mediante un TX/RX tipo quello dei vecchi mouse.

In questo sistema immagino che il motore sia un classico DC e il feedback della posizione viene fatta tramite la lettura di questo encoder direttamente dalla centralina principale.

In soldoni, se devo fare un giro e ci sono 16 fori sulla ruota, accendo il motorino e conto 16 impulsi. Al 16-esimo stacco l'alimentazione. Potrebbe funzionare? Chiaramente il motore non deve essere velocissimo, altrimenti si fermerà abbastanza dopo il 16-esimo impulso. Forse con qualche ingranaggio viene rallentato?

[2]
formatting link
[minuto 5:51]

Onda quadra con un duty cycle del 50%, ovvero con semionda positiva e negativa che hanno medesima durata. Variando il duty cycle, quindi la differenza fra le due durate, dici al servo di assumere una posizione all'interno del range possibile.

Esatto. I due impulsi vegno confrontati e quando uno è diverso dall'altro, il servo ruota finchè non corregge l'errore.

Che sono già demoltiplicati e li piloti con un PWM ben standardizzato.

Esatto. E' un encoder ottico come quelli dei mouse, che per funzionare funzionano, ma per loro stessa natura tendono ad accumulare errori, perchè tu conti il numero delle interruzioni del fascio IR, ma non misuri la posizione esatta della ruota, anche se pure quella non ti darebbe l'effettiva strada percorsa, per es. se la ruota slittasse.

Si. E' un metodo come un altro, così come usare un motore stepper, che ti permette di impostare quanti step, e di conseguenza quanti gradi ruotare, ma anche lì non è detto che tu ottenga la rotazione desiderata.

Quando serve un certo grado di precisione, perlomeno eslcudendo le situazioni limite di ruota che slitta, un encoder magnetico sembra la soluzione migliore, dato che misura l'angolo di un magnete solidale con la ruota, perciò hai sempre disponibile la posizione assoluta e non c'è bisogno di tenere traccia dei vari impulsi, ma chiaramente è un dato atomico sulla posizione e non ti dice quanta strada hai fatto.

Leggevo[3] che spesso il duty-cycle per i servomotori non è quasi mai il

50%.

Perché? Se la ruota sforacchiata è solidale al motore, contando i fori dovrei conoscere anche la posizione della ruota (magari in termini relativi e non assoluti).

Ma questo problema penso non lo puoi risolvere se non tramite la lettura della posizione del robot nello spazio (GPS, ecc).

[3]
formatting link

Il giorno Thu, 24 Oct 2024 12:47:23 +0200 pozz snipped-for-privacy@gmail.com ha scritto:

intendo che sono segnali digitali (a livello TTL, i servo lavorano tradizionalmente fra 4,8 e 6 Volt) e c'e' un circuito NOR (?) fra l'impulso che arriva dalla ricevente del radiocomando e quello generato localmente. Quando i segnali sono uguali, l'uscita va a zero e il motore si ferma.

negativo, il potenziometro regola una costante di tempo RC e allarga o restringe l'impulso locale. Esistevano fin dagli anni '70 dei chip TTL dedicati per gestire la comparazione fra i due impulsi. La gestione interna al servo e' logica "tutto o nulla" e il risultato e' che il motore o sta fermo, o gira al massimo in un senso o gira al massimo nel senso opposto. La velocita' con cui il servo cambia posizione e' un parametro qualificante del servo.

niente, tranne che hai gia' dentro gia' fatta tutta la parte elettronica che reagisce ai comandi R/C (radio control), che sono un protocollo standardizzato da decenni per cui trovi di tutto.

Non lo conosco sorry. Ho aperto il link ma quando ho visto che sta li' a svitare le viti una per una al rallentatore l'ho richiuso.

Il giorno Thu, 24 Oct 2024 13:06:43 -0000 (UTC) asdf snipped-for-privacy@nospam.invalid ha scritto:

non funziona proprio cosi'. ci sono dei monostabili in trasmissione e dei monostabili interni al servo, e un comparatore in logica TTL interno al servo per far girare il motore CW o CCW in modo da azionare il potenziometro (e contestualmente la squadretta di azionamento).

si' ma e' una comparazione logica, non analogica.

Io ricordavo così, ma è un mucchio di tempo che non ci gioco, perciò se mi dici che non è il 50% devo prenderlo per buono.

Sì, ma non era questo che intendevo. Se fra una misura e l'altra il robottino si ferma per un po' e il micro va in sleep, perdi tutto a meno di non salvare poniamo su flash o altro la posizione accumulata, che pure quello può dare i suoi problemi con scritture troppo frequenti. Probabilmente il sistema migliore è un connubio fra letture relative, assolute e naturalmente dove possibile della posizione nello spazio come fai giustamente notare, anche se per es. il GPS al chiuso e sui picoli spostamenti non potrebbe funzionare, e lì entrano in ballo un mare di altre tecnologie, fra computer vision, AI e compagnia cantante.

Non sono problemi triviali, e non c'è da stupirsi se la guida autonoma di Tesla continua a fare acqua da tutte le parti e ogni tanto qualcuno ci lascia pure le penne...

Io quello intendevo; dentro ci sarà qualcosa come uno xor che lavora come comparatore di fase, non certo un operazionale che integra generando una tensione e perderebbe un mucchio di efficienza.

In questo caso il robottino si sposta di 15cm in avanti. Durante questo spostamente presuppongo che il micro sia vivo e vegeto e riesca a contare *tutti* i fori attarversati. In questo scenario, penso che riesca a determinare lo spostamento (relativo al punto di partenza) in modo molto preciso. Almeno preciso quanto lo distanza tra un foro e l'altro.

Più che altro quello che non so è quanto impiega realmente questo motorino a fermarsi quando, dopo aver contato il numero giusto di fori, gli tolgo l'alimentazione. E' probabile che la sua inerzia continui a farlo muovere, oppure è probabile che l'attrito e il sistema di demoltiplica lo fermi abbastanza rapidamente.

Ok, stiamo però parlando di cose molto diverse. Io mi riferivo semplicemente ad un robottino che deve muoversi in linea retta di una certa distanza dal punto di partenza.

Il 25/10/2024 12:31, asdf ha scritto:

Però quello che non capisco da dove esce fuori il secondo treno di impulsi "interno" al servo, quello che dovrebbe essere generato dal potenziometro. Inoltre, ammettendo di avere questo treno di impulsi generato dal valore

*analogico* del potenziometro (tramite monostabili), alla fine del confronto tra i due treni di impulsi ho un altro treno di impulsi che dovrà essere a sua volta convertito in una tensione *analogica* da dare al motorino.

Nella mia mente semplicistica, pensavo che dal potenziometro il circuito interno di controllo generasse una tensione: diciamo 0V quando il motore è al centro, 1V quando è totalmente a destra, -1V quando è totalmente a sinistra. Questa cosa è molto facile da fare.

La stessa cosa posso farla con il treno di impulsi esterno, tarato a 0V quando il duty-cycle è 1.5ms, -1V quando è 2ms, +1V quando è 1ms (tempi e tensioni a caso). Ancora una cosa molto semplice.

Sarebbe facile fare un comparatore di queste due tensioni la cui uscita va ad agire direttamente sulla tensione del motorino.

Il 24/10/2024 20:39, Giacobino da Tradate ha scritto:

Ora penso di aver capito. Il treno di impulsi in uscita dalla comparazione è direttamente la tensione applicata al motorino, tutto o niente.

Immagino, avevo messo il minuto apposta :-)

Il giorno Fri, 25 Oct 2024 12:49:40 +0200 pozz snipped-for-privacy@gmail.com ha scritto:

ti descrivo il testerino per servocomandi che ho fatto vent'anni fa: un 555 astabile produce un'onda quadra a 50 Hz ossia produce un cambiamento di stato ogni 20 millisecondi, questo cambiamento di tensione arriva a un 74121 monostabile che a seconda della posizione del potenziometro (costante di tempo di un filtro RLC) restringe (1 ms) o allarga (2 ms) l'impulso e lo manda al servocomando.

Dentro al servocomando c'e' un circuito del tutto analogo ossia un generatore di clock e un monostabile la cui larghezza dipende dal potenziometro interno al servocomando. Il motore sta fermo se i due impulsi (interno ed esterno) sono larghi uguali, altrimenti frulla in un senso o l'altro per far girare il potenziometro interno, azzerare l'errore e muovere la squadretta.

Il motore o sta ferma oppure, se frulla, gira sempre al massimo, tutto o nulla, per raggiungere il piu' presto possibile la posizione della squadretta che deve essere "proporzionale" alla deviazione del joystick (o la rotazione del potenziometro del tester).

Al motorino non arriva un valore "analogico" ma un on-off-on.

il potenziometro fa parte di un circuito RLC.

Si puo' far tutto, io descrivo solo come funzionano i servo "standard" da radiocomando, che si usano anche per la robotica essendo gia' pronti e a basso costo.

Il giorno Fri, 25 Oct 2024 18:02:39 +0200 Giacobino da Tradate snipped-for-privacy@gmail.com ha scritto:

formatting link
Qui spiega tutto compreso lo schema interno di un servo modellistico.

E' un oscillatore a frequenza fissa e duty cycle variabile come il segnale che arriverebbe dall'esterno, solo che il duty cycle di questo dipende dalla posizione del potenziometro, quindi dalla posizione del servo. Perciò, in condizioni di riposo, poniamo con il servo a metà corsa e il segnale esterno che imposta appunto il servo a metà corsa, non succede nulla perchè i duty cycle sono identici. Se invece dall'esterno dici al servo di raggiungere una certa posizione, rivelatore di fase interno rileva la differenza fra il segnale interno e ruota il servo nella direzione voluta fino a rilevare nuovamente due duty cycle uguali.

Per motivi di efficienza conviene usare sempre gli impulsi. Se provi per es. a far girare molto piano un motorino pilotandolo con una tensione più bassa tramite un regolatore, vedrai che perde moltissimo in efficienza e può anche fermarsi, mentre usando PWM puoi farlo girare anche pianissimo. Nel servo gli impulsi dall'esterno già arrivano, perciò se col potenziometro piloti qualcosa che li produca anche all'interno del servo, confrontandoli puoi produrre un errore, che è a sua volta un treno di impulsi, che è proprio quello che puoi usare per pilotare il servo nella direzione voluta fino a renderlo nullo.

Certo, ma perderebbe tantissima potenza; meglio lavorare con gli impulsi.

Quello dipende da un mucchio di fattori, comunque se vuoi mettere in pratica un freno elettrico, basta cortocircuitare il motorino, che si ferma molto rapidamente. Lo fai con il classico mosfet robusto, solo che devi essere strasicuro che non andrà in conduzione durante il pilotaggio del motore, altrimenti friggi lui o l'uscita del pilota, e il modo più sicuro per farlo è via hardware, non software.

Divagavo...:) Comunque il problema di essere sicuri della strada percorsa non è così semplice; praticamente non puoi mai fare affidamento sulla certezza che la ruota non slitterà, e comunque c'è sempre l'errore che si accumula per es. girando o andando avanti o indietro tot volte.

Il 26/10/2024 01:39, Giacobino da Tradate ha scritto:

Molto interessante, per me un argomento completamente nuovo.

Da qui capisco che lavorare con treni di impulsi è anche più vantaggioso quando vogliamo trasmettere l'informazione via RF (portarsi dietro una valore analogico sarebbe molto più complicato).

Anche il duty-cycle così basso (1ms su 20ms), che inizialmente mi sembrava una scelta strana, probabilmente si spiega con la necessità di includere più informazioni per servomotori in uno stesso periodo (radiocomando a più canali).

In quel caso però oggi conviene andare direttamente in digitale, che aumenta di parecchio la quantità di dati trasmissibili, così come la distanza raggiungibile. Dai un'occhiata a ExpressLRS:

formatting link
giro trovi anche i record di distanza: decine di km con poche centinaia di milliwatt.

Il giorno Mon, 28 Oct 2024 09:09:59 +0100 pozz snipped-for-privacy@gmail.com ha scritto:

E' una forma di OOK (on off keying), via radio si trasmette sono la portante.

la larghezza del singolo impulso (max 2 ms a fondo corsa) e' previsto per poter accomodare una decina di canali in sequenza, una cifra che all'inizio sembrava perfino esagerata dato che un aereo vola benissimo gia' con 4 canali (6 se vuoi anche flap e carrello).

Adesso ci sono radiocomandi perfino con 20-25 canali e mi chiedo come funzionino dato che le tempistiche dei servocomandi sono standardizzate da decenni, quindi vogliono un impulso esterno fra 1 e 2 ms che si ripete ogni 20 ms. Con 20 ms il servocomando aggiorna la posizione della squadretta 50 volte al secondo, riducendo la frequenza di aggiornamento della posizione ci starebbero piu' canali ma non sarebbe piu' tanto in tempo reale.

Join the Discussion

Have something to add? Share your thoughts — no account required.

Didn't find your answer?

Ask the community — no account required