From 684447c01aeaa6ef2d15f226bc9b355e2ba188da Mon Sep 17 00:00:00 2001 From: Vickram <31kapoov@elmbrookstudents.org> Date: Thu, 9 Oct 2025 00:19:33 +0000 Subject: [PATCH 01/18] Add final/2main.py --- final/2main.py | 113 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 113 insertions(+) create mode 100644 final/2main.py diff --git a/final/2main.py b/final/2main.py new file mode 100644 index 0000000..7c0940d --- /dev/null +++ b/final/2main.py @@ -0,0 +1,113 @@ + +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 + + +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) + +async def Run1(): + left_arm.run_angle(1000, 300) + right_arm.run_angle(1000,500) + await drive_base.straight(320) + + 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) + + await drive_base.turn(-20) + await drive_base.straight(275) + await drive_base.turn(20) + await drive_base.straight(63) + + await 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) + 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) + await drive_base.turn(35) + await drive_base.straight(-500) + +async def Run2(): + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(525) + await drive_base.turn(60) + + 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) + + await drive_base.turn(-100) + await drive_base.straight(-600) + + +async def Run3(): + await drive_base.straight(915) + await drive_base.turn(-90) + await drive_base.straight(60) + await left_arm.run_angle(10000,-15000) + 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) + + +def main(): + if color_sensor.color() == Color.GREEN: + Run1() + + if color_sensor.color() == Color.WHITE: + Run2() + + if color_sensor.color() == Color.YELLOW: + Run3() + + if color_sensor.color() == Color.BLUE: + Run5() + + if color_sensor.color() == Color.RED: + Run6() + + print(f'Detected color: {color_sensor.color()}') + +# Main execution loop +while True: + main() + wait(100) -- 2.49.1 From 227619df494b8fb3acd58522460037b27970830c Mon Sep 17 00:00:00 2001 From: Vickram <31kapoov@elmbrookstudents.org> Date: Thu, 9 Oct 2025 12:32:51 +0000 Subject: [PATCH 02/18] Add final/3main.py --- final/3main.py | 102 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 final/3main.py diff --git a/final/3main.py b/final/3main.py new file mode 100644 index 0000000..5475bd3 --- /dev/null +++ b/final/3main.py @@ -0,0 +1,102 @@ +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 + +async def Run1(): + await multitask(left_arm.run_angle(1000, 300), right_arm.run_angle(1000,500)) + await drive_base.straight(320) + + 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) + + await drive_base.turn(-20) + await drive_base.straight(275) + await drive_base.turn(20) + await drive_base.straight(63) + + 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) + 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) + await drive_base.turn(35) + await drive_base.straight(-500) + +async def Run2(): + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(525) + await drive_base.turn(60) + + 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) + + await drive_base.turn(-100) + await drive_base.straight(-600) + +async def Run3(): + await drive_base.straight(915) + await drive_base.turn(-90) + await drive_base.straight(60) + await left_arm.run_angle(10000,-15000) + 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) + +async def main(): + while True: + detected_color = color_sensor.color(True) + + if detected_color == Color.GREEN: + print('Detected color: Green') + await Run1() + + elif detected_color == Color.WHITE: + print('Detected color: White') + await Run2() + + elif detected_color == Color.YELLOW: + print('Detected color: Yellow') + await Run3() + + elif detected_color == Color.BLUE: + print('Detected color: Blue') + await Run5() + + elif detected_color == Color.RED: + print('Detected color: Red') + await Run6() + + else: + print("None detected") + +# Main execution +run_task(main()) \ No newline at end of file -- 2.49.1 From 0664a619b34236a84266ed13ed75c9263d5f58b6 Mon Sep 17 00:00:00 2001 From: Vickram <31kapoov@elmbrookstudents.org> Date: Thu, 9 Oct 2025 22:04:39 +0000 Subject: [PATCH 03/18] Add final/main4.py --- final/main4.py | 256 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 256 insertions(+) create mode 100644 final/main4.py diff --git a/final/main4.py b/final/main4.py new file mode 100644 index 0000000..0e5ff3e --- /dev/null +++ b/final/main4.py @@ -0,0 +1,256 @@ +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) + +color_sensor = ColorSensor(Port.F) + +async def Run1(): + left_arm.run_angle(1000, 300) + right_arm.run_angle(1000,500) + await drive_base.straight(320) + + 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) + + await drive_base.turn(-20) + await drive_base.straight(275) + await drive_base.turn(20) + await drive_base.straight(63) + + await 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) + 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) + await drive_base.turn(35) + await drive_base.straight(-500) + +async def Run2(): + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(525) + await drive_base.turn(60) + + 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) + + await drive_base.turn(-100) + await drive_base.straight(-600) + +async def Run3(): + await drive_base.straight(915) + await drive_base.turn(-90) + await drive_base.straight(60) + await left_arm.run_angle(10000,-15000) + 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) + +# 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() + +async def main(): + """Use color sensor to select runs""" + print("Place colored object in front of sensor:") + print("RED=Run1, GREEN=Run2, BLUE=Run3, YELLOW=Test") + + + 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()) -- 2.49.1 From c2204e71abe83cfc943406258d722bb29d8c2bb6 Mon Sep 17 00:00:00 2001 From: Vickram <31kapoov@elmbrookstudents.org> Date: Thu, 9 Oct 2025 22:57:18 +0000 Subject: [PATCH 04/18] Update final/main4.py --- final/main4.py | 162 +++++++++++++++++++++---------------------------- 1 file changed, 70 insertions(+), 92 deletions(-) diff --git a/final/main4.py b/final/main4.py index 0e5ff3e..d0302fa 100644 --- a/final/main4.py +++ b/final/main4.py @@ -9,82 +9,11 @@ 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) - -color_sensor = ColorSensor(Port.F) - -async def Run1(): - left_arm.run_angle(1000, 300) - right_arm.run_angle(1000,500) - await drive_base.straight(320) - - 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) - - await drive_base.turn(-20) - await drive_base.straight(275) - await drive_base.turn(20) - await drive_base.straight(63) - - await 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) - 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) - await drive_base.turn(35) - await drive_base.straight(-500) - -async def Run2(): - await drive_base.straight(200) - await drive_base.turn(-20) - await drive_base.straight(525) - await drive_base.turn(60) - - 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) - - await drive_base.turn(-100) - await drive_base.straight(-600) - -async def Run3(): - await drive_base.straight(915) - await drive_base.turn(-90) - await drive_base.straight(60) - await left_arm.run_angle(10000,-15000) - 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) +color_sensor = ColorSensor(Port.F) +hub.speaker.volume(50) # Set the volume of the speaker # Celebration sound types class CelebrationSound: @@ -107,7 +36,6 @@ async def play_victory_fanfare(): 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 = [ @@ -124,7 +52,6 @@ async def play_level_up(): for freq, duration in notes: await hub.speaker.beep(freq, duration) await wait(20) - async def play_success_chime(): """Simple success notification""" notes = [ @@ -136,7 +63,6 @@ async def play_success_chime(): for freq, duration in notes: await hub.speaker.beep(freq, duration) await wait(50) - async def play_ta_da(): """Classic "ta-da!" sound""" notes = [ @@ -147,14 +73,12 @@ async def play_ta_da(): 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 @@ -167,7 +91,6 @@ async def play_rickroll_inspired(): 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. @@ -204,16 +127,78 @@ async def celebrate_mission_complete(sound_type=CelebrationSound.SUCCESS_CHIME): hub.light.off() -async def main(): - """Use color sensor to select runs""" - print("Place colored object in front of sensor:") - print("RED=Run1, GREEN=Run2, BLUE=Run3, YELLOW=Test") - +async def Run1(): + await multitask(left_arm.run_angle(1000, 300), right_arm.run_angle(1000,500)) + await drive_base.straight(320) + + 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) + + await drive_base.turn(-20) + await drive_base.straight(275) + await drive_base.turn(20) + await drive_base.straight(63) + + 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) + 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) + await drive_base.turn(35) + await drive_base.straight(-500) + +async def Run2(): + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(525) + await drive_base.turn(60) + + 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) + + await drive_base.turn(-100) + await drive_base.straight(-600) + + +async def Run3(): + await drive_base.straight(915) + await drive_base.turn(-90) + await drive_base.straight(60) + await left_arm.run_angle(10000,-15000) + 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) while True: await celebrate_mission_complete(CelebrationSound.LEVEL_UP) - color_reflected_percent = await color_sensor.reflection() print(color_reflected_percent) @@ -224,33 +209,26 @@ async def main(): 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()) -- 2.49.1 From a3e7be20d193a6da685e511e568636dbc56cd453 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Fri, 10 Oct 2025 20:03:09 +0000 Subject: [PATCH 05/18] Update final/main4.py --- final/main4.py | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/final/main4.py b/final/main4.py index d0302fa..c1c0b16 100644 --- a/final/main4.py +++ b/final/main4.py @@ -128,38 +128,47 @@ async def celebrate_mission_complete(sound_type=CelebrationSound.SUCCESS_CHIME): hub.light.off() async def Run1(): + # Brings both arms up while moving to first mission await multitask(left_arm.run_angle(1000, 300), right_arm.run_angle(1000,500)) await drive_base.straight(320) + # Slaps down "Silo" 3 times 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) + # Moves to the next mission, solving "Who lived here?" await drive_base.turn(-20) - await drive_base.straight(275) + await drive_base.straight(277) await drive_base.turn(20) - await drive_base.straight(63) + await drive_base.straight(65) + # Raises the right arm up slowly, before moving into position to solve "What's on Sale?" 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) + # Solves "What's on Sale?" 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) + + # Moves the robot back to base await drive_base.turn(35) - await drive_base.straight(-500) + await drive_base.straight(-600) async def Run2(): + # Drive robot to the front of "Forge" in preparation to solve "Heavy Lifting" await drive_base.straight(200) await drive_base.turn(-20) await drive_base.straight(525) await drive_base.turn(60) + # Throws "Heavy Lifting" to the side await drive_base.straight(50) await right_arm.run_angle(2000,1000) await drive_base.straight(-50) @@ -167,15 +176,22 @@ async def Run2(): await drive_base.straight(50) await right_arm.run_angle(350,-1000) + # Moves the robot back to base await drive_base.turn(-100) await drive_base.straight(-600) async def Run3(): + + # Runs robot to "Angler Artifacts" await drive_base.straight(915) await drive_base.turn(-90) + + # Solves "Angler Artifacts" await drive_base.straight(60) await left_arm.run_angle(10000,-15000) + + # Moves to the Red home area await drive_base.straight(-60) await drive_base.turn(85) await drive_base.straight(2000) -- 2.49.1 From 3f37e7e2ff13f93057d6da12dbd0e467b5737b8e Mon Sep 17 00:00:00 2001 From: Vickram <31kapoov@elmbrookstudents.org> Date: Fri, 10 Oct 2025 20:05:31 +0000 Subject: [PATCH 06/18] Update final/main4.py --- final/main4.py | 149 ++++++++++++++++++++----------------------------- 1 file changed, 62 insertions(+), 87 deletions(-) diff --git a/final/main4.py b/final/main4.py index c1c0b16..7dc67cc 100644 --- a/final/main4.py +++ b/final/main4.py @@ -15,6 +15,64 @@ drive_base.use_gyro(True) color_sensor = ColorSensor(Port.F) hub.speaker.volume(50) # Set the volume of the speaker +async def Run1(): + left_arm.run_angle(1000, 300) + right_arm.run_angle(1000,500) + await drive_base.straight(320) + 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) + await drive_base.turn(-20) + await drive_base.straight(275) + await drive_base.turn(20) + await drive_base.straight(63) + await 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) + 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) + await drive_base.turn(35) + await drive_base.straight(-500) +async def Run2(): + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(525) + await drive_base.turn(60) + 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) + await drive_base.turn(-100) + await drive_base.straight(-600) +async def Run3(): + await drive_base.straight(915) + await drive_base.turn(-90) + await drive_base.straight(60) + await left_arm.run_angle(10000,-15000) + 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) # Celebration sound types class CelebrationSound: VICTORY_FANFARE = 0 @@ -126,92 +184,8 @@ async def celebrate_mission_complete(sound_type=CelebrationSound.SUCCESS_CHIME): await wait(100) hub.light.off() - -async def Run1(): - # Brings both arms up while moving to first mission - await multitask(left_arm.run_angle(1000, 300), right_arm.run_angle(1000,500)) - await drive_base.straight(320) - - # Slaps down "Silo" 3 times - 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) - - # Moves to the next mission, solving "Who lived here?" - await drive_base.turn(-20) - await drive_base.straight(277) - await drive_base.turn(20) - await drive_base.straight(65) - - # Raises the right arm up slowly, before moving into position to solve "What's on Sale?" - 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) - # Solves "What's on Sale?" - 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) - - # Moves the robot back to base - await drive_base.turn(35) - await drive_base.straight(-600) - -async def Run2(): - # Drive robot to the front of "Forge" in preparation to solve "Heavy Lifting" - await drive_base.straight(200) - await drive_base.turn(-20) - await drive_base.straight(525) - await drive_base.turn(60) - - # Throws "Heavy Lifting" to the side - 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) - - # Moves the robot back to base - await drive_base.turn(-100) - await drive_base.straight(-600) - - -async def Run3(): - - # Runs robot to "Angler Artifacts" - await drive_base.straight(915) - await drive_base.turn(-90) - - # Solves "Angler Artifacts" - await drive_base.straight(60) - await left_arm.run_angle(10000,-15000) - - # Moves to the Red home area - 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) - + +async def main(): while True: await celebrate_mission_complete(CelebrationSound.LEVEL_UP) @@ -246,5 +220,6 @@ async def Run6(): left_motor.stop() right_motor.stop() await wait(100) #prevent loop from iterating fast + # Main execution loop -run_task(main()) +run_task(main()) \ No newline at end of file -- 2.49.1 From 8ea7cd55f3aaf0c91de71ed5f5de9629d2299790 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Fri, 10 Oct 2025 20:23:39 +0000 Subject: [PATCH 07/18] Update final/main4emaj.py --- final/{main4.py => main4emaj.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename final/{main4.py => main4emaj.py} (100%) diff --git a/final/main4.py b/final/main4emaj.py similarity index 100% rename from final/main4.py rename to final/main4emaj.py -- 2.49.1 From 75e64da4b09301946e640eb3aedffa66c5c2d9d7 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Fri, 10 Oct 2025 20:27:18 +0000 Subject: [PATCH 08/18] Update final/main4emaj.py --- final/main4emaj.py | 49 +++++++++++++++++++++++++++------------------- 1 file changed, 29 insertions(+), 20 deletions(-) diff --git a/final/main4emaj.py b/final/main4emaj.py index 7dc67cc..cbe0254 100644 --- a/final/main4emaj.py +++ b/final/main4emaj.py @@ -85,10 +85,10 @@ class CelebrationSound: async def play_victory_fanfare(): """Classic victory fanfare""" notes = [ - (262, 200), # C4 - (262, 200), # C4 - (262, 200), # C4 - (349, 600), # F4 + (330, 200), # E4 + (330, 100), # E4 + (330, 100), # E4 + (440, 600), # A4 ] for freq, duration in notes: @@ -97,14 +97,22 @@ async def play_victory_fanfare(): 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 + (277, 100), + (330, 100), + (277, 100), + (554, 100), + (277, 100), + (413, 100), + (330, 100), + (277, 100), + (413, 100), + (277, 100), + (554, 100), + (413, 100), + (277, 100), + (413, 100), + (554, 100), + (413, 100) ] for freq, duration in notes: @@ -113,9 +121,9 @@ async def play_level_up(): async def play_success_chime(): """Simple success notification""" notes = [ - (523, 150), # C5 - (659, 150), # E5 - (784, 300), # G5 + (659, 150), # E5 + (830, 150), # G♯5 + (987, 300), # B♭5 ] for freq, duration in notes: @@ -124,8 +132,8 @@ async def play_success_chime(): async def play_ta_da(): """Classic "ta-da!" sound""" notes = [ - (392, 200), # G4 - (523, 400), # C5 + (494, 200), # B♭4 + (659, 400), # E5 ] for freq, duration in notes: @@ -141,10 +149,11 @@ 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), + (494, 200), (554, 200), (622, 200), (659, 200), + (554, 200), (494, 200), (439, 200), (494, 300), + (554, 200), (494, 200), (439, 200), (416, 400), ] + for freq, duration in pattern: await hub.speaker.beep(freq, duration) -- 2.49.1 From bb76258f58b06af11fda825dcc8a68f3204145af Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Fri, 10 Oct 2025 20:56:52 +0000 Subject: [PATCH 09/18] Update final/main4emaj.py --- final/main4emaj.py | 94 +++++++++++++++++++++++++++++++++------------- 1 file changed, 67 insertions(+), 27 deletions(-) diff --git a/final/main4emaj.py b/final/main4emaj.py index cbe0254..5335147 100644 --- a/final/main4emaj.py +++ b/final/main4emaj.py @@ -15,6 +15,36 @@ drive_base.use_gyro(True) color_sensor = ColorSensor(Port.F) hub.speaker.volume(50) # Set the volume of the speaker +cn = { + "Cs3": 138.59, + "D3": 146.83, + "Ds3": 155.56, + "E3": 164.81, + "F3": 174.61, + "Fs3": 185.00, + "G3": 196.00, + "Gs3": 207.65, + "A3": 220.00, + "As3": 233.08, + "B3": 246.94, + "C4": 261.63, + "Cs4": 277.18, + "D4": 293.66, + "Ds4": 311.13, + "E4": 329.63, + "F4": 349.23, + "Fs4": 369.99, + "G4": 392.00, + "Gs4": 415.30, + "A4": 440.00, + "As4": 466.16, + "B4": 493.88, + "C5": 523.25, + "Cs5": 554.37 +} + + + async def Run1(): left_arm.run_angle(1000, 300) right_arm.run_angle(1000,500) @@ -51,6 +81,7 @@ async def Run2(): await drive_base.turn(45) await drive_base.straight(50) await right_arm.run_angle(350,-1000) + await drive_base.straight(-100) await drive_base.turn(-100) await drive_base.straight(-600) async def Run3(): @@ -97,23 +128,24 @@ async def play_victory_fanfare(): async def play_level_up(): """Upward scale for level completion""" notes = [ - (277, 100), - (330, 100), - (277, 100), - (554, 100), - (277, 100), - (413, 100), - (330, 100), - (277, 100), - (413, 100), - (277, 100), - (554, 100), - (413, 100), - (277, 100), - (413, 100), - (554, 100), - (413, 100) + (cn["Cs4"], 100), + (cn["E4"], 100), + (cn["Cs4"], 100), + (cn["Cs5"], 100), + (cn["Cs4"], 100), + (cn["Gs4"], 100), + (cn["E4"], 100), + (cn["Cs4"], 100), + (cn["Gs4"], 100), + (cn["Cs4"], 100), + (cn["Cs5"], 100), + (cn["Gs4"], 100), + (cn["Cs4"], 100), + (cn["Gs4"], 100), + (cn["Cs5"], 100), + (cn["Gs4"], 100) ] + for freq, duration in notes: await hub.speaker.beep(freq, duration) @@ -121,10 +153,11 @@ async def play_level_up(): async def play_success_chime(): """Simple success notification""" notes = [ - (659, 150), # E5 - (830, 150), # G♯5 - (987, 300), # B♭5 + (cn["E4"], 150), + (cn["Gs4"], 150), + (cn["B4"], 300), ] + for freq, duration in notes: await hub.speaker.beep(freq, duration) @@ -132,8 +165,8 @@ async def play_success_chime(): async def play_ta_da(): """Classic "ta-da!" sound""" notes = [ - (494, 200), # B♭4 - (659, 400), # E5 + (cn["B3"], 200), # B4 + (cn["E4"], 400), # E5 ] for freq, duration in notes: @@ -141,24 +174,31 @@ async def play_ta_da(): await wait(100) async def play_power_up(): """Rising power-up sound""" - for freq in range(200, 800, 50): + frequencies = [ + 164.81, 207.65, 246.94, 329.63, 415.30, 493.88 + ] + + for freq in frequencies: await hub.speaker.beep(freq, 50) await wait(10) - await hub.speaker.beep(1000, 200) + + + await hub.speaker.beep(659.24, 200) async def play_rickroll_inspired(): """Fun 80s-style dance beat inspired sound""" # Upbeat bouncy rhythm pattern = [ - (494, 200), (554, 200), (622, 200), (659, 200), - (554, 200), (494, 200), (439, 200), (494, 300), - (554, 200), (494, 200), (439, 200), (416, 400), + (cn["B3"], 200), (cn["Cs4"], 200), (cn["Ds4"], 200), (cn["E4"], 200), + (cn["Cs4"], 200), (cn["B3"], 200), (cn["A3"], 200), (cn["B3"], 300), + (cn["Cs4"], 200), (cn["B3"], 200), (cn["A3"], 200), (cn["Gs3"], 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): +async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIRED): """ Main celebration function to call after completing a mission. Plays a sound and shows light animation. -- 2.49.1 From b6cffc6760a53a1a91786cf196a600782c51777b Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Fri, 10 Oct 2025 21:16:17 +0000 Subject: [PATCH 10/18] Update final/4main --- final/{main4emaj.py => 4main} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename final/{main4emaj.py => 4main} (100%) diff --git a/final/main4emaj.py b/final/4main similarity index 100% rename from final/main4emaj.py rename to final/4main -- 2.49.1 From 785c95552450e8d0180e2cc2e80bf4f9b1840316 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Fri, 10 Oct 2025 21:16:29 +0000 Subject: [PATCH 11/18] Update final/4main.py --- final/{4main => 4main.py} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename final/{4main => 4main.py} (100%) diff --git a/final/4main b/final/4main.py similarity index 100% rename from final/4main rename to final/4main.py -- 2.49.1 From 45402694bdaa1645a3d9858eff1095dcc45ccadd Mon Sep 17 00:00:00 2001 From: Johannes <31liwaj@elmbrookstudents.org> Date: Fri, 10 Oct 2025 21:19:30 +0000 Subject: [PATCH 12/18] Update final/4main.py --- final/4main.py | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/final/4main.py b/final/4main.py index 5335147..7d57c8c 100644 --- a/final/4main.py +++ b/final/4main.py @@ -55,13 +55,13 @@ async def Run1(): await right_arm.run_angle(5000,500, Stop.HOLD) await right_arm.run_angle(5000,-500, Stop.HOLD) await drive_base.turn(-20) - await drive_base.straight(275) + await drive_base.straight(277) await drive_base.turn(20) - await drive_base.straight(63) + await drive_base.straight(65) await drive_base.turn(-30) right_arm.run_angle(50,500) await drive_base.turn(45) - await drive_base.straight(-135) + await drive_base.straight(-145) await drive_base.turn(-60) await drive_base.straight(90) await left_arm.run_angle(1000,-450) @@ -69,7 +69,7 @@ async def Run1(): await left_arm.run_angle(1000,450) await drive_base.straight(10) await drive_base.turn(35) - await drive_base.straight(-500) + await drive_base.straight(-600) async def Run2(): await drive_base.straight(200) await drive_base.turn(-20) @@ -85,12 +85,13 @@ async def Run2(): await drive_base.turn(-100) await drive_base.straight(-600) async def Run3(): - await drive_base.straight(915) + await drive_base.straight(920) await drive_base.turn(-90) await drive_base.straight(60) - await left_arm.run_angle(10000,-15000) - await drive_base.straight(-60) - await drive_base.turn(85) + drive_base.turn(-10) + await left_arm.run_angle(10000,-4000) + await drive_base.straight(-110) + await drive_base.turn(90) await drive_base.straight(2000) async def Run5(): await drive_base.straight(420) -- 2.49.1 From 52214be68eb4c76a8c5d26088b47aec80f379eff Mon Sep 17 00:00:00 2001 From: Ayaan <32agarwa@elmbrookstudents.org> Date: Fri, 10 Oct 2025 21:35:56 +0000 Subject: [PATCH 13/18] Update final/4main.py --- final/4main.py | 22 +++++++++++++++++----- 1 file changed, 17 insertions(+), 5 deletions(-) diff --git a/final/4main.py b/final/4main.py index 7d57c8c..5d61c7e 100644 --- a/final/4main.py +++ b/final/4main.py @@ -100,11 +100,23 @@ async def Run5(): 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) + left_arm.run_angle(500,200) + right_arm.run_angle(500,200) + await drive_base.straight(70) + await drive_base.turn(-55) + await drive_base.straight(900) + await drive_base.turn(92.5) + await drive_base.straight(75) + await drive_base.straight(21) + await right_arm.run_angle(500,-250) + await right_arm.run_angle(500,250) + await drive_base.straight(-20) + await drive_base.turn(55) + await left_arm.run_angle(300,-400) + await drive_base.turn(70) + await left_arm.run_angle(300,400) + await drive_base.turn(-60) + await drive_base.straight(900) # Celebration sound types class CelebrationSound: VICTORY_FANFARE = 0 -- 2.49.1 From 11e89c66624d337e52f87b1cf608918e49cce87a Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Sat, 11 Oct 2025 01:47:25 +0000 Subject: [PATCH 14/18] THE FINAL THINGY --- twist_scrimmage.py | 323 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 323 insertions(+) create mode 100644 twist_scrimmage.py diff --git a/twist_scrimmage.py b/twist_scrimmage.py new file mode 100644 index 0000000..5210354 --- /dev/null +++ b/twist_scrimmage.py @@ -0,0 +1,323 @@ +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) +color_sensor = ColorSensor(Port.F) +Color.ORANGE = Color(37, 85, 95) +Color.BLUE = Color(230,100,100) +Color.YELLOW = Color(53, 75, 84) +color_sensor.detectable_colors([Color.YELLOW, Color.BLUE, Color.GREEN, Color.WHITE, Color.RED, Color.ORANGE, Color.NONE]) +hub.speaker.volume(50) # Set the volume of the speaker +color_sensor.detectable_colors() + +cn = { + "Cs3": 138.59, + "D3": 146.83, + "Ds3": 155.56, + "E3": 164.81, + "F3": 174.61, + "Fs3": 185.00, + "G3": 196.00, + "Gs3": 207.65, + "A3": 220.00, + "As3": 233.08, + "B3": 246.94, + "C4": 261.63, + "Cs4": 277.18, + "D4": 293.66, + "Ds4": 311.13, + "E4": 329.63, + "F4": 349.23, + "Fs4": 369.99, + "G4": 392.00, + "Gs4": 415.30, + "A4": 440.00, + "As4": 466.16, + "B4": 493.88, + "C5": 523.25, + "Cs5": 554.37 +} + + + +async def Run1(): + left_arm.run_angle(1000, 300) + right_arm.run_angle(1000,500) + await drive_base.straight(320) + 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) + await drive_base.turn(-20) + await drive_base.straight(277) + await drive_base.turn(20) + await drive_base.straight(65) + await drive_base.turn(-30) + right_arm.run_angle(50,500) + await drive_base.turn(45) + await drive_base.straight(-145) + await drive_base.turn(-60) + 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) + await drive_base.turn(35) + await drive_base.straight(-600) +async def Run2(): + await drive_base.straight(200) + await drive_base.turn(-20) + await drive_base.straight(525) + await drive_base.turn(60) + 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) + await drive_base.straight(-100) + await drive_base.turn(-100) + await drive_base.straight(-600) +async def Run3(): + await drive_base.straight(920) + await drive_base.turn(-90) + await drive_base.straight(60) + drive_base.turn(-10) + await left_arm.run_angle(10000,-4000) + await drive_base.straight(-110) + await drive_base.turn(90) + await drive_base.straight(2000) +async def Run4(): + await drive_base.straight(519) + await left_arm.run_angle(300, -100) + await left_arm.run_angle(300, 500) + await drive_base.straight(180) + await drive_base.turn(-37) + await drive_base.straight(50) + await right_arm.run_angle(300, -400) + await drive_base.straight(-150) + await drive_base.turn(125) + await drive_base.straight(50) + await right_arm.run_angle(300, 400) + await drive_base.straight(-75) + await right_arm.run_angle(300, 300) + await drive_base.turn(-40) + await drive_base.straight(250) + await right_arm.run_angle(100, -300) + await drive_base.straight(30) + await right_arm.run_angle(50,-250) + await drive_base.turn(30) + await drive_base.straight(-200) + await drive_base.turn(-50) + await drive_base.straight(-800) +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(): + left_arm.run_angle(500,200) + right_arm.run_angle(500,200) + await drive_base.straight(70) + await drive_base.turn(-55) + await drive_base.straight(900) + await drive_base.turn(92.5) + await drive_base.straight(75) + await drive_base.straight(21) + await right_arm.run_angle(500,-250) + await right_arm.run_angle(500,250) + await drive_base.straight(-20) + await drive_base.turn(55) + await left_arm.run_angle(300,-400) + await drive_base.turn(70) + await left_arm.run_angle(300,400) + await drive_base.turn(-60) + await drive_base.straight(900) +# 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 = [ + (330, 200), # E4 + (330, 100), # E4 + (330, 100), # E4 + (440, 600), # A4 + ] + + 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 = [ + (cn["Cs4"], 100), + (cn["E4"], 100), + (cn["Cs4"], 100), + (cn["Cs5"], 100), + (cn["Cs4"], 100), + (cn["Gs4"], 100), + (cn["E4"], 100), + (cn["Cs4"], 100), + (cn["Gs4"], 100), + (cn["Cs4"], 100), + (cn["Cs5"], 100), + (cn["Gs4"], 100), + (cn["Cs4"], 100), + (cn["Gs4"], 100), + (cn["Cs5"], 100), + (cn["Gs4"], 100) + ] + + + for freq, duration in notes: + await hub.speaker.beep(freq, duration) + await wait(20) +async def play_success_chime(): + """Simple success notification""" + notes = [ + (cn["E4"], 150), + (cn["Gs4"], 150), + (cn["B4"], 300), + ] + + + for freq, duration in notes: + await hub.speaker.beep(freq, duration) + await wait(50) +async def play_ta_da(): + """Classic "ta-da!" sound""" + notes = [ + (cn["B3"], 200), # B4 + (cn["E4"], 400), # E5 + ] + + for freq, duration in notes: + await hub.speaker.beep(freq, duration) + await wait(100) +async def play_power_up(): + """Rising power-up sound""" + frequencies = [ + 164.81, 207.65, 246.94, 329.63, 415.30, 493.88 + ] + + for freq in frequencies: + await hub.speaker.beep(freq, 50) + await wait(10) + + + await hub.speaker.beep(659.24, 200) +async def play_rickroll_inspired(): + """Fun 80s-style dance beat inspired sound""" + # Upbeat bouncy rhythm + pattern = [ + (cn["B3"], 200), (cn["Cs4"], 200), (cn["Ds4"], 200), (cn["E4"], 200), + (cn["Cs4"], 200), (cn["B3"], 200), (cn["A3"], 200), (cn["B3"], 300), + (cn["Cs4"], 200), (cn["B3"], 200), (cn["A3"], 200), (cn["Gs3"], 400), + ] + + + + for freq, duration in pattern: + await hub.speaker.beep(freq, duration) + await wait(50) +async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIRED): + """ + 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() + +async def main(): + # MAIN LOOP + while True: + await celebrate_mission_complete(CelebrationSound.LEVEL_UP) + color_reflected_percent = await color_sensor.reflection() + print(f"Color reflection percentage: {color_reflected_percent}") + + color_detected = await color_sensor.color() + print(f'Detected color: {color_detected}') + hsv = await color_sensor.hsv() + print(f"Measured HSV: {hsv}") + if color_reflected_percent > 0: + 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.ORANGE: + print('Running Mission 4') + await Run4() + await celebrate_mission_complete(CelebrationSound.POWER_UP) + 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() + else: + print("No color was detected.") + await wait(100) #prevent loop from iterating fast + +# Main execution loop +run_task(main()) \ No newline at end of file -- 2.49.1 From 9a06677dcc8e441ffde9496732ae7d8058c3aa38 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Sat, 11 Oct 2025 01:57:37 +0000 Subject: [PATCH 15/18] Added comments. Good luck for scrimmage y'all!!! --- twist_scrimmage.py | 35 ++++++++++++++++++++++++----------- 1 file changed, 24 insertions(+), 11 deletions(-) diff --git a/twist_scrimmage.py b/twist_scrimmage.py index 5210354..4b0d7fb 100644 --- a/twist_scrimmage.py +++ b/twist_scrimmage.py @@ -1,9 +1,11 @@ +# Imports... because we kinda need them... 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 +# Sets all the default values for the runs hub = PrimeHub() left_motor = Motor(Port.A, Direction.COUNTERCLOCKWISE) right_motor = Motor(Port.B) @@ -20,6 +22,7 @@ color_sensor.detectable_colors([Color.YELLOW, Color.BLUE, Color.GREEN, Color.WHI hub.speaker.volume(50) # Set the volume of the speaker color_sensor.detectable_colors() +# Notes to hertz for nice music cn = { "Cs3": 138.59, "D3": 146.83, @@ -49,7 +52,7 @@ cn = { } - +# RUNS - contains the mission code that will be executed on color sensor detection async def Run1(): left_arm.run_angle(1000, 300) right_arm.run_angle(1000,500) @@ -75,6 +78,7 @@ async def Run1(): await drive_base.straight(10) await drive_base.turn(35) await drive_base.straight(-600) + async def Run2(): await drive_base.straight(200) await drive_base.turn(-20) @@ -89,6 +93,7 @@ async def Run2(): await drive_base.straight(-100) await drive_base.turn(-100) await drive_base.straight(-600) + async def Run3(): await drive_base.straight(920) await drive_base.turn(-90) @@ -98,6 +103,7 @@ async def Run3(): await drive_base.straight(-110) await drive_base.turn(90) await drive_base.straight(2000) + async def Run4(): await drive_base.straight(519) await left_arm.run_angle(300, -100) @@ -121,12 +127,14 @@ async def Run4(): await drive_base.straight(-200) await drive_base.turn(-50) await drive_base.straight(-800) + 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(): left_arm.run_angle(500,200) right_arm.run_angle(500,200) @@ -145,15 +153,17 @@ async def Run6(): await left_arm.run_angle(300,400) await drive_base.turn(-60) await drive_base.straight(900) + # Celebration sound types class CelebrationSound: VICTORY_FANFARE = 0 - LEVEL_UP = 1 + WAITING_SOUND = 1 SUCCESS_CHIME = 2 TA_DA = 3 POWER_UP = 4 RICKROLL_INSPIRED = 5 +# Sounds functions async def play_victory_fanfare(): """Classic victory fanfare""" notes = [ @@ -166,8 +176,9 @@ async def play_victory_fanfare(): for freq, duration in notes: await hub.speaker.beep(freq, duration) await wait(50) -async def play_level_up(): - """Upward scale for level completion""" +async def play_waiting_sound(): + + # T3rm1na1 V3l0c1ty arpeggio recreated in pybricks notes = [ (cn["Cs4"], 100), (cn["E4"], 100), @@ -190,7 +201,6 @@ async def play_level_up(): for freq, duration in notes: await hub.speaker.beep(freq, duration) - await wait(20) async def play_success_chime(): """Simple success notification""" notes = [ @@ -239,6 +249,8 @@ async def play_rickroll_inspired(): for freq, duration in pattern: await hub.speaker.beep(freq, duration) await wait(50) + +# Basically a big if else statement that calls the functions above async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIRED): """ Main celebration function to call after completing a mission. @@ -253,8 +265,8 @@ async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIR # 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.WAITING_SOUND: + await play_waiting_sound() elif sound_type == CelebrationSound.SUCCESS_CHIME: await play_success_chime() elif sound_type == CelebrationSound.TA_DA: @@ -274,11 +286,12 @@ async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIR await wait(100) hub.light.off() - + +# This where everything happens async def main(): # MAIN LOOP while True: - await celebrate_mission_complete(CelebrationSound.LEVEL_UP) + await celebrate_mission_complete(CelebrationSound.WAITING_SOUND) color_reflected_percent = await color_sensor.reflection() print(f"Color reflection percentage: {color_reflected_percent}") @@ -310,14 +323,14 @@ async def main(): elif color_detected == Color.RED: print('Running Mission 6') await Run6() - await celebrate_mission_complete(CelebrationSound.LEVEL_UP) + await celebrate_mission_complete(CelebrationSound.POWER_UP) else: hub.light.off() left_motor.stop() right_motor.stop() else: print("No color was detected.") - await wait(100) #prevent loop from iterating fast + await wait(100) # prevent loop from iterating fast # Main execution loop run_task(main()) \ No newline at end of file -- 2.49.1 From dd0070d8e2bd48756b3798968b55de5e09668725 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Sat, 11 Oct 2025 02:16:06 +0000 Subject: [PATCH 16/18] Update twist_scrimmage.py --- twist_scrimmage.py | 39 ++++++++++++++++++++++++--------------- 1 file changed, 24 insertions(+), 15 deletions(-) diff --git a/twist_scrimmage.py b/twist_scrimmage.py index 4b0d7fb..d2c3047 100644 --- a/twist_scrimmage.py +++ b/twist_scrimmage.py @@ -167,10 +167,10 @@ class CelebrationSound: async def play_victory_fanfare(): """Classic victory fanfare""" notes = [ - (330, 200), # E4 - (330, 100), # E4 - (330, 100), # E4 - (440, 600), # A4 + (cn["B3"], 200), + (cn["B3"], 100), + (cn["B3"], 100), + (cn["E4"], 600) ] for freq, duration in notes: @@ -216,13 +216,24 @@ async def play_success_chime(): async def play_ta_da(): """Classic "ta-da!" sound""" notes = [ - (cn["B3"], 200), # B4 - (cn["E4"], 400), # E5 + (cn["Cs4"], 200), + (cn["Ds4"], 200), + (cn["E4"], 200), + (cn["Ds4"], 200), + (cn["E4"], 200), + (cn["Fs4"], 400), + (cn["Gs4"], 600), + (cn["Fs4"], 400), + (cn["Gs4"], 200), + (cn["A4"], 200), + (cn["B4"], 200), + (cn["C5"], 200), + (cn["Cs5"], 200) ] for freq, duration in notes: await hub.speaker.beep(freq, duration) - await wait(100) + #await wait(100) async def play_power_up(): """Rising power-up sound""" frequencies = [ @@ -239,19 +250,19 @@ async def play_rickroll_inspired(): """Fun 80s-style dance beat inspired sound""" # Upbeat bouncy rhythm pattern = [ - (cn["B3"], 200), (cn["Cs4"], 200), (cn["Ds4"], 200), (cn["E4"], 200), - (cn["Cs4"], 200), (cn["B3"], 200), (cn["A3"], 200), (cn["B3"], 300), - (cn["Cs4"], 200), (cn["B3"], 200), (cn["A3"], 200), (cn["Gs3"], 400), + (cn["Gs3"], 200), (cn["A3"], 200), (cn["B3"], 200), (cn["Cs4"], 200), + (cn["A3"], 200), (cn["Gs3"], 200), (cn["Fs3"], 200), (cn["Gs3"], 400), + (cn["A3"], 200), (cn["Gs3"], 200), (cn["Fs3"], 200), (cn["E3"], 400), ] for freq, duration in pattern: await hub.speaker.beep(freq, duration) - await wait(50) + #await wait(50) # Basically a big if else statement that calls the functions above -async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIRED): +async def celebrate_mission_complete(sound_type=CelebrationSound.WAITING_SOUND): """ Main celebration function to call after completing a mission. Plays a sound and shows light animation. @@ -323,7 +334,7 @@ async def main(): elif color_detected == Color.RED: print('Running Mission 6') await Run6() - await celebrate_mission_complete(CelebrationSound.POWER_UP) + await celebrate_mission_complete(CelebrationSound.TA_DA) else: hub.light.off() left_motor.stop() @@ -331,6 +342,4 @@ async def main(): else: print("No color was detected.") await wait(100) # prevent loop from iterating fast - -# Main execution loop run_task(main()) \ No newline at end of file -- 2.49.1 From bbdf0d0e3af24bd2251d9dd525e2b6933a475884 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Sat, 11 Oct 2025 02:25:18 +0000 Subject: [PATCH 17/18] Shortened fun sounds --- twist_scrimmage.py | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/twist_scrimmage.py b/twist_scrimmage.py index d2c3047..b796f44 100644 --- a/twist_scrimmage.py +++ b/twist_scrimmage.py @@ -249,11 +249,7 @@ async def play_power_up(): async def play_rickroll_inspired(): """Fun 80s-style dance beat inspired sound""" # Upbeat bouncy rhythm - pattern = [ - (cn["Gs3"], 200), (cn["A3"], 200), (cn["B3"], 200), (cn["Cs4"], 200), - (cn["A3"], 200), (cn["Gs3"], 200), (cn["Fs3"], 200), (cn["Gs3"], 400), - (cn["A3"], 200), (cn["Gs3"], 200), (cn["Fs3"], 200), (cn["E3"], 400), - ] + pattern = [ (cn["B3"], 100), (cn["Cs4"], 100), (cn["Ds4"], 100), (cn["E4"], 100), (cn["Cs4"], 100), (cn["B3"], 100), (cn["A3"], 100), (cn["B3"], 200), (cn["Cs4"], 100), (cn["B3"], 100), (cn["A3"], 100), (cn["Gs3"], 200), ] @@ -262,7 +258,7 @@ async def play_rickroll_inspired(): #await wait(50) # Basically a big if else statement that calls the functions above -async def celebrate_mission_complete(sound_type=CelebrationSound.WAITING_SOUND): +async def celebrate_mission_complete(sound_type=CelebrationSound.RICKROLL_INSPIRED): """ Main celebration function to call after completing a mission. Plays a sound and shows light animation. @@ -302,7 +298,7 @@ async def celebrate_mission_complete(sound_type=CelebrationSound.WAITING_SOUND): async def main(): # MAIN LOOP while True: - await celebrate_mission_complete(CelebrationSound.WAITING_SOUND) + await celebrate_mission_complete(CelebrationSound.RICKROLL_INSPIRED) color_reflected_percent = await color_sensor.reflection() print(f"Color reflection percentage: {color_reflected_percent}") -- 2.49.1 From d66aecd5ebdbb2520ee1f877a3b1a3bfba7dd623 Mon Sep 17 00:00:00 2001 From: Atharv <30nagava@elmbrookstudents.org> Date: Sat, 11 Oct 2025 02:29:50 +0000 Subject: [PATCH 18/18] Update README.md --- README.md | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 3688d70..49a400b 100644 --- a/README.md +++ b/README.md @@ -1,12 +1,12 @@ -# 65266 Lego Dynamics - UNEARTHED Season +# 65266 Lego Dynamics - UNEARTHED Season Robot Code