非实时串行数据绘图仪
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 方面
我正在从事一个运动传感器项目,我想从连接到 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 方面