Servo

Was ist das?

Ein Servo besteht aus zwei Komponenten. Zum Einen aus einem DC-Motor, der für das benötigte Drehmoment sorgt. Zum Anderen aus einem Dreh-Potentiometer, welches den IST-Winkel der Drehachse bestimmt. Bei den drei Anschlüssen des Servos handelt es sich um GND, eine Eingangsspannung (diese hängt vom Bedarf des Servos ab) und dem PWM-Signal. Über dieses Signal wird der SOLL-Winkel an den Servo gesendet. Durch den Vergleich von IST- und SOLL-Winkel wird eine etwaige Korrektur des Winkels per DC-Motorleistung ermöglicht. PWM (Pulsweitenmodulation): Es wird eine Periodenlänge beliebig festgelegt. Innerhalb dieser Periode liegt nur eine bestimmte Zeit lang Strom an, für den Rest der Periode liegt die Spannung bei 0V. Der Teil der Periode, in welchem Strom anliegt, wird prozentual angegeben und „Duty Cycle“ genannt.

Bild

Schaltplan

CODE

Servo.py
import RPi.GPIO as GPIO
import time
import os
 
GPIO.setwarnings (False)		#So deaktivieren wir Bildschirmwarnungen
GPIO.setmode(GPIO.BOARD)		#Deklaration der GPIO Pins auf die des Boards
GPIO.setup(11, GPIO.OUT)		#Pin Nr.11 als Ausgang einstellen
 
print "L = Nach links drehen"	#Anlegen eines Menues
print "R = Nach rechts drehen"
print "M = Mittelposition"
print "Q = Verlassen"
 
 
While True:					#eigentliche Programmschleife
   Servo = GPIO.PWM(11, 50)		#PWM-Signal mit 50Hz starten	
   Servo.start(5)			
   input = raw_input("Auswahl: ")
 
   if(input == "r"):				#Nach rechts drehen
      Servo.ChangeDutyCycle(2.5)	#äußerst rechte Position einnehmen
      time.sleep(1)					#Warten
      Servo.stop()
 
   elif(input=="l"):				#Äquivalent für eine Drehung nach links
      Servo.ChangeDutyCycle(12.5)
      time.sleep(1)
      Servo.stop()
 
      elif(input=="m"):				#Drehung in die Mittelposition
      Servo.ChangeDutyCycle(5)      #Servo in Mittelposition bringen
      time.sleep(1)
      Servo.stop()
 
   elif(input=="q")			#Programm schliessen und in die Shell zurueckkehren
      print("Programm schliessen")	
      os._exit(1)
      Servo.stop()
      GPIO.cleanup()				#GPIO Belegungen löschen
   else:
      print "ungueltige Eingabe"