Fråga:
Hur kan jag styra en RC-servo?
Alex L
2012-06-13 01:32:59 UTC
view on stackexchange narkive permalink

Jag skulle vilja styra en liten RC-servo (5 V, 500 mA) från GPIO-stiften via Python.

Hårdvara

  • Vilka är de elektriska anslutningarna som krävs?
  • Kan jag ansluta flera servor till Raspberry Pi?
  • Finns det några nuvarande begränsningar? Behöver jag buffra utgångsstiftet med en transistor?
  • Kan jag driva servon direkt från Raspberry Pi, eller ska jag använda en extern strömförsörjning? Behöver jag en kondensator för att utjämna servos ryckiga effektuttag?

Programvara

  • Vilken programvara / Python-kod behöver jag? Jag vet att jag behöver 20 ms pulser, hur kan jag uppnå detta?
  • Vilken typ av CPU-belastning kan jag förvänta mig av att använda Raspberry Pi på detta sätt?
Det här är en liknande fråga som kan hjälpa dig att komma igång: http://raspberrypi.stackexchange.com/questions/27/libraries-for-interfacing-with-the-gpio
Nio svar:
#1
+9
David Sykes
2012-06-13 08:59:20 UTC
view on stackexchange narkive permalink

De elektriska anslutningarna som krävs beror på vilken servo du har. GPIO tillhandahåller 3,3 V och upp till 16 mA, vilket är otillräckligt för din servo, så du måste buffra den med en transistor.

Det finns 8 GPIO stift på expansionshuvudet, även om andra stift kan konfigureras om för att ge upp till 17 GPIO-stift totalt. Om du behöver mer, måste du lägga till någon form av multiplexer.

Att få exakt tidsinställda signaler kommer att vara knepigt på Raspberry Pi eller på något operativsystem som inte är i realtid, eftersom avbrott och uppgiftsomkopplare kan hända när som helst. Du kommer antagligen behöva extern elektronik för att ge signaler med exakt tidsinställning.

Andrew har pekat på lite programvara. CPU-belastningen beror på vad du gör, men GPIO själv lägger inte till någon belastning.

Å andra sidan - 20 ms är LÅNG tid, även för Raspberry Pi: s CPU-termer. Jag skulle inte vara orolig för mycket för tidsprecision för RC-servor.
@Tibor: 20ms är perioden för servopulser, inte bredden http://en.wikipedia.org/wiki/Servo_control#Pulse_duration. Och upplösningskravet är mycket sämre än så - för att få 8 bitars upplösning behöver du 256 steg över * 2 * millisekunder, så ~ 8us.
#2
+8
simonfi
2012-10-28 03:33:10 UTC
view on stackexchange narkive permalink

Om du kör ett operativsystem i realtid på din Raspberry Pi är det verkligen möjligt. Som andra redan har sagt behöver du en extern strömkälla till servon men förutom det behöver du ingen annan extra hårdvara.

Om du kör Xenomai (realtidsuppdatering för Linux) kan du köra en helt bekant Linux-system, men med extra realtidsfunktioner.

Jag har skrivit ett litet C-bibliotek för att styra servor från Raspberry Pi. Jag har försökt styra 3 servor samtidigt med det, men det finns egentligen ingen anledning till att det inte skulle fungera med mer.

Du hittar mitt lilla bibliotek här: https: // github .com / simonfi / pi-servo Att lägga till ett Python-omslag för det borde vara trivialt. Xenomai för Raspberry Pi finns här: http://powet.eu/2012/07/25/raspberry-pi-xenomai/

Generera de signaler som behövs för tre servor konsumerar i grunden en försumbar mängd CPU. Jag har inte testat med mer än tre än.

#3
+5
James Ronald
2012-10-28 20:18:27 UTC
view on stackexchange narkive permalink

Om du inte har något emot att använda en Linux Kernel-drivrutin finns det servoblaster som exponerar servon som en char-enhet.

https://github.com/richardghirst/PiBits

Jag har gafflat en ny version som inte konsumerar alla gpio-stift för servostyrning . Jag använder för närvarande en sådan på en liten servodriven robot som jag har byggt och demo för vår robotklubb med IPGamePad för att styra den.

https://github.com/jronald/PiBits

Dessutom vill du verkligen inte att strömmen ska servas via RPI utan istället använda en separat strömförsörjning. Naturligtvis måste du knyta samman dessa grunder. Eftersom RPI-utgångarna till servon krävs ingen spänningsförskjutning, men du vill vara mycket försiktig med att inte koppla saker fel.

fyi - richartghrist repo verkar ha bibehållits medan jronaldgaffeln verkar föråldrad och trasig. Jag rekommenderar också att man läser hur man [ignorerar alla utom de första två servokontrollerna] (https://github.com/richardghirst/PiBits/issues/29) och [Installera Servoblaster] (https://github.com/richardghirst/PiBits / utgåvor / 24)
#4
+4
Brandon Bailey
2012-10-28 20:49:49 UTC
view on stackexchange narkive permalink

Det finns ett förlängningskort tillgängligt för hallon pi kallat gertboard som används för att styra servor och andra laster som Pi inte kan köra av sig själv.

Jag bör också tillägga att på grund av populariteten för denna produkt tror jag att den är slutsåld på de flesta webbplatser som erbjuder hallon-pi och tillbehör.
#5
+3
Alex Chamberlain
2012-07-02 23:30:23 UTC
view on stackexchange narkive permalink

Servon styrs i allmänhet med PWM-signaler; Du bör hänvisa till GPIO som PWM-utdata.

Det finns PWM-stöd på chipet, så vi borde kunna använda det i framtiden. I grund och botten är allt programvaran att säga till hårdvaran att producera pulser vid en viss frekvens. Vissa människor har haft framgång med att använda externa PWM-kontroller över I2C.

#6
+3
joan
2014-08-26 14:00:03 UTC
view on stackexchange narkive permalink

Kunskapen om hur man gör saker på Pi har förbättrats mycket under åren sedan den här frågan ställdes.

Det finns minst fyra sätt att generera PWM / Servo-pulser på hårdvaran på Pi gpios utan att använda extern hårdvara.

Användningen av kärnmoduler för att göra detta är ganska gammal. Följande användarlandslösningar finns tillgängliga.

  • Min egen pigpio genererar Servo och allmänna PWM-pulser oberoende av någon av gpios 0-31 (C, Python, sockel, rör).
  • Servoblaster genererar Servo och allmänna PWM-pulser oberoende av upp till 21 gpios (rör).
  • RPIO genererar Servo och allmänna PWM-pulser oberoende av någon av gpios 0-31 (Python).
  • pi-blaster härledd från Servoblaster (pipe)
#7
+2
Martin Thompson
2012-06-14 01:30:10 UTC
view on stackexchange narkive permalink

Jag skulle bli förvånad om du kan tidssända utgångarna tillräckligt bra medan du kör Linux för att noggrant kunna styra en servo.

Pulsen måste kontrolleras över ett intervall på 2 millisekunder. Även om schemaläggningsfästet har en upplösning på 100us (vilket trycker på det - det är vanligtvis 10ms) är det bara 20 steg du kan lösa. Och det är utan att ta hänsyn till den jitter som introducerades av uppgiftsbyte.

Om det finns en annan timer tillgänglig kan du eventuellt skriva en mycket lågnivåförare som kan föregripa även operativsystemet för att få sin timing korrekt. Låter som kul!

#8
+2
Vic320
2012-12-14 00:11:15 UTC
view on stackexchange narkive permalink

Jag tror att det skulle vara svårt att köra en servo direkt från GPIO-porten och orsaka mycket CPU-omkostnader om det ens är möjligt. Jag använder en USB-servokontroll och den fungerar bra och använder nästan ingen processor, även om det är lite knepigt att ställa in. Den jag har är 24 kanaler, men de gör en version med 6 kanaler. Jag har också sett två- och fyrkanalskontroller från andra leverantörer som använder serie som skulle vara enklare och billigare än USB om du inte behöver styra så många servor.

#9
  0
user2737646
2017-02-25 10:02:40 UTC
view on stackexchange narkive permalink

Det finns en fullt fungerande GPIO-webbtjänst som du kan skriva dina egna plugins för. Det verkar ha redan stöd för att kontrollera valfritt antal servor. Se deras "Innehåll" -katalog för en massa bilder samt för tavlan layout.

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

Ser ut att vara i C # som kör Mono på Pi.



Denna fråga och svar översattes automatiskt från det engelska språket.Det ursprungliga innehållet finns tillgängligt på stackexchange, vilket vi tackar för cc by-sa 3.0-licensen som det distribueras under.
Loading...