Kugelbahn-Maschine

Ich habe die Delays jetzt mal überall raus genommen, ausser in: KUGEL_ABSTREIFEN. Hier braucht es eine längere Pause aus mechanischen Gründen. (die Kugel schwankt zusehr nach dem Abstreifen und muss sich etwas "auspendeln" bevor es weiter geht.

#include <MobaTools.h>
#include "Wire.h"

constexpr uint16_t NULLPOSLIFT = 100; // Abstand Referenzpunkt (LS) zum Nullpunkt

const byte dirPin = 3;
const byte enaPin = 4;
const byte stepPin = 5;
const int servoPin = 9;  //  servo

int buttonState = 0;

//const byte refLift = A0;
//const int sensor = A1;

const byte inPins[] = { A0, A1 };
const byte pinAnzahl = sizeof(inPins);
const int stepsPerRevLift = 2000;

enum : byte { refLift, sensor};
#define MAX8BUTTONS     // optional, spart Speicherplatz ( Standard ist maximal 16 Taster )
MoToButtons Taster ( inPins, pinAnzahl, 20, 2000 );  // Einrichten der Tasterverwaltung

enum class Schritt : byte { RUHEZUSTAND, REF_CHK_LIFT, REF_FREI_LIFT, REF_LIFT, REF_LIFT_GEFUNDEN, LIFT_RUNTER, LIFT_HOCH, REF2, ARM_SCHWENKT_HIN, KUGEL_ABSTREIFEN, LIFT_ETWAS_RUNTER, ARM_SCHWENKT_RETOUR };

MoToStepper stepLift(stepsPerRevLift, STEPDIR);  // Schrittmotor Lift
MoToServo servoArm;    // Servo ArmMoToButtons Taster(inPins, pinAnzahl, 20, 2000); // Einrichten der Tasterverwaltung
bool SchrittmotorAUSMsgPrinted = false;

void setup() {

  Serial.begin(9600);

  stepLift.attachEnable(enaPin, 100, LOW);
  stepLift.attach(stepPin, dirPin);
  stepLift.setSpeed(120);
  stepLift.setRampLen(100);
  servoArm.attach(servoPin); // servo at pin 9
  servoArm.setSpeed(5);    // set servo speed
  servoArm.write(60);


}


void loop() {
  Taster.processButtons();

  static Schritt schritt = Schritt::REF_CHK_LIFT;

  switch (schritt) {

    case Schritt::REF_CHK_LIFT:
      if (!Taster.state(refLift)) {    // checken, ob Mikroschalter gedrückt ist
        stepLift.doSteps(-2600);         // Falls nicht, Hoch fahren des Liftes zum Mikroschalter
        Serial.println("REF_CHK_LIFT:checken ob Kugel am Mikroschalter");
        schritt = Schritt::REF_FREI_LIFT;
      }
      else {
        schritt = Schritt::REF_LIFT;
      }
      break;

    case Schritt::REF_FREI_LIFT:
      {
        if (Taster.pressed(refLift))
        {
          stepLift.setZero(NULLPOSLIFT);  // Nullpunkt etwas unter dem Mikroschalter
          stepLift.write(0);
          Serial.println("Ref-Lift erreicht");
          schritt = Schritt::LIFT_RUNTER;
        }
        break;

      case Schritt::REF_LIFT:

        stepLift.doSteps(200);   // Wenn Mikroschalter gedrückt ist, den Mikroschalter frei fahren.
        Serial.println("REF_LIFT:Mikroschalter freifahren");
        schritt = Schritt::RUHEZUSTAND;

        break;

      case Schritt::RUHEZUSTAND:

        if (!stepLift.moving()) {
          if (Taster.pressed(sensor)) {  // Wenn Bewegungsmelder aktiviert wird: Lift fährt nach unten.
            schritt = Schritt::LIFT_RUNTER;
          }
        }
        break;

      case Schritt::LIFT_RUNTER:
        if (!servoArm.moving()) {
          stepLift.doSteps(2550);
          Serial.println("LIFT_RUNTER:Lift fährt hinunter");
          schritt = Schritt::LIFT_HOCH;
        }
        break;

      case Schritt::LIFT_HOCH:
        if (!stepLift.moving()) {
          stepLift.doSteps(-2800);  // Lift fährt mit der Kugel nach oben
          Serial.println("LIFT_HOCH:Lift fährt hoch");
          schritt = Schritt::REF2;
        }
        break;
      case Schritt::REF2:

        if (Taster.pressed(refLift))
        {
          stepLift.setZero(NULLPOSLIFT);  // Referierung im Ablauf, wenn der Lift oben angekommen.
          stepLift.write(0);
          Serial.println("Ref2-Lift erreicht");
          schritt = Schritt::ARM_SCHWENKT_HIN;
        }
        break;

      case Schritt::ARM_SCHWENKT_HIN: // Arm schwenkt zur Bahn
        if (!stepLift.moving()) {
          servoArm.write(0);
          Serial.println("ARM_SCHWENKT_HIN:Arm schwenkt rüber");
          schritt = Schritt::KUGEL_ABSTREIFEN;
        }
        break;

      case Schritt::KUGEL_ABSTREIFEN:  // Lift fährt etwas hoch und streift die Kugel ab.
        if (!servoArm.moving()) {
          stepLift.doSteps(40);
          delay(10000);
          Serial.println("KUGEL_ABSTREIFEN:Kugel wird abgestreift");
          schritt = Schritt::LIFT_ETWAS_RUNTER;
        }
        break;

      case Schritt::LIFT_ETWAS_RUNTER:

        if (!stepLift.moving()) {
          // Lift fährt wieder etwas runter
          stepLift.doSteps(-40);
          Serial.println("Lift fährt ein wenig runter");
          schritt = Schritt::ARM_SCHWENKT_RETOUR;
        }
        break;

      case Schritt::ARM_SCHWENKT_RETOUR:  // Arm geht an die Ausgangsposition
        if (!stepLift.moving()) {
          servoArm.write(60);
          Serial.println("ARM_SCHWENKT_RETOUR:Arm schwenkt zurück");
          schritt = Schritt::LIFT_RUNTER;
          break;
        }
      }
  }
}