Um die Motoren zu stoppen ist lediglich ein _copro_stopImmediate();_ nötig.
Um die Motoren zu stoppen ist lediglich ein _copro_stopImmediate();_ nötig.
Hallo freekwave
1.) "copro_setSpeed(20,20)" heißt, dass der NIBO2 mit ca 7cm/s (linkes Rad, rechtes Rad) fahren soll - und das macht er, bis er entweder einen Stopp-Befehl erhält oder man die Speed ("copro_setSpeed(0,0)" auf NULL setzt.
2.) Ich habe mir mal kurz Dein Programm angesehen - man sollte in der main keine Funktionen deklarieren, sondern sie nur verwenden; die Deklaration sollte außerhalbe der main erfolgen
3.) mit while(1==1) in einer Funktion zu arbeiten ist sehr gefährlich, da gibt es keine Abbruchbedingung => wird IMMER WEITER durchgeführt
4.) "while(copro_distance[2]<3){ motor_geradeaus (); }" => das fkt so nicht, denn: solange der Abstand < 3 ist, soll der NIBO geradeaus fahren => Du liest aber in der while-schleife NIE den neuen Abstand ein(copro_update!!)
mfg
Hero_123
Hallo.
Ich hätte da auch mal eine Frage zur Programmierung und zwar würde ich gerne
Mittels nds3_get_dist(); ermittelte Werte über XBee versenden. Den ermittelten
Wert speicher ich wie folgt:
uint8_t dist_val1 = nds3_get_dist();
Über XBee lassen sich anscheinend nur Zeichen im Hex-Format versenden.
Mein Problem ist jetzt irgendwie den gespeicherten Wert in dist_val1 in
einzelne Hex Werte zu zerlegen. Mir wäre schon geholfen, wenn ich wüßte,
wie ich den Wert in dist_val1 in einen _array_ kriegen würde. Natürlich nicht
als _string_, sondern irgendwie in der Form array[0]=1; array[1]=8; array[2]=0;
Besser wäre natürlich noch array[0]=0x31; array[1]=0x38; array[2]=0x30;.
Vielen Dank.
Lieben Gruß
sourcecode
Hallo sourcecode
mal ein paar Fragen zu Deinen XBEEs - wie hast Du die denn konfiguriert, mit welcher Baudrate sendest Du, welches Terminalprogramm verwendest Du, wie hast du den FDT-Treiber konfiguriert?
Ich habe bei meinen XBEE Modulen ein seltsames Phänomen - ich verwende als Anzeige hterm, ein XBEE ist als Enddevice, das andere als Coordinator konfiguriert (hängt am PC - USB). Wenn ich nun das erste Mal das Modul am USB anstecke, hterm starte und den NIBO einschalte (der dann sofort das Senden beginnt), empfange ich die Daten am PC problemlos. Wenn ich das hterm beende ("disconnect" und Programm beenden) und dann wieder starte und connecte, empfange ich weiterhin Daten (soweit, so gut).
Wenn ich nun mich wieder disconnecte, den NIBO AUSSCHALTE und nach ca 3 min wieder EINSCHALTE und mit hterm wieder Daten empfangen will, fkt es nicht mehr - ich empfange einfach keine Daten mehr vom NIBO, obwohl er sendet; ich kann aber Daten an den NIBO senden. Erst wenn ich alles ausschalte (also auch den PC neu boote) kann ich wieder daten vom NIBO empfangen...
Hast Du dieses Phänomen auch schon mal gehabt, dass keine Daten mehr empfangen werden, wenn der NIBO aus- und dann nach ca 3 min wieder eingeschaltet wird???
Hero_123
Hallo Hero_123,
das Phänomen kann ich nur bestätigen. Passiert bei mir von Zeit zur Zeit auch.
Manchmal reicht es den XBee-Explorer (USB) aus zu stöpseln und wieder ein
zu stöpseln - manchmal muß ich auch komplett den Rechner neu starten.
Konfiguriert habe ich die XBee's ebenfalls als Coordinator und Enddevice. Baudrate 57600.
Als Terminalprogramm verwende ich X-CTU.
FTDI-Treiber Konfiguration: Senden/Empfangen 4096 Bytes
Wartezeit: 1ms
Timeouts Lesen/Schreiben: 0
sourcecode
Hallo sourcecode
Einerseits freuts mich, dass Du die gleichen Probleme hast wie ich- anderseits ist das echt sch***
- könnte mir vorstellen, dass es am FTDI-Treiber liegt, habe es mit dem "alten" und dem "neuesten" Treiber ausprobiert - kein Unterschied...werden wohl damit leben müssen (also den NIBO NICHT ausschalten)..mein Treiber ist wie Deiner konfiguriert; ein wirklich gutes Terminalprogramm ist hterm - läuft auch auf WIN 7!
Zu Deiner Frage - ich übertrage mit dem XBEE z.B die Drehzahl und lass sie mir im hterm als Dezimalwert anzeigen - dazu wandle ich den Wert und speicher ihn und schicke dann den Wert charweise über das XBEE-Modul: anbei einige Code-Schnipsel:
#define buf 80 /* Groesse Char-Buffer Wert einlesen - Empfangsbuffer */
char buf_ges[buf]; /* gesamter Buffer zum Werte rausschreiben */
char temp_buf[8]; /* temporaerer Buffer zum zwischenspeichern */
itoa((int8_t)copro_speed_l, temp_buf, 10); /* umwandeln und speichern der Speed links */
strcat(buf_ges, temp_buf);
usart_puts(buf_ges);
/* Funktion, um Character auf Terminal auszugeben */
extern void usart_putc(unsigned char c) {
while(!(UCSR1A & (1 << UDRE1))){
}
UDR1 = c;
}
/* Funktion, um String auf Terminal auszugeben */
extern void usart_puts(char *s) {
while (*s){ /* solange nicht Stringende erreicht */
usart_putc(*s); /* Aufruf Fkt usart_putc(*s) */
s++; /* Zeichen um 1 weiter zaehlen */
}
}
hoffe, das hilft ....
Hero_123
edit: habe vergessen zu erwähnen, dass bei mir über den UART1 gesendet wird (ich habe mir meine eigenen UART1-Fkt geschrieben), das XBEE Modul habe ich über SteckerX6 angeschlossen; verwendest Du das XBEE-Modul von nicai?
Geändert von Hero_123 (22.12.2011 um 21:54 Uhr)
Hallo Hero_123,
vielen Dank für die Code Schnipsel. Momentan kann ich damit noch nicht sehr viel anfangen.
Ich denke bzw. hoffe das es für meine Problemlösung etwas einfacher gehen sollte/dürfte
Werde mich die Tage nochmal damit beschäftigen.
sourcecode
Lesezeichen