You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Raspberry Pi 4B将键鼠输入转为控制器输入以获取瞄准辅助?

用Raspberry Pi 4B实现键鼠转控制器输入方案

核心思路

利用树莓派的USB Gadget模式模拟标准Xbox/PS控制器,同时捕获键鼠输入并转换为控制器的HID报告输出,让PC识别为控制器以启用瞄准辅助。

步骤1:配置USB Gadget(模拟Xbox One控制器)

树莓派默认支持USB Gadget模式,需手动配置内核模块和设备描述:

  1. 编辑/boot/config.txt,添加以下内容后重启:
    dtoverlay=dwc2
    
  2. 编辑/etc/modules,添加:
    dwc2
    libcomposite
    
  3. 创建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
    
  4. 执行脚本sudo /usr/local/bin/setup_gadget.sh,此时树莓派连接PC后会被识别为Xbox控制器。

步骤2:捕获键鼠输入

用evdev库读取键鼠输入事件,Python实现更简便:

  1. 安装依赖:sudo pip install evdev
  2. 列出可用输入设备: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:测试与优化

  1. 运行代码sudo python3 controller_convert.py,用数据传输线将树莓派连接到笔记本USB口。
  2. 在Windows设备管理器中确认识别为「Xbox One Controller」,用「Xbox Accessories」工具测试按键/摇杆响应。
  3. 调整MOUSE_SENS系数,添加死区处理(如鼠标位移小于5时不更新摇杆),或自定义非线性灵敏度曲线提升精准度。
  4. 设置开机自启:编辑/etc/rc.local,在exit 0前添加sudo python3 /path/to/controller_convert.py &。

内容的提问来源于stack exchange,提问作者Edam_Lee

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.26 12:54:57