Wie kann ich ein RC-Servo steuern?

26

Ich möchte ein kleines RC-Servo (5 V, 500 mA) von den GPIO-Pins über Python steuern .

Hardware

  • Was sind die erforderlichen elektrischen Anschlüsse?
  • Kann ich mehrere Servos an den Raspberry Pi anschließen?
  • Gibt es derzeit Einschränkungen? Muss ich den Ausgangspin mit einem Transistor puffern?
  • Kann ich das Servo direkt vom Raspberry Pi aus mit Strom versorgen oder sollte ich ein externes Netzteil verwenden? Benötige ich einen Kondensator, um die ruckartige Leistungsaufnahme des Servos zu glätten?

Software

  • Welche Software / Python-Code benötige ich? Ich weiß, dass ich 20-ms-Impulse benötige. Wie kann ich das erreichen?
  • Welche Art von CPU-Auslastung kann ich von der Verwendung des Raspberry Pi auf diese Weise erwarten?
Alex L
quelle
Dies ist eine ähnliche Frage, die Ihnen den Einstieg erleichtern könnte: raspberrypi.stackexchange.com/questions/27/…
Andrew Larsson

Antworten:

9

Die erforderlichen elektrischen Anschlüsse hängen von Ihrem Servo ab. Der GPIO liefert 3,3 V und bis zu 16 mA , was für Ihr Servo nicht ausreicht. Sie müssen ihn daher mit einem Transistor puffern.

Es gibt 8 GPIO-Pins auf dem Erweiterungs-Header , obwohl andere Pins neu konfiguriert werden können, um insgesamt bis zu 17 GPIO-Pins zu erhalten. Wenn Sie mehr benötigen, müssen Sie eine Art Multiplexer hinzufügen.

Auf dem Raspberry Pi oder auf jedem Nicht-Echtzeit-Betriebssystem ist es schwierig, genau zeitgesteuerte Signale zu erhalten, da Interrupts und Taskwechsel jederzeit auftreten können. Wahrscheinlich benötigen Sie eine externe Elektronik, um zeitgenaue Signale zu liefern.

Andrew hat Sie auf eine Software hingewiesen. Die CPU-Auslastung hängt davon ab, was Sie tun, aber das GPIO selbst fügt keine Auslastung hinzu.

David Sykes
quelle
2
Auf der anderen Seite - 20 ms ist eine lange Zeit, auch für Raspberry Pi CPU-Begriffe. Ich würde mir keine Sorgen um die Zeitgenauigkeit von RC-Servos machen.
2
@Tibor: 20ms ist die Periode der Servoimpulse, nicht die Breite. De.wikipedia.org/wiki/Servo_control#Pulse_duration . Und die Auflösungsanforderung ist noch viel schlimmer: Um eine Auflösung von 8 Bit zu erhalten, sind 256 Schritte über 2 Millisekunden erforderlich, also ~ 8us.
Martin Thompson
8

Wenn Sie auf Ihrem Raspberry Pi ein Echtzeit-Betriebssystem ausführen, ist dies in der Tat möglich. Wie andere bereits gesagt haben, benötigen Sie eine externe Stromquelle für die Servos, außer dass Sie keine andere zusätzliche Hardware benötigen.

Wenn Sie Xenomai (Echtzeit-Patch für Linux) ausführen, können Sie ein vollständig vertrautes Linux-System mit zusätzlichen Echtzeitfunktionen ausführen.

Ich habe eine winzige C-Bibliothek geschrieben, um Servos vom Raspberry Pi aus zu steuern. Ich habe versucht, 3 Servos gleichzeitig damit zu steuern, aber es gibt wirklich keinen Grund, warum es nicht mit mehr funktionieren sollte.

Sie finden meine winzige Bibliothek hier: https://github.com/simonfi/pi-servo Das Hinzufügen eines Python-Wrappers sollte trivial sein. Xenomai für Raspberry Pi finden Sie hier: http://powet.eu/2012/07/25/raspberry-pi-xenomai/

Das Erzeugen der benötigten Signale für drei Servos verbraucht im Grunde genommen eine vernachlässigbare Menge an CPU. Ich habe noch nicht mit mehr als drei getestet.

simonfi
quelle
5

Wenn es Ihnen nichts ausmacht, einen Linux-Kerneltreiber zu verwenden, gibt es einen Servoblaster, der die Servos als Char-Gerät ausstellt.

https://github.com/richardghirst/PiBits

Ich habe eine neue Version herausgegeben, die nicht alle GPIO-Pins für Servos verbraucht. Ich verwende derzeit einen solchen kleinen Roboter mit Servoantrieb, den ich für unseren Roboterklub mit IPGamePad gebaut und erprobt habe, um ihn zu steuern.

https://github.com/jronald/PiBits

Außerdem möchten Sie die Servos nicht über das RPI mit Strom versorgen, sondern stattdessen ein separates Netzteil verwenden. Natürlich müssen Sie diese Gründe zusammenbinden. Da die RPI-Ausgänge an den Servo angeschlossen sind, ist keine Spannungsverschiebung erforderlich. Sie sollten jedoch sehr vorsichtig sein, um die Dinge nicht falsch zu verdrahten.

James Ronald
quelle
fyi - das richartghrist repo scheint beibehalten worden zu sein, während die jronald gabel veraltet und kaputt zu sein scheint. Außerdem empfehle ich zu lesen, wie man alle bis auf die ersten beiden Servosteuerungen ignoriert und Servoblaster
cwd
3

Servos werden im Allgemeinen mit PWM-Signalen gesteuert; Sie sollten GPIO als PWM-Ausgang bezeichnen .

Es gibt PWM-Unterstützung auf dem Chip, so dass wir diese in Zukunft nutzen können sollten. Grundsätzlich sagt die Software der Hardware lediglich, dass sie Impulse mit einer bestimmten Frequenz erzeugen soll. Einige Leute hatten Erfolg mit externen PWM-Controllern über I2C.

Alex Chamberlain
quelle
3

Für den Himbeer-Pi ist eine Erweiterungskarte erhältlich, die als Gertboard bezeichnet wird und zur Steuerung von Servos und anderen Lasten dient, die der Pi nicht alleine antreiben kann.

Brandon Bailey
quelle
Ich sollte auch hinzufügen, dass aufgrund der Popularität dieses Produkts ich glaube, dass es an den meisten Standorten, die Himbeer-Pi und Zubehör anbieten, ausverkauft ist.
Brandon Bailey
3

Das Wissen darüber, wie man Dinge auf dem Pi macht, hat sich in den Jahren, seitdem diese Frage gestellt wurde, erheblich verbessert.

Es gibt mindestens vier Möglichkeiten, Hardware-zeitgesteuerte PWM / Servo-Impulse auf den Pi-Gpios zu erzeugen, ohne externe Hardware zu verwenden.

Die Verwendung von Kernel-Modulen zu diesem Zweck ist ziemlich veraltet. Die folgenden Userland-Lösungen sind verfügbar.

  • Mein eigenes Pigpio generiert Servo- und allgemeine PWM-Impulse unabhängig von den GPIOS 0-31 (C, Python, Socket, Pipe).
  • Servoblaster erzeugt unabhängig voneinander Servo- und allgemeine PWM-Impulse auf bis zu 21 gpios (Pipe).
  • Der RPIO generiert unabhängig voneinander Servo- und allgemeine PWM-Impulse auf einem der gpios 0-31 (Python).
  • Pi-Blaster aus Servoblaster (Pfeife)
joan
quelle
2

Es würde mich überraschen, wenn Sie die Ausgaben unter Linux so gut zeitlich steuern können, dass ein Servo genau gesteuert wird.

Der Puls muss über einen Bereich von 2 Millisekunden gesteuert werden. Selbst wenn das Scheduler-Häkchen eine Auflösung von 100us hat (was sehr drückend ist - normalerweise sind es 10 ms), sind das nur 20 Schritte, die Sie auflösen können. Und das, ohne den Jitter zu berücksichtigen, der durch das Task-Switching entsteht.

Wenn ein anderer Zeitgeber verfügbar ist, können Sie möglicherweise einen Treiber auf sehr niedriger Ebene schreiben, der sogar das Betriebssystem vorbelegen kann, um ein genaues Timing zu erzielen. Hört sich nach Spaß an!

Martin Thompson
quelle
2

Ich denke, dass der Versuch, ein Servo direkt vom GPIO-Port aus zu betreiben, schwierig ist und viel CPU-Overhead verursacht, wenn es überhaupt möglich ist. Ich verwende einen USB-Servocontroller, der hervorragend funktioniert und fast keine CPU benötigt, obwohl die Einrichtung etwas schwierig ist. Der eine, den ich habe, ist 24 Kanäle, aber sie machen eine 6-Kanal-Version. Ich habe auch 2- und 4-Kanal-Controller von anderen Anbietern gesehen, die seriell arbeiten. Dies wäre einfacher und billiger als USB, wenn Sie nicht so viele Servos steuern müssen.

Vic320
quelle
0

Es gibt einen voll funktionsfähigen GPIO-Webdienst, für den Sie Ihre eigenen Plugins schreiben können. Es scheint bereits Unterstützung für die Steuerung einer beliebigen Anzahl von Servos zu geben. Im Inhaltsverzeichnis finden Sie eine Reihe von Bildern sowie Informationen zum Layout der Karte.

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

Scheint in C # zu sein, das Mono auf dem Pi ausführt.

user2737646
quelle