Alle Programme können von hier heruntergeladen werden. |
Wie funktioniert ein Servomotor? |
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:
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 |
Schaltung: 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" Bemerkungen:
|
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.
Ziel: 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" Bemerkungen: |
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:
(to be done) |