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) }
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) }
vielen dank erstmal für Deine zeit,
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
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":
Folgender Code iteriert durch dieses Feld und ruft in jedem Objekt die Methode "run" auf.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) }
Code:for (uint8_t idx = ST_VL; idx < ST_MAX; idx++) { motoren[idx].run(); }
hervorragend erklärt, kurz, prägnant - dank dafür...
gruß inka
ich bin jetzt noch einmal zurück zu der "normalen" steuerung der Stepper zurück, der code sieht nun so aus:
habe nicht alle funktionen hier reinkopiert, nur die für vorwärts: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(); }
ping distanz: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; }
und der hindernis erkennung: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; }
an und für sich funktioniert die hinderniserkennung, am start fährt der robby an, oder eben nicht (bei hindernis vorne)Code:void hindernis_vorh(void) { if (start_ping == false) ping_distanz(); if (((uS / US_ROUNDTRIP_CM) <= 10)) hindernis = true; }
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
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..
ja sicher, hatte ich schon, habs aber bei meiner vorhergehenden frage nicht so explizit erwähnt...
Das hier ist nur eine alternative von vielen:
- beim start MIT hindernis davor fährt er sofort nach hinten los, ausgabe im terminal: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 OHNE ein hindernis davor bleibt er stehen, fährt also nicht nach vorne los, ausgabe im terminal:Code:Ping: 4 cm fahre rückwärts nach hindernisabfrage in - alle_stepper_vorwärts -
das ist die ausgabe von "ping_distanz", kommt ungefähr alle 8 sekunden...Code:Ping: 80 cm Ping: 79 cm Ping: 79 cm Ping: 79 cm
- wenn sich ihm in dieser phase ein hindernis von vorne nähert (handfläche) fährt er nach hinten los. Dann kommt im terminal:
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...Code:Ping: 3 cm fahre rückwärts nach hindernisabfrage in - alle_stepper_vorwärts -
Timingprobleme?
gruß inka
Lesezeichen