如果比赛截止了请跳转到开源平台查看最新版本,比赛结束的话会进行评分锁定工程。
届时这个排版就无法编辑了。
还有一个为了和外国朋友交流的英文版本
关于内容,下面的描述并不是这个键盘的全部,还有个姐妹工程《最丐17+4+触摸机械键盘PRO》,两者配合食用更佳。
巧合的是现在两个比赛是同时进行的,所以两个项目就各投到不同赛道。为了内容不重复,侧重点各有不同。
前言
很多读者不是电脑装机圈的可能理解不到这个丐中丐的含义,这个词用在电脑主板显卡上比较多。
代指丐版中的丐版,低配中的低配,缩水中的缩水,谐音曾经的央视广告。
而且我这里又不是销售宣传用最来做项目名是没问题的。
配置低带来的好处显而易见,就是成本低嘛,学生党最爱。
电子烧钱大家都是过来人,但是作为老师,希望你们从生活费腾预算时不要缩食甚至不吃饭。
可以找同学AA,或者用多出的pcb组装来挂闲鱼回血(投资有风险!!!),但是记得符合开源协议。
来个和QMK方案的常用单片机配置对照表
型号 | STM32F103C8T6 | GD32F103C8T6 | ATMEGA32U4-AU | CH551G |
---|---|---|---|---|
立创编号 | C8734 | C77994 | C44854 | C108958 |
单个价格(2022年6月24日) | ¥42.58 | ¥14.35 | ¥129.92 | ¥2.69 |
封装 | LQFP-48 | LQFP-48 | QFP-44 | SOP-16 |
I/O 数 | 37 | 37 | 26 | 12.5(RST脚仅能读,当半个) |
位数 | 32-Bit | 32-Bit | 8-Bit | 8-Bit |
内核 | ARM® Cortex®-M3 | ARM® Cortex®-M3 | AVR | C51 |
ROM | 64kB | 64kB | 32kB | 10kB |
RAM | 20kB | 20kB | 2.5kB | 0.75kB |
EEPROM | 无(但能用FLASH模拟) | 无(但能用FLASH模拟) | 1kB | 128B |
对比得出配置差的不大,主要还是没生态。
刚出键盘开源的时候有打算开源代码,但是感觉热度不够,怕有人拿去牟利还把原作者信息消去。
但是“芯荒”导致上面单片机的价格水涨船高,我的项目热度也上去了。
而且现在还有忠实拥趸的精神物质双重支持,
帮忙去和闲鱼卖家沟通补上开源标签,售卖获得收益后以固定金额打赏作者,这样支持下更新能不勤快?
一路走来谢谢大家支持~
1、项目功能介绍
基于我的旧项目《最丐61+3机械键盘》上升级。
满足我一开始想键盘带hub的需求,由于没地方放第三个USB座了,于是在空格下面放置了一个SD读卡器。
修改了配列,键盘背光改为RGB,接入了OpenRGB。并且为该项目添加了中文支持。
在CH551G贫穷的外设下,为了WS2812严格的时序要求作了大量优化。
通常状态
摁住FN
2、项目属性
项目为首次公开,而且这次会公开源码,方便大家修改配列。
帮助大家用2元的单片机代替现在待价而沽的32U4。
3、开源协议
注意GPL 3.0开源协议,商业用途需要作者授权,我做人是很均真的。
如果你从这个项目中挣钱了,请以每套2元进行打赏。我会匀出部分来打赏OpenRGB的作者。
以供他接入更多设备,实现RGB设备All in one的远大理想。
4、硬件部分
该项目后续会同步到英文版的开源平台,所以硬件原理会重新讲解。
已经吃透我以前的项目的读者可以跳过,按键扫描原理是一样的,只是排版和举例素材重新绘制。
这里我就不做各种方案的对比了,直接进入正题。
这是市场上机械键盘的电路(QMK的方案就是这种),典型的矩阵键盘加防键冲二极管。
这是我设计的新型矩阵键盘扫描电路
这时如果你用理想二极管来分析电路就会困惑,如果同时摁住S1,S3的画,当扫描到IO1位低时,
则Uio2=Uio3=0V?这样不就读取到S1,S2同时摁下???
但是,实际的二极管不是理想的。
这是安森美的1N4148的伏安特性图,注意横坐标是指数分布的。
可以看到即使最低电流0.1mA下都有500mV的正向导通压降。
结合上面的问题可以推断出Uio2=0.5V,Uio3=1V。
这时就可以查看单片机技术文档了
这是沁恒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
虽然发送慢了,但是最大刷新率还是非常可观,关键是不再会小概率闪灯。
//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实在太经典了)
因为内存是重叠的,所以可以相当于共用体来操作,相比于与和或逻辑操作节省了不少汇编指令,具体使用如下
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里面找到。
开源代码已经提交合并申请,等待作者的同意。我的代码就在其中。审核通过才有路径
而且为了大家更加容易使用,还与热心群员共同汉化了这个软件。
6、BOM清单
没什么特殊元件,LCSC都能一键配单,就是CH551G/CH552G需要订货。
两种都能用,但是CH551G据说是停产了,也许会下架,如果你搜索CH551G看到对应的DEMO板链接,那么我很荣幸,那个项目也是我做的。
还有需要注意的是这里给出的上下灯位两个版本。两个的USBHUB芯片是不同的,元件清单请从PCB中导出。
7、大赛LOGO验证
8、演示您的项目并录制成视频上传
TypeC采用45度出线,不容易干涉笔记本屏幕
其中一个侧面USB母座做了内凹设计,插入无线鼠标接收器时不会突出,而且位置距离鼠标近,信号更稳定
为了用尽每一丝资源,空格下还藏了一个SD读卡器
测试过能正常用,只是后面用不上就没焊接读卡ic
参考设计下载
- 最丐68键RGB键盘程序V10开源.hex
- 68键盘程序Ver1.00(开源版本).zip
- OpenRGB汉化.zip
- studio_video_1659892762090 [720p].mp4
- VID_20220607_210912~1.mp4
- BOM下载
- PCB_68+4+HUB+SD 下灯位_2022-09-23.pdf
- PCB_68+4+HUB+SD 下灯位_2022-09-23.json
- 68+4+HUB+SD 下灯位_2022-09-23.pcbdoc
- Gerber_68+4+HUB+SD 下灯位.zip
- PCB_68+4定位板_2022-09-23.pdf
- PCB_68+4定位板_2022-09-23.json
- 68+4定位板_2022-09-23.pcbdoc
- Gerber_68+4定位板_2022-09-23.zip
- PCB_68+4底板(下灯位走线图案)_2022-09-23.pdf
- PCB_68+4底板(下灯位走线图案)_2022-09-23.json
- 68+4底板(下灯位走线图案)_2022-09-23.pcbdoc
- Gerber_68+4底板(下灯位走线图案)_2022-09-23.zip
- PCB_68+4+HUB+SD上灯位_2022-09-23.pdf
- PCB_68+4+HUB+SD上灯位_2022-09-23.json
- 68+4+HUB+SD上灯位_2022-09-23.pcbdoc
- Gerber_68+4+HUB+SD上灯位.zip
- Schematic_#第七届立创电赛#最丐68+4机械键盘PRO_2022-09-23.pdf
- SCH_#第七届立创电赛#最丐68+4机械键盘PRO_2022-09-23.json
- #第七届立创电赛#最丐68+4机械键盘PRO_2022-09-23.zip
相关器件
器件 | 类型 | 描述 | 数据手册 |
---|---|---|---|
TSA356G00-250 | 轻触开关 | 电路结构:SPST 触点额定电流:50mA @ 12VDC 按钮头类型:Plunger for Cap 按钮作用方向:Top Actuated | 点击下载 |
XGD10603MR | ESD二极管 | 点击下载 | |
RMC06035.1K1%N | 贴片电阻 | 点击下载 | |
SCR0603F100K | 贴片电阻 | 点击下载 | |
WR06X000 PTL | 贴片电阻 | 点击下载 | |
TD03H1001DT | 贴片电阻 | 点击下载 | |
GL823K-HCY04 | USB芯片 | 点击下载 | |
H7333-A | 低压差线性稳压(LDO) | 输出类型:固定 最大输入电压:15V 输出电流:250mA 输出电压(最小值/固定值):3.3V - | 点击下载 |
CH552G | WCH(南京沁恒) | 工作电压:- CPU位数:8-Bit CPU内核:E8051 主频(MAX):32MHz ROM类型:FLASH | 点击下载 |
U262-161N-4BVC11 | USB连接器 | 公母:母座 连接器类型:USB - Type C 触点数量:16 标准:- | 点击下载 |
KH-USB-AM-4P-CB | USB连接器 | 点击下载 | |
TF-01A | 卡座连接器 | 连接器类型:连接器和弹出器 卡类型:microSD™ Memory Card 触点数量:8 插卡式 TF卡座 | 点击下载 |
MMBD4148CC | 开关二极管 | 点击下载 |
群聊设计,与管理员及时沟通
欢迎加入EEWorld参考设计群,也许能碰到搞同一个设计的小伙伴,群聊设计经验和难点。 入群方式:微信搜索“helloeeworld1”或者扫描二维码,备注:参考设计,即可被拉入群。 另外,如您在下载此设计遇到问题,也可以微信添加“helloeeword1”及时沟通。
网友评论
相关项目
电路图
更多>
下载中心
更多>
论坛推荐
更多>