Hm- wo setzt du das Flag wieder auf 0?
Wahrscheinlich liegt dort der Hase im Peffer....
Hm- wo setzt du das Flag wieder auf 0?
Wahrscheinlich liegt dort der Hase im Peffer....
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
wahrscheinlich...
mit dem einsatz von timer(), sekundenaufgaben() und meiner entprellten ping-abfrage
läuft das jetzt: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; } } }
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
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..
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:
funktioniert natürlich nicht, das blockiert die stepper. Aber 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 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...Code:myservo.write(30);
Ich denke ich könnte auch mehrere solche timer benutzen, oder? z.b. mit unterschiedlichen intervallen...
gruß inka
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..
ich habe mich jetzt ein paar tage mit den steppern, dem timing derselben, den unterbrechungen im ablauf durch das pingen nach hindernissen und ähnlichem zeug beschäftigt. Und bin zu dem resultat gekommen, dass ich aus einem vermeintlichen manko nun eine tugend mache
Der roboter war ja von anfang an eher zu einem "gemächlichen" vorgehen und einem eher überlegten agieren konzipiert, nicht zu einem flitzer, bei dem es auf sekundenbruchteile ankommt bevor es kracht. Folgenden ablauf dachte ich mir werde ich anpeilen:
- er schaut ob es in fahrtrichtung ein hindernis gibt, stellt fest wie weit die strecke hindernisfrei ist und fährt in normaler geschwindigkeit los
- nach ca 2/3 der strecke, also ca in 1,5 metern schaltet er runter oder bleibt vielleicht sogar stehen und pingt noch einmal (ohne dass es zu problemen mit den unterbrechungen kommt) und in unterschiedlichen richtungen (evtl. dreht er sich auch um seine achse) und je nach ergebnis bzw. je nach den aufgaben fährt er weiter oder macht anderes...
- das andere kann bestehen aus position über gyro messen, akkuspannung messen und per IR evtl. eine ladestation anpeilen, luftfeuchte messen, temperatur messen usw, usw, usw...
- und je nach aufgabenstellung gehts dann weiter...
Trotz dieses relativ selbständigen vorgehens werde ich auf einen zugriff von aussen nicht verzichten wollen, nun kommt Rabenauges fernbedienung ins spiel...
gruß inka
Schnell fahren wird mit _den_ Antrieben sowieso nix- weder mit den Steppern (denke ich, meine Erfahrung mit den Dingern beschränkt sich bisher allerdings auf 3D-Drucker), aber auf keinen Fall mit solchen Rädern.
Dafür sind die auch gar nicht konzipiert...
Du hast halt zwei Flaschenhälse da: zum einen die ohnehin nicht superschnellen US-Sensoren (geht schon, aber es gibt einfach flotteres), und dann noch das Schwenken- Servos sind für nen Mikrocontroller, so was _richtig_ lahmes.
Insofern halte ich deine geplante Strategie nicht für die schlechteste...wenn es partout nicht geht, die Stepper normal weiterlaufen zu lassen, während andere Dinge getan werden.
Wobei das bestimmt möglich ist: mein Drucker schafft es ja auch, während die Motoren laufen, z.B. das Display zu aktualisieren oder die Temperatur zu überwachen.
Grüssle, Sly
..dem Inschenör ist nix zu schwör..
Lesezeichen