非实时串行数据绘图仪

Non Real Time Serial Data Plotter

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

现在我可以获得 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- 摆脱 while 循环中的暂停。相反,如果数据可用,请查看您从串行端口读取的内容,如果没有则重复循环,继续处理和显示。

2- 设置图

后,将'drawnow'与'limitrate'结合使用

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