Arduino Uno & Stepper-Shield

OP #3086121
Lesenswert?

Hallo. Habe ein klitzekleines Problem mit meiner Programmierung.

Die Digitaleingänge werden nicht abgefragt. zumindest wird nix 
angenommen von denen.

wenn mir jemand einen "wink mit dem Zaunpfahl" geben könnte währ ich 
sehr dankbar.
1
/*Schrittmotorsteuerung für eine Barndormontierung
2

3
   Frequenz einstellbar und über SerialPort veränderbar
4
   
5
   by Michael H
6
   
7
   version 0.8b  
8
*/
9
boolean dirPinx     = 3;
10
boolean stepperPinx = 2;
11
boolean dirPiny     = 7;
12
boolean stepperPiny = 6;
13
boolean x_ein_dir   = 10; //Motor X Richtung
14
boolean en          = 12; //Motorfreigabe
15
boolean x_4         = 11; //Motor X 4Hz
16
int x_sensor        = A0; //X-Speed Poti
17
int x_sensor_val    = 0;  //X-Speed Speicher
18
boolean x           = 0;
19
int d_x             = true;
20
boolean enable      = false;
21
boolean dir_old     = false;
22
int serInp          = 0;
23

24
void setup() 
25
{
26
  Serial.begin(9600);
27
  pinMode(dirPinx, OUTPUT);
28
  pinMode(stepperPinx, OUTPUT);
29
  pinMode(dirPiny, OUTPUT);
30
  pinMode(stepperPiny, OUTPUT);
31
  pinMode(x_ein_dir, INPUT);
32
  pinMode(en, INPUT);
33
  pinMode(x_4, INPUT);
34

35
//interne Pullups:
36
    digitalWrite(x_ein_dir, HIGH);
37
    digitalWrite(en, HIGH);        
38
    digitalWrite(x_4, HIGH);
39
    
40
// Y-Achse auf 0
41
    digitalWrite(dirPiny, LOW);
42
    digitalWrite(stepperPiny, LOW);
43
}
44

45

46
void step(boolean dir)
47
{
48
  
49
  if(dir != dir_old)
50
  {
51
   digitalWrite(dirPinx,dir);
52
   delay(50);
53
  }
54

55
    digitalWrite(stepperPinx, HIGH);
56
    delayMicroseconds(x_sensor_val);
57
    digitalWrite(stepperPinx, LOW);
58
    delayMicroseconds(x_sensor_val);
59
    dir_old= dir;
60
    return;
61
}
62

63
void loop(){
64
  
65
  x = digitalRead(x_4);
66
  
67
    if (Serial.available()>0)
68
     { serInp = Serial.read();
69
       Serial.flush();
70
     }
71
 
72
    if( x = LOW )
73
     {
74
      x_sensor_val = 125;
75
     }
76
    else x_sensor_val = serInp;
77

78
  enable = digitalRead(en);
79

80
    if (enable = true)
81
     {
82
      d_x = digitalRead(x_ein_dir);
83
       if(d_x = true)
84
       {
85
         step(true);  
86
       }
87
       else
88
       {
89
         step(false);
90
       }
91
   }
92

93

94
}

mfg
Michael
#3087422
Lesenswert?

Michael Hakenkötter schrieb:
> Wow danke! ich hab mir einen Wolf gesucht!!!
>
> manchmal übersieht man die einfachsten dinge ;)

Es ist eigentlich ganz einfach.
Spar dir solche Sachen
1
    if (enable == true)

und dann kannst du da auch keinen Fehler machen.
Wenn enable sowieso schon ein boolscher Wert ist, dann brauchst du den 
nicht mit true zu vergleichen. Denn da kann nur dann als Ergebnis des 
ganzen Ausdrucks true rauskommen, wenn enable auch schon true war
1
    if (enable)

macht also ganz genau das gleiche. Nur ohne Potential für Tippfehler.

Leider weiß ich nicht, wie HIGH und LOW beim Arduino definiert ist. Aber 
wenn die Italiener nicht ganz bescheuert waren, dann haben sie LOW als 0 
und HIGH als 1 definiert. Wodurch man anstatt
1
    if( x == HIGH )
genausogut
1
    if( x )
schreiben kann, und anstelle von
1
    if( x = LOW )
kann man
1
    if( !x )
schreiben und hat wieder die Tippfehler-Gefahr gebannt.
Nennt man die Variable dann nicht einfach nur x, sondern gibt ihr einen 
sprechenden Namen, dann wird das ganze meistens sogar noch 
übersichtlicher als mit den ganzen Vergleichen.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren