PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : go funktion



Toschtosch
22.10.2006, 15:56
Hiho,
ich habe für die schule gerade die aufgabe die "go()" funktion der asuro.c in eine "kreis()" funktion abzuwandeln. ich hab mir hier schon mal was überlegt,doch da ich zu hause keinen asuro besitze wäre es schön wenn ihr mal ein auge auf den quell code werft und evtl. mal an eurem asuro testet. desweiteren weiß ich nicht genau ob die mathe formeln unten funktionieren z.b. "((radius+11.5)*2*pi)/100" <-- was müsste ich sonst für den ausdruck schreiben unter c?

Hier der Quellcode:
ps: der kreis soll nach einem angegebenen radius fahren, weiteres sieht unten.

void Kreis(int distance, int speed)
{
int enc_count = 0;
int tot_count = 0;
int diff = 0;
int pi = 3,141592654;
int radius = 50; // angabe des radius, den der asuro fahren soll.
int r_rad = ((radius+11.5)*2*pi)/100; //damit berechnet man 1% vom "rechtenrad-umkreis",die 11.5 ist die spannweite zwischen den beiden rädern.
int l_rad = (radius*2*pi)/r_rad; //hier wird berechnet, wie viel % das rechte rad mehr fahren muss.
int speed1 = (speed/100)*l_rad; // speed1 ist der speed, den das rechte rad mehr fahren muss.
int l_speed = speed;
int r_speed = speed+speed1; // normal speed+speed welches das rechte rad mehr fahren muss.
enc_count=abs(distance);


Encoder_Set(0,0); // reset encoder

MotorSpeed(l_speed,r_speed);
if(distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);

while(tot_count<enc_count) {
tot_count += encoder[LEFT];
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0) { //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) { //Right faster than left
if ((r_speed > speed+speed1) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
Encoder_Set(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
MotorDir(BREAK,BREAK);
Msleep(200);
}


hoffe mal das mir einer helfen kann, oder verbesserungsvorschläge geben kann

mfg Toschtosch


EDIT: ":" durch "/" ersetzt
und
"int speed1 = (speed/100)*l_rad;"
thx für info

Pdd
22.10.2006, 17:07
was mir so jetzt auffällt ist, das man statt : / benutzen muss. : funktioniert nicht. ;) wers nachher mal testen

Toschtosch
22.10.2006, 17:27
achso, jo klar :D
hatte das wie gesagt nur kurz aus der asuro.c rauskopiert und dann für die kreis zwecke umgeändert im notepad.

kannst ja dann nochmal das ergebnis posten von deinem test

mfg
Toschtosch

robby-fant
22.10.2006, 17:48
hatte das wie gesagt nur kurz aus der asuro.c rauskopiert und dann für die kreis zwecke umgeändert im notepad. ....


mit copy/paste lernt man nix.....

Toschtosch
22.10.2006, 17:50
naja die ganze rechnung und überlegungen hatte ich mir vor den ferien schon in der schule gemacht... sprich wie man das probb mit den verschiedenen speed werten lösen kann

Toschtosch
22.10.2006, 17:55
hier noch ne' exel datei, falls die rechnung unklar ist

mfg

michael.bend
22.10.2006, 18:25
.... moin,

ohne Asuro wird das nix. Entschuldige bitte die offenen Worte, aber wenn du das als Trockenübung machst bleibt das alles akademisch und du kannst nie feststellen ob und welche Fehler du gemacht hast. Sag mal deinem Lehrer er soll, wenn er solche Aufgabe vergibt, auch einen bot rausrücken.


Viele Grüße und meld dich mal, (Michael)

Toschtosch
22.10.2006, 18:43
naja in der schule steht uns der robo immer zur verfügung, aber das is ja jetzt auch nich ne sache die ich morgen fertig haben will, sonder ab nächstem montag kann ich ja wieder praktisch dran arbeiten

Pdd
22.10.2006, 20:18
Also ich teste das jetzt mal. ;)

Pdd
22.10.2006, 20:24
Also folgendes Passiert: Er fährt 30cm geradeaus in einer leichten linkskurve. Dann fährt er ein stück zurück. Ist das normal??

Toschtosch
22.10.2006, 20:38
eigentlich nich :)
ich werd das nochma ausgiebig testen wenn ich den asuro wieder vor mir hab

Pdd
22.10.2006, 20:47
k tu das :P Ich werds auch gern wieder testen ;)

Toschtosch
22.10.2006, 21:45
was mir gerad eingefallen ist wegen der linkskurve...

stell den radius doch einfach mal z.b. auf 8,5 oder 10

weil 50cm radius is verdammt groß^^

mfg
toschtosch

stochri
22.10.2006, 21:57
Toschtosch,
beachte bei den Rechnungen, dass Du die Zahlen als Integer definiert hast. Das sind keine Fließkommawerte, man bekommt sehr große relative Fehler, wenn die Zahlen klein sind.
Das dürfte in Deiner Routine zur Fehlfunktion fürhen.

Beachte:

int x,y;
y=x/10;

y wird hier zu Null, da 0.1 in einer Integerzahl nicht dargestellt werden kann.

Gruss,
stochri

izaseba
22.10.2006, 22:14
int pi = 3,141592654;



int r_rad = ((radius+11.5)*2*pi)/100;


Erstaunlich, daß der Lehrer Euch Sachen machen läßt, ohne die
Grundlagen der Sprache beizubringen :-k
Es war zu meiner Schulzeit Gott sei dank noch anders.
Kommen den keine Kompilerwarnungen dabei raus ?
Ich empfehle die Kernighan&Ritchie oder sowas als Bettlektüre.

Gruß Sebastian

P.S. Es ist nicht böse gemeint :wink:

Toschtosch
22.10.2006, 22:16
also müsste ich es in double machen ?!
hmm ich werd mich da morgen nochma dransetzen, thx für die info

mfg
Toschtosch

Toschtosch
22.10.2006, 22:19
hihi izaseba, naja, schon ne weile her das ich c hatte :) merk jetzt aber auch das das nich gehen kann.

öhhm, das probb is, das ich ja momentan ferien habe und es nich testen kann, da die asuro's in der schule stehen. die rechnung etc hab ich mir vor den ferien schon "erarbeitet" nur jetzt kam ich mal dazu den quellcode zu erstellen/abzuändern, wegen urlaub etc :)
mfg

izaseba
22.10.2006, 22:25
Ich empfehle Dir einen freien C-Kompiler auf dem Computer zu installieren.
Man kann so viele Sachen ausprobieren, ohne alles auf den µC zu laden.
Ich mache es immer so, wenn ich irgendwelche Funktionen ausprobieren möchte, wo ich mir nicht sicher bin, ob auch alles richtig ist.
mit printf Werte ausgeben lassen, so kann man besser Fehler finden als wenn das Programm auf dem µC läuft.

Gruß Sebastian

Toschtosch
22.10.2006, 22:31
wir machen den kram unter linux mit dem avr compiler, der is auch ok, aber wie gesagt hab ich atm ferien und kann next week montag erst testen wenn schule wieder anfängt

stochri
23.10.2006, 17:06
öhhm, das probb is, das ich ja momentan ferien habe und es nich testen kann,

Installiere Dir daheim AVR-Studio und teste das Deine Rechnungen im Simulator.

Toschtosch
24.10.2006, 03:09
hallöchen leute, kam gerad nach hause und wollte einfach nochmal kurz in meine daten reinschauen, habe den compiler installiert und ma ein "test" programm geschrieben... also laut compiler gibt es keine fehler bei der umgeschriebenen kreis() funktion.. wäre super nett wenn mal einer kurz sein asuro flashen könnte und gucken kann ob alles so funktioniert wie es funzen sollte.

kreis():


/************************************************** *************************
* void Kreis(int distance, double speed = 150)
*
* input
* distance: postiv->go forward ; negativ-> go backward
* speed: sets motorspeed
*
************************************************** *************************/
void Kreis(int distance, double speed)
{
int enc_count = 0;
int tot_count = 0;
int diff = 0;
double pi = 3.141592654;
double radius = 50;
double r_rad = ((radius+11.5)*2*pi)/100;
double l_rad = (radius*2*pi)/r_rad;
double speed1 = (speed/100)*l_rad;
double l_speed = speed;
double r_speed = speed+speed1;
enc_count=abs(distance);


Encoder_Set(0,0); // reset encoder

MotorSpeed(l_speed,r_speed);
if(distance<0) MotorDir(RWD,RWD);
else MotorDir(FWD,FWD);

while(tot_count<enc_count) {
tot_count += encoder[LEFT];
diff = encoder[LEFT] - encoder[RIGHT];
if (diff > 0) { //Left faster than right
if ((l_speed > speed) || (r_speed > 244)) l_speed -= 10;
else r_speed += 10;
}
if (diff < 0) { //Right faster than left
if ((r_speed > speed+speed1) || (l_speed > 244)) r_speed -= 10;
else l_speed += 10;
}
Encoder_Set(0,0); // reset encoder
MotorSpeed(l_speed,r_speed);
Msleep(1);
}
MotorDir(BREAK,BREAK);
Msleep(200);
}


testprogramm könnte z.b. so aussehen


#include "asuro.h"
#include <stdlib.h>

int main(void)
{
FrontLED(ON);
StatusLED(GREEN);
Kreis(100,110);
}



mfg Toschtosch und gute nacht^^

stochri
24.10.2006, 18:54
Soweit ich weiss unterstüzt der GNU-AVR C Compiler kein double format. Er unterstützt single precession.
Bei kleinen Mikrokontrollern versucht man möglichst ohne Fließkommaarithmetik auszukommen, da bei der Einbindung der Rechenfunktionen sehr viel Speicher verbraucht wird.

Gruss,
stochri

Toschtosch
24.10.2006, 19:41
naja, aber ohne die mathematischen formeln kann der asuro auch schlecht via radius einen kreis fahren :)

hmm, irgendwie doof

Toschtosch
31.10.2006, 15:20
mal ne kleine frage, kann ich anstatt von double nich die gleitkommazahlen in "float" berechnen? oder unterstützt der avr compiler auch kein float? ich find irgendwie nich was der compiler unterstützt und was nich

mfg toschtosch