用pyboard模拟USB鼠标
pyboard是一个USB设备,它默认被配置为一个U盘,但是它还可以被配置为一个鼠标。要完成这个工作,需要通过boot.py来修改默认的USB配置,boot.py文件的内容大致如下:
# 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模式进入驱动器模式,要解决这个问题,需要进入安全模式。在安全模式教程 中已有说明,这里再重复一遍:
- 按住 USR 开关。
- 在按住 USR 的同时,按下并松开 RST 开关。
- LED 指示灯将从绿色循环到橙色,再从橙色循环到绿色+橙色,然后再返回绿色。
- 继续按住 USR,直到只有橙色 LED 灯亮起,然后松开 USR 开关。
- 橙色 LED 灯应快速闪烁 4 次,然后熄灭。
- 现在您已进入安全模式。
在安全模式下boot.py
和main.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,现在它已恢复正常运行模式。