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;
}
}
}
}