mirror of
				https://github.com/KevinMidboe/python-gpiozero.git
				synced 2025-10-29 17:50:37 +00:00 
			
		
		
		
	Implement Motor, Robot and RyanteckRobot
This commit is contained in:
		@@ -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,
 | 
			
		||||
)
 | 
			
		||||
 
 | 
			
		||||
@@ -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)
 | 
			
		||||
 
 | 
			
		||||
@@ -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()
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user