Make Motors PWM devices with optional speed argument on methods

This commit is contained in:
Ben Nuttall
2015-10-07 17:09:28 +01:00
parent 65b5ba9ea6
commit ee36451bed
4 changed files with 83 additions and 63 deletions

View File

@@ -253,11 +253,11 @@ robot = Robot(left=(4, 14), right=(17, 18))
| Method | Description | Arguments | | Method | Description | Arguments |
| ------ | ----------- | --------- | | ------ | ----------- | --------- |
| `forward()` | Drive the robot forwards. | `seconds` - The number of seconds to drive for. If `None`, stay on. Default: `None` | | `forward()` | Drive the robot forwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
| `backward()` | Drive the robot backwards. | `seconds` - The number of seconds to drive for. If `None`, stay on. Default: `None` | | `backward()` | Drive the robot backwards. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
| `left()` | Make the robot turn left. | `seconds` - The number of seconds to turn for. If `None`, stay on. Default: `None` | | `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. | `seconds` - The number of seconds to turn for. If `None`, stay on. Default: `None` | | `right()` | Make the robot turn right. | `speed` - Speed at which to drive the motors, `0` to `1`. Default: `1` |
| `stop()` | Stop the robot. | None | | `stop()` | Stop the robot. | None |
## Ryanteck MCB Robot ## Ryanteck MCB Robot

View File

@@ -161,6 +161,6 @@ motor = Motor(forward=17, back=18)
| Method | Description | Arguments | | Method | Description | Arguments |
| ------ | ----------- | --------- | | ------ | ----------- | --------- |
| `forward()` | Drive the motor forwards. | `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. | `seconds` - The number of seconds to stay on for. If `None`, stay on. Default: `None` | | `backward()` | Drive the motor backwards. | `speed` - Speed at which to drive the motor, `0` to `1`. Default: `1` |
| `stop()` | Stop the motor. | None | | `stop()` | Stop the motor. | None |

View File

@@ -229,65 +229,76 @@ class Robot(object):
self._left = Motor(forward=left_forward, back=left_back) self._left = Motor(forward=left_forward, back=left_back)
self._right = Motor(forward=right_forward, back=right_back) self._right = Motor(forward=right_forward, back=right_back)
def left(self, seconds=None): self._min_pwm = self._left._min_pwm
""" self._max_pwm = self._left._max_pwm
Make the robot turn left. If seconds given, stop after given number of
seconds.
seconds: `None` def forward(self, speed=1):
Number of seconds to turn left for
""" """
self._left.forward() Drive the robot forward.
self._right.backward()
if seconds is not None:
sleep(seconds)
self._left.stop()
self._right.stop()
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 self._left._backward.off()
seconds. self._right._backward.off()
seconds: `None` self._left._forward.on()
Number of seconds to turn right for self._right._forward.on()
""" if speed < 1:
self._right.forward() sleep(0.1) # warm up the motors
self._left.backward() self._left._forward.value = speed
if seconds is not None: self._right._forward.value = speed
sleep(seconds)
self._left.stop()
self._right.stop()
def forward(self, seconds=None): def backward(self, speed=1):
""" """
Drive the robot forward. If seconds given, stop after given number of Drive the robot backward.
seconds.
seconds: `None` speed: `1`
Number of seconds to drive forward for Speed at which to drive the motors, 0 to 1.
""" """
self._left.forward() self._left._forward.off()
self._right.forward() self._right._forward.off()
if seconds is not None:
sleep(seconds)
self._left.stop()
self._right.stop()
def backward(self, seconds=None): self._left._backward.on()
""" self._right._backward.on()
Drive the robot backward. If seconds given, stop after given number of if speed < 1:
seconds. sleep(0.1) # warm up the motors
self._left._backward.value = speed
self._right._backward.value = speed
seconds: `None` def left(self, speed=1):
Number of seconds to drive backward for
""" """
self._left.backward() Make the robot turn left.
self._right.backward()
if seconds is not None: speed: `1`
sleep(seconds) Speed at which to drive the motors, 0 to 1.
self._left.stop() """
self._right.stop() 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): def stop(self):
""" """

View File

@@ -195,7 +195,7 @@ class PWMOutputDevice(DigitalOutputDevice):
def value(self, n): def value(self, n):
_min = self._min_pwm _min = self._min_pwm
_max = self._max_pwm _max = self._max_pwm
if _min >= n >= _max: if _min <= n <= _max:
n *= 100 n *= 100
else: else:
raise GPIODeviceError( raise GPIODeviceError(
@@ -289,22 +289,31 @@ class Motor(object):
if not all([forward, back]): if not all([forward, back]):
raise GPIODeviceError('forward and back pins must be provided') raise GPIODeviceError('forward and back pins must be provided')
self._forward = OutputDevice(forward) self._forward = PWMOutputDevice(forward)
self._backward = OutputDevice(back) 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 Drive the motor forwards
""" """
self._forward.on() self._backward.value = self._min_pwm
self._backward.off() 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 Drive the motor backwards
""" """
self._backward.on() self._forward.value = self._min_pwm
self._forward.off() self._backward.value = self._max_pwm
if speed < 1:
sleep(0.1) # warm up the motor
self._backward.value = speed
def stop(self): def stop(self):
""" """