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
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);
}
zur zeit funktionierten leider nur Go und Turn (also entweder distance oder degree =0). Kurve hat bei meinen probefahrten noch nicht funktioniet.
vl findet ihr einen fehler
[edit]