打印
[8/16-bit MCU]

悬空鼠标设计与实现

[复制链接]
1109|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
quray1985|  楼主 | 2015-12-30 20:06 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
说明:

今天接着上次的mbed工程又玩弄了一番,实现了基于mbed RTOS以及三轴重力传感器的鼠标,当然了,由于FRDM25Z上没有按键,通过板上的TSI触摸实现鼠标的左右键功能。

在这个系统中更是充分体现了mbed的方便快捷,分分钟钟几行代码搞定了一个飞鼠的设计。


相关帖子

沙发
quray1985|  楼主 | 2015-12-30 20:06 | 只看该作者
实现步骤:1.新建工程,导入相应的库(在线有提供的库):




使用特权

评论回复
板凳
quray1985|  楼主 | 2015-12-30 20:07 | 只看该作者
导入库时通过import 导入;



使用特权

评论回复
地板
quray1985|  楼主 | 2015-12-30 20:08 | 只看该作者
2.为了好玩我把TSI(触摸按键),mbed RTOS、LED、Timer都导入了,其实这个功能用不到RTOS。可导入的库有:



使用特权

评论回复
5
quray1985|  楼主 | 2015-12-30 20:09 | 只看该作者
3.新建并编写main函数:终于可以上代码了(下面的代码是简化版本,完整功能见附件):
#include "mbed.h"  
#include "rtos.h"  
  
#include "MMA8451Q.h"  
#include "USBMouse.h"  
#include "tsi_sensor.h"  
//MMA8451Q definiation  
#if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)  
  PinName const SDA = PTE25;  
  PinName const SCL = PTE24;  
#elif defined (TARGET_KL05Z)  
  PinName const SDA = PTB4;  
  PinName const SCL = PTB3;  
#elif defined (TARGET_K20D50M)  
  PinName const SDA = PTB1;  
  PinName const SCL = PTB0;  
#else  
  #error TARGET NOT DEFINED  
#endif  
  
#define MMA8451_I2C_ADDRESS (0x1d<<1)  


使用特权

评论回复
6
quray1985|  楼主 | 2015-12-30 20:09 | 只看该作者
//  
#if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)  
  #define ELEC0 9  
  #define ELEC1 10  
#elif defined (TARGET_KL05Z)  
  #define ELEC0 9  
  #define ELEC1 8  
#else  
  #error TARGET NOT DEFINED  
#endif  
  
MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);  
  
Ticker tick;  
PwmOut rled(LED1);  
PwmOut gled(LED2);  
PwmOut bled(LED3);  
  
TSIAnalogSlider tsi(ELEC0, ELEC1, 40);  
USBMouse mouse;  
//InterruptIn sw2(SW2);  

使用特权

评论回复
7
quray1985|  楼主 | 2015-12-30 20:10 | 只看该作者
//thread pointer  
Thread *thread2;  
  
float x=0, y=0, z=0,t=0;  
  
//intruppt  
void sw2_press(void)  
{  
    thread2->signal_set(0x1);  
}  
  
void led_thread(void const *argument)  
{  
    while (true) {  
        rled = abs(1.0f - x -t);  
        gled = abs(1.0f - y -t);  
        bled = abs(1.0f - z -t);  
        Thread::wait(50);  
    }  }

使用特权

评论回复
8
quray1985|  楼主 | 2015-12-30 20:11 | 只看该作者
void scan_thread(void const *argument)  
{  
    while (true) {  
        Thread::signal_wait(0x1);  
       // x = abs(acc.getAccX());  
       // y = abs(acc.getAccY());  
       // z = abs(acc.getAccZ());  
        x = acc.getAccX();  
        y = acc.getAccY();  
        z = acc.getAccZ();  
        t = tsi.readPercentage();  
    }  
}  
  

使用特权

评论回复
9
quray1985|  楼主 | 2015-12-30 20:12 | 只看该作者
int main()  
{  
    Thread thread(led_thread);  
    thread2 = new Thread(scan_thread);  
  
  //  sw2.fall(&sw2_press);  
    tick.attach(&sw2_press,0.001);   //scan MMA8451Q ervery 0.01s  
    while (true) {  
        Thread::wait(1);  
        mouse.move( y*127,x*127);  
        printf("\r\n 0.1 seconds passed: %f,%f,%f,%f \r\n", x,y,z,t);  
        fflush(stdout);  
    }  
}  

使用特权

评论回复
10
quray1985|  楼主 | 2015-12-30 20:13 | 只看该作者
OK ,大功告成,连接USB线到板子上的USB KL25Z到PC,PC识别USB输入设备,鼠标动了。。。。
工程使用了RTOS,已经导出keil工程,见附件,另一个工程为一个3d加速度计的简单例子。

frdm_rtos_uvision_kl25z.zip

918.33 KB

FRDM_MMA8451Q_uvision_kl25z.zip

266.68 KB

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1488

帖子

5

粉丝