[8/16-bit MCU] 悬空鼠标设计与实现

[复制链接]
 楼主| 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。可导入的库有:



 楼主| quray1985 发表于 2015-12-30 20:09 | 显示全部楼层
3.新建并编写main函数:终于可以上代码了(下面的代码是简化版本,完整功能见附件):
  1. #include "mbed.h"  
  2. #include "rtos.h"  
  3.   
  4. #include "MMA8451Q.h"  
  5. #include "USBMouse.h"  
  6. #include "tsi_sensor.h"  
  7. //MMA8451Q definiation  
  8. #if   defined (TARGET_KL25Z) || defined (TARGET_KL46Z)  
  9.   PinName const SDA = PTE25;  
  10.   PinName const SCL = PTE24;  
  11. #elif defined (TARGET_KL05Z)  
  12.   PinName const SDA = PTB4;  
  13.   PinName const SCL = PTB3;  
  14. #elif defined (TARGET_K20D50M)  
  15.   PinName const SDA = PTB1;  
  16.   PinName const SCL = PTB0;  
  17. #else  
  18.   #error TARGET NOT DEFINED  
  19. #endif  
  20.   
  21. #define MMA8451_I2C_ADDRESS (0x1d<<1)  


 楼主| quray1985 发表于 2015-12-30 20:09 | 显示全部楼层
  1. //  
  2. #if defined (TARGET_KL25Z) || defined (TARGET_KL46Z)  
  3.   #define ELEC0 9  
  4.   #define ELEC1 10  
  5. #elif defined (TARGET_KL05Z)  
  6.   #define ELEC0 9  
  7.   #define ELEC1 8  
  8. #else  
  9.   #error TARGET NOT DEFINED  
  10. #endif  
  11.   
  12. MMA8451Q acc(SDA, SCL, MMA8451_I2C_ADDRESS);  
  13.   
  14. Ticker tick;  
  15. PwmOut rled(LED1);  
  16. PwmOut gled(LED2);  
  17. PwmOut bled(LED3);  
  18.   
  19. TSIAnalogSlider tsi(ELEC0, ELEC1, 40);  
  20. USBMouse mouse;  
  21. //InterruptIn sw2(SW2);  
 楼主| quray1985 发表于 2015-12-30 20:10 | 显示全部楼层
  1. //thread pointer  
  2. Thread *thread2;  
  3.   
  4. float x=0, y=0, z=0,t=0;  
  5.   
  6. //intruppt  
  7. void sw2_press(void)  
  8. {  
  9.     thread2->signal_set(0x1);  
  10. }  
  11.   
  12. void led_thread(void const *argument)  
  13. {  
  14.     while (true) {  
  15.         rled = abs(1.0f - x -t);  
  16.         gled = abs(1.0f - y -t);  
  17.         bled = abs(1.0f - z -t);  
  18.         Thread::wait(50);  
  19.     }  }
 楼主| quray1985 发表于 2015-12-30 20:11 | 显示全部楼层
  1. void scan_thread(void const *argument)  
  2. {  
  3.     while (true) {  
  4.         Thread::signal_wait(0x1);  
  5.        // x = abs(acc.getAccX());  
  6.        // y = abs(acc.getAccY());  
  7.        // z = abs(acc.getAccZ());  
  8.         x = acc.getAccX();  
  9.         y = acc.getAccY();  
  10.         z = acc.getAccZ();  
  11.         t = tsi.readPercentage();  
  12.     }  
  13. }  
  14.   
 楼主| quray1985 发表于 2015-12-30 20:12 | 显示全部楼层
  1. int main()  
  2. {  
  3.     Thread thread(led_thread);  
  4.     thread2 = new Thread(scan_thread);  
  5.   
  6.   //  sw2.fall(&sw2_press);  
  7.     tick.attach(&sw2_press,0.001);   //scan MMA8451Q ervery 0.01s  
  8.     while (true) {  
  9.         Thread::wait(1);  
  10.         mouse.move( y*127,x*127);  
  11.         printf("\r\n 0.1 seconds passed: %f,%f,%f,%f \r\n", x,y,z,t);  
  12.         fflush(stdout);  
  13.     }  
  14. }  
 楼主| quray1985 发表于 2015-12-30 20:13 | 显示全部楼层
OK ,大功告成,连接USB线到板子上的USB KL25Z到PC,PC识别USB输入设备,鼠标动了。。。。
工程使用了RTOS,已经导出keil工程,见附件,另一个工程为一个3d加速度计的简单例子。

frdm_rtos_uvision_kl25z.zip

918.33 KB, 下载次数: 6

FRDM_MMA8451Q_uvision_kl25z.zip

266.68 KB, 下载次数: 9

您需要登录后才可以回帖 登录 | 注册

本版积分规则

156

主题

1488

帖子

5

粉丝
快速回复 在线客服 返回列表 返回顶部