From dc34cf3ccf5a2b8a6b75c9eb6bb1a74db681a1a9 Mon Sep 17 00:00:00 2001 From: Ben Nuttall Date: Fri, 2 Oct 2015 15:27:55 +0100 Subject: [PATCH] Implement Motor, Robot and RyanteckRobot --- gpiozero/__init__.py | 3 +- gpiozero/boards.py | 87 +++++++++++++++++++++++++++++++++++++- gpiozero/output_devices.py | 66 ++++++++--------------------- 3 files changed, 106 insertions(+), 50 deletions(-) diff --git a/gpiozero/__init__.py b/gpiozero/__init__.py index 85e7088..fb01dce 100644 --- a/gpiozero/__init__.py +++ b/gpiozero/__init__.py @@ -19,7 +19,6 @@ from .output_devices import ( LED, Buzzer, Motor, - Robot, RGBLED, ) from .boards import ( @@ -29,4 +28,6 @@ from .boards import ( PiTraffic, FishDish, TrafficHat, + Robot, + RyanteckRobot, ) diff --git a/gpiozero/boards.py b/gpiozero/boards.py index 962d283..d40d58e 100644 --- a/gpiozero/boards.py +++ b/gpiozero/boards.py @@ -1,5 +1,5 @@ from .input_devices import Button -from .output_devices import LED, Buzzer +from .output_devices import LED, Buzzer, Motor from .devices import GPIODeviceError from time import sleep @@ -213,3 +213,88 @@ class TrafficHat(FishDish): self.buzzer = Buzzer(5) self.button = Button(25) self._all = self._leds + (self.buzzer,) + + +class Robot(object): + """ + Generic dual-motor Robot. + """ + def __init__(self, left=None, right=None): + if not all([left, right]): + raise GPIODeviceError('left and right motor pins must be provided') + + left_forward, left_back = left + right_forward, right_back = right + + self._left = Motor(forward=left_forward, back=left_back) + self._right = Motor(forward=right_forward, back=right_back) + + def left(self, seconds=None): + """ + Turn left. If seconds given, stop after given number of seconds. + + seconds: None + Number of seconds to turn left for + """ + self._left.forward() + self._right.backward() + if seconds is not None: + sleep(seconds) + self._left.stop() + self._right.stop() + + def right(self, seconds=None): + """ + Turn right. If seconds given, stop after given number of seconds. + + 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() + + def forward(self, seconds=None): + """ + Drive forward. If seconds given, stop after given number of seconds. + + seconds: None + Number of seconds to drive forward for + """ + self._left.forward() + self._right.forward() + if seconds is not None: + sleep(seconds) + self._left.stop() + self._right.stop() + + def backward(self, seconds=None): + """ + Drive backward. If seconds given, stop after given number of seconds. + + seconds: None + Number of seconds to drive backward for + """ + self._left.backward() + self._right.backward() + if seconds is not None: + sleep(seconds) + self._left.stop() + self._right.stop() + + def stop(self): + """ + Stop both motors. + """ + self._left.stop() + self._right.stop() + + +class RyanteckRobot(Robot): + def __init__(self): + left = (17, 18) + right = (22, 23) + super(RyanteckRobot, self).__init__(left=left, right=right) diff --git a/gpiozero/output_devices.py b/gpiozero/output_devices.py index 4ad99d6..5015bf9 100644 --- a/gpiozero/output_devices.py +++ b/gpiozero/output_devices.py @@ -243,64 +243,34 @@ class RGBLED(object): self._blue.value = b -class Motor(OutputDevice): +class Motor(object): """ - Generic single-direction motor. + Generic bi-directional motor. """ - pass + def __init__(self, forward=None, back=None): + if not all([forward, back]): + raise GPIODeviceError('forward and back pins must be provided') + self._forward = OutputDevice(forward) + self._backward = OutputDevice(back) -class Robot(object): - """ - Generic single-direction dual-motor Robot. - """ - def __init__(self, left=None, right=None): - if not all([left, right]): - raise GPIODeviceError('left and right pins must be provided') - - self._left = Motor(left) - self._right = Motor(right) - - def left(self, seconds=None): + def forward(self): """ - Turns left for a given number of seconds. - - seconds: None - Number of seconds to turn left for + Turn the motor on, forwards """ - self._left.on() - if seconds is not None: - sleep(seconds) - self._left.off() + self._forward.on() + self._backward.off() - def right(self, seconds=None): + def backward(self): """ - Turns right for a given number of seconds. - - seconds: None - Number of seconds to turn right for + Turn the motor on, backwards """ - self._right.on() - if seconds is not None: - sleep(seconds) - self._right.off() - - def forwards(self, seconds=None): - """ - Drives forward for a given number of seconds. - - seconds: None - Number of seconds to drive forward for - """ - self.left() - self.right() - if seconds is not None: - sleep(seconds) - self.stop() + self._backward.on() + self._forward.off() def stop(self): """ - Stops both motors. + Stop the motor """ - self._left.off() - self._right.off() + self._forward.off() + self._backward.off()