- fchao-Sinus-Wechselrichter AliExpress         
Ergebnis 1 bis 10 von 64

Thema: fahrzeug mit vier motoren und vier encodern

Baum-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #25
    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)

Ä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
  •  

fchao-Sinus-Wechselrichter AliExpress