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 1/3] 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 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 2/3] 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 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 3/3] 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