Raspberry PI + Servo

Ansteuerung eines Standard Servos mit dem Raspberry PI 3.

Für die spätere Verwendung auf einem Roboter soll der Servo in +/- Grad mit Bezug zur Mittelstellung gesteuert werden.

Weiterhin soll für den Servo, da die beiden Hardware PWMs schon für einen anderen Zweck verwendet werden, der Software PWM zur Anwendung kommen.

Auf die Funktionsweise eines Servos gehe ich hier nicht ein, dies kann bei Bedarf bei http://rn-wissen.de/wiki/index.php/Servos oder anderen Websites nachgelsen werden.


Hardware

PI3 (oder älter bitte auf die richtigen Pins achten)
Standard-Servo
Diverse Kabel ( Vorgefertigte Pin-Header Kabel)


Aufbau

GPIOs

  • Ansteuerung des Servos GPIO 27

(Die GPIOs gelten nur in Verbindung mit pi4j und wirePi)

 

Plan

 


Software

Entwicklungsumgebung

Als Entwicklungsumgebung verwende ich BlueJ auf dem PI selbst. Hiermit habe ich die folgenden Klassen erstellt.


Code

Erste Testklasse

Hier die erste Testklasse welche alle Positionen des Servos mal abfährt.

[gistpen id=“232″]

Servo-Klasse

Klasse zur Steuerung des Servos. Die zwei wichtigsten Methoden sind:

  • setPos – Setzen der Position, Wertebereich von posMin bis posMax wobei (posMax-posMin+1)  die Mittelstellung ist.
  • setDeg – Diese Methode projeziert die eingegebende Gradzahl auf die möglichen positionen (sehr ungenau 🙁 )

[gistpen id=“228″]

Test-Klasse

Klasse mit Main-Methode zum Testen des Servos. In der Main-Methode werden alle Positionen abgefahren wobei die Positionierung über den Winkel relativ zur 0 Position erfolgt.

[gistpen id=“230″]


Tips

Das Positionieren über die PI4j Lib ist sehr ungenau für die 180° Bewegungspielraum des Servos stehen gerade mal rund 20 (+-2) Positionen zur Verfügung. Das sind rund 9° pro Position.  Evtl. sollte man vorher testen welche Positionen für den Aktuellen Zweck am besten geeignet sind. Sollte der genaue Winkel wichtig sein, ist es besser diesen vorab zu messen als ihn über die setDeg Methode berechnen zu lassen.

Es gibt noch weitere Lib’s (Servoblast, … ) die evtl genauer sind, evtl müsste man auch überlegen die Programmiersprache zu wechseln und dann den Ensprechenden Code über das Nativ-Interface anzusprechen bzw. irgendwie anders 😉 .


Einen anderen Weg gehen …

Ich habe versucht den Software PWM innerhalb eines Threads laufen zu lassen, jedoch ohne Erfolg. Der Servo weigert sich zu funktionieren.  Über die Ursache hierfür bin ich mir noch im unklaren ich nehme allerdings an, dass hierdurch der Timer zerschossen wird.

Nach diversen Tests mit unterschiedlichen Frequenz-Einstellungen habe ich mich entschlossen ServoBlaster od.  besser die PI variante (PiBits) zu verwenden. Die Installation gestaltet sich einfach wie folgt.

[gistpen id=“257″ ]

Jetzt muss der ServoBlaster nur noch über Java angesprochen werden. Hier ein einfaches Beispiel zum testen.

… kommt noch

Die Implementierung in anständigen Klassen sieht dann wie folgt aus.

… kommt noch


Tips für den neuen Weg

Wenn die exec Funktion von Java nix macht ist hier ein guter Link zum Bugfixing.

http://www.javaworld.com/article/2071275/core-java/when-runtime-exec—won-t.html

Weiterhin könnte es helfen nicht die Println Methode zu verwenden, da zumindest mein PI den Abschluss der Zeile nicht richtig interpretieren konnte. (Beispiel „5=100\n)“ sollte funktionieren).

 

Quellen

http://razzpisampler.oreilly.com/ch05.html
https://github.com/Pi4J/pi4j/blob/master/pi4j-example/src/main/java/MaestroServoExample.java
https://www.bluej.org/raspberrypi/ServoMotor.html
https://phyks.me/2015/05/controlling-servomotors-on-a-raspberry-pi.html
http://rn-wissen.de/wiki/index.php/Servos
https://github.com/richardghirst/PiBits/tree/master/ServoBlaster

Raspberry Pi Servo Motor Steuerung

Between 0 and 1 – PWM with Raspberry Pi

 


Anhang

Pin-Belegung

 

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.