- fchao-Sinus-Wechselrichter AliExpress         
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
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    der code mit NewPing war der erste, der bei mir auf anhieb funktionierte und auch die richtigen ergebnisse lieferte, da wollte ich natürlich dabei bleiben. Habe den code nun geändert

    von:
    Code:
    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).
      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;
    }
    in:
    Code:
    void ping_distanz(void)
    {
      digitalWrite(trigPin, LOW);
      delayMicroseconds(2);
      digitalWrite(trigPin, HIGH);
      delayMicroseconds(10);
      digitalWrite(trigPin, LOW);
      duration = pulseIn(echoPin, HIGH);
      distance = duration / 58, 1; //58.2 /52,3
      delay(500);
    
    
      if (distance >= maximumRange || distance <= minimumRange)
      {
        Serial.println("-1");
      }
      else
      {
        Serial.println(distance);
      }
      start_ping = true;
    }
    die daten bei der pindefinition und im setup natürlich angepasst. Die art des aufrufs der "ping_distanz" funktion erfolgt auf die gleiche art wie vorher....

    Der neue code funktioniert nun wie der alte, im wahrsten sinne des wortes, das verhalten ist identisch...

    noch eine idee?
    gruß inka

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Noch ne Idee: schreib mal in deinen Vergleichen TRUE statt true und FALSE statt false.
    Das ist eigentlich eher üblich bei Arduino- und wird in den Beispielen immer so gemacht. K.A. obs nötig ist, probieren schadet nicht.
    Da er scheinbar ja das erste "if" im Hauptprogramm abarbeitet, wärs denkbar....

    Auch möglich: er verhaspelt sich in den If()'s irgendwo.
    Wenn man mehrere if()-Entscheidungen hinter einander schreibt, werden die auch der Reihe nach abgearbeitet.
    Wenn also if(1) zutrifft, wird sie abgearbeitet. Tritt dabei der Zustand auf, der bei if(2) TRUE geben wird, wird anschliessend die abgearbeitet, und so weiter. So kann man Endlosschleifen basteln, die schwer zu finden sind.
    Da eben hilft es, in jedem if() einfach mal ne Ausgabe zu machen "ich bin hierund hier jetzt".

    Sowas umgehe ich dann mit switch/case: dort wird nach jedem break alles von vorne begonnen!
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Noch ne Idee: schreib mal in deinen Vergleichen TRUE statt true und FALSE statt false.
    Das ist eigentlich eher üblich bei Arduino- und wird in den Beispielen immer so gemacht. K.A. obs nötig ist, probieren schadet nicht.
    Da er scheinbar ja das erste "if" im Hauptprogramm abarbeitet, wärs denkbar....
    seitenweise fehlermeldungen in der art: "cruise_avoid_collision_4_einfacher_ping:34: error: 'FALSE' was not declared in this scope" - das ist es also nicht


    Zitat Zitat von Rabenauge Beitrag anzeigen
    Auch möglich: er verhaspelt sich in den If()'s irgendwo.
    Wenn man mehrere if()-Entscheidungen hinter einander schreibt, werden die auch der Reihe nach abgearbeitet.
    Wenn also if(1) zutrifft, wird sie abgearbeitet. Tritt dabei der Zustand auf, der bei if(2) TRUE geben wird, wird anschliessend die abgearbeitet, und so weiter. So kann man Endlosschleifen basteln, die schwer zu finden sind.
    das ist auch meine befürchtung, leicht zu überblicken sind die if's in dem beispiel von CustomStepper wirklich nicht und da habe ich das her...

    Zitat Zitat von Rabenauge Beitrag anzeigen
    Sowas umgehe ich dann mit switch/case: dort wird nach jedem break alles von vorne begonnen!
    werde ich probieren...

    danke erstmal...
    gruß inka

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Du kannst deine If()'s ja mal debuggen: schreib einfach in jedes if() ne spezielle Ausgabe und lass dir die auf die Konsole geben. Ggf. zusammen mit nen paar Variablen. Dann siehst du ja, wo er eventuell hängen bleibt.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  5. #5
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hallo inka,

    mir fallen mehrere Sachen in Deinen Beispielen auf.
    Erstmal konkurieren die "run()" Aufrufe damit die Motoren laufen mit Deinen Aufrufen für die Sensormessungen.
    Egal welche Variante der Sensormessungen die Du uns gezeigt hast, beide blockieren den Rest des Systems während der Messung, weil Du auf das Ergebnis wartest. Und nicht nur das, Du hast die Sache noch verschärft, da in den Funktionen "delay(500)" drin steht. Sprich jedes Mal wenn Du die Messfunktion aufrufst vergehen 1/2sec plus der Zeit für die Messung. Deine Stepper könnten also gerade mal einen Step/sec machen.
    Sicher nicht was Du willst. Die Messfunktion muss also so geschrieben sein, daß sie nicht blockiert. Die NewPing-Lib kann das s.u.

    Die andere Sache, womit der Code klarer werden würde, ist die Verwendung von zwei Schleifen in der Loop-Funktion. Die äußere Schleife sorgt für den Fortschritt Deiner Fahrkommandos und die innere Schleife führt sie aus. In Pseudocode sähe das in etwa so aus (hab's nicht durch den Compiler gejagt!):

    Code:
    void loop() {
      while(1) {
         // Kommando auswählen
         // Motoren konfigurieren z.B.
         geradeaus_unendlich();
    
         do {
           // Fortschritt der Motoren
           stepper_VL.run();
           stepper_HL.run();
           stepper_HR.run();
           stepper_VR.run();
    
          // Bis die Aufgabe erledigt ist
         } while ( ! (stepper_VL.isDone() && stepper_HL.isDone() && stepper_VR.isDone() && stepper_HR.isDone()) );
      }
    
    }
    wie immer Du die Auswahl der Fahrkommandos organisierst, hast Du so eine klare Trennung zwischen Auswahl und Ausführung!

    Jetzt weiß ich nicht was Dein Roboter alles können soll. Ich nehme hier mal an er soll immer geradeaus fahren und wenn ein Hinderniss erkannt wird nach Rechts drehen. Beim Drehen soll er den Sensor ignorieren. Dann erweitert sich das Bsp. so:
    Code:
    void loop() {
      bool sensor_benutzen = true;
    
      while(1) {
         // Kommando auswählen
         // Motoren konfigurieren z.B.
         geradeaus_unendlich();
    
         sensor_benutzen = true;
    
         do {
            if(sensor_benutzen && hindernis_vorh()) {
                motoren_stop();
                drehen_rechts(); // Konfiguriert die Motoren um und wird so lange
                                       // ausgeführt bis die innere Schleife abbricht.
                sensor_benutzen = false;
            }
    
           // Fortschritt der Motoren
           stepper_VL.run();
           stepper_HL.run();
           stepper_HR.run();
           stepper_VR.run();
    
          // Bis die Aufgabe erledigt ist
         } while ( ! (stepper_VL.isDone() && stepper_HL.isDone() && stepper_VR.isDone() && stepper_HR.isDone()) );
      }
    }
    Die NewPing-Lib stellt Dir die Funktion "ping()" zur Verfügung, leider blockiert die das System, kommt also nicht in Frage.
    Statt dessen müssen wir "ping_timer()" und "check_timer()" benutzen.
    "hindernis_vorh()" soll uns immer den letzten gültigen Wert liefern und dafür sorgen, daß der Sensor immer wieder neu mißt.
    Also gibt uns die Funktion einen bool zurück:
    Code:
    bool hindernis_vorh() {
    }
    wir müssen uns merken ob der Sensor läuft "sensor_misst" und was das letzte Ergebnis war "erg_vorher", beide sollen nur lokal sichtbar sein. Ausserdem sollen die Werte erhalten bleiben, sprich die Variablen dürfen nicht auf dem Stack liegen sondern müssen ins Datensegment. Dafür gibt's "static".
    Dann brauchen wir eine Dummy Funktion,weil "ping_timer()" 'nen Funktionspointer als Argument haben will.
    Das Ganze sollte dann so aussehen (nicht durch den Compiler gejagt!):
    Code:
    void sonarDummyFunc() { return; }
    
    bool hindernis_vorh() {
       static bool sensor_misst = false; // Beim Prg Start läuft der Sensor noch nicht 
       static bool erg_vorher = false; // Beim Start noch keine Messung vorhanden
    
       if(sensor_misst) {
          if(sonar.check_timer()) {
             erg_vorher = (sonar.ping_result / US_ROUNDTRIP_CM) < 4; // Oder welche Entfernung auch immer
             sensor_misst = false;
          }
       } else {
         sonar.timer_stop();
         sonar.ping_timer(sonarDummyFunc);
         sensor_misst = true;
       }
    
       return erg_vorher;
    }
    jetzt läßt sich "hindernis_vorh()" immer wieder aufrufen und startet den Sensor immer wieder neu und liefert das letzte Ergebnis zurück.

    Ein anderes Beispiel findest Du sonst noch https://bitbucket.org/teckel12/ardui...ping/wiki/Home in der Mitte ist ein Beispiel das den Callback-Mechanismus benutzt aber eine globale Variable verwendet,wovon ich kein Freund bin.

    Hoffe die Ideen bringen Dich ein bischen weiter.

    Gruß

    Chris
    Geändert von botty (28.12.2015 um 15:30 Uhr)

  6. #6
    Benutzer Stammmitglied
    Registriert seit
    19.05.2015
    Beiträge
    69
    Hallo inka,

    solltest Du momentan diese Variante
    Code:
    void alle_stepper_vorwaerts()
    {
    
    
      hindernis_vorh();
      if (hindernis == true)
      {
         Serial.print("hindernisabfrage in - alle_stepper_vorwärts -");
         alle_stepper_rueckwaerts();
      }
      // !!! Im Fall das hinderniss == false ist führt das zu einer Rekursion ohne Widerkehr !!!
      else alle_stepper_vorwaerts();
    
    
      
      vorwaerts = true;
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
    
      stepper_VL.setDirection(CW);
      stepper_VL.rotate(1);
      stepper_HL.setDirection(CW);
      stepper_HL.rotate(1);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(1);
      stepper_VR.setDirection(CW);
      stepper_VR.rotate(1);
      //vorwaerts = true;
    }
    
    
    void alle_stepper_rueckwaerts()
    {
      Serial.print("fahre rückwärts nach hindernisabfrage in - alle_stepper_vorwärts -");
      rueckwaerts = true;
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
    
      stepper_VL.setDirection(CCW);
      stepper_VL.rotate(1);
      stepper_HL.setDirection(CCW);
      stepper_HL.rotate(1);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(1);
      stepper_VR.setDirection(CCW);
      stepper_VR.rotate(1);
      //rueckwaerts = true;
    }
    im Einsatz haben, landest Du für den Fall das kein Hindernis erkannt wird in einer endlos Rekursion. Dein Program hängt sich schlicht auf und ich vermute das System rebootet immer wieder. Prüfen könntest Du das, wenn Du in die setup-Funktion am Ende mal ein "Serial.println("setup ende")" oder so schreiben würdest. Das sollte dann mehrfach in der Console zwischen den "Ping: xxx cm" erscheinen.

    Falls Du noch die NewPing lib benutzt gibt es bei "ping()" einen Sonderfall zu berücksichtigen:
    Wenn der US-Sensor ins Unendliche zeigt, liefert die Funktion eine Null zurück. In Deiner Funktion:
    Code:
    void hindernis_vorh(void)
    {
      if (start_ping == false) ping_distanz();
    
    
      if (((uS / US_ROUNDTRIP_CM) <= 10))
        hindernis = true;
    }
    kann "hindernis" also auch "true" sein. Daher muß eine weitere Abfrage da hinein:
    Code:
    void hindernis_vorh(void)
    {
      if (start_ping == false) ping_distanz();
    
    
      if(uS > 0) {
        if (((uS / US_ROUNDTRIP_CM) <= 10))
          hindernis = true;
      } else {
          hindernis = false;
      }
    }
    meine Funktion funktionert so leider auch nicht. Weil mir "check_timer()" bei einem Blick hinter die Sensorreichweite keine Info darüber gibt, dass ein Time-Out stattgefunden hat. Muss man sich also selbst merken.
    Code:
    void sonarDummyFunc() { return; }
    
    bool hindernis_vorh() {
       static bool sensor_misst = false; // Beim Prg Start läuft der Sensor noch nicht 
       static bool erg_vorher = false; // Beim Start noch keine Messung vorhanden
       static unsigned long start_zpkt = 0; // Fuer's timeout
    
       if(sensor_misst) {
          if(sonar.check_timer()) {
             erg_vorher = (sonar.ping_result / US_ROUNDTRIP_CM) <= 10; // Oder welche Entfernung auch immer
             sensor_misst = false;
          } else if( (start_zpkt - millis()) >= 50 ) { // Falls Distanz hinter Sensorreichweite,
                                                                 // nach 50ms erneut messen ermöglichen.
             erg_vorher = false;
             sensor_misst = false;
          }
       } else {
         sonar.timer_stop();
         sonar.ping_timer(sonarDummyFunc);
         sensor_misst = true;
         start_zpkt = millis();
       }
    
       return erg_vorher;
    }
    Gruß

    Chris

  7. #7
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hallo botty,
    Zitat Zitat von botty Beitrag anzeigen
    solltest Du momentan diese Variante
    Code:
    void alle_stepper_vorwaerts()
    {
    
    
      hindernis_vorh();
      if (hindernis == true)
      {
         Serial.print("hindernisabfrage in - alle_stepper_vorwärts -");
         alle_stepper_rueckwaerts();
      }
      // !!! Im Fall das hinderniss == false ist führt das zu einer Rekursion ohne Widerkehr !!!
      else alle_stepper_vorwaerts();
    
    
      
      vorwaerts = true;
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
    
      stepper_VL.setDirection(CW);
      stepper_VL.rotate(1);
      stepper_HL.setDirection(CW);
      stepper_HL.rotate(1);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(1);
      stepper_VR.setDirection(CW);
      stepper_VR.rotate(1);
      //vorwaerts = true;
    }
    
    
    void alle_stepper_rueckwaerts()
    {
      Serial.print("fahre rückwärts nach hindernisabfrage in - alle_stepper_vorwärts -");
      rueckwaerts = true;
      stepper_VL.setRPM(12);
      stepper_HL.setRPM(12);
      stepper_HR.setRPM(12);
      stepper_VR.setRPM(12);
    
    
      stepper_VL.setSPR(4075.7728395);
      stepper_HL.setSPR(4075.7728395);
      stepper_HR.setSPR(4075.7728395);
      stepper_VR.setSPR(4075.7728395);
    
    
      stepper_VL.setDirection(CCW);
      stepper_VL.rotate(1);
      stepper_HL.setDirection(CCW);
      stepper_HL.rotate(1);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(1);
      stepper_VR.setDirection(CCW);
      stepper_VR.rotate(1);
      //rueckwaerts = true;
    }
    im Einsatz haben,
    nein habe ich nicht...

    Zitat Zitat von botty Beitrag anzeigen
    Falls Du noch die NewPing lib benutzt gibt es bei "ping()" einen Sonderfall zu berücksichtigen:

    ........Daher muß eine weitere Abfrage da hinein:
    Code:
    void hindernis_vorh(void)
    {
      if (start_ping == false) ping_distanz();
    
    
      if(uS > 0) 
    {
        if (((uS / US_ROUNDTRIP_CM) <= 10))
          hindernis = true;
      } else {
          hindernis = false;
      }
    }
    habe ich berücksichtigt, danke für den tipp...

    - - - Aktualisiert - - -

    hi botty,

    ich habe jetzt eine einigermassen funktionierende version in der ich ein paar sachen die Du hier erwähnst auch schon drin habe:

    - das delay(500) im ping distanz habe ich entfernt, geht auch ohne
    - die schleife do - while bei dem run() der Stepper habe ich eingefügt, meine aber das wäre doppelt gemoppelt hier, oder?

    der roboter:
    - prüft erstmal ob vor ihm ein hindernis ist
    - fährt entsprechend nach vorne, oder zurück
    - nach vorne arbeitet er die (zunächstmal vorgegeben kommandor links, rechts usw) ab
    - nach hindernis wird immer nur im voraus geprüft, ausgewichen nach links (warum auch immer)

    hier der code (habe auch einen ohne "enum, idx" und was sonst noch zu der elegenteren lösung gehört "

    Code:
    #include <CustomStepper.h>
    #include <NewPing.h>
    
    
    #define TRIGGER_PIN  8  // 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 hindernis, start_ping;
    
    
    
    
    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 rotate_li;
    boolean rotate_deg_li;
    boolean rotate_re;
    boolean rotate_deg_re;
    boolean vorwaerts;
    boolean rueckwaerts;
    boolean start_ping;
    boolean hindernis;
    boolean stepper_stop;
    
    
    void setup()
    {
    
    
      rotate_li = false;
      rotate_deg_li = false;
      rotate_re = false;
      rotate_deg_re = false;
      vorwaerts = false;
      rueckwaerts = false;
      start_ping = false;
      hindernis = false;
      stepper_stop = false;
    
    
      Serial.begin(115200);
      Serial.println("setup_ende");
    }
    
    
    void loop()
    {
    
    
      hindernis_vorh();
      /****************************************/
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        if (stepper[idx].isDone() &&  rueckwaerts == false && hindernis == true)
        {
          Serial.println("start - Stepper rückwärts- if-abfrage_1");
          alle_stepper_rueckwaerts();
    
    
        }
        else if (stepper[idx].isDone() &&  vorwaerts == false && hindernis == false)
        {
          Serial.println("start - Stepper vorwärts- else-abfrage_1");
          alle_stepper_vorwaerts();
    
    
        }
      }
      /*************************************/
    
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        if (stepper[idx].isDone() &&  rueckwaerts == true && rotate_li == false)
        {
          Serial.println("loop - rotiere_links - if-abfrage_2");
          rotieren_links();
        }
      }
    
    
    
    
    
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        if (stepper[idx].isDone() &&  rotate_li == true && vorwaerts == false)
        {
          Serial.println("loop - alle_stepper_vorwärts - if-abfrage_3");
          alle_stepper_vorwaerts();
        }
      }
    
    
    
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        if (stepper[idx].isDone() &&  vorwaerts == true && rotate_re == false)
        {
          Serial.println("loop - rotiere_rechts - if-abfrage_4");
          rotieren_rechts();
        }
    
    
      }
    
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        if (stepper[idx].isDone() &&  rotate_re == true && vorwaerts == true)
        {
          Serial.println("loop - alle_stepper_vorwärts - if-abfrage_5");
          alle_stepper_vorwaerts();
        }
      }
    
    
      /*****************************************/
      do
      {
        for (idx = stepper_VL; idx < stepper_MAX; idx++)
        {
          stepper[idx].run();
        }
      } while ( ! (stepper[idx].isDone()));
    }
    
    
    /***********************************************************/
    
    
    
    
    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).
      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 > 0)
      {
        if (((uS / US_ROUNDTRIP_CM) <= 10))
          hindernis = true;
      } else
      {
        hindernis = false;
      }
    }
    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)
    {
      if (start_ping == true) ping_distanz();
      //Serial.print(hindernis);
      if (hindernis == true)
      {
        rueckwaerts = true;
    
    
        Serial.print(hindernis);
        Serial.println("  hindernis - true - alle_stepper_rückwärts - if-abfrage_6");
        hindernis = false;
        //alle_stepper_rueckwaerts();
    
    
        for (idx = stepper_VL; idx < stepper_MAX; idx++)
        {
          stepper[idx].setRPM(12);
          stepper[idx].setSPR(4075.7728395);
          stepper[idx].setDirection(CCW);
          stepper[idx].rotate(1);
        }
    
    
      }
      else
      {
        vorwaerts = true;
    
    
        for (idx = stepper_VL; idx < stepper_MAX; idx++)
        {
          stepper[idx].setRPM(12);
          stepper[idx].setSPR(4075.7728395);
          stepper[idx].setDirection(CW);
          stepper[idx].rotate(1);
        }
      }
    }
    
    
    
    
    
    
    void alle_stepper_rueckwaerts(void)
    {
      rueckwaerts = true;
    
    
      for (idx = stepper_VL; idx < stepper_MAX; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CCW);
        stepper[idx].rotate(1);
      }
    }
    
    
    
    
    void rotieren_links(void)
    {
      rotate_li = true;
    
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CCW);
        stepper[idx].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].rotate(1);
      }
    }
    
    
    
    
    void rotieren_rechts(void)
    {
    
    
      rotate_re = true;
    
    
      for (idx = stepper_VL; idx < stepper_VR; idx++)
      {
        stepper[idx].setRPM(12);
        stepper[idx].setSPR(4075.7728395);
        stepper[idx].setDirection(CW);
        stepper[idx].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].rotate(1);
      }
    }
    Zitat Zitat von botty Beitrag anzeigen
    Die NewPing-Lib stellt Dir die Funktion "ping()" zur Verfügung, leider blockiert die das System, kommt also nicht in Frage.
    Statt dessen müssen wir "ping_timer()" und "check_timer()" benutzen.
    hier stellt sich mir die frage warum ist es ein problem, wenn - hier sogar beide wesentlichen funktionen - ping() und run() der Stepper blockierend sind? Der roboter fährt, sogar recht zügig, misst zwischendurch und weicht auch hindernissen aus, wo ist das problem? Kannst Du es mir bitte erklären?
    In einem würde ich Dir recht geben: Der roboter fährt nach der messung seine strecke die er vorgegeben bekommen hat noch ab, bleibt also noch der fsetstellung - da vorne ist ein hindernis - nicht sofort stehen. Das kann man aber über die gemessene entfernung lösen, oder?


    Zitat Zitat von botty Beitrag anzeigen
    Ein anderes Beispiel findest Du sonst noch https://bitbucket.org/teckel12/ardui...ping/wiki/Home in der Mitte ist ein Beispiel das den Callback-Mechanismus benutzt aber eine globale Variable verwendet,wovon ich kein Freund bin.
    das muss ich noch lesen...
    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
  •  

Labornetzteil AliExpress