PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : uC -> rs232 -> Matlab / Plotten



goara
14.07.2009, 15:12
Hallo,
ich möchte daten die vom uC über die RS232 Kommen in Matlab plotten.
Allerdings bekomme ich folgenden fehler:

>> s = serial('COM3','BaudRate',9600);
>> fopen(s)
??? Error using ==> fopen
Port: COM3 is not available. No ports are available.
Use INSTRFIND to determine if other instrument objects are connected to the requested device.

bei instrfind bekomme ich folgendes:

>> INSTRFIND(s)

Serial Port Object : Serial-COM3

Communication Settings
Port: COM3
BaudRate: 9600
Terminator: 'LF'

Communication State
Status: closed
RecordStatus: off

Read/Write State
TransferStatus: idle
BytesAvailable: 0
ValuesReceived: 0
ValuesSent: 0

habe Matlab 6.5 unter Windoof XP...

Alternative Frage: gibt es vielleicht ein Tool mit dem ich die Daten einfach Plotten kann, am besten für Linux ??
(in echtzeit, nicht mit copy+paste+exel)

Danke schon mal....

Willa
15.07.2009, 07:39
Hi Goran!
Hm, wenn ich genau das gleiche mache wie Du (mit com5 statt com3, denn da hängt mein USB-Konverter dran), funktioniert es bei mir. Ich bekomme aber genau das gleiche wie du bei instrfind angezeigt. Da ist irgendetwas komisch, kannst du vielleicht mal die Adresse von deiner Schnittstelle ändern?
Regler kommen bald zurück :-D !
p.s. gnuplot kann kein echtzeit, oder? Kenn mich mit Linuxzeugs nicht aus

goara
15.07.2009, 11:19
hmm, ich werde es mal mit einer anderen Version testen, irgendwie kommt mir das verbuggt vor.
Gnuplot ansich kann kein echtzeit soweit ich weis, aber mit nem kleinen perlscript oder ähnlichem sollte das machbar sein denke ich..

Willa
15.07.2009, 11:53
Wenn du es hinbekommst einen Realtimeplot mit Matlab zu machen wäre ich daran auch sehr interessiert... Ich werde mich aber auch mal damit auseinandersetzen.

Willa
15.07.2009, 19:45
Hi!
Nach gefühlten 100 Versuchen habe ich einen Realtimeplot mit Matlab hinbekommen:
Screencapturevid (meine Mega32 simuliert eine verrauschte Sinuskurve)
www.villalachouette.de/william/krims/matlab+rncontrol.wmv
Skript:

clc
clear
rmappdata(0,'h');
rmappdata(0,'i');
rmappdata(0,'w');
s = serial('COM5','BaudRate',115200);
fopen(s);
s.BytesAvailableFcnMode = 'terminator';
disp('Ready...')
s.BytesAvailableFcn = @empfangen;

figure;
y=(0:100);
h=plot (y);

setappdata(0,'h',h);
setappdata(0,'i',1);
setappdata(0,'w',0);


Callback (wird immer ausgeführt wenn was empfangen wurde). Dieser Code muss unter dem Dateinamen "empfangen.m" gespeichert werden.

function empfangen (s, event)
i=getappdata(0,'i');
h=getappdata(0,'h');
w=getappdata(0,'w');
%s=getappdata(0,'s');
try
w(i)=str2double(fscanf(s));
catch
disp('error reading from serial...');
fclose(s)
end
i=i+1 ;
setappdata (0,'i',i);
setappdata (0,'w',w);
try %ist die Figure geshclossen worden...
%i ist immer einen größer als länge von w
if i > 1000
set(h, 'ydata',w(i-1000:i-1))
else
set(h, 'ydata',w)
end
ylim([-1.5 1.5]); %yachsenlimit einstellen
drawnow;
catch
fclose(s) %...dann wird serialport auch geschlossen.
disp('...something went wrong or figure was closed.....')
assignin('base', 'w', w) %variable soll auch im workspace verfügbar sein
end
end

Vielleicht hilft das ja dem ein oder anderen... Mal sehen was ich damit noch anfangen kann.

goara
15.07.2009, 20:49
Kuhl, danke... Das sieht ja richtig gut aus... Was hast du denn für eine Matlab Version??
bekomme folgenden Fehler:

??? Error using ==> rmappdata
Invalid root user property: 'h'.

Error in ==> C:\MATLAB6p5\work\rs232.m
On line 3 ==> rmappdata(0,'h');
kann damit nichts anfangen, wozu is denn das rmappdata gut?

Willa
15.07.2009, 21:15
Ich hab r2008a.... Deine Uni investiert wohl nicht gerne in Softwareupdates...? ;-D
rmappdata löscht daten aus dem "hintergrundspeicher" von matlab. Also die Daten, die per "setappdata" abgelegt werden. Bei mir müssen die gelöscht werden, sonst merkt sich matlab immer die seriellen daten von der Messung davor. Aber wenns sowas bei dir nicht gibt funktionierts vielleicht auch ohne die Funktion?

Ah, ich glaube bei dir meckert Matlab weil es etwas löschen soll was es noch gar nicht gibt...... dann mach mal um die rmappdatablöcke ein try...catch...end rum

goara
16.07.2009, 22:28
hmm irgdnwie geht wohl bei der 6.5er der serial port nicht :( ... die ist nicht von der uni.. habe mal eine alte lizenz die "übrig war" geschenkt bekommen.. Ich test den code mal morgen am institut....
wenn ich das bei mir nicht hinbekomm werde ich wohl mal in eine neue version investieren müssen wobei 80 euro für studies echt fair ist....

Willa
26.07.2009, 12:07
Ich hab mal versucht aus der Kommunikation mit Matlab was "sinnvolles" zu machen:
http://www.villalachouette.de/william/krims/tricopter/matlab3d.wmv
Die Laage des Copters wird in 3D dargestellt. Ist nur ein erster kleiner Versuch...

goara
26.07.2009, 15:08
feine sache... kannst mir die m-files mal schicken ;) ???
ich bin grad dabei eine linux gui zu schreiben mit der ich rs232 daten plotten kann... sowas kann man immer gebarauchen.. weil mein matlab mag irgdnwie kein serialport, an der uni gehts aber

Willa
26.07.2009, 15:15
Klaro, hier ist der Code...:


clc
clear
try
rmappdata(0,'A');
rmappdata(0,'B');
%rmappdata(0,'C');
catch
end
s = serial('COM5','BaudRate',115200);
fopen(s);
s.BytesAvailableFcnMode = 'terminator';
disp('Ready...')
s.BytesAvailableFcn = @empfangen3D;

figure;
[x,y] = meshgrid(-50:50:50,-50:50:50);
z=[1 1 1; 0 0.1 0; -1 0 0];
h=surface(x,y,z);
axis equal;
xlim([-50 50])
ylim([-50 50])
zlim([-50 50])
view(0,30)
setappdata(0,'h',h);
%setappdata(0,'z',z);




function empfangen3D (s, event)
h=getappdata(0,'h');
A=getappdata(0,'A');
B=getappdata(0,'B');
%C=getappdata(0,'C');
%z=getappdata(0,'z');
try
string=fscanf(s);
k = strfind(string, 'A');
fff = strfind(string, 'B');
%zzz = strfind(string, 'C');
if k==1
A=str2num(string(2:end));
k=0;
end
if fff==1
B=str2num(string(2:end));
fff=0;
end
%if zzz==1
% C=str2num(string(2:end));
% zzz=0;
%end
z=[-A+B -A -A-B; 0+B 0 0-B; A+B A A-B];
catch
disp('error reading from serial...');
fclose(s)
end

setappdata (0,'A',A);
setappdata (0,'B',B);
%setappdata (0,'C',C);
%setappdata (0,'z',z);
try %ist die Figure geshclossen worden...
%wohl zu viel code für diesen "interrupt"...
set(h, 'zdata',z)
axis equal;
xlim([-50 50])
ylim([-50 50])
zlim([-50 50])
%view(C,30)
drawnow;
catch
fclose(s) %...dann wird serialport auch geschlossen.
disp('...something went wrong or figure was closed.....')
end
end


Wie man evtl. sieht ist das keine echte 3D Rotation. Aber mein Tricopter gibt auch keinen echten Winkel aus. Mal sehen ob ich das irgendwann noch ändere...
Goran, hast du eine Idee wie man den Code optimieren könnte? Im Moment macht das BytesAvailable Callback die ganze Arbeit, dabei soll es doch eigentlich nur die Daten vom Serialport abholen. Man müsste eine weitere Function einbauen, die nur das zeichnen übernimmt. Wie das geht weiss ich aber nicht.... Müsste eine Function sein, die z.B. alle 1/25 sekunden aus den vorhandenen Daten den Plot updated.
Denn es gibt Probleme wenn ich mehrere Datensätze übertrage, ich glaube das Callback ist dann überlastet.


edit:
mein µC sendet:
"A123" --> Nick
"B345" --> Roll

Willa
28.07.2009, 19:47
Es ging mal wieder etwas weiter.....
Video dazu:
http://www.villalachouette.de/william/krims/tricopter/matlab2.wmv

http://www.villalachouette.de/william/krims/tricopter/matlab.jpg

goara
28.07.2009, 21:11
du phreak ;)
nicht sonderlich nützlich aber aber sieht toll aus ...
wie bekommst du denn das Modell da rein? Ist das in Matlab gecodet oder irgendwie importiert?

Willa
28.07.2009, 21:46
Das ist mein CAD Modell vom Copter. Hab beim Fileexchange einen stl importer gefunden, dann hab ichs mal probiert. Geplottet ist das mit der "patch" Funktion. Die Programmierung hat sogar nur 1 Std. gedauert.

nicht sonderlich nützlich aber aber sieht toll aus ...
Was ist denn in diesem Forum schon nützlich...? Aber so ein Teil als Overlay bei einem onscreen Display... Das wär ma was.

holzi
22.10.2009, 04:46
Guten morgen,
Willa, wie hast Du das 3D-Modell Deines Kopters ins Mathlab bekommen? Ich möchte die Bewegungen meines Modell auf diese Art anzeigen lassen.

Peter

Willa
22.10.2009, 07:24
Moin,
man muss sein 3D modell als ascii .stl aus einer beliebigen CAD software exportieren. Dann gibts beim FileExchange die Function "CAD2MATDEMO", mit der man das importieren kann. In der Funktion sieht man dann wie es gemacht wird.