描述
<p style="line-height:1.8">注:* 为必填项</p>
<p style="line-height:1.8"><strong><span style="color:#0093e6">请在报名阶段填写 ↓</span></strong></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 1、项目功能介绍</h3>
<hr>
<p>生活中不时需要用到外接键盘,但常规外接键盘往往体积较大,携带也不方便。于是我萌生了自己做一个小键盘的想法,通过软件定义按键功能,使用屏幕显示当前键盘的按键配列,从而实现体积小、按键全、易用、触感好的需求。</p>
<p>手上刚好有esp32s2开发板支持硬件USB,搞起!</p>
<p> </p>
<h3 style="line-height:1.8">*2、项目属性</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6"><span style="font-size:14px">原创,首次公开</span></span></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">* 3、开源协议</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6"><span style="font-size:14px">MIT</span></span></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8"><strong><span style="color:#0093e6">请在竞赛阶段填写 ↓</span></strong></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*4、硬件部分</h3>
<hr>
<p>一、主体电路</p>
<ol>
<li>由于开发板的USB仅能用于烧录和供电,不能用于USB hid通讯,因此需引出USB d+ d-到pcb外侧;</li>
<li>为方便调试及后续扩展,使用多排排针引出开发板全部io,并为串口、spi、I2C引出专门的排针组;除满足键盘基本功能外,也方便直接使用开发板的资源做其他工作。</li>
<li>由于制作小键盘按键数量少,为实现全部按键的功能,需要使用软件实现按键功能切换(即换层);传统键盘换层依靠人本身的记忆,有学习和使用门槛;本设计使用屏幕来提示当前按键布局。</li>
<li>esp32s2虽然io资源非常多,但是为了实验键盘矩阵(使用二极管防鬼影、掩蔽),使用2*5矩阵设计电路;为充分利用手头余料,二极管设计了两种焊盘尺寸,择一焊接即可。</li>
</ol>
<div> <img style="display:block;margin-left:auto;margin-right:auto" src="//image.lceda.cn/oshwhub/fb38250742004da9be75ba2579250acf.png"></div>
<div> </div>
<p style="line-height:1.8">二、定位板。</p>
<p style="line-height:1.8">定位板是机械键盘的重要组成部分,定位板可以对按键支撑固定,让按键更加稳定。</p>
<p style="line-height:1.8">直接沿轴体安装区域绘制外形框并阵列,添加板框,以pcb外形层的方式完成定位板的绘制。</p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/db78f5f27b834521a22259afa25e2d9b.png"></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8">(实物为早期版本,原定通过螺丝进行定位,实际发现并没有安装螺丝的必要)</p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/85c833178e974e10b0445b5b1bd6fc07.png"></p>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8">三、外壳绘制。</p>
<p style="line-height:1.8">1. 由于按键区域需要裸露在外,开发板和屏幕所在区域需要使用外壳保护,使用立创eda绘制这样的外壳存在一定难度。</p>
<p style="line-height:1.8">本案使用上下盖的方式绘制方盒,对按键区域进行整体挖槽,按键和开发板之间添加实体(需准确计算实体和上下盖的高度)实现外壳基本结构</p>
<p style="line-height:1.8">2. 为了让按键得到足够的支撑力,下压的确定感更清晰,相邻按键之间全部添加螺柱(但是实际不拧螺丝)作为结构上的支撑柱</p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/bccea53039e94bd3b582e911e252c4f3.png"></p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/9dbe9c0a3dfc4d138938d902210cccea.png"></p>
<p style="line-height:1.8">组装后实物(使用了无刻键帽垃圾包搭配的渐变色)</p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/b3cfea11acf0435782deae135276ae26.png"></p>
<p style="line-height:1.8">3. OLED区域上盖开窗,并绘制盖板(使用透明材质加工或者打印),也可以使用正面面板取代。</p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/55b3d2fc8e6046c29aec268ea2734a57.png"></p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*5、软件部分</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6">由于esp32有乐鑫官方支持arduino环境,本项目使用arduino ide开发。烧录也非常简单,通过主板上引出的串口连接到电脑,或者通过开发板上的USB连接电脑USB即可,然后通过上电前按下boot按键(pin 0)进入烧录模式即可串口烧录。</span></p>
<p style="line-height:1.8">代码主要分以下几个部分:</p>
<p style="line-height:1.8">1. 矩阵按键扫描。针对矩阵按键进行了编程实验,最终选择了调用更为简洁的Adafruit_Keypad库。</p>
<p style="line-height:1.8">2. USB键盘设备功能实现。乐鑫官方库已经提供了USBHIDKeyboard类,根据范例初始化USB功能、发送按键事件即可。需要注意的是此库调用的参数并非hid协议定义的keycode,再叠加方便自定义的因素,需要重新对键盘事件函数进行重新包装,才能方便直观地把配置转换为实际调用的参数。</p>
<p style="line-height:1.8">3. 按键功能定义、换层功能。通过实际测试,最终决定使用二维数组存储按键定义,按下右下方按键进入换层模式,如此时按下其他按键则切换到对应层,如未按下其他按键触发右下方按键自生功能,如按下当前层对应的按键则无事发生。</p>
<p style="line-height:1.8">按键二维数组:</p>
<p style="line-height:1.8"><span style="background-color:#e8e8e8">short keySets[layerNum][10] = {</span></p>
<div>
<div><code> { '1', '2', '3', '4', '5', '6', '7', '8', '9', '0' },</code></div>
<div><code> { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j' },</code></div>
<div><code> { 'k', 'l', 'm', 'n', 'o', 'p', 'q', 'r', 's', 't' },</code></div>
<div><code> { 'u', 'v', 'w', ',', KEY_BACKSPACE, 'x', 'y', 'z', '.', KEY_RETURN },</code></div>
<div><code> { '+', '-', '*', '/', '\\', ' ', '.', ';', '\'', '=' },</code></div>
<div><code> { 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 },</code></div>
<div><code> { KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10 },</code></div>
<div><code> { KEY_F11, KEY_F12, KEY_F13, KEY_F14, KEY_F15, KEY_F16, KEY_F17, KEY_F18, KEY_F19, KEY_F20 },</code></div>
<div><code> // {KEY_APPLICATION, KEY_MENU, KEY_HELP, KEY_SELECT,KEY_STOP,KEY_CANNEL, KEY_CLEAR,KEY_RETURN, KEY_PRINTSCREEN,KEY_PAUSE}</code></div>
<div><code> { KEY_APPLICATION, CONSUMER_CONTROL_HOME + 1000, CONSUMER_CONTROL_BACK + 1000, KEY_PRINTSCREEN, '#',</code></div>
<div><code> CONSUMER_CONTROL_SEARCH + 1000, KEY_BACKSPACE, KEY_RETURN, KEY_TAB, '3' }</code></div>
<div><code>};</code></div>
</div>
<p style="line-height:1.8"> </p>
<p style="line-height:1.8">4. OLED屏幕驱动和内容模板。</p>
<p style="line-height:1.8">OLED屏幕使用Adafruit_GFX库驱动,但是需要针对显示内容进行重新包装。</p>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/79e96a2a21494e4b9438de4ee783bd47.png"></p>
<p style="line-height:1.8">显示内容始终为4行文本,其中1/2行对应两排实体按键的功能。第3行提示按键状态(编号几的按键按下或者放开),仅供调试和演示动画。第四行反色提示当前功能(键盘/换层)</p>
<p style="line-height:1.8">显示的内容使用字符串数组保存,通过当前功能(键盘/换层)、所在层、按键状态决定渲染的字符串。</p>
<p style="line-height:1.8">5. 考虑OLED屏幕寿命和老化,一定时间无操作则关闭OLED,有操作时再唤醒屏幕。</p>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*6、BOM清单</h3>
<hr>
<p style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">BOM见自动生成的bom,需要注意需额外购买:</span></p>
<ol>
<li style="line-height:1.8"><span style="color:#95a5a6;font-size:14px">0.96英寸I2C协议的OLED屏幕 * 1 (这个应该人人有吧,如果没有建议淘宝购买)</span></li>
<li style="line-height:1.8"><span style="color:#95a5a6">esp32-s2-salola * 1 </span></li>
<li style="line-height:1.8"><span style="color:#95a5a6">按键键帽 * 10 (建议淘宝购买无刻键帽垃圾包)</span></li>
<li style="line-height:1.8"><span style="color:#95a5a6">M3 螺丝 * 4</span></li>
<li style="line-height:1.8"><span style="color:#95a5a6">USB数据线 * 1 (一端为)</span></li>
</ol>
<p><span style="color:#95a5a6">BOM中以下器件根据实际需求准备:</span></p>
<ol>
<li><span style="color:#95a5a6">USB插座可以不准备,使用排针-排母的方式插接USB线,或者直接焊接USB线到pcb</span></li>
<li><span style="color:#95a5a6">排针排母可以根据实际需求酌情焊接</span></li>
<li><span style="color:#95a5a6">D1-D10,以及D11-D20是为兼容不同封装尺寸二极管而绘制的两组焊盘,可以根据手头的零件选择其中一组焊接</span></li>
<li><span style="color:#95a5a6">轴体根据个人喜好购买,注意引脚需要与PCB匹配(凯华2脚)</span></li>
</ol>
<p style="line-height:1.8"> </p>
<h3 style="line-height:1.8">*7、大赛LOGO验证</h3>
<hr>
<p style="line-height:1.8"><img src="//image.lceda.cn/oshwhub/4ac7291a4f7c4b7ea765ba9fa635a5c8.png"></p>
<h3 style="line-height:1.8">* 8、演示您的项目并录制成视频上传</h3>
<hr>
<p style="line-height:1.8"> </p>
-
立创电赛:USB小键盘-功能演示.mp4
-
立创电赛:USB小键盘-功能演示(1).mp4
评论(1)