# [THKB] TouHou Keyboard,便宜、低延迟的客制化小键盘
![LOGO_black2.png](//image.lceda.cn/pullimage/DRRildI8lvhhMlxNE1ycnbI8IxGsw1GH0XY1mNwr.png)
#### V0.2.2版本已经发布,链接:[THKB_main_v0.2.2 - 嘉立创EDA开源硬件平台 (oshwhub.com)](https://oshwhub.com/kairingo/thkb_main_v0-2-2)
#### THKB是一款以便宜、低延迟为设计理念的客制化小键盘。支持全键无冲、全键自定义、组合按键、三层自由键层、超低可调延迟、掉电保存记忆等功能;支持上位机改键值、改延迟,包含测试工具以及使用指南。
机械轴体按键支持可调延迟(最低20us,最高50ms),轻触开关软件延时20ms;上位机仅支持Windows系统。
##### 这里Readme版本更新可能不及时,最新内容请移步至gitee仓库。
本开源工程包含PCB的设计部分。
更多资料请访问Git项目仓库,包含THKB的下位机固件、上位机软件、PCB Gerber文件、CAD设计文件、3D模型以及相关文档等,链接:[[THKB] TouHou Keyboard 便宜、低延迟的客制化小键盘](https://gitee.com/Kairingo/thkb)
~~~~
本项目使用MIT开源协议,您可以随意的下载、Clone、Fork本项目作为任何用途。如果用作商业用途量产,希望您赠送一份样品给我,我的联系邮箱是2401977049@qq.com
![front_render_reflective.jpg](//image.lceda.cn/pullimage/Cj4vWMdRDuhfhrVujcyaqZ9N36Q1FFvbnrycVRlG.jpeg)
## 一、更新说明
##### 2023.7.24更新:首次正式发布项目,修复了测试版的一些BUG
## 二、项目文件说明
#### Firmware -v0.1.0
##### \|\-\- THKB\_fw 使用Keil5 C51配合 vs code Keil Assistant 插件配合编写
\|\-\-Obj 文件夹内的**THKB_fw.hex**为生成的hex文件,可以直接用于下载,将的P3.6引脚通过20K电阻下拉即可进入ISP下载模式,下载方法请参考沁恒官方
#### Software -v0.1.0
##### \|\-\- THKB\_host\_software 上位机程序,使用C\#编写,dotnet Framwork 3\.5框架,winform窗体。使用Visual Studio开发
##### \|\-\- fonts 包含上位机所需的字体
##### \|\-\- pic 上位机中使用的一些图片素材
#### Hardware -v0.1.3
##### \|\-\- pcb 包含PCB Gerber文件,设计文件:[THKB\_main\_v0\.1\.3 \- 嘉立创EDA开源硬件平台 \\(oshwhub\.com\\)](https://oshwhub.com/kairingo/thkb_main_v0-1-3)
##### \|\-\- bom 物料清单与购买链接
#### CADs -v0.1.0
##### 包含顶板,底板以及垫高板的CAD文件
#### 3D_Models -v0.1.0
##### 3D模型,包含零件与装配体。使用Soildworks 2022设计
#### Docs
##### LOGO、文档、渲染图以及一些相关文档等
## 三、硬件架构说明
### 2.1设计理念
为贯彻低成本的设计方案,所有元器件和结构都在保证稳定可用的情况下做了Cost Down。键盘总共有9个机械轴体按键(1个2u、1个1.5u和7个1u)和两个轻触开关。PCB同时支持热插拔和焊接方案,可以根据用途进行调整。
### 2.2 结构设计
键盘倾斜角约为6°;为了节省成本,键盘的结构为三明治夹心结构,从上到下分别是2mm亚克力顶板、FR-4玻纤PCB板、3mm亚克力底板以及5mm亚克力垫高板,使用M3内六角螺丝进行紧固,为了提高稳固性,使用SMT贴片螺柱固定在PCB板上,无法拆卸。顶面使用4mm螺丝,底面8mm和12mm螺丝分别固定,底部使用2mm高的直通柱,防止底板接触到元器件。可以添加夹心垫、轴下垫等配件以提升手感。
![explosive_front.jpg](//image.lceda.cn/pullimage/5fW5Gro9mItHXvNfEfLE0LUj76cOCxHm9edStH2F.jpeg)
键盘使用标准的樱桃MX轴体和PCB 2u卫星轴,建议使用DSA、XDA、原厂或者OEM高度等较低高度的键帽。
### 2.3 芯片选型
选用来自南京沁恒的51单片机**CH551**,一块钱的售价,同支持USB FS 2.0、128B DataFlash以及24MHz的主频,非常适合用作本项目的主控MCU。极简的外围器件设计,仅需少量电阻电容,最小系统即可搭建完成。外加51内核的单片机一般都很皮实,可以抗住日常生活中的静电。更好的鲁棒性,让我可以放心在PCB上做一些美化设计,比如将镀锡的铜皮裸露,绘制出图案等。
![pcb.png](//image.lceda.cn/pullimage/AtRO96Qk2rFda3HwHKKlYizkzZW3gGZbi2hInY4W.png)
![Sch.png](//image.lceda.cn/pullimage/bxACHr76xzBu1C7w9vNXJSeCtvxr4oZRFxISFSiW.png)
## 四、固件设计
按键的扫描方式是传统的矩阵扫描,扫描方式是从行到列。键盘由两行六列组成,总共11个按键。由于ch551没有下拉输入模式,每个列的引脚通过20K的电阻下拉到地,通过1n4148防止串扰。所有有关上位机与USB中断的操作都放在USB的终端服务函数中处理,由于我七月份才第一次使用51单片机,很多东西我也没有玩明白,譬如UINT8、UINT8I、UINT8X等,有函数不能重入等诸多限制。考虑到键盘的功能不算复杂,固件勉勉强强也没问题。~~反正人和代码一样能跑就行~~
``` C
void keyboard_scan(void)
{
memset(Keyboard_ScanBuf,0,11);
IO_KEY_R0 = 1;
IO_KEY_R1 = 0;
mDelayuS(10);
Keyboard_ScanBuf[0] = IO_KEY_C0;
Keyboard_ScanBuf[1] = IO_KEY_C1;
Keyboard_ScanBuf[2] = IO_KEY_C2;
Keyboard_ScanBuf[3] = IO_KEY_C3;
Keyboard_ScanBuf[4] = IO_KEY_C4;
//按键消抖
if(Keyboard_ScanBuf[0]||Keyboard_ScanBuf[1]||
Keyboard_ScanBuf[2]||Keyboard_ScanBuf[3]||
Keyboard_ScanBuf[4])
{
keyboard_delay();
Keyboard_ScanBuf[0] &= IO_KEY_C0;
Keyboard_ScanBuf[1] &= IO_KEY_C1;
Keyboard_ScanBuf[2] &= IO_KEY_C2;
Keyboard_ScanBuf[3] &= IO_KEY_C3;
Keyboard_ScanBuf[4] &= IO_KEY_C4;
}
IO_KEY_R0 = 0;
IO_KEY_R1 = 1;
mDelayuS(10);
Keyboard_ScanBuf[5] = IO_KEY_C0;
Keyboard_ScanBuf[6] = IO_KEY_C1;
Keyboard_ScanBuf[7] = IO_KEY_C2;
Keyboard_ScanBuf[8] = IO_KEY_C3;
Keyboard_ScanBuf[9] = IO_KEY_C4;
Keyboard_ScanBuf[10] = IO_KEY_C5;
//按键消抖
if(Keyboard_ScanBuf[5]||Keyboard_ScanBuf[8]||
Keyboard_ScanBuf[9]||Keyboard_ScanBuf[10])
{
keyboard_delay();
Keyboard_ScanBuf[5] &= IO_KEY_C0;
Keyboard_ScanBuf[8] &= IO_KEY_C3;
Keyboard_ScanBuf[9] &= IO_KEY_C4;
Keyboard_ScanBuf[10] &= IO_KEY_C5;
}
if(Keyboard_ScanBuf[6]||Keyboard_ScanBuf[7])
{
mDelaymS(20);
Keyboard_ScanBuf[6] &= IO_KEY_C1;
Keyboard_ScanBuf[7] &= IO_KEY_C2;
}
}
```
全键无冲的方案参考了稚辉君的重映射键值方案,使用枚举,用负数表示特殊按键(如Ctrl、Shift等),普通按键从0~128依次枚举,用有符号char存储值,FN键层切换键也包含其中,如果FN被按下,则切换键层,并等待一秒钟。
``` C
static void keyboard_remap(char keyvalue)
{
UINT8 index = 0 , bit_index = 0;
//特殊按键
if( keyvalue < 0)
{
Keyboard_RemapBuf[0] |= 1<<(8 + keyvalue);
return;
}
//FN键
if( keyvalue == FN)
{
if(Current_Layer<3) Current_Layer++;
else Current_Layer = 1;
led_on(Current_Layer);
mDelaymS(1000);
return;
}
//普通按键
index = keyvalue / 8;
bit_index = keyvalue % 8;
Keyboard_RemapBuf[index+1] |= 1<<bit_index;
}
```
## 五、上位机软件设计
上位机软件使用C#编写,本来是想用Qt调用多个库,写一个全平台的版本,但是本人C++很烂,于是放弃了这个设想,还是C#开发起来快。
上位机使用Winform框架编写,调用了Hidlibrary库设计思路是主窗体中包含四个子窗体,通过点击主窗体的不同按钮切换子窗体,调用不同的功能,分辨是映射更改、延时更改、按键测试以及设置,左下角显示键盘当前的连接状态
![host_keymap.png](//image.lceda.cn/pullimage/pfU2d3vqFTwY7ZUlCpyigBNHnH6rGSgTci5KYcDF.png)
键盘映射可以支持每个按键自定义绑定三个键值,比如(Ctrl+Alt+F4)等。总共三个键层,绑定FN的按键可以用于切换键层,FN与其他任意键值冲突,如果一层没有FN键,则这一层没办法切换到下一层,上电以后处于默认层(第0层),切换顺序是0->1->2->3->1->2->3。
![host_delay.png](//image.lceda.cn/pullimage/0VGpIcQRc9zxwHwCugGttbnJ16S3vx1zvyzSSfP7.png)
按键延迟支持20us至50ms,可以输入特定值进行调整,上方的不同模式分别代码:stable稳定模式延时5ms、normal普通模式延时800us、game游戏模式延时50ms,在游戏模式下,若大力敲击会导致按键产生连击。延时大于50ms会导致案件无法触发,而低于20us则极容易发生连击。
![host_tester.png](//image.lceda.cn/pullimage/NErOVNvsDuVq8AQtdYDxRf9CqKI3OTKDpTKPY4oM.png)
设置界面现在还未开发,所以还是一片空白~
## 六、渲染图与实拍
图太大了传不上来,大家移步至gitee看吧~~~~
## 七、授权条款与写在最后
本项目采用MIT开源协议,这意味着您不仅可以用作商业用途,还可以闭源。由于国内的开源大环境比较恶劣,任何开源协议最后大概率都会被忽视,与其让别人违背协议,不如彻底放开权限。
如果您想量产,或是基于这个项目进行商业用途的话,虽然不需要再征得我的同意,但还请发送邮件告知我一下,我很希望我的设计可以量产,或是被更多人看到,在这里仅抛砖引玉,给大家做键盘或是相关的东西提供更多的灵感。
我希望如果您参考了这个工程,我希望您能将您的代码开源;如果量产了这款键盘,我希望您可以将项目的开源仓库印在产品上,使用您自己设计的LOGO,或是用THKB提供的。
这个项目源于我六月底的一个灵感,如果您知道“东方Project”这个IP的话,相信您一定可以猜到了,这款键盘就是专门为了STG(弹幕射击游戏)准备的。可变延时可以适应不同的敲击力度,通过微调使延迟降到最低,以适配不同的使用者。当然,这款键盘的肯定还有更多的用途,这就等待您的开发了。
本项目中除了元器件的3D模型和封装由立创EDA提供外,所有LOGO、代码、图片、PCB板、CAD文件等,都由我编写或设计。本人为管理专业在校大学生,水平有限,项目中尚存在许多错误。实际开发总共就进行了两周半的时间,~~外加我要复习考研~~做的比较仓促,如有错误还请指出,恳请各位的批评指正。
23
31
收藏到专辑