Python exemplarisch
deutsch     english

SERVOMOTOREN

 

Alle Programme können von hier heruntergeladen werden.


 

Wie funktioniert ein Servomotor?

 

Ein Servomotor ist ein Gleichstrommotor mit einer internen Rückkopplung (ein Potentiometer an einem Getriebe und etwas Elektronik). Seine hauptsächliche Aufgabe besteht darin, die Antriebsachse in eine vorgegebene Richtung zu drehen. Der Motor hat 3 Eingänge: GND, POWER und SIGNAL.

Wenn eine PWM-Spannung an den Signaleingang angelegt wird, so dreht sich der Motor bis zu einer bestimmten Achsrichtung, die von der Pulsdauer (Einschaltzustand) abhängt. Beachten Sie, dass die Richtung also nicht etwa mit dem Dutycycle, sondern durch die Länge t des Einschalt-Pulses gewählt wird. (Mehr Informationen über PWM finden Sie im Kapitel LED dimmen.)

servomot6

Viele Servermotoren verwenden eine PWM-Frequenz von fPWM = 50 Hz, die der Periode T = 20 ms entspricht. Die Beziehung zwischen der Pulslänge und der Richtung ist linear und hängt vom Motor und Getriebe ab.

Beispiel:

servomot1

 

  servomot3
 
servomot4

Servomotoren findet man in funkgesteuerten Spielzeugen (Autos, Flugzeuge, usw.), sie werden aber auch in industriellen Anwendungen eingesetzt, wo eine genaue Achsausrichtung benötigt wird (z. B. in der Robotik). Eine Alternative (und oft bessere Lösung) einer Richtungssteuerung ist der Schrittmotor (siehe das nächste nächstes Kapitel).

 

 

Experiment 1: Motor, der direkt mit GPIO verbunden ist

 

Ziel:
Schliessen Sie einen kleinen Servomotor direkt an die 5 V Stromversorgung des Raspberry Pi an und steuern Sie ihn mit einem GPIO I/O-Port unter der Verwendung der GPIO-Bibliothek.

servomot2

hand1

Verwenden Sie wegen der geringen Belastbarkeit der 5V-Versorgung nur Micro-Servomotoren (z.B. Tower Pro SG90).

Schaltung:
Verbinden Sie das braune (oder schwarze) Kabel mit dem GND (Pin #6), das rote Kabel mit 5 V (Pin #2) und das gelbe Kabel mit dem GPIO-Pin. Der Servomotor wird also mit 5 V angetrieben, aber mit nur 3.3 V angesteuert.

Programm:[►]

# Servo1.py

import RPi.GPIO as GPIO
import time

P_SERVO = 22 # adapt to your wiring
fPWM = 50  # Hz (not higher with software PWM)
a = 10
b = 2

def setup():
    global pwm
    GPIO.setmode(GPIO.BOARD)
    GPIO.setup(P_SERVO, GPIO.OUT)
    pwm = GPIO.PWM(P_SERVO, fPWM)
    pwm.start(0)

def setDirection(direction):
    duty = a / 180 * direction + b
    pwm.ChangeDutyCycle(duty)
    print "direction =", direction, "-> duty =", duty
    time.sleep(1) # allow to settle
   
print "starting"
setup()
for direction in range(0, 181, 10):
    setDirection(direction)
direction = 0    
setDirection(0)    
GPIO.cleanup() 
print "done"
Programmcode markieren (Ctrl+kopieren, Ctrl+V einfügen)

Bemerkungen:
In Ihrem Programm müssen Sie warten, bis der Servomotor in der neuen Drehrichtung angekommen ist, bevor Sie die Richtung erneut ändern oder das Programm beenden.


Es ist eine gute Idee, einen Servomotor mit einer externen Spannungsquelle zu versorgen, da das "elektrische Rauschen" des Servomotors Störungen beim Raspberry verursachen kann. Verwenden Sie nebenstehende Verkabelung

servomot5

 

 

Experiment 2: Ansteuerung von Servomotoren mit dem PCA9685

 

Die softwaremässige Erzeugung von stabilen PWM-Signalen ist schwierig und führt zu einer grossen Belastung des Mikroprozessors. Insbesondere wenn mehrere Servomotoren vorhanden sind, ist es empfehlenswert, diese mit einem externen Chip anzusteuern.

Der PCA9685 von NXP kann bis zu 16 PWM-Signale erzeugen und besitzt ein I2C-Interface. Er wird als "LED Controller" bezeichnet, kann aber auch Servomotoren ansteuern.

Der Chip ist nur in einem 28-poligen SMT-Gehäuse verfügbar. Sie müssen ihn entweder auf einen SMT-Adapter löten oder ein vorgefertigtes Modul verwenden (z.B. 16-Channel Servo Driver Interface von Adafruit, siehe rechts).

servomot7

Ziel:
Verbinden Sie einen Servermotor mit dem Kanal 0 des PCA9685 Moduls und führen Sie die gleiche Aktion wie im vorhergehenden Beispiel aus.

Um die Programmierung zu vereinfachen, wird hier ein kleines Bibliotheksmodul PCA9685.py verwendet (das sich am Servotreiber von Adafruit orientiert). Sie können es von hier downloaden und müssen es in das gleiche Verzeichnis, in dem sich Ihr Programm befindet, kopieren.

Programm:[►]

# Servo2.py
# Two servo motors driven by PCA9685 chip

from smbus import SMBus
from PCA9685 import PWM
import time

fPWM = 50
i2c_address = 0x40 # (standard) adapt to your module
channel = 0 # adapt to your wiring
a = 8.5 # adapt to your servo
b = 2  # adapt to your servo

def setup():
    global pwm
    bus = SMBus(1) # Raspberry Pi revision 2
    pwm = PWM(bus, i2c_address)
    pwm.setFreq(fPWM)

def setDirection(direction):
    duty = a / 180 * direction + b
    pwm.setDuty(channel, duty)
    print "direction =", direction, "-> duty =", duty
    time.sleep(1) # allow to settle
   
print "starting"
setup()
for direction in range(0, 181, 10):
    setDirection(direction)
direction = 0    
setDirection(0)    
print "done"
  
Programmcode markieren (Ctrl+C kopieren, Ctrl+V einfügen)

Bemerkungen:
Die Parameter a und b müssen an den verwendeten Typ des Servomotors angepasst werden.

 

 

Experiment 3: Ein Roboterarm mit sechs Freiheitsgraden

 

Ein Roboterarm hat eine bestimmte Anzahl von Freiheitsgraden, um in eine vorgegebene Position zu fahren. Dazu werden oft Servomotoren (manchmal auch Schrittmotoren) eingesetzt.

Ziel:
Erstellen Sie unter Verwendung eines PCA9685-Breakout-Moduls eine einfache Demonstration mit einem billigen Roboterarm, der sechs Freiheitsgrade aufweist.

6DOF Mechanischer Roboter Arm
 
servomot8

 

(to be done)