[技术问题解答] 显示加速度和磁力传感器值实时曲线

[复制链接]
1415|3
 楼主| 小猫爱吃鱼 发表于 2015-12-5 20:20 | 显示全部楼层 |阅读模式
基于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来识别整串字符串。
 楼主| 小猫爱吃鱼 发表于 2015-12-5 20:23 | 显示全部楼层
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


 楼主| 小猫爱吃鱼 发表于 2015-12-5 20:25 | 显示全部楼层
主要思路是采用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
 楼主| 小猫爱吃鱼 发表于 2015-12-5 20:28 | 显示全部楼层
果与应用截图:


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




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

本版积分规则

33

主题

294

帖子

2

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