-         
Seite 37 von 43 ErsteErste ... 273536373839 ... LetzteLetzte
Ergebnis 361 bis 370 von 429

Thema: outdoor I

  1. #361
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    72
    Beiträge
    1.754
    Anzeige

    Zitat Zitat von Rabenauge Beitrag anzeigen
    Hm- wo setzt du das Flag wieder auf 0?
    Wahrscheinlich liegt dort der Hase im Peffer....

    wahrscheinlich...

    mit dem einsatz von timer(), sekundenaufgaben() und meiner entprellten ping-abfrage

    Code:
    void hindernis_vorh_rechts_entprellt(void)
    {
      if (start_ping_rechts == false)
    
    
        aktuelle_ping_millis = millis();
      if (aktuelle_ping_millis - vergangene_ping_millis > interval_ping)
      {
        vergangene_ping_millis = aktuelle_ping_millis;
        ping_distanz_rechts();
      }
    
      if (uS_rechts != NO_ECHO)
      {
        if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 0)
        {
          hindernis_rechts = true;
          mehrfach_zaehler_rechts = 1;
        }
        else if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 1)
        {
          mehrfach_zaehler_rechts = 0;
        }
      }
      else
      {
        if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 1)
        {
          hindernis_rechts = false;
          mehrfach_zaehler_rechts = 0;
        }
        else if (((uS_rechts / US_ROUNDTRIP_CM) <= 25) && mehrfach_zaehler_rechts == 0)
        {
          mehrfach_zaehler_rechts = 1;
        }
      }
    }
    läuft das jetzt:
    der roboter fährt vorwärts und misst im sekundenintervall mal links und dann wieder rechts die entfernung. Die Stepper laufen noch ein bischen "rauh" aber das ist sicher ein anderes problem...
    zu der (meiner) verwendung von der AccelStepper und auch anderen libraries - ich versuche nicht das alles zu verstehen, sondern passe für meine zwecke die beispiele an, in der hoffnung, dass ich es beim nächsten mal immer noch weiss , klappt leider nicht immer...

    Insofern mein dank an alle, die sich immer wieder die mühe machen auf meine fragen einzugehen, wobei hinweise auf andere hardware oder software (welche ausser arduino auch immer) wenig bis garnicht hilfreich sind...

    und jetzt gehts mit dem servo-sweep weiter
    gruß inka

  2. #362
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    51
    Beiträge
    1.653
    Wenn du dieses Flag in der selben Sekunde zurückstellst, in der die Aufgabe erledigt werden soll, wird die die ganze Sekunde über endlos oft erledigt, ist doch klar.

    Der Ablauf sollte so sein:
    - der Sekundenzeiger springt auf "erledigeDas"
    -die Aufgabe wird erledigt, das Flag auf 1 gesetzt
    -der Sekundenzeiger springt auf die nächste Sekunde- und hier wird das Flag wieder auf 0 gestellt, damit es bei der nächsten "erledigeDas"-Sekunde wieder greifen kann.

    Du musst bedenken, dass der Timer ...zigmal pro Sekunde aufgerufen wird- wenn er also in der gleichen Sekunde das Flag wieder auf 0 stellt, klappt das nich.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  3. #363
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    72
    Beiträge
    1.754
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Wenn du dieses Flag in der selben Sekunde zurückstellst, in der die Aufgabe erledigt werden soll, wird die die ganze Sekunde über endlos oft erledigt, ist doch klar.
    Der Ablauf sollte so sein:
    - der Sekundenzeiger springt auf "erledigeDas"
    -die Aufgabe wird erledigt, das Flag auf 1 gesetzt
    -der Sekundenzeiger springt auf die nächste Sekunde- und hier wird das Flag wieder auf 0 gestellt, damit es bei der nächsten "erledigeDas"-Sekunde wieder greifen kann.

    Du musst bedenken, dass der Timer ...zigmal pro Sekunde aufgerufen wird- wenn er also in der gleichen Sekunde das Flag wieder auf 0 stellt, klappt das nich.

    so ganz genau weiss ich ja wirklich nicht (beim weiterschreiben habe ich begriffen was da abläuft) warum das jetzt funktioniert , es tut's aber - und - ich hab ja für jedes ereignis was über die sekundenaufgaben läuft ja ein eigenes flag...

    Mit dem flag alleine hat es ja vorher schon funktioniert, allerdings mit dem nachteil des 100fachen aufrufs und auch des 100fachen drucks des wertes. Das ist nun mit der entprellten ping variante weg...

    Ich hab jetzt die ersten versuche mit dem servo-sweep hinter mir. Das hier:
    Code:
    void servo_sweep (void)
    {
      gemacht_servo_sweep_flag = 1;
      
      for (pos = 0; pos < 100; pos += 1)
      {
        myservo.write(pos);
        delay(50);
      }
      for (pos = 100; pos >= 0; pos -= 1)
      {
        myservo.write(pos);
        delay(50);
      }
    }
    funktioniert natürlich nicht, das blockiert die stepper. Aber das hier:

    Code:
    myservo.write(30);
    funktioniert schon, und auch mit dem gesetzten flag für den sweep. Möglichrweise wird der sweep-task ja auch 100x schnell hintereinander aufgerufen, das macht aber nix, weil ja der servo schon in der position ist, bzw. dorthin unterwegs...

    Ich denke ich könnte auch mehrere solche timer benutzen, oder? z.b. mit unterschiedlichen intervallen...
    gruß inka

  4. #364
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    51
    Beiträge
    1.653
    Würde gehen.
    Aber eigentlich reicht einer-als "Tick" nimmst du halt die kürzesten Intervalle, die du brauchst.
    Und die zählst du einfach hoch, um auf längere zu kommen....
    Das hier ist der Timer vom XP2- der tickt jede Sekunde, zählt die aber auch hoch, so dass ich Intervalle von bis zu 20 Sekunden habe.
    So hab ich einmal den Sekunden-Takt (tick, tack, tick, tack) , aber eben auch nen 20-Sekunden-Takt (den man auch noch unterteilen könnte, wenn man will).
    mit intervallTimer=500 könnte man den auch jede halbe Sekunde ticken lassen, ganz wie man will.
    Du musst einfach nur den "kleinsten gemeinsamen Nenner" finden, und den dann als Basis benutzen.


    Code:
    void timer()  // ******************************** Bord-Schaltuhr ****************************************                
    {
      unsigned long aktuelleMillis = millis();  // Millisekunden auf den aktuellen Wert stellen
    
      if (aktuelleMillis - vorherigeMillis >= intervallTimer) // immer wenn 1000 Millisekunden um sind
      {
        akkuMessFlag=0;              //alle gemacht-Flags zurücksetzen
        serialFlag=0;
        lichtMessFlag=0;
        vorherigeMillis = aktuelleMillis;
        if(sekundeTick==0)          // Sekunde-Tick wechselt jede Sekunde zwischen 0 und 1
          {
            sekundeTick=1;
           
             
           }
         else
          {
            sekundeTick=0;
           }
        if(timerTick<20)            // Timer-Tick zählt hoch bis 20, und fängt dann wieder bei 0 an
        {
          timerTick++;
        }
        else
        {
          timerTick=0;
          
        }
        
      }
    }
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  5. #365
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    72
    Beiträge
    1.754
    hallo Rabenauge,
    ich wollte mal ausprobieren ob Deine pingversion schneller ist als die mit der ping-lib...
    Zitat Zitat von Rabenauge Beitrag anzeigen
    Ich benutze keine Bibliothek für das bisschen Ultraschall- das kann man zu Fuss auch machen:
    Code:
    void pingVorne()// ******************** Vorn nach Hindernissen suchen **************************************
    {
      delay(100);                            // ggf, alte Echos abklingen lassen, die halbe Zeit reicht auch
      digitalWrite(triggerVorne, LOW);
      delayMicroseconds(2);
      digitalWrite(triggerVorne, HIGH);     //Trigger Impuls 10 µs
      delayMicroseconds(10);
      digitalWrite(triggerVorne, LOW);      //Messung starten
      long laufZeit = pulseIn(echoVorne, HIGH,maxEntfernung); // Echo-Zeit messen, aber nicht zu lange warten
      float messung=laufZeit/ 58.2;         //Laufzeit in cm umrechnen
      entfernungVorne = ((entfernungVorneAlt*0.2)+(messung*0.8)); // Ergebnis glätten
      if(entfernungVorne==0)                // das gibts nicht, also muss die Bahn frei sein
        {
          entfernungVorne=120;
        } 
      entfernungVorneAlt=entfernungVorne;
      Serial.print("Vorne: ");
      Serial.print(entfernungVorne);
      Serial.println(" cm");
    }
    habe es an meine hardwareverhältnisse angepasst, das sieht dann so aus:

    Code:
    #include "Arduino.h"
    
    
    #define TRIGGER_PIN_RECHTS  2
    #define ECHO_PIN_RECHTS   3
    #define MAX_DISTANCE_RECHTS 200 //400
    
    uint16_t distanz_rechts;
    uint16_t distanz_rechts_alt;
    
    void setup()
    {
      Serial.begin(115200);
    
    }
    
    void loop()
    {
      ping_rechts();
    
    }
    
    
    void ping_rechts()// ******************** rechts nach hindernissen suchen **************************************
    {
      delay(100);                            // ggf, alte Echos abklingen lassen, die halbe Zeit reicht auch
      digitalWrite(TRIGGER_PIN_RECHTS, LOW);
      delayMicroseconds(2);
      digitalWrite(TRIGGER_PIN_RECHTS, HIGH);     //Trigger Impuls 10 µs
      delayMicroseconds(10);
      digitalWrite(TRIGGER_PIN_RECHTS, LOW);      //Messung starten
      long lauf_zeit = pulseIn(ECHO_PIN_RECHTS, HIGH, MAX_DISTANCE_RECHTS); // Echo-Zeit messen, aber nicht zu lange warten
      float messung = lauf_zeit / 58.2;      //Laufzeit in cm umrechnen
      distanz_rechts = ((distanz_rechts_alt * 0.2) + (messung * 0.8)); // Ergebnis glätten
      if (distanz_rechts == 0)             // das gibts nicht, also muss die Bahn frei sein
      {
        distanz_rechts = 120;
      }
      distanz_rechts_alt = distanz_rechts;
      Serial.print("distanz rechts: ");
      Serial.print(distanz_rechts);
      Serial.println(" cm");
    }

    die printausgabe ist: 120 / 24 / 4 und das wiederholt sich....
    gruß inka

  6. #366
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    72
    Beiträge
    1.754
    habe unter den beispielen in der ping-lib etwas durchaus interessantes gefunden. Ein beispiel für drei sensoren, macht einen recht einfachen eindruck:

    Code:
    #include <NewPing.h>
    
    #define SONAR_NUM 3      // Number of sensors.
    #define MAX_DISTANCE 200 // Maximum distance (in cm) to ping.
    
    NewPing sonar[SONAR_NUM] = {   // Sensor object array.
      NewPing(2, 3, MAX_DISTANCE), // Each sensor's trigger pin, echo pin, and max distance to ping. 
      NewPing(4, 5, MAX_DISTANCE), 
      NewPing(8, 9, MAX_DISTANCE)
    };
    
    void setup() {
      Serial.begin(115200); // Open serial monitor at 115200 baud to see ping results.
    }
    
    void loop() { 
      for (uint8_t i = 0; i < SONAR_NUM; i++) { // Loop through each sensor and display results.
        delay(50); // Wait 50ms between pings (about 20 pings/sec). 29ms should be the shortest delay between pings.
        Serial.print(i);
        Serial.print(" = ");
        Serial.print(sonar[i].ping_cm());
        Serial.print(" cm ");
      }
      Serial.println();
    }
    gruß inka

  7. #367
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    51
    Beiträge
    1.653
    Hm- wenns funktioniert....ich hatte mal bei anderer Gelegenheit die NewPing probiert, war aber keineswegs von begeistert.
    Aber ich weiss nicht mehr genau, was war....

    Mein Code ist _nicht_ auf Speed optimert: du kannst z.B. das anfängliche delay noch deutlich runtersetzen (musst du mal rechnen, wie weit die Dinger maximal kommen können, dann kommst du mit der Schallgeschwindigkeit auf den Wert, den du evtl brauchst)- oder du lässt es ganz weg- im Freien wirst du eher keine solchen wilden Echos haben.
    Die Ansteuerung muss so-laut Datenblatt.
    Man könnte versuchen, den Triger auch kürzer anzusteuern- vielleicht klappts, vieleicht nicht.
    Auch die maxDistance kann man an die konkreten Anforderungen anpassen, wenn man die verkürzt, spart man auch Zeit, da pulseIn() blockierend ist (das wartet einfach bis entweder das Timeout abgelaufen ist oder was rein kommt).

    Den letzten Rest kann man bei der Umrechnung rausholen, indem man auf die Fliesskomma-Berechnung verzichtet, und das so umbaut, dass die nicht mehr nötig ist.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  8. #368
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.894
    Blog-Einträge
    12
    Guten Morgen,

    welche Abfragezeit wird denn benötigt, wie schnell wird das Ergebnis benötigt, wie sicher soll es sein? Danach sollte sich dann die Sensor-Auswahl richten. So einen US-Wandler kann man nur in bestimmten Intervallen abfragen, nicht unendlich schnell. Beim SRF05 habe ich eine Angabe von min. 50ms im Netz gefunden, als Zeit zwischen den einzelnen Messungen. An anderer Stelle ist die Rede von 65ms.


    MfG
    Geändert von Moppi (31.03.2020 um 06:49 Uhr)

  9. #369
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    72
    Beiträge
    1.754
    Zitat Zitat von Moppi Beitrag anzeigen
    welche Abfragezeit wird denn benötigt, wie schnell wird das Ergebnis benötigt, wie sicher soll es sein? Danach sollte sich dann die Sensor-Auswahl richten. So einen US-Wandler kann man nur in bestimmten Intervallen abfragen, nicht unendlich schnell. Beim SRF05 habe ich eine Angabe von min. 50ms im Netz gefunden, als Zeit zwischen den einzelnen Messungen. An anderer Stelle ist die Rede von 65ms.
    das sind alles fragen mit denen ich mich bis dato nicht beschäftigen musste. Weder bei den gelben DC-getriebemotoren (weil PWM) noch bei den kleineren Schrittmotoren mit ihren ansteuerungsmodulen. Es lief einfach in der standareinstellung, man musste nur einstellen unterhalb welcher entfernung der arduino einschreiten musste...

    die 3sensor geschichte von newping verbessert das verhalten bei den NEMA steppern etwas, trotzdem sind aussetzer der Stepper spürbar (und hörbar). Vielleicht muss ich die pulseIn besser "verteilen", die Sensoren zwar mit der 3sensor einstellung aber einzeln abfragen. Mal sehen...

    Zitat Zitat von Rabenauge Beitrag anzeigen
    Mein Code ist _nicht_ auf Speed optimert: du kannst z.B. das anfängliche delay noch deutlich runtersetzen (musst du mal rechnen, wie weit die Dinger maximal kommen können, dann kommst du mit der Schallgeschwindigkeit auf den Wert, den du evtl brauchst)- oder du lässt es ganz weg- im Freien wirst du eher keine solchen wilden Echos haben.
    das war klar, allerdings hatte ich den eindruck, dass die von mir abgeänderte version gar nicht ging, weil sich die drei werte ständig wiederholt haben, egal wie gross die entfernung des hindernisses zum sensor war
    gruß inka

  10. #370
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    1.894
    Blog-Einträge
    12
    Mit dem pulseIn() ist es wie mit dem delay(). Das kannst Du auch zu Fuß machen (pulseIn ist einfacher zu handhaben).

    Brainstorming (keine Ahnung ob das schon 100% so richtig wäre, bloß wegen der Vorgehensweise):

    1. Auf der ECHO-Leitung auf High warten.
    2. micros() - Mikrosekunden auslesen.
    3. Auf der ECHO-Leitung auf High warten.
    4. micros() - Mikrosekunden auslesen.
    5. Den ersten vom zweiten Mikros-Wert subtrahieren.

    Wenn der Code schnell genug durchläuft (also genügend Durchläufe pro Sekunde schafft) sollten auch diese dann so ermittelten Werte gut genug sein. Voraussetzung ist natürlich, dass keine andere Stelle im Code Hänger verursacht.

    Wegen den Steppern nochmal:

    Ich will nicht dazu verleiten, andere Hardware einzusetzen. Aber die Steuerung der einzelnen Schritte geschieht doch im Mikrosekundenbereich. Sobald es dort, z.B. über eine halbe Millisekunde (oder weniger), zu Verzögerungen - zwischen den einzelnen Schritten - kommt, merkst Du das u.U., eben daran, dass es nicht gleichmäßig läuft. Deshalb würde ich die Motoren unabhängig steuern.
    Wenn ich an einem NANO (z.B.) vier Pins zur Steuerung der Motoren festlege, kann ich mit HIGH oder LOW, auf jedem der Pins, einen Motor aus- oder einschalten. Der NANO muss nur diese vier Leitungen überwachen und würde in loop() einfach nur die Stepper bedienen, damit laufen die dann absolut gleichmäßig. Es würde auch ein 328P in Minimalbeschaltung ausreichen: Quartz und 2 Kondensatoren.

    Ob Softwarelösungen per AccelStepper-Lib oder was auch immer da genau so gute Ergebnisse liefern, dazu vermag ich kein Urteil abzugeben, weil ich das noch nicht benutzt habe. Wäre auszuprobieren.
    Kommt drauf an, wieviel Software auf den MEGA bzw. den ESP32 zum Laufen kommen soll, wenn da mehrmals irgendwie Interrupts ausgelöst werden, um 3 oder 4 verschiedene Dinge zu steuern, könnten die ISRs sich auch gegenseitig in die Quere kommen. Wenn das Projekt etwas ausladender wird, kommt da sicher mehr als nur 4 Stepper ansteuern und zwei US-Wandler bedienen zusammen. Und zu anderen (Multithreading / Multitasking) hat HaWe auch schon viel geschrieben. Das würde ich mir dann auch mal anschauen.

    Muss am Ende jeder selber wissen, wie er es macht.


    MfG

Seite 37 von 43 ErsteErste ... 273536373839 ... LetzteLetzte

Ähnliche Themen

  1. Abstandsmessung Outdoor bis 3m
    Von robo218 im Forum Sensoren / Sensorik
    Antworten: 4
    Letzter Beitrag: 14.12.2017, 06:56
  2. outdoor spy robot
    Von jancrombach im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 7
    Letzter Beitrag: 14.08.2010, 13:09
  3. Outdoor Roboter
    Von OsramLED im Forum Vorstellung+Bilder+Ideen zu geplanten eigenen Projekten/Bots
    Antworten: 3
    Letzter Beitrag: 07.08.2006, 09:34
  4. Outdoor-Robo
    Von RobotrixerP im Forum Mechanik
    Antworten: 3
    Letzter Beitrag: 16.04.2006, 18:38
  5. [ERLEDIGT] Outdoor - Navigation
    Von Quaio im Forum Sensoren / Sensorik
    Antworten: 37
    Letzter Beitrag: 21.04.2005, 12:31

Berechtigungen

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