LazyBoard双轨迹球一体式键盘设计方案
一体化设计,相当于同一个USB物理端口上的两个HID设备。与单一的键盘或鼠标相比,发送的报文需要在最前面添加一个报告ID字节,以指明该报文来自键盘还是鼠标。两种设备的报文格式分别如下:
键盘HID报文格式
字节# | 内容 |
0 | 报告ID |
1 | 功能键状态 |
2 | 定值0x00 |
3~8 | 按下的键(最多6个) |
鼠标HID报文格式
字节# | 内容 |
0 | 报告ID |
1 | 按键状态 |
2 | X 位移 |
3 | Y 位移 |
4 | 滚轮位移 |
为了分别声明2种设备类型和对应的报文格式,在初始化阶段,还需向PC发送一定格式的报告描述符。限于篇幅,这里不列出具体内容。
(4)手势识别算法设计
所谓鼠标手势,可以理解为鼠标指针移动方向的一系列特定序列。我们对每个轨迹球的划分了8种运动方向,分别用数字1~8表示,如图2.4。如果位移量没有超过某个阈值,则标签为0。
轨迹球方向划分
目前,系统能够识别出轨迹球左右、上下摇动的手势。对每个轨迹球,维护一个数组,存储最近0.5s内每隔10ms的动作历史。进行手势识别时,从前到后遍历数组,若遇到方向0则忽略;若遇到方向1、5之间的跳变,则向水平方向摇动的计数器增加1;垂直方向依此类推。若最终计数值大于某个阈值,则认为发生了相应的鼠标手势。类似的算法还能应用于轨迹球顺、逆时针转动等手势的识别。
为了避免同一次手势被多次识别,我们引入了"不应期"机制,即当一个鼠标手势发生时,向某个变量装载一个初值,并在以后的访问中逐次减1,直到其值重新为0前都不再进行手势识别。
2.2.3 系统软件流程
系统的软件运行流程如图2.5所示。
上电复位后,首先对单片机的时钟、GPIO、USB通信模块和定时器进行初始化;接着以查询方式分别与3个PS/2设备通信,完成相应的配置;再通过USB与上位PC通信,声明HID设备类型;最后,使能PS/2通信涉及的GPIO中断和定时器中断,进入休眠模式,系统开始正常工作。
共有3种中断可将CPU唤醒。其中,GPIO的下降沿中断与定时器中断用于实现PS/2驱动,已在前面说明。本系统的USB工作在高速模式下,在此模式下,上位PC每隔1ms查询一次USB设备,在下位单片机引发一个中断。该中断响应函数调用联络层的函数,识别键盘键值和轨迹球的手势,并启动HID报文发送。
双轨迹球键盘软件运行流程
2.2.4 系统实现效果
硬件方面,我们改造完成了一个双轨迹球键盘(图2.6左),键盘及轨迹球通过PS/2协议发送数据到EVK1100开发板,开发板再通过USB接口与上位机相连(图2.6右)。
双轨迹球键盘硬件系统
USB接头插入计算机后,可以看到设备管理器中在只增加一个USB输入设备的同时增加了一个鼠标和一个键盘(图2.7)。
插入双轨迹球键盘前后设备管理器对比
左:未插入Lazyboard;右:插入Lazyboard
软件方面,除了可以正常的实现键盘的文本输入及控制,还可以通过轨迹球实现如下基本功能:
(1)单独滚动任意一个轨迹球可进行光标的移动;
(2)左球按下相当于单击左键,右球按下相当于单击右键;
(3)按下左球同时滚动右球,相当于按下左键进行拖拽;
(4)按下右球同时滚动左球,相当于按下右键进行拖拽;
(5)两球同时向下是向下滚动滚轮,反之向上滚动滚轮;
(6)两球同时向外侧是放大,同时向内侧是缩小;
(7)左球左右摇动,打开Windows搜索框;
(8)左球上下摇动,打开"我的电脑";
(9)右球左右摇动,切换到桌面;
(10)右球上下摇动,打开"任务管理器"。
除了以上基本功能,我们还将进一步增加轨迹球手势,如转动(rolling)等,并实现更多诸如双击、刷新、启动任务管理器乃至关机等常用计算机功能的便捷操作。
- 微软BlueTrack蓝光鼠标的设计揭密(06-10)
- 一种快速精确的KVM远程鼠标同步方法(08-03)
- 空中鼠标系统设计的关键因素(11-30)
- 基于手势识别的智能输入系统设计(02-16)