- LiFePO4 Speicher Test         
Ergebnis 1 bis 10 von 64

Thema: fahrzeug mit vier motoren und vier encodern

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hallo inka,

    Dein robby nimmt ja richtig Gestalt an, klasse!

    Dein erstes Problem liegt in
    Code:
    void alle_stepper_rueckwaerts(void)
    {
      if (hindernis = true)
    im "if" ist eine Zuweisung und kein Vergleich, sprich der Ausdruck ist immer wahr und daher rennt er da immer rein.

    Dein zweites Problem liegt daran, das du in "rotieren_links()" bzw. "rotieren_rechts()" zwar die Stepper richtig konfigurierst, dann die Konfiguration aber nicht mit "fahrt_ausfuehren()" durchführen läßt.
    Statt dessen wird die Stepperkonfiguration in "alle_stepper_vorwaerts()" wieder überschrieben und diese dann in "loop()" ausgeführt.
    Wenn Du die Funktionsaufruffolge

    alle_stepper_vorwaerts
    > rechts_oder_links
    -> z.B. rotieren_rechts

    gedanklich durchgehst, siehst Du das dieses Überschreiben der Seiteneffekt auf die Stepper ist.

    Du mußt also immer auch Überlegen ob nach Deiner Entscheidungsfindung die Stepper nicht nur konfiguriert sondern auch ausgeführt werden müssen.

    Hoffe das bringt Dich einen Schritt weiter.

    Gruß

    Chris

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Hi botty,
    Zitat Zitat von botty Beitrag anzeigen
    Hallo inka, Dein erstes Problem liegt in
    Code:
    void alle_stepper_rueckwaerts(void)
    {
      if (hindernis = true)
    im "if" ist eine Zuweisung und kein Vergleich, sprich der Ausdruck ist immer wahr und daher rennt er da immer rein.
    zu blöd, dass ich immer wieder über so etwas stolpere


    Zitat Zitat von botty Beitrag anzeigen
    Dein zweites Problem liegt daran, das du in "rotieren_links()" bzw. "rotieren_rechts()" zwar die Stepper richtig konfigurierst, dann die Konfiguration aber nicht mit "fahrt_ausfuehren()" durchführen läßt.
    ........

    Du mußt also immer auch Überlegen ob nach Deiner Entscheidungsfindung die Stepper nicht nur konfiguriert sondern auch ausgeführt werden müssen.
    ich dachte dieses " fahrt_ausfuehren();" reicht einmal in der loop? Muss ich dann doch jedes mal nach dem aufruf einer funktion wie z.b. " alle_stepper_vorwaerts();" dieses "fahrt_ausfuehren();" aufrufen?

    übrigens, habe ich - einem vorschlag von Rabenauge folgend - die unübersichtlichen if-abfragen durch switch / case ersetzt. Jetzt sieh es so aus, dass ich hindernisse abfragen kann, mit dem mittleren IR-sensor abfragen kann ob der robby auf einer linie ist und per abfrage der Li/Re IR-sensoren entscheiden kann, ob links zu der linienmitte oder rechts rotiert werden soll. Die grenzparameter für alle abfragen der IR Sensoren stimmen noch nicht, da bin ich noch dran...

    Code:
    // entstanden aus "cruise_avoid_collision_4_2_enum_idx_new_ping"
    
    
    #include <CustomStepper.h>
    #include <NewPing.h>
    
    
    #define TRIGGER_PIN  6  // Arduino pin tied to trigger pin on the ultrasonic sensor. //12
    #define ECHO_PIN     7  // Arduino pin tied to echo pin on the ultrasonic sensor. //11
    #define MAX_DISTANCE 400 // Maximum distance we want to ping for (in centimeters). Maximum sensor distance is rated at 400-500cm.
    
    
    NewPing sonar(TRIGGER_PIN, ECHO_PIN, MAX_DISTANCE); // NewPing setup of pins and maximum distance.
    
    
    uint8_t idx;
    uint16_t distanz;
    uint16_t uS;
    uint8_t bewegung, li_re;
    
    
    uint8_t Analog_Pin_0 = A0; //analog pin 0
    uint8_t Analog_Pin_1 = A1; //analog pin 1
    uint8_t Analog_Pin_2 = A2; //analog pin 2
    
    
    uint8_t IR_Reading_A0; //IR wert analog sensor_0 - links
    uint8_t IR_Reading_A1; //IR wert analog sensor_1 - mitte
    uint8_t IR_Reading_A2; //IR wert analog sensor_2 - rechts
    uint8_t wert_li_A0;
    uint8_t basis_A1;
    uint8_t wert_re_A2;
    
    
    
    
    
    
    enum stepper_e
    { stepper_VL, stepper_HL, stepper_VR, stepper_HR, stepper_MAX };
    
    
    
    
    CustomStepper stepper[stepper_MAX]
    {
      CustomStepper(23, 25, 27, 29),
      CustomStepper(31, 33, 35, 37),
      CustomStepper(47, 49, 51, 53),
      CustomStepper(46, 48, 50, 52)
    };
    
    
    boolean start_ping;
    boolean hindernis;
    
    
    void setup()
    {
    
    
      start_ping = false;
      hindernis = false;
    
    
      Serial.begin(115200);
      Serial1.begin(115200);
      Serial.println("setup_ende");
      Serial1.println("setup_ende");
    }
    
    
    void loop()
    {
    
    
      hindernis_vorh();
      read_IR ();
      print_IR();
    
    
      switch (bewegung)
      {
        default:
          {
            alle_stepper_vorwaerts();
            if (bewegung == 1)
            {
              read_IR ();
              wert_li_A0 = analogRead(Analog_Pin_0);//links
              basis_A1 = analogRead(Analog_Pin_1); //mitte
              wert_re_A2 = analogRead(Analog_Pin_2);//rechts
              if ((basis_A1 <= 240) && (basis_A1 >= 210)) //auf der linie?
              {
              if (wert_li_A0 > 1, 5 * (wert_re_A2)) rotieren_links();
              else if (wert_re_A2 < 1, 5 * (wert_li_A0)) rotieren_rechts();
              }
            }
            break;
          }
    
    
      }
    
    
      fahrt_ausfuehren();
    }
    
    
    /***********************************************************/
    
    
    
    
    boolean fahrt_fertig()
    {
      return        stepper[stepper_VL].isDone() && stepper[stepper_HL].isDone()
                    && stepper[stepper_VR].isDone() && stepper[stepper_HR].isDone();
    }
    
    
    void fahrt_ausfuehren()
    {
      while ( ! fahrt_fertig() )
      {
        for (idx = stepper_VL; idx < stepper_MAX; idx++)
        {
          stepper[idx].run();
          // delay(1);
        }
      }
    }
    
    
    
    
    void ping_distanz(void)
    {
      //delay(500);// Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
      uS = sonar.ping(); // Send ping, get ping time in microseconds (uS).
      Serial1.print("Ping: ");
      Serial1.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)
      Serial1.println(" cm");
      Serial.print("Ping: ");
      Serial.print(uS / US_ROUNDTRIP_CM); // Convert ping time to distance in cm and print result (0 = outside set distance range)
      Serial.println(" cm");
      start_ping = true;
    }
    
    
    
    
    void hindernis_vorh(void)
    {
      if (start_ping == false) ping_distanz();
      if (uS != NO_ECHO)
    
    
      {
        if (((uS / US_ROUNDTRIP_CM) <= 25))
        {
          hindernis = true;
          bewegung = 4;
        }
    
    
        else
        {
          hindernis = false;
          bewegung = 1;
        }
      }
    }
    
    
    void alle_stepper_stop()
    {
      //  stepper_stop = true;
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        stepper[idx].setRPM(0);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(STOP);
      }
    }
    
    
    
    
    void alle_stepper_vorwaerts(void)
    {
    
    
      read_IR ();
      wert_li_A0 = analogRead(Analog_Pin_0);//links
      basis_A1 = (analogRead(Analog_Pin_1) + 20); //mitte
      wert_re_A2 = analogRead(Analog_Pin_2);//rechts
    
    
      if (wert_li_A0 < wert_re_A2) rotieren_links(); //bewegung = 2; //rotiere links
      else rotieren_rechts(); //bewegung = 3;//rotiere rechts
    
    
      if (start_ping == true) ping_distanz();
    
    
      if (hindernis == true)
      {
    
    
        bewegung = 4;
    
    
        Serial1.print(hindernis);
        Serial1.println("  hindernis - true - alle_stepper_rückwärts - if-abfrage_6");
        Serial.print(hindernis);
        Serial.println("  hindernis - true - alle_stepper_rückwärts - if-abfrage_6");
        hindernis = false;
    
    
        for (idx = stepper_VL; idx < stepper_MAX; idx++) //alle Stepper rückwärts
        {
          stepper[idx].setRPM(12);
          stepper[idx].setSPR(4075.7728395);
          stepper[idx].setDirection(CCW);
          stepper[idx].rotateDegrees(60); //rotate(1)
        }
    
    
      }
      else
      {
        hindernis = false;
        bewegung = 1;
    
    
        for (idx = stepper_VL; idx < stepper_MAX; idx++)//alle Stepper vorwärts
        {
          stepper[idx].setRPM(12);
          stepper[idx].setSPR(4075.7728395);
          stepper[idx].setDirection(CW);
          stepper[idx].rotateDegrees(60);//rotate(1)
        }
      }
    }
    
    
    
    
    
    
    void alle_stepper_rueckwaerts(void)
    {
    
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CCW);
        stepper[idx].rotateDegrees(60);//rotate(1)
      }
    }
    
    
    
    
    void rotieren_links(void)
    {
    
    
      Serial1.println("rotiere_links");
      Serial.println("rotiere_links");
    
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CCW);
        stepper[idx].rotateDegrees(30);//rotate(1)
      }
    
    
      for (idx = stepper_VR; idx < stepper_MAX; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CW);
        stepper[idx].rotateDegrees(30);//rotate(1)
      }
    }
    
    
    
    
    void rotieren_rechts(void)
    {
    
    
      Serial1.println("rotiere_rechts");
      Serial.println("rotiere_rechts");
    
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CW);
        stepper[idx].rotateDegrees(30);//rotate(1)
      }
    
    
      for (idx = stepper_VR; idx < stepper_MAX; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CCW);
        stepper[idx].rotateDegrees(30);//rotate(1)
      }
    }
    
    
    
    
    
    
    void read_IR (void)
    {
      IR_Reading_A0 = analogRead(Analog_Pin_0);//links
      IR_Reading_A1 = analogRead(Analog_Pin_1);//mitte
      IR_Reading_A2 = analogRead(Analog_Pin_2);//rechts
    }
    
    
    
    
    void print_IR (void)
    
    
    {
      Serial.print("links: ");
      Serial1.print("links: ");
      Serial.print(IR_Reading_A0);
      Serial1.print(IR_Reading_A0);
    
    
      Serial.print("  mitte: ");
      Serial1.print("  mitte: ");
      Serial.print(IR_Reading_A1);
      Serial1.print(IR_Reading_A1);
    
    
      Serial.print("  rechts: ");
      Serial1.print("  rechts: ");
      Serial.println(IR_Reading_A2);
      Serial1.println(IR_Reading_A2);
    }
    gruß inka

Ähnliche Themen

  1. Vier PWM-Lüfter steuern
    Von Bammer im Forum AVR Hardwarethemen
    Antworten: 22
    Letzter Beitrag: 22.10.2010, 10:21
  2. Vier Servos steuern
    Von Brantiko im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 14.04.2008, 23:17
  3. Wie vier Motoren ansteuern???
    Von cinhcet im Forum Bauanleitungen, Schaltungen & Software nach RoboterNetz-Standard
    Antworten: 9
    Letzter Beitrag: 29.06.2006, 12:37
  4. vier L297 und VREF
    Von schmek im Forum Elektronik
    Antworten: 1
    Letzter Beitrag: 01.12.2005, 19:47
  5. Bot mit vier Rädern
    Von themaddin im Forum Mechanik
    Antworten: 17
    Letzter Beitrag: 06.11.2005, 21:39

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

12V Akku bauen