Skip to content

Commit ee36451

Browse files
committed
Make Motors PWM devices with optional speed argument on methods
1 parent 65b5ba9 commit ee36451

File tree

4 files changed

+80
-60
lines changed

4 files changed

+80
-60
lines changed

docs/boards.md

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -253,11 +253,11 @@ robot = Robot(left=(4, 14), right=(17, 18))
253253

254254
| Method | Description | Arguments |
255255
| ------ | ----------- | --------- |
256-
| `forward()` | Drive the robot forwards. | `seconds` - The number of seconds to drive for. If `None`, stay on. Default: `None` |
257-
| `backward()` | Drive the robot backwards. | `seconds` - The number of seconds to drive for. If `None`, stay on. Default: `None` |
258-
| `left()` | Make the robot turn left. | `seconds` - The number of seconds to turn for. If `None`, stay on. Default: `None` |
259-
| `right()` | Make the robot turn right. | `seconds` - The number of seconds to turn for. If `None`, stay on. Default: `None` |
260-
| `stop()` | Stop the robot. | None |
256+
| `forward()` | Drive the robot forwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
257+
| `backward()` | Drive the robot backwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
258+
| `left()` | Make the robot turn left. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
259+
| `right()` | Make the robot turn right. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
260+
| `stop()` | Stop the robot. | None |
261261

262262
## Ryanteck MCB Robot
263263

docs/outputs.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -161,6 +161,6 @@ motor = Motor(forward=17, back=18)
161161

162162
| Method | Description | Arguments |
163163
| ------ | ----------- | --------- |
164-
| `forward()` | Drive the motor forwards. | `seconds` - The number of seconds to stay on for. If `None`, stay on. Default: `None` |
165-
| `backward()` | Drive the motor backwards. | `seconds` - The number of seconds to stay on for. If `None`, stay on. Default: `None` |
164+
| `forward()` | Drive the motor forwards. | `speed` - Speed at which to drive the motor, `0` to `1`. Default: `1` |
165+
| `backward()` | Drive the motor backwards. | `speed` - Speed at which to drive the motor, `0` to `1`. Default: `1` |
166166
| `stop()` | Stop the motor. | None |

gpiozero/boards.py

Lines changed: 55 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -229,65 +229,76 @@ def __init__(self, left=None, right=None):
229229
self._left = Motor(forward=left_forward, back=left_back)
230230
self._right = Motor(forward=right_forward, back=right_back)
231231

232-
def left(self, seconds=None):
232+
self._min_pwm = self._left._min_pwm
233+
self._max_pwm = self._left._max_pwm
234+
235+
def forward(self, speed=1):
233236
"""
234-
Make the robot turn left. If seconds given, stop after given number of
235-
seconds.
237+
Drive the robot forward.
236238
237-
seconds: `None`
238-
Number of seconds to turn left for
239+
speed: `1`
240+
Speed at which to drive the motors, 0 to 1.
239241
"""
240-
self._left.forward()
241-
self._right.backward()
242-
if seconds is not None:
243-
sleep(seconds)
244-
self._left.stop()
245-
self._right.stop()
242+
self._left._backward.off()
243+
self._right._backward.off()
244+
245+
self._left._forward.on()
246+
self._right._forward.on()
247+
if speed < 1:
248+
sleep(0.1) # warm up the motors
249+
self._left._forward.value = speed
250+
self._right._forward.value = speed
246251

247-
def right(self, seconds=None):
252+
def backward(self, speed=1):
248253
"""
249-
Make the robot turn right. If seconds given, stop after given number of
250-
seconds.
254+
Drive the robot backward.
251255
252-
seconds: `None`
253-
Number of seconds to turn right for
256+
speed: `1`
257+
Speed at which to drive the motors, 0 to 1.
254258
"""
255-
self._right.forward()
256-
self._left.backward()
257-
if seconds is not None:
258-
sleep(seconds)
259-
self._left.stop()
260-
self._right.stop()
259+
self._left._forward.off()
260+
self._right._forward.off()
261+
262+
self._left._backward.on()
263+
self._right._backward.on()
264+
if speed < 1:
265+
sleep(0.1) # warm up the motors
266+
self._left._backward.value = speed
267+
self._right._backward.value = speed
261268

262-
def forward(self, seconds=None):
269+
def left(self, speed=1):
263270
"""
264-
Drive the robot forward. If seconds given, stop after given number of
265-
seconds.
271+
Make the robot turn left.
266272
267-
seconds: `None`
268-
Number of seconds to drive forward for
273+
speed: `1`
274+
Speed at which to drive the motors, 0 to 1.
269275
"""
270-
self._left.forward()
271-
self._right.forward()
272-
if seconds is not None:
273-
sleep(seconds)
274-
self._left.stop()
275-
self._right.stop()
276+
self._right._backward.off()
277+
self._left._forward.off()
276278

277-
def backward(self, seconds=None):
279+
self._right._forward.on()
280+
self._left._backward.on()
281+
if speed < 1:
282+
sleep(0.1) # warm up the motors
283+
self._right._forward.value = speed
284+
self._left._backward.value = speed
285+
286+
def right(self, speed=1):
278287
"""
279-
Drive the robot backward. If seconds given, stop after given number of
280-
seconds.
288+
Make the robot turn right.
281289
282-
seconds: `None`
283-
Number of seconds to drive backward for
290+
speed: `1`
291+
Speed at which to drive the motors, 0 to 1.
284292
"""
285-
self._left.backward()
286-
self._right.backward()
287-
if seconds is not None:
288-
sleep(seconds)
289-
self._left.stop()
290-
self._right.stop()
293+
self._left._backward.off()
294+
self._right._forward.off()
295+
296+
self._left._forward.on()
297+
self._right._backward.on()
298+
if speed < 1:
299+
sleep(0.1) # warm up the motors
300+
self._left._forward.value = speed
301+
self._right._backward.value = speed
291302

292303
def stop(self):
293304
"""

gpiozero/output_devices.py

Lines changed: 18 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -195,7 +195,7 @@ def value(self):
195195
def value(self, n):
196196
_min = self._min_pwm
197197
_max = self._max_pwm
198-
if _min >= n >= _max:
198+
if _min <= n <= _max:
199199
n *= 100
200200
else:
201201
raise GPIODeviceError(
@@ -289,22 +289,31 @@ def __init__(self, forward=None, back=None):
289289
if not all([forward, back]):
290290
raise GPIODeviceError('forward and back pins must be provided')
291291

292-
self._forward = OutputDevice(forward)
293-
self._backward = OutputDevice(back)
292+
self._forward = PWMOutputDevice(forward)
293+
self._backward = PWMOutputDevice(back)
294294

295-
def forward(self):
295+
self._min_pwm = self._forward._min_pwm
296+
self._max_pwm = self._forward._max_pwm
297+
298+
def forward(self, speed=1):
296299
"""
297300
Drive the motor forwards
298301
"""
299-
self._forward.on()
300-
self._backward.off()
302+
self._backward.value = self._min_pwm
303+
self._forward.value = self._max_pwm
304+
if speed < 1:
305+
sleep(0.1) # warm up the motor
306+
self._forward.value = speed
301307

302-
def backward(self):
308+
def backward(self, speed=1):
303309
"""
304310
Drive the motor backwards
305311
"""
306-
self._backward.on()
307-
self._forward.off()
312+
self._forward.value = self._min_pwm
313+
self._backward.value = self._max_pwm
314+
if speed < 1:
315+
sleep(0.1) # warm up the motor
316+
self._backward.value = speed
308317

309318
def stop(self):
310319
"""

0 commit comments

Comments
 (0)