查看: 5611|回复: 55

[原创] 用RT10XX,每个人都能DIY自己的USB键盘鼠标

[复制链接]
  • TA的每日心情
    奋斗
    2023-9-17 19:57
  • 签到天数: 2310 天

    [LV.Master]伴坛终老

    107

    主题

    4270

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    10481
    最后登录
    2023-9-17
    发表于 2022-3-15 09:31:02 | 显示全部楼层 |阅读模式
    本帖最后由 shaoziyang 于 2022-3-15 09:31 编辑

    现在控制器功能越来越多,性能越来越强,开发方式也是各种各样。使用这些芯片,除了可以开发各种工业和商业产品,还可以为我们身边事物进行改照,带来实际的便利。特别是利用一些优秀的开源方案,能快速实现各种功能。下面就介绍怎样使用 NXP 的 RT10xx 和开源方案快速 DIY 一个 USB 键盘鼠标,无需了解复杂的USB底层协议,也不用熟悉特别的开发软件,按照下面方法,每个人都能DIY出自己需要的usb键盘鼠标,甚至进一步DIY蓝牙+USB双模键盘鼠标。

    下面以 RT1062 为例,介绍具体的开发方法。这个方法也适合 RT101x、RT102x、RT106x等具有USB功能的芯片。为了省事(其实是想偷懒),就没有画板,直接在贸泽上买了一个 Teensy4.0(RT1062)开发板(如下图)。

    teensy40_front.jpg


    使用 RT1062 做USB键盘鼠标,最简单的方法应该是用 arduino 了,只要在 arduino IDE 中,安装 Teensyduino 插件,就可以在 arduino 中用几行代码,将Teensy 4 开发板变成usb键盘鼠标。官方给出的例程是:

    1. int count = 0;
    2. void setup() { } // no setup needed
    3. void loop() {
    4.   Keyboard.print("Hello World ");
    5.   Keyboard.println(count);
    6.   count = count + 1;
    7.   delay(5000);
    8. }
    复制代码

    通过 Keyboard.print() 函数,就可以模拟键盘输入,通过 usb 输出文字,上面程序每5秒就输出一个 Hello World xx。如果外接几个按键,每个按键对应一个实际按键就可以DIY键盘了。模拟鼠标需要使用 Mouse.move(X, Y)、Mouse.click()、Mouse.set_buttons() 等函数,下面程序模拟鼠标移动。

    1. void setup() { } // no setup needed
    2. void loop() {
    3.   int i;
    4.   for (i=0; i<40; i++) {
    5.     Mouse.move(2, -1);
    6.     delay(25);
    7.   }
    8.   for (i=0; i<40; i++) {
    9.     Mouse.move(2, 2);
    10.     delay(25);
    11.   }
    12.   for (i=0; i<40; i++) {
    13.     Mouse.move(-4, -1);
    14.     delay(25);
    15.   }
    16. }
    复制代码

    使用 arduino 虽然简单,但是却缺少了一些乐趣,功能修改起来也比较麻烦,每次都需要重新编译和下载,无法实现远程更新,对于复杂的功能调试起来也比较困难。下面介绍另外一种方法,使用开源的 circuitpython 编程(circuitpython是micropython的一个分支),将 RT1062 变成可以自定义的鼠标键盘。它利用了 circuitpython 提供的  USB HID 库,加上封装好的相关函数,只需要很少几行代码,就可以实现自定义键盘和鼠标,开发者可以把重点放在发挥创意和扩展功能上,而不用过多关注底层细节的实现和熟悉开发工具上。国外已经有很多爱好者使用它制作了各种炫酷的键盘,甚至进行众筹获得了很好的效果。

    首先,需要在 circuitpython 网站下载对应的固件,https://circuitpython.org/board/teensy40/。将固件写入开发板后,开发板会显示一个名称为CIRCUITPY的usb磁盘,这个磁盘将用于保存用户数据和程序文件,下载程序时只需要将程序文件复制到这个磁盘,不需要其它专用的编程器或软件,极大方便了 DIY 和降低开发成本。

    剪贴板02.jpg

    同时计算机还会出现一个虚拟串口,我们可以通过这个虚拟串口进行程序调试、REPL交互。调试需要使用支持终端功能的软件,如putty、mobaxterm、xshell等,而不能使用串口助手。后面代码的测试,我们以MobaXterm为例进行说明。

    剪贴板011.jpg


    其次,下载 circuitpython 库,下载地址是:https://circuitpython.org/libraries。下载 mpy 或者 py 库都可以,效果是一样的。相对而言,mpy 库已经编译成字节码,加载速度更快,也节约内存,但是在这里区别不大。下载后, 将压缩文件里lib\adafruit_hid 连目录全部复制到 CIRCUITPY 磁盘的lib目录中就可以了,它里面包含了 hid 设备的驱动和一些相关的预定义常数。复制后先弹出磁盘,将开发板复位一次,让复制的库生效。

    剪贴板03.jpg

    剪贴板04.jpg


    第三,键盘和鼠标功能的基本使用方法。

    key.jpg

    在终端软件中,先载入usb hid库和键盘相关库。
    1. import usb_hid
    2. from adafruit_hid.keyboard import Keyboard
    3. from adafruit_hid.keycode import Keycode
    复制代码


    再定义键盘对象实例
    1. kbd = Keyboard(usb_hid.devices)
    复制代码


    通过这个kbd就可以模拟键盘发送数据了

    1. # 发送小写字母a
    2. kbd.send(Keycode.A)

    3. # 发送大写字母A,同时发送 a 和 shfit
    4. kbd.send(Keycode.SHIFT, Keycode.A)

    5. # 发送 abc,一次最多可以发送6个数据
    6. kbd.send(Keycode.A, Keycode.B, Keycode.C)

    7. # 模拟按下大写键
    8. kbd.send(Keycode.CAS_LOCK)

    9. # 按下 F1 功能键
    10. kbd.send(Keycode.F1)

    11. # 按下 ctrl-c 键
    12. kbd.send(Keycode.CONTROL, Keycode.C)

    复制代码

    send() 函数是模拟一次按键,还可以通过 press() 函数和 release() 函数模拟键的按下和释放。使用 press() 函数需要特别注意,运行后会持续发送数据直到运行 release() 函数。

    mouse.jpg
    鼠标的使用方法也是类似的,首先载入鼠标库,并定义一个鼠标实例

    1. import usb_hid
    2. from adafruit_hid.mouse import Mouse

    3. m = Mouse(usb_hid.devices)
    复制代码

    控制鼠标,主要通过下面几个函数

    1. # 按下鼠标左键
    2. m.click(Mouse.LEFT_BUTTON)

    3. # 移动鼠标, 参数分别代表 X、Y、滚轮
    4. m.move(-100, -100, 0)
    复制代码

    上面介绍了使用 circuitpython 制作自定义鼠标键盘的基本方法,可以看到无需深入了解usb底层,也不需要编程器或者特别的开发软件,我们就可以快速DIY各种键盘、鼠标、手柄,只需要几分钟就可以编写功能代码。更多相关的 API 说明:



    第四,下面通过两个的例子分别演示DIY鼠标和键盘功能。

    1. 3个自定义按键的键盘

    首先在记事本或其它编辑软件中创建新文件,并复制粘贴下面代码,然后保存到CIRCUITPY磁盘根目录下,文件名是 code.py(上电后会自动运行这个文件)。保存后弹出磁盘在拔USB(这一步很重要,直接拔USB会损坏文件系统),重新连接USB后,就可以通过按键模拟键盘功能。

    1. import board
    2. import digitalio
    3. import time

    4. import usb_hid
    5. from adafruit_hid.keyboard import Keyboard
    6. from adafruit_hid.keycode import Keycode

    7. kbd = Keyboard(usb_hid.devices)


    8. def setInput(pin):
    9.     name = digitalio.DigitalInOut(pin)
    10.     name.direction = digitalio.Direction.INPUT
    11.     name.pull = digitalio.Pull.UP
    12.     return name

    13. KEY0 = setInput(board.D0)
    14. KEY1 = setInput(board.D1)
    15. KEY2 = setInput(board.D2)
    16. KEY3 = setInput(board.D3)


    17. while True:
    18.     time.sleep(0.02)

    19.     if KEY0.value == 0:
    20.         kbd.send(Keycode.A, Keycode.B, Keycode.C, Keycode.ENTER)
    21.         time.sleep(0.1)

    22.     if KEY1.value == 0:
    23.         kbd.send(Keycode.ONE, Keycode.TWO, Keycode.THREE, Keycode.ENTER)
    24.         time.sleep(0.1)

    25.     if KEY2.value == 0:
    26.         kbd.send(Keycode.SHIFT, Keycode.NINE, Keycode.ZERO, Keycode.ENTER)
    27.         time.sleep(0.1)
    28.         
    29.     if KEY3.value == 0:
    30.         print('exit')
    31.         break
    复制代码

    上面程序中,定义了3个用户按键 KEY0、KEY1、KEY2,以及KEY3(用于退出程序)。按键设置为内部上拉,按下时是0,未按时是1。按下各按键后,将模拟键盘发送:
    • KEY0:abc
    • KEY1:123
    • KEY2:()

    如果需要更多按键,就定义更多GPIO。如果按键非常多,可以通过矩阵扫描方式实现。

    修改按键处理时发送的数据,就可以发送各种组合键。如果将按键对应的键值保存在配置文件中,上电后从配置文件读取键值,就可以实现一个灵活配置的宏键盘。可以针对不同软件或游戏,编写不同配置,制作出可定义的专用键盘或游戏键盘方案。

    如果要做的更加炫酷,可以增加一些WS2812,在circuitpython中,控制WS2812也是非常方便的,基本任何一个GPIO都可以。


    2. 自定义鼠标

    1. import board
    2. import digitalio
    3. import time

    4. import usb_hid
    5. from adafruit_hid.mouse import Mouse

    6. m = Mouse(usb_hid.devices)

    7. def setInput(pin):
    8.     name = digitalio.DigitalInOut(pin)
    9.     name.direction = digitalio.Direction.INPUT
    10.     name.pull = digitalio.Pull.UP
    11.     return name

    12. KEY0 = setInput(board.D0)
    13. KEY1 = setInput(board.D1)
    14. KEY2 = setInput(board.D2)
    15. KEY3 = setInput(board.D3)
    16. KEY4 = setInput(board.D4)
    17. KEY5 = setInput(board.D5)

    18. while True:
    19.     time.sleep(0.02)

    20.     if KEY0.value == 0:
    21.         m.move(-5, 0, 0)
    22.         time.sleep(0.1)

    23.     if KEY1.value == 0:
    24.         m.move(5, 0, 0)
    25.         time.sleep(0.1)

    26.     if KEY2.value == 0:
    27.         m.move(0, -5, 0)
    28.         time.sleep(0.1)

    29.     if KEY3.value == 0:
    30.         m.move(0, 5, 0)
    31.         time.sleep(0.1)

    32.     if KEY4.value == 0:
    33.         m.click(Mouse.LEFT_BUTTON)
    34.         time.sleep(0.1)

    35.     if KEY5.value == 0:
    36.         m.click(Mouse.RIGHT_BUTTON)
    37.         time.sleep(0.1)
    复制代码

    程序中,KEY0/KEY1控制鼠标水平移动,KEY2/KEY3控制鼠标垂直移动,KEY4/KEY5代表鼠标左右键。使用按键是为了偷懒了,不想破坏开发板焊接传感器,如果连接一个三轴加速度传感器或陀螺仪传感器,就可以很方便实现空中鼠标功能,或者自动识别手势。



    第五,一些创意DIY展示

    下面是国外爱好者用 circuitpython 制作的一些有趣例子,虽然单片机不一定是用NXP的,但都可以很轻松移植过来(通常只需要修改 GPIO 的定义),希望这些DIY可以帮助大家,做出更加好玩又好用的定制键盘鼠标:

    • 带电子墨水屏的动态宏键盘

    einkey.jpg

    https://there.oughta.be/a/macro-keyboard


    • 具有24个触摸键、9个可定制LED的Blackboard

    2021-08-24T04-48-00.139Z-IMG_1149.jpg

    https://blackbeat.io/

    • 4x4 键盘/键盘/宏键盘套件

    剪贴板01.jpg

    https://www.tindie.com/products/jpconstantineau/raspberry-pi-pico-4x4-macropad/


    • 漂亮的 Pico 四键盘

    picofour-3384.jpg

    https://learn.adafruit.com/pico-four-key-macropad

    • 超薄便携式键盘

    20211019key.jpg

    https://www.reddit.com/r/circuitpython/comments/q88gav/

    • 可编程宏键盘键盘 bigKNOB

    bigKNOB.jpg

    https://github.com/LeafCutterLabs/bigKNOB



    回复

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3308

    主题

    6557

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32135
    最后登录
    2024-5-9
    发表于 2022-3-15 09:58:50 | 显示全部楼层
    感谢大佬分享,分析的非常到位,也为大家支招,方便大家来DIY,再次感谢
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93127
    最后登录
    2024-5-8
    发表于 2022-3-15 10:01:00 | 显示全部楼层
    感谢分享~~~
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 20:47
  • 签到天数: 1485 天

    [LV.10]以坛为家III

    203

    主题

    2万

    帖子

    64

    超级版主

    Rank: 8Rank: 8

    积分
    93127
    最后登录
    2024-5-8
    发表于 2022-3-15 10:01:28 | 显示全部楼层
    NXP管管 发表于 2022-3-15 09:58
    感谢大佬分享,分析的非常到位,也为大家支招,方便大家来DIY,再次感谢

    大佬回复时间好迅速啊~~
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3308

    主题

    6557

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32135
    最后登录
    2024-5-9
    发表于 2022-3-15 10:34:56 | 显示全部楼层
    stm1024 发表于 2022-3-15 10:01
    大佬回复时间好迅速啊~~

    时刻关注大佬们的分享
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2022-7-28 08:50
  • 签到天数: 67 天

    [LV.6]常住居民II

    0

    主题

    203

    帖子

    0

    中级会员

    Rank: 3Rank: 3

    积分
    328
    最后登录
    2022-7-28
    发表于 2022-3-15 10:57:00 | 显示全部楼层
    收藏收藏,有空复刻下
    今天天气不错!签到!
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-3-26 15:16
  • 签到天数: 266 天

    [LV.8]以坛为家I

    3308

    主题

    6557

    帖子

    0

    管理员

    Rank: 9Rank: 9Rank: 9

    积分
    32135
    最后登录
    2024-5-9
    发表于 2022-3-15 13:19:53 | 显示全部楼层
    aaronwsk 发表于 2022-3-15 10:57
    收藏收藏,有空复刻下

    期待
    签到签到
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-4-29 08:50
  • 签到天数: 1139 天

    [LV.10]以坛为家III

    4

    主题

    2780

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5362
    最后登录
    2024-4-29
    发表于 2022-3-15 13:37:48 | 显示全部楼层
    学习了
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    擦汗
    2022-2-25 10:20
  • 签到天数: 32 天

    [LV.5]常住居民I

    1

    主题

    289

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    1129
    最后登录
    2023-10-31
    发表于 2022-3-15 14:08:00 | 显示全部楼层
    你这能把脚本功能写进鼠标里
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情

    4 小时前
  • 签到天数: 1747 天

    [LV.Master]伴坛终老

    4

    主题

    7135

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    11628
    最后登录
    2024-5-9
    发表于 2022-3-15 14:13:44 | 显示全部楼层
    先收藏了有空玩玩
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 注册/登录

    本版积分规则

    关闭

    站长推荐上一条 /4 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2024-5-9 15:56 , Processed in 0.149669 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

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