44# Adafruit_BBIO.Encoder.QEP Class
55# ===========================================================================
66
7+ # refers to graycatlabs/PyBBIO/bbio/libraries/RotaryEncoder/rotary_encoder.py
8+ # /sys/devices/platform/ocp/48302000.epwmss/48302180.eqep/position
9+ # /sys/devices/platform/ocp/48304000.epwmss/48304180.eqep/position
10+ # /sys/devices/platform/ocp/48300000.epwmss/48300180.eqep/position
11+
12+ import os
13+
14+
15+
716class QEP :
817
918 def __init__ (self , channel = 1 , debug = False ):
@@ -16,19 +25,158 @@ def errMsg(self):
1625
1726# example method from Adafruit_I2C
1827# TODO: delete this
19- def write8 (self , reg , value ):
20- "Writes an 8-bit value to the specified register/address"
21- try :
22- self .bus .write_byte_data (self .address , reg , value )
23- if self .debug :
24- print ("Rotary: Wrote 0x%02X to register 0x%02X" % (value , reg ))
25- except IOError as err :
26- return self .errMsg ()
27-
28-
29- if __name__ == '__main__' :
30- try :
31- qep = Adafruit_BBIO .Encoder .QEP ()
32- print ("Default QEP channel is accessible" )
33- except :
34- print ("Error accessing default Rotary bus" )
28+ # def write8(self, reg, value):
29+ # "Writes an 8-bit value to the specified register/address"
30+ # try:
31+ # self.bus.write_byte_data(self.address, reg, value)
32+ # if self.debug:
33+ # print("Rotary: Wrote 0x%02X to register 0x%02X" % (value, reg))
34+ # except IOError as err:
35+ # return self.errMsg()
36+ #
37+ #
38+ #if __name__ == '__main__':
39+ # try:
40+ # qep = Adafruit_BBIO.Encoder.QEP()
41+ # print("Default QEP channel is accessible")
42+ # except:
43+ # print("Error accessing default Rotary bus")
44+
45+
46+
47+ class RotaryEncoder (object ):
48+ OCP_PATH = "/sys/TEST/TODO/"
49+ _eqep_dirs = [
50+ '%s/48300000.epwmss/48300180.eqep' % OCP_PATH ,
51+ '%s/48302000.epwmss/48302180.eqep' % OCP_PATH ,
52+ '%s/48304000.epwmss/48304180.eqep' % OCP_PATH
53+ ]
54+ EQEP0 = 0
55+ EQEP1 = 1
56+ EQEP2 = 2
57+ EQEP2b = 3
58+
59+ def __init__ (self , eqep_num ):
60+ '''
61+ RotaryEncoder(eqep_num)
62+ Creates an instance of the class RotaryEncoder.
63+ eqep_num determines which eQEP pins are set up.
64+ eqep_num can be: EQEP0, EQEP1, EQEP2 or EQEP2b based on which pins \
65+ the rotary encoder is connected to.
66+ '''
67+ assert 0 <= eqep_num <= 3 , "eqep_num must be between 0 and 3"
68+ if eqep_num == 3 :
69+ overlay = "PyBBIO-eqep2b"
70+ eqep_num = 2
71+ else :
72+ overlay = 'PyBBIO-eqep%i' % eqep_num
73+
74+ pwmss_overlay = "PyBBIO-epwmss%i" % eqep_num
75+ #cape_manager.load(pwmss_overlay, auto_unload=False)
76+ delay (10 )
77+ #cape_manager.load(overlay, auto_unload=False)
78+ delay (250 ) # Give driver time to load
79+ self .base_dir = self ._eqep_dirs [eqep_num ]
80+ self .enable ()
81+ addToCleanup (self .disable )
82+
83+ def enable (self ):
84+ '''
85+ enable()
86+ Turns the eQEP hardware ON
87+ '''
88+ enable_file = "%s/enabled" % self .base_dir
89+ #return sysfs.kernelFileIO(enable_file, '1')
90+
91+ def disable (self ):
92+ '''
93+ disable()
94+ Turns the eQEP hardware OFF
95+ '''
96+ enable_file = "%s/enabled" % self .base_dir
97+ #return sysfs.kernelFileIO(enable_file, '0')
98+
99+ def setAbsolute (self ):
100+ '''
101+ setAbsolute()
102+ Set mode as Absolute
103+ The position starts at zero and is incremented or
104+ decremented by the encoder's movement
105+ '''
106+ mode_file = "%s/mode" % self .base_dir
107+ #return sysfs.kernelFileIO(mode_file, '0')
108+
109+ def setRelative (self ):
110+ '''
111+ setRelative()
112+ Set mode as Relative
113+ The position is reset when the unit timer overflows.
114+ '''
115+ mode_file = "%s/mode" % self .base_dir
116+ #return sysfs.kernelFileIO(mode_file, '1')
117+
118+ def getMode (self ):
119+ '''
120+ getMode()
121+ Returns the mode the eQEP hardware is in.
122+ '''
123+ mode_file = "%s/mode" % self .base_dir
124+ #return sysfs.kernelFileIO(mode_file)
125+
126+ def getPosition (self ):
127+ '''
128+ getPosition()
129+ Get the current position of the encoder.
130+ In absolute mode, this attribute represents the current position
131+ of the encoder.
132+ In relative mode, this attribute represents the position of the
133+ encoder at the last unit timer overflow.
134+ '''
135+ position_file = "%s/position" % self .base_dir
136+ #return sysfs.kernelFileIO(position_file)
137+
138+ def setFrequency (self ,freq ):
139+ '''
140+ setFrequency(freq)
141+ Set the frequency in Hz at which the driver reports new positions.
142+ '''
143+ period_file = "%s/period" % self .base_dir
144+ #return sysfs.kernelFileIO(period_file, str(1000000000/freq))
145+
146+ def setPosition (self ,val ):
147+ '''
148+ setPosition(value)
149+ Give a new value to the current position
150+ '''
151+ position_file = "%s/position" % self .base_dir
152+ #return sysfs.kernelFileIO(position_file, str(val))
153+
154+ def zero (self ):
155+ '''
156+ zero()s
157+ Set the current position to 0
158+ '''
159+ return self .setPosition (0 )
160+
161+
162+ #"""
163+ # encoder_test.py
164+ # Rekha Seethamraju
165+ # An example to demonstrate the use of the eQEP library
166+ # for PyBBIO.
167+ # This example program is in the public domain.
168+ #"""
169+ #from bbio import *
170+ #from bbio.libraries.RotaryEncoder import RotaryEncoder
171+ #
172+ #encoder = RotaryEncoder(RotaryEncoder.EQEP2b)
173+ #
174+ #def setup():
175+ # encoder.setAbsolute()
176+ # encoder.zero()
177+ #
178+ #def loop():
179+ # print "encoder position : "+encoder.getPosition()
180+ # delay(1000)
181+ #
182+ #run(setup, loop)
0 commit comments