我需要创建一个模拟的USB设备。插入PC或平板电脑时,设备应该像USB鼠标一样。动机是检查系统的鼠标驱动程序。我想让其中一个Raspberry Pi USB端口像鼠标一样。
当我将Raspberry Pi USB端口连接到我的PC时,它应显示已连接鼠标。
如何制作此类虚拟/模拟设备?
此外,我需要监控并向PC发送点击消息。
答案 0 :(得分:5)
要模拟USB鼠标,您需要充当USB HID设备。 HID易于实现,许多具有简单USB设备端口的微控制器都有足够的资源来实现。甚至可以使用bit-banged IO on an AVR ATTiny实现低速USB HID,而根本没有USB硬件。
问题在于,在典型的基于Linux的主板中,您只有USB主机端口。大多数RPi型号都有这种限制,即使RPi核心的Broadcom SOC支持USB OTG,原则上也可以用作USB设备。
根据this answer的RPi Stack Exchange,新的RPi型号零板有两个端口正确连接为USB OTG,可以用作设备。
USB连接只是第一个障碍。其次,您需要对OTG的Linux内核支持,以及实现USB设备的内核支持。这在Linux中称为"小工具模式",并且由Broadcom SOC的内核支持,并且可以根据a tutorial at Adafruit在RPi0中使用。有关更多链接和讨论,请参阅linked answer above。
使用所有基础架构后,您需要使用小工具API充当HID并发出将被理解为鼠标移动的HID报告。
答案 1 :(得分:1)
PC和Raspberry Pi都是USB 主机;虽然USB鼠标是USB 设备,但您无法将主机连接到主机。
您需要具有USB设备控制器的硬件,然后实施HID设备类。你最好的选择可能是一个简单的微控制器开发板;使用Linux系统呈现HID设备有点过分了。基于STM32的电路板是一种简单的入门方式,例如,ST STM32Cube USB device library包括HID设备类支持。
答案 2 :(得分:0)
您只需要一个 4 美元的 HID 模式 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 示例。