如何用Raspberry Pi 4B将键鼠输入转为控制器输入以获取瞄准辅助?
用Raspberry Pi 4B实现键鼠转控制器输入方案
核心思路
利用树莓派的USB Gadget模式模拟标准Xbox/PS控制器,同时捕获键鼠输入并转换为控制器的HID报告输出,让PC识别为控制器以启用瞄准辅助。
步骤1:配置USB Gadget(模拟Xbox One控制器)
树莓派默认支持USB Gadget模式,需手动配置内核模块和设备描述:
- 编辑
/boot/config.txt,添加以下内容后重启:dtoverlay=dwc2 - 编辑
/etc/modules,添加:dwc2 libcomposite - 创建gadget配置脚本(保存为
/usr/local/bin/setup_gadget.sh,执行chmod +x赋予权限):#!/bin/bash rmmod g_hid 2>/dev/null mkdir -p /sys/kernel/config/usb_gadget/xbox cd /sys/kernel/config/usb_gadget/xbox # 设置Xbox One控制器标准VID/PID echo 0x045e > idVendor echo 0x02ea > idProduct mkdir -p strings/0x409 echo "RPi Xbox Controller" > strings/0x409/product echo "Edam_Lee" > strings/0x409/manufacturer # 创建HID功能并写入Xbox标准报告描述符 mkdir -p functions/hid.usb0 echo -ne \\x05\\x01\\x09\\x05\\xa1\\x01\\x09\\x30\\x09\\x31\\x09\\x32\\x09\\x33\\x09\\x34\\x09\\x35\\x09\\x36\\x09\\x37\\x15\\x00\\x26\\xff\\x00\\x75\\x08\\x95\\x08\\x81\\x02\\x09\\x39\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x04\\x81\\x02\\x09\\x3a\\x15\\x00\\x25\\x01\\x75\\x01\\x95\\x04\\x81\\x02\\x09\\x01\\xa1\\x00\\x09\\x30\\x09\\x31\\x15\\x80\\x25\\x7f\\x75\\x08\\x95\\x02\\x81\\x02\\xc0 > functions/hid.usb0/report_desc echo 64 > functions/hid.usb0/report_length # 绑定配置到USB端口 mkdir -p configs/c.1/strings/0x409 echo "Config 1" > configs/c.1/strings/0x409/configuration echo 250 > configs/c.1/MaxPower ln -s functions/hid.usb0 configs/c.1/ echo 1-1 > UDC - 执行脚本
sudo /usr/local/bin/setup_gadget.sh,此时树莓派连接PC后会被识别为Xbox控制器。
步骤2:捕获键鼠输入
用evdev库读取键鼠输入事件,Python实现更简便:
- 安装依赖:
sudo pip install evdev - 列出可用输入设备:
ls /dev/input/event*,找到对应鼠标(含mouse/pointer)和键盘(含keyboard)的设备路径。
步骤3:键鼠转控制器逻辑实现
以下是核心Python代码片段,实现鼠标位移转右摇杆、键盘按键转控制器按键:
import evdev from evdev import InputDevice, ecodes # 替换为你的键鼠设备路径 mouse = InputDevice('/dev/input/event2') keyboard = InputDevice('/dev/input/event3') # Gadget创建的HID设备节点 hid_dev = open('/dev/hidg0', 'wb') # Xbox控制器初始报告(14字节标准格式) report = bytearray([0]*14) # 键盘-控制器按键映射(可自定义) key_map = { ecodes.KEY_W: (8, 0x01), # 左摇杆上 ecodes.KEY_S: (8, 0x02), # 左摇杆下 ecodes.KEY_A: (8, 0x04), # 左摇杆左 ecodes.KEY_D: (8, 0x08), # 左摇杆右 ecodes.KEY_SPACE: (8, 0x10),# A键 ecodes.KEY_LEFTCTRL: (8, 0x20), # X键 ecodes.KEY_MOUSE: (9, 0x01),# 左扳机 ecodes.KEY_RIGHTMOUSE: (9, 0x02)# 右扳机 } # 鼠标灵敏度系数(根据游戏调整) MOUSE_SENS = 2.5 def clamp(val, min_val, max_val): return max(min_val, min(val, max_val)) def update_report(): hid_dev.write(report) hid_dev.flush() # 处理鼠标位移事件 def handle_mouse(event): if event.type == ecodes.EV_REL: if event.code == ecodes.REL_X: # 右摇杆X轴(0x80为中间值) report[6] = clamp(report[6] + int(event.value * MOUSE_SENS), 0x00, 0xff) elif event.code == ecodes.REL_Y: # 右摇杆Y轴(0x80为中间值) report[7] = clamp(report[7] + int(event.value * MOUSE_SENS), 0x00, 0xff) update_report() # 处理键盘按键事件 def handle_keyboard(event): if event.type == ecodes.EV_KEY and event.code in key_map: byte_pos, bit_val = key_map[event.code] if event.value == 1: report[byte_pos] |= bit_val else: report[byte_pos] &= ~bit_val update_report() # 主监听循环 try: while True: for event in mouse.read_loop(): handle_mouse(event) for event in keyboard.read_loop(): handle_keyboard(event) except KeyboardInterrupt: hid_dev.close()
步骤4:测试与优化
- 运行代码
sudo python3 controller_convert.py,用数据传输线将树莓派连接到笔记本USB口。 - 在Windows设备管理器中确认识别为「Xbox One Controller」,用「Xbox Accessories」工具测试按键/摇杆响应。
- 调整
MOUSE_SENS系数,添加死区处理(如鼠标位移小于5时不更新摇杆),或自定义非线性灵敏度曲线提升精准度。 - 设置开机自启:编辑
/etc/rc.local,在exit 0前添加sudo python3 /path/to/controller_convert.py &。
内容的提问来源于stack exchange,提问作者Edam_Lee
相关产品推荐
相关产品推荐

