diff --git a/42114-1 - 6x6 Volvo Articulated Hauler/main.py b/42114-1 - 6x6 Volvo Articulated Hauler/main.py new file mode 100644 index 0000000..7a5027a --- /dev/null +++ b/42114-1 - 6x6 Volvo Articulated Hauler/main.py @@ -0,0 +1,172 @@ +################################################################################ +# # +# pybricks script for 42114-1 - 6x6 Volvo Articulated Hauler # +# # +# 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: 4 seed gearbox with left and right limited # +# Port C: Not used # +# Port D: Steering with left and right limited # +# # +################################################################################ +# Rebrickable: https://rebrickable.com/sets/42114-1/ # +# Script base: https://racingbrick.com/2021/08/remote-control-for-control-sets # +# -without-an-app-or-smartphone-pybricks/ # +################################################################################ +# # +# Works with the following MOCs # +# # +################################################################################ +# 42114 Volvo N10 6x4 Dump Truck - alternate build by timtimgo # +# https://rebrickable.com/mocs/MOC-81210/ # +################################################################################ +# # +# Changelog # +# # +################################################################################ +# v0.0.0 20-06-2022 # +# First version. # +# Based on v0.1.0 15-06-2022 of 42109 - RC Truck v.3 by ufotografol # +################################################################################ + +from pybricks.pupdevices import Motor, Remote +from pybricks.parameters import Port, Direction, Stop, Button, Color +from pybricks.tools import wait + +# Initialize the motors. +gearbox = Motor(Port.B, Direction.CLOCKWISE) +steering = Motor(Port.D, Direction.COUNTERCLOCKWISE) +driving = Motor(Port.A, Direction.CLOCKWISE) + +# Connect to the remote. +remote = Remote() + +# Read the current settings +old_kp, old_ki, old_kd, _, _ = gearbox.control.pid() +old_kp, old_ki, old_kd, _, _ = steering.control.pid() + +# Set new values +gearbox.control.pid(kp=old_kp*4, kd=old_kd*0.4) +steering.control.pid(kp=old_kp*4, kd=old_kd*0.4) + +#Find the gearing endpoints but keep trying if value is below threshold of 200. +gear_angle = 0 +while gear_angle < 200: + # Find the steering endpoint on the left and right. + # The middle is in between. + left_end_gearbox = gearbox.run_until_stalled(-200, then=Stop.HOLD) + right_end_gearbox = gearbox.run_until_stalled(200, then=Stop.HOLD) + + # Set gearing angle + gear_angle = (((right_end_gearbox - left_end_gearbox)/2)-5) + print('Gear angle measured:',gear_angle) + +# Find the steering endpoint on the left and right. +# The middle is in between. +left_end_steering = steering.run_until_stalled(-200, then=Stop.HOLD) +right_end_steering = steering.run_until_stalled(200, then=Stop.HOLD) + +# Set gearing angle +# Real angle of gear mechanism is 270 degrees (135 both sides from center). +gear_angle = 270/2 +gear_angle_1 = gear_angle +gear_angle_2 = gear_angle-(((gear_angle+gear_angle)/3)*1) +gear_angle_3 = gear_angle-(((gear_angle+gear_angle)/3)*2) +gear_angle_tipper = -gear_angle +print('Gear angle real:',gear_angle) +# Set steering angle +steer_angle = (((right_end_steering - left_end_steering)/2)-5) +print('steer angle:',steer_angle) + +# We are now at the right. Reset this angle to be half the difference. +# That puts zero in the middle. +gearbox.reset_angle((right_end_gearbox - left_end_gearbox)/2) +gearbox.run_target(1400, gear_angle, Stop.HOLD, False) +steering.reset_angle((right_end_steering - left_end_steering)/2) +steering.run_target(speed=200, target_angle=0, wait=False) + +# Set variable for gear +gear_old = 1 +gear = 1 + +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 + elif gear_old is 3: + gear = 4 + else: + gear = 1 + while Button.RIGHT in pressed: + # Button debounce + wait(10) + pressed = remote.buttons.pressed() + + # Check if the left middle button is pressed to change gear + if Button.LEFT in pressed: + if gear_old is 1: + gear = 4 + elif gear_old is 2: + gear = 1 + elif gear_old is 3: + gear = 2 + else: + gear = 3 + while Button.LEFT in pressed: + # Button debounce + wait(10) + pressed = remote.buttons.pressed() + + if gear is not gear_old: + # Stop driving to preserve gears + driving.dc(0) + if gear is 1: + remote.light.on(Color.BLUE) + gearbox.run_target(1400, gear_angle_1, Stop.HOLD, False) + if gear_old is 4: + wait(500) + gear_old = 1 + elif gear is 2: + remote.light.on(Color.WHITE) + gearbox.run_target(1400, gear_angle_2, Stop.HOLD, False) + gear_old = 2 + elif gear is 3: + remote.light.on(Color.RED) + gearbox.run_target(1400, gear_angle_3, Stop.HOLD, False) + gear_old = 3 + else: + remote.light.on(Color.GREEN) + gearbox.run_target(1400, gear_angle_tipper, Stop.HOLD, False) + if gear_old is 1: + wait(500) + gear_old = 4 + # Wait before going on so changing gear won't happen while driving. + wait(250) + + # Choose the steering angle based on the right controls. + if Button.RIGHT_MINUS in pressed: + steering.run_target(1400, -steer_angle, Stop.HOLD, False) + elif Button.RIGHT_PLUS in pressed: + 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: + driving.dc(100) + elif Button.LEFT_PLUS in pressed: + driving.dc(-100) + else: + driving.dc(0) + + # Wait. + wait(10) \ No newline at end of file