兴趣之余,利用晚上的时间,做一些个人兴趣方面的开发. 之前没接触过 arduino, 无意之中买了个开发板做一些小开发, 这里利用python 读取 mpu9250 数据实时绘图.

下位机代码 C++

void Serial_SendDataPython( int16_t *sendData, uint8_t lens )
{
uint8_t tmpData[] = {}; // tmpData lens >= 2 * lens + 4
uint8_t *ptrData = tmpData;
uint8_t dataBytes = lens << ;
uint8_t dataLens = dataBytes + ;
uint8_t count = ;
uint16_t tmpSum = ; tmpData[] = 'S';
while(count < dataBytes) {
// tmpData[count+1] = Byte8H(sendData[count >> 1]);
// tmpData[count+2] = Byte8L(sendData[count >> 1]); tmpData[count+] = (sendData[count >> ])>>;
tmpData[count+] = (sendData[count >> ])&0x00ff; ;
count = count + ;
}
for(uint8_t i = ; i < dataBytes; i++)
tmpSum += tmpData[i+];
tmpData[dataLens - ] = (uint8_t)(tmpSum & 0x00FF);
tmpData[dataLens - ] = '\r';
tmpData[dataLens - ] = '\n'; do {
//Serial_SendByte(*ptrData++);
Serial.write(*ptrData++);
} while(--dataLens);
} .................................... IMU_Buf[] = testLostRate++;
MU_Buf[] = ax/;
IMU_Buf[] = ay/;
IMU_Buf[] = az/;
IMU_Buf[] = gx/;
IMU_Buf[] = gy/;
IMU_Buf[] = gz/;
IMU_Buf[] = mx/;
IMU_Buf[] = my/;
IMU_Buf[] = mz/;
Serial_SendDataMATLAB(IMU_Buf, ); .................................................

这里简要说明一下, 发送数据以'S'开头,传感器数据分低8位和高8位数据分别发送,最后以换行符结尾.

 """
ldr.py
http://electronut.in/plotting-real-time-data-from-arduino-using-python/
Display analog data from Arduino using Python (matplotlib) Author: Mahesh Venkitachalam
Website: electronut.in
"""
import ctypes
import sys, serial, argparse
import numpy as np
from time import sleep
from collections import deque import matplotlib.pyplot as plt
import matplotlib.animation as animation # plot class
class AnalogPlot:
# constr
def __init__(self, strPort, maxLen):
# open serial port
self.ser = serial.Serial(strPort, ) self.ax = deque([0.0]*maxLen)
self.ay = deque([0.0]*maxLen)
self.az = deque([0.0]*maxLen)
self.gx = deque([0.0]*maxLen)
self.gy = deque([0.0]*maxLen)
self.gz = deque([0.0]*maxLen)
self.mx = deque([0.0]*maxLen)
self.my = deque([0.0]*maxLen)
self.mz = deque([0.0]*maxLen)
self.maxLen = maxLen # add to buffer
def addToBuf(self, buf, val):
if len(buf) < self.maxLen:
buf.append(val)
else:
buf.pop()
buf.appendleft(val) # add data
def add(self, data):
assert(len(data) == )
self.addToBuf(self.ax, data[])
self.addToBuf(self.ay, data[])
self.addToBuf(self.az, data[])
self.addToBuf(self.gx, data[])
self.addToBuf(self.gy, data[])
self.addToBuf(self.gz, data[])
self.addToBuf(self.mx, data[])
self.addToBuf(self.my, data[])
self.addToBuf(self.mz, data[])
# update plot
def update(self,frameNum,a0,a1,a2,a3,a4,a5,a6,a7,a8):
try:
data = self.ser.readline()
length = len(data)
if length == and ord(data[])== :
count = (ord(data[])<<)+ord(data[])
value = (ord(data[])<<)+ord(data[])
ax = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
ay = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
az = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
gx = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
gy = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
gz = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
mx = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
my = ctypes.c_int16(value).value
value = (ord(data[])<<)+ord(data[])
mz = ctypes.c_int16(value).value array = [ax,ay,az,gx,gy,gz,mx,my,mz]
print array
self.add(array)
a0.set_data(range(self.maxLen), self.ax)
a1.set_data(range(self.maxLen), self.ay)
a2.set_data(range(self.maxLen), self.az)
a3.set_data(range(self.maxLen), self.gx)
a4.set_data(range(self.maxLen), self.gy)
a5.set_data(range(self.maxLen), self.gz)
a6.set_data(range(self.maxLen), self.mx)
a7.set_data(range(self.maxLen), self.my)
a8.set_data(range(self.maxLen), self.mz)
except KeyboardInterrupt:
print('exiting') return a0, # clean up
def close(self):
# close serial
self.ser.flush()
self.ser.close() # main() function
def main():
# create parser
#parser = argparse.ArgumentParser(description="LDR serial")
# add expected arguments
#parser.add_argument('--port', dest='port', required=True) # parse args
#args = parser.parse_args() strPort = 'COM3'
#strPort = args.port print('reading from serial port %s...' % strPort) # plot parameters
analogPlot = AnalogPlot(strPort, ) print('plotting data...') # set up animation
fig = plt.figure()
ax = plt.axes(xlim=(, ), ylim=(-, ))
a0, = ax.plot([], [])
a1, = ax.plot([], [])
a2, = ax.plot([], [])
a3, = ax.plot([], [])
a4, = ax.plot([], [])
a5, = ax.plot([], [])
a6, = ax.plot([], [])
a7, = ax.plot([], [])
a8, = ax.plot([], [])
anim = animation.FuncAnimation(fig, analogPlot.update,
fargs=(a0,a1,a2,a3,a4,a5,a6,a7,a8),
interval=) # show plot
plt.show() # clean up
analogPlot.close() print('exiting.') # call main
if __name__ == '__main__':
main()

运行结果如下图:

从互联网搜索了一下,可以串口绘图的工具很多,试了一下 SerialChart工具,感觉还不错,界面如下:

下位机数据格式较简单:

interval(两次数据获取时间间隔,可设置为0),ax,ay,az 为int 类型,

Serial.print(interval); //microseconds since last sample, please note that printing more data will increase interval
Serial.print(",");
Serial.print(ax); //Inclination X axis (as measured by accelerometer)
Serial.print(",");
Serial.print(ay); //Inclination X axis (estimated / filtered)
Serial.print(",");
Serial.print(az); //Inclination X axis (estimated / filtered)

Serial.println("");

具体使用方法请参见官方网站: https://en.wikiversity.org/wiki/SerialChart_Tutorial  ,这里有详细说明和配置方法.

总结: 利用 python 读取seria 数据似乎效率不怎么高, 和之前matlab 测试遇到的情况情况类似,容易出现卡顿的情况. 下篇博客我将会介绍数据可视化工具 Processing在这方便的用途和代码.

参考,引用:

http://electronut.in/plotting-real-time-data-from-arduino-using-python/

https://en.wikiversity.org/wiki/SerialChart_Tutorial

arduino 串口实时绘图(以mpu9250为例)的更多相关文章

  1. C# zedgraph利用另一窗口取得的串口数据绘图

    C# zedgraph利用另一窗口获得的串口数据绘图第一次用zedgraph,非常不熟悉,网上很多内容看的云里雾里... 这个程序主界面接收串口数据,而另外一个窗口进行实时曲线绘图,要怎么样实现for ...

  2. WPF 实时绘图的逻辑

    实时绘图实际上是两个线程.外部线程直接用thread,只有到绘图那个逻辑才用绘图控件的mycanvas2.Dispatcher.Invoke. 或者说,INVOKE并不是开线程,只是一个绘图的委托而已 ...

  3. Arduino 串口通讯参考笔记 - Serial 类库及相关函数介绍

    声明: 本ID发布的所有文章及随笔均为原创,可随意转载,单转载文章必须注明作者 aiyauto 及包含原文出处地址 http://www.cnblogs.com/aiyauto/p/7071712.h ...

  4. win10上使用php与python实现与arduino串口通信

    注意: php 需要php7,安装及开启php_dio.dll com口按照实际的进行设置,如果不知道可以打开arduino编辑器进行查看 可以与用户实现命令行交互,但是效率过慢,不清楚如何优化,使用 ...

  5. Arduino串口的一些高级用法

    1.配置串口通信数据位.校验位.停止位通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率.而使用Serial.begin(speed, config) ...

  6. Arduino 串口的一些高级用法

    来源: 1.配置串口通信数据位.校验位.停止位 通常我们使用Serial.begin(speed)来完成串口的初始化,这种方式,只能配置串口的波特率. 而使用Serial.begin(speed, c ...

  7. Arduino - 串口操作函数与示例代码大全

    来源:https://blog.csdn.net/iracer/article/details/50334041 Arduino - 串口操作函数与示例代码大全 本文总结了Arduino常用串口操作函 ...

  8. ASCIITable: 演示 Arduino 串口输出的进阶功能

    原文地址 - https://www.arduino.cc/en/Tutorial/ASCIITable ASCII字符表 本例展示了高级的串口打印功能,通过本功能可以在Arduino软件(IDE)的 ...

  9. 修改Arduino串口缓冲区大小(转)

    本帖节选自<Arduino程序设计基础>第二版5.1.6串口缓冲区       在之前的示例程序中,我们都是采用人工输入测试数据的方式检验程序效果,Arduino每接收到一次数据,就会将数 ...

随机推荐

  1. jquery.extend方法

    jquery.extend()用来扩展jquery中方法,实现插件. 1.jQuery.extend函数详细用法! 扩展jQuery静态方法. 1$.extend({ 2test:function() ...

  2. iOS 源代码管理工具之SVN

    源代码管理工具之SVN 源代码管理工具SVN是一款非常强大的源代码管理工具,现在国内70%-90%的公司都在使用SVN来管理源代码,下面就让小编给大家着重介绍一下SVN的使用,SVN的使用主要分为下面 ...

  3. 重装Ubuntu16.04及安装theano

    一.卸载现有的ubuntu系统 1.下载MbrFix,并放在C盘根目录. 2.管理员身份运行cmd命令符:切换到C盘根目录,然后输入命令符MbrFix /drive 0 fixmbr,回车确认即可. ...

  4. 二叉树[C实现]

    #include<stdio.h> #include<malloc.h> #include<iostream> //定义节点 typedef struct BiNo ...

  5. R语言实现 广义加性模型 Generalized Additive Models(GAM) 入门

    转载请说明. R语言官网:http://www.r-project.org/ R语言软件下载:http://ftp.ctex.org/mirrors/CRAN/         注:下载时点击 ins ...

  6. wget命令详解

    1.使用wget下载单个文件 以下的例子是从网络下载一个文件并保存在当前目录 wget http://cn.wordpress.org/wordpress-3.1-zh_CN.zip 在下载的过程中会 ...

  7. 一个人的 ClojureScript 技术栈

    作者:题叶链接:https://zhuanlan.zhihu.com/p/24425284来源:知乎著作权归作者所有.商业转载请联系作者获得授权,非商业转载请注明出处.今天(昨天)分享完关于 Cloj ...

  8. icmp_ping学习笔记

    1.用字符串指针做为发送缓冲区和接收缓冲区的指针: 2.icmp报文类型结构体可自行定义,也可用<netinet/ip_icmp.h>中定义好的strcut icmp结构体: 3.ip_h ...

  9. visual studio 2013 已停止运行 解决办法

    情况是这样,WINDOWS 8.1,双显卡笔记本,打开VS.NET 没几秒就提示 已停止运行,然后就关闭程序了,找了无数资料都没有解决 -------------------------------- ...

  10. 10天学会phpWeChat——第六天:实现新闻的后台管理

    通过前面五讲的系列教程,我们完成了一个简单模块的前端发布.列表展示.详情展示.实际生产环境中,所有前台的数据都会有对应的后台操作进行统筹管理.我们称之为后台管理系统. 今天,我们开始<10天学会 ...