Skip to content

Commit 8034440

Browse files
committed
Rotary encoder test scripts
1 parent 906bc95 commit 8034440

7 files changed

+323
-0
lines changed

rotary_encoder_test/reset_motors.py

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
import pigpio
2+
3+
pi = pigpio.pi()
4+
pi.write(24, 0)
5+
pi.write(17, 0)

rotary_encoder_test/rotary_encoder.py

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,42 @@
1+
#!/usr/bin/env python
2+
3+
import pigpio
4+
5+
class decoder:
6+
7+
"""Class to decode mechanical rotary encoder pulses."""
8+
9+
def __init__(self, pi, gpioB, callback):
10+
11+
self.pi = pi
12+
self.gpioB = gpioB
13+
self.callback = callback
14+
15+
self.levB = 0
16+
17+
self.lastGpio = None
18+
19+
self.pi.set_mode(gpioB, pigpio.INPUT)
20+
21+
self.pi.set_pull_up_down(gpioB, pigpio.PUD_UP)
22+
23+
self.cbB = self.pi.callback(gpioB, pigpio.EITHER_EDGE, self._pulse)
24+
25+
def _pulse(self, gpio, level, tick):
26+
self.levB = level;
27+
28+
#if gpio != self.lastGpio: # debounce
29+
# self.lastGpio = gpio
30+
if self.levB == 1:
31+
self.callback(1)
32+
33+
34+
def cancel(self):
35+
36+
"""
37+
Cancel the rotary encoder decoder.
38+
"""
39+
40+
self.cbB.cancel()
41+
42+
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
PIN_LEFT_FORWARD = 24
2+
PIN_LEFT_BACKWARD = 25
3+
PIN_RIGHT_FORWARD = 17
4+
PIN_RIGHT_BACKWARD = 4
5+
PIN_MOTOR_ENABLE = 22
6+
7+
PWM_FREQUENCY = 100 #Hz
8+
PWM_RANGE = 100 #0-100
9+
10+
if __name__ == "__main__":
11+
12+
import time
13+
import pigpio
14+
15+
#pi = pigpio.pi('coderbot.local')
16+
pi = pigpio.pi()
17+
print("Connected, waiting for signal")
18+
19+
# FORWARD MOVEMENT
20+
print("FORWARD")
21+
pi.set_PWM_frequency(PIN_LEFT_FORWARD, PWM_FREQUENCY)
22+
pi.set_PWM_range(PIN_LEFT_FORWARD, PWM_RANGE)
23+
pi.set_PWM_frequency(PIN_RIGHT_FORWARD, PWM_FREQUENCY)
24+
pi.set_PWM_range(PIN_RIGHT_FORWARD, PWM_RANGE)
25+
26+
pi.write(PIN_MOTOR_ENABLE, 1)
27+
28+
pi.set_PWM_dutycycle(PIN_LEFT_FORWARD, 100)
29+
pi.set_PWM_dutycycle(PIN_RIGHT_FORWARD, 100)
30+
31+
time.sleep(.5)
32+
33+
print("STOP")
34+
pi.write(PIN_LEFT_FORWARD, 0)
35+
pi.write(PIN_RIGHT_FORWARD, 0)
36+
37+
# BACKWARDS MOVEMENT
38+
print("BACKWARDS")
39+
pi.set_PWM_frequency(PIN_LEFT_BACKWARD, PWM_FREQUENCY)
40+
pi.set_PWM_range(PIN_LEFT_BACKWARD, PWM_RANGE)
41+
pi.set_PWM_frequency(PIN_RIGHT_BACKWARD, PWM_FREQUENCY)
42+
pi.set_PWM_range(PIN_RIGHT_BACKWARD, PWM_RANGE)
43+
44+
pi.set_PWM_dutycycle(PIN_LEFT_BACKWARD, 100)
45+
pi.set_PWM_dutycycle(PIN_RIGHT_BACKWARD, 100)
46+
47+
time.sleep(.5)
48+
49+
print("STOP")
50+
pi.write(PIN_LEFT_BACKWARD, 0)
51+
pi.write(PIN_RIGHT_BACKWARD, 0)
52+
53+
pi.stop()
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
PIN_LEFT_FORWARD = 24
2+
PIN_LEFT_BACKWARD = 25
3+
PIN_RIGHT_FORWARD = 17
4+
PIN_RIGHT_BACKWARD = 4
5+
PIN_ENCODER_LEFT = 15
6+
PIN_ENCODER_RIGHT = 14
7+
8+
PIN_MOTOR_ENABLE = 22
9+
PWM_FREQUENCY = 100 #Hz
10+
PWM_RANGE = 100 #0-100
11+
12+
if __name__ == "__main__":
13+
14+
import time
15+
import pigpio
16+
import signal
17+
18+
import rotary_encoder
19+
20+
pos = 0
21+
22+
def callback_left(way):
23+
global pos
24+
pos += way
25+
26+
print("You've travelled: " + str(0.196 * pos) + "mm, ticks: " + str(pos))
27+
28+
pi = pigpio.pi()
29+
30+
decoder_left = rotary_encoder.decoder(pi, PIN_ENCODER_LEFT, callback_left)
31+
32+
# FORWARD MOVEMENT
33+
print("GOING FORWARD")
34+
pi.set_PWM_frequency(PIN_LEFT_FORWARD, PWM_FREQUENCY)
35+
pi.set_PWM_range(PIN_LEFT_FORWARD, PWM_RANGE)
36+
pi.set_PWM_frequency(PIN_RIGHT_FORWARD, PWM_FREQUENCY)
37+
pi.set_PWM_range(PIN_RIGHT_FORWARD, PWM_RANGE)
38+
39+
pi.write(PIN_MOTOR_ENABLE, 1)
40+
41+
pi.set_PWM_dutycycle(PIN_LEFT_FORWARD, 30)
42+
pi.set_PWM_dutycycle(PIN_RIGHT_FORWARD, 30)
43+
44+
signal.pause()
45+
46+
if(pos > 100):
47+
print("STOP")
48+
pi.write(PIN_LEFT_FORWARD, 0)
49+
pi.write(PIN_RIGHT_FORWARD, 0)
50+
decoder.cancel()
51+
pi.stop()
52+
53+
Lines changed: 109 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,109 @@
1+
#!/usr/bin/env python
2+
3+
import pigpio
4+
5+
class decoder:
6+
7+
"""Class to decode mechanical rotary encoder pulses."""
8+
9+
def __init__(self, pi, gpioA, gpioB, callback):
10+
11+
"""
12+
Instantiate the class with the pi and gpios connected to
13+
rotary encoder contacts A and B. The common contact
14+
should be connected to ground. The callback is
15+
called when the rotary encoder is turned. It takes
16+
one parameter which is +1 for clockwise and -1 for
17+
counterclockwise.
18+
19+
EXAMPLE
20+
21+
import time
22+
import pigpio
23+
24+
import rotary_encoder
25+
26+
pos = 0
27+
28+
def callback(way):
29+
30+
global pos
31+
32+
pos += way
33+
34+
print("pos={}".format(pos))
35+
36+
pi = pigpio.pi()
37+
38+
decoder = rotary_encoder.decoder(pi, 7, 8, callback)
39+
40+
time.sleep(300)
41+
42+
decoder.cancel()
43+
44+
pi.stop()
45+
46+
"""
47+
48+
self.pi = pi
49+
self.gpioA = gpioA
50+
self.gpioB = gpioB
51+
self.callback = callback
52+
53+
self.levA = 0
54+
self.levB = 0
55+
56+
self.lastGpio = None
57+
58+
self.pi.set_mode(gpioA, pigpio.INPUT)
59+
self.pi.set_mode(gpioB, pigpio.INPUT)
60+
61+
self.pi.set_pull_up_down(gpioA, pigpio.PUD_UP)
62+
self.pi.set_pull_up_down(gpioB, pigpio.PUD_UP)
63+
64+
self.cbA = self.pi.callback(gpioA, pigpio.EITHER_EDGE, self._pulse)
65+
self.cbB = self.pi.callback(gpioB, pigpio.EITHER_EDGE, self._pulse)
66+
67+
def _pulse(self, gpio, level, tick):
68+
69+
"""
70+
Decode the rotary encoder pulse.
71+
72+
+---------+ +---------+ 0
73+
| | | |
74+
A | | | |
75+
| | | |
76+
+---------+ +---------+ +----- 1
77+
78+
+---------+ +---------+ 0
79+
| | | |
80+
B | | | |
81+
| | | |
82+
----+ +---------+ +---------+ 1
83+
"""
84+
85+
if gpio == self.gpioA:
86+
self.levA = level
87+
else:
88+
self.levB = level;
89+
90+
if gpio != self.lastGpio: # debounce
91+
self.lastGpio = gpio
92+
93+
if gpio == self.gpioA and level == 1:
94+
if self.levB == 1:
95+
self.callback(1)
96+
elif gpio == self.gpioB and level == 1:
97+
if self.levA == 1:
98+
self.callback(-1)
99+
100+
def cancel(self):
101+
102+
"""
103+
Cancel the rotary encoder decoder.
104+
"""
105+
106+
self.cbA.cancel()
107+
self.cbB.cancel()
108+
109+
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
PIN_ENCODER_LEFT = 15
2+
PIN_ENCODER_RIGHT = 14
3+
4+
import time
5+
import pigpio
6+
7+
#pi = pigpio.pi('coderbot.local')
8+
pi = pigpio.pi()
9+
10+
print("connected")
11+
12+
pi.set_mode(PIN_ENCODER_LEFT, pigpio.INPUT)
13+
pi.set_mode(PIN_ENCODER_RIGHT, pigpio.INPUT)
14+
15+
pi.set_pull_up_down(PIN_ENCODER_LEFT, pigpio.PUD_UP)
16+
pi.set_pull_up_down(PIN_ENCODER_RIGHT, pigpio.PUD_UP)
17+
18+
19+
while(True):
20+
print("[ LEFT: " + str(pi.read(PIN_ENCODER_LEFT)) + ", RIGHT: " + str(pi.read(PIN_ENCODER_RIGHT)) + " ]")
Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,41 @@
1+
PIN_ENCODER_LEFT = 15
2+
PIN_ENCODER_RIGHT = 14
3+
4+
if __name__ == "__main__":
5+
6+
import time
7+
import pigpio
8+
9+
import rotary_encoder
10+
11+
pos_left = 0
12+
pos_right = 0
13+
14+
def callback_left(way):
15+
16+
global pos_left
17+
18+
pos_left += way
19+
20+
print("Current ticks (left wheel)= {}".format(pos_left))
21+
22+
def callback_right(way):
23+
24+
global pos_right
25+
26+
pos_right += way
27+
28+
print("Current ticks (right wheel) = {}".format(pos_right))
29+
pi = pigpio.pi()
30+
31+
print("Rotary encoder ticks test (left wheel ONLY)")
32+
33+
decoder_left = rotary_encoder.decoder(pi, PIN_ENCODER_LEFT, callback_left)
34+
decoder_right = rotary_encoder.decoder(pi, PIN_ENCODER_RIGHT, callback_right)
35+
36+
time.sleep(300)
37+
38+
decoder.cancel()
39+
40+
pi.stop()
41+

0 commit comments

Comments
 (0)