From ee36451bed906b1653f8b22ab8a75d43bfac1862 Mon Sep 17 00:00:00 2001 From: Ben Nuttall Date: Wed, 7 Oct 2015 17:09:28 +0100 Subject: [PATCH] Make Motors PWM devices with optional speed argument on methods --- docs/boards.md | 10 ++-- docs/outputs.md | 4 +- gpiozero/boards.py | 105 ++++++++++++++++++++----------------- gpiozero/output_devices.py | 27 ++++++---- 4 files changed, 83 insertions(+), 63 deletions(-) diff --git a/docs/boards.md b/docs/boards.md index 61e6934..8cab639 100644 --- a/docs/boards.md +++ b/docs/boards.md @@ -253,11 +253,11 @@ robot = Robot(left=(4, 14), right=(17, 18)) | Method | Description | Arguments | | ------ | ----------- | --------- | -| `forward()` | Drive the robot forwards. | `seconds` - The number of seconds to drive for. If `None`, stay on. Default: `None` | -| `backward()` | Drive the robot backwards. | `seconds` - The number of seconds to drive for. If `None`, stay on. Default: `None` | -| `left()` | Make the robot turn left. | `seconds` - The number of seconds to turn for. If `None`, stay on. Default: `None` | -| `right()` | Make the robot turn right. | `seconds` - The number of seconds to turn for. If `None`, stay on. Default: `None` | -| `stop()` | Stop the robot. | None | +| `forward()` | Drive the robot forwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` | +| `backward()` | Drive the robot backwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` | +| `left()` | Make the robot turn left. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` | +| `right()` | Make the robot turn right. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` | +| `stop()` | Stop the robot. | None | ## Ryanteck MCB Robot diff --git a/docs/outputs.md b/docs/outputs.md index b133512..2e66fb3 100644 --- a/docs/outputs.md +++ b/docs/outputs.md @@ -161,6 +161,6 @@ motor = Motor(forward=17, back=18) | Method | Description | Arguments | | ------ | ----------- | --------- | -| `forward()` | Drive the motor forwards. | `seconds` - The number of seconds to stay on for. If `None`, stay on. Default: `None` | -| `backward()` | Drive the motor backwards. | `seconds` - The number of seconds to stay on for. If `None`, stay on. Default: `None` | +| `forward()` | Drive the motor forwards. | `speed` - Speed at which to drive the motor, `0` to `1`. Default: `1` | +| `backward()` | Drive the motor backwards. | `speed` - Speed at which to drive the motor, `0` to `1`. Default: `1` | | `stop()` | Stop the motor. | None | diff --git a/gpiozero/boards.py b/gpiozero/boards.py index bd3fe03..56cf730 100644 --- a/gpiozero/boards.py +++ b/gpiozero/boards.py @@ -229,65 +229,76 @@ class Robot(object): self._left = Motor(forward=left_forward, back=left_back) self._right = Motor(forward=right_forward, back=right_back) - def left(self, seconds=None): - """ - Make the robot turn left. If seconds given, stop after given number of - seconds. + self._min_pwm = self._left._min_pwm + self._max_pwm = self._left._max_pwm - seconds: `None` - Number of seconds to turn left for + def forward(self, speed=1): """ - self._left.forward() - self._right.backward() - if seconds is not None: - sleep(seconds) - self._left.stop() - self._right.stop() + Drive the robot forward. - def right(self, seconds=None): + speed: `1` + Speed at which to drive the motors, 0 to 1. """ - Make the robot turn right. If seconds given, stop after given number of - seconds. + self._left._backward.off() + self._right._backward.off() - seconds: `None` - Number of seconds to turn right for - """ - self._right.forward() - self._left.backward() - if seconds is not None: - sleep(seconds) - self._left.stop() - self._right.stop() + self._left._forward.on() + self._right._forward.on() + if speed < 1: + sleep(0.1) # warm up the motors + self._left._forward.value = speed + self._right._forward.value = speed - def forward(self, seconds=None): + def backward(self, speed=1): """ - Drive the robot forward. If seconds given, stop after given number of - seconds. + Drive the robot backward. - seconds: `None` - Number of seconds to drive forward for + speed: `1` + Speed at which to drive the motors, 0 to 1. """ - self._left.forward() - self._right.forward() - if seconds is not None: - sleep(seconds) - self._left.stop() - self._right.stop() + self._left._forward.off() + self._right._forward.off() - def backward(self, seconds=None): - """ - Drive the robot backward. If seconds given, stop after given number of - seconds. + self._left._backward.on() + self._right._backward.on() + if speed < 1: + sleep(0.1) # warm up the motors + self._left._backward.value = speed + self._right._backward.value = speed - seconds: `None` - Number of seconds to drive backward for + def left(self, speed=1): """ - self._left.backward() - self._right.backward() - if seconds is not None: - sleep(seconds) - self._left.stop() - self._right.stop() + Make the robot turn left. + + speed: `1` + Speed at which to drive the motors, 0 to 1. + """ + self._right._backward.off() + self._left._forward.off() + + self._right._forward.on() + self._left._backward.on() + if speed < 1: + sleep(0.1) # warm up the motors + self._right._forward.value = speed + self._left._backward.value = speed + + def right(self, speed=1): + """ + Make the robot turn right. + + speed: `1` + Speed at which to drive the motors, 0 to 1. + """ + self._left._backward.off() + self._right._forward.off() + + self._left._forward.on() + self._right._backward.on() + if speed < 1: + sleep(0.1) # warm up the motors + self._left._forward.value = speed + self._right._backward.value = speed def stop(self): """ diff --git a/gpiozero/output_devices.py b/gpiozero/output_devices.py index 966c7ed..6fda82a 100644 --- a/gpiozero/output_devices.py +++ b/gpiozero/output_devices.py @@ -195,7 +195,7 @@ class PWMOutputDevice(DigitalOutputDevice): def value(self, n): _min = self._min_pwm _max = self._max_pwm - if _min >= n >= _max: + if _min <= n <= _max: n *= 100 else: raise GPIODeviceError( @@ -289,22 +289,31 @@ class Motor(object): if not all([forward, back]): raise GPIODeviceError('forward and back pins must be provided') - self._forward = OutputDevice(forward) - self._backward = OutputDevice(back) + self._forward = PWMOutputDevice(forward) + self._backward = PWMOutputDevice(back) - def forward(self): + self._min_pwm = self._forward._min_pwm + self._max_pwm = self._forward._max_pwm + + def forward(self, speed=1): """ Drive the motor forwards """ - self._forward.on() - self._backward.off() + self._backward.value = self._min_pwm + self._forward.value = self._max_pwm + if speed < 1: + sleep(0.1) # warm up the motor + self._forward.value = speed - def backward(self): + def backward(self, speed=1): """ Drive the motor backwards """ - self._backward.on() - self._forward.off() + self._forward.value = self._min_pwm + self._backward.value = self._max_pwm + if speed < 1: + sleep(0.1) # warm up the motor + self._backward.value = speed def stop(self): """