-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathServoKit_Actuator.py
93 lines (78 loc) · 3.03 KB
/
ServoKit_Actuator.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
85
86
87
88
89
90
91
92
93
import time
import adafruit_servokit
class ServoKit(object):
default_angle = 90
panPort = 0
tiltPort = 1
tiltAngle = 90
panAngle = 90
def __init__(self, num_ports):
print(' ...Initializing "' + str(self) + '"...')
self.kit = adafruit_servokit.ServoKit(channels=16)
self.num_ports = num_ports
self.resetAll()
print("Initializing complete.")
def setAngle(self, port, angle):
if angle < 0:
self.kit.servo[port].angle = 0
elif angle > 180:
self.kit.servo[port].angle = 180
else:
self.kit.servo[port].angle = angle
def getAngle(self, port):
return self.kit.servo[port].angle
def reset(self, port):
self.kit.servo[port].angle = self.default_angle
def resetAll(self):
for i in range(self.num_ports):
self.kit.servo[i].angle = self.default_angle
def test(self):
servoKit = ServoKit(4)
print("Start ServoKit test")
for i in range(0,180, 5):
servoKit.setAngle(0, i)
servoKit.setAngle(2, i)
time.sleep(.05)
for i in range(180,0,-5):
servoKit.setAngle(0, i)
servoKit.setAngle(2, i)
time.sleep(.05)
for i in range(15,145, 5):
servoKit.setAngle(1, i)
servoKit.setAngle(3, i)
time.sleep(.05)
for i in range(145,15,-5):
servoKit.setAngle(1, i)
servoKit.setAngle(3, i)
time.sleep(.05)
servoKit.resetAll()
def setActuatorState(self, value):
# Value should contain a delmited command, which
# must be passed in one of the following forms:
# pan=+5 -- adds 5 degrees to the current pan angle...
# tilt=-5 -- subtracts 5 degrees tfromo the current tilt angle...
# pan=reset -- resets the pan to default angle...
# tilt=97 -- sets the tile angle to exactly 97 degrees...
cmdAction = value.split('=')
portToUse = -1
# Determine which port we're trying to access...
if cmdAction[0] == 'tilt':
portToUse = self.tiltPort
if cmdAction[0] == 'pan':
portToUse = self.panPort
# Determine the nature of the command we're trying to execute...
if str(cmdAction[1]) == "reset":
self.reset(portToUse)
if str(cmdAction[1]) == "test":
self.test()
if cmdAction[1].startswith('+') or cmdAction[1].startswith('-'):
currentAngle = self.getAngle(portToUse)
targetAngle = currentAngle + int(cmdAction[1])
self.setAngle(portToUse, targetAngle)
if cmdAction[1].isnumeric():
self.setAngle(portToUse, int(cmdAction[1]))
self.tiltAngle = self.getAngle(tiltPort)
self.panAngle = self.getAngle(panPort)
return { 'tilt' : str(self.tiltAngle), 'pan': str(self.panAngle) }
def getCurrentState(self):
return { 'tilt' : str(self.tiltAngle), 'pan': str(self.panAngle) }