非实时串行数据绘图仪

时间:2017-07-04 02:09:08

标签: matlab arduino serial-port pyserial real-time-data

我正在研究运动传感器项目,我想从连接到Arduino的传感器(MPU6050)获取加速度数据。所以我得到了加速度ax,ay和az的3个值,我将它们发送到USB串行链接。

现在我可以获得ax,ay和az值并正确绘制它们并且一切正常。

问题:是不是实时的,即。当我振动传感器时,值不会像Arduino的即时连续绘图仪那样同时改变,我没有使用,因为我想稍后在MATLAB中分析这些数据(进行模式识别任务以便我可以区分运动)。

这是我的代码,我需要知道哪个部分消耗了那个时间,我该怎么做才能解决这个问题?

注意:我也尝试使用pySerial来获取数据和Matplotlib,但我遇到了同样的问题,它不是同时发生的。

%%real time data plot from a serial port
% Original script written by Moidu thavot.

%%Clear all variables
clc;
clear all;
close all;

if isempty(instrfind) == 0
    fclose(instrfind); % Close com ports
    delete(instrfind); % Clear com ports
end

%%Variables (Edit yourself)

SerialPort='com6'; %serial port
TimeInterval=0;%time interval between each input.
loop=inf;%count values
yMIN = -100;
yMAX = 100;
xWIDTH = 200;
%%Set up the serial port object
s = serial(SerialPort, 'BaudRate', 115200); % setup comport
fopen(s);

time = now;
y1 = 0;
y2 = 0;
y3 = 0;
%% Set up the figure
figureHandle = figure('NumberTitle','off',...
    'Name','Acceleration Plots',...
    'Color',[0 0 0],'Visible','off');

% Set axes
axesHandle = axes('Parent',figureHandle,...
    'YGrid','on',...
    'YColor',[0.9725 0.9725 0.9725],...
    'XGrid','on',...
    'XColor',[0.9725 0.9725 0.9725],...
    'Color',[0 0 0]);

hold on;

plotHandle1 = plot(axesHandle,time,y1,'LineWidth',1,'Color',[1 0 0]);
plotHandle2 = plot(axesHandle,time,y2,'LineWidth',1,'Color',[0 1 0]);
plotHandle3 = plot(axesHandle,time,y3,'LineWidth',1,'Color',[0 0 1]);

%xlim(axesHandle,[min(time) max(time+0.001)]);
%ylim([yMIN yMAX]);

% Create xlabel
xlabel('Time','FontWeight','bold','FontSize',14,'Color',[1 1 0]);

% Create ylabel
ylabel('Acceleration Values','FontWeight','bold','FontSize',14,'Color',[1 1 0]);

% Create title
title('Real Time Data','FontSize',15,'Color',[1 1 0]);

%% Initializing variables

y1(1)=0;
y2(1)=0;
y3(1)=0;
time(1)=0;
count = 2;
while ~isequal(count,loop)

    u = fscanf(s, '%f %f %f');
    y1(count) = u(1);
    y2(count) = u(2);
    y3(count) = u(3);

    time(count) = count;

    xlim([max(time-xWIDTH) max(time)]);

    set(plotHandle1,'YData',y1,'XData',time);
    set(plotHandle2,'YData',y2,'XData',time);
    set(plotHandle3,'YData',y3,'XData',time);
    set(figureHandle,'Visible','on');
    datetick('x','mm/DD HH:MM');

    pause(TimeInterval);
    count = count +1;
end

%% Clean up the serial port
fclose(s);
delete(s);
clear s;

1 个答案:

答案 0 :(得分:1)

1-摆脱while循环中的暂停。相反,如果数据可用,请查看您从串行端口读取的内容继续处理和显示,如果不重复循环。

2-设置图表后使用'drawnow'和'limitrate'

3-检查波特率,在MATLAB端你仍然可以增加它。我不知道arduino方面