ubuntu 解析控制 PS4手柄
参考源码: pypi官方 pyPS4Controller 1.2.5 库
测试链接PS4蓝牙手柄
首先,查看手柄的接入端口
ls /dev/input/
很有可能会出现很多端口,手柄的端口主要是js0或者js1,想要确定到底是哪个,把电脑的蓝牙关闭,看哪个端口没了就能确定了。
然后安装手柄测试工具并测试手柄按键,拨动按键或者拨杆,如下所示的终端会显示相应的键位变化。
sudo apt-get install jstest-gtk
sudo jstest /dev/input/js0
调用pyPS4Controller 源码驱动
下载 pyPS4Controller 库,在 pypi官方 pyPS4Controller 1.2.5 库已有非常详细的使用说明
下载 pyPS4Controller 库
pip install pyPS4Controller
主要函数说明
实例化controller 类, “/dev/input/js0” 为当前蓝牙手柄链接的设备号,官方不推荐使用ds4drv 。
controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv=False)
执行上面代码时,推动遥控器,可以反馈相应的键位键值变化。
因为,Controller默认按键触发调用的函数是弱函数, 可通过在类中重写 on_x_press() 等函数触发时的功能。
class MyController(Controller):
def __init__(self, **kwargs):
Controller.__init__(self, **kwargs)
def on_x_press(self):
print("press on x");
def on_x_release(self):
print("release on x");
## 左侧拨杆
##上下(up 0 ~ -32767; down 0 ~ 32767; middle on_L3_y_at_rest)
##左右 (left -32767 ~ 0; right 0 ~ 32767; middle on_L3_x_at_rest)
def on_L3_up(self, value):
pass
def on_L3_down(self, value):
pass
def on_L3_y_at_rest(self):
pass
def on_L3_left(self, value):
pass
def on_L3_right(self, value):
pass
def on_L3_x_at_rest(self):
pass
完整示例代码
需要添加按键触发功能时,只需在类 MyController() 中重写入想要的功能即可
from pyPS4Controller.controller import Controller
def connect():
# any code you want to run during initial connection with the controller
print("ps4 controller is connecting!!!")
def disconnect():
# any code you want to run during loss of connection with the controller or keyboard interrupt
print("ps4 controller was disconnected!!!")
class MyController(Controller):
def __init__(self, **kwargs):
Controller.__init__(self, **kwargs)
def on_x_press(self):
print("press on x");
def on_x_release(self):
print("release on x");
## 左侧拨杆
##上下(up 0 ~ -32767; down 0 ~ 32767; middle on_L3_y_at_rest)
##左右 (left -32767 ~ 0; right 0 ~ 32767; middle on_L3_x_at_rest)
def on_L3_up(self, value):
pass
def on_L3_down(self, value):
pass
def on_L3_y_at_rest(self):
pass
def on_L3_left(self, value):
pass
def on_L3_right(self, value):
pass
def on_L3_x_at_rest(self):
pass
## 右侧拨杆
##上下(up 0 ~ -32767; down 0 ~ 32767; middle on_R3_y_at_rest)
##左右 (left -32767 ~ 0; right 0 ~ 32767; middle on_R3_x_at_rest)
if __name__ == '__main__':
controller = MyController(interface="/dev/input/js0", connecting_using_ds4drv=False)
controller.listen(timeout= 60, on_connect=connect, on_disconnect=disconnect)