发作品签到
专业版

ESP32S3-蓝牙有线双模热插拔小键盘-全键无冲

工程标签

1.4k
0
0
2

简介

使用esp32s3的双模数字小键盘,带旋转编码器和可更换的屏幕; 引出未用io可以进行扩展,增加触摸按键、摇杆等模块; 修改了官方库和blekeyboard库的键盘例程以支持全键无冲功能。

简介:使用esp32s3的双模数字小键盘,带旋转编码器和可更换的屏幕; 引出未用io可以进行扩展,增加触摸按键、摇杆等模块; 修改了官方库和blekeyboard库的键盘例程以支持全键无冲功能。

开源协议

GPL 3.0

创建时间:2024-03-27 15:39:03更新时间:2024-11-19 11:16:00

描述

使用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以内都行,但要考虑到编码器柄不直的公差;

 

屏幕模块

屏幕模块1屏幕模块2屏幕模块3

  • 屏幕壳相当难装,自己用建议不装(反正软件功能也没实现)
  • 屏幕壳通过卡扣扣到定位板上,拔的时候可能需要将屏幕壳的下边向内推才能拔出;
  • 屏幕模块针脚可以用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了,假装这时按下了按键多少不合适;
      • 因为编码器输入引脚是上拉的,其它输入都是下拉,所以没做编码器旋钮唤醒深睡;

 

关于功耗

拿万用表测了下整个键盘电流,没接电池,仅供参考:

模式 电流

电源开关关闭

(电池芯片没接电池,但还是使能的,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也能用。

设计图

未生成预览图,请在编辑器重新保存一次

BOM

暂无BOM

附件

序号文件名称下载次数
1
esp32s3键盘外壳STL文件.zip
4
2
esp32s3键盘外壳SLDPRT文件(不确定能不能打开).zip
5
3
esp32s3_NKRO_keyboard.zip
10
4
esp32s3_kb_v1_N8R2.rar
2
克隆工程
添加到专辑
0
0
分享
侵权投诉

工程成员

评论

全部评论(1
按时间排序|按热度排序
粉丝0|获赞0
相关工程
暂无相关工程

底部导航