本网页已闲置超过3分钟,按键盘任意键或点击空白处,即可回到网页

基于单片机的光学键盘
发布时间:2021-09-11
分享到:
基于单片机的光学键盘
发布时间:2021-09-11
分享到:

这种光学键盘/小键盘是一种低成本的光学用户输入设备,能够部署在水下、爆炸性气体区域或其他需要气密密封的位置。它不使用电容、磁、机械、声学或可见光耦合。在每个关键部位使用红外光束的反射来确定手指的存在。该设备的任何部分都不需要与外界介质实际接触;可以选择使用透明窗口(可能具有可变厚度)。重点在于易于构建、低组件数量和成本以及低软件处理成本。当前的权衡是缺乏在阳光直射下的操作能力,这可以通过反转当前的光电晶体管偏置和额外的软件工作来改善。

第 1 步:硬件

硬件概览

请参阅硬件概览(横截面)图。第1层是外部环境;这可以是直接的外部介质,也可以是耐压船体(例如塑料或玻璃)。第2层是透明的亚克力光导管层;第 7 项是键帽图例蚀刻,由于第 9 项处的白色 LED 会发光。第 3 层是红外通过但在视觉上是黑色的滤光片;这为第 2 层提供了黑色背景。这样,第 2 层的键帽图例标记在充足的阳光下和完全黑暗中都可见。此外,第 3 层隐藏了底层的孔洞和组件。第 4 层是一个半透明(“磨砂”)过滤器,它通过减少错误的手指触摸事件来提高可靠性,因为它会扩散出射和入射光束,除非手指靠近。第 5 层是硬塑料 4 毫米阴影掩模层,仅引导光束上下,防止测量时每个关键位置的 LED 和光电传感器之间的横向串扰。第6层是PC板;第 8 项是快速大功率红外 LED 和光电传感器。

关键站点

每个关键部位都有一个红外 LED 和一个红外光电晶体管 (PT)。LED 和 PT 都能够在几十纳秒范围内打开/关闭。LED 为高强度型,具有 940nm 输出和 15 度光束角 (Vishay VSMB294008G),PT 与 LED 紧密匹配并具有 24 度感应角 (ON Semiconductor QSB363GR)。PT 通过低损耗 MUX 开关(Texas Instruments TMUX1108)连接到用作电压跟随器缓冲器的运算放大器(Texas Instruments OPA350),然后连接到 MCU 内部的 10 位 A/D 转换器(Microchip PIC16F18855) .

键盘矩阵由 48 个(LED、PT)对组成,物理排列为 12x4 阵列,但电气排列为 6x8 矩阵。关于 6x8,6 代表 6 个“电压+”通道,开关 P 通道 MOSFET,8 代表 8 个“接地返回”位,由 N 通道 MOSFET 开关。电压通道为其 8 个 LED 组供电。接地返回位通过将阴极连接到地来选择 LED,并提供(从而启用)PT 分压器接地。单独的 1-of-6 MUX 用于选择单个组的 PT 进行测量。

LED驱动

LED 能够提供大约 60mA 的连续电流,但是,它们也能够在更短的时间内更用力地驱动。在这里,我们在 1/48 占空比下以大约 230mA 的电流驱动它们,功耗略低于 70uS。数据表给出了 100uS 的硬期限;软件在这方面至关重要:如果让 LED 持续亮起,错误可能会导致硬件损坏。我证明这对于这个项目是可以的,因为微控制器仅用于此并且不运行任何中断或看门狗定时器。带有紧急出口的单个集成软件循环在轮询 A/D 转换完成时控制 LED 的开/关。

我将免费开源原理图供大家参考:

硬件原理图.pdf

DSDKeypad.sch

DSD键盘.brd

DSDKeypad-BOM.pdf

DSDKeypad-Caps.brd

第 2 步:软件

软件概述

请参阅软件概览图。软件处理有 6 个主要领域:测量、评分/阈值、空间微分、时间整合、去抖动和编码/人类用户反馈。一个带有 16 位计数器的简单循环(中断和看门狗定时器禁用)用于为各种周期性事件分配时间。

该软件是在 Microchip 的 MCC X IDE 中完成的。所有这些都在包含的文件 main.c 中。

测量

每个关键部位都有一个红外 LED 和一个红外光电晶体管 (PT)。LED和PT都能够在几十纳秒范围内开/关;亮度测量的分辨率为 10 位。LED 和 PT 被组织为 6 组 LED 和 PT 接地回路,带有一个 3 位命令到 MUX 以选择 6 个 PT 通道之一进行测量。

连续进行四种测量。两个用于基线亮度值采集,两个用于探针亮度值采集。实际上(最终,在处理之后)用于确定按键事件的是“探测”测量。

基线测量的安排频率远低于探针测量。此外,基线与“探针”测量在时间上是交错的。由于在需要检测的按键事件期间,一个或两个以上的手指放在键盘上的可能性很小,因此将缓慢变化的基线与任何特定按键位置的快速“扫描”探针测量进行比较,此处用于检测按键事件。这避免了全局环境比较传感器的额外费用。

基线和探测值分别存储在每个关键站点的基础上;这弥补了:

1. 个别 LED 与 PT 特性的差异

2. 遮蔽量是由键帽上的各种字母形字形图例造成的

3. 键盘各部分的环境照度差异

4.整体环境照明条件的“缓慢”变化

基线测量值“平均”到“上次”的测量值((当前测量值 + 上次测量值)/ 2)。

在这些基线和探针中,进行“暗模式”和“亮模式”测量中的每一个。

暗模式测量是在红外 LED 关闭的情况下测量关键部位的红外光电晶体管的亮度值。亮模式测量与 LED 开启时相同。

明亮模式使 LED 以其连续功率的 250% 运行,持续 70uS 和 1/48 占空比(这在其数据表中是允许的;100uS 是这种运行模式的最大值)。由于软件必须永远不会错过 LED 关闭截止日期以避免硬件损坏,并且由于我们必须等待可变的时间来完成测量亮度值的 A/D 转换,因此这些关键的内部功能被组合在一个软件中的单个例程(illuminate_and_measure()),我们在没有中断和看门狗定时器的情况下运行。这进一步是硬件确保在 MCU 复位时所有 LED 关闭的原因(这是逆变器驱动 P 沟道 MOSFET 组驱动器的原因)。

探测(相对于基线)测量周期任务最常运行。一个关键站点,以及那个关键站点的一个阶段,在每次迭代中被处理;通过这种方式,一切都是交错的,其他任务也可以运行。

有一系列关键阶段;每个键在任何时候都有自己的下一步要进行的测量阶段。有 4 个阶段状态称为 0,1,2,3,其中大部分时间我们返回到阶段 2,但有时会返回到阶段 0。例如:0,1,2,3,2,3,2,3,。 ..<50x>,...,2,3,0,1,2,3,2,3,2,3,...

这个想法是在阶段 0 期间进行基线暗模式测量,在阶段 1 期间进行基线亮模式测量,并且在(更常见的)阶段 2 期间进行“探测”暗模式测量,并且在(更常见的)阶段 3 期间进行“探针”明亮模式测量。

总而言之,交错安排基线测量(相对于探测)具有以下优势:

1. 在所有关键关键站点和以下其他处理任务之间分摊处理时间。

2. 将特定键的基线和探测(决策)测量在时间和空间(关键位置)上保持距离,也就是说,整个键盘不会“同时”对所有键进行探测测量(在同一次通过)(除了一次,在第一次通过时)。

请参阅 StaggeredStates 图。

测量值

测量值为 10 位,在实际使用中的范围约为 ~20 到 ~980。值 0 由软件保留以指示“尚未进行测量或上次测量是不确定的”,因此至少分配值 1。因此,更高的软件层可以使用值 0 来忽略处理。

计分

LED-OFF(“暗模式”)和 LED-ON(“亮模式”)下的探头测量值与其对应的基线测量值以与测量任务相同的速率(尽管在节奏中的不同交错点)进行比较。这是由软件例程确定_score_of_current_key() 完成的。

计算各种增量,然后一系列案例中的每一个都尝试与表明手指可能悬停在关键位置上的增量组合的各种“综合症”相匹配。

零值测量被跳过(见上一节)。固定为零是为了避免负值。

各种“综合症”本质上用作阈值检测器。如果满足阈值条件,则每个键的“分数”增加。如果不是,则递减当前的每个键的分数。这样,当前不满足阈值条件的任何和所有键的分数逐渐下降、固定并保持在 0,直到再次被激活。

空间差异化

软件例程maintain_histogram_of_peak_of_all_scores() 定期检查所有每个键分数的数组。对于分数超过阈值的关键站点,进行分析以查看它是否是所有其他键中的峰值,如果是,则该峰值是否足够“尖锐”,如果是,则每个键的数组值递增,所有其他此类按键数组值递减。

通过这种方式,生成的每个键的数组将始终不包含或包含一个或至多很少的非零值,对应于关键位置附近的手指。

峰值的锐度可以简单地通过记录它的值来计算,然后记录下一个较低峰值的值,并要求它们至少相差一个阈值。

此处理步骤的最终结果是拒绝本质上不是单一的手指悬停或对象悬停事件,例如手悬停在键盘上但未按下任何特定键。该软件步骤与磨砂半透明扩散过滤层一起工作,以防止虚假事件。

为了允许多个同时(“和弦”)keydown 事件,这个软件例程可以扩展到允许 2 或 3 个接近相似幅度的峰值,同时仍然要求严格没有更多这样的峰值。

时间整合

软件例程 act_on_histogram_of_peak_of_all_scores() 定期检查上述空间微分数组中的关键点是否超过阈值。该例程的调度使得这提供将这些有利条件维持一段时间,例如大约100ms。

如果确定发生了该事件,则调用去抖动(见下文)软件例程;这是事件驱动的第一个级别。此外,此时,峰值和分数数组都重置为 0 值,这会强制任何新的按键事件从头开始构建其有利条件。

去抖动

虽然时间积分及时检测到新的按键事件,但它无法区分此类事件是否为“新”事件。这种设计不是试图检测集成的结束,而是寻找不同的按键或超时。这由软件例程 do_keypress_debounce() 实现,并与maintenance_keypress_debounce() 一起运行。除非经过一定时间(例如 500 毫秒),否则会阻止同一键的多个事件。

编码和反馈

在去抖动过滤器中幸存下来的 Keydown 事件被编码(在原型中,编​​码为扩展 ASCII,提供 shift 键大写/小写状态)并发送到目的地。

此外,还会触发人工反馈动画,使整个键盘的图例灯瞬间变暗。或者,可以并且应该使用音频点击或蜂鸣声或触觉反馈来向用户确认他们的按键已被接受。

代码链接:主文件

第 3 步:CAD 零件库
我经常喜欢为原理图符号添加比 SnapEDA 等提供的更多细节,所以这里是原理图和电路板文件使用的部分。以下是 EagleCAD 库。

VSMB294008G.lbr
TMUX1108PWR.lbr
T494C226M016AT.lbr
SN74LV14APWRG4.lbr
RNCP1206FTD15R0.lbr
C0603C104M5RACTU.lbr
C1206C106M3PACTU.lbr
CRCW08053R00FKEAHP.lbr
EEEFK1A121SR.lbr
PIC16F18855-E_SS.lbr
QS6J1TR.lbr
QS6K1TR.lbr
HSMYC170.lbr
RCS080510R0FKEA.lbr
OPA350.lbr
RNCP0603FTD2K21.lbr
RNCP0603FTD10K0.lbr
RNCP0603FTD33R2.lbr
RNCP0603FTD332R.lbr

希望您能喜欢我的这个项目!

加入微信技术交流群

技术交流,职业进阶

关注与非网服务号

获取电子工程师福利

加入电路城 QQ 交流群

与技术大牛交朋友

讨论