diff --git a/gpiozero/boards.py b/gpiozero/boards.py index 3ff605a..dbd8ee4 100644 --- a/gpiozero/boards.py +++ b/gpiozero/boards.py @@ -776,6 +776,20 @@ class Robot(SourceMixin, CompositeDevice): right_motor=Motor(*right), _order=('left_motor', 'right_motor')) + @property + def value(self): + """ + Represents the motion of the robot as a tuple of (left_motor_speed, + right_motor_speed) with ``(-1, -1)`` representing full speed backwards, + ``(1, 1)`` representing full speed forwards, and ``(0, 0)`` + representing stopped. + """ + return super(Robot, self).value + + @value.setter + def value(self, value): + self.left_motor.value, self.right_motor.value = value + def forward(self, speed=1): """ Drive the robot forward by running both motors forward. diff --git a/tests/test_boards.py b/tests/test_boards.py index 9ce00f2..7562a5d 100644 --- a/tests/test_boards.py +++ b/tests/test_boards.py @@ -617,20 +617,34 @@ def test_robot(): assert ( [device.pin for device in robot.left_motor] + [device.pin for device in robot.right_motor]) == pins + assert robot.value == (0, 0) robot.forward() assert [pin.state for pin in pins] == [1, 0, 1, 0] + assert robot.value == (1, 1) robot.backward() assert [pin.state for pin in pins] == [0, 1, 0, 1] + assert robot.value == (-1, -1) robot.forward(0.5) assert [pin.state for pin in pins] == [0.5, 0, 0.5, 0] + assert robot.value == (0.5, 0.5) robot.left() assert [pin.state for pin in pins] == [0, 1, 1, 0] + assert robot.value == (-1, 1) robot.right() assert [pin.state for pin in pins] == [1, 0, 0, 1] + assert robot.value == (1, -1) robot.reverse() assert [pin.state for pin in pins] == [0, 1, 1, 0] + assert robot.value == (-1, 1) robot.stop() assert [pin.state for pin in pins] == [0, 0, 0, 0] + assert robot.value == (0, 0) + robot.value = (-1, -1) + assert robot.value == (-1, -1) + robot.value = (0.5, 1) + assert robot.value == (0.5, 1) + robot.value = (0, -0.5) + assert robot.value == (0, -0.5) def test_ryanteck_robot(): pins = [MockPWMPin(n) for n in (17, 18, 22, 23)]