手把手教你做一款HID键盘

简介: 手把手教你做一款HID键盘

功能概述:


快速STM32F103Cx微控制器可实现低输入延迟。

USB全速,轮询速率为1000hz。

可热插拔的键。

EEPROM设置存储。

动态密钥自定义(使用Windows用户的GUI)

具有添加更多功能的三种RGB模式。

完全开源。

兼容Arduino。

模块化且易于携带。


设计框图


20210612081744944.png

键盘使用STM32F103C8T6作为控制器。由于USB端口上的电源引脚为5V供电,但是该款单片机需要使用3.3V电源供电,因此需要将5V转为3.3V,项目中使用MCP1703T来实现该功能。使用Cherry MX风格的机械开关来作为键盘的按键。另外,还可以通过按键来控制LED的模式、颜色、亮度。


系统原理图


20210612081824255.png


系统PCB



image.png


PCB大小为58mm x 59mm。为了能够方便手工焊接,所有的SMD器件均使用0805封装。

图片硬件上提供了STLINK下载接口:


image.png


  • SWDIO-SWDIO
  • SWCLK-SWCLK
  • GND-GND
  • 3V3-3.3V


材料清单:


1个STM32F103CxT6

2个7.3mm高的触觉开关

4个反向安装4-PLCC LED

6个0805 10K欧姆电阻

4个0805 68欧姆电阻

5个0805 1.5K欧姆电阻

3个N沟道SOT-23-3 3.3V电平MOSFET

3个0805 100nF电容器

2个0805 1uF电容器

2个0805 20pF电容器

1个0805 4.7uF电容器

1个MCP1703T-3302T / DB 3.3V稳压器

1个1210 500mA PTC自恢复保险丝

1个USB3090微型USB A / B端口

1x 90度接头排

1个8MHz HC-49晶体

4个圆形橡胶保险杠

4个Kailh热插拔插槽

4个Cherry MX RGB或同等开


安装STM32Duino


打开arduino ide,打开首选项,添加开发板管理网址


http://dan.drown.org/stm32duino/package_STM32duino_index.json


20210612082036756.png

添加完成之后,打开开发板管理器,搜索STM,安装STM32F1xx/GD32F1xx

20210612082055402.png


STM32Duino内的USB库已经提供的USB HID功能,但其轮询间隔为10ms,因此我们还要对其进行修改。


进入目C:\Users{username}\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1{版本名称}\libraries\USBComposite下,打开usb_hid.c文件


搜索bInterval,将该值修改为0x01。轮询间隔修改为1ms

20210612082125927.png

代码配置说明


去抖时间

这是检测到按键后按键拒绝注册按键释放的时间。需要一个反跳时间,因为机械开关在按下后自然会“反跳”,如果不使用反跳计时器,可能会在很短的时间内记录多次错误的按键。在这种情况下,设置防抖计时器的方式不会影响延迟,因此更改此值不会使按键延迟更多。Cherry指定反弹时间为5毫秒,该值应适用于大多数机械开关。


RGB LED

禁用此选项将禁用所有与RGB LED控制有关的代码。这可能会节省一些CPU周期,但不足以有效地更改键盘的性能。


串行通讯

禁用此选项将不允许通过串行或驱动程序软件对键盘进行编程,但是由于微控制器不再需要不断侦听串行命令,因此它将节省一些CPU周期。尽管理论上微控制器在不启用串行的情况下应该运行得更快,但是速度差异可以忽略不计。


RGB LED颜色和图案

如果需要修改RGB LED颜色,则必须直接编辑代码。在checkRGBMode()函数下定义的颜色存储所有的灯光模式0颜色(静态),而incrementColor()下的颜色存储灯光模式2(颜色循环)颜色。

更改颜色,只需更改rgbBrightness []值。这些值以百分比表示该颜色的亮度,其中0为0%,1为100%。rgbBrightness []中的1-3数组分别表示红色,绿色和蓝色。


ledDelay:

这表示在灯光模式2下颜色切换过程之间的延迟,这意味着如果延迟较高,则颜色将缓慢切换,而如果延迟较低,则颜色将更快切换。


colorIncrementDelay

这表示在灯光模式2下切换颜色之间的时间。


使用键盘


20210612082200305.png

该键盘的使用非常简单,直接插入电脑USB口,即可作为正常,低延迟,轮询速率为1000hz的HID键盘使用。同时,还可以通过按键修改LED的模式和颜色。

按键说明:

按下模式按钮的时间少于0.3s会更改照明模式。 按下按钮超过0.3s但少于5s会更改LED颜色,可以通过代码进行自定义。

按住按钮超过5s将开始改变LED的亮度,并且按住按钮时亮度将以1s的增量下降。亮度将在释放按钮时设定。


灯光模式:

静态色

按下键时点亮

交替(默认固件在红色和蓝色之间,但是可以有多种颜色) 系统的所有配置信息都是存放在EEPROM中。


配置按键


若想能够随时、方便的修改按键对应的键值,则需要开启程序中的串口通信功能。有了该功能后,系统将可以通过串口命令对其进行配置。也可通过上位机软件对其进行配置


  • 串口命令:“s:{key number}:{character}:”

“s:1:k:”,将按键1设置为k

  • 使用上位机软件


20210612082346346.png


上位机软件说明

20210612082403350.png


连接设备后,可以使用该程序即时设置按键绑定。为此,请使用名为"keybinds"的面板。您可以通过下拉菜单(参考帮助-键映射的键映射)选择键编号,然后可以通过文本框输入键绑定值。目前仅接受Ascii字符和数字,不幸的是,冒号不是可行的选择,因为它被用作分隔符。如果要禁用该键,只需在文本框中什么也不放,然后按set键即可。


填写完两个选项后,只需按设置按钮,如果一切顺利,就可以设置按键绑定。即使断电,此新设置也将保存在微控制器上。


原始序列号和状态

这两个部分用于诊断目的。原始串行是设备发送回的串行数据的显示,状态面板显示了存储在设备上的不同设置。


组装


  • 效果图


20210612082451845.png

  • 底板

20210612082524288.png


  • 实物图

20210612082619954.png

相关文章
|
消息中间件 存储 Serverless
【实践】快速学会使用阿里云消息队列RabbitMQ版
云消息队列 RabbitMQ 版是一款基于高可用分布式存储架构实现的 AMQP 0-9-1协议的消息产品。云消息队列 RabbitMQ 版兼容开源 RabbitMQ 客户端,解决开源各种稳定性痛点(例如消息堆积、脑裂等问题),同时具备高并发、分布式、灵活扩缩容等云消息服务优势。
347 2
|
缓存 安全 JavaScript
PHP在Web开发中的平台优势与未来趋势###
【10月更文挑战第21天】 PHP,Hypertext Preprocessor,凭借其灵活性、广泛应用和强大社区支持,已成为Web开发的常青树。本文探讨了PHP的发展历程、核心优势、最佳实践案例及面临的挑战与机遇,揭示其在现代Web开发中不可替代的角色,以及如何适应未来技术趋势,持续引领Web创新。 ###
189 2
|
存储 编译器 C++
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
C++进阶之路:何为拷贝构造函数,深入理解浅拷贝与深拷贝(类与对象_中篇)
318 0
|
IDE 开发工具
使用STM32F103标准库实现自定义键盘
通过本文,我们学习了如何使用STM32F103标准库实现一个简单的自定义键盘。我们首先初始化了GPIO引脚,然后实现了一个扫描函数来检测按键状态。这个项目不仅能够帮助我们理解STM32的GPIO配置和按键扫描原理,还可以作为进一步学习中断处理和低功耗设计的基础。希望本文对你有所帮助,祝你在嵌入式开发的道路上不断进步!
1109 4
|
JavaScript 前端开发 关系型数据库
入职必会-开发环境搭建28-VSCode下载和安装
Visual Studio Code(简称 VS Code)是由微软开发的免费开源代码编辑器,支持几乎所有主流操作系统,包括 Windows、macOS 和 Linux。它具有丰富的功能和扩展性,适用于各种编程语言和应用场景。
444 0
|
机器学习/深度学习 前端开发 数据可视化
Streamlit 入门教程:构建一个Dashboard
Streamlit 是一个用于创建数据科学和机器学习应用程序的开源 Python 库。它的主要目标是使开发人员能够以简单的方式快速构建交互式的数据应用,而无需过多的前端开发经验。Streamlit 提供了一种简单的方法来转换数据脚本或分析代码为具有可视化界面的应用程序,这些应用程序可以通过网络浏览器访问。
704 2
|
网络协议 C# 开发者
WPF与Socket编程的完美邂逅:打造流畅网络通信体验——从客户端到服务器端,手把手教你实现基于Socket的实时数据交换
【8月更文挑战第31天】网络通信在现代应用中至关重要,Socket编程作为其实现基础,即便在主要用于桌面应用的Windows Presentation Foundation(WPF)中也发挥着重要作用。本文通过最佳实践,详细介绍如何在WPF应用中利用Socket实现网络通信,包括创建WPF项目、设计用户界面、实现Socket通信逻辑及搭建简单服务器端的全过程。具体步骤涵盖从UI设计到前后端交互的各个环节,并附有详尽示例代码,助力WPF开发者掌握这一关键技术,拓展应用程序的功能与实用性。
798 0
|
JSON 前端开发 API
程序技术好文:百度网盘真实地址解析(告别下载百度网盘)
程序技术好文:百度网盘真实地址解析(告别下载百度网盘)
1985 0
ASCII编码中定义了33个控制字符
ASCII编码中定义了33个控制字符
1505 2