百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

制作成本上千元的键盘,厉害在哪?

liebian365 2025-03-30 18:18 13 浏览 0 评论

这是稚晖君亲自写的开源资料

下方超长超详细教程预警!!

全文导航:项目简介、项目原理说明、硬件说明、软件说明


项目简介

瀚文智能键盘是一把我为自己设计的——多功能、模块化机械键盘。

键盘使用模块化设计。

左侧的多功能场景交互模块可以替换成各种自定义组件

  • 左侧模块默认使用的是电子墨水屏以及FOC力反馈旋钮的Dynamic组件
  • 键盘使用自己开发的基于ARM Cortex-M芯片的键盘固件以及模块固件;
  • 键盘本体使用移位寄存器方式实现优化的按键扫描电路;

模块以及键盘本体可以单独使用,也可以通过串口协议进行相互通信和调用。

稚晖君是将资料完全开源的,我也将文章完全转载了。

不过完整的代码等附件资料还是无法上传,有需要可发【822】获取完整资料,我设置了关键词回复。


项目原理说明

1、文件说明

一共有如下十块板子:

①HelloWord-Keyboard

主键盘的PCB,控制器为STM32F103,可以配合底座单独使用,提供常规按键输入功能,带全按键独立RGB灯。

②HelloWord-Ctrl

左侧Dynamic组件的PCB,控制器为STM32F405,可以配合底座单独使用,提供FOC力反馈旋钮、电子墨水屏显示、OLED显示、RGB灯等功能。


③HelloWord-Connector

主键盘用于连接底座的触点PCB,通过FFC排线与键盘PCB连接。


④HelloWord-Connector-Ctrl

Dynamic组件用于连接底座的触点PCB,通过FFC排线与Dynamic组件PCB连接。


⑤HelloWord-Encoder

磁编码器PCB,用于对无刷电机进行位置反馈,需要配合一个径向充磁的永磁铁工作。


⑥HelloWord-Hub1

底座上扩展出的两个额外USB-A接口转接PCB,通过FFC排线和TypeC接口板连接。


⑦HelloWord-Hub2

底座上扩展出的两个额外USB-A接口的母座PCB,预留的是USB3.0母座和引脚,但是目前只使用到了2.0接口,未来可以升级到USB3.0的HUB。


⑧HelloWord-TypeC

底座上用于连接电脑的TypeC接口PCB,板载了电源充电管理芯片,以及USB-HUB芯片,通过FFC排线连接其余模块。


⑨HelloWord-OLED

Dynamic组件上OLED屏幕的最小驱动电路以及转接板。


⑩HelloWord-TouchBar

可选的电容触摸条模块PCB,使用6按键电容触摸芯片组成一个线性感应阵列,通过FFC排线和主键盘PCB连接。


2、Firmware

Firmware中提供了上面所有板子的固件源码,以及预编译好的bin固件。

可以直接烧录,主要包含以下两个工程:

①HelloWord-Keyboard-fw

主键盘的固件,主要是实现了

  • 基于硬件SPI和移位寄存器的高速按键扫描
  • 基于硬件SPI&DMA的总线式RGB灯控制
  • HID高速设备键盘枚举&报文协议实现
  • 非易失存储配置
  • 多层按键映射等功能

②HelloWord-Dynamic-fw

Dynamic组件的固件,主要实现了

  • 基于FOC的电机控制代码
  • 可配置触感封装类
  • 电子墨水屏驱动
  • OLED驱动
  • USB全速复合设备枚举和通信协议
  • RGB灯控制等功能

工程都是基于STM32HAL实现的。所以提供了对应的.ioc文件,可以自行用STM32CubeMX打开,生成对应的keil或者STM32IDE工程文件。

当然也可以像我一样,用CLion或者STM32CubeIDE进行编译和下载。

_Release文件夹里是预编译好的bin文件,可以用 ST-Link Utillity 或者STM32CubeProgrammer之类的软件直接下载到芯片。


3、Software

Software中提供了一些用于和键盘交互的电脑端上位机软件。

包括视频里演示的傻瓜化修改墨水屏图片的上位机软件,以及后续会逐步补充用于修改键位的图形化软件给模块添加APP的应用商店软件。

这些还在开发中。


4、Tools

Tools主要是提供一些三方的工具软件,比如

  • STM32 ST-LINK Utility
  • 用于安装驱动的 zadig 等等


5、3D Model

文件夹里是键盘用到的所有结构件的3D模型文件,可以用于3D打印。


6、Docs

相关的参考文件,包括芯片的Datasheet等。



硬件架构说明

1、关于结构设计?

瀚文的结构包括三大部分:

  • 扩展坞底座
  • 键盘输入模块
  • 可替换的多功能交互模块

键盘输入模块和可替换的多功能交互模块,通过若干接触式触点连接,在所述扩展坞底座顶部:

键盘本体也是一个标准的客制化键盘层叠结构设计。

包含减震棉、PCBA、定位板、轴下垫等:

键盘的结构设计主要是Xikii根据S98修改而来,为75键布局,有其他布局需要的同学可以自行修改PCB和固件适配。

关于视频中展示的结构件,由于是Xikii的方案所以我也不好擅自把源文件放出,而且原始版本结构是用于CNC机加工的,成本会比较高

所以我也让Xikii帮忙设计一套简化版可用于3D的结构件,并开源出来放到仓库。


2、关于芯片选型?

键盘主控选用的芯片是STM32F103CBT6,实际上C8T6也可以,不过考虑到未来固件功能的扩展性,Flash大一倍的CBT6性价比更高


①固件

这块由于我固件基本都是使用HAL库实现的,因此实际上也可以把主控替换成STM32系列的任何一款芯片只需要芯片有:

  • 2个SPI硬件接口分别用于按键扫描以及RGB灯驱动
  • 以及一个全速USB接口即可。


②Dynamic组件

Dynamic组件主控的STM32F4,这个是因为我手边这款芯片比较多,理论上可以替换为性价比更高的F1系列的只要芯片具备:

  • 一个高级定时器用于PWM生成
  • 2个硬件SPI接口用于编码器和电子墨水屏通信
  • 一个I2C接口用于OLED驱动
  • 以及一个全速USB接口即可。


③磁编码器芯片

电机的磁编码器芯片我是使用AS5047P,也是一款很常用性能很好的磁编码芯片,不过成本略高

我只是因为手边有所以选了这款,也是可以修改为其他更便宜的型号的比如MT6816等,当然也需要修改固件驱动代码


④寄存器芯片

按键扫描用的移位寄存器使用的74HC165,国产芯片零售的话大概0.5元一片,一片可以驱动8个按键,按照你自己需要的按键数目修改串联的寄存器芯片即可。

进口的165比如TI原装的要比国产贵一些,性能也会稍微好点,不过由于本项目中按键扫描频率4MHz已经完全够用了,因此哪怕国产的16MHz芯片也绰绰有余了。


⑤电容触摸板

电容触摸板使用的是一个6通道电容触摸按键芯片XW06A实现的,这个对于PCB感应盘的设计有一定要求,仓库已经提供了设计好的PCB

对于该芯片的读取方式,其实和普通按键没有区别,所以本方案中也是使用74HC165进行扫描读取的。


⑥电机FOC驱动电路

电机FOC驱动电路完全是从我的Ctrl驱动器中移植过来的,使用FD8288Q作为栅极驱动器,无需电流传感器


3、关于烧录方式?

使用JLink、STLink之类的调试器烧录,我在PCB和外壳上都预留了SWD调试口。

对于没有硬件开发经验的同学,我晚点也会放出一个Bootloader,可以直接通过USB口进行固件升级。


4、关于电机选型?

我使用的是一个2204的二手电机,不过这一款电机目前好像不太好买,大家可以选取类似尺寸的无刷电机替换,参数方面需要KV值低一些,最好200左右


电机需要手动在转子上安装一个径向充磁的永磁体用于编码器定位,不同型号的电机需要对FOC参数进行一些调整。



软件架构说明

1、关于键盘固件的按键映射方式?

为了充分发挥视频中提到的移位寄存器扫描方案的优势,固件代码中将PCB Layout走线和按键扫描顺序解耦,通过软件进行重映射。

也就是说PCB中按键的连接可以是任意的,走完线之后可以在hw_keyboard.h文件中的keyMap[KEYMAP_NUM][IO_NUMBER]中指定映射方式。


①二维数组

这是一个二维数组,代表有KEYMAP_NUM层键位映射,每一层有IO_NUMBER个按键(也就是你的键盘按键数目);

  • 其中第0层是特殊的,负责映射PCB按键的随机布局到键盘标准按键布局
  • 后续的1、2、3、4...层都是自定义的,负责映射标准按键布局到任意布局


②举个例子

考虑原理图中箭头指的那个按键,这个按键可以在PCB的任意位置。

但是我们可以看到,它是从左到右(按74HC165的连接顺序,也即移位扫描顺序)的第10颗,因此它的编号为9(从0开始算)。


如果我们在实际的PCB板上把它放在了右边Alt的位置,那么参考在下图代码红色框中的第1层映射(也就是标准布局)中的RIGHT_ALT的序号是76。

那么在第0层映射的76号变量就填入9(蓝色框)。


这样依次把你PCB上所有按键都填入0层映射,就得到了一个映射好的标准键盘了。


后续2、3、4、5...层需要怎么映射就随意修改添加即可,也不需要再使用数字编号,而是可以直接用枚举的按键名称很方便。


③修改键盘配列

所以对于想修改键盘配列的人,只需要在原理图上添加或删减几个串联的74HC165,然后PCB随意走线,再将代码中0层映射删减或增加一些数字即可。

  • 比如在下面的例子中我的键盘是83键的
  • 后面几层的修改就以此类推了

代码中通过keyboard.Remap函数来映射不同层,比如keyboard.Remap(2)这一句是使用第2层映射。


2、关于键盘固件的滤波方法?

固件中使用了每个按键独立的滤波,但是是以一种非常高效的方式来实现的。

毕竟1KHz的报文,每个报文期间至少扫描两次按键,意味着每秒钟需要进行 1000*2*[按键数目] 次数的滤波。


①基本原理

按键抖动的原因是按下后会在高低电平之间反复横跳。

这个稳定时间一般是几十us。

注意是电平稳定时间,不是按键触发时间,后者是由于按键簧片接触时间的不确定性导致的,可能长达数ms。


②四种滤波方法

在QMK的
qmk_firmware/feature_debounce_type文档中。

描述了其使用的几种滤波方法,分为

  • Eager
  • Defer
  • 对称
  • 非对称等

默认是使用对称延迟全局滤波。

也就是说,是对所有按键进行同等的滤波,等所有的按键都稳定了不再变化,再提交扫描数据。

与之对应的是激进滤波方法。

也就是说一旦检测到按键变化就提交数据,但是在这之后的N毫秒时间内不再响应任何按键。

也就避免了把不断抖动的按键提交上去。


这种方法触发延迟低,但是对噪声很敏感,容易误触发。


③对称延迟独立滤波

我在瀚文的固件中使用的是对称延迟独立“滤波”。

也就是对每个按键进行两次检测。

如果第一次检测到了按键变化,那么相隔N微秒。

这个参数可以配置,大于按键典型抖动时间即可。

再检测一次,如果两次检测结果一致,那么判断按键被按下,此时可以确保按键发生了变化,且不会重复触发按键,兼顾延迟和稳定性。


3、关于键盘固件的HID描述符?

这个可以直接参考源码的usbd_customhid.c文件。

我配置了两个ReportID:

  • ID-0是上报键位扫描数据的(全键无冲)
  • ID-1是预留用于后续跟上位机改键软件通信用的


4、关于RGB的控制?

代码中使用的是单总线的ws2812b系列灯珠。

一根线就可以串联一大堆RGB,而且代码中实现了SPI-DMA模拟时序,得到了超高的刷新率。

目前代码里只写了一个demo灯效(非常简单就是轮询色彩)。

自己添加额外的灯效的话,通过keyboard.SetRgbBuffer函数设置RGB值,然后SyncLights把数据发送给LED即可:

while (true)
{
/*---- This is a demo RGB effect ----*/
static uint32_t t = 1;
static bool fadeDir = true;
fadeDir ? t++ : t--;
if (t > 250) fadeDir = false;
else if (t < 1) fadeDir = true;
for (uint8_t i = 0; i < HWKeyboard::LED_NUMBER; i++)
keyboard.SetRgbBuffer(i, HWKeyboard::Color_t{(uint8_t) t, 50, 0});
/*-----------------------------------*/
// Send RGB buffers to LEDs
keyboard.SyncLights();
}


看到这里的朋友们!你们太棒啦~



如果你喜欢这篇文章的话

欢迎点赞、关注、转发~

我会更新更多优质开源工程!

相关推荐

精品博文嵌入式6410中蓝牙的使用

BluetoothUSB适配器拥有一个BluetoothCSR芯片组,并使用USB传输器来传输HCI数据分组。因此,LinuxUSB层、BlueZUSB传输器驱动程序以及B...

win10跟这台计算机连接的前一个usb设备工作不正常怎么办?

前几天小编闲来无事就跑到网站底下查看粉丝朋友给小编我留言询问的问题,还真的就给小编看到一个问题,那就是win10跟这台计算机连接的一个usb设备运行不正常怎么办,其实这个问题的解决方法时十分简单的,接...

制作成本上千元的键盘,厉害在哪?

这是稚晖君亲自写的开源资料!下方超长超详细教程预警!!全文导航:项目简介、项目原理说明、硬件说明、软件说明项目简介瀚文智能键盘是一把我为自己设计的——多功能、模块化机械键盘。键盘使用模块化设计。左侧的...

E-Marker芯片,USB数据线的“性能中枢”?

根据线缆行业的研究数据,在2019年搭载Type-C接口的设备出货量已达到20亿台,其中80%的笔记本电脑和台式电脑采用Type-C接口,50%的智能手机和平板电脑也使用Type-C接口。我们都知道,...

ZQWL-USBCANFD二次开发通讯协议V1.04

修订历史:1.功能介绍1.1型号说明本文档适用以下型号:  ZQWL-CAN(FD)系列产品,USB通讯采用CDC类实现,可以在PC机上虚拟出一个串口,串口参数N,8,1格式,波特率可以根据需要设置(...

win10系统无法识别usb设备怎么办(win10不能识别usb)

从驱动入手,那么win10系统无法识别usb设备怎么办呢?今天就为大家分享win10系统无法识别usb设备的解决方法。1、右键选择设备管理器,如图:  2、点击更新驱动程序,如图:  3、选择浏览...

微软七月Win8.1可选补丁有内涵,含大量修复

IT之家(www.ithome.com):微软七月Win8.1可选补丁有内涵,含大量修复昨日,微软如期为Win7、Win8.1发布7月份安全更新,累计为6枚安全补丁,分别修复总计29枚安全漏洞,其中2...

如何从零开始做一个 USB 键盘?(怎么制作usb)

分两种情况:1、做一个真正的USB键盘,这种设计基本上不涉及大量的软件编码。2、做一个模拟的USB键盘,实际上可以没有按键功能,这种的需要考虑大量的软件编码,实际上是一个单片机。第一种设计:买现成的U...

电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题

电脑识别U盘失败?5个实用小技巧,让你轻松搞定USB识别难题注意:有些方法会清除USB设备里的数据,请谨慎操作,如果不想丢失数据,可以先连接到其他电脑,看能否将数据复制出来,或者用一些数据恢复软件去扫...

未知usb设备设备描述符请求失败怎么解决

出现未知daousb设备设备描述符请求失du败解决办zhi法如下:1、按下Windows+R打开【运行】;2、在版本运行的权限输入框中输入:services.msc按下回车键打开【服务】;2、在服务...

读《飘》47章20(飘每章概括)

AndAhwouldn'tleaveMissEllen'sgrandchildrenfornotrashystep-patobringup,never.Here,Ah...

英翻中 消失的过去 37(消失的英文怎么说?)

翻译(三十七):消失的过去/茱迪o皮考特VanishingActs/JodiPicoult”我能做什么?“直到听到了狄利亚轻柔的声音,我才意识到她已经在厨房里站了好一会儿了。当她说话的时候,...

RabbitMQ 延迟消息实战(rabbitmq如何保证消息不被重复消费)

现实生活中有一些场景需要延迟或在特定时间发送消息,例如智能热水器需要30分钟后打开,未支付的订单或发送短信、电子邮件和推送通知下午2:00开始的促销活动。RabbitMQ本身没有直接支持延迟...

Java对象拷贝原理剖析及最佳实践(java对象拷贝方法)

作者:宁海翔1前言对象拷贝,是我们在开发过程中,绕不开的过程,既存在于Po、Dto、Do、Vo各个表现层数据的转换,也存在于系统交互如序列化、反序列化。Java对象拷贝分为深拷贝和浅拷贝,目前常用的...

如何将 Qt 3D 渲染与 Qt Quick 2D 元素结合创建太阳系行星元素?

Qt组件推荐:QtitanRibbon:遵循MicrosoftRibbonUIParadigmforQt技术的RibbonUI组件,致力于为Windows、Linux和MacOSX提...

取消回复欢迎 发表评论: