查看: 9145|回复: 18

[原创] 显示加速度和磁力传感器值实时曲线,附VB源码

[复制链接]

该用户从未签到

1

主题

3

帖子

0

新手上路

Rank: 1

积分
31
最后登录
2016-7-16
发表于 2015-12-3 15:36:16 | 显示全部楼层 |阅读模式
本帖最后由 Frdm307 于 2015-12-3 15:40 编辑

第一次帖子,弄得不好的地方,小编多包涵。发这个帖子的原因主要有2个
1.看了@wambob 的文章:https://www.nxpic.org.cn/module/forum/forum.php?mod=viewthread&tid=599763&highlight=frdm-k64
   下载了mbed中的 Hello_FXOS8700Q 例程,觉得不太过瘾,没有曲线,不够直观
2.想把上位机 串口读数据和绘制实时曲线的方法和大家分享一下,共同学习,基于直观的实时曲线,促使大家对FXOS8700CQ传感器开发一些有趣的应用
基于FRDM-K64F板子,我所做的工作有2个部分,如下:
1. Hello_FXOS8700Q 例程中,printf语句太多,main.cpp修改如下:
  1. #include "mbed.h"
  2. #include "FXOS8700Q.h"
  3. //FXOS8700Q acc( A4, A5, FXOS8700CQ_SLAVE_ADDR0); // Proper Ports and I2C address for Freescale Multi Axis shield
  4. //FXOS8700Q mag( A4, A5, FXOS8700CQ_SLAVE_ADDR0); // Proper Ports and I2C address for Freescale Multi Axis shield
  5. FXOS8700Q_acc acc( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board
  6. FXOS8700Q_mag mag( PTE25, PTE24, FXOS8700CQ_SLAVE_ADDR1); // Proper Ports and I2C Address for K64F Freedom board

  7. Serial pc(USBTX, USBRX);

  8. MotionSensorDataUnits mag_data;
  9. MotionSensorDataUnits acc_data;

  10. MotionSensorDataCounts mag_raw;
  11. MotionSensorDataCounts acc_raw;


  12. int main() {
  13. float faX, faY, faZ;
  14. float fmX, fmY, fmZ;
  15. int16_t raX, raY, raZ;
  16. int16_t rmX, rmY, rmZ;
  17. acc.enable();
  18. //pc.printf("\r\n\nFXOS8700Q Who Am I= %X\r\n", acc.whoAmI());
  19.     while (true) {/*
  20.         acc.getAxis(acc_data);
  21.         mag.getAxis(mag_data);
  22.         pc.printf("ACC: X=%1.4f Y=%1.4f Z=%1.4f ", acc_data.x, acc_data.y, acc_data.z);
  23.         pc.printf("MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", mag_data.x, mag_data.y, mag_data.z);
  24.         acc.getX(&faX);
  25.         acc.getY(&faY);
  26.         acc.getZ(&faZ);
  27.         mag.getX(&fmX);
  28.         mag.getY(&fmY);
  29.         mag.getZ(&fmZ);
  30.         pc.printf("ACC: X=%1.4f Y=%1.4f Z=%1.4f ", faX, faY, faZ);
  31.         pc.printf("MAG: X=%4.1f Y=%4.1f Z=%4.1f\r\n", fmX, fmY, fmZ);
  32.         acc.getAxis(acc_raw);
  33.         mag.getAxis(mag_raw);
  34.         pc.printf("ACC: X=%d    Y=%d    Z=%d ", acc_raw.x, acc_raw.y, acc_raw.z);
  35.         pc.printf("MAG: X=%d    Y=%d    Z=%d\r\n", mag_raw.x, mag_raw.y, mag_raw.z);*/
  36.         acc.getX(&raX);
  37.         acc.getY(&raY);
  38.         acc.getZ(&raZ);
  39.         mag.getX(&rmX);
  40.         mag.getY(&rmY);
  41.         mag.getZ(&rmZ);               
  42. pc.printf("FF ACC: X=%d   Y=%d    Z=%d MAG: X=%d  Y=%d  Z=%d EE", raX, raY, raZ,rmX, rmY, rmZ);
  43.          
  44.         wait(0.5);
  45.     }
  46. }
复制代码
我只保留了一句printf,用于从串口输出ACC和MAG,为了确保串口接收字符串的完整性,我用FF和EE来识别整串字符串。
2.上位机用VB编写,MSCOMM串口控件。代码关键点介绍如下:
  1. Private Sub DrawACCMAG(x As Single, y As Single, z As Single)
  2. Dim wd As Integer
  3. Dim maxv As Integer
  4. maxv = 5000
  5. If OptMag.Value Then
  6. maxv = 3000
  7. End If
  8. wd = 30
  9. '确保不会超过最大值,ACC设为-5000 5000,MAG设为-3000  3000
  10. x = IIf(x > maxv, maxv, x) '[-maxv  maxv]
  11. y = IIf(y > maxv, maxv, y)
  12. z = IIf(z > maxv, maxv, z)
  13. x = IIf(x < -maxv, -maxv, x)
  14. y = IIf(y < -maxv, -maxv, y)
  15. z = IIf(z < -maxv, -maxv, z)
  16. xpos = xpos + wd
  17. '新点位置尚未到达图框边缘,则顺序往后画线条
  18. If xpos <= Pic2.ScaleWidth Then
  19.     Pic2.PSet (xpos - wd, PreYpos_x), vbRed
  20.     PreYpos_x = x + maxv
  21.     Pic2.Line -(xpos, PreYpos_x), vbRed
  22.     Pic2.PSet (xpos - wd, PreYpos_y), vbGreen
  23.     PreYpos_y = y + Max
  24.     Pic2.Line -(xpos, PreYpos_y), vbGreen
  25.     Pic2.PSet (xpos - wd, PreYpos_z), vbBlue
  26.     PreYpos_z = z + maxv
  27.     Pic2.Line -(xpos, PreYpos_z), vbBlue
  28. Else
  29. '新点位值已到达图框边缘,则往前移动一帧,并将新点画到图框最后
  30. Pic1.PaintPicture Pic2.Image, 0, 0, Pic1.ScaleWidth, Pic1.ScaleHeight, 0, 0, Pic1.ScaleWidth, Pic1.ScaleHeight '复制pic2
  31. Pic2.PaintPicture Pic1.Image, 0, 0, Pic1.ScaleWidth - wd, Pic1.ScaleHeight, wd, 0, Pic1.ScaleWidth - wd, Pic1.ScaleHeight 'pic2左移30
  32. Pic1.PaintPicture Pic3.Image, 0, 0, Pic1.ScaleWidth, Pic1.ScaleHeight, 0, 0, Pic1.ScaleWidth, Pic1.ScaleHeight ' pic1 去line
  33. Pic1.PSet (0, PreYpos_x), vbRed
  34. PreYpos_x = x + maxv
  35. Pic1.Line -(wd, PreYpos_x), vbRed
  36. Pic1.PSet (0, PreYpos_y), vbGreen
  37. PreYpos_y = y + maxv
  38. Pic1.Line -(wd, PreYpos_y), vbGreen
  39. Pic1.PSet (0, PreYpos_z), vbBlue
  40. PreYpos_z = z + maxv
  41. Pic1.Line -(wd, PreYpos_z), vbBlue

  42. Pic2.PaintPicture Pic1.Image, Pic2.ScaleWidth - wd, 0, wd, Pic2.ScaleHeight, 0, 0, wd, Pic1.ScaleHeight

  43. End If
  44. End Sub
复制代码
主要思路是采用PaintPicture 方法,对pic2进行剪切移动,实现实时曲线的效果(类似任务管理器中的实时曲线)
  1. '====================================================================================
  2. '                 文本接收

  3. '====================================================================================
  4. Private Sub textReceive()

  5. Dim str As String
  6. Dim ffpos, eepos As Integer
  7. On Error GoTo Err
  8.     InputSignal = MSComm1.Input
  9.      

  10.     Text1.Text = Text1.Text & InputSignal
  11.      ffpos = InStr(1, Text1.Text, "FF")
  12.      If ffpos <> 0 Then eepos = InStr(ffpos, Text1.Text, "EE")
  13.      If ffpos > 0 And eepos > 0 Then
  14.         MSComm1.RThreshold = 0
  15.         str = Mid(Text1.Text, ffpos, eepos + 2)
  16.          GetPointsFormstr str'用FF  EE截取完整字符串送给数值提取函数
  17.          
  18.          Text1.Text = ""
  19.      End If
  20.      
  21. Err:
  22.             
  23. End Sub
复制代码
效果与应用截图:

串口曲线1

串口曲线1


之前我也一直对于FRDM-K64的串口使用迷惑,后来发现只要安装了最新的mbed驱动,插到opensda口插入USB后自己会虚拟一个串口,上位机配置成这个串口号即可收到printf语句发送的字符。和我之前对串口的理解很不一样,之前我都是用虚拟串口助手将2个串口对接,而这货居然可以自己发自己收。附上mbed最新驱动
串口曲线2.jpg


上位机源码、IAR版源码:
串口实时曲线.rar (15.56 KB, 下载次数: 18)
回复

使用道具 举报

  • TA的每日心情
    擦汗
    昨天 09:37
  • 签到天数: 2116 天

    连续签到: 5 天

    [LV.Master]伴坛终老

    65

    主题

    8475

    帖子

    1

    金牌会员

    Rank: 6Rank: 6

    积分
    14341
    最后登录
    2025-9-5
    发表于 2015-12-3 16:01:32 | 显示全部楼层
    很值得学习,多谢
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    3

    主题

    555

    帖子

    2

    金牌会员

    Rank: 6Rank: 6

    积分
    1343
    最后登录
    2018-10-23
    发表于 2015-12-3 19:23:00 | 显示全部楼层
    谢谢分享     
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    昨天 22:00
  • 签到天数: 2498 天

    连续签到: 30 天

    [LV.Master]伴坛终老

    17

    主题

    5503

    帖子

    5

    金牌会员

    Rank: 6Rank: 6

    积分
    11473
    最后登录
    2025-9-5
    发表于 2015-12-3 19:59:14 | 显示全部楼层
    谢谢分享,学习了。。。
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    奋斗
    2025-5-7 09:07
  • 签到天数: 353 天

    连续签到: 1 天

    [LV.8]以坛为家I

    141

    主题

    8056

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    5788
    最后登录
    2025-5-7
    发表于 2015-12-3 20:41:20 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2018-7-23 21:04
  • 签到天数: 103 天

    连续签到: 1 天

    [LV.6]常住居民II

    228

    主题

    5379

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    16864
    最后登录
    1970-1-1
    发表于 2015-12-3 21:40:03 | 显示全部楼层
    不错,这个串口软件也挺好的
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2020-5-24 10:39
  • 签到天数: 1 天

    连续签到: 1 天

    [LV.1]初来乍到

    140

    主题

    2087

    帖子

    0

    金牌会员

    Rank: 6Rank: 6

    积分
    3913
    最后登录
    2020-5-24
    发表于 2015-12-3 23:12:07 | 显示全部楼层
    串口软件不错,可以绘制曲线
    该会员没有填写今日想说内容.
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2024-1-6 07:38
  • 签到天数: 736 天

    连续签到: 1 天

    [LV.9]以坛为家II

    21

    主题

    3486

    帖子

    6

    金牌会员

    Rank: 6Rank: 6

    积分
    5093
    最后登录
    2024-1-7
    发表于 2015-12-4 08:38:50 | 显示全部楼层
    谢谢分享
    该会员没有填写今日想说内容.
    回复

    使用道具 举报

    该用户从未签到

    9

    主题

    642

    帖子

    0

    高级会员

    Rank: 4

    积分
    748
    最后登录
    1970-1-1
    发表于 2015-12-4 08:43:41 | 显示全部楼层
    感谢分享
    104930kli5jsmlssemljli.png
    回复

    使用道具 举报

    该用户从未签到

    2

    主题

    14

    帖子

    0

    注册会员

    Rank: 2

    积分
    96
    最后登录
    2017-8-8
    发表于 2015-12-4 12:03:19 | 显示全部楼层
    谢谢分享
    回复

    使用道具 举报

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

    本版积分规则

    关闭

    站长推荐上一条 /3 下一条

    Archiver|手机版|小黑屋|恩智浦技术社区

    GMT+8, 2025-9-6 14:34 , Processed in 0.116835 second(s), 29 queries , MemCache On.

    Powered by Discuz! X3.4

    Copyright © 2001-2024, Tencent Cloud.

    快速回复 返回顶部 返回列表