mirror of
https://gitee.com/peng_zhihui/HelloWord-Keyboard
synced 2025-09-27 02:49:13 +08:00
Update README.md
This commit is contained in:
parent
53fd45ec32
commit
eae5e2025f
@ -88,28 +88,29 @@ public:
|
||||
|
||||
int16_t keyMap[KEYMAP_NUM][IO_NUMBER] = {
|
||||
// The first layer, used for aligning 74HC165 IO pins to PCB key layout
|
||||
{67, 61, 60, 58, 59, 52, 55, 51, 50, 49, 48, 47, 46, 3,
|
||||
80, 81, 64, 57, 62, 63, 53, 54, 45, 44, 40, 31, 26, 18, 2,
|
||||
19, 70, 71, 66, 65, 56, 36, 37, 38, 39, 43, 42, 41, 28, 1,
|
||||
15, 74, 73, 72, 68, 69, 29, 30, 35, 34, 33, 32, 24, 0,
|
||||
14, 76, 77, 78, 79, 16, 20, 21, 22, 23, 27, 25, 17, 4,
|
||||
13, 12, 8, 75, 9, 10, 7, 11, 6, 5,
|
||||
{67,61, 60, 58, 59, 52, 55, 51, 50, 49, 48,47,46,3,
|
||||
80, 81,64,57,62,63,53,54,45,44,40,31,26,18,2,
|
||||
19,70, 71, 66, 65, 56, 36, 37, 38, 39, 43, 42, 41,28,1,
|
||||
15, 74, 73, 72, 68, 69, 29, 30, 35, 34, 33, 32,24,0,
|
||||
14, 76, 77, 78, 79, 16, 20, 21, 22,23, 27,25,17, 4,
|
||||
13,12, 8,75,9, 10,7,11, 6,5,
|
||||
85},
|
||||
|
||||
// Other layer, used for mapping default key layout to custom layout
|
||||
{ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE,
|
||||
GRAVE_ACCENT, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_0, MINUS, EQUAL, BACKSPACE, INSERT,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LEFT_U_BRACE, RIGHT_U_BRACE, BACKSLASH, DELETE,
|
||||
CAP_LOCK, A, S, D, F, G, H, J, K, L, SEMI_COLON, QUOTE, ENTER, PAGE_UP,
|
||||
LEFT_SHIFT, Z, X, C, V, B, N, M, COMMA, PERIOD, SLASH, RIGHT_SHIFT, UP_ARROW, PAGE_DOWN,
|
||||
TAB, Q,W,E,R,T,Y,U,I,O,P,LEFT_U_BRACE, RIGHT_U_BRACE, BACKSLASH, DELETE,
|
||||
CAP_LOCK, A,S,D,F,G,H,J,K,L,SEMI_COLON, QUOTE, ENTER, PAGE_UP,
|
||||
LEFT_SHIFT, Z,X,C,V,B,N,M,COMMA, PERIOD, SLASH, RIGHT_SHIFT, UP_ARROW, PAGE_DOWN,
|
||||
LEFT_CTRL, LEFT_GUI, LEFT_ALT, SPACE, RIGHT_ALT, RIGHT_GUI, FN, LEFT_ARROW, DOWN_ARROW, RIGHT_ARROW,
|
||||
LEFT_ARROW},
|
||||
|
||||
{ESC, F1, F2, F3, F4, F5, F6, F7, F8, F9, F10, F11, F12, PAUSE,
|
||||
GRAVE_ACCENT, NUM_1, NUM_2, NUM_3, NUM_4, NUM_5, NUM_6, NUM_7, NUM_8, NUM_9, NUM_0, MINUS, EQUAL, BACKSPACE, INSERT,
|
||||
TAB, Q, W, E, R, T, Y, U, I, O, P, LEFT_U_BRACE, RIGHT_U_BRACE, BACKSLASH, DELETE,
|
||||
CAP_LOCK, A, S, D, F, G, H, J, K, L, SEMI_COLON, QUOTE, ENTER, PAGE_UP,
|
||||
LEFT_SHIFT, Z, X, C, V, B, N, M, COMMA, PERIOD, SLASH, RIGHT_SHIFT, A, PAGE_DOWN,
|
||||
LEFT_CTRL, LEFT_GUI, LEFT_ALT, SPACE, RIGHT_ALT, RIGHT_GUI, FN, LEFT_ARROW, C, RIGHT_ARROW,
|
||||
TAB, Q,W,E,R,T,Y,U,I,O,P,LEFT_U_BRACE, RIGHT_U_BRACE, BACKSLASH, DELETE,
|
||||
CAP_LOCK, A,S,D,F,G,H,J,K,L,SEMI_COLON, QUOTE, ENTER, PAGE_UP,
|
||||
LEFT_SHIFT, Z,X,C,V,B,N,M,COMMA, PERIOD, SLASH, RIGHT_SHIFT, A,PAGE_DOWN,
|
||||
LEFT_CTRL, LEFT_GUI, LEFT_ALT, SPACE, RIGHT_ALT, RIGHT_GUI, FN, LEFT_ARROW, C,RIGHT_ARROW,
|
||||
LEFT_ARROW}
|
||||
};
|
||||
|
||||
|
BIN
5.Docs/2.Images/hw5.jpg
Normal file
BIN
5.Docs/2.Images/hw5.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 425 KiB |
BIN
5.Docs/2.Images/hw6.jpg
Normal file
BIN
5.Docs/2.Images/hw6.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 780 KiB |
BIN
5.Docs/2.Images/hw7.jpg
Normal file
BIN
5.Docs/2.Images/hw7.jpg
Normal file
Binary file not shown.
After Width: | Height: | Size: 101 KiB |
76
README.md
76
README.md
@ -28,6 +28,10 @@
|
||||
|
||||
### 1.0 更新说明:
|
||||
|
||||
**22.8.13更新:**
|
||||
|
||||
* 新打样的PCB已经收到,但是由于何同学这周发视频,为了避免带来不必要的压力,所以决定错峰下周六再把PCB工程更新(doge).
|
||||
|
||||
**22.7.31更新:**
|
||||
|
||||
* 添加键盘硬件所有设计原理图文件(电路还有些bug没修复,如视频里的飞线,会晚些等新版PCB打样收到验证没问题后更新)
|
||||
@ -125,6 +129,78 @@ Tools主要是提供一些三方的工具软件,比如**STM32 ST-LINK Utility*
|
||||
|
||||
## 3. 软件架构说明
|
||||
|
||||
**关于键盘固件的按键映射方式?**
|
||||
|
||||
为了充分发挥视频中提到的移位寄存器扫描方案的优势,固件代码中将PCB Layout走线和按键扫描顺序解耦,通过软件进行重映射。也就是说PCB中按键的连接可以是任意的,走完线之后可以在`hw_keyboard.h`文件中的`keyMap[KEYMAP_NUM][IO_NUMBER]`中指定映射方式。
|
||||
|
||||
> 这是一个二维数组,代表有**KEYMAP_NUM**层键位映射,每一层有`IO_NUMBER`个按键(也就是你的键盘按键数目);其中第0层是特殊的,负责映射PCB按键的随机布局到键盘标准按键布局,后续的1、2、3、4...层都是自定义的,负责映射标准按键布局到任意布局。
|
||||
|
||||
**举个例子:**
|
||||
|
||||
考虑原理图中箭头指的那个按键,这个按键可以在PCB的任意位置,但我们可以看到它是从左到右(按74HC165的连接顺序,也即移位扫描顺序)的第9颗,因此它的编号为9.
|
||||
|
||||

|
||||
|
||||
如果我们在实际的PCB板上把它放在了**右边Alt**的位置,那么参考在下图代码红色框中的第1层映射(也就是标准布局)中的**RIGHT_ALT**的序号是76,那么在第0层映射的76号变量就填入9(蓝色框).
|
||||
|
||||
这样依次把你PCB上所有按键都填入0层映射,就得到了一个映射好的标准键盘了。后续2、3、4、5...层需要怎么映射就随意修改添加即可,也不需要再使用数字编号,而是可以直接用枚举的按键名称很方便。
|
||||
|
||||
> 所以对于想修改键盘配列的人,只需要再原理图上添加或删减几个串联的74HC165,然后PCB随意走线,再将代码中0层映射删减或增加一些数字即可(比如在下面的例子中我的键盘是83键的);后面几层的修改就以此类推了。
|
||||
|
||||
代码中通过`keyboard.Remap(2)`函数来映射不同层,比如这一句是使用第2层映射。
|
||||
|
||||

|
||||
|
||||
**关于键盘固件的滤波方法?**
|
||||
|
||||
固件中使用了每个按键独立的滤波,但是是以一种非常高效的方式来实现的(毕竟1KHz的报文,每个报文期间至少扫描两次按键,意味着每秒钟需要进行 **1000\*2\*[按键数目]** 次数的滤波)。
|
||||
|
||||
基本原理很简单,就是按键抖动的原因是按下后会在高低电平之间反复横跳,这个稳定时间一般是几十us(注意是电平稳定时间,不是按键触发时间,后者是由于按键簧片接触时间的不确定性导致的,可能长达数ms)。
|
||||
|
||||
在QMK的[qmk_firmware/feature_debounce_type](https://github.com/qmk/qmk_firmware/blob/master/docs/feature_debounce_type.md)文档中描述了其使用的几种滤波方法,分为Eager和Defer、对称和非对称等,
|
||||
|
||||
默认是使用**对称延迟全局滤波**,也就是说是对所有按键进行同等的滤波,等所有的按键都稳定了不再,再提交扫描数据。
|
||||
|
||||
> 与之对应的是激进滤波方法,也就是说一旦检测到按键变化就提交数据,但是在这之后的N毫秒时间内不再响应任何按键(也就避免了把不断抖动的按键提交上去)。但是这种方法对噪声很敏感,容易误触发。
|
||||
|
||||
我在瀚文的固件中使用的是**对称延迟独立滤波**,也就是对每个按键进行两次检测,如果第一次检测到了按键变化,那么相隔N微秒(这个参数可以配置,大于按键典型抖动时间即可)再检测一次,如果两次检测结果一致,那么判断按键被按下,此时可以确保按键发生了变化,且不会重复触发按键。
|
||||
|
||||
这个过程是通过异或运算进行高效处理的,正好按键buffer由于是移位寄存器扫描得到的,本身就是每一位代表一个按键,所以滤波效率非常高,实测效果也挺好的。
|
||||
|
||||

|
||||
|
||||
**关于键盘固件的HID描述符?**
|
||||
|
||||
这个可以直接参考源码的`usbd_customhid.c`文件,我配置了两个ReportID,ID-0是上报键位扫描数据的(全键无冲),ID-1是预留用于后续跟上位机改键软件通信用的。
|
||||
|
||||
**关于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();
|
||||
}
|
||||
```
|
||||
|
||||
|
||||
|
||||
## 4. SDK设计 & 二次开发
|
||||
|
||||
待补充。
|
||||
|
Loading…
Reference in New Issue
Block a user