- 12V Akku mit 280 Ah bauen         
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
    hallo allerseits,

    mein künftiges roboter-fahrgestell war mir mit den DC-motoren und getriebe zu schnell, mit hilfe von PWM ließ sich das zwar verlangsamen, der antrieb wurde dadurch aber schwächer....

    Der nächste versuch findet mit schrittnotoren statt ( DC 5V 28YBJ-48 )

    Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_8789-1.jpg
Hits:	13
Größe:	28,0 KB
ID:	31028Klicke auf die Grafik für eine größere Ansicht

Name:	IMG_8815-1.jpg
Hits:	14
Größe:	57,5 KB
ID:	31029

    angepasstes beispiel aus der CustomStepper lib (als demosoftware für das video):
    Code:
    #include <CustomStepper.h>
    
    
    CustomStepper stepper_VL(22, 24, 26, 28);
    CustomStepper stepper_HL(23, 25, 27, 29);
    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;
    
    void setup()
    {
    
      rotate_li = false;
      rotate_deg_li = false;
      rotate_re = false;
      rotate_deg_re = false;
      vorwaerts = false;
      rueckwaerts = false;
    
    Serial1.begin(115200);
    
    }
    
    void loop()
    {
    
      if (stepper_VL.isDone() &&  rueckwaerts == false)
      {
        alle_stepper_rueckwaerts();
    
      }
    
      if (stepper_VL.isDone() &&  rueckwaerts == true && rotate_li == false)
      {
        rotieren_links();
      }
    
      if (stepper_VL.isDone() &&  rotate_li == true && vorwaerts == false)
      {
        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();
    
    }
    
    /***********************************************************/
    
    void alle_stepper_vorwaerts()
    {
      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(2);
      stepper_HL.setDirection(CW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CW);
      stepper_VR.rotate(2);
      vorwaerts = true;
    }
    
    void alle_stepper_rueckwaerts()
    {
      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(2);
      stepper_HL.setDirection(CCW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CCW);
      stepper_VR.rotate(2);
      rueckwaerts = true;
    }
    
    void rotieren_links()
    {
      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(2);
      stepper_HL.setDirection(CCW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CW);
      stepper_VR.rotate(2);
      rotate_li = true;
    }
    
    
    void rotieren_rechts()
    {
      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(2);
      stepper_HL.setDirection(CW);
      stepper_HL.rotate(2);
      stepper_HR.setDirection(CCW);
      stepper_HR.rotate(2);
      stepper_VR.setDirection(CCW);
      stepper_VR.rotate(2);
      rotate_re = true;
    }
    es funktionirt ( video hier ), ich wäre mit dieser geschwindigkeit zufrieden, was mir nicht gelungen ist, ist die elegante lösung von botty hier nachzubauen (um das hier realisieren zu können):


    Code:
    // Stepper xyz...
      for (uint8_t idx = ST_VL; idx < ST_MAX; idx++) 
      {
     // die 4 Stepper mit den verschiedenen, aber doch irgendwie 4x den gleichen anweisungen, bzw. variablen/konstanten zu "versehen"...
      }

    muster für die DC-motoren (AF_Motor lib)

    Code:
    enum motoren_e
    {
      M_VL = 0,   // Motor vorne links
      M_HL,
      M_VR,
      M_HR,
      M_MAX
    };
    
    struct motor
    {
      AF_DCMotor mot;
      uint8_t enc_pin;
      // volatile damit der Compiler keine 'dummen' Optimierung macht.
      volatile uint32_t ticks;
    
      unsigned long start_time;
      unsigned long stop_time;
    };
    
    struct motor motoren[M_MAX] =
    {
      { AF_DCMotor(4), 18, 0, 0, 0 },//M_VL
      { AF_DCMotor(1), 19, 0, 0, 0 },//M_HL
      { AF_DCMotor(2), 21, 0, 0, 0 },//M_HR
      { AF_DCMotor(3), 20, 0, 0, 0 } //M_VR
    };
    mein versuch das nachzuempfinden:

    Code:
      enum stepper_e
      {
      ST_VL = 0,   // Motor vorne links
      ST_HL,
      ST_VR,
      ST_HR,
      ST_MAX
      };
    
    struct Stepper motoren[ST_MAX]=
    {
    {CustomStepper(4),22, 24, 26, 28},
    {CustomStepper(1),23, 25, 27, 29},
    {CustomStepper(2),47, 49, 51, 53},
    {CustomStepper(3),46, 48, 50, 52}
    }
    wird vom compiler mit verschiedenen fehlermeldungen (bei verschiedenen kombinationen des aufbaus beim "stepper_motoren" struct) quittiert...
    --------------------------------------
    Was ich herausgefunden habe ist, dass die AFMotor lib eine möglichkeit beinhaltet die motoren mit einer "nummer" zu versehen, das bietet die CustomStepper lib nicht. Daran liegt sicher ein teil meiner probleme, aber ist das alles? Bzw. wie muss die vorarbeit aussehen, um die for-schleife (idx) realisieren zu können?
    gruß inka

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    13.01.2014
    Beiträge
    454
    Blog-Einträge
    3
    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)
    }

  3. #3
    Erfahrener Benutzer Robotik Einstein Avatar von inka
    Registriert seit
    29.10.2006
    Ort
    nahe Dresden
    Alter
    77
    Beiträge
    2.180
    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

  4. #4
    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();
      }

  5. #5
    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

  6. #6
    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

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

Ä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