Files
solutions_season_unearthed/final/main4.py

251 lines
7.7 KiB
Python
Raw Normal View History

2025-10-09 22:04:39 +00:00
from pybricks.hubs import PrimeHub
from pybricks.pupdevices import Motor, ColorSensor
from pybricks.parameters import Port, Stop, Color, Direction
from pybricks.robotics import DriveBase
from pybricks.tools import wait, StopWatch, multitask, run_task
hub = PrimeHub()
left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE)
right_motor = Motor(Port.B)
left_arm = Motor(Port.C, Direction.COUNTERCLOCKWISE)
right_arm = Motor(Port.D)
drive_base = DriveBase(left_motor, right_motor, wheel_diameter=68.8, axle_track=180)
drive_base.settings(550,700,100,100)
drive_base.use_gyro(True)
2025-10-09 22:57:18 +00:00
color_sensor = ColorSensor(Port.F)
hub.speaker.volume(50) # Set the volume of the speaker
2025-10-09 22:04:39 +00:00
# Celebration sound types
class CelebrationSound:
VICTORY_FANFARE = 0
LEVEL_UP = 1
SUCCESS_CHIME = 2
TA_DA = 3
POWER_UP = 4
RICKROLL_INSPIRED = 5
async def play_victory_fanfare():
"""Classic victory fanfare"""
notes = [
(262, 200), # C4
(262, 200), # C4
(262, 200), # C4
(349, 600), # F4
]
for freq, duration in notes:
await hub.speaker.beep(freq, duration)
await wait(50)
async def play_level_up():
"""Upward scale for level completion"""
notes = [
(262, 100), # C4
(294, 100), # D4
(330, 100), # E4
(349, 100), # F4
(392, 100), # G4
(440, 100), # A4
(494, 100), # B4
(523, 300), # C5
]
for freq, duration in notes:
await hub.speaker.beep(freq, duration)
await wait(20)
async def play_success_chime():
"""Simple success notification"""
notes = [
(523, 150), # C5
(659, 150), # E5
(784, 300), # G5
]
for freq, duration in notes:
await hub.speaker.beep(freq, duration)
await wait(50)
async def play_ta_da():
"""Classic "ta-da!" sound"""
notes = [
(392, 200), # G4
(523, 400), # C5
]
for freq, duration in notes:
await hub.speaker.beep(freq, duration)
await wait(100)
async def play_power_up():
"""Rising power-up sound"""
for freq in range(200, 800, 50):
await hub.speaker.beep(freq, 50)
await wait(10)
await hub.speaker.beep(1000, 200)
async def play_rickroll_inspired():
"""Fun 80s-style dance beat inspired sound"""
# Upbeat bouncy rhythm
pattern = [
(392, 200), (440, 200), (494, 200), (523, 200),
(440, 200), (392, 200), (349, 200), (392, 300),
(440, 200), (392, 200), (349, 200), (330, 400),
]
for freq, duration in pattern:
await hub.speaker.beep(freq, duration)
await wait(50)
async def celebrate_mission_complete(sound_type=CelebrationSound.SUCCESS_CHIME):
"""
Main celebration function to call after completing a mission.
Plays a sound and shows light animation.
Args:
sound_type: CelebrationSound enum value (default: SUCCESS_CHIME)
"""
# Light show
hub.light.on(Color.GREEN)
# Play the selected celebration sound
if sound_type == CelebrationSound.VICTORY_FANFARE:
await play_victory_fanfare()
elif sound_type == CelebrationSound.LEVEL_UP:
await play_level_up()
elif sound_type == CelebrationSound.SUCCESS_CHIME:
await play_success_chime()
elif sound_type == CelebrationSound.TA_DA:
await play_ta_da()
elif sound_type == CelebrationSound.POWER_UP:
await play_power_up()
elif sound_type == CelebrationSound.RICKROLL_INSPIRED:
await play_rickroll_inspired()
else:
await play_success_chime() # Default fallback
# Blink the light
for _ in range(3):
hub.light.off()
await wait(100)
hub.light.on(Color.GREEN)
await wait(100)
hub.light.off()
2025-10-09 22:57:18 +00:00
async def Run1():
2025-10-10 20:03:09 +00:00
# Brings both arms up while moving to first mission
2025-10-09 22:57:18 +00:00
await multitask(left_arm.run_angle(1000, 300), right_arm.run_angle(1000,500))
await drive_base.straight(320)
2025-10-10 20:03:09 +00:00
# Slaps down "Silo" 3 times
2025-10-09 22:57:18 +00:00
await right_arm.run_angle(5000,-500, Stop.HOLD)
await right_arm.run_angle(5000,500, Stop.HOLD)
await right_arm.run_angle(5000,-500, Stop.HOLD)
await right_arm.run_angle(5000,500, Stop.HOLD)
await right_arm.run_angle(5000,-500, Stop.HOLD)
2025-10-10 20:03:09 +00:00
# Moves to the next mission, solving "Who lived here?"
2025-10-09 22:57:18 +00:00
await drive_base.turn(-20)
2025-10-10 20:03:09 +00:00
await drive_base.straight(277)
2025-10-09 22:57:18 +00:00
await drive_base.turn(20)
2025-10-10 20:03:09 +00:00
await drive_base.straight(65)
2025-10-09 22:57:18 +00:00
2025-10-10 20:03:09 +00:00
# Raises the right arm up slowly, before moving into position to solve "What's on Sale?"
2025-10-09 22:57:18 +00:00
await multitask(drive_base.turn(-30), right_arm.run_angle(50,500))
await drive_base.turn(45)
await drive_base.straight(-135)
await drive_base.turn(-60)
2025-10-10 20:03:09 +00:00
# Solves "What's on Sale?"
2025-10-09 22:57:18 +00:00
await drive_base.straight(90)
await left_arm.run_angle(1000,-450)
await drive_base.straight(-145)
await left_arm.run_angle(1000,450)
await drive_base.straight(10)
2025-10-10 20:03:09 +00:00
# Moves the robot back to base
2025-10-09 22:57:18 +00:00
await drive_base.turn(35)
2025-10-10 20:03:09 +00:00
await drive_base.straight(-600)
2025-10-09 22:57:18 +00:00
async def Run2():
2025-10-10 20:03:09 +00:00
# Drive robot to the front of "Forge" in preparation to solve "Heavy Lifting"
2025-10-09 22:57:18 +00:00
await drive_base.straight(200)
await drive_base.turn(-20)
await drive_base.straight(525)
await drive_base.turn(60)
2025-10-10 20:03:09 +00:00
# Throws "Heavy Lifting" to the side
2025-10-09 22:57:18 +00:00
await drive_base.straight(50)
await right_arm.run_angle(2000,1000)
await drive_base.straight(-50)
await drive_base.turn(45)
await drive_base.straight(50)
await right_arm.run_angle(350,-1000)
2025-10-10 20:03:09 +00:00
# Moves the robot back to base
2025-10-09 22:57:18 +00:00
await drive_base.turn(-100)
await drive_base.straight(-600)
async def Run3():
2025-10-10 20:03:09 +00:00
# Runs robot to "Angler Artifacts"
2025-10-09 22:57:18 +00:00
await drive_base.straight(915)
await drive_base.turn(-90)
2025-10-10 20:03:09 +00:00
# Solves "Angler Artifacts"
2025-10-09 22:57:18 +00:00
await drive_base.straight(60)
await left_arm.run_angle(10000,-15000)
2025-10-10 20:03:09 +00:00
# Moves to the Red home area
2025-10-09 22:57:18 +00:00
await drive_base.straight(-60)
await drive_base.turn(85)
await drive_base.straight(2000)
async def Run5():
await drive_base.straight(420)
await right_arm.run_angle(300,-100)
await drive_base.straight(-100)
await right_arm.run_angle(300, 100)
await drive_base.straight(-350)
async def Run6():
await drive_base.straight(420)
await right_arm.run_angle(300,-100)
await drive_base.straight(-100)
await right_arm.run_angle(300, 100)
await drive_base.straight(-350)
2025-10-09 22:04:39 +00:00
while True:
await celebrate_mission_complete(CelebrationSound.LEVEL_UP)
color_reflected_percent = await color_sensor.reflection()
print(color_reflected_percent)
color_detected = await color_sensor.color()
print(f'Detected color: {color_detected}')
if color_detected == Color.GREEN:
print('Running Mission 1')
await Run1()
await celebrate_mission_complete(CelebrationSound.VICTORY_FANFARE)
elif color_detected == Color.WHITE:
print('Running Mission 2')
await Run2()
await celebrate_mission_complete(CelebrationSound.RICKROLL_INSPIRED)
elif color_detected == Color.YELLOW:
print('Running Mission 3')
await Run3()
await celebrate_mission_complete(CelebrationSound.SUCCESS_CHIME)
elif color_detected == Color.BLUE:
print('Running Mission 5')
await Run5()
await celebrate_mission_complete(CelebrationSound.POWER_UP)
elif color_detected == Color.RED:
print('Running Mission 6')
await Run6()
await celebrate_mission_complete(CelebrationSound.LEVEL_UP)
else:
hub.light.off()
left_motor.stop()
right_motor.stop()
await wait(100) #prevent loop from iterating fast
# Main execution loop
run_task(main())