/
rotaryencoder_class.py
63 lines (53 loc) · 1.93 KB
/
rotaryencoder_class.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
from serialComm_class import serialComm_class
class rotaryencoder_class:
def __init__(self, PPR):
self.__angle = None #angle of the rotary encoder
self.s = None #serialComm_class object
self.PPR = PPR #pulses per revolution
self.__offset = float(0)
self.setupDone = False #whether or not setup is done
return None
def setup(self, portName, baudrate):
self.s = serialComm_class()
if self.s.setup(portName, baudrate) == False: #check if setup successfully done
return False
self.__angle = float(0)
self.setupDone = True
return True
def setZero(self):
if self.setupDone == False: #if setup was not done
return False
self.setAngle(0.0)
return True
def setAngle(self, angle):
if self.setupDone == False:
return False
self.updateAngle()
self.__offset += -1.0 * (self.__angle - angle) #NOT self.__offset = -1.0 * (self.__angle - angle)
self.__angle = angle
return True
def updateAngle(self):
if self.setupDone == False: #if setup was not done
return False
r = [] #array to hold result from s.retrieve
try:
r = self.s.retrieve()
except:
self.s.closePort()
return False
if len(r) != 2:
return False
if r[0] == False:
return False
#encoder returns 16 bit unsigned integer (in string form)
try:
temp = int(r[1])
except:
return False
#change into signed integer
if 2**15 < temp and temp < 2**16:
temp = (2**16 - temp) * -1
self.__angle = (float(360) * temp / self.PPR) + self.__offset
return True
def getAngle(self):
return self.__angle