
#第九届立创电赛#USB小键盘
简介
一个使用屏幕提示按键排列的迷你USB键盘
简介:一个使用屏幕提示按键排列的迷你USB键盘开源协议
:MIT License
描述
注:* 为必填项
请在报名阶段填写 ↓
* 1、项目功能介绍
生活中不时需要用到外接键盘,但常规外接键盘往往体积较大,携带也不方便。于是我萌生了自己做一个小键盘的想法,通过软件定义按键功能,使用屏幕显示当前键盘的按键配列,从而实现体积小、按键全、易用、触感好的需求。
手上刚好有esp32s2开发板支持硬件USB,搞起!
*2、项目属性
原创,首次公开
* 3、开源协议
MIT
请在竞赛阶段填写 ↓
*4、硬件部分
一、主体电路
- 由于开发板的USB仅能用于烧录和供电,不能用于USB hid通讯,因此需引出USB d+ d-到pcb外侧;
- 为方便调试及后续扩展,使用多排排针引出开发板全部io,并为串口、spi、I2C引出专门的排针组;除满足键盘基本功能外,也方便直接使用开发板的资源做其他工作。
- 由于制作小键盘按键数量少,为实现全部按键的功能,需要使用软件实现按键功能切换(即换层);传统键盘换层依靠人本身的记忆,有学习和使用门槛;本设计使用屏幕来提示当前按键布局。
- esp32s2虽然io资源非常多,但是为了实验键盘矩阵(使用二极管防鬼影、掩蔽),使用2*5矩阵设计电路;为充分利用手头余料,二极管设计了两种焊盘尺寸,择一焊接即可。

二、定位板。
定位板是机械键盘的重要组成部分,定位板可以对按键支撑固定,让按键更加稳定。
直接沿轴体安装区域绘制外形框并阵列,添加板框,以pcb外形层的方式完成定位板的绘制。
(实物为早期版本,原定通过螺丝进行定位,实际发现并没有安装螺丝的必要)
三、外壳绘制。
1. 由于按键区域需要裸露在外,开发板和屏幕所在区域需要使用外壳保护,使用立创eda绘制这样的外壳存在一定难度。
本案使用上下盖的方式绘制方盒,对按键区域进行整体挖槽,按键和开发板之间添加实体(需准确计算实体和上下盖的高度)实现外壳基本结构
2. 为了让按键得到足够的支撑力,下压的确定感更清晰,相邻按键之间全部添加螺柱(但是实际不拧螺丝)作为结构上的支撑柱
组装后实物(使用了无刻键帽垃圾包搭配的渐变色)
3. OLED区域上盖开窗,并绘制盖板(使用透明材质加工或者打印),也可以使用正面面板取代。
*5、软件部分
由于esp32有乐鑫官方支持arduino环境,本项目使用arduino ide开发。烧录也非常简单,通过主板上引出的串口连接到电脑,或者通过开发板上的USB连接电脑USB即可,然后通过上电前按下boot按键(pin 0)进入烧录模式即可串口烧录。
代码主要分以下几个部分:
1. 矩阵按键扫描。针对矩阵按键进行了编程实验,最终选择了调用更为简洁的Adafruit_Keypad库。
2. USB键盘设备功能实现。乐鑫官方库已经提供了USBHIDKeyboard类,根据范例初始化USB功能、发送按键事件即可。需要注意的是此库调用的参数并非hid协议定义的keycode,再叠加方便自定义的因素,需要重新对键盘事件函数进行重新包装,才能方便直观地把配置转换为实际调用的参数。
3. 按键功能定义、换层功能。通过实际测试,最终决定使用二维数组存储按键定义,按下右下方按键进入换层模式,如此时按下其他按键则切换到对应层,如未按下其他按键触发右下方按键自生功能,如按下当前层对应的按键则无事发生。
按键二维数组:
short keySets[layerNum][10] = {
{ '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' },
{ 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' },
{ 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't' },
{ 'u', 'v', 'w', ',', KEY_BACKSPACE, 'x', 'y', 'z', '.', KEY_RETURN },
{ '+', '-', '*', '/', '\\', ' ', '.', ';', '\'', '=' },
{ KEY_PAGE_UP, KEY_UP_ARROW, KEY_PAGE_DOWN, KEY_TAB, KEY_ESC, KEY_LEFT_ARROW, KEY_DOWN_ARROW, KEY_RIGHT_ARROW, KEY_RETURN, KEY_HOME },
{ KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10 },
{ KEY_F11, KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20 },
// {KEY_APPLICATION, KEY_MENU, KEY_HELP, KEY_SELECT,KEY_STOP,KEY_CANNEL, KEY_CLEAR,KEY_RETURN, KEY_PRINTSCREEN,KEY_PAUSE}
{ KEY_APPLICATION, CONSUMER_CONTROL_HOME + 1000, CONSUMER_CONTROL_BACK + 1000, KEY_PRINTSCREEN, '#',
CONSUMER_CONTROL_SEARCH + 1000, KEY_BACKSPACE, KEY_RETURN, KEY_TAB, '3' }
};
4. OLED屏幕驱动和内容模板。
OLED屏幕使用Adafruit_GFX库驱动,但是需要针对显示内容进行重新包装。
显示内容始终为4行文本,其中1/2行对应两排实体按键的功能。第3行提示按键状态(编号几的按键按下或者放开),仅供调试和演示动画。第四行反色提示当前功能(键盘/换层)
显示的内容使用字符串数组保存,通过当前功能(键盘/换层)、所在层、按键状态决定渲染的字符串。
5. 考虑OLED屏幕寿命和老化,一定时间无操作则关闭OLED,有操作时再唤醒屏幕。
*6、BOM清单
BOM见自动生成的bom,需要注意需额外购买:
- 0.96英寸I2C协议的OLED屏幕 * 1 (这个应该人人有吧,如果没有建议淘宝购买)
- esp32-s2-salola * 1
- 按键键帽 * 10 (建议淘宝购买无刻键帽垃圾包)
- M3 螺丝 * 4
- USB数据线 * 1 (一端为)
BOM中以下器件根据实际需求准备:
- USB插座可以不准备,使用排针-排母的方式插接USB线,或者直接焊接USB线到pcb
- 排针排母可以根据实际需求酌情焊接
- D1-D10,以及D11-D20是为兼容不同封装尺寸二极管而绘制的两组焊盘,可以根据手头的零件选择其中一组焊接
- 轴体根据个人喜好购买,注意引脚需要与PCB匹配(凯华2脚)
*7、大赛LOGO验证
* 8、演示您的项目并录制成视频上传
设计图

BOM


评论