Raspberry pi 如何使用raspberry Pi或任何其他linux PC或设备创建虚拟/模拟USB鼠标

Raspberry pi 如何使用raspberry Pi或任何其他linux PC或设备创建虚拟/模拟USB鼠标,raspberry-pi,embedded,usb,linux-device-driver,embedded-linux,Raspberry Pi,Embedded,Usb,Linux Device Driver,Embedded Linux,我需要创建一个模拟USB设备。当插入PC或平板电脑时,该设备的行为应类似于USB鼠标。目的是检查系统的鼠标驱动程序。我想让一个树莓皮USB端口像鼠标一样工作 当我将Raspberry Pi USB端口连接到我的电脑时,它应该显示鼠标已连接 如何制作这种虚拟/模拟设备 我还需要监视并向电脑发送单击消息。要模拟USB鼠标,您需要充当USB HID设备。HID易于实现,许多具有简单USB设备端口的微控制器都有足够的资源来实现。甚至有一种低速USB HID的实现,使用时根本没有USB硬件 问题是,在典型

我需要创建一个模拟USB设备。当插入PC或平板电脑时,该设备的行为应类似于USB鼠标。目的是检查系统的鼠标驱动程序。我想让一个树莓皮USB端口像鼠标一样工作

当我将Raspberry Pi USB端口连接到我的电脑时,它应该显示鼠标已连接

如何制作这种虚拟/模拟设备


我还需要监视并向电脑发送单击消息。

要模拟USB鼠标,您需要充当USB HID设备。HID易于实现,许多具有简单USB设备端口的微控制器都有足够的资源来实现。甚至有一种低速USB HID的实现,使用时根本没有USB硬件

问题是,在典型的基于Linux的主板中,您只有USB主机端口。尽管RPi核心的Broadcom SOC支持USB OTG,并且原则上可以用作USB设备,但大多数型号的RPi都有这一限制

根据at,新的RPi型号零板有两个端口作为USB OTG正确连接,可以用作设备

USB连接只是第一个障碍。其次,您需要对OTG的Linux内核支持,以及对实现USB设备的内核支持。这在Linux中称为“Gadget模式”,Broadcom SOC的内核支持它,并且可以根据需要在RPi0中使用。有关更多链接和讨论,请参阅


所有这些基础设施就绪后,您需要使用gadget API充当HID并发布HID报告,该报告将被理解为鼠标运动。

要模拟USB鼠标,您需要充当USB HID设备。HID易于实现,许多具有简单USB设备端口的微控制器都有足够的资源来实现。甚至有一种低速USB HID的实现,使用时根本没有USB硬件

问题是,在典型的基于Linux的主板中,您只有USB主机端口。尽管RPi核心的Broadcom SOC支持USB OTG,并且原则上可以用作USB设备,但大多数型号的RPi都有这一限制

根据at,新的RPi型号零板有两个端口作为USB OTG正确连接,可以用作设备

USB连接只是第一个障碍。其次,您需要对OTG的Linux内核支持,以及对实现USB设备的内核支持。这在Linux中称为“Gadget模式”,Broadcom SOC的内核支持它,并且可以根据需要在RPi0中使用。有关更多链接和讨论,请参阅


所有这些基础设施就绪后,您需要使用gadget API充当HID并发布HID报告,该报告将被理解为鼠标移动。

PC和Raspberry Pi都是USB主机;当USB鼠标是USB设备时,您无法将主机连接到主机


您需要具有USB设备控制器的硬件,然后实现HID设备类。您最好的选择可能是一个简单的微控制器开发板;使用Linux系统来展示HID设备有点过头了。基于STM32的主板是一种简单的入门方式,例如,ST包括HID设备类支持。

PC和Raspberry Pi都是USB主机;当USB鼠标是USB设备时,您无法将主机连接到主机


您需要具有USB设备控制器的硬件,然后实现HID设备类。您最好的选择可能是一个简单的微控制器开发板;使用Linux系统来展示HID设备有点过头了。基于STM32的电路板是一种简单的入门方式,例如,ST包括HID设备类支持。

您只需要在HID模式下安装一个4美元的Raspberry Pi Pico即可。使用本学习指南:

“CircuitPython Essentials隐藏鼠标示例”
导入时间
导入模拟
进口局
进口数码产品
导入usb_hid
从adafruit_hid.mouse导入鼠标
鼠标=鼠标(usb\u隐藏设备)
x_轴=模拟输入(电路板A0)
y_轴=模拟输入(电路板A1)
选择=数字IO.DigitalInOut(电路板A2)
选择.direction=digitalio.direction.INPUT
select.pull=digitalio.pull.UP
罐最小值=0.00
罐最大值=3.29
步骤=(最大罐数-最小罐数)/20.0
def get_电压(引脚):
返回(引脚值*3.3)/65536
def步骤(轴):
“”“将电位计电压范围映射到0-20”“”
返回圆((轴-槽最小)/步)
尽管如此:
x=获取_电压(x_轴)
y=获取_电压(y_轴)
如果select.value为False:
鼠标点击(鼠标左键)
时间。睡眠(0.2)#去盎司延迟
如果步骤(x)>11.0:
#打印(步骤(x))
鼠标移动(x=1)
如果步骤(x)<9.0:
#打印(步骤(x))
mouse.move(x=-1)
如果步骤(x)>19.0:
#打印(步骤(x))
鼠标移动(x=8)
如果步骤(x)<1.0:
#打印(步骤(x))
鼠标移动(x=-8)
如果步骤(y)>11.0:
#打印(步骤(y))
鼠标移动(y=-1)
如果步骤(y)<9.0:
#打印(步骤(y))
鼠标移动(y=1)
如果步骤(y)>19.0:
#打印(步骤(y))
鼠标移动(y=-8)
如果步骤(y)<1.0:
#打印(步骤(y))
鼠标移动(y=8)

这是一个使用操纵杆的鼠标的CP示例。

您只需要在HID模式下使用一个$4的树莓皮皮皮卡即可。使用本学习指南:

“CircuitPython Essentials隐藏鼠标示例”
导入时间
导入模拟
进口局
进口数码产品
导入usb_hid
从adafruit_hid.mouse导入鼠标
鼠标=鼠标(usb\u隐藏设备)
x_轴=模拟输入(电路板A0)
y_轴=模拟输入(电路板A1)
选择=数字IO.DigitalInOut(电路板A2)
选择.direction=digitalio.direction.INPUT
select.pull=digitalio.pull.UP
罐最小值=0.00
罐最大值=3.29
步骤=(最大罐数-最小罐数)/20.0
def get_电压(引脚):
返回(引脚值*3.3)/65536
def步骤(轴):
“”“映射电位计电压表”
"""CircuitPython Essentials HID Mouse example"""
import time
import analogio
import board
import digitalio
import usb_hid
from adafruit_hid.mouse import Mouse

mouse = Mouse(usb_hid.devices)

x_axis = analogio.AnalogIn(board.A0)
y_axis = analogio.AnalogIn(board.A1)
select = digitalio.DigitalInOut(board.A2)
select.direction = digitalio.Direction.INPUT
select.pull = digitalio.Pull.UP

pot_min = 0.00
pot_max = 3.29
step = (pot_max - pot_min) / 20.0


def get_voltage(pin):
    return (pin.value * 3.3) / 65536


def steps(axis):
    """ Maps the potentiometer voltage range to 0-20 """
    return round((axis - pot_min) / step)


while True:
    x = get_voltage(x_axis)
    y = get_voltage(y_axis)

    if select.value is False:
        mouse.click(Mouse.LEFT_BUTTON)
        time.sleep(0.2)  # Debounce delay

    if steps(x) > 11.0:
        # print(steps(x))
        mouse.move(x=1)
    if steps(x) < 9.0:
        # print(steps(x))
        mouse.move(x=-1)

    if steps(x) > 19.0:
        # print(steps(x))
        mouse.move(x=8)
    if steps(x) < 1.0:
        # print(steps(x))
        mouse.move(x=-8)

    if steps(y) > 11.0:
        # print(steps(y))
        mouse.move(y=-1)
    if steps(y) < 9.0:
        # print(steps(y))
        mouse.move(y=1)

    if steps(y) > 19.0:
        # print(steps(y))
        mouse.move(y=-8)
    if steps(y) < 1.0:
        # print(steps(y))
        mouse.move(y=8)