PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : RP6 Terminal über PC ansprechen



Biohazardry
24.02.2011, 17:32
Hi,

Weiß einer wie ich das Terminal des RP6 auslesen bzw. Befehle geben kann??
ganz nach den Vorbild von Fabin.E's Fernsteuerung.

So jetzt kommt das große Problem: ich möchte das Terminal mittels LabView auslesen. (Weil ich bereits eine Find & Track Routine in LabView fertig herumliegen habe).
Bei meinen ersten stümperhaften Versuche den Serial Port anzusprechen (bei mir COM3) schaltete sich der Robby immer ab... (Keine Ahnung ob er aus war, jedenfalls leuchteten keine LEDs und er reagierte auch nicht auf den Schalter)
Hat einer ne Ahnung was ich falsch mache?

Benutzte Einstellungen waren
COM3|Baud38400|8Bits|Parity:none|Stopbits1.0

Gruß Biohazard

radbruch
24.02.2011, 17:51
Hallo

Beim RP6 wird die Resetleitung über das RTS-Signal der seriellen Schnittstelle gesteuert. Ein Terminal muss deshalb diese Leitung auf High setzen, sonst dümpelt der RP6 in einem Dornrösschenschlaf vor sich hin. Da ich LabView nicht besitze, kann ich nicht sagen, ob es das beherrscht:

http://www.google.de/search?q=labview+rts-signal

Gruß

mic

P.S.:
Lustig, es ist schon RTS, aber das kann man nur erahnen. Im Schaltplan des USB-Interface geht die RTS-Leitung (Pin 6 des FT232RL) auf die interne DTR-Leitung, diese wiederum endet am Prog-Sockel an Pin 10. Auf dem RP6 ist aber Pin 1 des Prog/Usart-Sockels als MReset verbunden und geht von dort auf den Resetpin (Pin 4 vom Mega32). Das funktioniert nur, weil das Flachbandkabel gekreuzt aufgelegt ist. Das muss man aber wissen ;)

Man könnte, wie im Schaltplan der Base auf Seite 2 oben links neben MReset mit einem X für den ISP-Betrieb angedeutet, die Leiterbahn unterbrechen. Dann wird der Resetpin des Mega32 dauerhaft über R3 (10k) mit Vdd verbunden und die serielle Verbindung würde auch ohne RTS funktionieren. Dann kann man aber vermutlich nicht mehr flashen, weil der Loader den Mega32 zur Einleitung des Flashens nicht mehr über die serielle Schnittstelle reseten kann. Möglicherweise würde es händisch mit dem Resettaster des RP6 funktionieren, aber das halte ich für eher unwahrscheinlich.

Biohazardry
24.02.2011, 21:02
Ok danke habs geschaft.... Thx 2 radbruch

Btw weißt du welchen string das Program von Fabin E. zum steuern sendet?

Biohazardry
26.02.2011, 16:16
Ok nach vielen erfolglosen Versuchen der Anstuerung brauche ich jetzt einen "Denkanstoß"....
Ich habe es bereits geschafft einen String an das Terminal des Rp6 zu schicken jedoch werde ich nicht schlau WIE ich den weiterverarbeiten kann oder ich daraus eine Befehl erzeugen kann. Bei der Fernsteuerung von Fabian E. habe ich alles durchgelesen und den Teil welcher die empfangen Daten auswerten und somit befehle setzt nicht gefunden(oder besser: nicht kapiert ;-) ).

Ich möchte bitte keine fertige Lösung sondern nur ein Schema nach den ich arbeiten kann....

Gruß Biohazard

Biohazardry
02.03.2011, 09:03
Hi hat den keine ne Idee?

SlyD
02.03.2011, 10:11
Hallo,

die UART Beispielprogramme vom RP6 hast Du angeschaut und verstanden?
(ich meine das Frage Antwort Spielchen...)


MfG,
SlyD

Biohazardry
02.03.2011, 10:26
Ja habe ich und das mit recieveBuffer[0] und so auch nur kann ich damit kein switch- case betreiben (switch(&receiveBuffer[0]) ) oder ein if-case...
das frage antwort spiel gibt ja nur den empfangenen text wieder aus mit writeString() und verarbeitet ihn nicht weiter....

Hoffe ich hab nicht nur einen einfachen syntax fehler drin :-P

SlyD
02.03.2011, 10:31
Dann schau Dir zusätzlich den Code vom SELFTEST an - such nach "strcmp" !
:)

Biohazardry
02.03.2011, 10:44
Ha hier hab ich den code gefunden....
nur ne kleinigkeit die ich nicht verstehe: wieso

receiveBytesToBuffer(1, &receiveBuffer[0]);

test = receiveBuffer[0] - 48;

?
was hat das -48 da zu tun??

Gruß Biohazard

SlyD
02.03.2011, 10:51
Das ist zwar nicht der Codeteil den ich gemeint habe aber gut - das ist nur zum testen ob auch ne Zahl eingegeben wurde oder einer der Buchstaben die vorher abgefragt werden.

Biohazardry
02.03.2011, 11:06
aso... den ausdruck "strcmp" hab ich nicht gefunden. Aber die while schleife macht ja genau das was ich brauche.

Hab jetzt nur das Problem das er irgendwie nicht zwischen den eingaben unterscheidet...


#include "RP6BaseServoLib.h"
#include "RP6RobotBaseLib.h"

int8_t deltaX = 0;
int8_t deltaY = 0;
char receiveBuffer[UART_RECEIVE_BUFFER_SIZE];


uint8_t test = 0;

void getCMD(void)
{
receiveBytesToBuffer(1, &receiveBuffer[0]);

test = receiveBuffer[0] - 48;

if(receiveBuffer[0] == '0')
{
deltaX = deltaX;deltaY = deltaY;
}
else if(receiveBuffer[0] == 'w')
{
deltaX++;
}
else if(receiveBuffer[0] == 's')
{
deltaX--;
}
else if(receiveBuffer[0] == 'a')
{
deltaY++;
}
else if(receiveBuffer[0] == 'd')
{
deltaY--;
}


}

int main(void)
{
initRobotBase();

writeString_P("\n\n _______________________\n");
writeString_P(" \\| RP6 ROBOT SYSTEM |/\n");
writeString_P(" \\_-_-_-_-_-_-_-_-_-_/\n\n");

writeString_P("################\n");
writeString_P("<<RP6 Base>>\n");
writeString_P(" Servo - Test 1 \n");
writeString_P(" Version 1.20 \n");
writeString_P("################\n\n");
mSleep(2500);

setLEDs(0b111111);
mSleep(500);
powerON();

initSERVO(SERVO1 | SERVO2);


while(true)
{

servo1_position = MIDDLE_POSITION+deltaX;
servo2_position = MIDDLE_POSITION+deltaY;

getCMD();

task_SERVO();
task_RP6System();


}
return 0;
}


das test = receiveBuffer[0] - 48; hab ich der vollständigkeit halber übernommen.

SlyD
02.03.2011, 11:15
Hallo,

> den ausdruck "strcmp" hab ich nicht gefunden

Suchfunktion von Texteditor? ;)


> das test = receiveBuffer[0] - 48; hab ich der
> vollständigkeit halber übernommen.

48 ist ASCII für 0 ;)
Das ist nur für die Abfrage nach Zahlen von 0 bis 9 in dem switch case - brauchst Du also nicht.

Hab leider keine Zeit deinen Code nachzuvollziehen / Fehler zu suchen da musst Du selbst testen woran das liegt.


MfG,
SlyD

Biohazardry
02.03.2011, 11:42
tja die eingebaute suchfunktion findet leider nix...
werde mich aber schon irgendwie durchschlagen...
Thx SlyD

SlyD
02.03.2011, 12:20
> tja die eingebaute suchfunktion findet leider nix...

:roll: Die Anführungszeichen hast Du aber hoffentlich weggelassen...

z.B. Zeile 1003

Biohazardry
02.03.2011, 12:28
ja hab ich und bei zeile 1003 steht bei mir mSleep(500);.... hoffentlich reden wir beide von der gleichen datei :-)
ich habe RP6Base_SELFTEST.c offen

SlyD
02.03.2011, 12:36
Vielleicht hast Du eine alte Version?
Lad mal die aktuelle runter.

Die stellen in dem Programm sind aber auch per durchscrollen und hinschauen sehr einfach zu finden - ein paar if-then-else konstrukte mit strcmp drin.

:)

Biohazardry
02.03.2011, 12:47
Ok passt jetzt hab ich auch diese strcmp gefunden... dank der neuen version:-)
Bisher hat das Programm immer blockiert wenn es auf eine neue eingabe gewartet hat... hoffentlich lässt sich das damit irgendwie lösen..

Gruß Biohazard

fritzyyy
06.03.2011, 07:14
RTS kann man mit einem Eigenschaftsknoten jederzeit in LabVIEW setzen. Im Buch "Praxiseinstieg LabVIEW (http://www.amazon.de/Praxiseinstieg-LabVIEW-Einf%C3%BChrung-Praxis-Experimenten/dp/3772340393/ref=sr_1_1?ie=UTF8&qid=1299395264&sr=1-1)" ISBN 3772340393, ist auf Seite 192 ein Beispiel, wie man mit der RS232 Schnittstelle eine LED ansteuert. Ein, wie oben beschriebener Reset, müsste auf diese Weise möglich sein.

Biohazardry
07.03.2011, 12:46
Thx fritzyyy für die antwort aber ich hab es ehh gewusst wie ich RTS auf Low/High setzten konnte :-) Toll zu sehen das auch noch andere mit LabView da draußen sind....
Gruß Biohazard

Biohazardry
13.03.2011, 17:44
So die Ansteuerung funktioniert mal fürs erste...
http://www.youtube.com/watch?v=rOhR0VNoDxY

Hab sie mit einer Webcam über Labview gesteuert... noch gibt es "Kinderkrankheiten" aber die werden auch noch gelöst: Der Servo wird nicht ständig gepulst sondern nur wenn das Programm einen Befehl sendet; Der Servoarm ist eigentlich nie mit seiner Position zufrieden, deshalb umkreist er die Soll-Position auch bei Stillstand des Lasers.

Bin für Wünsche, Anregungen und Beschwerden offen ;-)

Gruß Biohazard

p_mork
13.03.2011, 18:22
Sieht doch schon mal nicht schlecht aus.

Das ständige Hin- und Herwackeln kommt wegen der Verzögerung der Webcam. Ich würde das einfach so machen, dass das Servo überhaupt nicht bewegt wird, wenn sich der Laserpunkt innerhalb eines bestimmten Umkreises vom Mittelpunkt befindet, z.B. 5% des Bildes.

Kenn mich mit der Lib des RP6 nicht aus, aber man kann doch bestimmt auch abfragen, ob überhaut ein Zeichen empfangen wurde oder nicht. Damit könnte verhindern, dass das Programm beim warten auf neue Zeichen blockiert, und das Servo ständig mit Impulsen versorgen.

MfG Mark

Biohazardry
13.03.2011, 18:42
Das mit einen Zielgebiet in der Mitte einzurichten hab ich mir schon überlegt. Jedoch war die Hauptaufgabe bei diesen Projekt eigentlich die Ansteuerung des Roboter mittels Pc und RS 232 Schnittstelle. Die Kameraverfolgung hab ich nur auf die Schnelle eingebaut um das ganze System zu testen... fließt fix in die 2.version ein.

Biohazardry
14.03.2011, 16:07
So hab gerade versucht auszulesen ob Daten am Port sind welche ausgelesen werden können.... Nach Vorlage von dem Selftest von SlyD. Jetzt mal ne frage wieseo funktionierte


char receiveBuffer[UART_RECEIVE_BUFFER_SIZE+1];

uint8_t getInputLine(void)
{
static uint8_t buffer_pos = 0;
if(getBufferLength())
{
receiveBuffer[buffer_pos] = readChar();
if(receiveBuffer[buffer_pos]=='\n')
{
receiveBuffer[buffer_pos]='\0';
buffer_pos = 0;
return 1;
}
else if(buffer_pos >= 32)
{
receiveBuffer[32]='\0';
buffer_pos = 0;
return 2;
}
buffer_pos++;
}
return 0;
}


bei Selftest und bei mir sagt er das er readChar() und getBufferLength() nicht kennt...

das sind doch Standardbefehle aus der Lib. Oder?

Gruß Biohazard

fabqu
03.01.2012, 16:57
Hi!
Ich lade hier nur eben Biohazardry's LabView-VIs hoch, incl einer Anleitung von ihm.
Natürlich alles mit seiner Erlaubnis :D

Viele Grüße