在线时间776 小时
UID126526
注册时间2008-5-19
NXP金币0
TA的每日心情 | 奋斗 2023-9-17 19:57 |
---|
签到天数: 2310 天 [LV.Master]伴坛终老
金牌会员
- 积分
- 10481
- 最后登录
- 2023-9-17
|
本帖最后由 shaoziyang 于 2022-3-15 09:31 编辑
现在控制器功能越来越多,性能越来越强,开发方式也是各种各样。使用这些芯片,除了可以开发各种工业和商业产品,还可以为我们身边事物进行改照,带来实际的便利。特别是利用一些优秀的开源方案,能快速实现各种功能。下面就介绍怎样使用 NXP 的 RT10xx 和开源方案快速 DIY 一个 USB 键盘鼠标,无需了解复杂的USB底层协议,也不用熟悉特别的开发软件,按照下面方法,每个人都能DIY出自己需要的usb键盘鼠标,甚至进一步DIY蓝牙+USB双模键盘鼠标。
下面以 RT1062 为例,介绍具体的开发方法。这个方法也适合 RT101x、RT102x、RT106x等具有USB功能的芯片。为了省事(其实是想偷懒),就没有画板,直接在贸泽上买了一个 Teensy4.0(RT1062)开发板(如下图)。
使用 RT1062 做USB键盘鼠标,最简单的方法应该是用 arduino 了,只要在 arduino IDE 中,安装 Teensyduino 插件,就可以在 arduino 中用几行代码,将Teensy 4 开发板变成usb键盘鼠标。官方给出的例程是:
- int count = 0;
- void setup() { } // no setup needed
- void loop() {
- Keyboard.print("Hello World ");
- Keyboard.println(count);
- count = count + 1;
- delay(5000);
- }
复制代码
通过 Keyboard.print() 函数,就可以模拟键盘输入,通过 usb 输出文字,上面程序每5秒就输出一个 Hello World xx。如果外接几个按键,每个按键对应一个实际按键就可以DIY键盘了。模拟鼠标需要使用 Mouse.move(X, Y)、Mouse.click()、Mouse.set_buttons() 等函数,下面程序模拟鼠标移动。
- void setup() { } // no setup needed
- void loop() {
- int i;
- for (i=0; i<40; i++) {
- Mouse.move(2, -1);
- delay(25);
- }
- for (i=0; i<40; i++) {
- Mouse.move(2, 2);
- delay(25);
- }
- for (i=0; i<40; i++) {
- Mouse.move(-4, -1);
- delay(25);
- }
- }
复制代码
使用 arduino 虽然简单,但是却缺少了一些乐趣,功能修改起来也比较麻烦,每次都需要重新编译和下载,无法实现远程更新,对于复杂的功能调试起来也比较困难。下面介绍另外一种方法,使用开源的 circuitpython 编程(circuitpython是micropython的一个分支),将 RT1062 变成可以自定义的鼠标键盘。它利用了 circuitpython 提供的 USB HID 库,加上封装好的相关函数,只需要很少几行代码,就可以实现自定义键盘和鼠标,开发者可以把重点放在发挥创意和扩展功能上,而不用过多关注底层细节的实现和熟悉开发工具上。国外已经有很多爱好者使用它制作了各种炫酷的键盘,甚至进行众筹获得了很好的效果。
首先,需要在 circuitpython 网站下载对应的固件,https://circuitpython.org/board/teensy40/。将固件写入开发板后,开发板会显示一个名称为CIRCUITPY的usb磁盘,这个磁盘将用于保存用户数据和程序文件,下载程序时只需要将程序文件复制到这个磁盘,不需要其它专用的编程器或软件,极大方便了 DIY 和降低开发成本。
同时计算机还会出现一个虚拟串口,我们可以通过这个虚拟串口进行程序调试、REPL交互。调试需要使用支持终端功能的软件,如putty、mobaxterm、xshell等,而不能使用串口助手。后面代码的测试,我们以MobaXterm为例进行说明。
其次,下载 circuitpython 库,下载地址是:https://circuitpython.org/libraries。下载 mpy 或者 py 库都可以,效果是一样的。相对而言,mpy 库已经编译成字节码,加载速度更快,也节约内存,但是在这里区别不大。下载后, 将压缩文件里lib\adafruit_hid 连目录全部复制到 CIRCUITPY 磁盘的lib目录中就可以了,它里面包含了 hid 设备的驱动和一些相关的预定义常数。复制后先弹出磁盘,将开发板复位一次,让复制的库生效。
第三,键盘和鼠标功能的基本使用方法。
在终端软件中,先载入usb hid库和键盘相关库。
- import usb_hid
- from adafruit_hid.keyboard import Keyboard
- from adafruit_hid.keycode import Keycode
复制代码
再定义键盘对象实例
- kbd = Keyboard(usb_hid.devices)
复制代码
通过这个kbd就可以模拟键盘发送数据了
- # 发送小写字母a
- kbd.send(Keycode.A)
- # 发送大写字母A,同时发送 a 和 shfit
- kbd.send(Keycode.SHIFT, Keycode.A)
- # 发送 abc,一次最多可以发送6个数据
- kbd.send(Keycode.A, Keycode.B, Keycode.C)
- # 模拟按下大写键
- kbd.send(Keycode.CAS_LOCK)
- # 按下 F1 功能键
- kbd.send(Keycode.F1)
- # 按下 ctrl-c 键
- kbd.send(Keycode.CONTROL, Keycode.C)
复制代码
send() 函数是模拟一次按键,还可以通过 press() 函数和 release() 函数模拟键的按下和释放。使用 press() 函数需要特别注意,运行后会持续发送数据直到运行 release() 函数。
鼠标的使用方法也是类似的,首先载入鼠标库,并定义一个鼠标实例
- import usb_hid
- from adafruit_hid.mouse import Mouse
- m = Mouse(usb_hid.devices)
复制代码
控制鼠标,主要通过下面几个函数
- # 按下鼠标左键
- m.click(Mouse.LEFT_BUTTON)
- # 移动鼠标, 参数分别代表 X、Y、滚轮
- m.move(-100, -100, 0)
复制代码
上面介绍了使用 circuitpython 制作自定义鼠标键盘的基本方法,可以看到无需深入了解usb底层,也不需要编程器或者特别的开发软件,我们就可以快速DIY各种键盘、鼠标、手柄,只需要几分钟就可以编写功能代码。更多相关的 API 说明:
第四,下面通过两个的例子分别演示DIY鼠标和键盘功能。
1. 3个自定义按键的键盘
首先在记事本或其它编辑软件中创建新文件,并复制粘贴下面代码,然后保存到CIRCUITPY磁盘根目录下,文件名是 code.py(上电后会自动运行这个文件)。保存后弹出磁盘在拔USB(这一步很重要,直接拔USB会损坏文件系统),重新连接USB后,就可以通过按键模拟键盘功能。
- import board
- import digitalio
- import time
- import usb_hid
- from adafruit_hid.keyboard import Keyboard
- from adafruit_hid.keycode import Keycode
- kbd = Keyboard(usb_hid.devices)
- def setInput(pin):
- name = digitalio.DigitalInOut(pin)
- name.direction = digitalio.Direction.INPUT
- name.pull = digitalio.Pull.UP
- return name
- KEY0 = setInput(board.D0)
- KEY1 = setInput(board.D1)
- KEY2 = setInput(board.D2)
- KEY3 = setInput(board.D3)
- while True:
- time.sleep(0.02)
- if KEY0.value == 0:
- kbd.send(Keycode.A, Keycode.B, Keycode.C, Keycode.ENTER)
- time.sleep(0.1)
- if KEY1.value == 0:
- kbd.send(Keycode.ONE, Keycode.TWO, Keycode.THREE, Keycode.ENTER)
- time.sleep(0.1)
- if KEY2.value == 0:
- kbd.send(Keycode.SHIFT, Keycode.NINE, Keycode.ZERO, Keycode.ENTER)
- time.sleep(0.1)
-
- if KEY3.value == 0:
- print('exit')
- break
复制代码
上面程序中,定义了3个用户按键 KEY0、KEY1、KEY2,以及KEY3(用于退出程序)。按键设置为内部上拉,按下时是0,未按时是1。按下各按键后,将模拟键盘发送:
如果需要更多按键,就定义更多GPIO。如果按键非常多,可以通过矩阵扫描方式实现。
修改按键处理时发送的数据,就可以发送各种组合键。如果将按键对应的键值保存在配置文件中,上电后从配置文件读取键值,就可以实现一个灵活配置的宏键盘。可以针对不同软件或游戏,编写不同配置,制作出可定义的专用键盘或游戏键盘方案。
如果要做的更加炫酷,可以增加一些WS2812,在circuitpython中,控制WS2812也是非常方便的,基本任何一个GPIO都可以。
2. 自定义鼠标
- import board
- import digitalio
- import time
- import usb_hid
- from adafruit_hid.mouse import Mouse
- m = Mouse(usb_hid.devices)
- def setInput(pin):
- name = digitalio.DigitalInOut(pin)
- name.direction = digitalio.Direction.INPUT
- name.pull = digitalio.Pull.UP
- return name
- KEY0 = setInput(board.D0)
- KEY1 = setInput(board.D1)
- KEY2 = setInput(board.D2)
- KEY3 = setInput(board.D3)
- KEY4 = setInput(board.D4)
- KEY5 = setInput(board.D5)
- while True:
- time.sleep(0.02)
- if KEY0.value == 0:
- m.move(-5, 0, 0)
- time.sleep(0.1)
- if KEY1.value == 0:
- m.move(5, 0, 0)
- time.sleep(0.1)
- if KEY2.value == 0:
- m.move(0, -5, 0)
- time.sleep(0.1)
- if KEY3.value == 0:
- m.move(0, 5, 0)
- time.sleep(0.1)
- if KEY4.value == 0:
- m.click(Mouse.LEFT_BUTTON)
- time.sleep(0.1)
- if KEY5.value == 0:
- m.click(Mouse.RIGHT_BUTTON)
- time.sleep(0.1)
复制代码
程序中,KEY0/KEY1控制鼠标水平移动,KEY2/KEY3控制鼠标垂直移动,KEY4/KEY5代表鼠标左右键。使用按键是为了偷懒了,不想破坏开发板焊接传感器,如果连接一个三轴加速度传感器或陀螺仪传感器,就可以很方便实现空中鼠标功能,或者自动识别手势。
第五,一些创意DIY展示
下面是国外爱好者用 circuitpython 制作的一些有趣例子,虽然单片机不一定是用NXP的,但都可以很轻松移植过来(通常只需要修改 GPIO 的定义),希望这些DIY可以帮助大家,做出更加好玩又好用的定制键盘鼠标:
https://there.oughta.be/a/macro-keyboard
- 具有24个触摸键、9个可定制LED的Blackboard
https://blackbeat.io/
https://www.tindie.com/products/jpconstantineau/raspberry-pi-pico-4x4-macropad/
https://learn.adafruit.com/pico-four-key-macropad
https://www.reddit.com/r/circuitpython/comments/q88gav/
https://github.com/LeafCutterLabs/bigKNOB
|
|