ACHTUNG Verständnisposting, hilft nicht direkt bei der Lösung aber beim Verständnis und der weitern Programmierung.
wozu du dich mal belesen solltest ist die sog. Parallele Datenverarbeitung (Vorsicht das gibts in einfach und kompliziert, für dich reicht die einfache Variante die sich nicht mit Multithreading und Multicore beschäftigt)
Wenn du als Mensch z.B. nach einem Apfel greifst, machst du mehrere Dinge parallel, du steuerst deine Linearaktoren (Muskeln), fühlst die Bewegung und Position deines Arms mit Sensoren (Nervenenden) und trackst den Apfel und deine Hand in relation zum Apfel.
Wenn du aber nur einen Prozess zu einer Zeit verarbeiten kannst (weil einfacher single Core Controller) musst du Time Slicing betreiben, also quasi jedem Vorgang nacheinander ausführen, aber immer nur ein kleines Stück.
Dafür gibt es diverse Ansätze die sich mit festem und flexiblem Timing beschäftigen, wenn es um genaue Steuerung geht aber das Timing kannst du auch erstmal weglassen.
Du musst also deine Aufgabe in Teile unterteilen die unabhängig voneinander ablaufen udn die Ergebnisse dieser TEilaufgaben zusammenführen udn vor jeder neuen Teilaufgabe die Aufgabe an die neue Situation anpassen.
Vereinfacht gesagt, du guckst (Aufgabe 1) erst wo ist dein Arm, wo ist der Apfel und schätzt die Distanz ab. Da du deinen Arm schon lange benutzt, weist du auch ohne gucken, wieviel Kraft du in den Muskel schicken musst (Aufgabe 2) damit der Arm sich bewegt ... da gehört zwar noch der Part mit dem Fühlen dazu aber den lassen wir der einfachheit weg
Wenn du Aufgabe 1 und 2 abgeschlossen hast, fängst du wieder von vorne an, du guckst also wie weit der Arm noch bewegt werden muss und passt ggf. die Kraft der Muskeln an um den Arm zu beschleunigen oder zu bremsen(Aufgabe 2).
Udn das wiederholt sich so lange bis du den Arm in der Hand hast. (edit: oha böser typo ... das hoffe ich natürlich nicht ... ich meinte den Apfel in der Hand)
Dafür braucht es dann, damit es auch übersichtlich programmiert ist, in deiner loop nur 2 methoden die immer wieder aufgerufen werden, nämlich readPoti() und controlMotor()
in deinem Projekt speicherst du dann die ergebnisse einfach global (wie dud as mit int_poti usw. schon machst) und in deiner control motor routine triffst du dann anhand des wertes deines potis eine entscheidung die motoren zu steuern. innerhalb dieser methoden ist es natürlich verboten schleifen einzubauen die nicht eine vorhersagbare anzahl an zyklen durchlaufen, sonst kommst du aus einer aufgabe nicht raus und kannst die anderen nicht mehr ausführen ....
Stell dir das einfach vor, dass du beim Arm bewegen z.B. eine Schleife einbaust die dafür sorgt dass der Arm um eine bestimmte Distanz vorwärst bewegt wird ohne dabei zwischendurch die augen zu benutzen und der Apfel rollt nur ein Stück weg ... im schlimmsten Fall kickst du den Apfel durch den Raum oder rammelst dich an einem Hindernis das plötzlich auftaucht.
Hättest du die Aufgabe so gebaut dass immer nur einmal kurz "nachgeregelt" wird, hättest du den Apfel rtotzdem sauber aufgenommen oder wärst dem Hindernis ausgewichen ...
PS ich fühle mich gerade in mein Robotik Projekt zurückversetzt ... Asuros die gleichzeitig miteinander Kommunizieren, einer Linie folgen und parallel die Motoren steuern um durch das Klebeband Labyrinth zu fahren
edit: wenn du dich an so eine einfache strukturierung deines programmes hälst, kannst du auch später ohne viel hirnverknotung neue sachen und aufgaben einbauen
Lesezeichen