hallo ihr beiden
wie ich sehe seid ihr fleißig am experimentieren, optimieren, programmieren,...
ich hatte leider in den letzten tagen nicht so viel zeit (z.T. auch wegen dem schönen wetter)
vl. kann ich mich aber trotzdem wieder einmal dazu überwinden auch etwas herum zu tüftlen
@sternthaler
du hattest doch mal nach meinem aktuellen code gefragt: ich glaube es müsst der letzte sein den ich gepostet habe (falls du ihn auch mal probieren willst)
[edit] am 4.9.08 um 18:46
kleine frage am rande:
müssen bei GoTurnArc() oder wie auch immer man sie nennt unbedingt 4 parameter übergeben werden?
würden nicht 3 genügen?
- length (wird als radius oder distance verwendet. je nach dem ob degree=0 oder nicht)
- degree
- speed
auswahl des jeweileigen typs:
-length=0: auf dem stand drehen (entspricht dem früheren Turn())
-degree=0: gerade strecke fahren (entspricht dem früheren Go())
-keins der beiden =0: bogen fahren (entspricht Kurve())
oder wäre es eurer meinung nach besser alle 4 zu verwenden, um die doppelte verwendung von length als radius und distance zu umgehen?
ich werde auf jeden fall in nächster zeit einmal versuchen meine idee als programm zu verwirklichen. dann kann man noch immer entscheiden was besser ist
trotzdem bedanke ich mich bei euch schon mal für die (hoffentlich) kommenden rückmeldungen
[/edit]
[edit] am 5.9.08 um 10:05
wie angekündigt habe ich jetzt meine version fertig gestellt
ich hoffe ihr könnt etwas damit anfangen
hier einmal mein code:
um für mich das zusammensetzten leichter zu machen habe ich erstmal viel gleichbedeutende alte und neue variablen nur mit defines ersetzt. später kann man das natürlich im code ersetzten, um das lesen zu erleichtern
zur zeit funktionierten leider nur Go und Turn (also entweder distance oder degree =0). Kurve hat bei meinen probefahrten noch nicht funktioniet.Code:#include <asuro.h>
#include <myasuro.h>
//defines zur kurvenfahrt
#define BREITE 103 //spurbreite in mm
#define PI 3.141592
//defines, um alte variablennamern weiterverwenden zu können
#define distance length
#define radius length
#define winkel degree
#define enc_count count_a_soll
#define tot_count count_a
#define l_speed speed_a
#define r_speed speed_i
#define GO 1
#define TURN 2
#define ARC 3
void GoTurnArc (
int length,
int degree,
int speed)
{
StatusLED(RED);
unsigned long enc_count;
int count_a=0,count_i=0;
int diff = 0;
int speed_a=speed, speed_i=speed;
int radius_a, radius_i;
float quot, teiler;
long tik_summe;
int typ; //speichert den typ der gefahrenen strecke
/* stop the motors until the direction is set */
MotorSpeed (0, 0);
/* Go */
if (distance != 0 && degree == 0)
{
typ=GO;
/* calculate tics from mm */
enc_count = abs (distance) * 10000L;
enc_count /= MY_GO_ENC_COUNT_VALUE;
if (distance < 0)
MotorDir (RWD, RWD);
else
MotorDir (FWD, FWD);
}
/* Turn */
else if (distance == 0 && degree != 0)
{
typ=TURN;
/* calculate tics from degree */
enc_count = abs (degree) * MY_TURN_ENC_COUNT_VALUE;
enc_count /= 360L;
if (degree < 0)
MotorDir (RWD, FWD);
else
MotorDir (FWD, RWD);
}
/* Arc */
else if (distance != 0 && degree != 0)
{
typ=ARC;
/* calculate tics from distance and degree */
radius_a=radius+BREITE/2;
radius_i=radius-BREITE/2;
teiler=(float)360/abs(winkel); //Bruchteil des Kreises
quot=((float)radius_a)/((float)radius_i);
//berechnen der notwendigen tics am außen- und innenrad
count_a_soll=2*radius_a*(PI*10000L/teiler);
count_a_soll/=MY_GO_ENC_COUNT_VALUE;
}
/* reset encoder */
EncoderSet (0, 0);
/* now start the machine */
if(typ!=ARC)
MotorSpeed (l_speed, r_speed);
else
{
//mindestgeschwindigkeit=70
if(speed<70) speed=70;
//anfangsgeschwindigkeiten berechnen
speed_a=speed;
speed_i=speed_a/quot;
//speed_i=speed;
//Motoren starten
if(winkel>0)
MotorSpeed(speed_i,speed_a); //im Gegenuhrzeigersinn
else
MotorSpeed(speed_a,speed_i); //im Uhrzeigersinn
}
while (tot_count < enc_count)
{
if(typ!=ARC)
{
tot_count += encoder [LEFT];
diff = encoder [LEFT] - encoder [RIGHT];
/* reset encoder */
EncoderSet (0, 0);
}
else
{
//einen Tik abwarten
tik_summe = encoder [LEFT] + encoder [RIGHT];
while (tik_summe == encoder [LEFT] + encoder [RIGHT]);
//Odometrie einlesen
if(winkel>0)
{
count_a=encoder[RIGHT];
count_i=encoder[LEFT];
}
else
{
count_a=encoder[LEFT];
count_i=encoder[RIGHT];
}
diff=count_a-(count_i*quot);
if(winkel > 0) diff*=-1;
}
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) || (l_speed > 244))
r_speed -= 10;
else
l_speed += 10;
}
if(typ!=ARC) MotorSpeed (l_speed, r_speed);
else
{
if(winkel>0)
MotorSpeed(speed_i,speed_a);
else
MotorSpeed(speed_a,speed_i);
}
Msleep (1);
}
MotorDir (BREAK, BREAK);
Msleep (200);
}
vl findet ihr einen fehler
[edit]