Einlesen von internen Signalen eines Mikrocontrollers mit Matlab: Unterschied zwischen den Versionen

Aus HSHL Mechatronik
Zur Navigation springen Zur Suche springen
 
(35 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 2: Zeile 2:


= Senden von Signalen von einem Mikrocontroller an einen PC =
= Senden von Signalen von einem Mikrocontroller an einen PC =
* Erstellen Sie in Ihrem Mikrocontroller-Programm eine Ausgabe an die RS232-Schnittstelle Ihres PCs. Ein Minimalbeispiel eines Arduino sieht z. B. so aus: <source line lang="c" style="font-size:medium">
void setup()
{
  Wire.begin();                // I2C-BUS als Master starten (damit Pin 4, 5 belegt!)
  Serial.begin(9600);          // Serielle Kommunikation über COM-Port mit 9600bps
}


void loop()
== Erster Schritt: Erstellen Sie in Ihrem Mikrocontroller-Programm eine Ausgabe an die RS232-Schnittstelle Ihres PCs ==
{
Ein Minimalbeispiel eines Arduino sieht z. B. so aus:
// Variablen setzen
<code type="matlab">
int Signal1;
void setup()
int Signal2;
{
int Signal3;
  Serial.begin(9600);          // Serielle Kommunikation über COM-Port mit 9600bps
}


// Variablen mit Inhalt füllen
void loop()
// hier müssen jetzt Variablen eingelesen, ausgerechnet, etc. werden
{
// Variablen setzen
int Signal1;
int Signal2;
int Signal3;


// Variablen/Signale senden: 
// Variablen mit Inhalt füllen
Serial.print(millis());
  // hier müssen jetzt Variablen eingelesen, ausgerechnet, etc. werden
Serial.print(";");
Serial.print(Signal1);
Serial.print(";");
Serial.print(Signal2);
Serial.print(";");
Serial.print(Signal3);
Serial.println(",");
}
  </source>


* Lesen Sie die Signale der RS232-Schnittstelle mit Hilfe eines geeigneten Programms ein.
// Variablen/Signale senden: 
** Geeignete Programme sind z. B. [http://www.der-hammer.info/terminal/ hterm] u. a.
Serial.print(millis());
** Lesen Sie von dem COM-Port, an dem Ihr MIkrocontroller (ggf. über USB) hängt mit der richtigen Baudrate (wie oben im Mikrocontroller eingestellt) die Signale ein.
Serial.print(";");
** Speichern Sie die Signale als Textdatei ab. Diese sollte dann so aussehen:
Serial.print(Signal1);
  Zeitstempel;Signal1;Signal2;Signal3,
Serial.print(";");
  Zeitstempel;Signal1;Signal2;Signal3,
Serial.print(Signal2);
Serial.print(";");
Serial.print(Signal3);
Serial.println(",");
}
</code>
 
 
== Zweiter Schritt: Lesen Sie die Signale der RS232-Schnittstelle mit Hilfe eines geeigneten Programms ein ==
# Geeignete Programme sind z. B. [http://www.der-hammer.info/terminal/ hterm] u. a.
# Lesen Sie von dem COM-Port, an dem Ihr MIkrocontroller (ggf. über USB) hängt mit der richtigen Baudrate (wie oben im Mikrocontroller eingestellt) die Signale ein.
# Den COM-Port erfahren Sie am besten über den Gerätemanagers Ihres PCs, dort unter "Anschlüsse".
# Speichern Sie die Signale als Textdatei ab.  
# Die Zeilen stellen die Zeitpunkte dar. Es empfiehlt sich, als erstes Signal "Signal1" die Zeit mitzuschicken, z. B. die Anzahl der vergangenen Millisekunden.
# Speichern Sie diesen per RS232-Schnittstelle eingelesenen Text mit Hilfe der o. g. Programme. Dieser sollte dann so aussehen:
  Zeitstempel;Signal1;Signal2;Signal3,  
  Zeitstempel;Signal1;Signal2;Signal3,  
  Zeitstempel;Signal1;Signal2;Signal3,
  Zeitstempel;Signal1;Signal2;Signal3,
** Die Zeilen stellen die Zeitpunkte dar. Es empfiehlt sich, als erstes Signal "Signal1" die Zeit mitzuschicken, z. B. die Anzahl der vergangenen Millisekunden.


= Verarbeiten von Signalen aus einer Textdatei mit Hilfe von Matlab-Simulink =  
= Verarbeiten von Signalen aus einer Textdatei mit Hilfe von Matlab-Simulink =  
# Voraussetzung: Die Signale liegen in einer Textdatei in deroben beschriebenen Form vor.
# Voraussetzung: Die Signale liegen in einer Textdatei in deroben beschriebenen Form vor.
# Speichern Sie den u. g. Quelltext von Matlab unter '''funktion_signale_aus_txtlog_einlesen.m'''!):
# Speichern Sie den u. g. Quelltext von Matlab unter '''funktion_signale_aus_txtlog_einlesen.m'''!).
# Führen Sie die Funktion aus, z. B. mit Hilfe von <source line lang="matlab" style="font-size:medium">
A = funktion_signale_aus_txtlog_einlesen('Testdatei.log'); </source>
# Nun liegt die Matrix A im Matlab-Workspace vor und kann weiterverarbeitet werden.
# Es empfiehlt sich ein Matlab-Skript, in dem die FUnktion mit obigem Funktionsaufruf gestartet und dann die Matrix A weiter verarbeitet wird, z. B. so:
 
<source line lang="matlab" style="font-size:medium">
% Leere Struktur erstellen
messung = [];
 
% Messsignale dort einfügen
messung.Zeit = A(:,1);
messung.Geschwindigkeit = A(:,2);
 
% Darstellen
figure
plot(messung.Zeit, messung.Geschwindigkeit)
box on, grid on
xlabel('t [s]')
ylabel('v [m/s]')
</source>




== Quelltext ==
== Quelltext ==
<source line lang="matlab" style="font-size:medium">  
Die im Folgenden dargestelle Funktion können Sie auch [[Datei:Funktion_signale_aus_txtlog_einlesen.m]] hier herunterladen.
function [A] = funktion_signale_aus_txtlog_einlesen(Datei);
 
%%% Funktion zum Einlesen von Signalen aus einer Textdatei.
<source line lang="matlab" style="font-size:medium">
%%%
function [A] = funktion_signale_aus_txtlog_einlesen(Datei);
%%% Eingang: Name inkl. Pfad einer Textdatei
%%% Funktion zum Einlesen von Signalen aus einer Textdatei.
%%% Ausgang: Matrix mit allen eingelesen Signalen in den Spalten (je Zeile
%%%
%%%            Text eine Zeile in der Matrix)
%%% Eingang: Name inkl. Pfad einer Textdatei
%%% Format der Textdatei:
%%% Ausgang: Matrix mit allen eingelesen Signalen in den Spalten (je Zeile
%%%            Zeitstempel;Signal1;Signal2;Signal3,
%%%            Text eine Zeile in der Matrix)
%%%
%%% Format der Textdatei:
%%%            also z. B.:  
%%%            Zeitstempel;Signal1;Signal2;Signal3,
%%%            34368;652;27;0;0;0;286;-68391,
%%%
%%%            34386;652;27;0;0;0;285;-68392,
%%%            also z. B.:  
%%%            34420;652;27;0;0;0;283;-68394,
%%%            34368;652;27;0;0;0;286;-68391,
%%%            34453;652;27;0;0;0;282;-68395,
%%%            34386;652;27;0;0;0;285;-68392,
%%%            34487;652;27;0;0;0;284;-68393,
%%%            34420;652;27;0;0;0;283;-68394,
%%%            34453;652;27;0;0;0;282;-68395,
%%%            34487;652;27;0;0;0;284;-68393,


%% Datei öffnen und Daten einlesen
%% Datei öffnen und Daten einlesen
% öffnen
% öffnen
fid = fopen(Datei);
fid = fopen(Datei);


% Rohdaten einlesen
% Rohdaten einlesen
raw_data = fread(fid,'*char')';
raw_data = fread(fid,'*char')';
if ~(strcmp(raw_data(1),';'))
if ~(strcmp(raw_data(1),';'))
    raw_data=[';',raw_data];
    raw_data=[';',raw_data];
end
end


%% Semicolons und Kommas finden
%% Semicolons und Kommas finden
string_laenge  = length(raw_data);
string_laenge  = length(raw_data);
semicolon      = strfind(raw_data,';');
semicolon      = strfind(raw_data,';');
komma          = strfind(raw_data,',');
komma          = strfind(raw_data,',');
gesamt          = sort([semicolon komma]);
gesamt          = sort([semicolon komma]);


n_spalten = round((length(gesamt)-1)/length(komma));
n_spalten = round((length(gesamt)-1)/length(komma));
i_semicolon = 1;
i_semicolon = 1;
i_komma    = 1;
i_komma    = 1;
i_zeilen    = 1;
i_zeilen    = 1;
i_gesamt    = 1;
i_gesamt    = 1;


%% leere Matrix A erzeugen
%% leere Matrix A erzeugen
A = [];
A = [];


% Matrix A befüllen
% Matrix A befüllen
try
try
     while i_gesamt <= length(gesamt)
     while i_gesamt <= length(gesamt)
         for i_spalten = 1:n_spalten
         for i_spalten = 1:n_spalten
Zeile 105: Zeile 132:
         end
         end
     end
     end
catch
catch
     %fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename);
     %fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename);
end
end


%% Datei schließen
%% Datei schließen
fclose(fid);
fclose(fid);
</source>
</source>

Aktuelle Version vom 29. November 2019, 10:56 Uhr

Sie können Signale von einem Mikrocontroller an einen PC senden und diese dann dort weiterverarbeiten.

Senden von Signalen von einem Mikrocontroller an einen PC

Erster Schritt: Erstellen Sie in Ihrem Mikrocontroller-Programm eine Ausgabe an die RS232-Schnittstelle Ihres PCs

Ein Minimalbeispiel eines Arduino sieht z. B. so aus:

void setup()
{
  Serial.begin(9600);          // Serielle Kommunikation über COM-Port mit 9600bps
}
void loop()
{
// Variablen setzen
int Signal1;
int Signal2;
int Signal3;
// Variablen mit Inhalt füllen
// hier müssen jetzt Variablen eingelesen, ausgerechnet, etc. werden
// Variablen/Signale senden:  
Serial.print(millis());
Serial.print(";");
Serial.print(Signal1);
Serial.print(";"); 
Serial.print(Signal2);
Serial.print(";"); 
Serial.print(Signal3);
Serial.println(",");
} 


Zweiter Schritt: Lesen Sie die Signale der RS232-Schnittstelle mit Hilfe eines geeigneten Programms ein

  1. Geeignete Programme sind z. B. hterm u. a.
  2. Lesen Sie von dem COM-Port, an dem Ihr MIkrocontroller (ggf. über USB) hängt mit der richtigen Baudrate (wie oben im Mikrocontroller eingestellt) die Signale ein.
  3. Den COM-Port erfahren Sie am besten über den Gerätemanagers Ihres PCs, dort unter "Anschlüsse".
  4. Speichern Sie die Signale als Textdatei ab.
  5. Die Zeilen stellen die Zeitpunkte dar. Es empfiehlt sich, als erstes Signal "Signal1" die Zeit mitzuschicken, z. B. die Anzahl der vergangenen Millisekunden.
  6. Speichern Sie diesen per RS232-Schnittstelle eingelesenen Text mit Hilfe der o. g. Programme. Dieser sollte dann so aussehen:
Zeitstempel;Signal1;Signal2;Signal3, 
Zeitstempel;Signal1;Signal2;Signal3, 
Zeitstempel;Signal1;Signal2;Signal3,

Verarbeiten von Signalen aus einer Textdatei mit Hilfe von Matlab-Simulink

  1. Voraussetzung: Die Signale liegen in einer Textdatei in deroben beschriebenen Form vor.
  2. Speichern Sie den u. g. Quelltext von Matlab unter funktion_signale_aus_txtlog_einlesen.m!).
  3. Führen Sie die Funktion aus, z. B. mit Hilfe von
    A = funktion_signale_aus_txtlog_einlesen('Testdatei.log');
    
  4. Nun liegt die Matrix A im Matlab-Workspace vor und kann weiterverarbeitet werden.
  5. Es empfiehlt sich ein Matlab-Skript, in dem die FUnktion mit obigem Funktionsaufruf gestartet und dann die Matrix A weiter verarbeitet wird, z. B. so:
 % Leere Struktur erstellen
 messung = [];

 % Messsignale dort einfügen
 messung.Zeit = A(:,1);
 messung.Geschwindigkeit = A(:,2);

 % Darstellen
 figure
 plot(messung.Zeit, messung.Geschwindigkeit)
 box on, grid on
 xlabel('t [s]')
 ylabel('v [m/s]')


Quelltext

Die im Folgenden dargestelle Funktion können Sie auch Datei:Funktion signale aus txtlog einlesen.m hier herunterladen.

 function [A] = funktion_signale_aus_txtlog_einlesen(Datei);
 %%% Funktion zum Einlesen von Signalen aus einer Textdatei.
 %%%
 %%% Eingang: Name inkl. Pfad einer Textdatei
 %%% Ausgang: Matrix mit allen eingelesen Signalen in den Spalten (je Zeile
 %%%             Text eine Zeile in der Matrix)
 %%% Format der Textdatei:
 %%%             Zeitstempel;Signal1;Signal2;Signal3,
 %%%
 %%%             also z. B.: 
 %%%             34368;652;27;0;0;0;286;-68391,
 %%%             34386;652;27;0;0;0;285;-68392,
 %%%             34420;652;27;0;0;0;283;-68394,
 %%%             34453;652;27;0;0;0;282;-68395,
 %%%             34487;652;27;0;0;0;284;-68393,

 %% Datei öffnen und Daten einlesen
 % öffnen
 fid = fopen(Datei);

 % Rohdaten einlesen
 raw_data = fread(fid,'*char')';
 if ~(strcmp(raw_data(1),';'))
     raw_data=[';',raw_data];
 end

 %% Semicolons und Kommas finden
 string_laenge   = length(raw_data);
 semicolon       = strfind(raw_data,';');
 komma           = strfind(raw_data,',');
 gesamt          = sort([semicolon komma]);

 n_spalten = round((length(gesamt)-1)/length(komma));
 i_semicolon = 1;
 i_komma     = 1;
 i_zeilen    = 1;
 i_gesamt    = 1;

 %% leere Matrix A erzeugen
 A = [];

 % Matrix A befüllen
 try
    while i_gesamt <= length(gesamt)
        for i_spalten = 1:n_spalten
            i_gesamt = i_gesamt+1;
            if i_gesamt >1
                if strcmp(raw_data(gesamt(i_gesamt-1)),',')
                    i_komma = i_komma +1;
                end
            end
            try
                A(i_komma,i_spalten) = str2num(raw_data(gesamt(i_gesamt-1)+1:gesamt(i_gesamt)-1));
            catch
                %fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename);
            end
        end
    end
 catch
    %fprintf(1, '%s: Catch-Zweig erreicht\n', mfilename);
 end

 %% Datei schließen
 fclose(fid);