- SF800 Solar Speicher Tutorial         
Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte
Ergebnis 41 bis 50 von 64

Thema: fahrzeug mit vier motoren und vier encodern

  1. #41
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    Anzeige

    Praxistest und DIY Projekte
    vielen dank erstmal für Deine zeit,

    Zitat Zitat von Sisor Beitrag anzeigen
    Code:
    #include <CustomStepper.h>
    
    enum stepper_e { ST_VL, ST_HL, ST_VR, ST_HR, ST_MAX };
    
    CustomStepper motoren[ST_MAX]
    {
      CustomStepper(22, 24, 26, 28),
      CustomStepper(23, 25, 27, 29),
      CustomStepper(47, 49, 51, 53),
      CustomStepper(46, 48, 50, 52)
    }
    ist das jetzt so, dass die zuordnung der 4 Stepper durch die reihenfolge der einträge im "CustomStepper motoren[ST_MAX]" zu den laufenden nummer des enumerators zugeordnet werden? Und wie ist der zusammenhang zwischen stepper_e und motoren? Sind es nur beliebige bezeichnungen? Irgendwie fehlt mir hier doch noch der entscheidender impuls um da durchzublicken

    und deshalb komme ich wohl auch nicht drauf wie das hier aussehen könnte:

    Code:
        for (uint8_t idx = ST_VL; idx < ST_MAX; idx++)
      {
        CustomStepper stepper_e(idx) .run(); //oder CustomStepper(idx).run(); //oder CustomStepper motoren(idx).run() // oder CustomStepper(idx).run(idx) ...
      }
    gruß inka

  2. #42
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    Zitat Zitat von inka Beitrag anzeigen
    ist das jetzt so, dass die zuordnung der 4 Stepper durch die reihenfolge der einträge im "CustomStepper motoren[ST_MAX]" zu den laufenden nummer des enumerators zugeordnet werden?
    Das enum zählt nur Symbole auf, denen von 0 aufsteigend eine ganze Zahl zuordnet wird.
    Ähnlich wie z.B.
    #define ST_VL 0
    #define ST_HL 1
    etc.

    Folgender Code erzeugt ein Feld mit Bezeichner "motoren"aus 4 Objekten vom Typ "CustomStepper":
    Code:
    CustomStepper motoren[ST_MAX]
    {
      CustomStepper(22, 24, 26, 28),
      CustomStepper(23, 25, 27, 29),
      CustomStepper(47, 49, 51, 53),
      CustomStepper(46, 48, 50, 52)
    }
    Folgender Code iteriert durch dieses Feld und ruft in jedem Objekt die Methode "run" auf.
    Code:
        for (uint8_t idx = ST_VL; idx < ST_MAX; idx++)
      {
        motoren[idx].run();
      }

  3. #43
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    hervorragend erklärt, kurz, prägnant - dank dafür...
    gruß inka

  4. #44
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    ich bin jetzt noch einmal zurück zu der "normalen" steuerung der Stepper zurück, der code sieht nun so aus:

    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.
    
    
    
    
    uint16_t distanz;
    uint16_t uS;
    //uint8_t hindernis, start_ping;
    
    
    
    
    CustomStepper stepper_HL(23, 25, 27, 29);
    CustomStepper stepper_VL(31, 33, 35, 37);
    CustomStepper stepper_HR(47, 49, 51, 53);
    CustomStepper stepper_VR(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;
    
    
    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;
      
      Serial.begin(115200);
    
    
    }
    
    
    void loop()
    {
    
    
      hindernis_vorh();
      /****************************************/
      if (stepper_VL.isDone() &&  rueckwaerts == false && hindernis == true)
      {
         alle_stepper_rueckwaerts();
        //alle_stepper_stop();
    
    
      }
      else if (stepper_VL.isDone() &&  rueckwaerts == false && hindernis == false)
    
    
        alle_stepper_vorwaerts();
      /*************************************/
    
    
      if (stepper_VL.isDone() &&  rueckwaerts == true && rotate_li == false)
      {
        rotieren_links();
      }
    
    
    
    
      /**************************************/
      if (stepper_VL.isDone() &&  rotate_li == true && vorwaerts == true)
      {
        alle_stepper_vorwaerts();
    
    
      }
    
    
      /**********************************/
      if (stepper_VL.isDone() &&  vorwaerts == true && rotate_re == false)
      {
        rotieren_rechts();
      }
      /********************************/
    
    
      if (stepper_VL.isDone() &&  rotate_re == true && vorwaerts == true)
      {
        alle_stepper_vorwaerts();
      }
    
    
      /*****************************/
      stepper_VL.run();
      stepper_HL.run();
      stepper_HR.run();
      stepper_VR.run();
    
    
    }
    habe nicht alle funktionen hier reinkopiert, nur die für vorwärts:
    Code:
    void 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;
    }
    ping distanz:
    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;
    }
    und der hindernis erkennung:
    Code:
    void hindernis_vorh(void)
    {
      if (start_ping == false) ping_distanz();
    
    
      if (((uS / US_ROUNDTRIP_CM) <= 10))
        hindernis = true;
    }
    an und für sich funktioniert die hinderniserkennung, am start fährt der robby an, oder eben nicht (bei hindernis vorne)


    wo es noch klemmt ist das mit den blockierenden funktionen für die stepper. Die reagieren also während der fahrt nicht auf hindernisse und das stört natürlich
    mir ist es bis jetzt nicht gelungen das irgendwie zu lösen - hab ich da keine chance in diese blockierenden funktionen einzugreifen? Oder reicht es, wenn die ping funktion vor dem aufruf der stepperfunktion erfolgt? Irgendwie klappte es aber auch nicht...

    Eine idee?
    gruß inka

  5. #45
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Du wirst aus dem Motorprogramm raus das Sonar auch abfragen müssen, oder?
    Bau dir mal irgendeine Meldung in die entsprechenden Unterprogramme ein,die du auf die Konsole ausgeben lässt. Dann siehst du, ob die betreffenden Routinen überhaupt aufgerufen werden.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  6. #46
    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
    Du wirst aus dem Motorprogramm raus das Sonar auch abfragen müssen, oder?
    ja sicher, hatte ich schon, habs aber bei meiner vorhergehenden frage nicht so explizit erwähnt...

    Das hier ist nur eine alternative von vielen:

    Code:
    void alle_stepper_vorwaerts()
    {
    
    
      hindernis_vorh();
      if (hindernis == true)
      {
         Serial.print("hindernisabfrage in - alle_stepper_vorwärts -");
         alle_stepper_rueckwaerts();
      }
      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;
    }
    - beim start MIT hindernis davor fährt er sofort nach hinten los, ausgabe im terminal:
    Code:
    Ping: 4 cm
    fahre rückwärts nach hindernisabfrage in - alle_stepper_vorwärts -
    - beim start OHNE ein hindernis davor bleibt er stehen, fährt also nicht nach vorne los, ausgabe im terminal:

    Code:
    Ping: 80 cm
    Ping: 79 cm
    Ping: 79 cm
    Ping: 79 cm
    das ist die ausgabe von "ping_distanz", kommt ungefähr alle 8 sekunden...

    - wenn sich ihm in dieser phase ein hindernis von vorne nähert (handfläche) fährt er nach hinten los. Dann kommt im terminal:

    Code:
    Ping: 3 cm
    fahre rückwärts nach hindernisabfrage in - alle_stepper_vorwärts -
    ich schliesse daraus nur, dass er die freie strecke vor sich zwar erkennt, irgendwas hindert ihn aber daran die fahrbefehle in "alle_stepper_vorwaerts" auch auszuführen, er wartet nur (in etwas so lange, wie auch die fahrt dauern würde) und pingt...

    Timingprobleme?
    gruß inka

  7. #47
    Erfahrener Benutzer Robotik Einstein Avatar von Rabenauge
    Registriert seit
    13.10.2007
    Ort
    Osterzgebirge
    Alter
    56
    Beiträge
    2.210
    Gut möglich.
    Versuch mal, das Sonar zu Fuss zu programmieren, ohne die NewPing-Bibliothek.
    Das Problem hat man bei Arduino recht oft, dass mehrere Bibliotheken sich da in die Quere kommen, weil irgendjemand Timer oder Interrupts einfach benutzt ohne zu fragen, und schlimmer: ohne es zu dokumentieren.
    Du hast nicht allzu viele US-Sensoren dran, wenn du da nen halbwegs knapp bemessenes Timeout setzt, dann sollte sich die Verzögerung in Grenzen halten, du brauchst also die NewPing nicht unbedingt.
    Grüssle, Sly
    ..dem Inschenör ist nix zu schwör..

  8. #48
    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

  9. #49
    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..

  10. #50
    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

Seite 5 von 7 ErsteErste ... 34567 LetzteLetzte

Ä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