import time
import serial
import itertools, sys
spinner = itertools.cycle(['-', '/', '|', '\\'])
stepsPerRevolution = float(14400)
def readWriteCommand(data):
assert 0 == ser.inWaiting(), 'Unexpected Data In Buffer'
ser.write(data)
result = ser.readline()
return result
def init():
ser.flushInput() #Mske sure buffer isn't dirty
readWriteCommand("I 1\r") #Set Variable Resolution mode
readWriteCommand("M 10 10\r") #Accel/Decel ramps
readWriteCommand("F 300\r") #Initial velocity
readWriteCommand("V 3000\r") #Final velocity
readWriteCommand("Z\r") #Absolute home @0
def moveToPosition(target):
strTarget = "%.2f" % (target)
readWriteCommand('@' + strTarget + '\r')
while isMoving():
sys.stdout.write(spinner.next()) # write the next character
sys.stdout.flush() # flush stdout buffer (actual character display)
sys.stdout.write('\b') # erase the last written char
def readCurrentPosition():
return readWriteCommand('C\r')[1:].strip()
def isMoving():
result = readWriteCommand("]\r")[1:].strip()
if result == '0':
return False
elif result == '1':
return True
else:
raise Exception('Unexpected response for isMoving')
def promptForNumberOfDivisions():
while True:
var = raw_input("Enter number of divisions (Positive integer):")
try:
var = int(var)
except:
continue;
if var > 0:
return var
def calculateNextTarget(numberOfDivisions, completedDivisions):
return stepsPerRevolution * float(completedDivisions) / float(numberOfDivisions)
ser = serial.Serial('/dev/ttyS0', 9600, timeout=5)
init()
divisions = promptForNumberOfDivisions()
print 'Processing ' + str(divisions) + ' divisions.'
completedDivisions = 0
while completedDivisions < divisions:
moveToPosition(calculateNextTarget(divisions, completedDivisions))
pos = readCurrentPosition()
degrees = float(pos)/40
print 'Position (from unit): ' + pos + ' Degrees: ' + str(degrees)
print 'Current Position: ' + str(completedDivisions + 1) + '/' + str(divisions)
raw_input('Press [enter] to proceed to next postition')
completedDivisions += 1
#Return to Zero position without reversing
moveToPosition(14400)
pos = readCurrentPosition()
degrees = float(pos)/40
print 'Position (from unit): ' + pos + ' Degrees: ' + str(degrees)
ser.close()