Domanda:
Cosa si fa comunemente per fermare un servo dopo aver raggiunto la posizione desiderata?
Bajie
2014-09-07 00:18:52 UTC
view on stackexchange narkive permalink

Quando ho avviato Arduino, non mi aspettavo che tutto dovesse essere contenuto in un ciclo infinito. Pensavo di poter scrivere qualcosa come: avviamento motore -> arresto motore. Ma in realtà, quello che ottengo è avvio motore -> arresto motore -> avvio motore -> ... per sempre.

Cosa si fa comunemente per fermare un servo dopo che si trova nella posizione desiderata? Uso servo.write (posizione desiderata) per impedirgli di girare? Stacco il cavo di uscita?

Quali sono alcuni dei rischi coinvolti?

Sette risposte:
#1
+10
jdr5ca
2014-09-07 01:50:09 UTC
view on stackexchange narkive permalink

Non "fermi" un servo.

Un servo è sempre in funzione. In senso generale, il servo è un anello di controllo che prende come input un target di posizione e applica la forza per mantenere il target richiesto. Se vuoi mantenere il target, allora il servo deve essere in funzione.

Un servomotore contiene componenti elettronici che attivano e disattivano internamente un motore CC secondo necessità per mantenere la posizione di destinazione. Se l'obiettivo non corrisponde alla posizione corrente, accende il motore per girare finché i due non corrispondono. Quando l'albero di uscita raggiunge quanto richiesto, l'elettronica all'interno del servomotore spegne il motore. Spento significa che il motore CC assorbe poca o nessuna corrente. Il loop di controllo del servo è sempre in esecuzione confrontando la posizione dell'albero con un target.

Se si spegne l'intero servomotore, la posizione non è sotto controllo e potrebbe spostarsi. Per molte applicazioni, se si scollegano i cavi, gli ingranaggi e i motori applicano una frizione sufficiente da impedire la rotazione. Ma in generale, non conti sull'attrito per far funzionare le cose.

  Uso ... Servo.Write (posizione desiderata) per impedirgli di girare?  

Sì. Per dire a un servo di rimanere in una posizione, puoi semplicemente continuare a inviarlo allo stesso obiettivo.

Ma non devi scrivere () ancora e ancora. Se lo desideri, puoi tenere traccia di quale era l'ultima impostazione e applicarla solo quando hai apportato una modifica. Ad esempio, puoi codificare in questo modo:

  if (position_target! = Position_last_set) {Servo.Write (position_target); position_last_set = position_target;} 

Indipendentemente dal codice, sotto il cofano, Servo trasmette costantemente il target di posizione al servomotore.

Un servo può utilizzare una notevole quantità di corrente cercando di mantenere la posizione quando un carico rotazionale viene applicato all'albero di uscita.
#2
+9
BrettAM
2014-09-07 00:46:59 UTC
view on stackexchange narkive permalink

Un normale servo non ha una funzione "go", ha solo il controllo della posizione. Cioè, sia che tu esegua servo.write (90) all'infinito o una volta, il servo andrà a 90 e continuerà a mantenere attivamente quella posizione finché non ne scrivi un'altra. L'unico modo per spegnere un servo è:

  servo.detach ();  

Per un normale motore DC, dovrai accenderlo poi spegnere e poi avere una sorta di tracciamento dello stato nel ciclo per non riaccenderlo mai più, usando una variabile o millis () ecc.

Ovviamente, se vuoi qualcosa eseguito solo una volta, inseriscilo in setup () (magari all'interno di un ciclo in setup per attività semplici).

Inoltre, puoi simulare la fine del programma inserendo un ciclo infinito con while (true) {} o for (;;) {} .

Sì, il problema sembra essere con il disadattamento del paradigma del loop arduino con l'applicazione piuttosto che con qualcosa di specifico che ha a che fare con il servo - e la soluzione potrebbe effettivamente impedire il loop del loop principale di arduino mettendo un altro loop infinito per intercettare l'esecuzione prima la fine di esso. Oppure, in un sistema più complicato, osservando qualche condizione esterna ed eseguendo una sequenza di operazioni solo una volta in risposta a quella.
Feh, non vedo cosa sia sbagliato. Se vuoi che si fermi hai le opzioni come sopra. E perché preoccuparsi di un microcontrollore se hai intenzione di fare solo una semplice cosa e fermarti? Cosa fa allora? Scarica la batteria?
#3
+4
Kendall Bennett
2016-02-15 10:48:30 UTC
view on stackexchange narkive permalink

myservo.detach (); è quello che stai cercando. Spostarlo in una posizione piuttosto che staccarlo. Questo è utile quando vuoi usarlo per controllare un servo e non farlo continuare a prendere energia come quando usi una batteria. Ecco un esempio.

  #include <Servo.h>Servo myservo; // crea un oggetto servo per controllare un servovoid setup () {myservo.attach (9); // collega il servo sul pin 9 all'oggetto servo} void loop () {myservo.attach (9); // collega il servo sul pin 9 al ritardo dell'oggetto servo (15); myservo.write (1); // imposta la posizione del servo in base al ritardo del valore scalato (1000); // attende che arrivi alla posizione myservo.detach (); ritardo (1000); myservo.attach (9); // collega il servo sul pin 9 al ritardo dell'oggetto servo (15); myservo.write (179); // imposta la posizione del servo in base al ritardo del valore scalato (1000); // attende che arrivi alla posizione myservo.detach (); ritardo (1000);  
devi ritardare prima di staccare? non l'ho fatto e non ho mai avuto problemi con il servo che raggiunge la posizione. quindi immagino che una volta inviato il segnale servo pwm venga inviato e puoi andare avanti.
#4
+3
Dale Mahalko
2016-06-13 06:26:20 UTC
view on stackexchange narkive permalink

La parola servo ha una definizione vaga e può comprendere molti tipi di sottocomponenti. Se desideri mantenere la posizione senza alimentazione utilizzando un motore elettromagnetico, sono disponibili quattro opzioni:

  • Grasso ad alta viscosità
  • Dash pot
  • Rapporto di trasmissione molto alto
  • ganascia del freno magnetico / fascia del freno

MODIFICA: Ci sono alcune possibilità aggiuntive, ma è una specie di effetto di qualche motore modelli:

  • Coppia di tenuta del polo del magnete permanente, o coppia di arresto
  • Coppia di trascinamento del magnete permanente

Il grasso ad alta viscosità e il cruscotto hanno funzioni simili; fornendo un elevato attrito statico per resistere al movimento, che poi si interrompe in movimento. (Un cruscotto è essenzialmente un ingranaggio dentato all'interno di un contenitore a parete dentata e che è permanentemente riempito con un fluido ad alta viscosità.)

Tuttavia entrambi si aggiungeranno al carico del motore e quando si surriscaldano tendono a diventare sottili e gocciolanti e perdono capacità di tenuta.

Un rapporto di trasmissione alto aumenta la coppia richiesta per far girare il motore. Anche se nota, se qualsiasi cambio potesse avere un lubrificante perfettamente privo di attrito, nessuna quantità di riduzione dell'ingranaggio potrebbe fermare il ritorno di rotazione.

Quindi in realtà questo è simile al grasso denso e al potenziometro normale lubrificazione sottile per avere abbastanza attrito statico di rottura, per fermare il back-spin.

Un freno magnetico offre un controllo attivo sull'attrito di rottura statico e può consentire una tenuta molto elevata capacità vs picchi di carico intermittenti sull'albero di uscita. In genere con l'alimentazione spenta, una molla innesta il freno per mantenere la posizione senza alimentazione.

Nota, ci sono due diversi tipi di frenata: mantenimento della posizione statica e decelerazione di un meccanismo in movimento.

Il secondo tipo scarica il calore nelle pastiglie dei freni e nel disco di attrito e consuma le pastiglie e il disco di attrito. Se il freno si surriscalda, le pastiglie di solito si disintegrano e il freno ora non mantiene la posizione.

A meno che non si parli di macchinari di grandi dimensioni, di solito i servofreni sono semplici senza parti sostituibili. Quando il freno si guasta, si tira fuori tutto e lo si sostituisce ... possibilmente anche l'intero servomotore e il cambio.

Per una lunga durata con la frenatura magnetica, è necessario decelerare attivamente il carico utilizzando il servoassistito, quindi una volta che si è fermato, innestare il freno per eseguire semplicemente il lavoro di mantenimento della posizione.

Utilizzando un freno magnetico solo per il mantenimento del carico statico senza alimentazione, avrà questo aspetto:

  • Accendere il motore, ottenere la posizione corrente e iniziare a mantenere attivamente la posizione.
  • Azionare il freno per rilasciarlo
  • Accelerare e spostati nella nuova posizione
  • Decelera il motore e mantieni la posizione finale
  • Togli l'alimentazione dal freno per innestarlo
  • Spegni il motore

Il motore viene alimentato e si porta in posizione di mantenimento per primo, in modo che il carico non scivoli improvvisamente in nessuna direzione, nell'istante tra il rilascio del freno e l'attivazione del servomotore.

EDIT # 1 : per alcuni perm Anent motori a magneti, anche con l'alimentazione spenta c'è una resistenza alla rotazione perché in certe posizioni i magneti e le espansioni polari si attraggono più strettamente tra loro, nota come coppia di arresto .

Questo posizionamento dei poli è come una valle a bassa energia e ci vuole un po 'di forza per superare l'attrazione magnetica e muovere il rotore in entrambe le direzioni utilizzando una coppia esterna.

Puoi sentirlo in alcune ventole brushless e motori passo-passo, dove se ruoti l'albero senza alimentazione, resiste al movimento continuo e sembrano esserci punti ad alta resistenza che il rotore non vuole attraversare. Quando viene fatto girare, il rotore rallenta rapidamente e può cadere in un'oscillazione avanti-indietro mentre si deposita in uno dei pozzetti magnetici attraenti.

Questo può essere utilizzato per resistere a coppie esterne senza freno, ma facendo uso se richiede l'arresto del rotore in uno dei pozzetti magnetici piuttosto che in una posizione specifica, potresti desiderare. Ma se combinato con un cambio, la posizione di arresto specifica esatta potrebbe non avere un'importanza critica e potrebbero esserci diversi pozzetti uno accanto all'altro dove il rotore può fermarsi che forniscono un allineamento accettabile dell'effettore finale.

EDIT # 2 : la coppia di trascinamento del magnete permanente è un effetto del cortocircuito di tutti i cavi di alimentazione insieme. Quando viene eseguita questa operazione, è necessaria una forza considerevolmente maggiore per ruotare l'albero rispetto a quando i fili della bobina dello stepper sono scollegati l'uno dall'altro.

Questo perché con i fili della bobina tutti collegati insieme, quando il rotore gira agisce come un generatore e corrente scorre attraverso le bobine. Questo flusso di corrente crea quella che è nota come forza controelettromotrice (CEMF), che contrasta il campo magnetico del magnete permanente.

Questo CEMF può fornire ulteriore resistenza contro la rotazione quando il servo non è alimentato. Sebbene CEMF non impedisca il movimento, può aiutare a resistere al movimento continuo e fornire una decelerazione istantanea quando vengono applicati picchi di carico intermittenti che cercano di spostare il servo non alimentato.

Tutto quanto sopra è generalmente vero anche per i servi del motore lineare. Quelli non hanno la riduzione dell'ingranaggio, ma il carrello del movimento può essere lubrificato con grasso denso, essere dotato di un potenziometro del cruscotto e avere freni magnetici di tenuta in posizione.

#5
+1
kale
2014-12-23 10:49:34 UTC
view on stackexchange narkive permalink

Ho avuto lo stesso problema.

Ho scoperto che semplicemente aggiungendo myservo.write (90); delay (4000); aiuta a fermare il motore.

  #include <Servo.h> Servo myservo; // crea un oggetto servo per controllare un servo // dodici oggetti servo possono essere creati sulla maggior parte delle schedeint pos = 0; // variabile per memorizzare la posizione del servo void setup () {myservo.attach (9); // collega il servo sul pin 9 all'oggetto servo} void loop () {myservo.write (180); ritardo (8000); //// arresta il motore per 8 secondi per (pos = 180; pos> = 90; pos- = 1) // va da 180 gradi a 0 gradi {myservo.write (pos); // dice a servo di andare in posizione nella variabile 'pos' delay (15); // attende 15 ms che il servo raggiunga la posizione} myservo.write (90); ritardo (4000); // arresta il motore per 4 secondi per (pos = 90; pos < = 180; pos + = 1) // va da 0 gradi a 180 gradi {// in passi di 1 grado myservo.write (pos); // dice a servo di andare in posizione nella variabile 'pos' delay (15); // attende 15 ms che il servo raggiunga la posizione}}  
ho avuto lo stesso problema ho scoperto che semplicemente aggiungendo myservo.write (90); ritardo (4000); // arresta il motore per 4 secondi questo aiuta a fermare il motore
#6
+1
JRobert
2014-12-23 20:25:22 UTC
view on stackexchange narkive permalink

Un servo, per sua natura, viene utilizzato per mantenere una posizione in presenza di disturbi che cercano di disturbare quella posizione. Se hai solo bisogno di spostare un meccanismo che non proverà (o non può) azionare il motore, la tua applicazione può essere meglio servita da un motoriduttore con un codificatore ad albero o interruttori di posizione.

I servi per hobby sono usati principalmente perché sono * economici * e astraggono il problema * e non sono disturbati dai carichi tipici *. Le applicazioni con forze che possono retrocedere rispetto alla varietà normale potrebbero comunque avvicinarsi sovraccaricandole (alcuni dei servi ad alte prestazioni hanno interni che sono più facilmente retroazionati quando sono spenti, anche dal peso delle superfici di controllo sui modelli di grandi dimensioni).
@ChrisStratton: So che il servo hobby può offrire una soluzione block-box in molti casi, ma il mio punto è che un servo è sempre attivo, e se ciò è indesiderabile, come implicito nella domanda, un'altra tecnica potrebbe avere un vantaggio.
No, un servo per hobby non è sempre attivo - se non è passivamente seduto nella sua banda morta (comparatore soddisfatto, quindi motore spento) o si sposta in una nuova posizione distinta, probabilmente è stato applicato in modo errato. L'azione udibile continua significa che il servo è difettoso (comune nella classe $ 3), il collegamento del collegamento o il carico eccessivo.
#7
+1
john
2015-12-07 16:34:12 UTC
view on stackexchange narkive permalink

Questa è una spiegazione molto breve per quanto riguarda i servocomandi.

Il tipo di servosistema che stai proponendo è un sistema ad anello aperto non posizionale ed è generalmente utilizzato per una velocità di movimento accurata (velocità controllata). Il loop in questo caso è solitamente un generatore tachimetrico che invia una tensione (proporzionale alla velocità del motore) a un comparatore che confronta la tensione della dinamo tachimetrica con la tensione regolabile richiesta, l'uscita del comparatore regola quindi la velocità del motore, da qui la velocità. questo tipo di servosistema continuerà a funzionare a velocità costante fino a quando A il segnale del comparatore non viene impostato a zero o B la forza motrice viene rimossa dal motore (spento) ---- Controllo servo punto a punto, d'altra parte ,, generalmente utilizza un comando di posizione che viene verificato con un segnale da un encoder, a quel punto il servo si fermerà fino a quando non viene emesso un altro comando dallo stack (ad es. un'altra posizione di posizione o un comando di sosta (attesa) o altro) il più comune il modo per farlo è usare gcode che ha la capacità di dare il pieno controllo del tuo servosistema. Se non esiste un dispositivo di codifica, il controllo accurato della posizione del servo è molto difficile se non impossibile.



Questa domanda e risposta è stata tradotta automaticamente dalla lingua inglese. Il contenuto originale è disponibile su stackexchange, che ringraziamo per la licenza cc by-sa 3.0 con cui è distribuito.
Loading...