DIY编程器网

 找回密码
 注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 1593|回复: 0
打印 上一主题 下一主题

[待整理] DIY小设计:基于iNEMO的3D无线鼠标的软硬件实现方案,附详细器件选型

[复制链接]
跳转到指定楼层
楼主
发表于 2015-4-27 08:16:22 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
摘要:基于平坦表面工作的传统鼠标,应用范围受到极大限制。当需要在移动中使用鼠标设备时,平坦表面缺失,传统鼠标将无法满足使用要求。在考察了iNEMO开发板特性后,我们提出了一个在三维空间中动作的3D鼠标方案。该方案可以使得鼠标脱离固定工作表面,在三维空间中使用。该设备通过iNEMO开发板内置加速度计检测手在空间的动作,并以此控制鼠标。此方案使鼠标从二维表面走向到更灵活的3D空间,带来全新的用户体验和良好便携性的同时,更有良好的市场前景,将使鼠标向全新的空间控制领域迈进。
         
        2系统概述
        2.1研究背景与项目价值
        在如今PC普及、笔记本风头正劲、电子竞技风靡数年、HTPC及高清等家庭多媒体娱乐方兴未艾的时候,鼠标——这一从PC初生阶段就诞生的输入设备发展至今,呈现出了历久弥新的强劲姿态。 经典的鼠标产品不断传承,成为玩家和用户口中和手中的传奇。而厂商的进取和市场的厮杀从未停歇,如今的无线键鼠、游戏键鼠、普通鼠标依然是兵家必争之地,无论什么样的鼠标产品,总能不断给消费者以惊喜,这,正是这个行业的魅力。
         
        放眼市场,各类传统光电、机械鼠标和新型3维鼠标、传感器鼠标都是基于二维平坦表面工作的,对鼠标设备的使用带来了极大的限制。当需要在移动中使用鼠标设备时,此类鼠标将无法满足使用要求。我们在考察了iNEMO开发模块中加速度计、陀螺仪等模块特性后,提出了这一款脱离固定表面使用的在三维空间中控制的3D鼠标方案,对传统鼠标的使用盲区加以补充。
         
        传统鼠标缺陷,在于其必须依附于平坦表面工作,在一些特别场合或特别要求下无法实现正常功能。比如教师在讲台上授课需要来回走动,传统鼠标无法跟随教师移动工作;用户不坐在电脑桌前即不能通过鼠标控制电脑;行动不便的用户希望有一款精巧方便的遥控式鼠标满足需求等。与此同时,操作者的手臂必须保持和鼠标同一个平面,长时间保持相似的姿势使操作者无法舒适工作,甚至引发腱鞘炎等疾病。传统鼠标为满足“手握式”的特点,以便携为出发点,存在携带不便等问题,应用受到极大限制。
         
        该设备方案通过佩戴于两个手指的加速度计,以及一块佩戴于手背的iNEMO开发模块感应手部运动和控制动作,使其在三维空间运动,配合不同控制动作达到灵活的操控能力,脱离二维表面的限制。
         
        使用iNEMO可以测出全空间微小移动加速度、角度等信号,采集信号并做处理,实现光标与3D鼠标在整个三维空间同步移动和控制;同时利用加速度传感器检测手指动作,实现鼠键功能。这样的设备具有更优的的操作性,可以在全空间进行操作,更具自由化和方便性。
         
        现有的加速度传感器鼠标方案以及其他传感器、其他技术的鼠标方案,大多都是在二维表面活动,鲜有人设计出基于三维全空间的鼠标产品。我们提出“基于iNEMO的3D无线鼠标”就要打破这一行业壁障,使PC更自由、更灵活的受控,带来鼠标从二维表面向三维空间的技术、理念的革新。
         
        2.2设计要求
        系统在3D空间中运动,实现传统鼠标的光标位移、单击、双击、拖曳等基本功能,在此基础上开发更多的组合动作,通过动作组合开发更多便利创意功能,并使用户可以对组合动作进行自定义,提高人机互动能力;定位精度度达到1000—2000cpi级别,操作流畅,解决光标漂移、定位不准等现象;适用温度范围-5到85摄氏度;工作状态稳定。
         
        3方案设计
        3.1硬件设计
        3.1.1硬件概述
         

        图3.1-1-1 系统手部模型示例

         
        鼠标外观为两枚“指环(加速度传感器)”、一个“手背设备(iNEMO)”、PC端一个无线接收NANO模块。设备符合美学设计,观赏性强;人性化设计方案使其并不影响手部运动,不会带来疲劳感,符合人体工学和舒适性要求。
         
        图示系统分为两个大模块:手部模块和PC端模块。其中手部模块含动作感应(iNEMO及三轴加速度计)、电源、无线发送和防丢失模块;PC端模块含主MCU、无线接收装置、USB等模块。
         
        指尖安装两个三轴加速度计装置,分别佩戴于右手食指与中指,通过该模块采集手指不同运动状态和运动组合信息,作为鼠标的控制信息对PC端进行控制;主系统、电源和射频端设计为环形,佩戴于手腕处,并通过两条伸缩螺旋线与指尖系统连接,螺旋线有传输信号、供电、模块连接的作用;由于手部设备不和PC端直连,为防止遗失,设计防丢失装置,当无线设备不慎遗失在附近时,通过被控PC逆向控制鼠标设备LED等和扬声器发出声光信号,使用户容易找回设备。
         
        3.1.2结构框图
       

        3.1.2-1  手部系统框图

         

       

        3.1.2-2  PC端系统框图

         
        手部系统包括iNEMO、射频模块、传感器模块、电源模块和防丢失模块。其中传感器模块为两个LSM303DLH三轴加速度计,用于采集加速度信号;MCU为iNEMO开发板MCU(STM32F103RET7);传感器信号经由MCU处理、编码后通过nRF24L01发送到受控端PC端系统;电源模块为两块3V纽扣电池,接入iNEMO用其内部稳定芯片转换3V3、1V8电压;找回模块含LED和扬声器,提供找回功能。
         
        PC端系统MCU为STM32F103RBT;射频模块为nRF24L01;从USB取得5V电压并由LDS3985M33R稳压芯片转换为3V3。
         
        3.1.3PCB样图

        PC端系统PCB板自主布线,如下
       

        3.1.2-3  PC端系统实物图

         
        3.1.4MCU

        主控制器为ST公司32位STM32F103RET7,各模块与引脚接口请看后文模块部分。布线如下:
       

        3.1.3-1 STM32布线图

         
        STM32性能优异,表现为:72MHz CPU,20K SRAM ,2x12位ADC, PWM定时器, 4Mb/S UART,18mb/秒SPI,18MHzI/O翻转速度。
         
        器件为64引脚封装,方便起见,并未按原器件引脚顺序画出,而对其做适当分类罗列。正上方6引脚为供电引脚;右下角PB主要用于接三轴加速度计和磁强计;右中上部接SD存储卡,下部接偏航轴陀螺仪等;左上角为晶振接口;左下角为总线扩展器、LED、测试等接口;左中为UART和SPI总线,SPI接射频模块。
         
        3.1.5加速度计

       

        3.1.4-1  LSM303DLH引脚和I2C连接图示

         
        端口24~27为线加速度信号输出与控制端口, SCL时钟、SDA数据接I2C总线(通过iNEMO的GPIO口配置I2C),VDD接iNEMO板上3V3;GND接地;SAO接地。如下:
         
                                                                        LSM1/2
                       
                                                                        iNEMO
                       
                                                                        备注
                       
                                                                        VCC
                       
                                                                        3V3
                       
                                                                        ——
                       
                                                                        SCL
                       
                                                                        UART_TX/CTX
                       
                                                                        模拟I2C
                       
                                                                        SDA
                       
                                                                        UART_RX/RTX
                       
                                                                        模拟I2C
                       
                                                                        SAO
                       
                                                                        GND/VCC
                       
                                                                        地址
                       
                                                                        GND
                       
                                                                        GND
                       
                                                                        ——
                       
        3.1.4-1  加速度计与iNEMO连接端口表

         
        3.1.6射频模块

        经调研,采用挪威NordicVLSI公司的射频收发器NRF24L01作为本系统的无线收发模块。NRF24L01工作在2.4~2.524 GHz ISM频段,内置频率合成器、功率放大器、晶体振荡器、调制器等。以下是NRF24L01结构框图:
         
       

        图3.1.5-1 nRF24L01结构框图

         
        引脚封装:
       

         
        应用电路:
       

        3.1.5-3 射频应用电路

         

       

        3.1.5-4nRF24L01模块接口

         
                                                                        nRF24L01
                       
                                                                        iNEMO
                       
                                                                        PC端
                       
                                                                        VDD(1、2
                       
                                                                        3V3
                       
                                                                        VDD
                       
                                                                        CE
                       
                                                                        SPI1_CS
                       
                                                                        PA4
                       
                                                                        SCK
                       
                                                                        SPI1_SCK
                       
                                                                        PA5
                       
                                                                        CSN
                       
                                                                        GND
                       
                                                                        GND
                       
                                                                        IRO
                       
                                                                        GPIO4
                       
                                                                        PC7
                       
                                                                        MOSI
                       
                                                                        SPI1_MOSI
                       
                                                                        PA7
                       
                                                                        MISO
                       
                                                                        SPI1_MISO
                       
                                                                        PA6
                       
                                                                        GND(9、10
                       
                                                                        GND
                       
                                                                        GND
                       
<div style="clear: both;">                  
        3.1.7电源

        电源框图如下:
       

        3.1.7-1   供电模块框图

         
        通过稳压芯片LDS3985M33R,得到3.3V输出电压,给系统各器件供电。应用电路如下:
       

        3.1.7-2 稳压芯片电路

         
        3.2软件流程构架
        3.2.1动作组合概述

        依据系统预设操作方法,我们有两种操作模式可用,分别为水平模式和竖直模式。水平模式姿势类似传统鼠标模式,手指弯曲指尖指向桌面,此时Z-指为尖向内方向,故向内运动组合为点击操作;竖直模式手平伸于空中,指尖水平,以指尖向下方向为Z-,此时向下运动组合为点击操作。
         
                                                                        序号
                       
                                                                        功能
                       
                                                                        动作组合
                       
                                                                        备注
                       
                                                                        1
                       
                                                                        光标移动
                       
                                                                        两指同时同向(YZ平面)移动,光标随手指移动
                       
                               
                                           
  •                                                                                                         坐标系基于指尖定义:指尖前X+,左Y+,下为Z+,
                                   
                       
                                                                        2
                       
                                                                        单击
                       
                                                                        右指保持静止,左指向Z+运动再收回
                       
                                                                        3
                       
                                                                        右击
                       
                                                                        左指保持静止,右指向Z+运动再收回
                       
                                                                        4
                       
                                                                        睡眠/锁定
                       
                                                                        左右指同步指向Z+(下),鼠标进入打字模式,此时光标和点击动作锁定
                       
        3.2.1-1 设备功能表

         
        对三轴加速度计模块与iNEMO开发板做适当安装,使坐标定义如下:指甲盖方向为Z+,指尖前为X+,指尖左为Y+。当指尖系统在空间旋转运动时,检测手背部iNEMO中加速度传感器数据,Y-方向检测到较大加速度值时光标右移,反之左移;X-方向检测到加速度值时上移,反之下移。
         
        3.2.2iNEMO软件流程

        1、FreeRTOS系统

        工程中使用了FreeRTOS系统,其作为一个轻量级的操作系统,提供的功能包括:任务管理、时间管理、信号量、消息队列、内存管理、记录功能等,可基本满足较小系统的需要。FreeRTOS支持优先级调度算法,每个任务可根据重要程度的不同被赋予一定的优先级,MCU总是让处于就绪态的、优先级最高的任务先运行。FreeRT0S内核同时支持轮换调度算法,系统允许不同的任务使用相同的优先级,在没有更高优先级任务就绪的情况下,同一优先级的任务共享MCU的使用时间。
         
        FreeRTOS系统有效的减轻了系统负荷,明显提高了数据处理的速度。
         
        2、三个任务交互

        为提高软件效率,使用了三个任务进行控制。
         
        任务一:命令管理控制任务inCommandTaskFunction();
         
        任务二:数据采样&发送控制任务inDataTaskFunction();
         
        任务三:测试任务testTaskFunc()。
         
        其中任务一和任务二通过信号量s_timSemaphore进行交互通信。
         
        3、底层驱动的添加

        由于工程中,我们增加一个无线收发模块NRF24L01,因此软件上添加了相应的底层驱动文件。NRF24L01中含有spi驱动spi.h、spi.c和NEF24L01驱动24l01.h、24l01.c文件。并在iNEMO官方软件内部添加了nRF24L01的相关代码。
         
        4、iNEMO部分软件

        流程如下:(关键代码见附件iMEMO修改程序GUI部分。)
       

        图3.2.2-1  传感器软件流程

       

        图3.2.2-2  iNEMO射频流程

         
        3.2.3PC端MCU部分软件:

        PC端主要含数据接收、数据处理、鼠标控制、防丢失等软件模块。
         
        工程中运用了STM32F10x_StdPeriph_DriverV3.1.1和STM32_USB-FS-Device_DriverV3.1.1库文件。软件流程如下:
       

        3.2.3-1 PC端系统程序流程

         
        定义食指传感器为L(left),中指传感器为R(right),iNEMO上加速度传感器为B(back)。用B传感器动作执行判定光标移动;L、R传感器判定点击,如下:R保持,L向Z+再收回判定单击;L保持,R向Z+再收回判定右击;L、R同时向Z+,判定为休眠开启或解除,进入休眠或打字状态,光标不动作。动作模式识别流程如下:
         

        3.2.3-2  动作判据流程图

         
        关键代码:
         
        if(mode==0)                                                                                         //RX模式
        {      
                 RX_Mode();
                 while(1)
                 {                                                                        
                           if(NRF24L01_RxPacket(tmp_buf)==0)                      //一旦接收到信息,则显示出来.
                           {
                                    mouse=(Mouse*)tmp_buf;
                 Joystick_Send(0,(-mouse->sBAcc[1]>>8)*10,(-mouse->sBAcc[0]>>8)*10,-(mouse->sBAcc[2]>>8)*10);
                                    while((mouse->sLAcc[0]>800)&(mouse->sRAcc[0]<600))
                                    {
                                             Joystick_Send(LEFT_CLICK,0,0,0);//模拟左键按下
                                             delay_ms(10);
                                             if(NRF24L01_RxPacket(tmp_buf)==0)
                                             {
                                                      mouse=(Mouse*)tmp_buf;      
                 Joystick_Send(0,(-mouse->sBAcc[1]>>8)*10,(-mouse->sBAcc[0]>>8)*10,-(mouse->sBAcc[2]>>8)*10);
                                             }
                                    };
                                    while((mouse->sRAcc[0]>800)&(mouse->sLAcc[0]<600))
                                    {                                    
                                             Joystick_Send(RIGHT_CLICK,0,0,0);//右键按下
                                             delay_ms(10);
                                             if(NRF24L01_RxPacket(tmp_buf)==0)//一旦接收到信息,则显示出来.
                                             {
                                                      mouse=(Mouse*)tmp_buf;
                 Joystick_Send(0,(-mouse->sBAcc[1]>>8)*10,(-mouse->sBAcc[0]>>8)*10,-(mouse->sBAcc[2]>>8)*10);
                                             }
                                    };
                                    while((mouse->sLAcc[0]>800)&(mouse->sRAcc[0]>800))
                                    {
                                             Joystick_Send(0,0,0,0);
                                             delay_ms(15);
                                             if(NRF24L01_RxPacket(tmp_buf)==0)
                                             {
                                                       mouse=(Mouse*)tmp_buf;
                                             }
                                    };
                           }
                 };
        }
                 详情请参阅附件MDK工程部分。
         
        3.3信号处理方案
        实测过程发现加速度计LSM303DLH检测到的数据虽然可以精确到0.1mg级别,但到了这个级别,任意一个毛刺信号、随机误差带来的误差都是不可忽略的。由于鼠标动作检测并不需要如此精度的测量值,且微小信号中的毛刺、随机误差难以清除,我们利用以下方式对信号进行处理。
         
        由加速度计和iNEMO上所有传感器检测到的数据都是s16格式数据,低八位数据带来 的加速度精度,既0.256g数量级的加速度精度。与此同时,鼠标动作判定信号需要的传送的数据位u8格式,从s16转化为u8会带来低位数据的舍弃。因此,把s16格式的数据取其高八位,传送给鼠标控制语句。实例表明,由此处理的加速度信号波形十分光滑,且完全能胜任光标的控制需要。
         
        据实测,运用上述方法对信号积分处理相对误差小,波形和控制精度有明显改善。
         
        4扩展开发方案
        iNEMO集成五个意法半导体传感器:三轴数字陀螺仪、三轴加速度计、磁强计、偏航陀螺仪、压力传感器和温度传感器。其模块众多,功能强劲。除利用三轴加速度计检测手部运动外,还可利用富余传感器做更多、更精确开发。由于时间关系,本系统还存在很多富余开发空间,对设备做后期开发做如下思考:
         
        利用iNEMO输出的姿态数据(角度、四角位置变化等)辅助进行更精确、更灵敏的手部运动检测,对鼠标功能做进一步优化开发,并补充用户自定义动作模式,开发更人性化的动作控制,提高用户体验和市场竞争力。
         
        结合姿态数据检测手部运动加速度值,并通过一定算法减小重力加速度的影响,再通过两次离散数字积分算法,去除一次、二次趋势项后得到精确手部运动位移信号,以此更精确、快捷的控制鼠标。
         
        由于采用的二次积分、拟合一次、二次趋势项并消除,得到纯净手部位移的算法稍显复杂,本部分开发尚未完成,留待产品后续开发所用。
         
        5硬件配置
        对系统所含器件做如下统计:
         
                                                                        种类
                       
                                                                        型号/数量
                       
                                                                        MCU
                       
                                                                        STM32F103RBT6  1
                       
                                                                        三轴加速度计
                       
                                                                        LSM303DLH      2
                       
                                                                        射频模块
                       
                                                                        nRF24L01         1
                       
                                                                        稳压器件
                       
                                                                        LDS398M33R      1
                       
                                                                        开发板
                       
                                                                        iNEMO           1
                       
<div style="clear: both;">
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
收藏收藏 分享分享 支持支持 反对反对
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|文字版|手机版|DIY编程器网 ( 桂ICP备14005565号-1 )

GMT+8, 2024-12-28 06:38 , 耗时 0.115044 秒, 22 个查询请求 , Gzip 开启.

各位嘉宾言论仅代表个人观点,非属DIY编程器网立场。

桂公网安备 45031202000115号

DIY编程器群(超员):41210778 DIY编程器

DIY编程器群1(满员):3044634 DIY编程器1

diy编程器群2:551025008 diy编程器群2

QQ:28000622;Email:libyoufer@sina.com

本站由桂林市临桂区技兴电子商务经营部独家赞助。旨在技术交流,请自觉遵守国家法律法规,一旦发现将做封号删号处理。

快速回复 返回顶部 返回列表