立即注册

micropython-microbit 中文社区

查看: 30|回复: 1

【SAMR21新玩法】34. 模拟USB鼠标键盘

[复制链接]
  • TA的每日心情
    慵懒
    2019-10-23 20:05
  • 签到天数: 9 天

    [LV.3]偶尔看看II

    发表于 2019-10-19 12:30:57 | 显示全部楼层 |阅读模式

    马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

    您需要 登录 才可以下载或查看,没有帐号?立即注册

    x
    和MicroPython一样,在CircuitPython中,可以非常容易的模拟USB HID设备,可以将设备作为USB键盘或者USB鼠标。先看一下USB HID的基本用法:

    1. import usb_hid

    2. kb = usb_hid.devices[0]
    3. kb.send_report(buf)
    复制代码


    buf是bytes或者bytearray类型,对于键盘,需要发送8字节的数据,而对于鼠标,需要发送4字节数据。

    具体的使用如下,USB键盘

    1. import usb_hid
    2. from time import sleep

    3. kb = usb_hid.devices[0]

    4. def kb_send(chr, shift=0):
    5.     buf=bytearray(8)
    6.     buf[2] = chr
    7.     buf[0] = shift
    8.     kb.send_report(buf)
    9.     sleep(0.01)

    10.     buf[2], buf[0] = 0, 0
    11.     kb.send_report(buf)
    12.     sleep(0.01)
    13.     kb.send_report(buf)
    14.     sleep(0.01)
    复制代码


    首先定义键盘类kb,然后发送数据,代表按键按下。注意发送数据后需要再次发送0,代表按键释放,否则系统会一直发出按键。例如,下面将发送字母a:

    kb_send(4)


    因为键盘缓冲区是8字节,第一个字节代表ctrl、shift、alt键状态,2-7字节代表字符,所以一次最多可以发送6个字符,将上面程序略作修改,就可以实现多个字符的发送:

    1. def kb_sends(c1, c2=0, c3=0, c4=0, c5=0, c6=0, shift=0):
    2.     buf=bytearray(8)
    3.     buf[0] = shift
    4.     buf[2] = c1
    5.     buf[3] = c2
    6.     buf[4] = c3
    7.     buf[5] = c4
    8.     buf[6] = c5
    9.     buf[7] = c6
    10.     kb.send_report(buf)
    11.     sleep(0.01)

    12.     for i in range(8):
    13.         buf = 0

    14.     kb.send_report(buf)
    15.     sleep(0.01)
    16.     kb.send_report(buf)
    17.     sleep(0.01)
    复制代码


    例如,使用kb_sends(4,5,6)将发送abc。注意注意USB HID发送的键盘数据并不是字符的ASCII码,而是USB协议定义的数据,具体数据可以参考USB协议中的规定。

    鼠标的使用方法和键盘类似,区别在于使用了device[1],数据是4字节:

    1. mouse = usb_hid.devices[1]
    2. mouse.send_report(bytes([0, 100, 0, 0]))
    复制代码


    上面的程序,将鼠标位置右移100(x方向)。

    缓冲区的数据,第一个代表鼠标按键;第2/3个代表X/Y方向移动距离;第4个字节代表滚动。




    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2019-10-23 20:05
  • 签到天数: 9 天

    [LV.3]偶尔看看II

     楼主| 发表于 2019-10-19 12:31:28 | 显示全部楼层
    USB鼠标键盘演示,当按下触摸键A0时,鼠标做圆圈运动;按下A1,发送数字1;按下A2,发送字母a。

    1. import usb_hid
    2. from time import sleep
    3. import touchio
    4. from board import *
    5. import math

    6. tp1 = touchio.TouchIn(A0)
    7. tp2 = touchio.TouchIn(A1)
    8. tp3 = touchio.TouchIn(A2)

    9. kb = usb_hid.devices[0]
    10. mouse = usb_hid.devices[1]

    11. n = 0
    12. while 1:
    13.     sleep(0.1)
    14.     if tp1.value:
    15.         t = n*math.pi/360
    16.         x, y = round(10*math.cos(t)), round(10*math.sin(t))
    17.         if x < 0: x += 256
    18.         if y < 0: y += 256
    19.         buf = bytes([0, x, y, 0])
    20.         print(n, buf[0], buf[1] ,buf[2], buf[3])
    21.         mouse.send_report(buf)
    22.         n += 10

    23.     if tp2.value:
    24.         kb.send_report(bytes([0, 0, 0x1E, 0, 0, 0, 0, 0]))
    25.         sleep(0.01)
    26.         kb.send_report(bytes(8))
    27.         kb.send_report(bytes(8))
    28.    
    29.     if tp3.value:
    30.         kb.send_report(bytes([0, 0, 0x04, 0, 0, 0, 0, 0]))
    31.         sleep(0.01)
    32.         kb.send_report(bytes(8))
    33.         kb.send_report(bytes(8))
    复制代码


    回复 支持 反对

    使用道具 举报

    游客
    回复
    您需要登录后才可以回帖 登录 | 立即注册

    Archiver|手机版|小黑屋|micropython-microbit 中文社区

    GMT+8, 2019-12-13 00:33 , Processed in 0.090279 second(s), 20 queries .

    Powered by Discuz! X3.4

    © 2001-2013 Comsenz Inc.

    快速回复 返回顶部 返回列表