Remote control for Control+ sets without an app or smartphone – Pybricks

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)

Advertisements

3 Comments:

  1. can Eny 1 help me

  2. Pingback: Remote control for Control+ sets without an app/smartphone – Pybricks – iGamezone

  3. Hello, Balazs!
    I want to add light to my buggy 42124. I would be very grateful for your help in finalizing the code so that another port (C or D) can be used to turn on and off the light with a button on the remote control.
    Thank you in advance!

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.