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

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

[复制链接]
5399|23
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Ketose|  楼主 | 2015-6-10 10:56 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式
【FRDM-K64F】空中飞鼠 之 读FXOS8700Q加速度值
在飞思卡尔社区拿到论坛里送的K64F了。这几天初步研究了下,为了快速实现还是用mbed吧,我懒得去啃英文资料了。还是站在别人肩膀上吧
今天试验了下mbed封装的FXOS8700Q库,好用简单。废话不多说开始吧
实验目的:
每隔一秒从FXOS8700Q传感器上读出X,Y,Z轴上的加速度值,并通过串口在电脑上显示出来。同时反转RGB的红色小灯。
电路图:
1、RGB LED

2、FXOS8700

3、UART串口

实验代码:
#include "mbed.h"
#include "FXOS8700Q.h"

//I2C_SCL = PTE24  
//I2C_SDA = PTE25
FXOS8700Q_acc acc(I2C_SDA, I2C_SCL, FXOS8700CQ_SLAVE_ADDR1);

//USBTX = PTB17
//USBRX = PTB16
Serial pc(USBTX,USBRX);

//LED_RED = PTB22
DigitalOut led(LED_RED);

int main()
{
    MotionSensorDataCounts accData;
    //cc.whoAmI() 读取并检查FXOS8700CQ WHOAMI寄存器
    pc.printf("Who AM I= %X\r\n", acc.whoAmI());
    //开启加速度测量
    acc.enable();
   
    while(1)
    {
        //取3个轴上的加速度值
        acc.getAxis(accData);
        //输出
        pc.printf("X:%d    Y:%d    Z:%d\n",accData.x,accData.y,accData.z);
        //翻转LED
        led = !led;
        //等待1s
        wait(1.0);
    }
}
实验结果:
水平放置开发板的输出值




相关帖子

沙发
Ketose|  楼主 | 2015-6-10 10:57 | 只看该作者
本帖最后由 Ketose 于 2015-6-10 11:09 编辑

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

实验代码:


#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);
    }
}
实验视频:
本来想用直接看鼠标轨迹的,可是觉得还是用游戏来看更直观。


使用特权

评论回复
板凳
Ketose|  楼主 | 2015-6-10 10:57 | 只看该作者
本帖最后由 Ketose 于 2015-6-11 19:20 编辑

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

实验代码:
#include "mbed.h"
#include "rtos.h"
#include "USBMouse.h"

//USB
USBMouse mouse;
//LED
DigitalOut led_red(LED_RED);
DigitalOut led_green(LED_GREEN);
DigitalOut led_blue(LED_BLUE);
//互斥
Mutex mtx_mouse;
//鼠标操作线程指针
Thread* ptMouseLeftDown;
Thread* ptMouseLeftUp;
Thread* ptMouseRightDown;
Thread* ptMouseRightUp;
//鼠标左健
InterruptIn leftButton(PTC6);
//鼠标右键
InterruptIn rightButton(PTA4);
//led开关宏定义
#define REDLED_ON   (led_red = 0)
#define REDLED_OFF  (led_red = 1)
#define BLUELED_ON  (led_blue = 0)
#define BLUELED_OFF (led_blue = 1)

//鼠标左键按下
void MouseLeftDown(void const* args)
{
    while(1)
    {
        Thread::signal_wait(0xAA);
        //打开LED
        REDLED_ON;
        //按下鼠标
        mtx_mouse.lock();
        mouse.press(MOUSE_LEFT);
        mtx_mouse.unlock();   
    }
}
//鼠标左键释放
void MouseLeftUp(void const* args)
{
    while(1)
    {
        Thread::signal_wait(0xAA);
        //关闭LED
        REDLED_OFF;
        //释放鼠标
        mtx_mouse.lock();
        mouse.release(MOUSE_LEFT);
        mtx_mouse.unlock();   
    }
}
//鼠标右键按下
void MouseRigthDown(void const* args)
{
    while(1)
    {
        Thread::signal_wait(0xAA);
        //打开LED
        BLUELED_ON;
        //按下鼠标
        mtx_mouse.lock();
        mouse.press(MOUSE_RIGHT);
        mtx_mouse.unlock();   
    }
}
//鼠标右键释放
void MouseRigthUp(void const* args)
{
    while(1)
    {
        Thread::signal_wait(0xAA);
        //关闭LED
        BLUELED_OFF;
        //释放鼠标
        mtx_mouse.lock();
        mouse.release(MOUSE_RIGHT);
        mtx_mouse.unlock();   
    }
}

//按钟中断
void LeftButtonRise()
{
    ptMouseLeftUp->signal_set(0xAA);
}
void LeftButtonFall()
{
    ptMouseLeftDown->signal_set(0xAA);
}
void RigthButtonRise()
{
    ptMouseRightUp->signal_set(0xAA);
}
void RightButtonFall()
{
    ptMouseRightDown->signal_set(0xAA);
}

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

使用特权

评论回复

打赏榜单

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

地板
Ketose|  楼主 | 2015-6-10 10:58 | 只看该作者
占楼,更新专用。

使用特权

评论回复
5
Ketose|  楼主 | 2015-6-10 10:58 | 只看该作者
占楼,更新专用。

使用特权

评论回复
6
21ic小喇叭| | 2015-6-10 17:12 | 只看该作者
等更新~  

使用特权

评论回复
7
Ketose|  楼主 | 2015-6-11 00:22 | 只看该作者

已经更新两篇了。

使用特权

评论回复
8
lcwhg| | 2015-6-11 10:57 | 只看该作者
学习中,不断学习,不断积累。

使用特权

评论回复
9
han0097| | 2015-6-11 14:39 | 只看该作者
不错不错,不过感觉不够灵敏呀!

使用特权

评论回复
10
lkl0305| | 2015-6-11 17:26 | 只看该作者
厉害,学习

使用特权

评论回复
11
Ketose|  楼主 | 2015-6-11 19:23 | 只看该作者
han0097 发表于 2015-6-11 14:39
不错不错,不过感觉不够灵敏呀!

想灵每,加大distance,慢慢加大,看看效果。
//计算位移方向
int16_t distance = mx >= 0 ? 1 : -1;

使用特权

评论回复
12
michael_llh| | 2015-6-12 01:28 | 只看该作者
问下楼主,原理图是用什么软件画?

使用特权

评论回复
13
Ketose|  楼主 | 2015-6-12 06:56 | 只看该作者
michael_llh 发表于 2015-6-12 01:28
问下楼主,原理图是用什么软件画?

原理图是厂家画的。我也不知道。

使用特权

评论回复
14
Ketose|  楼主 | 2015-6-12 06:57 | 只看该作者

已经更新三篇。

使用特权

评论回复
15
michael_llh| | 2015-6-12 11:52 | 只看该作者
Ketose 发表于 2015-6-12 06:56
原理图是厂家画的。我也不知道。

这样啊,谢谢了

使用特权

评论回复
16
fjjjnk1234| | 2015-6-13 20:06 | 只看该作者
michael_llh 发表于 2015-6-12 01:28
问下楼主,原理图是用什么软件画?

Cadence Allegro

使用特权

评论回复
17
michael_llh| | 2015-6-14 00:39 | 只看该作者
ok

使用特权

评论回复
18
小猫爱吃鱼| | 2015-6-14 20:40 | 只看该作者
这个上位机软件也是自己开发的吗

使用特权

评论回复
19
SLHSu37| | 2015-6-15 08:07 | 只看该作者
串口助手貌似STC下载软件··········

使用特权

评论回复
20
仙女山| | 2015-6-15 09:19 | 只看该作者
楼主的资料是太有用了,谢谢分享

使用特权

评论回复
发新帖 本帖赏金 35.00元(功能说明)我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

64

主题

3211

帖子

15

粉丝