[原创] 【翻译】Micropy 官方教程 08 将 pyborad 作为 USB 鼠标

我的学号   2016-4-23 14:51 楼主
8.用pyboard 板制作USB 鼠标
pyboard 板属于USB 设备,并且可当成鼠标的功能使用而非仅仅是默认的 USB 闪存设备。

为此我们首先需要编辑 boot.py 文件以更改 USB 的确认方式。如果没接触过 boot.py 文件,那么其打开差不多是这么个样子:
  1. # boot.py -- run on boot-up
  2. # can run arbitrary Python, but best to keep it minimal

  3. import pyb
  4. #pyb.main('main.py')
  5. # main script to run after this one#pyb.usb_mode('CDC+MSC')
  6. # act as a serial and a storage device
  7. #pyb.usb_mode('CDC+HID')
  8. # act as a serial device and a mouse


为使能鼠标模式,将文件最后一行的注释号去掉,如下所示:
  1. pyb.usb_mode('CDC+HID') # act as a serial device and a mouse

修改完boot.py 文件后,使其工作的最小量代码如下所示:
  1. import pyb
  2. pyb.usb_mode('CDC+HID')
这告知 pyboard 板在其启动时将自身设置为一个CDC(串口连接) 和 HID(人机交互设备,在本例中即鼠标) 的 USB 设备。

退出/卸载 pybord 设备并通过复位按键重置,之后你的 PC 机就可以将 pyboard 板当作鼠标使用了!

8.1 手动发送鼠标事件
为让 py鼠标 能够将我们想要发送的事件传递到 PC 机中,我们先通过交互式解释器(REPL)完成这个目标。连接 pyboard 板,在串口程序里边打入如下代码:
  1. >>> pyb.hid((0, 10, 0, 0))
你的鼠标现在向右移动了十个像素!上述代码中你发送了四个信息:按键状态,x 坐标,y坐标和滚动值(?)。数字即告知 PC 机在 x轴上移动十个像素。

下面代码实现鼠标左右摇晃:
  1. >>> import math
  2. >>> def osc(n, d):
  3. ...   for i in range(n):
  4. ...     pyb.hid((0, int(20 * math.sin(i / 10)), 0, 0))
  5. ...     pyb.delay(d)
  6. ...
  7. >>> osc(100, 50)

osc 函数的第一个参数即要发送的鼠标事件,第二个参数即每个事件中的毫秒级别延迟时间。尝试用不同的数值代替。

练习: 让鼠标围着圈圈转动。

8.2 加上加速度传感器的鼠标
用加速度传感器制作一个能根据 pyboard 板角度移动而移动的鼠标。相关的代码可以直接在 交互式解释器里边完成,或者放入 main.py 文件中。在这里我们选择放入 main.py 文件,因为这样做我们可以学到如何进入安全模式。

当 pyboard 作为 USB 串口设备和 HID 鼠标时,无法连接文件系统以编辑更改 main.py 的内容。
因此我们需要进入安全模式实现我们的目标。这在上一篇教程里已有提及,这里再重复一遍:
  • 按下用户按键;
  • 保持用户按键按下的同时,按下重置按键后松开
  • LED灯将持续亮绿灯,然后橙灯再到绿橙灯一起亮的循环;
  • 保持按下用户按键直到橙色的LED灯亮起,然后就可松开用户按键;
  • 橙色的 LED 灯将快速闪烁四次,然后熄灭;
  • 现在你进入了安全模式

安全模式下 boot.py 和 main.py 文件不被执行,所以 pyboard 板将按照默认的设置启动。这意味着可以连接到文件系统(USB设备将出现),且可以对 main.py 文件进行编辑。(保持 boot.py 文件不动,因为在编辑完 main.py 文件后我们需要返回 HID 模式)。

在 main.py 中我们打入如下代码:
  1. import pyb

  2. switch = pyb.Switch()
  3. accel = pyb.Accel()

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

保存文件,退出或卸载 pyboard 设备。通过复位按键重置,其将再次成为鼠标,且不同的板的角度将移动鼠标。试试看能否保持鼠标的静止不动。
按下复位按键将停止鼠标姿态。

你应该能注意到 y轴方向是颠倒的。这个问题很容易解决:在上述的 pyb.hid( )行里,y 轴方向前边加上负号即可。

8.3 恢复pyboard 为普通模式
上述实验后不做更改,那么每次连接上 pyboard 板其只能作为鼠标被使用。或许你想要回到普通状态。为此首先你需要进入安全模式(如上所示),然后编辑 boot.py 文件。在 boot.py 文件中注释 CDC_HID 的设置(在前边加上 # 号),如下所示:
  1. #pyb.usb_mode('CDC+HID') # act as a serial device and a mouse

保存文件,退出或卸载设备,重置板子则进入普通操作模式。

君应有语,渺万里层云,千山暮雪,知向谁边?

回复评论 (2)

上述代码中你发送了四个信息:按键状态,x 坐标,y坐标和滚动值(?)。数字即告知 PC 机在 x轴上移动十个像素。

你好,第一个参数按键状态不是明白,发送0是什么意思?发送1又是什么意思?0、1是否会影响程序执行?
点赞  2016-7-31 17:07
引用: suoma 发表于 2016-7-31 17:07
上述代码中你发送了四个信息:按键状态,x 坐标,y坐标和滚动值(?)。数字即告知 PC 机在 x轴上移动十个 ...

这个没具体研究过,或许找到对应的micropython的函数原型会更有说服力些
个人猜测:第一个函数代表按键状态的话那么就只有按下和松开两种状态,你可以实践一下试试
君应有语,渺万里层云,千山暮雪,知向谁边?
点赞  2016-8-1 09:40
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复