The cool thing about the PS3 gamepad is that it’s a normal Bluetooth device and connects directly to the EV3. You can easily run programs in Brickman and use the gamepad without another computer or laptop.
The PS3 pairing process in Brickman is a little strange, but works fine. Stick exactly to these steps:
You’re done! Whenever you press the PS3 button on the gamepad now, it will try to connect to the EV3 brick. Nice!
If Brickman doesn’t work or if you don’t have a display, like on a BrickPi,
bluetoothctl is the way to go. The Gentoo Linux guys wrote a nice tutorial.
Now on to Python. In python we need the
evdev module (without a 3) to read gamepad
events. Here’s a quick program that will take the right stick Y axis and use it
to set the speed of a motor in port A. Note that motor control is in a separate
thread. That’s because controlling the motors is much slower than reading the
gamepad. Multithreading synchronizes both.
#!/usr/bin/env python3 __author__ = 'Anton Vanhoucke' import evdev import ev3dev.auto as ev3 import threading ## Some helpers ## 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) / (src - src)) * (dst - dst) + dst def scale_stick(value): return scale(value,(0,255),(-100,100)) ## Initializing ## print("Finding ps3 controller...") devices = [evdev.InputDevice(fn) for fn in evdev.list_devices()] for device in devices: if device.name == 'PLAYSTATION(R)3 Controller': ps3dev = device.fn gamepad = evdev.InputDevice(ps3dev) speed = 0 running = True class MotorThread(threading.Thread): def __init__(self): self.motor = ev3.LargeMotor(ev3.OUTPUT_A) threading.Thread.__init__(self) def run(self): print("Engine running!") while running: self.motor.run_direct(duty_cycle_sp=speed) self.motor.stop() motor_thread = MotorThread() motor_thread.setDaemon(True) motor_thread.start() for event in gamepad.read_loop(): #this loops infinitely if event.type == 3: #A stick is moved if event.code == 5: #Y axis on right stick speed = scale_stick(event.value) if event.type == 1 and event.code == 302 and event.value == 1: print("X button is pressed. Stopping.") running = False break
Copy this code into a file on the EV3 brick to run it. If you do
chmod +x your_file_name.py, you can even run it from the Brickman interface!
How cool! No computer needed. Just a gamepad and the EV3 brick.