Kugelbahn-Maschine

Dies ist die neuste getestete Version, mit angepassten Kommentaren.
So funktioniert das ganze erst mal in der Praxis. Braucht sicher noch ein paar Eingriffe.
Es hat im Moment z.B. 2 Referenzlerungen. Eine, wenn die Maschine an Strom kommt und eine 2. im Betrieb. Die erste müsste evtl. noch in den Setup-Teil.
Die Delays sind z.T. auch noch drinnen.

#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 { 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.write(-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.write(200);   // Wenn Mikroschalter gedrückt ist, den Mikroschalter frei fahren.
        Serial.println("REF_LIFT:Mikroschalter freifahren");
        schritt = Schritt::LIFT_RUNTER;

        break;

      case Schritt::LIFT_RUNTER:
        if (!stepLift.moving()) {
          if (!SchrittmotorAUSMsgPrinted) {
            stepLift.attachEnable(enaPin, 100, HIGH);  // Stepper werden ausgeschaltet.
            Serial.println("SchrittmotorAUS");
            SchrittmotorAUSMsgPrinted = true;
          }
        }
        if (Taster.pressed(sensor)) {
          .  // Wenn Bewegungsmelder aktiviert wird: Stepper an und Lift fährt nach unten.
          SchrittmotorAUSMsgPrinted = false;
          stepLift.attachEnable(enaPin, 100, LOW);
          Serial.println("SchrittmotorAN");
          stepLift.doSteps(2550);
          Serial.println("LIFT_RUNTER:Lift fährt hinunter");
          delay(9000);
          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);
          delay(3000);
          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(2000);
          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);
          delay(4000);
          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);
          delay(4000);
          Serial.println("ARM_SCHWENKT_RETOUR:Arm schwenkt zurück");
          schritt = Schritt::LIFT_RUNTER;
          break;
        }
      }
  }
}