Servo Rotation

The servo can be turned clockwise, counter clockwise, and to the 90 degree position, but it lacks a way to query the current rotation. The rotation needs to be calculated manually and this script is a first attempt.

#!/usr/bin/env python

import RPi.GPIO as GPIO
import datetime
import time

servo_pin = 22
servo_pin2 = 18

# 60 degrees / 0.1seconds
servo_speed = 0.1

GPIO.setwarnings(False)
GPIO.setmode(GPIO.BOARD)

GPIO.setup(servo_pin, GPIO.OUT)
GPIO.setup(servo_pin2, GPIO.OUT)

last_time = datetime.datetime.now()
current_time = datetime.datetime.now()
sumTime = datetime.timedelta(0, 0)

accuracy = 0.01
targetRotation = 0
currentRotation = 90

pulse1 = GPIO.PWM(servo_pin, 50)
pulse2 = GPIO.PWM(servo_pin2, 50)

logTime = datetime.datetime.now()

def log(msg):
 global deltaTime
 global logTime
 if (logTime < datetime.datetime.now()):
  logTime = datetime.datetime.now() + datetime.timedelta(0, 0.5)
  print msg
 return

def reset(pulse):
 pulse.start(7.5);
 pulse.ChangeDutyCycle(7.5)
 return

def update(pulse, targetRotation):
 global deltaTime
 global sumTime
 global servo_speed
 global accuracy
 global currentRotation
 log ("TargetRotation: " + str(targetRotation) + " CurrentRotation: "+str(currentRotation))
 if (targetRotation == 90):
  pulse.ChangeDutyCycle(7.5)
  if ((currentRotation - targetRotation) < -accuracy):
   currentRotation += servo_speed
  elif ((currentRotation - targetRotation) > accuracy):
   currentRotation -= servo_speed
  else:
   pulse.ChangeDutyCycle(0)
 elif ((currentRotation - targetRotation) < -accuracy):
  pulse.ChangeDutyCycle(12.5)
  currentRotation += servo_speed
 elif ((currentRotation - targetRotation) > accuracy):
  pulse.ChangeDutyCycle(2.5)
  currentRotation -= servo_speed
 else:
  pulse.ChangeDutyCycle(0)
 return

try:
 reset(pulse1)
 reset(pulse2)
 time.sleep(1)
 print "setup complete"

 while True:
 
  last_time = current_time
  current_time = datetime.datetime.now()
  deltaTime = current_time - last_time;
  sumTime += deltaTime;

  if (sumTime.total_seconds() > 3.0):
   #print (sumTime)
   sumTime -= datetime.timedelta(0, 3)
   targetRotation = (targetRotation + 45) % 180

  update(pulse1, targetRotation);
  update(pulse2, targetRotation);

  time.sleep(0);

except KeyboardInterrupt:

 print '\r\nProgam complete.'
 GPIO.cleanup();