From 0fbaa33c4a7d1758fe4e4b6e72c114a5747b9867 Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Fri, 21 Aug 2020 18:50:54 -0700 Subject: [PATCH 01/14] add SPIK3R README --- robots/SPIK3R/README.md | 10 ++++++++++ 1 file changed, 10 insertions(+) create mode 100644 robots/SPIK3R/README.md diff --git a/robots/SPIK3R/README.md b/robots/SPIK3R/README.md new file mode 100644 index 0000000..f44178e --- /dev/null +++ b/robots/SPIK3R/README.md @@ -0,0 +1,10 @@ +# SPIK3R + +> This six-legged creature doesn’t just look like a scorpion, it also acts like one. It turns sharply, snaps with it’s crushing claw, and it’s lightning tail is ready to fire at anyone or anything that gets in its way. + +Control SPIK3R with as follows: + +- Make SPIK3R move straight forward by pressing the IR Remote Control's two Up buttons at the same time +- Make SPIK3R turn right by pressing the IR Remote Control's Right Up button +- Make SPIK3R sting by pressing the IR Remote Control's Beacon button +- Make SPIKER pinch by pressing the Touch Sensor (please do connect one to enable this) From 5bdbd889157e57395cc05e6f30c4e87592319b96 Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Fri, 21 Aug 2020 18:52:07 -0700 Subject: [PATCH 02/14] update SPIK3R README --- robots/SPIK3R/README.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/robots/SPIK3R/README.md b/robots/SPIK3R/README.md index f44178e..e505f41 100644 --- a/robots/SPIK3R/README.md +++ b/robots/SPIK3R/README.md @@ -8,3 +8,5 @@ Control SPIK3R with as follows: - Make SPIK3R turn right by pressing the IR Remote Control's Right Up button - Make SPIK3R sting by pressing the IR Remote Control's Beacon button - Make SPIKER pinch by pressing the Touch Sensor (please do connect one to enable this) + +The build instructions may be found at the official LEGO MINDSTROMS site [here](https://www.lego.com/cdn/cs/set/assets/blt7dca5180ea66ea5e/31313_SPIK3R_2016.pdf). From 472851cf3abb2e51fce91574626a0b2202359192 Mon Sep 17 00:00:00 2001 From: Vinh Luong Date: Fri, 21 Aug 2020 20:35:08 -0700 Subject: [PATCH 03/14] fix SPIK3R README --- robots/SPIK3R/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robots/SPIK3R/README.md b/robots/SPIK3R/README.md index e505f41..a71134e 100644 --- a/robots/SPIK3R/README.md +++ b/robots/SPIK3R/README.md @@ -2,7 +2,7 @@ > This six-legged creature doesn’t just look like a scorpion, it also acts like one. It turns sharply, snaps with it’s crushing claw, and it’s lightning tail is ready to fire at anyone or anything that gets in its way. -Control SPIK3R with as follows: +Control SPIK3R as follows: - Make SPIK3R move straight forward by pressing the IR Remote Control's two Up buttons at the same time - Make SPIK3R turn right by pressing the IR Remote Control's Right Up button From d96abe1e6afdb460fefad2d96befef2613d691d3 Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Fri, 21 Aug 2020 20:53:01 -0700 Subject: [PATCH 04/14] update SPIK3R README --- robots/SPIK3R/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robots/SPIK3R/README.md b/robots/SPIK3R/README.md index a71134e..9cacf38 100644 --- a/robots/SPIK3R/README.md +++ b/robots/SPIK3R/README.md @@ -7,6 +7,6 @@ Control SPIK3R as follows: - Make SPIK3R move straight forward by pressing the IR Remote Control's two Up buttons at the same time - Make SPIK3R turn right by pressing the IR Remote Control's Right Up button - Make SPIK3R sting by pressing the IR Remote Control's Beacon button -- Make SPIKER pinch by pressing the Touch Sensor (please do connect one to enable this) +- Make SPIKER snap its claw by pressing the Touch Sensor (please do connect one to enable this) The build instructions may be found at the official LEGO MINDSTROMS site [here](https://www.lego.com/cdn/cs/set/assets/blt7dca5180ea66ea5e/31313_SPIK3R_2016.pdf). From 56a908d1de752f182a331bf84ec02d883df547c7 Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Fri, 21 Aug 2020 20:56:43 -0700 Subject: [PATCH 05/14] add Spik3r program --- robots/SPIK3R/spik3r.py | 102 ++++++++++++++++++++++++++++++++++++++++ 1 file changed, 102 insertions(+) create mode 100644 robots/SPIK3R/spik3r.py diff --git a/robots/SPIK3R/spik3r.py b/robots/SPIK3R/spik3r.py new file mode 100644 index 0000000..f1aa299 --- /dev/null +++ b/robots/SPIK3R/spik3r.py @@ -0,0 +1,102 @@ +#!/usr/bin/env micropython + + +from ev3dev2.motor import LargeMotor, MediumMotor, OUTPUT_A, OUTPUT_B, OUTPUT_D +from ev3dev2.sensor import INPUT_1, INPUT_4 +from ev3dev2.sensor.lego import TouchSensor, InfraredSensor +from ev3dev2.sound import Sound + + +class Spik3r: + def __init__( + self, + claw_motor_port: str = OUTPUT_A, + move_motor_port: str = OUTPUT_B, + sting_motor_port: str = OUTPUT_D, + touch_sensor_port: str = INPUT_1, + ir_sensor_port: str = INPUT_4, ir_beacon_channel: int = 1): + self.claw_motor = MediumMotor(address=claw_motor_port) + self.move_motor = LargeMotor(address=move_motor_port) + self.sting_motor = LargeMotor(address=sting_motor_port) + + self.ir_sensor = InfraredSensor(address=ir_sensor_port) + self.ir_beacon_channel = ir_beacon_channel + + self.touch_sensor = TouchSensor(address=touch_sensor_port) + + self.speaker = Sound() + + + def snap_claw_if_touched(self): + if self.touch_sensor.is_pressed: + self.claw_motor.on_for_seconds( + speed=50, + seconds=1, + brake=True, + block=True) + + self.claw_motor.on_for_seconds( + speed=-50, + seconds=0.3, + brake=True, + block=True) + + + def move_by_ir_beacon(self): + if self.ir_sensor.top_left(channel=self.ir_beacon_channel) and \ + self.ir_sensor.top_right(channel=self.ir_beacon_channel): + self.move_motor.on( + speed=100, + block=False, + brake=False) + + elif self.ir_sensor.top_right(channel=self.ir_beacon_channel): + self.move_motor.on( + speed=-100, + brake=False, + block=False) + + else: + self.move_motor.off(brake=False) + + + def sting_by_ir_beacon(self): + if self.ir_sensor.beacon(channel=self.ir_beacon_channel): + self.sting_motor.on_for_degrees( + speed=-75, + degrees=220, + brake=True, + block=False) + + self.speaker.play_file( + wav_file='/home/robot/sound/Blip 3.wav', + volume=100, + play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + + self.sting_motor.on_for_seconds( + speed=-100, + seconds=1, + brake=True, + block=True) + + self.sting_motor.on_for_seconds( + speed=40, + seconds=1, + brake=True, + block=True) + + while self.ir_sensor.beacon(channel=self.ir_beacon_channel): + pass + + + def main(self): + while True: + self.snap_claw_if_touched() + self.move_by_ir_beacon() + self.sting_by_ir_beacon() + + +if __name__ == '__main__': + SPIK3R = Spik3r() + + SPIK3R.main() From 20dd20d8cc3023666adef0e6216946f753652a1c Mon Sep 17 00:00:00 2001 From: Vinh Luong Date: Sun, 23 Aug 2020 10:34:21 -0700 Subject: [PATCH 06/14] add SPIK3R sound file --- robots/SPIK3R/Blip 3.wav | Bin 0 -> 13292 bytes robots/SPIK3R/spik3r.py | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) create mode 100644 robots/SPIK3R/Blip 3.wav diff --git a/robots/SPIK3R/Blip 3.wav b/robots/SPIK3R/Blip 3.wav new file mode 100644 index 0000000000000000000000000000000000000000..2678a34e697ca856b9963a7753a45d5c2a1d81a8 GIT binary patch literal 13292 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 Date: Mon, 31 Aug 2020 20:11:33 -0700 Subject: [PATCH 07/14] remove blank spaces warned by linters in Spik3r program --- robots/SPIK3R/spik3r.py | 5 ----- 1 file changed, 5 deletions(-) diff --git a/robots/SPIK3R/spik3r.py b/robots/SPIK3R/spik3r.py index c2d2027..d8ab5b7 100644 --- a/robots/SPIK3R/spik3r.py +++ b/robots/SPIK3R/spik3r.py @@ -25,7 +25,6 @@ def __init__( self.touch_sensor = TouchSensor(address=touch_sensor_port) self.speaker = Sound() - def snap_claw_if_touched(self): if self.touch_sensor.is_pressed: @@ -41,7 +40,6 @@ def snap_claw_if_touched(self): brake=True, block=True) - def move_by_ir_beacon(self): if self.ir_sensor.top_left(channel=self.ir_beacon_channel) and \ self.ir_sensor.top_right(channel=self.ir_beacon_channel): @@ -59,7 +57,6 @@ def move_by_ir_beacon(self): else: self.move_motor.off(brake=False) - def sting_by_ir_beacon(self): if self.ir_sensor.beacon(channel=self.ir_beacon_channel): self.sting_motor.on_for_degrees( @@ -88,7 +85,6 @@ def sting_by_ir_beacon(self): while self.ir_sensor.beacon(channel=self.ir_beacon_channel): pass - def main(self): while True: self.snap_claw_if_touched() @@ -98,5 +94,4 @@ def main(self): if __name__ == '__main__': SPIK3R = Spik3r() - SPIK3R.main() From b2f4bb5a44474446c7495e7f80cd5e639eb8da2a Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Sat, 17 Oct 2020 13:47:49 -0700 Subject: [PATCH 08/14] fix minor typo to SPIK3R README --- robots/SPIK3R/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robots/SPIK3R/README.md b/robots/SPIK3R/README.md index 9cacf38..6393e9b 100644 --- a/robots/SPIK3R/README.md +++ b/robots/SPIK3R/README.md @@ -7,6 +7,6 @@ Control SPIK3R as follows: - Make SPIK3R move straight forward by pressing the IR Remote Control's two Up buttons at the same time - Make SPIK3R turn right by pressing the IR Remote Control's Right Up button - Make SPIK3R sting by pressing the IR Remote Control's Beacon button -- Make SPIKER snap its claw by pressing the Touch Sensor (please do connect one to enable this) +- Make SPIK3R snap its claw by pressing the Touch Sensor (please do connect one to enable this) The build instructions may be found at the official LEGO MINDSTROMS site [here](https://www.lego.com/cdn/cs/set/assets/blt7dca5180ea66ea5e/31313_SPIK3R_2016.pdf). From 2601e7fc9abb3b5659815167be4963f7e0640ece Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Sat, 17 Oct 2020 13:58:42 -0700 Subject: [PATCH 09/14] add Dinor3x program --- robots/DINOR3X/README.md | 24 ++++ robots/DINOR3X/T-rex roar.wav | Bin 0 -> 31724 bytes robots/DINOR3X/dinor3x.py | 247 ++++++++++++++++++++++++++++++++++ 3 files changed, 271 insertions(+) create mode 100644 robots/DINOR3X/README.md create mode 100644 robots/DINOR3X/T-rex roar.wav create mode 100644 robots/DINOR3X/dinor3x.py diff --git a/robots/DINOR3X/README.md b/robots/DINOR3X/README.md new file mode 100644 index 0000000..6237870 --- /dev/null +++ b/robots/DINOR3X/README.md @@ -0,0 +1,24 @@ +# DINOR3X + +> Designed by Lasse Stenbæk Lauesen +> +> This charming robotic triceratops dinosaur is capable of walking and turning on all fours. + +The build instructions may be found at the official LEGO MINDSTROMS site [here](https://www.lego.com/cdn/cs/set/assets/bltad10c02978864265/DINOR3X.pdf). + +Please add a Color Sensor to Dinor3x's back or tail. Control DINOR3X as follows: + +- Make DINOR3X roar by pressing the IR Remote Control's Beacon button + +- Make DINOR3X walk or turn according to instructions from the IR Beacon + - 2 top/up buttons together: walk forward + - 2 bottom/down buttons together: walk backward + - Top Left / Red Up: turn left on the spot + - Top Right / Blue Up: turn right on the spot + - Bottom Left / Red Down: stop + - Bottom Right / Blue Down: calibrate to make the legs straight + +- Make DINOR3X change its speed when detecting some colors + - Red: walk fast + - Green: walk normally + - White: walk slowly diff --git a/robots/DINOR3X/T-rex roar.wav b/robots/DINOR3X/T-rex roar.wav new file mode 100644 index 0000000000000000000000000000000000000000..5a0346a74945e199d1f1e995e016cda424b534a3 GIT binary patch literal 31724 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 QeAtCl56Q%SX|Ox>e^F8t`~Uy| literal 0 HcmV?d00001 diff --git a/robots/DINOR3X/dinor3x.py b/robots/DINOR3X/dinor3x.py new file mode 100644 index 0000000..c27dfdf --- /dev/null +++ b/robots/DINOR3X/dinor3x.py @@ -0,0 +1,247 @@ +#!/usr/bin/env micropython + + +from ev3dev2.motor import ( + LargeMotor, MediumMotor, MoveTank, MoveSteering, + OUTPUT_A, OUTPUT_B, OUTPUT_C +) +from ev3dev2.sensor import INPUT_1, INPUT_3, INPUT_4 +from ev3dev2.sensor.lego import TouchSensor, ColorSensor, InfraredSensor +from ev3dev2.sound import Sound + + +class Dinor3x: + FAST_WALK_SPEED = 80 + NORMAL_WALK_SPEED = 40 + SLOW_WALK_SPEED = 20 + + def __init__( + self, + jaw_motor_port: str = OUTPUT_A, + left_motor_port: str = OUTPUT_B, right_motor_port: str = OUTPUT_C, + touch_sensor_port: str = INPUT_1, color_sensor_port: str = INPUT_3, + ir_sensor_port: str = INPUT_4, ir_beacon_channel: int = 1): + self.jaw_motor = MediumMotor(address=jaw_motor_port) + + self.left_motor = LargeMotor(address=left_motor_port) + self.right_motor = LargeMotor(address=right_motor_port) + self.tank_driver = MoveTank(left_motor_port=left_motor_port, + right_motor_port=right_motor_port, + motor_class=LargeMotor) + self.steer_driver = MoveSteering(left_motor_port=left_motor_port, + right_motor_port=right_motor_port, + motor_class=LargeMotor) + + self.touch_sensor = TouchSensor(address=touch_sensor_port) + self.color_sensor = ColorSensor(address=color_sensor_port) + + self.ir_sensor = InfraredSensor(address=ir_sensor_port) + self.ir_beacon_channel = ir_beacon_channel + + self.speaker = Sound() + + self.roaring = False + self.walk_speed = self.NORMAL_WALK_SPEED + + def roar_by_ir_beacon(self): + """ + Dinor3x roars when the Beacon button is pressed + """ + if self.ir_sensor.beacon(channel=self.ir_beacon_channel): + self.roaring = True + self.open_mouth() + self.roar() + + elif self.roaring: + self.roaring = False + self.close_mouth() + + def change_speed_by_color(self): + """ + Dinor3x changes its speed when detecting some colors + - Red: walk fast + - Green: walk normally + - White: walk slowly + """ + if self.color_sensor.color == ColorSensor.COLOR_RED: + self.speaker.speak( + text='RUN!', + volume=100, + play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + self.walk_speed = self.FAST_WALK_SPEED + self.walk(speed=self.walk_speed) + + elif self.color_sensor.color == ColorSensor.COLOR_GREEN: + self.speaker.speak( + text='Normal', + volume=100, + play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + self.walk_speed = self.NORMAL_WALK_SPEED + self.walk(speed=self.walk_speed) + + elif self.color_sensor.color == ColorSensor.COLOR_WHITE: + self.speaker.speak( + text='slow...', + volume=100, + play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + self.walk_speed = self.SLOW_WALK_SPEED + self.walk(speed=self.walk_speed) + + def walk_by_ir_beacon(self): + """ + Dinor3x walks or turns according to instructions from the IR Beacon + - 2 top/up buttons together: walk forward + - 2 bottom/down buttons together: walk backward + - Top Left / Red Up: turn left on the spot + - Top Right / Blue Up: turn right on the spot + - Bottom Left / Red Down: stop + - Bottom Right / Blue Down: calibrate to make the legs straight + """ + + # forward + if self.ir_sensor.top_left(channel=self.ir_beacon_channel) and \ + self.ir_sensor.top_right: + self.walk(speed=self.walk_speed) + + # backward + elif self.ir_sensor.bottom_left(channel=self.ir_beacon_channel) and \ + self.ir_sensor.bottom_right(channel=self.ir_beacon_channel): + self.walk(speed=-self.walk_speed) + + # turn left on the spot + elif self.ir_sensor.top_left(channel=self.ir_beacon_channel): + self.turn(speed=self.walk_speed) + + # turn right on the spot + elif self.ir_sensor.top_right(channel=self.ir_beacon_channel): + self.turn(speed=-self.walk_speed) + + # stop + elif self.ir_sensor.bottom_left(channel=self.ir_beacon_channel): + self.tank_driver.off(brake=True) + + # calibrate legs + elif self.ir_sensor.bottom_right(channel=self.ir_beacon_channel): + self.calibrate_legs() + + def calibrate_legs(self): + self.tank_driver.on( + left_speed=10, + right_speed=20) + + self.touch_sensor.wait_for_released() + + self.tank_driver.off(brake=True) + + self.left_motor.on(speed=40) + + self.touch_sensor.wait_for_pressed() + + self.left_motor.off(brake=True) + + self.left_motor.on_for_rotations( + rotations=-0.2, + speed=50, + brake=True, + block=True) + + self.right_motor.on(speed=40) + + self.touch_sensor.wait_for_pressed() + + self.right_motor.off(brake=True) + + self.right_motor.on_for_rotations( + rotations=-0.2, + speed=50, + brake=True, + block=True) + + self.left_motor.reset() + self.right_motor.reset() + + def walk(self, speed: float = 100): + self.calibrate_legs() + + self.steer_driver.on( + steering=0, + speed=-speed) + + def turn(self, speed: float = 100): + self.calibrate_legs() + + if speed >= 0: + self.left_motor.on_for_degrees( + degrees=180, + speed=speed, + brake=True, + block=True) + + else: + self.right_motor.on_for_degrees( + degrees=180, + speed=-speed, + brake=True, + block=True) + + self.tank_driver.on( + left_speed=speed, + right_speed=-speed) + + def close_mouth(self): + self.jaw_motor.on_for_seconds( + speed=-20, + seconds=1, + brake=False, + block=False) + + def open_mouth(self): + self.jaw_motor.on_for_seconds( + speed=20, + seconds=1, + block=False, + brake=False) + + def roar(self): + self.speaker.play_file( + wav_file='T-rex roar.wav', + volume=100, + play_type=Sound.PLAY_NO_WAIT_FOR_COMPLETE) + + self.jaw_motor.on_for_degrees( + speed=40, + degrees=-60, + block=True, + brake=True) + + for i in range(12): + self.jaw_motor.on_for_seconds( + speed=-40, + seconds=0.05, + block=True, + brake=True) + + self.jaw_motor.on_for_seconds( + speed=40, + seconds=0.05, + block=True, + brake=True) + + self.jaw_motor.on_for_seconds( + speed=20, + seconds=0.5, + brake=False, + block=True) + + def main(self): + self.close_mouth() + + while True: + self.roar_by_ir_beacon() + self.change_speed_by_color() + self.walk_by_ir_beacon() + + +if __name__ == '__main__': + DINOR3X = Dinor3x() + DINOR3X.main() From 75bd6b98f225d2b6748a851d38adfe71c6c39672 Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Sat, 17 Oct 2020 14:23:50 -0700 Subject: [PATCH 10/14] minor change to Dinor3x.change_speed_by_color() --- robots/DINOR3X/dinor3x.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/robots/DINOR3X/dinor3x.py b/robots/DINOR3X/dinor3x.py index c27dfdf..c959621 100644 --- a/robots/DINOR3X/dinor3x.py +++ b/robots/DINOR3X/dinor3x.py @@ -67,7 +67,7 @@ def change_speed_by_color(self): self.speaker.speak( text='RUN!', volume=100, - play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + play_type=Sound.PLAY_NO_WAIT_FOR_COMPLETE) self.walk_speed = self.FAST_WALK_SPEED self.walk(speed=self.walk_speed) @@ -75,7 +75,7 @@ def change_speed_by_color(self): self.speaker.speak( text='Normal', volume=100, - play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + play_type=Sound.PLAY_NO_WAIT_FOR_COMPLETE) self.walk_speed = self.NORMAL_WALK_SPEED self.walk(speed=self.walk_speed) @@ -83,7 +83,7 @@ def change_speed_by_color(self): self.speaker.speak( text='slow...', volume=100, - play_type=Sound.PLAY_WAIT_FOR_COMPLETE) + play_type=Sound.PLAY_NO_WAIT_FOR_COMPLETE) self.walk_speed = self.SLOW_WALK_SPEED self.walk(speed=self.walk_speed) From 5925e4af8996a58205d36945c0d73f50f681b32d Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Sat, 17 Oct 2020 15:04:22 -0700 Subject: [PATCH 11/14] update .GitIgnore to ignore VSCode files --- .gitignore | 3 +++ 1 file changed, 3 insertions(+) diff --git a/.gitignore b/.gitignore index 15c993e..1cf2ae4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,3 +1,6 @@ __pycache__ *.pyc *.swp + +# Visual Studio Code files +.vscode/ From 4ffeb5c69f563d38ea6c4da675dcb3b2d320e53c Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Thu, 12 Nov 2020 14:05:33 -0800 Subject: [PATCH 12/14] add EV3 Game program --- robots/EV3_GAME/Boo.wav | Bin 0 -> 17324 bytes robots/EV3_GAME/Cheering.wav | Bin 0 -> 50732 bytes robots/EV3_GAME/README.md | 22 ++ robots/EV3_GAME/ev3_game.py | 396 +++++++++++++++++++++++++++++++++++ 4 files changed, 418 insertions(+) create mode 100644 robots/EV3_GAME/Boo.wav create mode 100644 robots/EV3_GAME/Cheering.wav create mode 100644 robots/EV3_GAME/README.md create mode 100644 robots/EV3_GAME/ev3_game.py diff --git a/robots/EV3_GAME/Boo.wav b/robots/EV3_GAME/Boo.wav new file mode 100644 index 0000000000000000000000000000000000000000..00872c2539a583cb491a95ead8f350729ba62d01 GIT binary patch literal 17324 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⁢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 U1+{{Spa-%D^CPRU@Vd_b1EsCcpa1{> literal 0 HcmV?d00001 diff --git a/robots/EV3_GAME/Cheering.wav b/robots/EV3_GAME/Cheering.wav new file mode 100644 index 0000000000000000000000000000000000000000..50e9d12187b9e9f35cff2343cc6e2f849caed6d4 GIT binary patch literal 50732 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 TU()|e>wlNwuiE& Designed by Ricardo Oliveira +> +> This robot is all set to play tricks on you. Hide the red ball under the shell, use the IR Beacon to set your level, and watch the robot shuffle and hide the ball – but where? Challenge your friends to see who can find the red ball first! + +The build instructions may be found at the official LEGO MINDSTROMS site [here](https://www.lego.com/cdn/cs/set/assets/bltced0f5f5980c6a3d/EV3GAME.pdf) + +EV3Game works as follows: + +- Put a small ball or marble under the middle cup. + +- Choose the difficulty level by the IR beacon buttons: the Up buttons raise the level (up to 9) and the Down buttons lower the level (minimum 1). The level is printed on the screen. + +- Press the Touch Sensor to start the game and make the robot shuffle the cups. + +- Guess which cup has the ball by pressing: + - Left Up IR button: choose left cup + - Beacon IR button (press twice): choose middle cup + - Right Up IR button: choose right cup + +- Repeat again and again to play many games. diff --git a/robots/EV3_GAME/ev3_game.py b/robots/EV3_GAME/ev3_game.py new file mode 100644 index 0000000..840b4d5 --- /dev/null +++ b/robots/EV3_GAME/ev3_game.py @@ -0,0 +1,396 @@ +#!/usr/bin/env micropython + + +from ev3dev2.motor import LargeMotor, MediumMotor, OUTPUT_A, OUTPUT_B, OUTPUT_C +from ev3dev2.sensor import INPUT_1, INPUT_4 +from ev3dev2.sensor.lego import TouchSensor, InfraredSensor +from ev3dev2.console import Console +from ev3dev2.led import Leds +from ev3dev2.sound import Sound + +from random import randint +from time import sleep, time + + +class EV3Game: + N_LEVELS = 4 + N_OFFSET_DEGREES_FOR_HOLD_CUP = 60 + N_SHUFFLE_SECONDS = 15 + + def __init__( + self, + b_motor_port: str = OUTPUT_B, c_motor_port: str = OUTPUT_C, + grip_motor_port: str = OUTPUT_A, + touch_sensor_port: str = INPUT_1, + ir_sensor_port: str = INPUT_4, ir_beacon_channel: int = 1): + self.b_motor = LargeMotor(address=b_motor_port) + self.c_motor = LargeMotor(address=c_motor_port) + + self.grip_motor = MediumMotor(address=grip_motor_port) + + self.touch_sensor = TouchSensor(address=touch_sensor_port) + + self.ir_sensor = InfraredSensor(address=ir_sensor_port) + self.ir_beacon_channel = ir_beacon_channel + + self.console = Console() + self.leds = Leds() + self.speaker = Sound() + + def calibrate_grip(self): + self.grip_motor.on( + speed=-10, + block=False, + brake=False) + + self.grip_motor.wait_until_not_moving() + + self.grip_motor.on_for_degrees( + speed=10, + degrees=30, + brake=True, + block=True) + + def display_level(self): + self.console.text_at( + column=1, row=1, + text='Level {}'.format(self.level), + reset_console=True, + inverse=False, + alignment='L') + + sleep(0.3) + + def start_up(self): + self.leds.set_color( + group='LEFT', + color='RED', + pct=1) + self.leds.set_color( + group='RIGHT', + color='RED', + pct=1) + + self.calibrate_grip() + + self.level = 1 + + self.display_level() + + self.choice = 2 + + self.current_b = self.current_c = 1 + + def select_level(self): + while self.touch_sensor.is_released: + if (self.ir_sensor.top_left(channel=self.ir_beacon_channel) or + self.ir_sensor.top_right(channel=self.ir_beacon_channel)) \ + and (self.level < self.N_LEVELS): + self.level += 1 + + self.display_level() + + elif (self.ir_sensor.bottom_left(channel=self.ir_beacon_channel) or + self.ir_sensor.bottom_right(channel=self.ir_beacon_channel))\ + and (self.level > 1): + self.level -= 1 + + self.display_level() + + def move_1_rotate_b(self): + if self.current_b == 1: + self.rotate_b = self.N_OFFSET_DEGREES_FOR_HOLD_CUP + 180 + + elif self.current_b == 2: + self.rotate_b = 2 * self.N_OFFSET_DEGREES_FOR_HOLD_CUP + 180 + + elif self.current_b == 3: + self.rotate_b = 180 + + def move_1_rotate_c(self): + if self.current_c == 1: + self.rotate_c = 0 + + elif self.current_c == 2: + self.rotate_c = -self.N_OFFSET_DEGREES_FOR_HOLD_CUP + + elif self.current_c == 3: + self.rotate_c = self.N_OFFSET_DEGREES_FOR_HOLD_CUP + + def move_1(self): + self.move_1_rotate_b() + self.move_1_rotate_c() + + self.current_b = 3 + self.current_c = 1 + + def move_2_rotate_b(self): + if self.current_b == 1: + self.rotate_b = -self.N_OFFSET_DEGREES_FOR_HOLD_CUP - 180 + + elif self.current_b == 2: + self.rotate_b = -180 + + elif self.current_b == 3: + self.rotate_b = -2 * self.N_OFFSET_DEGREES_FOR_HOLD_CUP - 180 + + move_2_rotate_c = move_1_rotate_c + + def move_2(self): + self.move_2_rotate_b() + self.move_2_rotate_c() + + self.current_b = 2 + self.current_c = 1 + + def move_3_rotate_b(self): + if self.current_b == 1: + self.rotate_b = 0 + + elif self.current_b == 2: + self.rotate_b = self.N_OFFSET_DEGREES_FOR_HOLD_CUP + + elif self.current_b == 3: + self.rotate_b = -self.N_OFFSET_DEGREES_FOR_HOLD_CUP + + def move_3_rotate_c(self): + if self.current_c == 1: + self.rotate_c = self.N_OFFSET_DEGREES_FOR_HOLD_CUP + 180 + + elif self.current_c == 2: + self.rotate_c = 180 + + elif self.current_c == 3: + self.rotate_c = 2 * self.N_OFFSET_DEGREES_FOR_HOLD_CUP + 180 + + def move_3(self): + self.move_3_rotate_b() + self.move_3_rotate_c() + + self.current_b = 1 + self.current_c = 2 + + move_4_rotate_b = move_3_rotate_b + + def move_4_rotate_c(self): + if self.current_c == 1: + self.rotate_c = -self.N_OFFSET_DEGREES_FOR_HOLD_CUP - 180 + + elif self.current_c == 2: + self.rotate_c = -2 * self.N_OFFSET_DEGREES_FOR_HOLD_CUP - 180 + + elif self.current_c == 3: + self.rotate_c = -180 + + def move_4(self): + self.move_4_rotate_b() + self.move_4_rotate_c() + + self.current_b = 1 + self.current_c = 3 + + def execute_move(self): + speed = 10 * self.level + + if self.current_b == 1: + self.b_motor.on_for_degrees( + speed=speed, + degrees=self.rotate_b, + brake=True, + block=True) + + self.c_motor.on_for_degrees( + speed=speed, + degrees=self.rotate_c, + brake=True, + block=True) + + else: + assert self.current_c == 1 + + self.c_motor.on_for_degrees( + speed=speed, + degrees=self.rotate_c, + brake=True, + block=True) + + self.b_motor.on_for_degrees( + speed=speed, + degrees=self.rotate_b, + brake=True, + block=True) + + def update_ball_cup(self): + if self.move in {1, 2}: + if self.cup_with_ball == 1: + self.cup_with_ball = 2 + + elif self.cup_with_ball == 2: + self.cup_with_ball = 1 + + else: + if self.cup_with_ball == 2: + self.cup_with_ball = 3 + + elif self.cup_with_ball == 3: + self.cup_with_ball = 2 + + def shuffle(self): + shuffle_start_time = time() + + while time() - shuffle_start_time < self.N_SHUFFLE_SECONDS: + self.move = randint(1, 4) + + if self.move == 1: + self.move_1() + + elif self.move == 2: + self.move_2() + + elif self.move == 3: + self.move_3() + + elif self.move == 4: + self.move_4() + + self.execute_move() + self.update_ball_cup() + + def reset_motor_positions(self): + """ + Resetting motors' positions like it is done when the moves finish + """ + # Resetting Motor B to Position 1, + # which, for Motor B corresponds to Move 3 + self.move_3_rotate_b() + + # Reseting Motor C to Position 1, + # which, for Motor C corresponds to Move 1 + self.move_1_rotate_c() + + self.current_b = self.current_c = 1 + + # Executing the reset for both motors + self.execute_move() + + def select_choice(self): + self.choice = None + + while not self.choice: + if self.ir_sensor.top_left(channel=self.ir_beacon_channel): + self.choice = 1 + + elif self.ir_sensor.beacon(channel=self.ir_beacon_channel): + self.choice = 2 + + # wait for BEACON button to turn off + while self.ir_sensor.beacon(channel=self.ir_beacon_channel): + pass + + elif self.ir_sensor.top_right(channel=self.ir_beacon_channel): + self.choice = 3 + + def cup_to_center(self): + # Saving a copy of the current Level + self.level_copy = self.level + + # Using Level 1 to rotate the chosen cup to the center + self.level = 1 + + if self.choice == 1: + self.move = 1 + self.move_1() + + self.execute_move() + self.update_ball_cup() + + elif self.choice == 3: + self.move = 3 + self.move_3() + + self.execute_move() + self.update_ball_cup() + + self.reset_motor_positions() + + # Restoring previous value of Level + self.level = self.level_copy + + def lift_cup(self): + self.grip_motor.on_for_degrees( + speed=10, + degrees=220, + brake=True, + block=True) + + def main(self): + self.start_up() + + while True: + self.cup_with_ball = 2 + + self.select_level() + + self.leds.set_color( + group='LEFT', + color='GREEN', + pct=1) + self.leds.set_color( + group='RIGHT', + color='GREEN', + pct=1) + + self.shuffle() + + self.reset_motor_positions() + + self.leds.all_off() + + correct_choice = False + + while not correct_choice: + self.select_choice() + + self.cup_to_center() + + # The choice will be now in the middle, Position 2 + + self.lift_cup() + + correct_choice = (self.cup_with_ball == 2) + + if correct_choice: + self.leds.animate_flash( + color='GREEN', + groups=('LEFT', 'RIGHT'), + sleeptime=0.5, + duration=3, + block=False) + + self.speaker.play_file( + wav_file='Cheering.wav', + volume=100, + play_type=Sound.PLAY_NO_WAIT_FOR_COMPLETE) + + else: + self.leds.animate_flash( + color='RED', + groups=('LEFT', 'RIGHT'), + sleeptime=0.5, + duration=3, + block=False) + + self.speaker.play_file( + wav_file='Boo.wav', + volume=100, + play_type=Sound.PLAY_NO_WAIT_FOR_COMPLETE) + + sleep(2) + + self.calibrate_grip() + + +if __name__ == '__main__': + EV3_GAME = EV3Game() + + EV3_GAME.main() From e4fe0055808ec42e03599d3bf556b995d8ba4341 Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Thu, 12 Nov 2020 14:17:21 -0800 Subject: [PATCH 13/14] fix EV3 Game number of levels (4) --- robots/EV3_GAME/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robots/EV3_GAME/README.md b/robots/EV3_GAME/README.md index 0057b64..bee6e01 100644 --- a/robots/EV3_GAME/README.md +++ b/robots/EV3_GAME/README.md @@ -10,7 +10,7 @@ EV3Game works as follows: - Put a small ball or marble under the middle cup. -- Choose the difficulty level by the IR beacon buttons: the Up buttons raise the level (up to 9) and the Down buttons lower the level (minimum 1). The level is printed on the screen. +- Choose the difficulty level by the IR beacon buttons: the Up buttons raise the level (up to 4) and the Down buttons lower the level (minimum 1). The level is printed on the screen. - Press the Touch Sensor to start the game and make the robot shuffle the cups. From 763ea6f14b0007adf6e3e26cd01f35a7ef058e1a Mon Sep 17 00:00:00 2001 From: Antoni Luong Pham Date: Sun, 13 Dec 2020 00:55:01 -0800 Subject: [PATCH 14/14] edit EV3 GAME program --- robots/EV3_GAME/ev3_game.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/robots/EV3_GAME/ev3_game.py b/robots/EV3_GAME/ev3_game.py index 840b4d5..ded3798 100644 --- a/robots/EV3_GAME/ev3_game.py +++ b/robots/EV3_GAME/ev3_game.py @@ -16,7 +16,7 @@ class EV3Game: N_LEVELS = 4 N_OFFSET_DEGREES_FOR_HOLD_CUP = 60 N_SHUFFLE_SECONDS = 15 - + def __init__( self, b_motor_port: str = OUTPUT_B, c_motor_port: str = OUTPUT_C,