# THKB **Repository Path**: cupDpiece/thkb ## Basic Information - **Project Name**: THKB - **Description**: TouHouKeyboard,一款便宜、低延迟的车万小键盘 - **Primary Language**: C - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 2 - **Created**: 2023-08-26 - **Last Updated**: 2023-08-26 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # [THKB] TouHou Keyboard,便宜、低延迟的客制化小键盘 ![thkb](Docs/LOGO/LOGO_black2.png) #### THKB是一款以便宜、低延迟为设计理念的客制化小键盘。支持全键无冲、全键自定义、组合按键、三层自由键层、超低可调延迟、掉电保存记忆等功能;支持上位机改键值、改延迟,包含测试工具以及使用指南。 机械轴体按键支持可调延迟(延时最低20us,最高50ms),轻触开关软件延时20ms;上位机仅支持Windows系统。 ##### 下载上位机请点击发行版,选择最新版本下载。 本Git项目仓库包含THKB的下位机固件、上位机软件、PCB Gerber文件、CAD设计文件、3D模型以及相关文档等。 本项目的PCB设计文件托管在立创开源社区,v0.1.3版本链接:[THKB_main_v0.1.3 - 嘉立创EDA开源硬件平台 (oshwhub.com)](https://oshwhub.com/kairingo/thkb_main_v0-1-3) 本项目使用MIT开源协议,您可以随意的下载、Clone、Fork本项目作为任何用途。如果用作商业用途量产,希望您赠送一份样品给我,我的联系邮箱是2401977049@qq.com ![thkb](Docs/front_render_reflective.jpg) ## 一、更新说明 ##### 2023.7.24更新:首次正式发布项目,修复了测试版的一些BUG ##### 2023.7.25更新:修复了上位机v0.1.0窗体无法显示的问题 ## 二、项目文件说明 #### 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高的直通柱,防止底板接触到元器件。可以添加夹心垫、轴下垫等配件以提升手感。 ![thkb](Docs/explosive_front.jpg) ​ 键盘使用标准的樱桃MX轴体和PCB 2u卫星轴,建议使用DSA、XDA、原厂或者OEM高度等较低高度的键帽。 ### 2.3 芯片选型 ​ 选用来自南京沁恒的51单片机**CH551**,一块钱的售价,同支持USB FS 2.0、128B DataFlash以及24MHz的主频,非常适合用作本项目的主控MCU。极简的外围器件设计,仅需少量电阻电容,最小系统即可搭建完成。外加51内核的单片机一般都很皮实,可以抗住日常生活中的静电。更好的鲁棒性,可以放心在PCB上做一些美化设计,比如将镀锡的铜皮裸露,绘制图案等。 ![thkb](Docs/pcb.png) ![thkb](Docs/Sch.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<1->2->3->1->2->3。 ![thkb](Docs/host_delay.png) ​ 按键延迟支持20us至50ms,可以输入特定值进行调整,上方的不同模式分别代码:stable稳定模式延时5ms、normal普通模式延时800us、game游戏模式延时50ms,在游戏模式下,若大力敲击会导致按键产生连击。延时大于50ms会导致案件无法触发,而低于20us则极容易发生连击。 ![thkb](Docs/host_tester.png) ​ 设置界面现在还未开发,所以还是一片空白~ ## 六、渲染图与实拍 ![thkb](Docs/Renders/thkb_keyshot_v0.35.jpg) ![thkb](Docs/Renders/thkb_keyshot_v0.1.21.jpg) 打样的PCB(拿座机拍的勿喷,后面如果有量产了再补上) ![thkb](Docs/prototype_photo.jpg) ## 七、授权条款与写在最后 本项目采用MIT开源协议,这意味着您不仅可以用作商业用途,还可以闭源。由于国内的开源大环境不好,任何开源协议最后大概率都会被忽视,与其让别人违背协议,不如放开权限。 如果您想量产,或是基于这个项目进行商业用途的话,虽然不需要再征得我的同意,但还请发送邮件告知我一下,我很希望我的设计可以得到量产,或是被更多人看到,在这里仅抛砖引玉,给大家做键盘或是相关的东西提供更多的灵感。 我希望如果您参考了这个工程,我希望您能将代码开源;如果量产了这款键盘,希望您可以将项目的开源仓库印在产品上,使用自己设计的LOGO,或是用THKB提供的。 这个项目源于我六月底的一个灵感,如果您知道“东方Project”这个IP的话,相信您一定可以猜到了,这款键盘就是专门为了STG(弹幕射击游戏)准备的。可变延时可以适应不同的敲击力度,通过微调使延迟降到最低,以适配不同的使用者。当然,这款键盘的肯定还有更多的用途,这就等待您的开发了。 本项目中除了元器件的3D模型和封装由立创EDA提供外,所有LOGO、代码、图片、PCB板、CAD文件等,都由我编写或设计。本人为管理专业在校大学生,水平有限,项目中尚存在许多错误。实际开发总共就进行了两周半的时间,~~外加我要复习考研~~做的比较仓促,如有错误还请指出,恳请各位的批评指正。