使用MicroPython和pyboard开发板(9):模拟鼠标

用pyboard模拟USB鼠标

pyboard是一个USB设备,它默认被配置为一个U盘,但是它还可以被配置为一个鼠标。要完成这个工作,需要通过boot.py来修改默认的USB配置,boot.py文件的内容大致如下:

as a mouse

# boot.py -- run on boot to configure USB and filesystem
# Put app code in main.py

import pyb
#pyb.main('main.py') # main script to run after this one
#pyb.usb_mode('VCP+MSC') # act as a serial and a storage device
#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse

如果想启用鼠标模式,需要把最后一行注释掉,如下:

pyb.usb_mode('VCP+HID') # act as a serial device and a mouse

修改后的最少完整代码:

import pyb
pyb.usb_mode('VCP+HID')

上面的代码告诉pyboard在启动时将自身配置为VCP(虚拟COM端口,即串行端口)和HID(人机接口设备,在我们的例子中为鼠标)USB设备。

弹出/卸载 pyboard 驱动器并使用 RST 开关将其重置。PC现在应该将 pyboard 检测为鼠标!

手动发送鼠标事件

要让这个py-mouse执行动作,需要向电脑发送鼠标事件。首先,使用REPL提示符手动完成此操作。使用串口程序连接到 pyboard,然后输入以下内容(#后面是注释,不用输入):

>>> hid = pyb.USB_HID()
>>> hid.send((0, 100, 0, 0)) # (按钮状态,x方向,y方向,滚动)

执行后,可以看到鼠标应该向右移动100个像素。在上述命令中,一共发送4条信息:按钮状态、X 方向、Y 方向和滚动。其中,数字100告诉电脑,鼠标在x方向移动了100个像素。

下面,让鼠标左右摇摆:

>>> import math
>>> def osc(n, d):
...  for i in range(n):
...    hid.send((0, int(20 * math.sin(i / 10)), 0, 0))
...    pyb.delay(d)
...
>>> osc(100, 50)

函数osc的第一个参数是要发送的鼠标事件数,第二个参数是事件之间的延迟时间(毫秒)。可以尝试使用不同的数字,比如,让鼠标转圈。

用加速度计制作鼠标

现在,我们把加速度计和鼠标输入结合起来,根据pyboard的角度来移动鼠标,做一个用动作控制的鼠标。下面的代码可以直接在REPL提示下输入,也可以放在main.py文件中。在这里把代码放在main.py文件中,在编辑main.py前需要先进入安全模式。

此时,因为pyboard充当串行USB设备和HID(鼠标),因此无法访问文件系统来编辑main.py文件,也无法编辑boot.py文件退出HID模式进入驱动器模式,要解决这个问题,需要进入安全模式。在安全模式教程 中已有说明,这里再重复一遍:

  1. 按住 USR 开关。
  2. 在按住 USR 的同时,按下并松开 RST 开关。
  3. LED 指示灯将从绿色循环到橙色,再从橙色循环到绿色+橙色,然后再返回绿色。
  4. 继续按住 USR,直到只有橙色 LED 灯亮起,然后松开 USR 开关。
  5. 橙色 LED 灯应快速闪烁 4 次,然后熄灭。
  6. 现在您已进入安全模式。

在安全模式下boot.pymain.py文件不会被执行,pyboard会以默认设置启动,此时就可以访问文件系统(USB 驱动器应该会出现),并且可以编辑main.py。(保留boot.py,因为在编辑完main.py后,我们仍希望回到 HID 模式)。

main.py中输入以下代码:

import pyb

switch = pyb.Switch()
accel = pyb.Accel()
hid = pyb.USB_HID()

while not switch():
    hid.send((0, accel.x(), accel.y(), 0))
    pyb.delay(20)

保存文件,弹出/卸载pyboard驱动器,然后使用RST开关复位。现在它应该能像鼠标一样行动了,电路板的角度会让鼠标左右移动,可以试试看能否让鼠标静止不动!

按下USR开关,停止鼠标移动。

此时Y轴是倒置的,这很容易解决:只需在上面的hid.send()行的y坐标前加上一个负号即可。

将 pyboard 恢复正常

如果不改变 pyboard 的状态,每次插入时它都会表现为鼠标。如果想把它改回正常状态,需要先进入安全模式(见上文),然后编辑boot.py文件。在boot.py文件中,注释掉(在前面加上 # 号)VCP+HID 设置的一行,使其看起来像这样:

#pyb.usb_mode('VCP+HID') # act as a serial device and a mouse

保存文件,弹出/卸载硬盘,然后重启pyboard,现在它已恢复正常运行模式。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

原子星

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值