PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Servoansteuerung von PC nach SD21 über Java



Morbius
04.03.2005, 08:11
Hallo zusammen!!

Ich benötige EURE Hilfe bei der Realisierung meines Projekts, der Ansteuerung von Modellservos mit Hilfe eines PC, da ich nicht mehr weiter weiss, was ich falsch mache.
Ich habe mit von Jörg Pohl ( Roboterteile) den SD21 gekauft und möchte diesen nicht über einen PIC , sondern mit Hilfe des PC ansteuern.
Um dies zu realisieren habe ich in den entsprechenden Foren gesucht und mich bei google herumgetrieben. Nach auffinden entsprechender Hilfestelleungen habe ich mir ein I2C Interface ( RS232 to I2C) gebaut und ein kleines Java Programm abgeändert. Das I2C Interface besteht aus einem MAX232 und einem 7406 Baustein. Der Quellcode funktioniert soweit ich das sagen kann, da keine Fehlermeldungen ausgegeben werden. Habe leider auch kein oszilloskop, wo ich das nachprüfen könnte, was am Port ausgegeben wird.
Das Programm wird auf einem Acer Laptop mit 1,6 Ghz und 265 MB Arbeitsspeicher ausgeführt. Betriebsystem XP.

Da ich nicht weiß , wo nun der verflickste Fehler stecken könnte, benötige ich Eure Anregungen, Hilfestellungen und und und....
Sollte noch irgendetwas unklar sein, bitte ich dies zu Entschuldigen, aber das ist mein erstes Foren Thema!!!


PS: Die Variable : static int DEFAULT_BAUD muss auf 19200 geändert werden.

Manf
04.03.2005, 08:34
RoboterNetz.de Foren-Übersicht » Roboter-Foren » Buchempfehlungen » Servoansteuerung von PC nach SD21 über Java
Nach der Beschreibung weiß ich ehrlich gesagt noch nicht welches Buch hier empfohlen wird.
Manfred

Morbius
04.03.2005, 08:52
OH!!
Ich sehe gerade, das ich im falschen Form bin!!
Sorry!! Werde versuchen es zu ändern.

PicNick
04.03.2005, 08:58
Ich würd' mal sicherstellen, daß die Java <> Rs232 Geschichte sicher funktioniert, man hört hier im Forum von Problemen, wo ich aber nix zu sagen kann.
Steck' das I2C Interface mal ab
Verbinde am RS232 Stecker die Pins 2 u. 3 (rx/tx)
Jetzt müßtest du alles, was du mit java richtung rs232 rausschickst, 1:1 wieder zurückkommen. Schlimmstenfalls baust du einen Java-Test-Türken.
Erst dann wär' ich mir sicher, daß dein Programm wirklich mit dem Interface quasseln kann.
Da ich weiß, daß das SD21 wie ein Büffel tadellos funktioniert, kannst du dich dann wirklich auf das Interface konzentrieren.
Provoziere am I2C Bus Zustände, die vorhersagbare Fehlermeldungen und Reaktionen hervorbringen müssen. (Bus belegt / wieder frei z.B)

Morbius
04.03.2005, 09:26
Also das mit dem Verbinden der Pins 2 und 3 werde ich ausprobieren. Könnte interessant sein zu sehen was geschieht.
Was ist eine Java - Test-Türken? Habe ich noch nie gehört.
Ich gehe mal auch davon aus, dass das I2C nicht so richtig funktioniert, warum kann ich nicht sagen! Die Bauteile werden mit Strom versorgt, dass konnte ich nachmessen. Das Java Interface funktioniert soweit ich sagen kann auch, da ich mit dem Hypterteminal den COM Port 1 geöffnet hatte und ich dann versuchte, auf diesen mit Java zu zugreifen. Das Resultat von Java: Der Port wird bereits verwendet.

Joerg
04.03.2005, 09:37
Hallo Morbius,

bin seit längerer Zeit mal wieder hier und gleich über dieses Posting gestolpert.

Wie schon vor einiger Zeit per Mail geschrieben, kann ich zu den I2C-Interfaceroutinen nichts sagen/schreiben.
Ein Oszi wäre hier sicher hilfreich um zu sehen, was sich an den Ausgängen überhaupt tut.

Ich habe mir nochmal das Mainprogramm angesehen, hier sind allerdings ein paar Sachen nicht ganz korrekt.


servo = s;
System.out.println("Servo " +s);
position = 1500;
speed = 2;
[...]
packet[1] = servo;
packet[2] = position;
packet[3] = speed;

In Packet[1] gehört die Registernummer rein. Die ist jedoch nicht mehr identisch mit der Servonummer (wie beim SD20), sondern folgendermaßen aufgebaut:
Register Servo Belegung
0 1 Speed
1 1 Low byte Position
2 1 High byte Position
3 2 Speed
1 2 Low byte Position
2 2 High byte Position

4 3 Speed
......
60 21 Speed
61 21 Low byte Position
62 21 High byte Position

Obiges Programm kann also nicht funktionieren, zumindest müssten die Servos ziemlich wahllos positioniert werden.
Zum Ausprobieren würde ich dir die erweiterten (und zum SD20 kompatiblen) Register ab Register 63 empfehlen.
In Register 63 wird dann die Byteposition (1-linker Anschlag, 127-Mitte, 255 anderer Anschlag) für Servo 1 geschrieben, in Register 64 dann für Servo 2 usw.


servo = s + 62; // Servo1 = Register 63
position = 1; // linker Anschlag,
[...]
packet[0] = (int)SD21_ADDRESS;
packet[1] = servo;
packet[2] = position;
[...]
outputStream.write((int)packet[0]); // ob das so geht, keine Ahnung!!!
outputStream.write((int)packet[1]); // wichtig, I2C arbeitet immer byteweise
outputStream.write((int)packet[2]);
[...]




Ansonsten tippe ich auch eher, wie PicNick schon geschrieben hat, auf einen Fehler in den Interfacegeschichten.

HTH und Viele Grüße
Jörg

PicNick
04.03.2005, 09:45
Nicht vergessen: Der SD21 hätt gern Zahlen zwischen 1000 ( links) u. 2000 (rechts) in den unteren Registern (->Doku)
mfg

Joerg
04.03.2005, 09:59
Hi PicNick,


Nicht vergessen: Der SD21 hätt gern Zahlen zwischen 1000 ( links) u. 2000 (rechts) in den unteren Registern (->Doku)

yep. Und weil das eine zusätzliche Fehlerquelle ist (Lowbyte, Highbyte -> was kommt zuerst), rate ich bei Problemen immer zuerst die Register ab 63 zu nutzen (Byteregister). Wenn das dann funzt, kann man mit den mächtigeren 16bit-Registern und den Zeitwerten und Geschwindigkeitswerten arbeiten.

Bei meinem Hexapoden nutze ich übrigens die Byteregister ab 63 und zusätzlich die Speedregister. Geht einwandfrei.

THX und Viele Grüße
Jörg

PicNick
04.03.2005, 10:11
Was ist eine Java - Test-Türken?
Ein Türke ist ein Programm, das so tut, als ob.
Gemeint ist eine (Kopie) Version von deinem Programm, das keinen Wert auf sinnvolle Abläufe legt, sondern nur den gewünschten Effekt (in deinem Fall "ECHO") visualisiert.
Das Programm im original kriegt ja nich einfach was rein, sondern muß es sich vom Bus explizit holen, das ist zum Testen natürlich nix.

Morbius
04.03.2005, 10:13
Vielen Dank an euch!
Die Doku habe ich gelesen, nur habe ich mit Registern nicht so viel Erfahrung. PicNick, wäre es möglich,das du mir den Java Quellcode so anzupassen könntest , dass ich den ersten Servo ansteuern kann.Vielleicht bekomme ich dann einen besseren Einblick in die Funktionsweise mit den Registern.

THX
Morbius

PicNick
04.03.2005, 10:19
Oh je, auf dem parallel-Thread hat ein gewisser MJA, seines Zeichens Java-Guru (und Fan), versprochen, sich deines Codes anzunehmen und sich zu rühren. Ich denk' (hoffe), der ist schon am Werken.

Morbius
04.03.2005, 10:26
Auch an dieser Stelle ein herzliches Dankeschön an alle!!

Gruss
Morpheus

PicNick
04.03.2005, 10:45
Ich hab' mir den Schaltplan vom Interface angesehen, das von robotikhardware vertrieben wird. Wenn diese Schaltung deiner entspricht, wär's schon eine Leistung, da was falsch zu machen.
ABER:
Schau dir sicherheitshalber dein Verbindungskabel an. Ganz sparsame Versionen leiten NUR rx/tx durch
UND
Es gibt Null-Modem (ausgekreuzt) und einfache Verbindungskabel. (erkennbar am Geschlecht der Stecker)
Schau dir mal deine Verdrahtung GENAU an.
Is'n herrlicher Flop, wenn da was nicht stimmt.

Morbius
04.03.2005, 11:05
Hallo PicNick!!

Die Schaltung habe ich mir selbst gebaut. Als Verbindungskabel verwende ich ein Bandkabel. Ich wollte mir zwar noch das Interface bei robotikhardware kaufen, bloß haben mir die Versandtkosten von fast 7 Euro abgeschreckt. Ich denke mal ich werde den Vorschlag von Jörg in den Quellcode umsetzen. Mal sehen, viel leicht steckt der Fehler darin!!

MFG
Morbius

tobimc
12.03.2005, 21:07
HI

bin ja brandneu Mod im Buchforum, und da dieser Thread definitiv nicht da rein passt, hab ich's mal schnell ins PC-Forum verschoben.

Kann jedem mal passieren ;D

So; das war sozusagen die erste 'Amtshandlung' :D

Ganz liebe Grüße,
Tobi

PicNick
13.03.2005, 07:21
Tobi ! Dein erster selbstverschobener Thread !
Da müssen wir ja sofort eine Flasche köpfen !

:cheesy:

tobimc
17.03.2005, 13:52
Hi

OK... :cheesy:
*köpf*

Grüße, Tobi