Ich seh jetzt nicht, wie das in setup() überhaupt jemals funktionieren
soll.
In loop funktioniert das, weil loop() laufend immer wieder aufgerufen
wird.
Damit erfolgt die Abfrage auf das Ansprechen der Endschalter und die
Aufrufe von run() immer wieder. Aber setup() wird ja nur ein einziges
mal aufgerufen und dazu ist dann auch noch die Abfrage auf die
Endschalter falsch. Zudem macht ein Aufruf von run() nicht den
kompletten Weg, sondern immer nur ein kleines Stück davon. D.h. mit
deinem einzelnen Aufruf von run() in setup tut sich da praktisch gesehen
überhaupt nichts. Und selbst wenn, überdenk doch mal deine Logik in
setup()! Du stellst die Werte für den nächsten Verfahrweg ein, dann
überprüfst du die Endschalter und dann fährst du (ohne dich weiter um
die Endschalter zu kümmern). Was ist denn das für eine Logik?
Erwartet hätte ich eigentlich eine Art Schleifen-konstruktion in Setup.
Nach dem Muster
1 | void setup()
|
2 | {
|
3 | ...
|
4 |
|
5 | // X-Acchse kalibrieren
|
6 | gib dem X-Stepper Befehl gaaaaanz weit zu kleinen X-Werten zu fahren
|
7 | (das sollte er nicht mit Full-Speed machen, sondern eher langsam.
|
8 | Immerhin haben wir noch keine Ahnung, wie der Kopf in Bezug zum
|
9 | Endschalter steht
|
10 |
|
11 |
|
12 | while( Endschalter X nicht angesprochen )
|
13 | X-Stepper.run();
|
14 |
|
15 | da wir jetzt am Endschalter stehen, wissen wir, dass hier 0 ist.
|
16 | Daher dem Stepper mitteilen, dass er jetzt auf 0 steht.
|
17 |
|
18 | Eventuell sollte man das noch mal etwas verfeinern, da ja mit einer
|
19 | gewissen Geschwindigkeit in den Endschalter gefahren wurde und das
|
20 | das Ergebnis verfälschen könnte. Noch einmal ein bischen in Richtung
|
21 | positiver X-Werte verfahren und dann gemächlich unter Bebachtung des
|
22 | Endschalters sich der 0-Position annähern, könnte einen besseren Wert
|
23 | liefern.
|
24 |
|
25 | // Y-Achse kalibrieren
|
26 | Y-Stepper den Befehl geben, gaaaanz weit (langsam) in Richtung
|
27 | kleiner Y-Werte zu fahren
|
28 |
|
29 | while( Endschalter Y nicht angesprochen )
|
30 | Y-Stepper.run();
|
31 |
|
32 | dem Y-Stepper mitteilen, dass er jetzt auf 0 steht.
|
33 |
|
34 | Eventuell das Ergebnis nochmal verbessern.
|
35 | }
|
Eine derartige Struktur hätte ich eigentlich in setup() erwartet. Dein
Code sieht aber nicht annähernd so oder so ähnlich aus.
Insbesondere fehlt mir die Schleife, die immer wieder Aufrufe von run()
macht und bei der die Schleifenbedingung (und dadurch die run() Aufrufe)
vom Ansprechen des Endschalters abhängt.
In deiner Version funktioniert das deshalb, weil du die Schleife durch
die laufenden Aufrufe von loop() automatisch erhältst und in Loop dann
prüfst ob die Endschalter angesprochen haben. Das geht in loop(), aber
das geht nicht in setup(), weil setup() ja nicht mehrmals aufgerufen
wird. Da musst du schon selber eine Schleife rund um die run() Aufrufe
legen, die dann den Motor tatsächlich verfahren.