From f67c925b5624ab819788174010b712112de7a271 Mon Sep 17 00:00:00 2001 From: Michel Date: Sat, 7 May 2022 20:17:41 +0200 Subject: [PATCH] v0.1.0 --- 42124-1 - Off-Road Buggy/main.py | 121 ++++++++++++++++++------------- 1 file changed, 71 insertions(+), 50 deletions(-) diff --git a/42124-1 - Off-Road Buggy/main.py b/42124-1 - Off-Road Buggy/main.py index 46c88e9..3711f0b 100644 --- a/42124-1 - Off-Road Buggy/main.py +++ b/42124-1 - Off-Road Buggy/main.py @@ -12,13 +12,19 @@ # Port D: Not used # # # ################################################################################ -# Script base: https://racingbrick.com/2021/08/remote-control-for-control-sets # -# -without-an-app-or-smartphone-pybricks/ # -################################################################################ # # # Changelog # # # ################################################################################ +# v0.1.0 05-07-2022 # +# restructured to the version at pybricks-projects on Github # +# https://github.com/pybricks/pybricks-projects/blob/master/sets/technic/ # +# 42124-off-road-buggy/powered-up-remote/main.py # +# Changed gearbox part. # +# Button left can only shift down # +# Button right can only shift up # +# New variables to easily change the number of gears # +# Added battery indicator with hub LED. # # v0.0.0 04-07-2022 # # First version. # # Based on v0.2.0 02-07-2022 of 42109-1 - App-Controlled Top Gear Rally Car # @@ -26,15 +32,19 @@ from pybricks.pupdevices import Motor, Remote from pybricks.parameters import Port, Direction, Stop, Button, Color +from pybricks.hubs import TechnicHub from pybricks.tools import wait # Initialize the motors. -steering = Motor(Port.B) +steering = Motor(Port.B, Direction.CLOCKWISE) driving = Motor(Port.A, Direction.COUNTERCLOCKWISE) # Connect to the remote. remote = Remote() +# Initialize the hub. +hub = TechnicHub() + # Read the current settings old_kp, old_ki, old_kd, _, _ = steering.control.pid() @@ -51,73 +61,84 @@ right_end = steering.run_until_stalled(200, then=Stop.HOLD) steering.reset_angle((right_end - left_end)/2) steering.run_target(speed=200, target_angle=0, wait=False) -# Set steering angle for the buggy -steer_angle = (((right_end - left_end)/2)-5) +# Set steering angle +steering_angle = (((right_end - left_end)/2)-5) # Set variable for gear -gear_old = 1 -gear = 1 -speed = 33 +gear_total = 3 # Total number of gears. +gear_old = None # Empty variable to set later on (keep + # empty!). +gear = 1 # Gear at start (must be higher than 0 and + # lower or eaqual to gear_total). +gear_color = ["BLUE", "WHITE", "RED"] # Number of colors should at least be + # equal to gear_total. + +# Battery variables +voltage_current = hub.battery.voltage() +voltage = voltage_current while True: # Check which buttons are pressed. pressed = remote.buttons.pressed() - # Check if the right middle button is pressed to change gear - if Button.RIGHT in pressed: - if gear_old is 1: - gear = 2 - elif gear_old is 2: - gear = 3 - else: - gear = 1 - while Button.RIGHT in pressed: - # Button debounce - wait(10) - pressed = remote.buttons.pressed() + # Choose the steering angle based on the right controls. + if Button.RIGHT_PLUS in pressed: + steering.run_target(1400, -steering_angle, Stop.HOLD, False) + elif Button.RIGHT_MINUS in pressed: + steering.run_target(1400, steering_angle, Stop.HOLD, False) + else: + steering.track_target(0) # Check if the left middle button is pressed to change gear if Button.LEFT in pressed: - if gear_old is 3: - gear = 2 - elif gear_old is 2: - gear = 1 - else: - gear = 3 + if gear_old > 1: + gear -= 1 while Button.LEFT in pressed: # Button debounce wait(10) pressed = remote.buttons.pressed() - if gear is not gear_old: - if gear is 1: - remote.light.on(Color.BLUE) - speed = 33 - gear_old = 1 - elif gear is 2: - remote.light.on(Color.WHITE) - speed = 67 - gear_old = 2 - else: - remote.light.on(Color.RED) - speed = 100 - gear_old = 3 + # Check if the right middle button is pressed to change gear + if Button.RIGHT in pressed: + if gear_old < gear_total: + gear += 1 + while Button.RIGHT in pressed: + # Button debounce + wait(10) + pressed = remote.buttons.pressed() - # Choose the steering angle based on the right controls. - if Button.RIGHT_PLUS in pressed: - steering.run_target(1400, -steer_angle, Stop.HOLD, False) - elif Button.RIGHT_MINUS in pressed: - steering.run_target(1400, steer_angle, Stop.HOLD, False) - else: - steering.track_target(0) + # Set speed according to the choosen gear. + if gear is not gear_old: + remote.light.on(Color[gear_color[gear-1]]) + speed = (100/gear_total)*gear + gear_old = gear # Choose the drive speed based on the left controls. + drive_speed = 0 if Button.LEFT_PLUS in pressed: - driving.dc(speed) + drive_speed += speed elif Button.LEFT_MINUS in pressed: - driving.dc(-speed) + drive_speed -= speed + + # Apply the selected speed. + driving.dc(drive_speed) + + # Show battery status by hub LED. + # Get current voltage and gradually up or down the value. + voltage_current = hub.battery.voltage() + if voltage_current < voltage: + voltage -= 1 + elif voltage_current > voltage: + voltage += 1 + # Show the correct color. + if voltage > 9000: + hub.light.on(Color.GREEN) + elif voltage > 8100: + hub.light.on(Color.YELLOW) + elif voltage > 7200: + hub.light.on(Color.ORANGE) else: - driving.dc(0) + hub.light.on(Color.RED) # Wait. wait(10)