Schrittmotor mit 2 Taster und 2 Potis

Hallo,

bin neu in dem Thema Arduino.
Ich versuche einen Schrittmotor über 2 Taster zu Steuern.
Taster 1: Schrittmotor dreht eine bestimmte Schrittzahl Geschwindigkeit Poti1
Taster 2: Schrittmotor dreht eine bestimmte Schrittzahl Geschwindigkeit Poti2

Es funktioniert aber leider nur der Taster2 und die höhere Schrittanzahl. Taster1 wird ignoriert.
Beim drücken Taster2 blinkt auch die TX Led einmal.
Habe da wohl irgendwie einen denkfehler und komme nicht weiter.
Wäre sehr froh, wenn mir da jemand weiter helfen könnte. Hier mein Sketch:

Danke und Gruß

int Index;
const int PIN_schalter1 = 0;
const int PIN_schalter2 = 1;
int pot1;
int pot2;

void setup() {
  pinMode(PIN_schalter1, INPUT);
  pinMode(PIN_schalter2, INPUT);
  pinMode(6, OUTPUT);  //Enable
  pinMode(5, OUTPUT);  //Puls
  pinMode(4, OUTPUT);  //Direction
  digitalWrite(6, LOW);
}

void loop() {
  pot1 = analogRead(A0);
  digitalWrite(4, HIGH);
  if (digitalRead(PIN_schalter1)) {
    delay(100);                             //Wartezeit bis Drehung startet
    for (Index = 0; Index < 1000; Index++)  //Drehlänge Schalter1

      digitalWrite(5, HIGH);
    delayMicroseconds(pot1 * 3);  //Geschwindigkeit Schalter1
    digitalWrite(5, LOW);
  }
  pot2 = analogRead(A5);
  digitalWrite(4, HIGH);
  if (digitalRead(PIN_schalter2)) {
    delay(50);                              //Wartezeit bis Drehung startet
    for (Index = 0; Index < 3200; Index++)  //Drehlänge Schalter2
    {
      digitalWrite(5, HIGH);
      delayMicroseconds(pot2);  //Geschwindigkeit Schalter2
      digitalWrite(5, LOW);
    }
  }
}

Hoffe die Formatierung ist jetzt OK

Setze Deinen Sketch bitte in Codetags. Wie das geht, steht hier.
Außerdem formatiere den Code bitte ordentlich. Strg+T in der IDE hilft Dir dabei.
Das kannst Du auch noch nachträglich ändern.

Gruß Tommy

Suche Dir zwei andere Pins.
Die PIN 0 und 1 hängen an der seriellen (hast Du ja bemerkt) und die hängt am USB.

Wenn Du in Deiner Schaltung nicht sicherstellen kannst, das Du immer logische Level hast, dann wird Dir INPUT einen Streich spielen.

Wie könnte ich das denn dann anders lösen.
Sorry aber starte erst gerade damit :frowning:

Ändern in z.B.

const int PIN_schalter1 =4;
const int PIN_schalter2 =5;

und die Taster mit D4 und D5 verbinden.

Habe 12 und 13 genommen.
Taster1 wird weiter ignoriert.

Hast Du Pull-down Widerstände an den Tastern?

digitalWrite(4, HIGH); wird permanent 2x ausgeführt. Egal was du drückst.

Hier hast Du ein Problem.
Die Schleife durchläuft 1000 mal nur digitalWrite(5, HIGH);
Nicht mehr, danach geht es stur weiter.

Dann hast Du überall die Pinnummern geschrieben. Mach das nicht.
Wenn Du einmal einen Pin änderst, musst Du durch den ganzen Code und die Nummern suchen.
Bei Deinen 10 zeilen mag das noch gehen, aber gewöhne Dir an Variablen zu vergeben.

Aber: Ohne zu wissen, wie die Schalter angeschlossen sind, wird das zum Ratespiel.

Der PIN 13 hat die Onboard-LED mit dran. Ich würde die mit zur Kontrolle lassen.
Darum habe ich jetzt auf die Schnelle mal 10 und 11 für die Tasten genommen und die LED mit einprogrammiert;)
Was passiert, wenn der Code ausgeführt wird?

const byte schalter1Pin = 10;      // Sind das Schalter oder Taster?
const byte schalter2Pin = 11;
const byte motorDir = 4;
const byte motorPuls = 5;
const byte motorEnable = 6;
const byte poti1Pin = A0;
const byte poti2Pin = A1;

// Da ich nciht weiss, was für einen Pegel Du tatsächlich anliegen hast
const bool ein = HIGH; // Wenn Du PULLUP Widerstanände hast, dann auf LOW ändern
void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start... "));  // Kontrollausgabe
  pinMode(schalter1Pin, INPUT);    // Haben die Pins PULLUP bzw. PULLDOWN-widerstände?..
  pinMode(schalter2Pin, INPUT);    // .. und wie sind Schalter angeschlossen?
  pinMode(motorEnable, OUTPUT);
  pinMode(motorPuls, OUTPUT);
  pinMode(motorDir, OUTPUT);
  digitalWrite(motorEnable, LOW);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  if (digitalRead(schalter1Pin) == ein &&
      digitalRead(schalter2Pin) == ein )           // Wenn beide Schalter eingeschaltet sind
  {
    digitalWrite(motorEnable, LOW);                // Antrieb stoppen
  }
  else if (digitalRead(schalter1Pin))
  {
    digitalWrite(motorEnable, HIGH);
    digitalWrite(LED_BUILTIN, HIGH);
    for (unsigned int Index = 0; Index < 1000; Index++)  //Drehlänge Schalter1
    {
      digitalWrite(motorPuls, HIGH);
      delayMicroseconds(analogRead(poti1Pin) * 3);  //Geschwindigkeit Schalter1
      digitalWrite(motorPuls, LOW);
    }
    digitalWrite(motorEnable, LOW);
  }
  else if (digitalRead(schalter2Pin))
  {
    digitalWrite(motorEnable, HIGH);
    digitalWrite(LED_BUILTIN, HIGH);
    for (unsigned int Index = 0; Index < 3200; Index++)
    {
      digitalWrite(motorPuls, HIGH);
      delayMicroseconds(analogRead(poti1Pin));
      digitalWrite(motorPuls, LOW);
    }
    digitalWrite(motorEnable, LOW);
  }
  else
  {
    digitalWrite(motorEnable, LOW);
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Ich habe Pullup Widerstände.
Ich werde es morgen Abend mal testen und Dir Antworten.
Wünsche Dir ein schönes Rest WE

Dann darfst Du nicht auf HIGH prüfen:

Die Bedingungen sind dann immer wahr.

In meinem Codeschnipsel dann nur die Variable ein nicht mit HIGH sondern LOW füttern :slight_smile:

Hallo,

wenn ich den Sketch entsprechend der Lows und Highs wegen der Pullup Widerstände ändere funktioniert es.

const byte schalter1Pin = 10;      // Sind das Schalter oder Taster?
const byte schalter2Pin = 11;
const byte motorDir = 4;
const byte motorPuls = 5;
const byte motorEnable = 6;
const byte poti1Pin = A0;
const byte poti2Pin = A1;

// Da ich nciht weiss, was für einen Pegel Du tatsächlich anliegen hast
const bool ein = HIGH; // Wenn Du PULLUP Widerstanände hast, dann auf LOW ändern
void setup()
{
  Serial.begin(9600);
  Serial.println(F("Start... "));  // Kontrollausgabe
  pinMode(schalter1Pin, INPUT);    // Haben die Pins PULLUP bzw. PULLDOWN-widerstände?..
  pinMode(schalter2Pin, INPUT);    // .. und wie sind Schalter angeschlossen?
  pinMode(motorEnable, OUTPUT);
  pinMode(motorPuls, OUTPUT);
  pinMode(motorDir, OUTPUT);
  digitalWrite(motorEnable, LOW);
  pinMode(LED_BUILTIN, OUTPUT);
  digitalWrite(LED_BUILTIN, LOW);
}

void loop()
{
  if (digitalRead(schalter1Pin) == ein &&
      digitalRead(schalter2Pin) == ein )           // Wenn beide Schalter eingeschaltet sind
  {
    digitalWrite(motorEnable, LOW);                // Antrieb stoppen
  }
  else if (digitalRead(schalter1Pin))
  {
    digitalWrite(motorEnable, LOW);
    digitalWrite(LED_BUILTIN, HIGH);
    for (unsigned int Index = 0; Index < 1000; Index++)  //Drehlänge Schalter1
    {
      digitalWrite(motorPuls, HIGH);
      delayMicroseconds(analogRead(poti1Pin));  //Geschwindigkeit Schalter1
      digitalWrite(motorPuls, LOW);
    }
    digitalWrite(motorEnable, LOW);
  }
  else if (digitalRead(schalter2Pin))
  {
    digitalWrite(motorEnable, LOW);
    digitalWrite(LED_BUILTIN, HIGH);
    for (unsigned int Index = 0; Index < 3200; Index++)
    {
      digitalWrite(motorPuls, HIGH);
      delayMicroseconds(analogRead(poti2Pin));
      digitalWrite(motorPuls, LOW);
    }
    digitalWrite(motorEnable, LOW);
  }
  else
  {
    digitalWrite(motorEnable, LOW);
    digitalWrite(LED_BUILTIN, LOW);
  }
}

Gruß und ein dickes MERCI

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.