ESP32S3-蓝牙有线双模热插拔小键盘-全键无冲
简介
使用esp32s3的双模数字小键盘,带旋转编码器和可更换的屏幕; 引出未用io可以进行扩展,增加触摸按键、摇杆等模块; 修改了官方库和blekeyboard库的键盘例程以支持全键无冲功能。
简介:使用esp32s3的双模数字小键盘,带旋转编码器和可更换的屏幕; 引出未用io可以进行扩展,增加触摸按键、摇杆等模块; 修改了官方库和blekeyboard库的键盘例程以支持全键无冲功能。开源协议
:GPL 3.0
描述
使用esp32s3-wroom-1模块,实现蓝牙有线双模键盘功能,全键无冲但最多支持6键同时按下(键盘库限制,臣妾不会改啊)研究了下整出来了,官方库封装的很好,改下报告描述符就行;
支持媒体键,可在源码中更改键位;
部分模块化设计,可选择屏幕或两个额外按键,引出未使用引脚,可扩展其它功能;
可用电池供电,插电自动切换,但没做低功耗,不建议长时间保持蓝牙连接加了深睡模式,但回连较慢,这个真没办法了。
碎碎念:参考了各位大佬的设计,本来是打算用合宙的c3模块+ch422+ch9329做的,板子打好算了下成本,合宙涨价+写代码麻烦,果断自己尝试画开发板用s3模块重做了。合宙你变了啊
更新:
24.11.15更新:
- 发现上次更新的文件有bug,我直接修改了官方库里的文件,这部分没在项目文件里;
- 问题出在usbmsc功能,官方提供的USBMSC类的构造函数会在usb里添加msc接口,所以我删掉了无参构造函数里的内容,加了一个带参构造函数,防止声明类对象时就添加msc接口,这样在用usb键盘时不会产生一个无法打开的磁盘;
- 解决方案1:用最新项目文件;
- 解决方案2:按我上面说的,自己修改一下对应文件;
- 解决方案3:不在乎用usb模式时会有杂物,那直接删掉报错的USBMSC(use_msc)中的use_msc参数即可;
- 删掉了旧项目文件,只保留esp32s3_NKRO_keyboard.zip;
- 最新项目文件为esp32s3_kb_v1_N8R2.rar。
24.11.11更新:
- 添加usb msc模式,开启后将fat分区模拟为u盘,用于读取外部配置等;
- 添加fn切换功能,可将原始层和fn层按键切换;
- 添加屏幕功能,使用lvgl:
- 显示当前连接(蓝牙、usb)状态,显示默认层是fn层还是原始层;
- 显示内置图片,并旋转;
- 可切换显示使用msc模式放置在fat分区的外部图片;
- 外部图片放在msc模式下磁盘的.lvgl_data文件夹,需重命名为1.png
- 添加读取外部配置的功能:
- 使用json格式保存外部配置,可配置键位、键盘名、休眠时间等;
- 附带键位设置工具excel表格,需要用最新excel打开;(要支持VSTACK等公式,不确定具体是哪个版本更新的)
- 表格在最新文件的键盘工具/tools文件夹里;
- 外部配置放在msc模式下磁盘的.configs文件夹,重命名为userConfig.json;
- 要手动写配置,可参考同目录下的defaultconfig文件;
- 修改了部分键盘和编码器扫描相关函数;
- 最新文件为esp32s3_kb_v1_N8R2.rar
- 如果是N16R8模块,需要将platformio.ini文件替换为N16R8版本,已放在项目目录下,重命名替换即可。
功能:
已实现功能:
- 有线、蓝牙双模(只在windows11上测试过);
- esp32s3的usb还有串口下载功能,boot按钮处装电容可能导致boot引脚上电晚,如果发现左上角灯没有闪一下说明可能进了下载模式,断电重启即可;
- 有线切换蓝牙后不会自动重连,因此每次切换模式都用自动重启的方式(但注意这种软重启会导致蓝牙切换到usb模式后功耗增加);
- 键盘按键支持真·全键无冲,同时支持媒体按键(蓝牙模式只支持部分)、一次最多6个按下的组合按键、2层fn层;
- 通过修改源码来编辑按键键值;
- 按键最多19+1+2个,分别为19个键盘矩阵中的机械轴,1个键盘矩阵中的旋转编码器开关,2个独立的引脚控制的机械轴,和屏幕二选一;
- ws2812幻彩rgb,每个机械轴位置1个,共21个,只做了灯光亮灭处理,驱动库中有预设多种灯光模式,可通过源码更改;
- 仅仅是能亮起来的屏幕,和2个额外按键共用引脚,按下切换快捷键后断电重启切换;
- 屎山代码,并且越来越烂;
做了但出错后重做没验证的功能:
- 通过引脚的pwm控制rgb亮度,之前忘了加电容,虽然加上电容也不一定可以;
- ws2812可以自己控制亮度,可能是将rgb值按比例缩放实现的,我想尝试用pwm控制,不行就只能作为普通开关使用了;
可扩展咕咕咕了的模块:
- 4个触摸引脚+2个adc引脚,引脚本身功能基本相同,但adc引脚在模组附近有预留电容,其中1个触摸引脚如果用作adc,在使用无线功能时可能会受影响;
- adc引脚旁还有一个普通GPIO,可以组合作为带开关摇杆的引脚;
- 5个额外的键盘矩阵按键,键盘矩阵的第5列;
- 1对串口和1对i2c引脚,用来和其它芯片连接,i2c引脚也有触摸和adc功能;
- 3个启动相关引脚,引出备用,启动后可以用作GPIO。
安装注意事项:
驱动板:使用sy8088 dc电源芯片供电,tp4056x为电池充电,40pin 0.5mm间距上接fpc母座引出引脚;
- boot按键下方的电容可以不装,装了之后可能导致需要启动两次才能进正常程序,因为电容充电之前boot相当于低电平,会进下载模式,实测100nf太大了;
- c口下面的5.1kΩ电阻是供电协议相关的,我们只需要5v供电,实际上不需要装;(我之前在写什么?)5.1kΩ电阻是为了ctoc充电时可以被识别,不建议省略;
- 防静电二极管太小了,嫌不好装可以不装;
- mos管以及其它类似上下拉电阻、led分压电阻的阻值可以根据需要选择,能实现功能即可;
- 左上的5v引脚只作输入用,后面有接二极管(左边是地);
- 0Ω电阻的部分可以改电路板换成导线,少接几个电阻;
- esp32s3模组选择注意事项:
- 推荐选择psram为2mb以下的模块,8mb及以上的模块,33-37号io无法使用,其中的33-34引脚所有模块都没引出;
- 对于没psram的模块,上电时拉高io45会使flash电压为1.8v,建议选有psram的模块消除后顾之忧;
- 串口上建议串联的499Ω电阻,模块内已经串联了,不需要我们额外装;
- sy8088 dc电源芯片
- 电源电压根据两个反馈电阻决定,小的那个建议100kΩ以上,大的那个为4.5倍,在大的两端可以接一个小电容增强动态响应;
- 芯片使能引脚要接5v输入保持高电平才会供电,键盘通过这个引脚控制开关,但如果不接键盘矩阵板,要启动芯片需要短接图中引脚,因为电容的存在,停止芯片需要将en脚接地,在附近找个地短接一下即可;
- tp4056的充电电流根据图中所示电阻决定,没记错的话电流大小是1000/电阻;
键盘矩阵:灯珠是6028封装的ws2812b灯珠,编码器ec11,pcb通过3个8mm双通螺柱和驱动板连接
- 矩阵输入引脚的电容不需要,不管怎么都要在软件中处理消抖的,物理消抖没必要,真想加就加小点的;
- 按键附近的10k电阻是输入上拉电阻,1k电阻是输出下拉电阻,预想中是在睡眠模式触发中断的,不用在睡眠之前额外设置引脚输出了(当然实际上没写睡眠模式代码);
- rgb的分压电阻,可以直接短接,ws2812亮度可以通过软件控制;
- 两个额外按键的轴座用这种带爪簧的铜鸡眼,建议选封闭的,说实话有点贵,不然轴座全换这种可以省不少空间,关键词:套筒热插拔;
- 编码器的5个信号脚也可以用这种连接件,方便拆,缺点是会小晃;
定位板和电池
- 图中排线是5mm,需要折一下;
- 电池如图摆放时宽度最多50mm左右,横着放下面可以更宽,但最大长度更小;
- 键盘矩阵和定位板通过3.5mm螺柱连接,市面上能找到m2的双通螺柱,安装孔位在四角和斜边上两个,螺丝最长3+4mm;
- 还有一种m1.6的焊接铜柱也有3.5的长度,焊接孔位在四边中点和斜边两个;
其余部分
- 壳子的孔都是1.9mm直径,本来想安2.5mm的滚花螺母,但尝试了下壳子跳过融化直接碳化了,就直接用m2螺丝吧,盖和底之间有卡扣,不在意松的话可以不用螺丝,盖和底之间螺丝建议长6-8;
- 底壳有镂空和没镂空的版本,用三维猴x树脂能省2块;
- 电池用蓝丁胶粘上,方便拆;
- 上下边中间是1mm直径1mm高的孔,可以装磁铁,但难装还没啥用;
- 定位板是对gasket结构的拙劣模仿,理论上可以用胶垫固定4个耳朵,但c口开孔位置固定,需要计算好,用螺丝也是m2,长4mm即可;
- 开关帽是a28高度,基本和盖顶平齐;
- 编码器基本是相对按键居中的,按键间距是19.05,因此编码器帽直径19mm以内都行,但要考虑到编码器柄不直的公差;
屏幕模块
- 屏幕壳相当难装,自己用建议不装(反正软件功能也没实现);
- 屏幕壳通过卡扣扣到定位板上,拔的时候可能需要将屏幕壳的下边向内推才能拔出;
- 屏幕模块针脚可以用2.54mm长排针或者短排针结合排母;
- 排针长度需要用剪钳调整;
- 用排母+排针时,先把两个4p排母插在轴座上,再把屏幕的排针插进去,比长排针容易对准,但需要剪掉一部分卡扣,如上图白色的壳;
一些问题
- 键盘上的小元件我是用加热板贴片的,当然轴座和rgb因为不确定是否耐热,是手焊的,我用的加热板文件也会发布出来,但之前某配可以打超过10cm铜厚1oz的铝基板,上次看只有0.5oz了,想白嫖可能要自己再画;
- 定位板也是某配嫖的,但超过10cm只能选4层板,而且开槽不太精确,可能需要多打两次;
- 安装后发现了一些问题,我稍微修改了pcb,最新的和我图中的不完全一样,但都是小改,应该不影响实际效果,最大的问题是定位板开槽,原先右下角部分的开槽短了,装排母需要手动磨短,现已修改;
- 蓝牙键盘库和usb键盘库有定义冲突,因此我修改了库里的部分代码,要是自己安装库,冲突是正常的,手动改下,我提供的代码是platformio的,整个文件夹有点大,所以只截取了部分,可能需要先新建项目,导入我的ini文件后再把我的代码覆盖进去;
- 我修改了两个键盘库的hid报告描述符用来支持全键无冲,用17字节存了136个不同按键,理论上能同时按下,但我懒得改官方库定义的按键和ascii映射算法了,现在正常使用只支持128个按键同时按下;
- 因为全键无冲的实现必定与标准键盘(boot键盘)不同,所以不确定有些很旧的设备在boot模式下是否支持;
- 按键配置方式都在源码里,这里不说了。
- 因为没有设计正常键盘那样电池的物理开关,所以就算有线用,关掉电脑后键盘也会用电池供电,现在设定了蓝牙模式下无操作20min进深睡,usb模式是3倍的时间;
- 进深睡时,usb会与电脑断开(就是会叮咚一下),而且唤醒后没法及时发送消息,延迟至少有500ms,就不折腾唤醒瞬间响应了
- 其实做了读取唤醒那瞬间按键的功能,奈何从深睡到启动至少要差不多300ms,再到usb连接电脑要接近1s了,假装这时按下了按键多少不合适;
- 因为编码器输入引脚是上拉的,其它输入都是下拉,所以没做编码器旋钮唤醒深睡;
- 进深睡时,usb会与电脑断开(就是会叮咚一下),而且唤醒后没法及时发送消息,延迟至少有500ms,就不折腾唤醒瞬间响应了
关于功耗
拿万用表测了下整个键盘电流,没接电池,仅供参考:
模式 | 电流 |
电源开关关闭 (电池芯片没接电池,但还是使能的,dc芯片没使能) |
0.3ma |
深睡模式 |
1.3ma |
芯片时钟频率40Mhz(gb显示不正常) |
30ma |
芯片时钟频率80Mhz |
40ma |
芯片时钟频率120Mhz |
60ma |
芯片时钟频率240Mhz |
64ma |
240Mhz+蓝牙 |
120+ma |
粉色灯,亮度20 |
20ma |
粉色灯,亮度255(max) |
130ma |
异常模式:从蓝牙切换到USB后 (只通过软件重启,不用开关复位) |
80+ma |
建议时钟频率就用240Mhz,灯别开太亮用,每次切换模式时手动重启下,软件重启的可能有些外设没复位;
## 最新的代码是esp32s3_NKRO_keyboard和esp32s3_NKRO_keyboard_with_lib这两个文件,前者是运行了platformio的deep clean的,没有安装库,打开后会自动下载库,后者是包括了库的。
以后代码的小变动我就不传到附件了,可以去gayhub看
https://github.com/gdnre/ESP32_NKRO_KeyBoard
施工完毕,
如果有人想要BOM表,可以评论留言,没人需要我就懒得整理了,稍微检查下自动生成的BOM也能用。
评论