PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Fragen zum Setup (omnidirektional gesteuerter Roboter)



xxxsnowxxx
11.11.2009, 14:12
hallo
bin neu hier im forum und habe im rahmen meines studiums folgendes projekt am laufen:

per Joystick soll eine Roboterplattform mit 3 Omniwheels gesteuert werden, dazu habe ich schon folgendes Setup vor Ort:

PC --> über RS232 --> RN-Funk --> über Funkverbindung --> RN-Funk --> RN-Control --> 2 x Motortreiber MD23 --> 3 EMG Motoren mit jeweils einem omniwheel

EDIT: hier mal ein bild, ist noch nicht ganz fertig, fehlen immer noch einige teile, aber ist schon mal schön zu sehen:

http://fotoalbum.web.de/gast/king.erik/omni/printImage?imageId=145887544&imageType=image

Das ganze soll mit einem Netzteil versorgt werden und ich will mit AVR-Studio 4 in C programmieren.
Das Beispielprogramm auf dem RN-Control läuft auch schon nachdem ich jetzt wochenlang mit Fusebits Probleme hatte und mir freundlicherweise ein Kollege da raus geholfen hat :)

da meine Programmierkenntnisse schon etwas eingerostet sind und dies mein erstes Roboterprojekt ist habe ich noch einige Fragen:

wie schließe ich die zwei Motortreiber an das RN-Control an? auf der Roboternetz CD ist ein bild an der der motortreiber mit 3 Kabeln angeschlossen (einzeln eingesteckt), im Datenblatt des MD23 steht dass der Motortreiber über den I2C Bus angeschlossen wird, gibts da einen stecker oder kann ich mir den selbst bauen? muss ich am RN-Control I2C Bus Pin 1 und 3 für I2C Data und I2C Clock verwenden und Pin 2, 4, 6 oder 8 für GND?
wie schließe ich den zweiten Motortreiber dann an? gibt ja nur einen I2C bus, kann ich den zweiten einfach an den I2C bus des ersten anstecken, sozusagen in Reihe? oder bau ich mir einen stecker der beide Motortreiber parallel ans RN-Control anschließt?
gibt es vielleicht ein Testprogramm in C für den MD23? auf der roboternetz CD sind leider nur bascom beispiele, damit kenn ich mich allerdings nicht aus :(

nun zum RN-Funk: ich habe zwei mal den Bausatz bestellt und zusammengelötet, allerdings passiert gar nichts wenn ich die RN-Funk boards mit Stroim versorge, müsste nicht zumindest die grüne LED leuchten? wie finde ich den Fehler? ich kann auch mal ein Bild von meinem RN-Funk posten wenn das hilft, vielleicht seht ihr ja direkt den Fehler.
Den Anschluss zum PC bekomme ich hin, einfach per RS232, aber wie verbinde ich das andere RN-Funk mit dem RN-Control? benutze ich die RS232 oder die RS232 TTL Schnittstelle? welchen Port am RN-Control benutze ich? auch RS232? muss ich bei einem der Boards den Max232 entfernen?

ich hoffe das sind nicht zu viele Fragen und ihr könnt mir helfen. hab schon viel gestöbert hier im Forum und im Wissensteil, hab viel gelernt, aber ein paar Probleme hab ich halt noch.

Danke schonmal

xxxsnowxxx

xxxsnowxxx
12.11.2009, 12:13
ich habe gerade bilder von meinen selbst zusammen gelöteten RN-Funk Boards gemacht.

http://img142.imageshack.us/img142/2268/99384231.jpg

vielleicht kann mir jemand sagen ob ich etwas falsch gemacht hab beim löten oder ob teile fehlen, wäre nett.

danke

Richard
12.11.2009, 15:19
im Datenblatt des MD23 steht dass der Motortreiber über den I2C Bus angeschlossen wird, gibts da einen stecker oder kann ich mir den selbst bauen? muss ich am RN-Control I2C Bus Pin 1 und 3 für I2C Data und I2C Clock verwenden und Pin 2, 4, 6 oder 8 für GND?
wie schließe ich den zweiten Motortreiber dann an? gibt ja nur einen I2C bus, kann ich den zweiten einfach an den I2C bus des ersten anstecken, sozusagen in Reihe?


Moin moin.

I²c ist ein Bus System dabei weden alle Slaves z.B. auch Deine
Motorsteuerungen u,s.w. Parallel angeschlossen. Jeder Slave hat
eine Adresse mit der er angesprochen wird. Lese mal im RN Wicki
den Auifbau von Immmmmm2c nach, dort ist der Adess/schreib/lese
vorgang sehr genau und gut erklärt.

Die Beispiele sind zwar in Bascom, aber so verständlich das die
schnell auf c umgetrickts werden können wenn man das Prinzip
vom Bus verstanden hat.

Gruß Richard

Searcher
12.11.2009, 19:42
Hi,

ich kann zwar nicht beurteilen, ob Du alle Bauteile richtig plaziert hast. Wenn ich aber auf die Fotos von der Lötseite schaue, vertraue ich sehr vielen der Lötstellen nicht. Da sieht mir einiges nach "Kalten" aus. Ich würd alles nochmal heiß machen und fast überall und vor allem da, wo man noch die Bohrlöcher erkennen kann ein Tick Lötzinn draufmachen.

Hab auf die Schnelle kein ideales Bild gefunden, aber so ähnlich wie hier sollten die Lötstellen aussehen:

http://www.grzesina.de/avr/soldering/leiterbahnseite.jpg


Gruß
Searcher

xxxsnowxxx
12.11.2009, 20:45
danke schonmal für die antworten.

das mit dem I2C bus hab ich mit viel lesen inzwischen kapiert, danke richard. die bascom testprogramme laufen auch :)

@Searcher: ok ich werd nochmal etwas lötzinn draufpacken, ich wollte nur nichts zu heiß machen beim ersten mal.

schließe ich das RN-Funk über RS232 an die Ports PD0 (RX) und PD1 (TX) des RN-Control an?

xxxsnowxxx
12.11.2009, 21:07
bei einem der RN-Funk Boards kommt beim Einschalten im Terminal ein Zeichen ( oft ' manchmal aber auch leerzeichen oder irgendwas anderes) wenn ich den RS232 Stecker eingesteckt habe. beim anderen nicht...
heißt das das das eine Board wohl nicht ganz funktionstüchtig ist?

Searcher
12.11.2009, 21:09
Hi xxxsnowxxx

es gibt einige Artikel zum richtigen Löten auch hier im RN-Wissen: http://www.rn-wissen.de/index.php/L%C3%B6t-Tutorial .

Für mich ist wichtig nicht zu heiß aber noch wichtiger, nicht zu lang. Erst Lötspitze auf die Lötstelle. Kurz danach Lötzinn dazu - idealerweise gleichzeitig auf Lötspitze und Lötstelle. Lötzinn muß sich auf der Lötstelle verteilen. Hitze wieder wegnehmen. Wenn's nicht verläuft, liegt es an schlechtem Kontakt von Lötspitze zur Lötstelle oder schlechter Qualität (auch schmutziger) Lötspitze. Beim Nachlöten Lötzinn dazu, wenn vorhandenes Lötzinn schmilzt.

Gruß
Searcher

xxxsnowxxx
12.11.2009, 21:27
alles klar am montag wird also nachgelötet :)

xxxsnowxxx
19.11.2009, 14:28
hi
ich habe jetzt die Lötstellen nochmal nachgelötet und siehe da es funktioniert.
die LED blinkt zwar immer noch nicht und ich weiß auch nicht wofür die denn eigentlich da ist, aber nachdem ich das RN-Funk richtig über RS232 an RN_Control angeschlossen habe funktioniert die Übertragung =)

Searcher
19.11.2009, 15:00
Super, daß es funktioniert,

kenn mich mit dem RN-Funk an sich leider nicht aus und weis somit auch nichts weiter über die LED. Viel Erfolg weiterhin.

Gruß
Searcher

xxxsnowxxx
19.11.2009, 16:26
bin nun dabei den Motortreiber MD23 zu programmieren, nur wie bekommen ich zugriff auf ihn? angeschlossen ist er am I2C bus.

in Bascom sind die Befehle einigermaßen verständlich:

i2c_start
i2c_sendebyte(slaveid)
i2c_sendebyte(wert1)
i2c_sendebyte(wert2)
i2c_stop

aber wie mache ich das in C?
kann mir vielleicht jemand diese Befehle in C übersetzen?
danke

Richard
19.11.2009, 17:16
Gute Frage, von C habe ich leider keine Ahnung. Habe das
früher mal in ASS selber geprogt, im Datenblatt ist das Protokoll
und das Timing zu finden. War nicht besonders schwer, einfach
das entsprechende Byte seriell bitweise rausschieben.
sift Px.y
tackt Toggle x
sift px.y
u.s.w. Natürlich in ner schleife für 8 Bit...
Die Geschwindigkeit muß matürlich mit nop oder ähnlich
gebremst werden, zumindenst in Ass. Zu langsam gibt
es dabei nicht aber zu schnell schon.


Ich vermute aber das es in C auch ne Lib mit ensprechenden
Funktionen gibt. In Bascom sind diese Funktionen halt schon
in der Standart Lib die automatisch von Bascom geladen wird
enthalten.

xxxsnowxxx
19.11.2009, 17:44
ja ich denke auch dass es so eine "I2C Master/Slave Lib" doch geben sollte, wäre schön die zu haben :)

weiß denn jemand wo ich die bekommen kann?

xxxsnowxxx
19.11.2009, 18:23
habe gerade so etwas in der art gefunden: eine I2C Master Library von Peter Fleury:

http://homepage.hispeed.ch/peterfleury/avr-software.html#libs

hier die datei i2cmaster.zip

hab gerade meine motoren ansteuern können, wunderbar =)

ich werde jetzt die platform fertigen lassen und die motoren drauf schrauben, dann gibts ein bild :) (dauert aber wahrschienlich ein paar wochen)

xxxsnowxxx
04.05.2010, 21:45
so nach einer langen pause bin ich wieder am projekt, die fertigung mancher teile dauert ewig, die grundplatte steht und ich bin nun damit beschäftigt mir die software zu erarbeiten.

Hardware immer noch die selbe:
PC --> RS232 --> RN-Control --> 2 x Motortreiber MD23 --> 3 x EMG Motoren

ich arbeite mit AVR studio 4 und habe zur zeit folgendes problem:

ich möchte zum test die Werte der Drehgeber der EMG motoren über die RS232 schnittstelle ins Hyperterminal senden, im MD23 Testprogramm md23drehzahl.bas funktioniert das auch schon.
ich möchte aber nun mit avr studio in C programmieren und bei einem tastendruck die motoren beschleunigen, drehgeberpositionen lesen und an hyperterminal senden.

im bascom beispiel sieht der teil so aus:



Case 4 Zaehler = Md23_impulse(1)
Umdrehungen = Zaehler / 360
Print "Impulse: " ; Zaehler ; " Umdrehungen: " ; Umdrehungen

.
.
.

Function Md23_impulse(byval Motor As Byte) As Long
Local W1 As Byte
Local W2 As Byte
Local W3 As Byte
Local W4 As Byte
Local Impulse As Long
Local I2cread As Byte


I2cread = Md23_slaveid + 1

If Motor = 1 Then
I2cstart
I2cwbyte Md23_slaveid
I2cwbyte 2 'Leseregister festlegen
I2cstop
Else
I2cstart
I2cwbyte Md23_slaveid
I2cwbyte 6 'Leseregister festlegen
I2cstop
End If

I2cstart
I2cwbyte I2cread
I2crbyte W1 , Ack
I2crbyte W2 , Ack
I2crbyte W3 , Ack
I2crbyte W4 , Nack
I2cstop

Impulse = 0
Impulse = Impulse Or W1
Shift Impulse , Left , 8
Impulse = Impulse Or W2
Shift Impulse , Left , 8
Impulse = Impulse Or W3
Shift Impulse , Left , 8
Impulse = Impulse Or W4


Md23_impulse = Impulse
End Function


kann mir jemand sagen wie ich in C bytes aus einem register lese und über rs232 senden kann?
das senden von Text über RS232 mit USART funktioniert, allerdings weiß ich nicht wie ich das register des motortreibers zugreifen auslesen kann und an hyperterminal übermittel.

benutze ich die funktion USART_Transmit(); oder besser sendUSART(); wie im C-Demoprogramm?

ich habe es so probiert, bekomme allerdings nur immer die gleichen festen werte:




unsigned char position;
char buf [4];

sendUSART("\r\n Drehgeberwerte: ");
i2c_init();
i2c_start(0xB0); //Adresse des Motortreiber 1
i2c_write(0xB2); //Adresse Byte 1 Drehgeber 1 Position (aus MD23 Datenblatt)
i2c_rep_start(0xB0+I2C_READ);
position = i2c_readNak();
sprintf(buf, "%03d", position);
sendUSART(buf);
i2c_stop();




über hilfe wäre ich sehr dankbar :)

xxxsnowxxx
04.05.2010, 21:46
wie kann ich außerdem den Titel des Threads ändern?

thx

xxxsnowxxx
27.05.2010, 16:14
okay ich habe das problem mit dem auslesen des drehgebers gelöst, aber brauche noch hilfe beim feinschliff:

habe jetzt diesen, zugegeben umständlichen, code zum motor beschleunigen, drehgeberbytes auslesen und abbremsen geschrieben:




char buffa [4];
char buffb [4];
char buffc [4];
char buffd [4];
int dataa;
int datab;
int datac;
int datad;

/*### Drehgebertest ### */
void vor(void)
{

i2c_init();
i2c_start(0xB0); //Slave Adresse des Motortreiber 1
i2c_write(0x00); //Motor 1
i2c_write(0xFF); //vorwärts
i2c_stop();

waitms(200);


i2c_start(0xB0); //Slave Adresse des Motortreiber 1
i2c_write(0x02); //Byte 2 Drehgeber 1 Position (aus MD23 Data Sheet)
i2c_stop();

i2c_start(0xB1); //Slave Adresse Motortreiber 1 + 1 Bit für Leserichtung
dataa = i2c_read(1); //Lesen
datab = i2c_read(1);
datac = i2c_read(1);
datad = i2c_read(0);

i2c_stop();


sprintf(buffa, "%01d", dataa); //in char umwandeln
sprintf(buffb, "%01d", datab);
sprintf(buffc, "%01d", datac);
sprintf(buffd, "%01d", datad);

sendUSART("\r\n Impulse: "); //senden
sendUSART(buffa);
sendUSART(buffb);
sendUSART(buffc);
sendUSART(buffd);

sendUSART("\r\n Umdrehungen: ");

// hier brauche ich noch eine Umwandlung von den Impulsen zu den Umdrehungen...



waitms(200);

i2c_start(0xB0); //Motortreiber 1
i2c_write(0x00); //Motor 1
i2c_write(0x80); //anhalten
i2c_stop();

}



und es wird mir folgendes am hyperterminal ausgegeben:

http://img17.imageshack.us/img17/6163/ht2z.jpg

leider bekomme ich manchmal eine 8 stellige zahl, manchmal auch nur eine 6 oder 7 stellige :(

außerdem: wie kann ich aus den 4 werten die dann zu den impulsen zusammengesetzt werden ein int machen den ich dann durch 360 teilen kann um so die umdrehungen anzuzeigen?