12下一页
返回列表 发新帖我要提问本帖赏金: 35.00元(功能说明)

[Kinetis] 【原创连载】 FRDM-K64F 空中飞鼠实验

[复制链接]
6156|23
 楼主| Ketose 发表于 2015-6-10 10:56 | 显示全部楼层 |阅读模式
【FRDM-K64F】空中飞鼠 之 读FXOS8700Q加速度值
在飞思卡尔社区拿到论坛里送的K64F了。这几天初步研究了下,为了快速实现还是用mbed吧,我懒得去啃英文资料了。还是站在别人肩膀上吧
今天试验了下mbed封装的FXOS8700Q库,好用简单。废话不多说开始吧
实验目的:
每隔一秒从FXOS8700Q传感器上读出X,Y,Z轴上的加速度值,并通过串口在电脑上显示出来。同时反转RGB的红色小灯。
电路图:
1、RGB LED
led.png
2、FXOS8700
FX0S.png
3、UART串口
UART.png
实验代码:
  1. #include "mbed.h"
  2. #include "FXOS8700Q.h"

  3. //I2C_SCL = PTE24  
  4. //I2C_SDA = PTE25
  5. FXOS8700Q_acc acc(I2C_SDA, I2C_SCL, FXOS8700CQ_SLAVE_ADDR1);

  6. //USBTX = PTB17
  7. //USBRX = PTB16
  8. Serial pc(USBTX,USBRX);

  9. //LED_RED = PTB22
  10. DigitalOut led(LED_RED);

  11. int main()
  12. {
  13.     MotionSensorDataCounts accData;
  14.     //cc.whoAmI() 读取并检查FXOS8700CQ WHOAMI寄存器
  15.     pc.printf("Who AM I= %X\r\n", acc.whoAmI());
  16.     //开启加速度测量
  17.     acc.enable();
  18.    
  19.     while(1)
  20.     {
  21.         //取3个轴上的加速度值
  22.         acc.getAxis(accData);
  23.         //输出
  24.         pc.printf("X:%d    Y:%d    Z:%d\n",accData.x,accData.y,accData.z);
  25.         //翻转LED
  26.         led = !led;
  27.         //等待1s
  28.         wait(1.0);
  29.     }
  30. }
实验结果:
水平放置开发板的输出值
RESULT.png



 楼主| Ketose 发表于 2015-6-10 10:57 | 显示全部楼层
本帖最后由 Ketose 于 2015-6-10 11:09 编辑

【FRDM-K64F】空中飞鼠 之 模拟鼠标初步
在前一节里我们已经读取了FXOS8700Q的加速度值,这节要用读取出来的值来指挥鼠标动作了。
我们还是要使用mbed,这次要用到USBMouse和RTOS了。
实验目的:
初步实现空中挥舞K64F开发板来指挥鼠标动作。
电路图:
电路图参考上一节的电路,唯一用的是USB的电路如下
QQ图片20150610110313.png
实验代码:


  1. #include "mbed.h"
  2. #include "rtos.h"
  3. #include "FXOS8700Q.h"

  4. #define MOUSE

  5. #ifdef MOUSE
  6. #include "USBMouse.h"
  7. #endif

  8. //I2C_SCL = PTE24  
  9. //I2C_SDA = PTE25
  10. FXOS8700Q_acc acc(I2C_SDA, I2C_SCL, FXOS8700CQ_SLAVE_ADDR1);
  11. //LED_RED = PTB22
  12. DigitalOut led(LED_RED);
  13. DigitalOut led_x(LED_GREEN);
  14. DigitalOut led_y(LED_BLUE);
  15. //加速度数据
  16. MotionSensorDataCounts accData;
  17. //FXOS8700Q静态偏差
  18. int offset_x = 0;
  19. int offset_y = -212;
  20. int offset_z = 203;

  21. int dx,dy;

  22. #ifdef MOUSE
  23. Mutex mtx;
  24. USBMouse mouse;
  25. #else
  26. //USBTX = PTB17
  27. //USBRX = PTB16
  28. Serial pc(USBTX,USBRX);
  29. #endif

  30. #ifdef MOUSE
  31. //X轴移动鼠标
  32. void MouseMoveX(void const* args)
  33. {
  34.     while(1)
  35.     {
  36.         int mx = *((int*)args);
  37.         //静止
  38.         if(abs(mx) <= 1)
  39.         {
  40.             Thread::signal_wait(0xAA);
  41.             continue;
  42.         }
  43.         
  44.         //计算位移方向
  45.         int16_t distance = mx >= 0 ? 1 : -1;
  46.         //进行互斥访问
  47.         mtx.lock();
  48.         mouse.move(distance,0);
  49.         mtx.unlock();
  50.         //等待
  51.         Thread::wait(6 - abs(mx/8));
  52.         led_x = !led_x;
  53.     }
  54. }
  55. //Y轴移动鼠标
  56. void MouseMoveY(void const* args)
  57. {
  58.     while(1)
  59.     {
  60.         int my = *((int*)args);
  61.         if(abs(my) <= 1)
  62.         {
  63.             Thread::signal_wait(0xAA);
  64.             continue;
  65.         }
  66.         
  67.         int16_t distance = my >=0 ? 1 : -1;
  68.         mtx.lock();
  69.         mouse.move(0,distance);
  70.         mtx.unlock();
  71.         Thread::wait(6 - abs(my/8));
  72.         led_y = !led_y;
  73.     }
  74. }
  75. #endif

  76. int main()
  77. {
  78.     #ifdef MOUSE
  79.     Thread tx(&MouseMoveX,&dx);
  80.     Thread ty(&MouseMoveY,&dy);
  81.     #else
  82.     //cc.whoAmI() 读取并检查FXOS8700CQ WHOAMI寄存器
  83.     pc.printf("Who AM I= %X\r\n", acc.whoAmI());
  84.     #endif
  85.    
  86.     //开启加速度测量
  87.     acc.enable();
  88.    
  89.     while(1)
  90.     {
  91.         //取3个轴上的加速度值
  92.         acc.getAxis(accData);
  93.         dx = (accData.x - offset_x) / 100;
  94.         dy = (accData.y - offset_y) / 100;
  95.                
  96.         #ifdef MOUSE
  97.         //判断线程状态,发送信号
  98.         if(tx.get_state() == Thread::WaitingAnd)
  99.                 tx.signal_set(0xAA);
  100.         
  101.         if(ty.get_state() == Thread::WaitingAnd)
  102.                 ty.signal_set(0xAA);
  103.         #else
  104.         //输出
  105.         pc.printf("X:%d    Y:%d\n",dx,dy);
  106.         #endif
  107.         
  108.         //翻转LED
  109.         led = !led;
  110.         //等待1s
  111.         wait(0.0001);
  112.     }
  113. }
实验视频:
本来想用直接看鼠标轨迹的,可是觉得还是用游戏来看更直观。


 楼主| Ketose 发表于 2015-6-10 10:57 | 显示全部楼层
本帖最后由 Ketose 于 2015-6-11 19:20 编辑

【FRDM-K64F】空中飞鼠 之 鼠标按键
上一篇我们利用加速度传感器模拟鼠标移动已经完成,这篇我们要模拟鼠标的按下和释放。
这篇我们要使用mbed中的InterruptIn,中断类来完成按键动作的捕获。
实验目的:
利用K64F开发板的SW2,SW3两个按键来完成鼠标左右键的按键操作。
原理图:
100132b3jvu5303d04u03f.png
实验代码:
  1. #include "mbed.h"
  2. #include "rtos.h"
  3. #include "USBMouse.h"

  4. //USB
  5. USBMouse mouse;
  6. //LED
  7. DigitalOut led_red(LED_RED);
  8. DigitalOut led_green(LED_GREEN);
  9. DigitalOut led_blue(LED_BLUE);
  10. //互斥
  11. Mutex mtx_mouse;
  12. //鼠标操作线程指针
  13. Thread* ptMouseLeftDown;
  14. Thread* ptMouseLeftUp;
  15. Thread* ptMouseRightDown;
  16. Thread* ptMouseRightUp;
  17. //鼠标左健
  18. InterruptIn leftButton(PTC6);
  19. //鼠标右键
  20. InterruptIn rightButton(PTA4);
  21. //led开关宏定义
  22. #define REDLED_ON   (led_red = 0)
  23. #define REDLED_OFF  (led_red = 1)
  24. #define BLUELED_ON  (led_blue = 0)
  25. #define BLUELED_OFF (led_blue = 1)

  26. //鼠标左键按下
  27. void MouseLeftDown(void const* args)
  28. {
  29.     while(1)
  30.     {
  31.         Thread::signal_wait(0xAA);
  32.         //打开LED
  33.         REDLED_ON;
  34.         //按下鼠标
  35.         mtx_mouse.lock();
  36.         mouse.press(MOUSE_LEFT);
  37.         mtx_mouse.unlock();   
  38.     }
  39. }
  40. //鼠标左键释放
  41. void MouseLeftUp(void const* args)
  42. {
  43.     while(1)
  44.     {
  45.         Thread::signal_wait(0xAA);
  46.         //关闭LED
  47.         REDLED_OFF;
  48.         //释放鼠标
  49.         mtx_mouse.lock();
  50.         mouse.release(MOUSE_LEFT);
  51.         mtx_mouse.unlock();   
  52.     }
  53. }
  54. //鼠标右键按下
  55. void MouseRigthDown(void const* args)
  56. {
  57.     while(1)
  58.     {
  59.         Thread::signal_wait(0xAA);
  60.         //打开LED
  61.         BLUELED_ON;
  62.         //按下鼠标
  63.         mtx_mouse.lock();
  64.         mouse.press(MOUSE_RIGHT);
  65.         mtx_mouse.unlock();   
  66.     }
  67. }
  68. //鼠标右键释放
  69. void MouseRigthUp(void const* args)
  70. {
  71.     while(1)
  72.     {
  73.         Thread::signal_wait(0xAA);
  74.         //关闭LED
  75.         BLUELED_OFF;
  76.         //释放鼠标
  77.         mtx_mouse.lock();
  78.         mouse.release(MOUSE_RIGHT);
  79.         mtx_mouse.unlock();   
  80.     }
  81. }

  82. //按钟中断
  83. void LeftButtonRise()
  84. {
  85.     ptMouseLeftUp->signal_set(0xAA);
  86. }
  87. void LeftButtonFall()
  88. {
  89.     ptMouseLeftDown->signal_set(0xAA);
  90. }
  91. void RigthButtonRise()
  92. {
  93.     ptMouseRightUp->signal_set(0xAA);
  94. }
  95. void RightButtonFall()
  96. {
  97.     ptMouseRightDown->signal_set(0xAA);
  98. }

  99. int main()
  100. {
  101.     //初始化线程
  102.     Thread t_mouseLeftDown(&MouseLeftDown);
  103.     Thread t_mouseLeftUp(&MouseLeftUp);
  104.     Thread t_mouseRightDown(&MouseRigthDown);
  105.     Thread t_mouseRightUp(&MouseRigthUp);
  106.     //初始化线程变量
  107.     ptMouseLeftDown = &t_mouseLeftDown;
  108.     ptMouseLeftUp = &t_mouseLeftUp;
  109.     ptMouseRightDown = &t_mouseRightDown;
  110.     ptMouseRightUp = &t_mouseRightUp;
  111.     //初始化中断
  112.     leftButton.rise(&LeftButtonRise);
  113.     leftButton.fall(&LeftButtonFall);
  114.     rightButton.rise(&RigthButtonRise);
  115.     rightButton.fall(&RightButtonFall);
  116.    
  117.     //主循环
  118.     while(1)
  119.     {
  120.         //翻转LED
  121.         led_green = !led_green;
  122.         wait(0.5);
  123.     }
  124. }
代码做了详细注释,大家应该都看得懂,我就不多说了。
实验总结:
最后结果本来想上个视频啊什么的,给大看直观的结果,可是实在是不好操作。
感觉兴趣的朋友可以自己在mbed里实验。

打赏榜单

21ic小喇叭 打赏了 35.00 元 2015-06-15

 楼主| Ketose 发表于 2015-6-10 10:58 | 显示全部楼层
占楼,更新专用。
 楼主| Ketose 发表于 2015-6-10 10:58 | 显示全部楼层
占楼,更新专用。
21ic小喇叭 发表于 2015-6-10 17:12 | 显示全部楼层
等更新~  
 楼主| Ketose 发表于 2015-6-11 00:22 | 显示全部楼层

已经更新两篇了。
lcwhg 发表于 2015-6-11 10:57 | 显示全部楼层
学习中,不断学习,不断积累。
han0097 发表于 2015-6-11 14:39 | 显示全部楼层
不错不错,不过感觉不够灵敏呀!
lkl0305 发表于 2015-6-11 17:26 | 显示全部楼层
厉害,学习
 楼主| Ketose 发表于 2015-6-11 19:23 | 显示全部楼层
han0097 发表于 2015-6-11 14:39
不错不错,不过感觉不够灵敏呀!

想灵每,加大distance,慢慢加大,看看效果。
//计算位移方向
int16_t distance = mx >= 0 ? 1 : -1;
michael_llh 发表于 2015-6-12 01:28 | 显示全部楼层
问下楼主,原理图是用什么软件画?
 楼主| Ketose 发表于 2015-6-12 06:56 | 显示全部楼层
michael_llh 发表于 2015-6-12 01:28
问下楼主,原理图是用什么软件画?

原理图是厂家画的。我也不知道。
 楼主| Ketose 发表于 2015-6-12 06:57 | 显示全部楼层
michael_llh 发表于 2015-6-12 11:52 | 显示全部楼层
Ketose 发表于 2015-6-12 06:56
原理图是厂家画的。我也不知道。

这样啊,谢谢了
fjjjnk1234 发表于 2015-6-13 20:06 | 显示全部楼层
michael_llh 发表于 2015-6-12 01:28
问下楼主,原理图是用什么软件画?

Cadence Allegro
michael_llh 发表于 2015-6-14 00:39 | 显示全部楼层
小猫爱吃鱼 发表于 2015-6-14 20:40 | 显示全部楼层
这个上位机软件也是自己开发的吗
SLHSu37 发表于 2015-6-15 08:07 | 显示全部楼层
串口助手貌似STC下载软件··········
仙女山 发表于 2015-6-15 09:19 | 显示全部楼层
楼主的资料是太有用了,谢谢分享
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:我最讨厌两种人:一是有种族歧视的; 二是黑人;三是不识数的!

66

主题

3267

帖子

15

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