Update 9/3/2022 – please use the code below in the standard environment of Pybricks, not in the beta one.
One of the most frequent complaints about the Powered Up system is the need to have a smart device constantly for control, and you can only use touch controls with the official Control+ app. Even if you change touch control for the remote, you still need to run the Powered Up app all the time.
Here comes Pybricks – a custom coding environment for Powered Up devices that allows you to run code on the hub itself. Sounds complicated? It isn’t, no coding required to give it a try! Here are all the details in my video:
Here is the modified code used for the 42124 Off-Road buggy with the remote:
from pybricks.pupdevices import Motor, Remote
from pybricks.parameters import Port, Direction, Stop, Button
from pybricks.tools import wait
# Initialize the motors.
steer = Motor(Port.B)
front = Motor(Port.A, Direction.COUNTERCLOCKWISE)
# Connect to the remote.
remote = Remote()
# Read the current settings
old_kp, old_ki, old_kd, _, _ = steer.control.pid()
# Set new values
steer.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 = steer.run_until_stalled(-200, then=Stop.HOLD)
right_end = steer.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.
steer.reset_angle((right_end - left_end)/2)
steer.run_target(speed=200, target_angle=0, wait=False)
# Set steering angle for the buggy
steer_angle = (((right_end - left_end)/2)-5)
print('steer angle:',steer_angle)
# Now we can start driving!
while True:
# Check which buttons are pressed.
pressed = remote.buttons.pressed()
# Choose the steer angle based on the right controls.
if Button.RIGHT_PLUS in pressed:
steer.run_target(1400, -steer_angle, Stop.HOLD, False)
elif Button.RIGHT_MINUS in pressed:
steer.run_target(1400, steer_angle, Stop.HOLD, False)
else:
steer.track_target(0)
# Choose the drive speed based on the left controls.
drive_speed = 0
if Button.LEFT_PLUS in pressed:
drive_speed += 100
if Button.LEFT_MINUS in pressed:
drive_speed -= 100
# Apply the selected speed.
front.dc(drive_speed)
# Wait.
wait(10)
And here is the code for the 42129 4×4 Mercedes-Benz Zetros Trial Truck with the remote:
from pybricks.pupdevices import Motor, DCMotor, Remote
from pybricks.parameters import Port, Direction, Stop, Button, Color
from pybricks.hubs import TechnicHub
from pybricks.tools import wait
# Initialize the motors.
steer = Motor(Port.D)
drive1 = Motor(Port.B)
drive2 = Motor(Port.A)
diff_control = DCMotor(Port.C)
# Initialize the hub.
hub = TechnicHub()
# Connect to the remote.
remote = Remote()
# Read the current settings
old_kp, old_ki, old_kd, _, _ = steer.control.pid()
# Set new values
steer.control.pid(kp=old_kp*4, kd=old_kd*0.8)
#Set the differential lock in open position
diff_control.dc(100)
wait(400)
diff_control.brake()
hub.light.on(Color.GREEN)
hublight = 0
# Find the steering endpoint on the left and right.
# The middle is in between.
left_end = steer.run_until_stalled(-500, then=Stop.HOLD)
right_end = steer.run_until_stalled(500, then=Stop.HOLD)
# We are now at the right. Reset this angle to be half the difference.
# That puts zero in the middle.
steer.reset_angle((right_end - left_end)/2)
steer.run_target(speed=200, target_angle=0, wait=False)
# Set steering angle for the Zetros
steer_angle = (((right_end - left_end)/2)+5)
# Now we can start driving!
while True:
# Check which buttons are pressed.
pressed = remote.buttons.pressed()
# Choose the steer angle based on the right controls.
if Button.RIGHT_PLUS in pressed:
steer.run_target(1400, -steer_angle, Stop.HOLD, False)
elif Button.RIGHT_MINUS in pressed:
steer.run_target(1400, steer_angle, Stop.HOLD, False)
else:
steer.track_target(0)
# Choose the drive speed based on the left controls.
drive_speed = 0
if Button.LEFT_PLUS in pressed:
drive_speed += 100
if Button.LEFT_MINUS in pressed:
drive_speed -= 100
if Button.LEFT in pressed:
print('Battery voltage:',(hub.battery.voltage())/1000,"V")
wait(100)
# Apply the selected speed.
drive1.dc(drive_speed)
drive2.dc(drive_speed)
if (Button.RIGHT in pressed) and (hublight == 0):
hublight = 1
diff_control.dc(-100)
wait(400)
diff_control.brake()
hub.light.on(Color.RED)
elif (Button.RIGHT in pressed) and (hublight == 1):
diff_control.dc(100)
wait(400)
diff_control.brake()
hub.light.on(Color.GREEN)
hublight = 0
# Wait.
wait(10)