-
Notifications
You must be signed in to change notification settings - Fork 0
/
motor.py
164 lines (141 loc) · 4.91 KB
/
motor.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
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
# ******************************************************************
# Program: bot.py
#
# Programmer: Christopher Jones
#
# Due Date: April 30, 2020
#
# EGRE 347, Spring 2020 Instructor: Robert Klenke
#
# Pledge: I have neither given nor received unauthorized aid on this program.
#
# Description: Defines class for controlling the L298N Dual H-Bridge DC motor controller;
# A commonly available motor controller topology.
#
# ******************************************************************
import RPi.GPIO as GPIO
# L298N Motor Driver Class
class L298N:
def __init__(self):
"""
Initializes the motor controller object
Initializes the motor controller object. Asinges default values to the GPIO pins used to
communicate with the L298N.
Parameters:
N/A
Returns:
N/A
"""
self.ena = 12 # Set pin number for PWM to motor A
self.in1 = 5 # Set pin number for digital IN1
self.in2 = 6 # Set pin number for digital IN2
self.enb = 13 # Set pin number for PWM to motor B
self.in3 = 20 # Set pin number for digital IN3
self.in4 = 21 # Set pin number for digital IN4
self.PWMf = 1000 # Set PWM frequency (Hz)
GPIO.setmode(GPIO.BCM) # Set GPIO pins to correspond with processor pin numbers
# Set all of the pins as outputs
GPIO.setup(self.ena, GPIO.OUT)
GPIO.setup(self.in1, GPIO.OUT)
GPIO.setup(self.in2, GPIO.OUT)
GPIO.setup(self.enb, GPIO.OUT)
GPIO.setup(self.in3, GPIO.OUT)
GPIO.setup(self.in4, GPIO.OUT)
# Define the enable pins as PWM. The default pins support hardware PWM.
self.spa = GPIO.PWM(self.ena, self.PWMf)
self.spb = GPIO.PWM(self.enb, self.PWMf)
# Start PWM at zero percent duty cycle
self.spa.start(0)
self.spb.start(0)
def forward(self, speed):
"""
Drive straight forward
:param speed: percentage value for wheel speed
:return: void
"""
GPIO.output(self.in1, GPIO.LOW)
GPIO.output(self.in2, GPIO.HIGH)
GPIO.output(self.in3, GPIO.HIGH)
GPIO.output(self.in4, GPIO.LOW)
self.spa.ChangeDutyCycle(speed)
self.spb.ChangeDutyCycle(speed)
def turn_l(self, speed, turn_rate):
"""
Turn left while driving forward
:param speed: percentage value for right wheel speed
:param turn_rate: percentage value for left wheel speed
:return: void
"""
GPIO.output(self.in1, GPIO.LOW)
GPIO.output(self.in2, GPIO.HIGH)
GPIO.output(self.in3, GPIO.HIGH)
GPIO.output(self.in4, GPIO.LOW)
self.spa.ChangeDutyCycle(turn_rate)
self.spb.ChangeDutyCycle(speed)
def turn_r(self, speed, turn_rate):
"""
Turn right while moving forward
:param speed: percentage value for left wheel speed
:param turn_rate: percentage value for right wheel speed
:return: void
"""
GPIO.output(self.in1, GPIO.LOW)
GPIO.output(self.in2, GPIO.HIGH)
GPIO.output(self.in3, GPIO.HIGH)
GPIO.output(self.in4, GPIO.LOW)
self.spa.ChangeDutyCycle(speed)
self.spb.ChangeDutyCycle(turn_rate)
def reverse(self, speed):
"""
Drive in reverse
:param speed: percentage value for wheel speed
:return: void
"""
GPIO.output(self.in1, GPIO.HIGH)
GPIO.output(self.in2, GPIO.LOW)
GPIO.output(self.in3, GPIO.LOW)
GPIO.output(self.in4, GPIO.HIGH)
self.spa.ChangeDutyCycle(speed)
self.spb.ChangeDutyCycle(speed)
def rotate_l(self, rate):
"""
Rotate in place counter clockwise
:param rate: percentage value for wheel speed
:return: void
"""
GPIO.output(self.in1, GPIO.HIGH)
GPIO.output(self.in2, GPIO.LOW)
GPIO.output(self.in3, GPIO.HIGH)
GPIO.output(self.in4, GPIO.LOW)
self.spa.ChangeDutyCycle(rate)
self.spb.ChangeDutyCycle(rate)
def rotate_r(self, rate):
"""
Rotate in place clockwise
:param rate: percentage value for wheel speed
:return: void
"""
GPIO.output(self.in1, GPIO.LOW)
GPIO.output(self.in2, GPIO.HIGH)
GPIO.output(self.in3, GPIO.LOW)
GPIO.output(self.in4, GPIO.HIGH)
self.spa.ChangeDutyCycle(rate)
self.spb.ChangeDutyCycle(rate)
return
def stop_car(self):
"""
Stop movement
:return: void
"""
self.spa.ChangeDutyCycle(0)
self.spb.ChangeDutyCycle(0)
GPIO.output(self.in1, GPIO.LOW)
GPIO.output(self.in2, GPIO.LOW)
GPIO.output(self.in3, GPIO.LOW)
GPIO.output(self.in4, GPIO.LOW)
def shutdown(self):
"""
Clean up GPIO associated with the motor driver
:return: void
"""
GPIO.cleanup()