Example #1
0
from pybricks.pupdevices import ColorSensor
from pybricks.parameters import Port
from pybricks.tools import wait

# Initialize the sensor.
sensor = ColorSensor(Port.A)

# Repeat forever.
while True:

    # Get the ambient color values. Instead of scanning the color of a surface,
    # this lets you scan the color of light sources like lamps or screens.
    hsv = sensor.hsv(surface=False)
    color = sensor.color(surface=False)

    # Get the ambient light intensity.
    ambient = sensor.ambient()

    # Print the measurements.
    print(hsv, color, ambient)

    # Point the sensor at a computer screen or colored light. Watch the color.
    # Also, cover the sensor with your hands and watch the ambient value.

    # Wait so we can read the printed line
    wait(100)
Example #2
0
# Color angle targets
angles = {
    "GREEN": 20,
    "BLUE": 110,
    "RED": 200,
    "YELLOW": 290,
    "BLACK": 250,
    "WHITE": 75,
    "NONE": 162,
}

# Verify saturated colors without calibration.
for name in ("GREEN", "BLUE", "RED", "YELLOW"):
    motor.run_target(SPEED, angles[name])
    detected = color_sensor.color()
    assert detected == Color[name], "Expected {0} but got {1}".format(
        Color[name], detected)

# Update all colors.
for name in angles.keys():
    motor.run_target(SPEED, angles[name])
    Color[name] = color_sensor.hsv()

# Set new colors as detectable colors.
color_sensor.detectable_colors([Color[key] for key in angles.keys()])

# Test all newly calibrated colors.
for name in angles.keys():
    motor.run_target(SPEED, angles[name])
    detected = color_sensor.color()
# as shown in the previous example. Write them down
# as shown below. The name is optional, but it is
# useful when you print the color value.
green = Color(h=132, s=94, v=26, name='GREEN_BRICK')
magenta = Color(h=348, s=96, v=40, name='MAGENTA_BRICK')
brown = Color(h=17, s=78, v=15, name='BROWN_BRICK')
red = Color(h=359, s=97, v=39, name='RED_BRICK')

# Put your colors in a list or tuple.
# Including None is optional. Just omit it if
# you always want to get one of your colors.
my_colors = (green, magenta, brown, red, None)

# Save your colors.
sensor.detectable_colors(my_colors)

# color() works as usual, but it only
# returns one of your specified colors.
while True:
    color = sensor.color()

    # Print the color.
    print(color)

    # Check which one it is.
    if color == magenta:
        print("It works!")

    # Wait so we can read it.
    wait(100)
Example #4
0
Hardware Module: 1

Description: Verifies that sensors do not give stale data after a mode change.
"""

from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

# Initialize devices.
motor = Motor(Port.A)
color_sensor = ColorSensor(Port.B)
SPEED = 500

# Initialize sensor to make sure we're in the expected mode.
color_sensor.color()
wait(500)

# Color angle targets
angles = {
    "GREEN": 20,
    "BLUE": 110,
    "RED": 200,
    "YELLOW": 290,
    "BLACK": 250,
    "WHITE": 75,
    "NONE": 162,
}

# Go to blue and assert that we really do see blue.
motor.run_target(SPEED, angles["BLUE"])
Example #5
0
Kiki shall respond to the blue, yellow or green objects by displaying something
on the Hub's screen.
"""

from pybricks.hubs import PrimeHub
from pybricks.pupdevices import ColorSensor
from pybricks.parameters import Color, Icon, Port

# Configure the Hub and the Color Sensor
hub = PrimeHub()
color_sensor = ColorSensor(Port.B)

# Kiki walks around and sees things
while True:
    # if he sees blue, he thinks it's the sky above
    if color_sensor.color() == Color.BLUE:
        hub.display.image([[100, 100, 100, 100, 100], [0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0]])

    # if he sees yellow, he thinks it's a house
    elif color_sensor.color() == Color.YELLOW:
        hub.display.image(Icon.UP)

    # if he sees green, he thinks it's the grass below
    elif color_sensor.color() == Color.GREEN:
        hub.display.image([[0, 0, 0, 0, 0], [0, 0, 0, 0, 0], [0, 0, 0, 0, 0],
                           [0, 0, 0, 0, 0], [100, 100, 100, 100, 100]])

    else:
        hub.display.off()
Example #6
0
"""
Hardware Module: 1

Description: Verify color sensor arguments,
    by asserting that the same color is reported by:
    - using the default argument, e.g. surface=True
    - and using NO argument.
"""

from pybricks.pupdevices import ColorSensor
from pybricks.parameters import Port

# Initialize device.
color_sensor = ColorSensor(Port.B)

# Verify that the default and NO-argument calls report the same color.
# Assume that the lighting will not change a lot during measuring.
hsv_default = color_sensor.hsv()
hsv_surface_true = color_sensor.hsv(surface=True)  # the default is surface=True.
# do not use surface=False in this test, that causes a mode switch and that would need more time.
assert hsv_default == hsv_surface_true, "Expected default '{0}' == '{1}'".format(
    hsv_default, hsv_surface_true
)

color_default = color_sensor.color()
color_surface_true = color_sensor.color(surface=True)  # the default is surface=True.
assert color_default == color_surface_true, "Expected default '{0}' == '{1}'".format(
    color_default, color_surface_true
)
Example #7
0
class ExplorationRover():
    """Control the Mars Exploration Rover."""

    # In this robot, we want to detect red and cyan/teal "mars rocks".
    ROCK_COLORS = (Color.RED, Color.CYAN)

    # These are the gears between the motor and the rear wheels.
    REAR_GEARS = (8, 24, 12, 20)

    # An animation of heart icons of varying brightness, giving a heart beat.
    HEART_BEAT = [
        Icon.HEART * i / 100
        for i in list(range(0, 100, 4)) + list(range(100, 0, -4))
    ]

    def __init__(self):
        # Initialize each motor with the correct direction and gearing.
        self.left_rear_wheels = Motor(Port.E, Direction.CLOCKWISE,
                                      self.REAR_GEARS)
        self.right_rear_wheels = Motor(Port.F, Direction.COUNTERCLOCKWISE,
                                       self.REAR_GEARS)
        self.left_front_wheel = Motor(Port.C, Direction.COUNTERCLOCKWISE, None)
        self.right_front_wheel = Motor(Port.D, Direction.CLOCKWISE, None)

        # Initialize sensors, named after the Perseverance Mars Rover instruments.
        self.mast_cam = UltrasonicSensor(Port.B)
        self.sherloc = ColorSensor(Port.A)

        # Initialize the hub and start the animation
        self.hub = InventorHub()
        self.hub.display.animate(self.HEART_BEAT, 30)

    def calibrate(self):
        # First, measure the color of the floor. This makes it easy to explicitly
        # ignore the floor later. This is useful if your floor has a wood color,
        # which can appear red or yellow to the sensor.
        self.floor_color = self.sherloc.hsv()

        # Set up all the colors we want to distinguish, including no color at all.
        self.sherloc.detectable_colors(self.ROCK_COLORS +
                                       (self.floor_color, None))

    def drive(self, speed, steering, time=None):
        # Drive the robot at a given speed and steering for a given amount of time.
        # Speed and steering is expressed as degrees per second of the wheels.
        self.left_rear_wheels.run(speed + steering)
        self.left_front_wheel.run(speed + steering)
        self.right_rear_wheels.run(speed - steering)
        self.right_front_wheel.run(speed - steering)

        # If the user specified a time, wait for this duration and then stop.
        if time is not None:
            wait(time)
            self.stop()

    def stop(self):
        # Stops all the wheels.
        self.left_rear_wheels.stop()
        self.left_front_wheel.stop()
        self.right_rear_wheels.stop()
        self.right_front_wheel.stop()

    def scan_rock(self, time):
        # Stops the robot and moves the scan arm.
        self.stop()
        self.left_front_wheel.run(100)

        # During the given duration, scan for rocks.
        watch = StopWatch()
        while watch.time() < time:

            # If a rock color is detected, display it and make a sound.
            if self.sherloc.color() in self.ROCK_COLORS:
                self.hub.display.image(Icon.CIRCLE)
                self.hub.speaker.beep()
            else:
                self.hub.display.off()

            wait(10)

        # Turn the arm motor and restore the heartbeat animation again.
        self.hub.display.animate(self.HEART_BEAT, 30)
        self.left_front_wheel.stop()
Example #8
0
from pybricks.pupdevices import ColorSensor
from pybricks.parameters import Port, Color
from pybricks.tools import wait

# Initialize the sensor.
sensor = ColorSensor(Port.A)

# Here we choose only red, yellow, green, and blue, and provide the hues.
hues = {Color.RED: 350, Color.YELLOW: 30, Color.GREEN: 110, Color.BLUE: 210}

# Save the updated settings. The values dictionary is empty because we don't
# need to detect black/white in this demo application.
sensor.color_map(hues, 30, {})

# color() works as usual, but it only returns red/yellow/green/blue, or None.
# This avoids accidentally detecting black on the dark gray train tracks.
while True:
    print(sensor.color())
    wait(100)
Example #9
0
class TrickyPlayingSoccer:

    WHEEL_DIAMETER = 44
    AXLE_TRACK = 88
    KICK_SPEED = 1000

    def __init__(self):
        # Configure the hub, the kicker motor, and the sensors.
        self.hub = InventorHub()
        self.kicker_motor = Motor(Port.C)
        self.distance_sensor = UltrasonicSensor(Port.D)
        self.color_sensor = ColorSensor(Port.E)

        # Configure the drive base.
        left_motor = Motor(Port.B, Direction.COUNTERCLOCKWISE)
        right_motor = Motor(Port.A)
        self.drive_base = DriveBase(left_motor, right_motor,
                                    self.WHEEL_DIAMETER, self.AXLE_TRACK)

        # Prepare tricky to start kicking!
        self.distance_sensor.lights.off()
        self.reset_kicker_motor()
        self.distance_sensor.lights.on(100)

    def reset_kicker_motor(self):
        # Prepare the kicker motor for kicking.
        self.hub.light.off()
        self.kicker_motor.run_until_stalled(-self.KICK_SPEED, Stop.HOLD)
        self.kicker_motor.run_angle(self.KICK_SPEED, 325)

    def kick(self):
        # Kick the ball!
        self.kicker_motor.track_target(360)

    def run_to_and_kick_ball(self):
        # Drive until we see the red ball.
        self.drive_base.drive(speed=1000, turn_rate=0)
        while self.color_sensor.color() != Color.RED:
            wait(10)
        self.hub.light.on(Color.RED)
        self.hub.speaker.beep(frequency=100, duration=100)
        self.kick()
        self.drive_base.stop()
        self.hub.light.off()

    def celebrate(self):
        # Celebrate with light and sound.
        self.hub.display.image([[00, 11, 33, 11, 00], [11, 33, 66, 33, 11],
                                [33, 66, 99, 66, 33], [11, 33, 66, 33, 11],
                                [00, 11, 33, 11, 00]])
        self.hub.speaker.beep(frequency=1000, duration=1000)
        self.hub.light.animate([Color.CYAN, Color.GREEN, Color.MAGENTA],
                               interval=100)

        # Celebrate by dancing around.
        self.drive_base.drive(speed=0, turn_rate=360)
        self.kicker_motor.run_angle(self.KICK_SPEED, 5 * 360)

        # Party's over! Let's stop everything.
        self.hub.display.off()
        self.hub.light.off()
        self.drive_base.stop()