【编者按】软件工程师LÁSZLÓ MONDA为了解决每天频繁“奔走”于键盘各块件之间,创建了“终极黑客键盘”。该键盘分为左右两部分,拥有LED灯,而其中所涉及到的具体技术和过程,你可以在本文中找到答案。
以下为:
早在2007年8月的某一天工作中,我不禁意识到普通的PC键盘无法尽可能多的满足于我,每天,我的手指不得不在键盘各块件成百上千次的“奔走”,我想必须要有一个很好的解决办法。
当我想创造一个完美的黑客键盘并去实现它时,我才意识到,作为一名软件开发者,我对硬件是一无所知。(PS:这是多么痛的)
我设法去学习一个全新的技能,同时我一位杰出的机械工程师朋友András V?lgyi加入到制作键盘的项目中,并投入足够的时间创建工作原型。如今,“终极黑客键盘”已经成为现实。
对于没有任何电子知识的软件背景,设计和构建一个强大的硬件设备是一个有趣和迷人的经验,在本文中我将描述这个电子杰作是如何工作的。对电子线图有基本了解的你可以更容易的理解。
代码一次扫描一列,并读取个人键开关的状态,然后将这种状态保存到一个数组中,通过我们前文所说的CALLBACK_HID_Device_CreateHIDReport()函数,相关的扫描代码将发送这些基于数组的状态。
第三步:一个键盘两个部分
到目前为止,我们已经构建了一个普通键盘的开端。但是我们的目标是先进的人体工程学,鉴于人都有两只手,我们最好添加另一半键盘。
另一半的键盘将具有另一个键盘矩阵,重复之前的步骤。而其中令人兴奋的是两部分键盘之间的通信,这里有三个最受欢迎的电子设备互连协议:SPI、I2C和UART。在实际当中,我们会在这种情况下用到UART:
UART需要同行使用相同的波特率、数据位和停止位。现在左键盘通过UART将一个字节的信息发送到右键盘,以此代表按下键或键,右键盘对这些信息进行半加工并在相应的内存中对这些全键盘矩阵数组的状态进行操作。
左键盘发送信息示例:
USART_SendByte(IsKeyPressed7 RowCOLS_NUM + Col);
KeyboardRxCallback()中断处理程序会在一个字节通过UART被接收时触发,考虑到中断处理程序应该尽快执行,所以收到的信息会放到一个环形的缓冲区留待后面处理。环形缓冲区最终会被主循环处理,键盘矩阵也会基于信息而被更新。
所说的是实现该点的最简单的方法,但是最终的协议要更加复杂。你需要考虑多字节信息的处理,而且个人信息也要通过CRC-CCITT校验来检查其完整性。
在这一点上,我们的实验板模型或许会让你印象深刻:
第四步:满足LED显示屏
这是为了让用户能够定义多个特定于应用的键映射来提高生产效率。用户需要意识到一些正被用于键映射的方式,一个集成的LED显示屏被构建于键盘内,下图展示了这种模型:
LED显示是由一个8x6矩阵实现的:
每两行红色LED符号代表14-segment LED显示的分段,白色LED符号则代表了额外的三个状态指标。
通过LED驱动电流并使其亮起来,相应的列设为高电压,相应的行设为低电压。该系统一个有趣的结果是,在任何给定的时刻,只有一列是可以被启用的,而其他列是被禁用的。有人可能会认为这套系统不能工作于整个LED,但是在现实中,列和行更新的太快以至于凭人的无法看到明显的闪烁。
LED矩阵由两个集成电(IC)驱动,一个驱动行,一个驱动列,驱动列的源IC是PCA9634 I2C LED驱动:
驱动行的为TPIC6C595:
让我们看下相关代码:
uint8_t LedStates[LED_MATRIX_ROWS_NUM];void LedMatrix_UpdateNextRow(bool IsKeyboardColEnabled){ TPIC6C595_Transmit(LedStates[ActiveLedMatrixRow]); PCA9634_Transmit(1 ActiveLedMatrixRow); if (++ActiveLedMatrixRow == LED_MATRIX_ROWS_NUM) { ActiveLedMatrixRow = 0; }}
每一个命令都有一个8字节标识符和一组command-specific参数。目前,只有re-enumerate命令被实现,sendReenumerateCommand()使设备作为左/右引导装载程序重新装置,以此来升级固件或变为一个键盘设备。
创建原型
一切制造之前都需要有一个CAD设计:
3D打印的键盘会是这个样子:
基于机械设计和原理、印刷电板设计。右半部分的PCB在KiCad中会是这样:
PCB表面贴装组件必须手工焊接:
最后经过3D印刷、抛光、组装等,我们会得到这样一个原型:
这是一个很广泛的话题,作为IT人员,键盘可以说是我们最亲密的“朋友”之一。不知道您看完之后是否会有自己的想法呢?是否会有做一个的冲动?如果有空闲的话,试着去尝试一些,来一场“说做就做的任性”!(编译/陈明)
原文来自:DZone
本文为CSDN编译整理,未经允许不得转载,如需转载请联系(#换成@)
网友评论 ()条 查看