From 7e33df8d473c7c944cc38cf6d486931de4cabdba Mon Sep 17 00:00:00 2001 From: Michel Date: Sat, 7 May 2022 20:13:40 +0200 Subject: [PATCH] v0.2.0 --- .../main.py | 252 +++++++++++------- 1 file changed, 150 insertions(+), 102 deletions(-) diff --git a/DAKAR TRIAL Truck 42114 B alternate model Zetros killer by RM8 LEGO Garage - BrickGarage (MOC-113177)/main.py b/DAKAR TRIAL Truck 42114 B alternate model Zetros killer by RM8 LEGO Garage - BrickGarage (MOC-113177)/main.py index 3f4dbb6..3da3ed7 100644 --- a/DAKAR TRIAL Truck 42114 B alternate model Zetros killer by RM8 LEGO Garage - BrickGarage (MOC-113177)/main.py +++ b/DAKAR TRIAL Truck 42114 B alternate model Zetros killer by RM8 LEGO Garage - BrickGarage (MOC-113177)/main.py @@ -1,102 +1,150 @@ -################################################################################ -# # -# pybricks script for DAKAR / TRIAL Truck 42114 B alternate model / Zetros # -# killer by RM8 LEGO Garage - BrickGarage # -# # -# This script enables the LEGO® Powered Up Technic Hub to be used with the # -# LEGO® Powerd UP 88010 Remote. # -# # -# Configuration of the Technic Hub: # -# Port A: Drive motor # -# Port B: Steering with left and right limited # -# Port C: Drive motor # -# Port D: Not used # -# # -################################################################################ -# Rebrickable: https://rebrickable.com/mocs/MOC-113177/ # -# Script base: https://racingbrick.com/2021/08/remote-control-for-control-sets # -# -without-an-app-or-smartphone-pybricks/ # -################################################################################ -# # -# Changelog # -# # -################################################################################ -# v0.1.0 26-06-2022 # -# Added half speed for drive. # -# Added half angle for steering. # -# v0.0.0 26-06-2022 # -# First version. # -# Based on v0.0.0 22-06-2022 of 42129 B model 'Hot Trot' by Didumos # -################################################################################ - -from pybricks.pupdevices import Motor, Remote -from pybricks.parameters import Port, Direction, Stop, Button -from pybricks.tools import wait - -# Initialize the motors. -steering = Motor(Port.B, Direction.CLOCKWISE) -driving_1 = Motor(Port.A, Direction.COUNTERCLOCKWISE) -driving_2 = Motor(Port.C, Direction.CLOCKWISE) - -# Connect to the remote. -remote = Remote() - -# Read the current settings -old_kp, old_ki, old_kd, _, _ = steering.control.pid() - -# Set new values -steering.control.pid(kp=old_kp*4, kd=old_kd*0.4) - -# Find the steering endpoint on the left and right. -# The middle is in between. -left_end = steering.run_until_stalled(-200, then=Stop.HOLD) -right_end = steering.run_until_stalled(200, then=Stop.HOLD) - -# We are now at the right. Reset this angle to be half the difference. -# That puts zero in the middle. -steering.reset_angle((right_end - left_end)/2) -steering.run_target(speed=200, target_angle=0, wait=False) - -# Set steering angle -steer_angle = (((right_end - left_end)/2)-5) -print('steer angle:',steer_angle) - -while True: - # Check which buttons are pressed. - pressed = remote.buttons.pressed() - - # Choose the steering angle based on the right controls. - if Button.RIGHT_MINUS in pressed: - if Button.RIGHT in pressed: - steering.run_target(1400, -(steer_angle/4), Stop.HOLD, False) - else: - steering.run_target(1400, -steer_angle, Stop.HOLD, False) - elif Button.RIGHT_PLUS in pressed: - if Button.RIGHT in pressed: - steering.run_target(1400, (steer_angle/4), Stop.HOLD, False) - else: - steering.run_target(1400, steer_angle, Stop.HOLD, False) - else: - steering.track_target(0) - - # Choose the drive speed based on the left controls. - if Button.LEFT_MINUS in pressed: - if Button.LEFT in pressed: - driving_1.dc(50) - driving_2.dc(50) - else: - driving_1.dc(100) - driving_2.dc(100) - elif Button.LEFT_PLUS in pressed: - if Button.LEFT in pressed: - driving_1.dc(-50) - driving_2.dc(-50) - else: - driving_1.dc(-100) - driving_2.dc(-100) - else: - driving_1.dc(0) - driving_2.dc(0) - - # Wait. - wait(10) \ No newline at end of file +################################################################################ +# # +# pybricks script for DAKAR / TRIAL Truck 42114 B alternate model / Zetros # +# killer by RM8 LEGO Garage - BrickGarage # +# # +# This script enables the LEGO® Powered Up Technic Hub to be used with the # +# LEGO® Powerd UP 88010 Remote. # +# # +# Configuration of the Technic Hub: # +# Port A: Drive motor # +# Port B: Steering with left and right limited # +# Port C: Drive motor # +# Port D: Not used # +# # +################################################################################ +# Rebrickable: https://rebrickable.com/mocs/MOC-113177/ # +################################################################################ +# # +# Changelog # +# # +################################################################################ +# v0.2.0 05-07-2022 # +# Based on v0.1.0 05-07-2022 of 42124-1 - Off-Road Buggy # +# Added steering correction # +# v0.1.0 26-06-2022 # +# Added half speed for drive. # +# Added half angle for steering. # +# v0.0.0 26-06-2022 # +# First version. # +# Based on v0.0.0 22-06-2022 of 42129 B model 'Hot Trot' by Didumos # +################################################################################ + +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, Direction.COUNTERCLOCKWISE) +driving_1 = Motor(Port.A, Direction.CLOCKWISE) +driving_2 = Motor(Port.C, 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() + +# Set new values +steering.control.pid(kp=old_kp*4, kd=old_kd*0.4) + +# Find the steering endpoint on the left and right. +# The middle is in between. +left_end = steering.run_until_stalled(-200, then=Stop.HOLD) +right_end = steering.run_until_stalled(200, then=Stop.HOLD) + +# Steering correction +steering_correction = +3 + +# We are now at the right. Reset this angle to be half the difference. +# That puts zero in the middle. +steering.reset_angle(((right_end - left_end)/2)+steering_correction) +steering.run_target(speed=200, target_angle=0, wait=False) + +# Set steering angle +steering_angle = (((right_end - left_end)/2)-5) +steering_angle_left = -steering_angle-steering_correction +steering_angle_right = steering_angle+steering_correction + +# Set variable for gear +gear_total = 2 # Total number of gears. +gear_old = None # Empty variable to set later on (keep empty!). +gear = 2 # Gear at start (must be higher than 0 and lower or + # eaqual to gear_total). +gear_color = ["BLUE", "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() + + # Choose the steering angle based on the right controls. + if Button.RIGHT_PLUS in pressed: + steering.run_target(1400, steering_angle_left, Stop.HOLD, False) + elif Button.RIGHT_MINUS in pressed: + steering.run_target(1400, steering_angle_right, 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 > 1: + gear -= 1 + while Button.LEFT in pressed: + # Button debounce + wait(10) + pressed = remote.buttons.pressed() + + # 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() + + # 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: + drive_speed += speed + elif Button.LEFT_MINUS in pressed: + drive_speed -= speed + + # Apply the selected speed. + driving_1.dc(drive_speed) + driving_2.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: + hub.light.on(Color.RED) + + # Wait. + wait(10)