如何DIY一款属于自己的HID键盘?
这是一个自定义游戏键盘,带有四个热插拔机械键和可自定义的RGB LED。它由STM32F103Cx微控制器供电,并通过Arduino IDE进行编程。
文章末尾分享该项目资料。
功能概述:
快速STM32F103Cx微控制器可实现低输入延迟。
USB全速,轮询速率为1000hz。
可热插拔的键。
EEPROM设置存储。
动态密钥自定义(使用Windows用户的GUI)
具有添加更多功能的三种RGB模式。
完全开源。
兼容Arduino。
模块化且易于携带。
设计框图
键盘使用STM32F103C8T6作为控制器。由于USB端口上的电源引脚为5V供电,但是该款单片机需要使用3.3V电源供电,因此需要将5V转为3.3V,项目中使用MCP1703T来实现该功能。使用Cherry MX风格的机械开关来作为键盘的按键。另外,还可以通过按键来控制LED的模式、颜色、亮度。
系统原理图
系统PCB
PCB大小为58mm x 59mm。为了能够方便手工焊接,所有的SMD器件均使用0805封装。
硬件上提供了STLINK下载接口:
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
添加完成之后,打开开发板管理器,搜索STM,安装STM32F1xx/GD32F1xx
STM32Duino内的USB库已经提供的USB HID功能,但其轮询间隔为10ms,因此我们还要对其进行修改。
进入目录C:\Users{username}\AppData\Local\Arduino15\packages\stm32duino\hardware\STM32F1{版本名称}\libraries\USBComposite下,打开usb_hid.c文件
搜索bInterval,将该值修改为0x01。轮询间隔修改为1ms
代码配置说明
去抖时间
这是检测到按键后按键拒绝注册按键释放的时间。需要一个反跳时间,因为机械开关在按下后自然会“反跳”,如果不使用反跳计时器,可能会在很短的时间内记录多次错误的按键。在这种情况下,设置防抖计时器的方式不会影响延迟,因此更改此值不会使按键延迟更多。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下切换颜色之间的时间。
使用键盘
该键盘的使用非常简单,直接插入电脑USB口,即可作为正常,低延迟,轮询速率为1000hz的HID键盘使用。同时,还可以通过按键修改LED的模式和颜色。
按键说明:
按下模式按钮的时间少于0.3s会更改照明模式。
按下按钮超过0.3s但少于5s会更改LED颜色,可以通过代码进行自定义。
按住按钮超过5s将开始改变LED的亮度,并且按住按钮时亮度将以1s的增量下降。亮度将在释放按钮时设定。
灯光模式:
静态色
按下键时点亮
交替(默认固件在红色和蓝色之间,但是可以有多种颜色)
系统的所有配置信息都是存放在EEPROM中。
配置按键
若想能够随时、方便的修改按键对应的键值,则需要开启程序中的串口通信功能。有了该功能后,系统将可以通过串口命令对其进行配置。也可通过上位机软件对其进行配置
串口命令:"s:{key number}:{character}:"
"s:1:k:",将按键1设置为k
使用上位机软件
上位机软件说明
连接设备后,可以使用该程序即时设置按键绑定。为此,请使用名为"keybinds"的面板。您可以通过下拉菜单(参考帮助-键映射的键映射)选择键编号,然后可以通过文本框输入键绑定值。目前仅接受Ascii字符和数字,不幸的是,冒号不是可行的选择,因为它被用作分隔符。如果要禁用该键,只需在文本框中什么也不放,然后按set键即可。
填写完两个选项后,只需按设置按钮,如果一切顺利,就可以设置按键绑定。即使断电,此新设置也将保存在微控制器上。
原始序列号和状态
这两个部分用于诊断目的。原始串行是设备发送回的串行数据的显示,状态面板显示了存储在设备上的不同设置。
组装
效果图
底板
组装视频
实物图
公众号后台回复:stm32键盘 即可获取全部设计资料。
推荐阅读:
专辑|Linux文章汇总
专辑|程序人生
专辑|C语言
我的知识小密圈
关注公众号,后台回复「1024」获取学习资料网盘链接。
欢迎点赞,关注,转发,在看,您的每一次鼓励,我都将铭记于心~
嵌入式Linux
微信扫描二维码,关注我的公众号
如何DIY一款属于自己的HID键盘?相关推荐
- 手把手教你DIY一款属于自己的万能红外遥控器!
下班刚回到家,天气很热~ 空调遥控器呢?找不到! 躺平不想动~ 风扇遥控器呢?找不到! 想看电视,不想动~ 电视遥控器呢?找不到! 好不容易找到了,遥控器没电?崩溃!!!! 想不想拥有一个万能红外遥控 ...
- 基于Domoticz智能家居系统(十七)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验
DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(三)一个简单MySensors客户端的验证实验 一个简单MySensors客户端的验证实验 一. ...
- DIY一款4路USB转TTL串口调试模块
目录 1.电源设计 2.USB集线器设计 3.USB转TTL设计 4.模块效果 最近调测程序经常用到单片机的三个串口同时交互通信,我使用1路USB转TTL串口调试模块不断切换,不仅影响观察效果,更是劳 ...
- 天啊!吃饭用的勺子都联网了~手把手带你DIY一款智能百味勺子
减脂餐索然无味,有了它,想什么味就什么味! 健康生活低糖低盐,有了它,即可轻松实现! 良药苦口,有了它,不再难以下咽! 想不想拥有一把神奇的"百味"勺子,把索然无味的食物变出酸甜苦 ...
- 基于Domoticz智能家居系统(十六)DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(二)正式DIY
DIY一款基于MySensors的ESP8266+NRF24L01的MQTT(WIFI)和RF无线网关(二)正式DIY 正式DIY 一.本文参考的国外DIY项目 二.本文采用的模块和连接线路 1.ES ...
- 串口转 HID 键盘鼠标芯片 CH9329
芯片链接: https://item.taobao.com/item.htm?spm=a1z10.3-c.w4002-951511554.10.7f661349VPfTQP&id=591459 ...
- USB HID键盘实现全键无冲解析
目录 前言 设备描述符 配置描述符 配置描述符 接口描述符 HID描述符 端点描述符 HID类报表描述符 输入输出数据解析 其他 前言 看了稚辉君的瀚文键盘的源码之后对于键盘全键无冲的实现还是存在很多 ...
- 作为一名程序猿应如何入手一款实用 + 炫酷的键盘(keychron)
作为一名程序猿应如何入手一款实用 + 炫酷的键盘(keychron) 1. 个人使用感受 2. keychron 产品背景 3. 产品特点 有线&蓝牙 Keychron的Mac键盘布局 兼容所 ...
- STM32 USB复合设备(VCP虚拟串口+HID键盘)详解
USB复合设备 介绍 USB复合设备与组合设备区别 USB描述符修改 修改CustomHID_Reset 修改CustomHID_Data_Setup 介绍 本次使用的是Keil 5+STM32F10 ...
最新文章
- linux查找项目中的问题,教你如何快速定位项目中慢查询[项目管理]
- 矩阵的三维变换(转)
- 算法学习之百钱买百鸡
- parallel-comparator-200-攻防世界-逆向(简单易懂)
- 【初码干货】关于.NET玩爬虫这些事
- delphi word类型_现在的女生喜欢什么类型的男生?|What Kind of Boys Do Girls Like?
- C/C++认识标准win32应用程序
- 01-浏览器同源政策 以及 什么是跨域?怎么解决跨域问题?
- JAVA线程池_并发队列工作笔记0001---认识阻塞队列_非阻塞队列
- [转载] python怎么获取redis中的数据_python操作redis数据库
- python实用模块(持续更新)
- “国际通信展”十年的印记
- atitit.团队建设--要不要招技术储备人才的问题
- 319. 灯泡开关【我亦无他唯手熟尔】
- Linux 5.19 迎来首个候选版本,Linus:多平台 Linux 内核“差不多完成了”
- MODTRAN辐射传输模型使用笔记
- 单片机采集电压信号(AD转换器的应用实例)上
- Go语言 数据库编程
- u盘数据恢复的原理_如何进行u盘数据恢复
- Python爬虫之Scrapy库的下载和安装
热门文章
- prod()与cumprod()区别cumsum()
- 支付宝沙箱 出现支付存在钓鱼风险
- OpenGL ES 2.0 for Android教程(八):构建简单物体
- 卧槽,被盗号了!!!
- html页面调用OneDrive api,使用OneDrive API获取访问令牌
- 大一第二学期周报8Web基础之XXS跨站漏洞详解——1XSS漏洞基础详解
- 【chip-tool】chip-tool工具常用指令介绍
- 恢复丢失的QQ好友!或被盗号者删除的QQ好友!
- 龙珠直播CTO谭振林:从0到500万用户背后的技术架构变迁
- 多语言网站如何搭建?