#第七届立创电赛#最丐68+4机械键盘PRO - 嘉立创EDA开源硬件平台

编辑器版本 ×
标准版 Standard

1、简单易用,可快速上手

2、流畅支持300个器件或1000个焊盘以下的设计规模

3、支持简单的电路仿真

4、面向学生、老师、创客

专业版 professional

1、全新的交互和界面

2、流畅支持超过3w器件或10w焊盘的设计规模,支持面板和外壳设计

3、更严谨的设计约束,更规范的流程

4、面向企业、更专业的用户

标准版 #第七届立创电赛#最丐68+4机械键盘PRO

简介:基于我的旧项目《最丐61+3机械键盘》上升级。 修改了配列,加上一开始就打算添加的HUB,键盘背光改为RGB,接入了OpenRGB

开源协议: GPL 3.0

(未经作者授权,禁止转载)

创建时间: 2022-06-09 11:21:37
更新时间: 2023-11-03 14:31:58
描述
如果比赛截止了请跳转到开源平台查看最新版本,比赛结束的话会进行评分锁定工程。

届时这个排版就无法编辑了。


还有一个为了和外国朋友交流的英文版本


关于内容,下面的描述并不是这个键盘的全部,还有个姐妹工程《最丐17+4+触摸机械键盘PRO》,两者配合食用更佳。

巧合的是现在两个比赛是同时进行的,所以两个项目就各投到不同赛道。为了内容不重复,侧重点各有不同。

前言


很多读者不是电脑装机圈的可能理解不到这个丐中丐的含义,这个词用在电脑主板显卡上比较多。

代指丐版中的丐版,低配中的低配,缩水中的缩水,谐音曾经的央视广告。

而且我这里又不是销售宣传用最来做项目名是没问题的。

配置低带来的好处显而易见,就是成本低嘛,学生党最爱。

电子烧钱大家都是过来人,但是作为老师,希望你们从生活费腾预算时不要缩食甚至不吃饭。

可以找同学AA,或者用多出的pcb组装来挂闲鱼回血(投资有风险!!!),但是记得符合开源协议。

来个和QMK方案的常用单片机配置对照表
型号STM32F103C8T6GD32F103C8T6ATMEGA32U4-AUCH551G
立创编号C8734C77994C44854C108958
单个价格(2022年6月24日)¥42.58¥14.35¥129.92¥2.69
封装LQFP-48LQFP-48QFP-44SOP-16
I/O 数37372612.5(RST脚仅能读,当半个)
位数32-Bit32-Bit8-Bit8-Bit
内核ARM® Cortex®-M3ARM® Cortex®-M3AVRC51
ROM64kB64kB32kB10kB
RAM20kB20kB2.5kB0.75kB
EEPROM无(但能用FLASH模拟)无(但能用FLASH模拟)1kB128B
对比得出配置差的不大,主要还是没生态。

刚出键盘开源的时候有打算开源代码,但是感觉热度不够,怕有人拿去牟利还把原作者信息消去。

但是“芯荒”导致上面单片机的价格水涨船高,我的项目热度也上去了。

而且现在还有忠实拥趸的精神物质双重支持,

帮忙去和闲鱼卖家沟通补上开源标签,售卖获得收益后以固定金额打赏作者,这样支持下更新能不勤快?

一路走来谢谢大家支持~

1、项目功能介绍


基于我的旧项目《最丐61+3机械键盘》上升级。

满足我一开始想键盘带hub的需求,由于没地方放第三个USB座了,于是在空格下面放置了一个SD读卡器。

修改了配列,键盘背光改为RGB,接入了OpenRGB。并且为该项目添加了中文支持。

在CH551G贫穷的外设下,为了WS2812严格的时序要求作了大量优化。

通常状态

keyboard-layout.png

摁住FN

keyboard-layout (FN).png

2、项目属性


项目为首次公开,而且这次会公开源码,方便大家修改配列。

帮助大家用2元的单片机代替现在待价而沽的32U4。

3、开源协议


注意GPL 3.0开源协议,商业用途需要作者授权,我做人是很均真的。

如果你从这个项目中挣钱了,请以每套2元进行打赏。我会匀出部分来打赏OpenRGB的作者。

以供他接入更多设备,实现RGB设备All in one的远大理想。

4、硬件部分


该项目后续会同步到英文版的开源平台,所以硬件原理会重新讲解。

已经吃透我以前的项目的读者可以跳过,按键扫描原理是一样的,只是排版和举例素材重新绘制。

这里我就不做各种方案的对比了,直接进入正题。

这是市场上机械键盘的电路(QMK的方案就是这种),典型的矩阵键盘加防键冲二极管。

image.png

这是我设计的新型矩阵键盘扫描电路

image.png

这时如果你用理想二极管来分析电路就会困惑,如果同时摁住S1,S3的画,当扫描到IO1位低时,

则Uio2=Uio3=0V?这样不就读取到S1,S2同时摁下???

但是,实际的二极管不是理想的。

image.png

这是安森美的1N4148的伏安特性图,注意横坐标是指数分布的。

可以看到即使最低电流0.1mA下都有500mV的正向导通压降。

结合上面的问题可以推断出Uio2=0.5V,Uio3=1V。

这时就可以查看单片机技术文档了

image.png

image.png

image.png

image.png

这是沁恒CH552G的技术文档。选择哪个供电电压一目了然。

然后经过实机测试,需要加入上拉电阻使二极管加大导通电流,增加压降以获取更稳定的扫描检测效果。

5、软件部分


代码为首次开源,这里会举例一部分比较特殊的代码。

WS2812发送时序


众所周知,WS2812的时序要求非常苛刻,单总线带宽1Mbps,如果遇到没有DMA的单片机还有其他中断的情况下着实要费点脑子。

但是我这里克服了这个问题,通过把WS2812的数据发送放置到INT0中断里面,

这样的话避免了优先度更低的USB中断打断2812时序导致错误地识别成了RET码或者0码变成1码,错位导致键盘闪烁。

而且T0中断又可以打断USB中断,进行更高一级的中断,保证数据发送稳定可靠。

T0是配置成50us中断8位自动重新加载,而看下图可知灯和灯之间的时差只要不到50us就不会触发RES码。

利用这个特性,可以实现发送2812同时,中断占用率保持在50左右(算上现场保护可能更多60,70吧)。

这样就不会完全阻塞1.6ms。计算过程:1us * 24 * 68=1632us

但是发送时间则为:50us * 68=3.4ms

虽然发送慢了,但是最大刷新率还是非常可观,关键是不再会小概率闪灯。

image.png
//nop经过调教,优化等级为7,勿动
void ws2812_maintain()//T0中断中调用,若没有发送队列则退出
{
const uchar idata decode[4]={0x88,0x8e,0xe8,0xee};
uchar idata p[4];
uchar dat;
uchar temp;
uchar i=0;
if(LED_num>=LED_LEN)
return;
//提前从XDATA取出数据
dat=dot_temp[LED_num][0];
p[1]=dot_temp[LED_num][1];
p[2]=dot_temp[LED_num][2];

SPI0_DATA=0;
SPI0_CTRL=bS0_MOSI_OE;//只使能MOSI
_nop_();_nop_();_nop_();

do{
temp=decode[(dat>>6)&0x03];
_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SPI0_DATA=temp;

temp=decode[(dat>>4)&0x03];
_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SPI0_DATA=temp;

temp=decode[(dat>>2)&0x03];
i++;
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SPI0_DATA=temp;

temp=decode[dat&0x03];
dat=p[i];
_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SPI0_DATA=temp;

if(i==3)
break;
}while(1);
LED_num++;
_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
_nop_();_nop_();_nop_();_nop_();
SPI0_CTRL=0;//关闭MOSI
}

C51位寻址

大家定义io时都是sbit 然后P1.0为什么名字,大家有没有想过为什么P1.0=0和P1&=0xFE能实现一样功能?
如果是平时教学就会说C51比起STM32还有位类型的变量,在性能较差的情况下更容易实现简单操作。就这样一笔带过了。
大家看过HAL库的底层操作io就会发现STM32都是ODR寄存器进行与和或操作。
在C51中有个比较少见的功能,就是位寻址,参考STC89C51的文档:(手推车的51实在太经典了)
image.png

因为内存是重叠的,所以可以相当于共用体来操作,相比于与和或逻辑操作节省了不少汇编指令,具体使用如下


sbit K1=P3^2;
sbit K2=P1^4;
sbit K3=P1^6;
sbit K4=P1^7;
sbit K5=P3^1;
sbit K6=P3^0;
sbit K7=P1^1;
sbit K8=P3^3;
sbit K9=P3^4;

uchar bdata TEMP_Byte;//定义位寻址内存

sbit Bit0=TEMP_Byte^0;
sbit Bit1=TEMP_Byte^1;
sbit Bit2=TEMP_Byte^2;
sbit Bit3=TEMP_Byte^3;
sbit Bit4=TEMP_Byte^4;
sbit Bit5=TEMP_Byte^5;
sbit Bit6=TEMP_Byte^6;
sbit Bit7=TEMP_Byte^7;

uchar idata key_temp[9]={0};//按键映射,作消抖使用

void key_delay()//等待电平稳定再读取

{

nop();

nop();

}


void keybord_scanning()
{
K1=0;//S1~
key_delay();
Bit0=K2; Bit1=K3; Bit2=K4; Bit3=K5;
Bit4=K6; Bit5=K7; Bit6=K8; Bit7=K9;
key_temp[0]=~TEMP_Byte;//电平逻辑取反
K1=1;
key_delay();

K2=0;//S9~
key_delay();
Bit0=K1; Bit1=K3; Bit2=K4; Bit3=K5;
Bit4=K6; Bit5=K7; Bit6=K8; Bit7=K9;
key_temp[1]=~TEMP_Byte;
K2=1;
key_delay();

K3=0;//S17~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K4; Bit3=K5;
Bit4=K6; Bit5=K7; Bit6=K8; Bit7=K9;
key_temp[2]=~TEMP_Byte;
K3=1;
key_delay();

K4=0;//S25~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K3; Bit3=K5;
Bit4=K6; Bit5=K7; Bit6=K8; Bit7=K9;
key_temp[3]=~TEMP_Byte;
K4=1;
key_delay();

K5=0;//S33~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K3; Bit3=K4;
Bit4=K6; Bit5=K7; Bit6=K8; Bit7=K9;
key_temp[4]=~TEMP_Byte;
K5=1;
key_delay();

K6=0;//S41~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K3; Bit3=K4;
Bit4=K5; Bit5=K7; Bit6=K8; Bit7=K9;
key_temp[5]=~TEMP_Byte;
K6=1;
key_delay();

K7=0;//S49~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K3; Bit3=K4;
Bit4=K5; Bit5=K6; Bit6=K8; Bit7=K9;
key_temp[6]=~TEMP_Byte;
K7=1;
key_delay();

K8=0;//S57~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K3; Bit3=K4;
Bit4=K5; Bit5=K6; Bit6=K7; Bit7=K9;
key_temp[7]=~TEMP_Byte;
K8=1;
key_delay();

K9=0;//S65~
key_delay();
Bit0=K1; Bit1=K2; Bit2=K3; Bit3=K4;
Bit4=K5; Bit5=K6; Bit6=K7; Bit7=K8;
key_temp[8]=~TEMP_Byte;
K9=1;
}



上位机部分的代码可以在OpenRGB里跳转到GitLab,然后GaiZhongGaiKeyboard里面找到。

开源代码已经提交合并申请,等待作者的同意。我的代码就在其中。审核通过才有路径

而且为了大家更加容易使用,还与热心群员共同汉化了这个软件。

image.png

6、BOM清单


没什么特殊元件,LCSC都能一键配单,就是CH551G/CH552G需要订货。

两种都能用,但是CH551G据说是停产了,也许会下架,如果你搜索CH551G看到对应的DEMO板链接,那么我很荣幸,那个项目也是我做的。

还有需要注意的是这里给出的上下灯位两个版本。两个的USBHUB芯片是不同的,元件清单请从PCB中导出。

7、大赛LOGO验证


IMG_20220629_074839.jpg

IMG_20220711_075954.jpg

8、演示您的项目并录制成视频上传

TypeC采用45度出线,不容易干涉笔记本屏幕

IMG_20220630_221237.jpg

其中一个侧面USB母座做了内凹设计,插入无线鼠标接收器时不会突出,而且位置距离鼠标近,信号更稳定

IMG_20220701_201334.jpg

为了用尽每一丝资源,空格下还藏了一个SD读卡器

测试过能正常用,只是后面用不上就没焊接读卡ic

IMG_20220710_171406.jpg



设计图
原理图
1 /
PCB
1 /
未生成预览图,请在编辑器重新保存一次
ID Name Designator Footprint Quantity
1 TSA356G00-250 BOOT,S46,S47,S48,S49 SW-SMD_TSA356G00-250 5
2 104 C1,C2,C3,C5,C8,C9,C10,C13,C24 C0603 9
3 106 C4,C6,C7,C11,C12,C14,C15,C16,C17,C18,C19,C20,C21,C22,C23 C0603 15
4 HS8836A IC1 HS8836A 1
5 5.1K R1,R2 R0603 2
6 75R R3 R0603 1
7 100K R4 R0603 1
8 0R R5,R6 R0603 2
9 1K RN1,RN2,RN3 RES-ARRAY-SMD_0603-8P-L3.2-W1.6-BL 3
10 GL823K-HCY04 U1 SSOP-16_L4.9-W3.9-P0.64-LS6.0-BL 1
11 HT7333-A U2 SOT-89-3_L4.5-W2.5-P1.50-LS4.2-BR 1
12 CH551G U3 SOP-16_L10.0-W3.9-P1.27-LS6.0-BL 1
13 U262-16XN-4BVC11 USB1 USB-C-SMD_TYPE-C16PIN 1
14 USB-A USB2,USB3 USB-A-TH_USB-302-T 2
15 TF-01A XKTF-N02-G TF-SMD_TF-01A 1
16 4148 D1,D2,D3,D4,D5,D6,D7,D8,D9,D10,D11,D12,D13,D14,D15,D16,D17,D18,D19,D20,D21,D22,D23,D24,D25,D26,D27,D28,D29,D30,D31,D32,D33,D34,D35,D36,D37,D38,D39,D40,D41,D42,D43,D44,D45,D46,D47,D48,D49,D50,D51,D52,D53,D54,D55,D56,D57,D58,D59,D60,D61,D62,D63,D64,D65,D66,D67,D68,D69,D70,D71,D72 LL-34_L3.5-W1.5-RD 72
17 高特插拔轴(3535旋转版) S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16,S17,S18,S19,S20,S21,S22,S23,S24,S25,S26,S27,S28,S29,S30,S31,S32,S33,S34,S35,S36,S37,S38,S39,S40,S41,S42,S43,S44,S45,S50,S51,S52,S53,S54,S55,S56,S57,S58,S59,S60,S61,S62,S63,S64,S65,S66,S67,S68,S69,S70,S71,S72 高特插拔轴(3535RGB旋转版) 68

展开

侵权投诉
相关工程
换一批
加载中...
添加到专辑 ×

加载中...

温馨提示 ×

是否需要添加此工程到专辑?

温馨提示
动态内容涉嫌违规
内容:
  • 153 6159 2675

服务时间

周一至周五 9:00~18:00
  • 技术支持

support
  • 开源平台公众号

MP