NXT Drehung mit EV3-G-Software

grafische Programmiersprachen für den EV3/NXT.
NXT-G, Robolab, LabView und was noch so schön bunt ist...

Moderator: Moderatoren

drj
Neuer Schreiber
Neuer Schreiber
Beiträge: 2
Registriert: 20. Okt 2017 07:31

NXT Drehung mit EV3-G-Software

Beitragvon drj » 30. Okt 2017 13:08

Hallo,

ich bin gerade dabei, mich in die Programmierung von einem NXT reinzuarbeiten. Jetzt hänge ich bei einer simplen und möglichst reproduzierbaren Drehbewegung auf der Stelle (ein Rad (Motor A) vorwärts, ein Rad (Motor C) rückwärts) und hoffe, Ihr könnt mir weiterhelfen.

Wenn ich den Standard-Motorblock zur Geradeausfahrt benutze, scheinen ja die beiden Motoren A+C automatiisch synchronisiert zu werden, so daß der Robbi nicht zur Seite zieht und am Ende der Bewegung kaum Unterschiede der Motorsensoren vorhanden sind.

Verändere ich jedoch die Lenkung auf 100, so sollte ja eigentlich eine Drehung auf der Stelle durchgeführt werden. Aber hier gibt's Probleme, denn die Motoren sind offensichtlich in Ihrer Bewegung nicht synchronisiert, so daß minimal unterschiedlich schnell laufende Motoren zu einer Winkelabweichung der Motoren führen und 'A-Drehwinkel' nicht gleich 'Minus-C-Drehwinkel' ist. Ich habe den Eindruck, daß der Motor, der zuerst den gesetzten Endwert erreicht, den Motorblock stoppt und der hinterherlaufende Motor damit vor Erreichen seines Endpunktes stehenbleibt.

Das ist v.a. dann ärgerlich, wenn die Gegenbewegung zur anderen Seite mit dem gleichen Drehwinkel der Motoren dann zu einem anderen Drehwinkel des Robbis führt und für die gleiche Bewegung zurück andere Endpunkte eingegeben werden müssen.

Wie kann man am einfachsten eine möglichst reproduzierbare Drehung auf der Stelle machen lassen, so daß beide Motoren am Ende den gleichen Laufwinkel haben?

Ich habe schon folgendes versucht:

Motor A auf EIN > Motor C starten mit Angabe des Drehwinkels mit Stop am Ende der Bewegung > Motor A Stop
Aber bei minimal unterschiedlichen Motorgeschwindigkeiten gibt es auch hier unterschiedliche Drehwinkel.

Motor-Sensoren Reset > Motor A EIN > Motor C EIN > Schleife mit verschachtelten Schaltern, die nacheinander die Motorsensoren abfragen und bei Erreichen eines Drehwinkels größergleich Endwinkel den Motor stoppt und den anderen weiterlaufen lässt, bis auch dieser seinen Endpunkt erreicht hat und ebenfalls gestoppt wird.
Aber egal, ob ich jetzt für das Erreichen eines Motorendpunktes eine logische Veriable gesetzt habe und die Schleife bei Erreichen beider Endpunkte über eine und-Verknüpfung beendet habe oder ob die Schleife aus der tiefen Verschachtelungsebene mit dem Schleifenabbruch-Block beendet wurde - bei höherer Geschwindigkeit, war die Schleife nicht schnell genug. D.h. z.B. bei 1000° Motordrehung hat die Schleife nur 900 Durchläufe gemacht und damit ist nicht nach jedem Winkelgrad die Abfrage so durchgeführt worden, daß ein rechtzeitiger Abbruch erfolgte. Die Endpunkte sind immer über die Vorgaben hinausgeschossen. Nicht viel - aber zu unpräzise.

Wie macht man das am Besten?


Programm mit 'Y-Kabel', d.h. gleichzeitige Ausführung beider einfachen Motorblöcke mit Angabe der Endpunkte und jeweils anschließendem Warteblock, damit der parallel ausgeführte, jeweils langsamere Teilabschnitt auf jeden Fall auch zu Ende läuft?

Oder Motor A EIN > Motor C EIN und dann Motorsensoren in Schleife vergleichen und bei vorauslaufenden Motor Speed um Sensordifferenz reduzieren, daß die Motoren synchron bleiben? Abbruch dann, wenn einer der Motoren den Endpunkt erreicht hat?

Oder die Bewegungen nicht gleichzeitig, sondern nacheinander? Erst Motor A, dann Motor C, jeweils mit Stopp am Endpunkt?

Oder sollte man Drehungen auf der Stelle möglichst ganz vermeiden, damit man ein Rad als definierten Mittelpunkt der Drehbewegung hat und nur das andere Rad drehen lässt, dann hat man nicht 2 Motoren, die Fehler machen können, sondern nur einen?

Oh je -gibt es vielleicht eine einfach und funktionierende Möglichkeit?

Oder brauche ich dann doch den EV3, um dann mit HIlfe eines Gyro-Sensors genauere Drehungen um eine vertikale Achse durchführen zu können?

Danke für Eure Hilfe, damit es wieder etwas Durchblick im dichten Dschungel der Drehbewegungen gibt.

André

Peter28
Schreibt viel
Schreibt viel
Beiträge: 187
Registriert: 2. Nov 2013 21:44
Wohnort: Schmallenberg

Re: NXT Drehung mit EV3-G-Software

Beitragvon Peter28 » 31. Okt 2017 12:51

Sollte bei jedem Schleifendurchlauf 1° weiter gedreht werden? Dann ist wohl ein Fehler schon vorprogrammiert, weil der Motor nie exakt so kleine Teilbereiche darstellen kann. Mach doch pro Motor eine Schleife, deren Abbruchbedingung die ausgelesenen Motorwinkel sind. Sind diese 2 Schleifen in einer übergeordneten, ist bei dieser die Abbruchbedingung, dass beide ihren Sollwinkel erreicht haben. So kann jeder Motor für sich "wurschteln" und wenn sich beide ausgedröselt haben gehts weiter. Da können sie sogar mit unterschiedlicher Geschwindigkeit laufen. Ich habe allerdings das Gefühl, dass bei Dir irgendwie ein Schlupf entsteht. Normaler weise klappt das mit der dafür vorgesehenen Motorsteuerung.

drj
Neuer Schreiber
Neuer Schreiber
Beiträge: 2
Registriert: 20. Okt 2017 07:31

Re: NXT Drehung mit EV3-G-Software

Beitragvon drj » 31. Okt 2017 16:42

Sollte bei jedem Schleifendurchlauf 1° weiter gedreht werden?


Nein - die Motoren waren in dem Beispiel mit den Schleifen wie beschrieben einach ohne Endbegrenzung auf EIN gestellt und in der Schleife wird ständig der Motorsensor abgefragt. Aber wenn die Schleifengeschwindigkeit niedriger ist als der laufende Motor die Winkelgrade überschreitet, dann ist ein verzögerter Abbruch die Folge. Die Schleife müsste, um genau den Endpunkt zu treffen, ja deutlich schneller sein.

Ich probiere nochmal die vorgesehenen Motor-Blöcke mit redzierter Geschwindigkeit, vielleicht ist ja wirklich ein Rad weggerutscht, weil die Motor-Geschwindigkeit zu hoch eingestellt war.

Mach doch pro Motor eine Schleife, deren Abbruchbedingung die ausgelesenen Motorwinkel sind.


Ist es dann egal, ob ein auf 'EIN' geschalteter Motor in einer Schleife eine Abbruchbedingung größergleich Endwert hat oder ob man nach dem auf 'EIN' geschalteten Motor einen Warteblock einfügt, der auf den Endwert prüft?

Sind diese 2 Schleifen in einer übergeordneten, ist bei dieser die Abbruchbedingung, dass beide ihren Sollwinkel erreicht haben. So kann jeder Motor für sich "wurschteln" und wenn sich beide ausgedröselt haben gehts weiter.


Wie prüft man am besten, ob beide Bedingungen erfüllt werden? Nach dem Erreichen des Endwertes für jeden Motor eine eigene logische Variable auf true setzen und dann in der übergeordneten Schleife eine 'und-Verknüpfung' beider Variablen als Schleifenabbruch-Bedingung benutzen?

André


Zurück zu „grafische Programmiersoftware“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 9 Gäste

Lego Mindstorms EV3, NXT und RCX Forum : Haftungsauschluss