Implement Motor, Robot and RyanteckRobot

This commit is contained in:
Ben Nuttall
2015-10-02 15:27:55 +01:00
parent 0e4caaaef6
commit dc34cf3ccf
3 changed files with 106 additions and 50 deletions

View File

@@ -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,
)

View File

@@ -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)

View File

@@ -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()