Projekt: Drahtführung für Wickelautomat (Teil 6)

Der nächste Button hängt an Pin 8 des NANO. Er simuliert den Endanschlag an der linken und rechten Seite der Spulenbreite. Hier muss aus aktueller Sicht auch nicht zwischen links und rechts unterschieden werden, weil einfach nur ein sofortiger Stop und ein Wechsel der Bewegungsrichtung notwendig ist. Die beiden Endschalter sind also später parallel zu schalten. Zur Simulation reicht jetzt einer.

Der Button an Pin 9 setzt den Motor wie schon vorher in Gang. Der Button an Pin 8 leitet einen sofortigen Stop ein und ändert die Drehrichtung. Damit man das sieht muss die Bewegung aber mit dem „Bewegungs“-Button eingeleitet werden. Das Programm dazu:

// step and 2 buttons
// -*- mode: C++ -*-
//
// Ein Button um den Motor zu bewegen, zweiter Button um die Drehrichung zu ändern
//
// Thomas Sturm mit diversen Quellen

#include <AccelStepper.h>

// Define a stepper and the pins it will use
AccelStepper stepper(AccelStepper::DRIVER, 2, 5); // pin 2 = step, pin 5 = direction

// The button definition
const int buttonTurn = 9;     // the number of the buttonTurn pin, btn to Vcc, pin via resistor to ground
const int buttonEnd = 8;     // the number of the buttonEnd pin, btn to Vcc, pin via resistor to ground

// variables will change:
int btnTurnState = 0;         // variable for reading the pushbutton status
int btnEndState = 0;         // variable for reading the pushbutton status
int weg = 200;                // variable for Länge der Bewegung

void setup()
{
  // Anpassungen an Stepper
  stepper.setMaxSpeed(20);   // max steps per second
  stepper.setAcceleration(10);  // Beschleunigung in Steps per second per second

  // Die Pins an denen die Buttons hängen als Eingang definieren
  pinMode(buttonTurn, INPUT);     
  pinMode(buttonEnd, INPUT);     

}

void loop()
{
  // Auslesen der Button-Zustände
  btnTurnState = digitalRead(buttonTurn);
  btnEndState = digitalRead(buttonEnd);
 
  // beide Buttons auswerten

  if (btnTurnState == HIGH) {     
    stepper.move(weg);
  }

  if (btnEndState == HIGH) {
    weg = – weg;    // Drehrichtung ändern
    stepper.stop();  // sofortigen Stop einleiten, siehe AccelStepper Classes
  }

stepper.run();   // run immer ausführen um Bewegung zu vollenden, siehe AccelStepper Classes
}

Beim Ablauf des Programms gibt es jetzt aber schon ein Problem. Beim Drücken des Endstop-Buttons (Pin 8) wird zwar immer ein Stop ausgeführt. Leider scheint sich die Drehrichtung nicht immer zu ändern. Ich würde mal schätzen, dass entweder der Button prellt, oder aber die loop-Schleife während eines Buttondrucks mehrfach durchläuft. Das habe ich abgesichert. Dann stellte sich aber heraus, dass das natürlich auch für den „Bewegungs“-Button gilt, was vorher nicht auffiel. Ich habe eine neue Variable int lock (in die Variablen-Deklarationen aufnehmen !!) eingeführt und die loop folgendermaßen geändert:

void loop()
{
  // Auslesen der Button-Zustände
  btnTurnState = digitalRead(buttonTurn);
  btnEndState = digitalRead(buttonEnd);
 
  // beide Buttons auswerten

  if (btnTurnState == HIGH && stepper.distanceToGo() == 0) {     
    stepper.move(weg);
    lock–;
  }

  if (btnEndState == HIGH && lock < 1) {
    weg = – weg;    // Drehrichtung ändern
    lock = 5;        // mindestens 5 Bewegungstrigger muss gewartet werden, bis wieder ein Richtungtrigger möglich ist
    stepper.stop();  // sofortigen Stop einleiten, siehe AccelStepper Classes
  }

stepper.run();   // run immer ausführen um Bewegung zu vollenden, siehe AccelStepper Classes
}

Es steht ja schon im Kommentar: Bevor ein Stop und eine Richtungsänderung erneut möglich ist, müssen erst 5 Bewegungstrigger kommen. Nur dieser Anteil allein brachte aber nicht die notwendige Wirkung, weil eben auch der andere Button nicht kurz genug gedrückt werden kann. Also musste auch hier eine Sicherheit gegen Mehrfachbetätigung eingeführt werden. Über stepper.distanceToGo() == 0 lässt sich das einfach bewerkstelligen. Erst wenn eine Bewegung beendet ist, kann eine neue erfolgen.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht.