PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : gefahren Schrittzahl abrufen in Delphi mit apdcomport



robby05
02.12.2004, 21:28
Hallo,
Kann mir jemand einen Tipp geben wie ich in Delphi 3, die gefahren Schritte bei RM-Motor mit dem #rmp Befehl ermittle, Ich bekomme jedesmal irgendwelche falschen Zahlen oder Buchstaben zurück. und wie kann ich Abfragen ob ein Befehl fertig ausgeführt wurde. Im Beispielprogramm kommt ein Ok zurück.
Motor drehen, Geschwindigkeit , Strom funktioniert sonst alles.
Danke
MFG

Frank
03.12.2004, 00:57
Wenn ein Befehl korrekt verstanden wurde kommt ein ok zurück. Aber wenn eine bestimmte Anzahl von Schritten ausgeführt werdne soll, dann kommt bereits vorher das ok zurück um das Programm nicht zu blockieren.
Ob die Schritte bereits alle ausgeführt wurden läßt sich derzeit in der Software nicht abrufen. Man könnte eventuell die Schrittanzahl abrufen, daran würde man es ja sehen.
Wenn die Schritte abgerufen werden muss eigentlich nur der String der zurückgegeben wird ausgewertet werden. Ich glaub in der ersten Zeile war die Anzahl und in der zweiten zeile ein OK. Steht aber in der Anleitung auch irgendwo.
Wie du die Dekodierung in Delphi hin bekommst kann ich dir allerdings nicht sagen. Mit ein paar Stringfunktionen sollte es aber nicht weiter schwierig sein.

robby05
03.12.2004, 08:13
Danke für deine Antwort
ich habe das Problem mit der Delphi Umsetzung.
Wieviele Zeichen und in welchen Format gibst du den Wert zurück ? bei der
Schrittzahl und das OK (2 mal Char ) ?

Motor um 600 Schritte drehen lassen mache ich so ( das funktioniert ) :

procedure TForm1.Button3Click(Sender: TObject);
begin
ApdComPort1.Output := '#rmz' + char(1) + char(88) + char(2); // Motor drehen
end;

Das auslesen der gefahren Schritte

procedure TForm1.Button8Click(Sender: TObject);
var
empfangsbuffer: longint;
begin
ApdComPort1.Output := '#rmp' + char(1); // Motor stoppen Strom an
// hier war mal ne Warteschleife
ApdComPort1.GetBlock(empfangsbuffer,4);
//empfangsbuffer:= ApdComPort1.getchar();
Label1.Caption := inttostr(empfangsbuffer);
end;

Auch wenn der Motor steht und ich drücke den button kommen immer verschiedene Wert raus. Je nach Vereinbarung Zeichen oder Zahlen
MfG

Frank
03.12.2004, 09:43
Von Delphi hab ich leider keine Ahnung, daher kann ich es nich konkret sagen.
Du darft jedenfalls die Bytes nicht binär auswerten denn die Schritteanzahl wird im Klartext (ASCII) übertragen. Die Byte-Anzahl kann also immer etwas anders sein. EInfach String einlesen bis "OK" kommt und dann die erste Zahl aus String interpretiereren.
Du kannst es ja mit dem PC RS232 Steuerprogramm mal selbst austesten, dort siehst du die Rückgabe im LOG Fenster unten.
Also wenn Motor steht, dürften eigentlich keine unterschiedlichen Zahlen raus kommen, prüf das mal mit dem PC-Steuerprogramm.

Gruß Frank

robby05
03.12.2004, 13:59
Danke für Deine Antwort
Ich bin davon ausgegangen das nur 2 Char von dem RN-Motor kommen.
(aber da kommt ja viel mehr) Ich kann nun alles auslesen. Zwar noch nicht ganz so, wie ich das will, aber das wird schon, hoffe ich [-(
MfG

robby05
14.12.2004, 21:43
Hallo,
die Abfrage ob der Motor fertig ist klappt jetzt, nur habe ich ein Problem das es viel zu lange dauert bis die Schnittstelle anwortet, wenn ich nur einen Schritt ausgebe und auf das fertig warte dauert es 1 Sekunde, bei 50 Schritten ist das auch 1 Sekunde, es ist fast egal welche Geschwindigkeit ich den Motor gebe. Nun habe ich bemerkt das ich auch mehrere Befehle hintereinander geben kann (ohne Abfrage wie weit er ist) und er macht es trotzdem richtig z.b so :
if Motor_SendSteps(1, strtoint('1')) then // Hier wird nur gefragt ob der
if Motor_SendSteps(1, strtoint('2')) then // Motor den Befehl bestätigt
if Motor_SendSteps(1, strtoint('200')) then // hat
if drehrechts(1) then // drehrichtung ändern
if Motor_SendSteps(1, strtoint('50')) then
if Motor_SendSteps(1, strtoint('10')) then
Sobald der Motor aber den Befehl zur Drehrichtung ändern bekommt macht der das sofort und unterbricht (in diesen Beispiel) die ausgabe der 200 Schritte ändert die Drehrichtung und macht vermutlich mit den restlichen Schritten von den 200 weiter. Meine Frage: ist das im Programm auf dem Chip so vorgesehen oder mache ich was falsch. ISt es möglich an dieser Baugruppe noch mechanische Endabschalter abzufragen ?
Vielen Dank
MfG

Frank
14.12.2004, 23:44
Hi robby05!
Die Schrittzahl wird beim Richtungswechsel auf 0 gesetzt, das ist ja in den meisten Fällen auch sinnvoll so.
Ich verstehe nicht so ganz genau was du überhaupt vor hast mit der Abfrage - aber vielleicht liegt das daran das ich schon im Halbschlaf bin ;-)

Der Grundgedanke den ich bei dieser Funktion hatte war folgender: Man gibt dem Roboter den Befehl in eine bestimmte Richtung zu fahren. Danach braucht sich das Hauptprogramm nicht mehr um den Schrittmotor kümmern, die Motoren steuert ja alleine RN-Motor. Der Controller kann also seine ganze Rechenzeit für andere Aufgaben nutzen, zum Beispiel um ständig die Hindernis-Sensoren zu prüfen. Wird nun ein Hindernis festgestellt (durch Sharp Snsor, Ultraschall, Kontakt oder was auch immer), dann wird der Stop Befehl an RN-Motor geschickt. Danach kann der Controller in aller Ruhe RN-Motor befragen wieviel Schritte gefahren wurden. Daraus kann nun der Controller die gefahrene Strecke und auch ungefaire Position berechnen. Danach dreht er den Roboter um einen bestimmten Winkel (je nach Aufgabe) und startet fahrt wieder erneut.
Die Abfragezeit von ein paar ms sind da eigentlich völlig nebensächlich.

Das war mein Vorhaben. Aber da du das ganze offenbar mit PC steuerst weiss ich nicht was du für ein Ziel hast. Vielleicht musst du einfach das Grundkonzept überdenken. Du kannst Dein Projekt ja mal näher beschreiben.
Wie eben geschildert ist es eigentlich recht einfach Endabschalter in dem normalen Steuerprogramm abzufragen, irgendwas muss das ja auch zu tun haben :-)

Gruß Frank

robby05
15.12.2004, 10:25
Hallo Frank,
danke für deine Antwort.
Ich möchte die Ansteuerung für eine CNC Fräse nutzen.
Ich lese mir einen Text als Bild in ein Programm und erstelle mir daraus die Befehle welche ich benötige um die Fräse zu überzeugen den Text auszufräsen. Ich habe also zur Ausgabezeit eine Tabelle mit den Koordinaten die jeder der 3 Motoren anfahren soll, die ich dann nacheinander ausgeben will.
Nun mache ich folgendes, ich gebe den Schritt aus und warte auf ein OK dann gebe ich den nächsten Schritt aus (das können 100 Schritte in einen Befehl aber eben auch bloß einer sein.)
Im Programm hatte ich dann zusätzlich noch die Schritte abgefragt und erst wenn diese fertig waren, bin ich ins Hauptprogramm zurück und das dauert eben ewig, zumindest ist das nicht vertretbar wenn ich nur wenige Schritte ausgebe. Da brauchte ich 7 Tage um alles abzufahren.
Nun kommt eben mein Problem, ohne der zweiten Abfrage weiß ich nicht ob der Motor fertig ist, wenn nun ein Befehl zur Richtungsänderung kommt löscht er mir die noch offenen Schritte. Ohne Richtungsänderung ist es kein Problem da konnte ich im Test mehr als hundert Befehle hintereinander so absetzen. (Wobei ich auch hier noch nicht die Grenze kenne) Es kann natürlich nun auch sein das der Motor bei einer Änderung der Geschwindigkeit auch die Schritte zurück setzt.
Während der Berechnung der Befehle lohnt sich eine Ausgabe nicht, da diese ja nicht lange dauert.
MfG

Frank
15.12.2004, 10:52
Hi robby05,

aha, jetzt ist es schon klarer. Ja für eine CNC-Fräse ist die Firmware in RN-Motor eigentlich nicht sehr sinnvoll. Das Board wurde je vor allem in Hinblick auf Robotik-Anwendungen entwickelt, denn für CNC gibts ja schon eine ganze Reihe von Boards, speziell für Robotik gab´s noch garnix weil den meisten Herstellern die Zielgruppe viel zu klein ist.

Von daher ist zumindest das Betriebsystem von RN-Motor für deine CNC-Anwendung nicht so toll geeignet. Die Anforderungen die zu unterschiedlich. Man müsste also eine neue Firmware für RN-Motor schreiben um auch das besser lösen zu können. Leider fehlt mir momentan die Zeit, aber wer AVR programmieren kann, kann sich hier vielleicht was ausdenken.
Es kommt im nächsten Jahr noch ein weiteres Motorboard raus, das wäre dann eventuell für deine Anwendung günstiger.

Oder wie gesagt Firmware-Änderung - damit kann man auch RN-Motor an fast alles anpassen. Aber es müssen dann Atmel Mega8 Kentnisse vorhanden sein.

robby05
15.12.2004, 11:24
hallo frank,

ist für das Betriebssystem der Quellcode erhältlich ?
Wenn ich richtig verstanden habe, brauchte ich zum programmieren nur ein Kabel und die Software oder ?

MfG

RCO
15.12.2004, 12:19
Einen Programmieraddapter brauchst du. Und natürlich die Software in Bascom-Basic oder C. Compiler in C ist kostenlos!

Aber mal kurz eine andere Frage, wie bringst du es fertig mit Delphi Daten über Rs232 zu senden und zu empfagen, könntest du mir da mal ein Programm schicken, ich habe bisher nur ein Terminalprogramm in Delphi gefunden, dass ich umschreiben wollte, aber das läuft nicht sehr stabil. Gibts da nicht eine DLL mit fertigen Funktionen oder so? Wie machst du das?

MFg Moritz

robby05
15.12.2004, 16:37
Hello ,
Die Ansteuerung selbst habe ich auch nur übernommen (im Netz gefunden), kommt ohne Komponenten aus.
Es gibt auch eine Komponente die nennt sich tpapro_4_06
http://sourceforge.net/projects/tpapro
wenn du möchtest schicke ich dir die Quelle von meinen Programm zu, Es ist erst am Anfang lesen, schreiben klappt aber
Ich brauchte dazu deine Mail.

MfG

RCO
15.12.2004, 18:04
Das wäre echt super, dann hätte ich dieses Problem gelöst.
Meine E-mail: MoritzMK@gmx.de
Danke

MFG Moritz

Frank
15.12.2004, 19:42
Hi,
richtig, du brauchst nur ISP-Kabel und einen Compiler und ein wenig AVR Programmierkennisse. Anhand des Schaltplanes und Anleitung sollten alle Infos vorhanden sein.
Meinen Quellcode kann ich zwar nicht anbieten, weil ich irgendwie für die Zeit die die Software mich kostet, mir auch eine kleinen Entlohnung vorbehalten will. Aber ich finde es durchaus gut wenn noch andere versuchen eine geeignete Firmware hin zu bekommen. Beachte hier auch das Open Source Unterforum, hier wird gerade eine Getriebemotor Firmware für RN-Motor gebastelt: https://www.roboternetz.de/phpBB2/viewforum.php?f=37

Mehrere Firmware Varianten sind durchaus gut, damit lassen sich mehr Anwendungsfälle abdecken und zudem erhöht der Wettbewerb die Qualität ;-)

robby05
15.12.2004, 21:04
Hallo,
das du den Code nicht rausrücken, willst kann ich schon verstehen, es war aber ein Versuch wert .
ich glaube eher nicht, das ich das hin bekomme, ich schaue mir es auf jedenfall an. Ich will ja nicht das sich der Baustein in Rauch auflöst.
Ich werde erst mal vor jeden Richtungswechsel fragen ob der Motor noch dreht und testen wie lange der dann braucht.
Vielen Dank noch mal.
und Moritz die Mail ist raus ich hoffe es hilft dir.
MfG