Построение движущейся оси сигнала реального времени от arduino

Я новичок в Matlab, и мне трудно определить аргумент для построения движущейся оси, особенно оси x, с xlim. Я получаю сигнал в реальном времени от arduino и хочу построить его в зависимости от времени. Посмотрите на мой код ниже:

  clear all; clc; clf; 

  %a=arduino('/dev/tty.usbmodem1a12211');

  dt = 0.02; %sec. 
  %adjusted_dt = dt; 
  plot_window = 50;
  N_timesteps = 1000; 

  a = arduino('COM3');         
  a.pinMode(15,'input'); % z 
  a.pinMode(16,'input'); % y 
  a.pinMode(17,'input'); % x 

  a.pinMode(18,'output'); 
  a.pinMode(19,'output'); 

  a.digitalWrite(18,0);
  a.digitalWrite(19,1);

 x=zeros();
 y=zeros();
 z=zeros();
 t=zeros();

 %For Calibration.====================
 x_p_1g = 614.7500;  x_n_1g = 392.1351;
 y_p_1g = 612.6383;  y_n_1g = 387.7179;
 z_p_1g = 615.0000;  z_n_1g = 421.5684;
 %%%%%%%%==============================

 x_0g = (x_p_1g + x_n_1g) / 2.0 ;
 y_0g = (y_p_1g + y_n_1g) / 2.0 ;
 z_0g = (z_p_1g + z_n_1g) / 2.0 ;

 x_sntv = (x_p_1g - x_n_1g) / 2.0;
 y_sntv = (y_p_1g - y_n_1g) / 2.0;
 z_sntv = (z_p_1g - z_n_1g) / 2.0;


 elapsed_time_from_t_0 = 0.0; 

 %toc =0; 
 %tic; 

 for i=1:N_timesteps

 tic; 
 t(i,1) = elapsed_time_from_t_0;

 pause(dt); %toc;

 %  fprintf('dt = %10.7f;  (realtime dt)/(simul. time dt) = %5.2f  \n',dt, toc/dt);    

 %Simulation time is different from real time. 
 % t(i,1) = i*dt; % < = this is no longer valid. 


 x(i,1)=a.analogRead(3);
 y(i,1)=a.analogRead(2);
 z(i,1)=a.analogRead(1);

 %Calbiration  --------------------------

 x=(x(i,1) - x_0g)/x_sntv;
 y=(y(i,1) - y_0g)/y_sntv;
 z=(z(i,1) - z_0g)/z_sntv; 

 %Additional calibration code  --------------------------

 x(i,1)=a.analogRead(3);
 y(i,1)=a.analogRead(2);
 z(i,1)=a.analogRead(1);

 x=(x(i,1) - x_0g)/x_sntv;
 y=(y(i,1) - y_0g)/y_sntv;
 z=(z(i,1) - z_0g)/z_sntv;

 NEED EXTRA CODE/ARGUMENT TO CAUSE X AXIS TO MOVE/SHIFT TO PLOT THE LATEST 100 DATA

 clf;

 subplot(3,1,1); grid on; hold on;
 ylim([-2 2]);    
 xlim([ ]); need help
 plot(t,z,'b-o');
 xlabel('t[sec]');
 ylabel('z [g]');
 title('z');
 end


 subplot(3,1,2); grid on; hold on;
 ylim([-2 2]);
 xlim([ ]); need help
 plot(t,x,'b-o');
 xlabel('t[sec]');
 ylabel('x [g]');
 title('x');
 end   

 subplot(3,1,3); grid on; hold on;
 ylim([-2 2]);
 xlim([ ]);     need help
 plot(t,y,'b-o');
 xlabel('t[sec]');
 ylabel('y [g]');
 title('y');
 end
 toc; 
 elapsed_time_from_t_0 = elapsed_time_from_t_0 + toc; 

 end

person user3446671    schedule 21.03.2014    source источник
comment
Ну, сначала я вижу одну проблему: вы не просто рисуете последние 100 точек t, x, y и т. д. Все ваши команды построения графика используют полные векторы. Можете ли вы вырезать каждую часть этого, которая не имеет отношения к делу?   -  person Frederick    schedule 21.03.2014
comment
Спасибо. Но на самом деле мне не нужны только последние 100 данных. Я хочу просмотреть 100 последних данных как сдвиг по оси x, чтобы динамически разместить следующие 100 данных.   -  person user3446671    schedule 21.03.2014
comment
Я имею в виду движущуюся ось x = по мере роста графика для просмотра последних выборочных данных до 100 (усеченные данные для отображения только последних 100 за раз, что означает, что предыдущие 100 данных каждый раз не будут отображаться в окне)   -  person user3446671    schedule 22.03.2014


Ответы (1)


Поскольку вы рисуете в цикле, сюжет «плохой». Он воспроизводит все это дело целиком, а вы только пытаетесь в нем перерисовать несколько точек. Что лучше сделать, так это следующее:

h = plot(NaN);
for k = 1:N
  set(h,'YData',data,'XData',time);
  axis([time(k-100) time(k)+1 min(data)*1.1 max(data)*1.1]);
  redraw;
end

другой вариант ограничений:

% symmetrical y limits
xlim([time(k-100) time(k)+1]);
if (k > 102)
  border = max(abs(data(k-100:end))) *1.1;
  ylim([-border border]);
else
  ylim([ min(data) max(data)]);
end

Этот метод только заменяет данные на графике. Оператор оси принимает сначала x, затем y пределы. Нижний предел (слева, бот) — время до 100 семплов, правый +1 сек. Я установил минимальное и максимальное значение на 10% выше/ниже, чем максимальное/минимальное. Не стесняйтесь играть здесь. Полный пример использования matlab/arduino с двоичной передачей чисел (проще для arduino) см.

https://stackoverflow.com/questions/24368670/matlab-plot-serial-data-continuously< /а>

person mike    schedule 25.06.2014