Navigation Menu

Skip to content

Instantly share code, notes, and snippets.

@antonvh
Last active October 19, 2023 08:10
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save antonvh/695ab1c36b61171714a84f700858cdb3 to your computer and use it in GitHub Desktop.
Save antonvh/695ab1c36b61171714a84f700858cdb3 to your computer and use it in GitHub Desktop.
PS3/PS4 LEGO MINDSTORMS remote control script with front wheel calibration and shoulder button trim.
#!/usr/bin/env pybricks-micropython
from pybricks.ev3devices import (Motor, TouchSensor, ColorSensor,
InfraredSensor, UltrasonicSensor, GyroSensor)
from pybricks.parameters import (Port, Stop, Direction, Button, Color,
SoundFile, ImageFile, Align)
from pybricks.tools import print, wait, StopWatch
import struct
# Declare motors
left_motor = Motor(Port.B)
right_motor = Motor(Port.C)
steer_motor = Motor(Port.A)
forward = 0
left = 0
# Auto center steering wheels.
steer_motor.run_until_stalled(250)
steer_motor.reset_angle(80)
steer_motor.run_target(300,0)
# A helper function for converting stick values (0 - 255)
# to more usable numbers (-100 - 100)
def scale(val, src, dst):
"""
Scale the given value from the scale of src to the scale of dst.
val: float or int
src: tuple
dst: tuple
example: print(scale(99, (0.0, 99.0), (-1.0, +1.0)))
"""
return (float(val-src[0]) / (src[1]-src[0])) * (dst[1]-dst[0])+dst[0]
# Open the Gamepad event file:
# /dev/input/event3 is for PS3 gamepad
# /dev/input/event4 is for PS4 gamepad
# look at contents of /proc/bus/input/devices if either one of them doesn't work.
# use 'cat /proc/bus/input/devices' and look for the event file.
infile_path = "/dev/input/event4"
# open file in binary mode
in_file = open(infile_path, "rb")
# Read from the file
# long int, long int, unsigned short, unsigned short, unsigned int
FORMAT = 'llHHI'
EVENT_SIZE = struct.calcsize(FORMAT)
event = in_file.read(EVENT_SIZE)
while event:
(tv_sec, tv_usec, ev_type, code, value) = struct.unpack(FORMAT, event)
if ev_type == 1: # A button was pressed or released.
if code == 310 and value == 0:
steer_motor.reset_angle(steer_motor.angle()-5)
if code == 311 and value == 0:
steer_motor.reset_angle(steer_motor.angle()+5)
elif ev_type == 3: # Stick was moved
if code == 0:
left = scale(value, (0,255), (40, -40))
if code == 4: # Righ stick vertical
forward = scale(value, (0,255), (100,-100))
# Set motor voltages.
left_motor.dc(forward)
right_motor.dc(forward)
# Track the steering angle
steer_motor.track_target(left)
# Finally, read another event
event = in_file.read(EVENT_SIZE)
in_file.close()
@Schultzy1310
Copy link

Do you have a list of codes for other buttons for the PS4 controller? I’m trying to add a different motor function when a button is pressed.

@antonvh
Copy link
Author

antonvh commented May 4, 2021

It's here: https://antonsmindstorms.com/2019/04/24/how-to-connec-a-ps3-sixaxis-gamepad-to-an-ev3-brick/ at the bottom. I think the codes haven't changed between ps3 and ps4.

@Schultzy1310
Copy link

Thank you!

@ImMuniz
Copy link

ImMuniz commented Oct 18, 2023

hey, i'm having a problem with something in my code, i tried to reset the direction motor by pressing X on the controller, but it is not resetting the angle of the motor, i tried putting a print command to see if the problem was with the code of the X button, but i worked, so it's not a problem with the button code, could you help me with it? Here is the code i'm using (i changed the steer motor name to left motor):
while event:
(tv_sec, tv_usec, ev_type, code, value) = struct.unpack(FORMAT, event)
if ev_type == 3 and code == 0:
left_stick_x = value
if ev_type == 3 and code == 4:
right_stick_x = value
if ev_type == 1:
if code == 304 and value == 0:
left_motor.reset_angle(left_motor.angle())
print("not pressed")
elif code == 304 and value == 1:
left_motor.reset_angle(left_motor.angle())
print("pressed")

@antonvh
Copy link
Author

antonvh commented Oct 19, 2023 via email

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment