如何使用树莓派或任何其他 Linux PC 或设备创建虚拟/模拟 USB 鼠标



我需要创建一个模拟的USB设备。设备在插入电脑或平板电脑时的行为应类似于 USB 鼠标。动机是检查系统的鼠标驱动程序。我想让其中一个Raspberry Pi USB端口像鼠标一样。

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

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

我还需要监视并向PC发送点击消息。

若要模拟 USB 鼠标,需要充当 USB HID 设备。HID易于实现,许多具有简单USB设备端口的微控制器都有足够的资源来实现。甚至还有在AVR ATTiny上使用位撞击IO的低速USB HID实现,根本没有USB硬件。

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

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

USB连接只是第一个障碍。其次,您需要对 OTG 的 Linux 内核支持,以及实现 USB 设备的内核支持。这在Linux中被称为"小工具模式",并且由Broadcom SOC的内核支持,并且可以根据Adafruit的教程在RPi0中使用。有关更多链接和讨论,请参阅上面的链接答案。

完成所有这些基础结构后,需要使用小工具 API 充当 HID,并发出 HID 报告,这些报告将被视为鼠标移动。

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

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

您所需要的只是一个 HID 模式下的 4 美元的 Raspberry Pi Pico。使用此学习指南:

https://learn.adafruit.com/circuitpython-essentials/circuitpython-hid-keyboard-and-mouse

"""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)
    

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

最新更新