-
Notifications
You must be signed in to change notification settings - Fork 0
/
elevation_controller_server.py
84 lines (69 loc) · 3.09 KB
/
elevation_controller_server.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import RPi.GPIO as GPIO
from stepper import Stepper
from SimpleXMLRPCServer import SimpleXMLRPCServer
class ElevationController:
DIRECTION_GPIO = 36
PULSE_GPIO = 32
# There are ~150 degrees between the two home sensors
HOME_DOWN_GPIO = 24
HOME_UP_GPIO = 26
MICROSTEPS = 400
GEAR_RATIO = 48
DOWN_DIRECTION = True
UP_DIRECTION = not DOWN_DIRECTION
BACKLASH_STEPS = 12
def __init__(self):
GPIO.setup(self.HOME_DOWN_GPIO, GPIO.IN, pull_up_down = GPIO.PUD_UP)
GPIO.setup(self.HOME_UP_GPIO, GPIO.IN, pull_up_down = GPIO.PUD_UP)
self.__stepper = Stepper(self.MICROSTEPS * self.GEAR_RATIO, self.DIRECTION_GPIO, self.PULSE_GPIO, self.BACKLASH_STEPS)
steps = 0
while self.is_home_down():
self.__stepper.pulse(self.UP_DIRECTION)
steps += 1
if (steps > self.__stepper.total_steps()):
raise ValueError("Cannot home the elevation stepper. It is likely not moving or the sensor is broken.")
while not self.is_home_down():
self.__stepper.pulse(self.DOWN_DIRECTION)
steps += 1
if (steps > self.__stepper.total_steps()):
raise ValueError("Cannot home the elevation stepper. It is likely not moving or the sensor is broken.")
steps = 0
self.__amplitude = 0
while not self.is_home_up():
self.__stepper.pulse(self.UP_DIRECTION)
steps += 1
self.__amplitude += 1
if (steps > self.__stepper.total_steps()):
raise ValueError("Cannot home the elevation stepper. It is likely not moving or the sensor is broken.")
self.__stepper.reset_position()
def is_home(self):
return self.is_home_down() or self.is_home_up()
def is_home_down(self):
return not GPIO.input(self.HOME_DOWN_GPIO)
def is_home_up(self):
return not GPIO.input(self.HOME_UP_GPIO)
def position(self):
position = float(self.__stepper.position()) / self.amplitude()
if position < 0 or position > 1:
raise ValueError("Invalid position about to be returned: " + position)
return position
def amplitude(self):
return self.__amplitude
def move_to(self, percentage_amplitude, max_delta = 1.0):
if percentage_amplitude < 0 or percentage_amplitude > 1:
raise ValueError("Percentage of amplitude must be between 0 and 1: " + str(percentage_amplitude))
steps = int((percentage_amplitude - self.position()) * self.amplitude())
max_steps = int(max_delta * self.amplitude())
direction = self.UP_DIRECTION if steps < 0 else self.DOWN_DIRECTION
self.__stepper.move(direction, min(abs(steps), max_steps))
return abs(steps) <= max_steps
# Initialization
GPIO.setmode(GPIO.BOARD)
GPIO.setwarnings(False)
print 'Initializing and homing the elevation controller...'
controller = ElevationController()
print 'Initializing the XML-RPC server...'
server = SimpleXMLRPCServer(("0.0.0.0", 8001))
server.register_instance(controller)
print 'Waiting for incoming requests...'
server.serve_forever()