Forum: Mikrocontroller und Digitale Elektronik Matlab Code Erfassung der Messwerte in Echtzeit


von Toricellie (Gast)


Lesenswert?

Hallo !

Auf einigen Seite habe ich gesehen, dass es möglich ist die 
Eingangssignales des Arduinos direkt als Kurve in Matlab ausgeben zu 
können.
Leider finde ich nirgends ein lauffähiges Beispiel. Hat Jemand einen 
Code (Für den Arduino und für Matlab), mit dem ich das ganze realisieren 
kann? Schön wäre es natürlich auch wenn ich alles direkt in eine *.cvs 
Datei speichern könnte, damit ich diese mit Latex auslesen und mir damit 
direkt fertige Diagramme in einer großen PDF erstellen lassen kann :)

von Stefan W. (bier16v)


Lesenswert?

Hallo  Toricellie,

also ein Beispiel für "direkt als Kurve ausgeben" habe ich jetzt nicht 
für dich.

Hast du schon versucht die Daten via seriellen Port an den PC zu 
schicken und diese Daten mit Matlab auszulesen, speichern und als Plot 
darzustellen.

Um welche Daten handelt es sich? Wie groß, wie schnell, ...?

Un das Speichern in eine Datei deiner Wahl sollte auch möglich sein, 
obwohl ich eher den Weg gehen würde eine Grafik mit Matlab erstellen und 
diese dann als EPS oder JPG in dein Latex-File einzubinden.
Wenn du die Grafiken mit tikz erstellst, kannst du einfach x- und 
y-Werte in eine .txt oder .dat speichern.

von Toricellie (Gast)


Lesenswert?

Ja, es gibt eine Funktion um den seriellen Port auszulesen. Ich weiß 
jetzt nicht genau wie schnell der Port Messwerte übermitteln kann. 
Jedenfalls muss ich das ganze nicht nur auslesen, sondern auch direkt 
darstellen können. Ich weiß das es geht, da ich ein paar YouTube Videos 
gesehen habe, doch meist ohne Code. In einem Video wurde die Kurve nach 
links hin immer kleiner skaliert, so das auch bei kontinuierlichen 
Messerwerten immer die gesamte Skala im blick hat.

Die Grafik exportieren ginge auch, aber zum einen mag ich nur 
Vektorgrafiken und zum anderen erspart es sehr viel Arbeit. Wenn ich 100 
Messreihen aufnehme und nach einem gewissen Schema als Datei abspeicher, 
kann ich mit Latex das Verzeichnis nach Dateinamen und Endungen 
durchsuchen, die Messwerte einlesen lassen und alle inkl. 
Achsenbeschriftung, Skalierung etc. in eine ganz große PDF schreiben 
lassen und das nur mit einem Klick.

von Jan K. (jan_k)


Lesenswert?

Es gibt sogenannte support packs, u.a. auch für Arduino, siehe 
http://de.mathworks.com/hardware-support/arduino-matlab.html

Hab' ich aber noch nicht benutzt. Ansonsten Serielle Schnittstelle, aber 
vorsicht, dank Java Unterbau ist die recht lahm, besser blockweise 
verarbeiten.

von Vincent H. (vinci)


Lesenswert?

Wenn du wirklich nur ein Script zum Lesen brauchst reicht:
1
s = serial('COM1','BaudRate',4800);
2
fopen(s);

Und dann via fread 
(http://de.mathworks.com/help/matlab/ref/serial.fread.html?searchHighlight=fread) 
das gewünschte Format einlesen, etwa in einer Schleife die die 
"BytesAvailable" Property des Serial Port Objects prüft.

Oder etwas ausgefuchster in einer sogenannten Serial Callback Funktion.


Erfahrungsgemäß geht das ganze unter Win7 so bis etwa ~0,5MBaud, je nach 
verbauter Hardware. Unter Unix wars bei mir wesentlich langsamer, da 
ging nichtmal 100kBaud vernünftig.

von Toricellie (Gast)


Lesenswert?

Danke schon mal für die Antworten. Es hat alles soweit geklappt und ich 
konnte alles umsetzen. Jetzt möchte ich aber noch einen Schritt weiter 
gehen.

Ich zwei Analoge Inputs als zwei Unterschiedliche Kurven ausgeben 
lassen.

Mit
1
s = serial('COM1','BaudRate',4800);
2
fopen(s);
3
4
5
while(x<1000)
6
x=x+1;
7
y1(x)=fscanf(s, '%d');
8
end

Kann ich jetzt beispielsweise den Wert eines Sensors grafisch 
darstellen. Da mir der Serielle Port immer weiter Daten übermittelt, die 
ich einfach nur plotte.

Nur was ist, wenn ich jetzt über den Analogen Pin 1 und 2 jeweils 
unterschiedliche Werte bekomme und an die serielle Schnittstelle 
schicke? Wie kann ich unterscheiden von welchem Sensor der aktuelle Wert 
ist, der übermittelt wurde? Und wenn, wie kann ich jeden Wert separat 
als Kurve darstellen? Theoretisch sinkt doch dann meine Genauigkeit um 
die Hälfte, da ich mir die Übertragungsrate jetzt mit zwei Sensoren 
teile oder?

von Stefan W. (bier16v)


Lesenswert?

Toricellie schrieb:
> Theoretisch sinkt doch dann meine Genauigkeit um die Hälfte
Naja, die Genauigkeit bleibt gleich, du bekommst aber nur weniger 
Messwerte, d.h. der zeitliche Abstand zwischen den Messwerten wird 
größer werden.

Du kannst dir ja ein einfachen Protokoll überlegen. Z.B.
1
sende 'a'
2
Daten Pin1
3
sende 'b'
4
Daten Pin2
5
...

In Matlab kannst du das empfangene Zeichen überprüfen und die Daten dem 
richtigen Vektor zuordnen.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.