Hallo Leute, ich bin ein Arduino Neuling und komme im Moment nicht voran. Ich möchte einen XY-Plotte programmieren. Bevor ich überhaupt loslege möchte ich den zwei Antrieben ihre Endposition erlernen lassen (Initialisierung). Ich dachte diese Funktion setzte ich in die Setup rein da ich sie ja nur einmal vor der Loop brauche. Das funktioniert aber nicht! :( Wenn ich meine Funktion in der Loop, mit einer if abfrage ausführe läuft es Einwand frei. In der Setup tut sich jedoch nichts. Hier meine Setup Funktion: void setup() { stepperY.setCurrentPosition(0); stepperX.setCurrentPosition(0); initSteppers(); } Muss ich etwas beachten wenn ich eine Funktion in der Setup ausführen möchte???
Zeig doch mal das ganze Programm. Oder auch dasjenige, so wie es funktionierte.
Hier mal das Ganze. Wie schon gesagt, wenn ich die Funktion initSteppers() so in die Loop nehme funktioniert es.
1 | #include <AccelStepper.h> |
2 | #include <Makeblock.h> |
3 | #include <Arduino.h> |
4 | #include <SoftwareSerial.h> |
5 | #include <Wire.h> |
6 | |
7 | /*
|
8 | * Setzen der Ein- und Ausgänge des Arduino Boards
|
9 | */
|
10 | AccelStepper stepperX(AccelStepper::DRIVER, 13, 12); // 13-PUL,12-DIR OR 2-PUL, 8-DIR |
11 | AccelStepper stepperY(AccelStepper::DRIVER, 2, 8); |
12 | int motorDrc = 4; //M1 |
13 | int motorPwm = 5; //M1 |
14 | MeLimitSwitch limitSwitchX(PORT_7); //Me_LimitSwitch module can only be connected to the PORT_3, PORT_4, PORT_6, PORT_7 and PORT_8 of Me - Base Shield. |
15 | MeLimitSwitch limitSwitchY(PORT_8); |
16 | |
17 | /*
|
18 | * Benötigte Variablen
|
19 | */
|
20 | long current_positionY; |
21 | long target_positionY = 0; |
22 | long current_positionX; |
23 | long target_positionX = 0; |
24 | long counter = 1; |
25 | |
26 | /*
|
27 | * Setup, wird nur einmal vor der loop ausgeführt
|
28 | */
|
29 | void setup() |
30 | {
|
31 | stepperY.setCurrentPosition(0); |
32 | stepperX.setCurrentPosition(0); |
33 | initSteppers(); |
34 | }
|
35 | |
36 | void loop() |
37 | {
|
38 | driveTest(); |
39 | }
|
40 | |
41 | void initSteppers(){ |
42 | |
43 | current_positionX = stepperX.currentPosition(); |
44 | current_positionY = stepperY.currentPosition(); |
45 | |
46 | if(counter == 1){ |
47 | current_positionX = stepperX.currentPosition(); |
48 | current_positionY = stepperY.currentPosition(); |
49 | stepperX.setMaxSpeed(250); |
50 | stepperX.setAcceleration(4000); |
51 | stepperX.moveTo(-2000); |
52 | |
53 | stepperY.setMaxSpeed(350); |
54 | stepperY.setAcceleration(8000); |
55 | stepperY.moveTo(-2000); |
56 | |
57 | counter = 0; |
58 | }
|
59 | |
60 | if(limitSwitchX.touched()==0){ //If the limit switch is up, the "readUpPin" return value is true. |
61 | stepperX.setCurrentPosition(0); |
62 | stepperX.moveTo(1200); |
63 | |
64 | //while(limitSwitch.touched()==0){ //Repeat check the switch state, until released.
|
65 | }
|
66 | else if(current_positionX == 1200){ |
67 | target_positionX = stepperX.currentPosition(); |
68 | |
69 | stepperX.moveTo(0); |
70 | }
|
71 | |
72 | if(limitSwitchY.touched()==0){ //If the limit switch is up, the "readUpPin" return value is true. |
73 | stepperY.setCurrentPosition(0); |
74 | stepperY.moveTo(1300); |
75 | |
76 | }
|
77 | else if(current_positionY == 1300){ |
78 | target_positionY = stepperY.currentPosition(); |
79 | stepperY.moveTo(0); |
80 | |
81 | }
|
82 | |
83 | |
84 | stepperX.run(); |
85 | stepperY.run(); |
86 | |
87 | }
|
88 | |
89 | void driveTest(){ |
90 | if(current_positionX == 0){ |
91 | stepperX.moveTo(target_positionX); |
92 | }
|
93 | else if(current_positionX == target_positionX){ |
94 | stepperX.moveTo(0); |
95 | }
|
96 | stepperX.run(); |
97 | }
|
:
Bearbeitet durch User
Ich weiss jetzt nicht, aber eine leere void loop() { } könnte allenfalls ein Problem sein. Setze da zumindest mal was ein.
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.
:
Bearbeitet durch User
Danke für die ausführlicher Antwort echt Top! Das mit dem run() in der Setup ist mir auch aufgefallen und habe eine Lösung, ähnlich wie deine gefunden. Hier meine Lösung zu dem Problem:
1 | void setup() |
2 | {
|
3 | current_position_X = stepperX.currentPosition(); |
4 | current_position_Y = stepperY.currentPosition(); |
5 | initSteppers(); |
6 | stepperX.setMaxSpeed(2000); stepperY.setMaxSpeed(2000);// set XY working speed |
7 | stepperX.setAcceleration(4000); stepperY.setAcceleration(4000);// set XY working acceleration |
8 | }
|
9 | |
10 | |
11 | void initSteppers(){ |
12 | stepperX.setMaxSpeed(250); stepperX.setAcceleration(2000); // set X stepper speed and acceleration |
13 | stepperY.setMaxSpeed(300); stepperY.setAcceleration(2000); // set Y stepper speed and acceleration |
14 | stepperX.moveTo(-2000); stepperY.moveTo(-2000); // move XY to origin |
15 | |
16 | while(limitSwitchX.touched()==1) //Sucht die Endpos. bis der Schalter schaltet |
17 | stepperX.run(); |
18 | while(limitSwitchY.touched()==1) |
19 | stepperY.run(); |
20 | |
21 | stepperX.setCurrentPosition(0);stepperY.setCurrentPosition(0); // reset XY position |
22 | target_position_X = 1200; target_position_Y = 1300; |
23 | }
|
Danke für die Antworten!
:
Bearbeitet durch User
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.