2017-01-26 4 views
0

Ich versuche, Daten von meinem Arduino Leonardo zu Matlab zu senden, dann plotten es. Ich habe versucht, eine Sinuswelle an die analogen Eingänge zu übergeben, und ich konnte es auf dem seriellen Plotter sehen. Das Problem ist, dass, wann immer ich die Daten an Matlab sende und grafisch darstelle, der Plot keine Sinuswelle mehr ist.Arduino Matlab plotten

Hier ist mein Arduino Code, ich habe es mit Hilfe dieser link eingestellt bei 1kHz zu probieren, die nicht die seriellen Plotter Ergebnisse beeinflußte die

#define INTERVAL_LENGTH_US 1000UL 

unsigned long previousMicros; 
#define FASTADC 1 
int recValue; 
// defines for setting and clearing register bits 
#ifndef cbi 
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit)) 
#endif 
#ifndef sbi 
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit)) 
#endif 
double t = 0; 


void setup() { 
    int start ; 
    int i ; 

#if FASTADC 
    // set prescale to 16 
    sbi(ADCSRA, ADPS2) ; 
    cbi(ADCSRA, ADPS1) ; 
    cbi(ADCSRA, ADPS0) ; 
#endif 

    Serial.begin(115200) ; 
    while (1) 
    { 
    if (Serial.available() > 0) 
    { 
     recValue = Serial.read(); 

     if (recValue == 1)   // If use will send value 1 from MATLAB 
     { //delay(10); 

     Serial.println("g"); 
     break; 
     } 

    } 
    } 


    void loop() 
    { 
    unsigned long currentMicros = micros(); 

    if ((currentMicros - previousMicros) >= INTERVAL_LENGTH_US) 
    { 
     previousMicros += INTERVAL_LENGTH_US; 

     int val_a0 = analogRead(A0); 
     int val_a1 = analogRead(A1); 
     int val_a2 = analogRead(A2); 
     int val_a3 = analogRead(A3); 



     Serial.println(val_a0); 


     Serial.println(val_a1); 

     Serial.println(val_a2); 


     Serial.println(val_a3); 

    } 
    } 

EDIT much.`: Ich habe die Karte in eine UNO-Karte geändert (benutzt keinen virtuellen Kommunikationsport), und ich habe es geschafft, sie zu übertragen. Aber als ich es in Echtzeit geplottet habe, habe ich es geschafft, für eine kurze Zeit zu plotten (700 Samples). Ich weiß, dass der Arduino die Sinuswelle fortwährend sendet, nur in Matlab bekomme ich nur einen Teil davon. Hier ist ein Screenshot von dem, was ich meine:

Recieved sine

Der Code, den ich in Matlab verwendet zu empfangen und plotten es ist die folgende:

 clear all; 
    s = serial('COM4', 'BaudRate', 250000); % setup comport 
    fopen(s); 
    t=[0]; v1=[0]; v2=[0];v2=[0];v3=[0]; v4=[0];       % same as in Arduino IDE 
    n=1;h1=0; h2=0; h3=0; h4=0; base=0.0; x=[]; reply = '1'; 

    % signalling to Arduino to start reading inputs 
    servalue= input('Enter the value 1 to start reading :'); 
    pause(1);tic; 
    fprintf(s,servalue); 
    %Arduino will send an acknowledgment 
    reply = fgetl(s); 
    if(reply~='g') 
     disp('fail') 
    end 
    %%%%%%%%%%%%%%%%%%setting the plots%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 
    figure; subplot(411) ; 
    h1 = plot(v1, 'r-'); 
    %animatedline(nan,nan); % Save handle to the line 
    title('Channel 1'); 
    ylabel('Amplitude(V)'); 

    subplot(412); h2= plot(v2, 'r-'); 
    %animatedline(nan,nan); % Save handle to the line 
    title('Channel 2'); 
    ylabel('Amplitude(V)'); 


    subplot(413); h3= plot(v3, 'r-'); 
    %animatedline(nan,nan); % Save handle to the line 
    title('Channel 3'); 
    ylabel('Amplitude(V)'); 

    subplot(414); h4= plot(v4, 'r-'); 
    %animatedline(nan,nan); % Save handle to the line 
    title('Channel 4'); 
    xlabel('Time (seconds)'); 
    ylabel('Amplitude(V)'); 
    %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%5 

    while(toc<50) 

     v1 = [v1, str2double(fgetl(s))*(5.0/1023.0)]; 
     v2 = [v2, str2double(fgetl(s))*(5.0/1023.0)]; 
     v3 = [v3, str2double(fgetl(s))*(5.0/1023.0)]; 
     v4 = [v4,str2double(fgetl(s))*(5.0/1023.0)]; 

     %% %%%%%%%updating plots%%%%%%%%%%%%%%%%%% 

     set(h1, 'ydata', v1); % Update plot 
     set(h2, 'ydata', v2); % Update plot 
     set(h3, 'ydata', v3); % Update plot 
     set(h4, 'ydata', v4); % Update plot 
     drawnow; 

     n=n+1; 

    end 
    fclose(s); 

Hier ist die Antwort der 4 Kanäle: 4 channels' response

+0

Welche 5 möglichen Werte werden im Excel-Diagramm gezeichnet? –

+0

Senden und empfangen Sie 1 oder 4 Signale gleichzeitig? –

+0

4, ich habe die anderen drei vorher kommentiert, weil ich zuerst einen Kanal testen wollte, ich habe vergessen, das in der Frage zu bearbeiten, es ist jetzt alles behoben. – Isra

Antwort

0

Sieht aus wie Ihr Problem ist, dass einige Daten gelöscht werden und dass das Senden und Empfangen von Daten desynchronisieren.

Im Idealfall möchten Sie wie einen Stream senden:

...Ch1-Ch2-Ch3-Ch4-Ch1-Ch2-Ch3-Ch4-Ch1-Ch2-Ch3-Ch4-Ch1-Ch2-Ch3-Ch4... 

und erhalten es in Matlab wie:

V1 V2 V3 V4 
Ch1 - Ch2 - Ch3 - Ch4 
Ch1 - Ch2 - Ch3 - Ch4 
Ch1 - Ch2 - Ch3 - Ch4 
Ch1 - Ch2 - Ch3 - Ch4 

Aber, wenn es einige Daten aus irgendeinem Grund gefallen ist, dann Kanäle erhalten gemischt:

Ihr Strom wie etwas aussehen:

...Ch1-Ch2-Ch3-Ch4-Ch1-Ch2- -Ch4-Ch1-Ch2-Ch3- -Ch1-Ch2-Ch3-Ch4-Ch1-Ch2... 

So Ihr Programm in Matlab werden diese Daten als

V1 V2 V3 V4 
Ch1 - Ch2 - Ch3 - Ch4 
Ch1 - Ch2 - Ch4 - Ch1 
Ch2 - Ch3 - Ch1 - Ch2 
Ch3 - Ch4 - Ch1 - Ch2 

aufnehmen Wie Sie sehen können, es funktioniert für eine Weile, aber wenn Daten gelöscht wird, dann wird die gesamte Koordinierung verloren.

Es gibt mehrere Möglichkeiten, wie Sie das lösen können. Suchen Sie nach "serielle Kommunikation synchronisieren" und Sie werden mehrere Methoden finden.

In Ihrem Fall würde ich vorschlagen, alle Kanäle getrennt durch Kommas in einer einzigen Zeile zu senden, und dann trennen sie in Matlab. In der Arduino Seite:

Serial.print(val_a0); 
    Serial.print(','); 
    Serial.print(val_a1); 
    Serial.print(','); 
    Serial.print(val_a2); 
    Serial.print(','); 
    Serial.println(val_a3); 

Dann auf der Seite Matlab

data=strsplit(fgetl(s),','); 

if lenght(data)==4 
    v1 = [v1, str2double(data(1))*(5.0/1023.0)]; 
    v2 = [v2, str2double(data(2))*(5.0/1023.0)]; 
    v3 = [v3, str2double(data(3))*(5.0/1023.0)]; 
    v4 = [v4, str2double(data(4))*(5.0/1023.0)]; 
end 

Darauf achten, dass dies die Synchronisation nur beheben, könnte aber andere Fehler einführen, wenn Teildaten empfangen wird. Sie können das mit einigen try-catch-Anweisungen behandeln

+0

ich habe versucht, was Sie vorgeschlagen, tat es das gleiche wie im vorherigen Fall, aber nur Es blieb bei 800 stehen, anstatt mit verzerrten Ergebnissen fortzufahren. Ich habe auch diesen Fehler: Index überschreitet Matrixdimensionen. – Isra

+0

Oh, ich verstehe. Ich habe ein 'if' hinzugefügt, um die Länge der empfangenen Daten zu überprüfen. Bitte überprüfen Sie, ob das Ihr Problem löst –

+0

Leider habe ich das gleiche Problem, Daten nach 800 ist verformt. Gibt es eine Möglichkeit herauszufinden, wie viele Elemente wir am Eingang haben? Könnte es sein, dass Arduino die Daten zu schnell sendet, so dass Matlab mit den Daten überlastet wird? – Isra