Forum: Mikrocontroller und Digitale Elektronik Arduino Funktionen in der Setup


von Cihan K. (cihan7515)


Lesenswert?

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???

von Markus (Gast)


Lesenswert?

Zeig doch mal das ganze Programm.
Oder auch dasjenige, so wie es funktionierte.

von Cihan K. (cihan7515)


Angehängte Dateien:

Lesenswert?

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
von Markus (Gast)


Lesenswert?

Ich weiss jetzt nicht, aber eine leere
void loop()
{
}

könnte allenfalls ein Problem sein.
Setze da zumindest mal was ein.

von Karl H. (kbuchegg)


Lesenswert?

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
von Cihan K. (cihan7515)


Lesenswert?

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
Noch kein Account? Hier anmelden.