Come posso controllare un servo RC?


26

Vorrei controllare un piccolo servo RC (5 V, 500 mA) dai pin GPIO tramite Python .

Hardware

  • Quali sono i collegamenti elettrici richiesti?
  • Posso collegare più servi al Raspberry Pi?
  • Ci sono delle limitazioni attuali? Devo bufferizzare il pin di uscita con un transistor?
  • Posso alimentare il servo direttamente da Raspberry Pi o utilizzare un alimentatore esterno? Ho bisogno di un condensatore per smorzare l'assorbimento a scatti del servo?

Software

  • Quale software / codice Python mi serve? So di aver bisogno di impulsi di 20 ms, come posso raggiungere questo obiettivo?
  • Che tipo di carico della CPU posso aspettarmi dall'uso di Raspberry Pi in questo modo?

Questa è una domanda simile che potrebbe aiutarti a iniziare: raspberrypi.stackexchange.com/questions/27/…
Andrew Larsson,

Risposte:


9

I collegamenti elettrici richiesti dipendono dal servo che hai. Il GPIO fornisce 3,3 V e fino a 16 mA , il che è insufficiente per il tuo servo, quindi dovrai bufferizzarlo con un transistor.

Ci sono 8 pin GPIO sull'intestazione di espansione , sebbene altri pin possano essere riconfigurati per dare fino a 17 pin GPIO in totale. Se hai bisogno di più, dovrai aggiungere una sorta di multiplexer.

Ottenere segnali temporizzati con precisione sarà complicato su Raspberry Pi o su qualsiasi sistema operativo non in tempo reale, poiché in qualsiasi momento possono verificarsi interruzioni e interruzioni di attività. Probabilmente avrai bisogno di componenti elettronici esterni per fornire segnali temporizzati con precisione.

Andrew ti ha indicato alcuni software. Il carico della CPU dipenderà da quello che stai facendo, ma lo stesso GPIO non aggiunge alcun carico.


2
D'altra parte, 20 ms sono lunghi, anche per i termini della CPU di Raspberry Pi. Non sarei troppo preoccupato per la precisione del tempo per i servi RC.

2
@Tibor: 20ms è il periodo dei servi impulsi, non la larghezza en.wikipedia.org/wiki/Servo_control#Pulse_duration . E il requisito di risoluzione è molto peggio di così: per ottenere 8 bit di risoluzione, sono necessari 256 passaggi in 2 millisecondi, quindi ~ 8us.
Martin Thompson,

8

Se stai utilizzando un sistema operativo in tempo reale sul tuo Raspberry Pi, questo è davvero possibile. Come altri hanno già detto, sarà necessaria una fonte di alimentazione esterna per i servi, ma a parte questo non è necessario alcun altro hardware aggiuntivo.

Se usi Xenomai (patch in tempo reale per Linux) puoi eseguire un sistema Linux completamente familiare, ma con funzionalità in tempo reale aggiunte.

Ho scritto una piccola libreria C allo scopo di controllare i servi dal Raspberry Pi. Ho provato a controllare 3 servi contemporaneamente, ma non c'è davvero alcun motivo per cui non dovrebbe funzionare con altri.

Puoi trovare la mia minuscola libreria qui: https://github.com/simonfi/pi-servo L'aggiunta di un wrapper Python per esso dovrebbe essere banale. Xenomai per Raspberry Pi è disponibile qui: http://powet.eu/2012/07/25/raspberry-pi-xenomai/

Generare i segnali necessari per tre servi sta sostanzialmente consumando una quantità trascurabile di cpu. Non ho ancora testato con più di tre.


5

Se non ti dispiace usare un driver del kernel Linux, c'è un servoblaster che espone i servi come dispositivo char.

https://github.com/richardghirst/PiBits

Ho creato una nuova versione che non consuma tutti i pin gpio per l'uso dei servi. Attualmente sto usando un robot servoazionato di questo tipo che ho costruito e provato per il nostro robot club usando IPGamePad per controllarlo.

https://github.com/jronald/PiBits

Inoltre, non vuoi davvero alimentare quei servi tramite l'RPI ma invece usi un alimentatore separato. Ovviamente devi legare insieme questi motivi. Poiché l'RPI emette il servo, non è necessario alcuno spostamento di tensione, ma dovrai fare molta attenzione a non cablare le cose in modo errato.


a proposito - il repository richartghrist sembra essere stato mantenuto mentre la forcella jronald sembra obsoleta e rotta. Inoltre, raccomando di leggere come ignorare tutti tranne i primi due servocomandi e l' installazione di Servoblaster
cwd

3

I servi sono, generalmente, controllati usando segnali PWM; dovresti fare riferimento a GPIO come output PWM .

C'è un supporto PWM sul chip, quindi dovremmo essere in grado di usarlo in futuro. Fondamentalmente, tutto il software fa è dire all'hardware di produrre impulsi a una certa frequenza. Alcune persone hanno avuto successo utilizzando controller PWM esterni su I2C.


3

C'è una scheda di estensione disponibile per il raspberry pi chiamata gertboard che viene utilizzata per controllare i servi e altri carichi che il Pi non può guidare da solo.


Dovrei anche aggiungere che a causa della popolarità di questo prodotto credo che sia esaurito nella maggior parte dei siti che offrono il lampone pi e accessori.
Brandon Bailey,

3

La conoscenza di come fare le cose sul Pi è migliorata molto negli anni da quando questa domanda è stata posta.

Esistono almeno quattro modi per generare impulsi PWM / Servo a tempo hardware sui Gpi del Pi senza utilizzare hardware esterno.

L'uso dei moduli del kernel per farlo è praticamente deprecato. Sono disponibili le seguenti soluzioni per l'utente.

  • Il mio pigpio genererà gli impulsi Servo e PWM generali indipendentemente su qualsiasi gpios 0-31 (C, Python, socket, pipe).
  • Il servoblaster genererà impulsi PWM generali e servo indipendentemente su un massimo di 21 gpios (tubo).
  • RPIO genererà impulsi Servo e PWM generali indipendentemente su uno qualsiasi dei gpios 0-31 (Python).
  • pi-blaster derivato da Servoblaster (pipe)

2

Sarei sorpreso se riuscissi a sincronizzare sufficientemente le uscite mentre esegui Linux per controllare accuratamente un servo.

L'impulso deve essere controllato su un intervallo di 2 millisecondi. Anche se il tick dello scheduler ha una risoluzione di 100us (che lo sta spingendo - di solito è 10ms), sono solo 20 i passaggi che puoi risolvere. E questo senza considerare il jitter introdotto dal cambio di attività.

Se è disponibile un altro timer, potresti potenzialmente scrivere un driver di livello molto basso che può anticipare anche il sistema operativo per ottenere una tempistica precisa. Sembra divertente!


2

Penso che provare a eseguire un servo direttamente dalla porta GPIO sarebbe difficile e causerebbe un sacco di sovraccarico della CPU, se possibile. Uso un servo controller USB e funziona benissimo e non usa quasi nessuna CPU, anche se è un po 'complicato da configurare. Quello che ho è di 24 canali, ma fanno una versione a 6 canali. Ho visto anche controller a 2 e 4 canali di altri fornitori che usano il seriale che sarebbe più facile ed economico dell'USB se non dovessi controllare così tanti servi.


0

Esiste un servizio Web GPIO completamente funzionante per il quale puoi scrivere i tuoi plugin. Sembra già avere il supporto per il controllo di qualsiasi numero di servi. Vedi la loro directory "Contenuto" per un mucchio di immagini e per il layout della scheda.

https://bitbucket.org/PaulTechGuy/raspberrypi.dotnet.gpioweb

Sembra di essere in C # con Mono sul Pi.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.