v0.0.0
This commit is contained in:
@@ -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)
|
||||
Reference in New Issue
Block a user