Forum: Mikrocontroller und Digitale Elektronik Arduino Uno & Stepper-Shield


von Michael H. (m0ddmylife)


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

von Electronics'nStuff (Gast)


Lesenswert?

Die Schalter sind aktiv-low?

von EGS (Gast)


Lesenswert?

Electronics'nStuff schrieb:
> Die Schalter sind aktiv-low?

Wie kommst du darauf? Wenn du wegen:

digitalWrite(x_ein_dir, HIGH);

das schliesst, nein. der Befehl aktiviert den internen Pullup an dem 
Pin.

von EGS (Gast)


Lesenswert?

Michael Hakenkötter schrieb:
> if( x = LOW )

könnte dein Fehler sein, hab ich in nem anderen Post leider auch 
vergessen zu schreiben, denn:

Vergleich auf Wert:

 x == y (x is equal to y)

Wert setzen auf Y

 x = Y

Du fragst die Werte nicht du setzt diese in deinem If-Anweisungen

MfG EGS

von Michael H. (m0ddmylife)


Lesenswert?

Wow danke! ich hab mir einen Wolf gesucht!!!

manchmal übersieht man die einfachsten dinge ;)

Schönes Wochenende euch !

Michael

von Karl H. (kbuchegg)


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.

von Michael H. (m0ddmylife)


Lesenswert?

Ok danke für deinen tipp! ich werd es mal ausprobieren :)

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.