在线时间434 小时
UID3066878
注册时间2014-12-11
NXP金币0
TA的每日心情 | 奋斗 2017-5-3 11:19 |
---|
签到天数: 10 天 连续签到: 1 天 [LV.3]偶尔看看II
金牌会员
 
- 积分
- 14090
- 最后登录
- 2024-4-19
|
在前一贴里我们已经读取了FXOS8700Q的加速度值,这节要用读取出来的值来指挥鼠标动作了。
我们还是要使用mbed,这次要用到USBMouse和RTOS了。
实验目的:
初步实现空中挥舞K64F开发板来指挥鼠标动作。
电路图:
参见:https://www.nxpic.org.cn/module/forum/thread-599459-1-1.html 这一贴,我懒得贴图了。
实验代码:
- #include "mbed.h"
- #include "rtos.h"
- #include "FXOS8700Q.h"
- #define MOUSE
- #ifdef MOUSE
- #include "USBMouse.h"
- #endif
- //I2C_SCL = PTE24
- //I2C_SDA = PTE25
- FXOS8700Q_acc acc(I2C_SDA, I2C_SCL, FXOS8700CQ_SLAVE_ADDR1);
- //LED_RED = PTB22
- DigitalOut led(LED_RED);
- DigitalOut led_x(LED_GREEN);
- DigitalOut led_y(LED_BLUE);
- //加速度数据
- MotionSensorDataCounts accData;
- //FXOS8700Q静态偏差
- int offset_x = 0;
- int offset_y = -212;
- int offset_z = 203;
- int dx,dy;
- #ifdef MOUSE
- Mutex mtx;
- USBMouse mouse;
- #else
- //USBTX = PTB17
- //USBRX = PTB16
- Serial pc(USBTX,USBRX);
- #endif
- #ifdef MOUSE
- //X轴移动鼠标
- void MouseMoveX(void const* args)
- {
- while(1)
- {
- int mx = *((int*)args);
- //静止
- if(abs(mx) <= 1)
- {
- Thread::signal_wait(0xAA);
- continue;
- }
-
- //计算位移方向
- int16_t distance = mx >= 0 ? 1 : -1;
- //进行互斥访问
- mtx.lock();
- mouse.move(distance,0);
- mtx.unlock();
- //等待
- Thread::wait(6 - abs(mx/8));
- led_x = !led_x;
- }
- }
- //Y轴移动鼠标
- void MouseMoveY(void const* args)
- {
- while(1)
- {
- int my = *((int*)args);
- if(abs(my) <= 1)
- {
- Thread::signal_wait(0xAA);
- continue;
- }
-
- int16_t distance = my >=0 ? 1 : -1;
- mtx.lock();
- mouse.move(0,distance);
- mtx.unlock();
- Thread::wait(6 - abs(my/8));
- led_y = !led_y;
- }
- }
- #endif
- int main()
- {
- #ifdef MOUSE
- Thread tx(&MouseMoveX,&dx);
- Thread ty(&MouseMoveY,&dy);
- #else
- //cc.whoAmI() 读取并检查FXOS8700CQ WHOAMI寄存器
- pc.printf("Who AM I= %X\r\n", acc.whoAmI());
- #endif
-
- //开启加速度测量
- acc.enable();
-
- while(1)
- {
- //取3个轴上的加速度值
- acc.getAxis(accData);
- dx = (accData.x - offset_x) / 100;
- dy = (accData.y - offset_y) / 100;
-
- #ifdef MOUSE
- //判断线程状态,发送信号
- if(tx.get_state() == Thread::WaitingAnd)
- tx.signal_set(0xAA);
-
- if(ty.get_state() == Thread::WaitingAnd)
- ty.signal_set(0xAA);
- #else
- //输出
- pc.printf("X:%d Y:%d\n",dx,dy);
- #endif
-
- //翻转LED
- led = !led;
- //等待1s
- wait(0.0001);
- }
- }
复制代码 实验视频:
本来想用直接看鼠标轨迹的,可是觉得还是用游戏来看更直观。
|
|