Stepper Motor und WS2812B Led Lassen sich nicht Ansteuern

Hallo Zusammen

Für ein Schulprojekt möchte ich mithilfe eines Spielzeug Mähdreschers 6 Shotgläser befüllen.
(Siehe Video im Anhang)
Dazu verwende ich Folgende Bauteile:

Produkt Beschreibung Menge Artikelnummer Lieferant
Kippschalter 250 V/AC 10 A 1 1304037 Conrad.ch
Draht Widerstand 1.5 Ω, 50 W 1 1525115 Conrad.ch
Drucktaster 250V/AC 5A tastend Grün 1 701312 Conrad.ch
Drucktaster 250V/AC 5A tastend Blau 1 701310 Conrad.ch
Mähdrescher John Deere T670i Grün 1 288072 Galaxus.ch
Shotgläser 0.60 dl 6 6337159 Galaxus.ch
USB-Kabel USB-C zu USB-A 1 623056 Brack.ch
Gras Matte 40 cm x 35 cm 2 1239102 Brack.ch
Relais Modul 1 1138692 Brack.ch
Arduino Uno Rev 3 1 267897 Brack.ch
Treiber Board Single Stepper Control Board 1 420298 Bastelgarge.ch
Schrittmotor Treiber DRV8825 1 420396 Bastelgarge.ch
WS2812b NeoPixel Strip 6 Led 1 420476 Bastelgarge.ch
Schrittmotor 1.7A 0.7Nm 1 421224 Bastelgarge.ch
Wasserpumpe 280-600L/h 6-12V 1 421308 Bastelgarge.ch
Netzteil AC/DC Adapter 12V DC 4A 1 421374 Bastelgarge.ch
Rollenendschalter 7 421472 Bastelgarge.ch
DC Abwärtswandler 7-24V auf 5V 4A DC Step Down 1 421675 Bastelgarge.ch

Ich weis dass einige Bauteile überdimensioniert sind ( z.B 10 Ampere Kippschalter :wink:)

Da ich eine Ausbildung als Automatiker absolviere, zeichnete ich ein Schema und ein Grafcet.
Als ich alles korrekt verdrahtete, leuchteten die Led's nicht. Zudem bewegte sich der Stepper obwohl dieser im Programm angesteuert wurde kein Stücken. Von Hand konnte ich den Stepper jedoch nicht mehr drehen. Zudem teilten mir die Supportmitarbeiter von Bastelgarage mit, dass ich das Controller Board mit meinem DRV 8825 und dem Nema 17 verwenden kann. Da ich alles korrekt verdrahtete, gehe ich davon aus dass mein Programm fehlerhaft ist.

Da ich nicht weis wo mein Fehler liegt bitte ich euch um Hilfe.

Hier Nun mein Code:

//===============================================
// Fügt Bibliotheken hinzu
//===============================================

#include <AccelStepper.h>
#include <Adafruit_NeoPixel.h>

//===============================================
// Definiert Pins für Accel Stepper Libary
//===============================================

#define dirPin 7
#define stepPin 8
#define motorInterfaceType 1

//===============================================
// Definiert LED Pin und Anzahl der LEDs
//===============================================

#define LED_PIN 12
#define NUM_LEDS 6

//===============================================
// Definiert Namen der Pins
//===============================================


#define Arm_Nullpunkt 0
#define Pin_Glas_1 1
#define Pin_Glas_2 2
#define Pin_Glas_3 3
#define Pin_Glas_4 4
#define Pin_Glas_5 5
#define Pin_Glas_6 6
#define Taster_Ausspuelen 9
#define Taster_Start 10
#define Kippschalter 11
#define Pumpe 13

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
//===============================================
// Enum für Statemashine
//===============================================

enum States
{
    Schritt_1,
    Schritt_10,
    Schritt_20,
    Schritt_21,
    Schritt_22,
    Schritt_23,
    Schritt_24,
    Schritt_25,
    Schritt_26,
    Schritt_30,
    Schritt_31,


};

States State = Schritt_1;

//===============================================
// Variable für Zeitverzögerung Kippschalter
//===============================================

int Time_Kschalter_Low = 400;
int Time_Kschalter_High = 800;

//===============================================
// Variable für Zeitverzögerung Kippschalter
//===============================================

int Time_Ausspuelen = 8000;

//===============================================
// Funktion für alle Gläser
//===============================================

void Funktion_Glaeser(int Sensor_Glas, int LedNum)
{
    if (digitalRead(Sensor_Glas) == LOW)
    {
        digitalWrite(Pumpe, HIGH);
        strip.setPixelColor(LedNum, strip.Color(255, 255, 0));
        strip.show();
        if (digitalRead(Kippschalter) == LOW)
        {
            delay(Time_Kschalter_Low);
        }
        else
        {
            delay(Time_Kschalter_High);
        }
        digitalWrite(Pumpe, LOW);
        strip.setPixelColor(LedNum, strip.Color(0, 255, 0));
        stepper.moveTo(-6);
        while (stepper.run())
        {
        }
    }
    else
    {
        stepper.moveTo(-6);
        while (stepper.run())
        {
            // Warten, bis der Schrittmotor seine Position erreicht hat
        }
    }
}

//===============================================
// Funktion für Ausspülen
//===============================================

void Funktion_Ausspuelen()
{

    digitalWrite(Pumpe, HIGH);
    delay(Time_Ausspuelen);
    digitalWrite(Pumpe, LOW);
}

//===============================================
// Funktion für zum Nullpunkt fahren
//===============================================

void Funktion_Nullpunkt()
{
    while ((digitalRead(Arm_Nullpunkt) == HIGH))
    {
        stepper.moveTo(-200);
        stepper.run();
    }
}

//===============================================
// Funktion für zu Startposition fahren
//===============================================

void Funktion_Start()
{
    if (digitalRead(Taster_Start) == LOW)
    {
        stepper.moveTo(50);
        while (stepper.run())
        {
        }
    }
}

//===============================================
// Funktion für alle Leds auf Rot setzen
//===============================================

void Led_Rot()
{
    strip.fill(strip.Color(255, 0, 0));
    strip.show();
}

//===============================================
// Funktion für alle Leds auf Blau setzen
//===============================================

void Led_Blau()
{
    strip.fill(strip.Color(0, 0, 255));
    strip.show();
}
//===============================================
// Funktion anzeige Kippschalter 0 oder 1
//===============================================

void Pinmode_Kippschalter()
{
    if (digitalRead(Kippschalter) == LOW)
        Serial.println("Kippschalter = 1");
}

//===============================================
// Setup
//===============================================

void setup()
{

    //===============================================
    // Definiert Pin 0-6 und 9-11 als Input
    //===============================================

    for (int i = 0; i <= 6; i++)
    {
        pinMode(i, INPUT_PULLUP);
    }

    pinMode(9, INPUT_PULLUP);
    pinMode(10, INPUT_PULLUP);
    pinMode(11, INPUT_PULLUP);

    //===============================================
    // Definiert Pin 7-13 als Output
    //===============================================

    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(12, OUTPUT);
    pinMode(13, OUTPUT);

    //===============================================
    // Definiert maximale Geschwindigkeit
    //===============================================

    stepper.setMaxSpeed(2000);

    //===============================================
    // Definiert Geschwindigkeit des Steppers
    //===============================================

    stepper.setSpeed(750);

    //===============================================
    // Initsialisiert Led Strip
    //===============================================

    strip.begin();
    strip.show();

    //===============================================
    // initsialisiert den Serial Monitor
    // Setzt Baud Rate auf 9600
    //===============================================

    Serial.begin(9600);
}

//===============================================
// Loop
//===============================================

void loop()
{

    //===============================================
    // Init Case states
    //===============================================

    switch (State)
    {

    case Schritt_1:

        Led_Rot();
        Serial.println("Alle Led auf Rot");
        Funktion_Nullpunkt();
        Serial.println("Motor an Nullpunkt");

        if (digitalRead(Taster_Ausspuelen) == LOW)
        {
            Serial.println("Programm geht zu Case Ausspuelen");
            State = Schritt_10;
        }

        if (digitalRead(Taster_Start) == LOW)
        {
            Serial.println("Programm geht zu Case Start");
            State = Schritt_20;
        }

        break;

    case Schritt_31:

        if (digitalRead(Taster_Ausspuelen) == LOW)
        {
            Led_Rot();
            Serial.println("Case init 2");
            Serial.println("Geht zu Case Ausspuelen");
            State = Schritt_10;
        }

        if (digitalRead(Taster_Start) == LOW)
        {
            Led_Rot();
            Serial.println("Case init 2");
            Serial.println("Programm geht zu Case Start");
            State = Schritt_20;
        }

        break;

    case Schritt_20:

        Funktion_Start();
        Serial.println("Start wurde aktiviert");

        State = Schritt_21;
        break;

    case Schritt_10:

        Led_Blau();
        Funktion_Ausspuelen();
        Serial.println("Ausspülen Fertig");
        Serial.println("Led auf Blau");

        State = Schritt_30;
        break;

    case Schritt_21:

        Funktion_Glaeser(Pin_Glas_1, 0);
        Serial.println("Glas 1 Fertig");

        State = Schritt_22;
        break;

    case Schritt_22:

        Funktion_Glaeser(Pin_Glas_2, 1);
        Serial.println("Glas 2 Fertig");

        State = Schritt_23;
        break;

    case Schritt_23:

        Funktion_Glaeser(Pin_Glas_3, 2);
        Serial.println("Glas 3 Fertig");

        State = Schritt_24;
        break;

    case Schritt_24:

        Funktion_Glaeser(Pin_Glas_4, 3);
        Serial.println("Glas 4 Fertig");

        State = Schritt_25;
        break;

    case Schritt_25:

        Funktion_Glaeser(Pin_Glas_5, 4);
        Serial.println("Glas 5 Fertig");

        State = Schritt_26;
        break;

    case Schritt_26:

        Funktion_Glaeser(Pin_Glas_6, 5);
        Serial.println("Glas 6 Fertig");

        State = Schritt_30;
        break;

    case Schritt_30:

        Funktion_Nullpunkt();
        Serial.println("Motor an Nullpunkt (Parkposition)");

        State = Schritt_31;
        break;

    default:

        Serial.println("Case defaul");
        break;
    }
}

Anhänge:
Schema
Funktionsbeschrieb zu Grafcet Schritten
Funktionsvideo Shotdrescher

Da ich ein neuer User bin kann ich keine Dateien direkt hier im Post hochladen. :pensive:
Deshalb hier der Link zum Dropbox Ordner

You posted in the English section of the forum. I will move your topic to the appropriate section.

Woher weist Du das? Hast Du deine HW mit einem einfachen Testprogramm getestet ( z.B. für den Stepper )? Auf deinem 'Schaltbild' kann man z.B. die komplette Verdrahtung des DRV8825 nicht erkennen.

Die Verdrahtung lies ich von 2 Mitarbeitern überprüfen.
In meinem Schema habe ich bewusst die komplette Verdrahtung des DRV8825 weggelassen, da ich das Controller Board (Bastelgarge.ch Artikelnr. 420298) bereits bestückt geliefert wird.
Bild des Controller Boards:


Verdrahtung des Controllerboards laut Bastelgarge.ch:

Falls du weitere Informationen benötigst, stehe ich dir gerne zur Verfügung.

Hast Du den Stepper mit einem ganz einfachen Sketch getestet ( nur Step-pin toggeln )?

Ja habe ich. Er vibriert etwas stark läuft aber sonst normal.

Dann hast Du wahrscheinlich keine Microsteps eingestellt?

N.B. hast Du den Strom für den Stepper am DRV8825 korrekt eingestellt?

Nein ich habe Full-Steps eingestellt.
Welche Schrittauflösung würdest du mir empfehlen, um Vibrationen zu vermeiden?
Den DRV8825 stellte ich auf 0.85 Volt ein. Sollte meiner Meinung nach korrekt sein.

Naja, je mehr Microsteps desto ruhiger der Lauf. Nachteil von Microsteps ist, dass der Motor langsamer läuft, und man die Schrittfrequenz erhöhen muss um das auszugleichen Außerdem sind die Microschrittpositionen nicht so exakt. Da musst Du sehen, was für dich den besten Kompromiss ergibt.
Aber dein generelles Problem dürfte damit nicht zusammenhängen.
Was den Sketch etwas schwer les- und testbar macht, ist dass Du die verwendeten Zuordnungen Name<->Pin nicht durchgängig im Sketch nutzt, und da doch wieder die 'magic numbers' nutzt. Und für die States nicht Namen verwendest, die die Funktion auch beschreiben. Einfach Durchnumerieren ist immer eine schlechte Idee.
Werden denn die entsprechenden Texte auf dem Monitor ausgegeben, oder tut sich da auch nichts?

P.S. ich sehe gerade, dass Du die Pins 0 und 1 nutzt:

#define Arm_Nullpunkt 0
#define Pin_Glas_1 1

Das solltest Du auf keinen Fall machen, da an diesen Pins die serielle Schnittstelle hängt, die für die Kommunikation zum seriellen Monitor genutzt wird.

Vielen Dank für die Auskunft bezüglich der Schrittauflösung.

Nun sollten kein magic numbers mehr vorhanden sein. :wink:
Siehe Code zuunterst

Da ich die Programmierung mit Grafcet machte, fand ich es sinnvoll die Schrittnummer zu verwenden. Das Grafcet passe ich gerade nochmals an, damit es für Andere besser lesbar ist.

Auf dem Monitor hat sich nichts getan.

Aha das wusste ich nicht. Ich habe den Code nun angepasst. Für die 2 Taster und den Kippschalter verwende ich nun die Analog Pins A0, A1 und A2. Hoffe das funktioniert so wie ich es programmiert habe. :thinking:
Das Schema werde ich auch noch Anpassen.
Hier nun der Code:

//===============================================
// Fügt Bibliotheken hinzu
//===============================================

#include <AccelStepper.h>
#include <Adafruit_NeoPixel.h>

//===============================================
// Definiert Pins für Accel Stepper Libary
//===============================================

#define dirPin 9
#define stepPin 10
#define motorInterfaceType 1

//===============================================
// Definiert LED Pin und Anzahl der LEDs
//===============================================

#define LED_PIN 11
#define NUM_LEDS 6

//===============================================
// Definiert Namen der Pins
//===============================================

#define Arm_Nullpunkt 2
#define Pin_Glas_1    3
#define Pin_Glas_2    4
#define Pin_Glas_3    5
#define Pin_Glas_4    6
#define Pin_Glas_5    7
#define Pin_Glas_6    8
#define Pumpe         12
#define Taster_Ausspuelen A0
#define Taster_Start      A1
#define Kippschalter      A2

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
//===============================================
// Enum für Statemashine
//===============================================

enum States
{
    Schritt_1,
    Schritt_10,
    Schritt_20,
    Schritt_21,
    Schritt_22,
    Schritt_23,
    Schritt_24,
    Schritt_25,
    Schritt_26,
    Schritt_30,
    Schritt_31,


};

States State = Schritt_1;

//===============================================
// Variable für Zeitverzögerung Kippschalter
//===============================================

int Time_Kschalter_Low = 400;
int Time_Kschalter_High = 800;

//===============================================
// Variable für Zeitverzögerung Kippschalter
//===============================================

int Time_Ausspuelen = 8000;

//===============================================
// Funktion für alle Gläser
//===============================================

void Funktion_Glaeser(int Sensor_Glas, int LedNum)
{
    if (digitalRead(Sensor_Glas) == LOW)
    {
        digitalWrite(Pumpe, HIGH);
        strip.setPixelColor(LedNum, strip.Color(255, 255, 0));
        strip.show();
        if (digitalRead(Kippschalter) == LOW)
        {
            delay(Time_Kschalter_Low);
        }
        else
        {
            delay(Time_Kschalter_High);
        }
        digitalWrite(Pumpe, LOW);
        strip.setPixelColor(LedNum, strip.Color(0, 255, 0));
        stepper.moveTo(-6);
        while (stepper.run())
        {
        }
    }
    else
    {
        stepper.moveTo(-6);
        while (stepper.run())
        {
            // Warten, bis der Schrittmotor seine Position erreicht hat
        }
    }
}

//===============================================
// Funktion für Ausspülen
//===============================================

void Funktion_Ausspuelen()
{

    digitalWrite(Pumpe, HIGH);
    delay(Time_Ausspuelen);
    digitalWrite(Pumpe, LOW);
}

//===============================================
// Funktion für zum Nullpunkt fahren
//===============================================

void Funktion_Nullpunkt()
{
    while ((digitalRead(Arm_Nullpunkt) == HIGH))
    {
        stepper.moveTo(-200);
        stepper.run();
    }
}

//===============================================
// Funktion für zu Startposition fahren
//===============================================

void Funktion_Start()
{
    if (digitalRead(Taster_Start) == LOW)
    {
        stepper.moveTo(50);
        while (stepper.run())
        {
        }
    }
}

//===============================================
// Funktion für alle Leds auf Rot setzen
//===============================================

void Led_Rot()
{
    strip.fill(strip.Color(255, 0, 0));
    strip.show();
}

//===============================================
// Funktion für alle Leds auf Blau setzen
//===============================================

void Led_Blau()
{
    strip.fill(strip.Color(0, 0, 255));
    strip.show();
}
//===============================================
// Funktion anzeige Kippschalter 0 oder 1
//===============================================

void Pinmode_Kippschalter()
{
    if (digitalRead(Kippschalter) == LOW)
        Serial.println("Kippschalter = 1");
}

//===============================================
// Setup
//===============================================

void setup()
{

    //===============================================
    // Definiert Pins als Input
    //===============================================

    pinMode(Taster_Ausspuelen, INPUT_PULLUP);
    pinMode(Taster_Start, INPUT_PULLUP);
    pinMode(Kippschalter, INPUT_PULLUP);
    pinMode(Arm_Nullpunkt, INPUT_PULLUP);
    pinMode(Pin_Glas_1, INPUT_PULLUP);
    pinMode(Pin_Glas_2, INPUT_PULLUP);
    pinMode(Pin_Glas_3, INPUT_PULLUP);
    pinMode(Pin_Glas_4, INPUT_PULLUP);
    pinMode(Pin_Glas_5, INPUT_PULLUP);
    pinMode(Pin_Glas_6, INPUT_PULLUP);
    
    //===============================================
    // Definiert Pin 7-13 als Output
    //===============================================

    pinMode(dirPin, OUTPUT);
    pinMode(stepPin, OUTPUT);
    pinMode(LED_PIN, OUTPUT);
    pinMode(Pumpe, OUTPUT);

    //===============================================
    // Definiert maximale Geschwindigkeit
    //===============================================

    stepper.setMaxSpeed(2000);

    //===============================================
    // Definiert Geschwindigkeit des Steppers
    //===============================================

    stepper.setSpeed(750);

    //===============================================
    // Initsialisiert Led Strip
    //===============================================

    strip.begin();
    strip.show();

    //===============================================
    // initsialisiert den Serial Monitor
    // Setzt Baud Rate auf 9600
    //===============================================

    Serial.begin(9600);
}

//===============================================
// Loop
//===============================================

void loop()
{

    //===============================================
    // Init Case states
    //===============================================

    switch (State)
    {

    case Schritt_1:

        Led_Rot();
        Serial.println("Alle Led auf Rot");
        Funktion_Nullpunkt();
        Serial.println("Motor an Nullpunkt");

        if (digitalRead(Taster_Ausspuelen) == LOW)
        {
            Serial.println("Programm geht zu Case Ausspuelen");
            State = Schritt_10;
        }

        if (digitalRead(Taster_Start) == LOW)
        {
            Serial.println("Programm geht zu Case Start");
            State = Schritt_20;
        }

        break;

    case Schritt_31:

        if (digitalRead(Taster_Ausspuelen) == LOW)
        {
            Led_Rot();
            Serial.println("Case init 2");
            Serial.println("Geht zu Case Ausspuelen");
            State = Schritt_10;
        }

        if (digitalRead(Taster_Start) == LOW)
        {
            Led_Rot();
            Serial.println("Case init 2");
            Serial.println("Programm geht zu Case Start");
            State = Schritt_20;
        }

        break;

    case Schritt_20:

        Funktion_Start();
        Serial.println("Start wurde aktiviert");

        State = Schritt_21;
        break;

    case Schritt_10:

        Led_Blau();
        Serial.println("Led auf Blau");
        Funktion_Ausspuelen();
        Serial.println("Ausspülen Fertig");
        
        State = Schritt_30;
        break;

    case Schritt_21:

        Funktion_Glaeser(Pin_Glas_1, 0);
        Serial.println("Glas 1 Fertig");

        State = Schritt_22;
        break;

    case Schritt_22:

        Funktion_Glaeser(Pin_Glas_2, 1);
        Serial.println("Glas 2 Fertig");

        State = Schritt_23;
        break;

    case Schritt_23:

        Funktion_Glaeser(Pin_Glas_3, 2);
        Serial.println("Glas 3 Fertig");

        State = Schritt_24;
        break;

    case Schritt_24:

        Funktion_Glaeser(Pin_Glas_4, 3);
        Serial.println("Glas 4 Fertig");

        State = Schritt_25;
        break;

    case Schritt_25:

        Funktion_Glaeser(Pin_Glas_5, 4);
        Serial.println("Glas 5 Fertig");

        State = Schritt_26;
        break;

    case Schritt_26:

        Funktion_Glaeser(Pin_Glas_6, 5);
        Serial.println("Glas 6 Fertig");

        State = Schritt_30;
        break;

    case Schritt_30:

        Funktion_Nullpunkt();
        Serial.println("Motor an Nullpunkt (Parkposition)");

        State = Schritt_31;
        break;

    default:

        Serial.println("Case defaul");
        break;
    }
}

Und?

Ich habe deine Pins mal auf meine HW angepasst. Ok, die stimmt nicht ganz, und eine LED Strip ist auch nicht dran. Aber Ausgaben auf dem Monitor kommen, und der Motor bewegt sich auch. Ob der sich so bewegt wie er soll kann ich natürlich nicht sehen.

Zumindest die beiden Punkte kann ich nicht nachvollziehen.

Kann ich leider noch nicht sagen, da ich erst ab nächstem Mittwoch daran weiterarbeiten kann. :pensive:
Ich werde das Ergebnis jedoch sicher hier im Forum kommunizieren...

Super werde es am Mittwoch überprüfen.

Hallo Zusammen,

Ich habe mein Schema überarbeitet. Hoffentlich ist dieses fehlerfrei. :thinking: Könntet ihr das bitte überprüfen? :pleading_face:(Siehe Schema Shot Drescher d3.pdf im Dropbox-Ordner).
Der Link zum Ordner ist hier.
Bitte beachtet, dass die Funktionsbeschreibung nur zum Schema Shot Drescher d2.pdf passt.

Den Code habe ich bereits an das neue Schema angepasst. Morgen sollte der Arduino Uno R4 Wifi ankommen...

Arduino-Code:

//===============================================
// Fügt Bibliotheken hinzu
//===============================================

#include <AccelStepper.h>
#include <Adafruit_NeoPixel.h>

//===============================================
// Definiert Pins für Accel Stepper Libary
//===============================================

#define dirPin 9
#define stepPin 10
#define motorInterfaceType 1

//===============================================
// Definiert LED Pin und Anzahl der LEDs
//===============================================

#define LED_PIN 11
#define NUM_LEDS 6

//===============================================
// Definiert Namen der Pins
//===============================================

#define Arm_Nullpunkt    2
#define Sensor_Glas_1    3
#define Sensor_Glas_2    4
#define Sensor_Glas_3    5
#define Sensor_Glas_4    6
#define Sensor_Glas_5    7
#define Sensor_Glas_6    8
#define Pumpe            12
#define Taster_Ausspuelen A0
#define Taster_Start      A1
#define Kippschalter      A2

Adafruit_NeoPixel strip = Adafruit_NeoPixel(NUM_LEDS, LED_PIN, NEO_GRB + NEO_KHZ800);
AccelStepper stepper = AccelStepper(motorInterfaceType, stepPin, dirPin);
//===============================================
// Enum für Statemashine
//===============================================

enum States
{
    Schritt_1,
    Schritt_10,
    Schritt_20,
    Schritt_21,
    Schritt_25,
    Schritt_29,
    Schritt_33,
    Schritt_38,
    Schritt_42,
    Schritt_50,
    Schritt_52,


};

States State = Schritt_1;

//===============================================
// Variable für Zeitverzögerung Kippschalter
//===============================================

int Time_Kschalter_Low = 400;
int Time_Kschalter_High = 800;

//===============================================
// Variable für Zeitverzögerung Kippschalter
//===============================================

int Time_Ausspuelen = 8000;

//===============================================
// Funktion für alle Gläser
//===============================================

void Funktion_Glaeser(int Sensor_Glas, int LedNum)
{
    if (digitalRead(Sensor_Glas) == LOW)
    {
        digitalWrite(Pumpe, HIGH);
        strip.setPixelColor(LedNum, strip.Color(255, 255, 0));
        strip.show();
        if (digitalRead(Kippschalter) == LOW)
        {
            delay(Time_Kschalter_Low);
        }
        else
        {
            delay(Time_Kschalter_High);
        }
        digitalWrite(Pumpe, LOW);
        strip.setPixelColor(LedNum, strip.Color(0, 255, 0));
        stepper.moveTo(-6);
        while (stepper.run())
        {
        }
    }
    else
    {
        stepper.moveTo(-6);
        while (stepper.run())
        {
            // Warten, bis der Schrittmotor seine Position erreicht hat
        }
    }
}

//===============================================
// Funktion für Ausspülen
//===============================================

void Funktion_Ausspuelen()
{

    digitalWrite(Pumpe, HIGH);
    delay(Time_Ausspuelen);
    digitalWrite(Pumpe, LOW);
}

//===============================================
// Funktion für zum Nullpunkt fahren
//===============================================

void Funktion_Nullpunkt()
{
    while ((digitalRead(Arm_Nullpunkt) == HIGH))
    {
        stepper.moveTo(-200);
        stepper.run();
    }
}

//===============================================
// Funktion für zu Startposition fahren
//===============================================

void Funktion_Start()
{
    if (digitalRead(Taster_Start) == LOW)
    {
        stepper.moveTo(50);
        while (stepper.run())
        {
        }
    }
}

//===============================================
// Funktion für alle Leds auf Rot setzen
//===============================================

void Led_Rot()
{
    strip.fill(strip.Color(255, 0, 0));
    strip.show();
}

//===============================================
// Funktion für alle Leds auf Blau setzen
//===============================================

void Led_Blau()
{
    strip.fill(strip.Color(0, 0, 255));
    strip.show();
}
//===============================================
// Funktion anzeige Kippschalter 0 oder 1
//===============================================

void Pinmode_Kippschalter()
{
    if (digitalRead(Kippschalter) == LOW)
        Serial.println("Kippschalter = 1");
}

//===============================================
// Setup
//===============================================

void setup()
{

    //===============================================
    // Definiert Pins als Input
    //===============================================

    pinMode(Taster_Ausspuelen, INPUT_PULLUP);
    pinMode(Taster_Start, INPUT_PULLUP);
    pinMode(Kippschalter, INPUT_PULLUP);
    pinMode(Arm_Nullpunkt, INPUT_PULLUP);
    pinMode(Sensor_Glas_1, INPUT_PULLUP);
    pinMode(Sensor_Glas_2, INPUT_PULLUP);
    pinMode(Sensor_Glas_3, INPUT_PULLUP);
    pinMode(Sensor_Glas_4, INPUT_PULLUP);
    pinMode(Sensor_Glas_5, INPUT_PULLUP);
    pinMode(Sensor_Glas_6, INPUT_PULLUP);
    
    //===============================================
    // Definiert Pin 7-13 als Output
    //===============================================

    pinMode(dirPin, OUTPUT);
    pinMode(stepPin, OUTPUT);
    pinMode(LED_PIN, OUTPUT);
    pinMode(Pumpe, OUTPUT);

    //===============================================
    // Definiert maximale Geschwindigkeit
    //===============================================

    stepper.setMaxSpeed(2000);

    //===============================================
    // Definiert Geschwindigkeit des Steppers
    //===============================================

    stepper.setSpeed(750);

    //===============================================
    // Initsialisiert Led Strip
    //===============================================

    strip.begin();
    strip.show();

    //===============================================
    // initsialisiert den Serial Monitor
    // Setzt Baud Rate auf 9600
    //===============================================

    Serial.begin(9600);
}

//===============================================
// Loop
//===============================================

void loop()
{

    //===============================================
    // Init Case states
    //===============================================

    switch (State)
    {

    case Schritt_1:

        Led_Rot();
        Serial.println("Alle Led auf Rot");
        Funktion_Nullpunkt();
        Serial.println("Motor an Nullpunkt");

        if (digitalRead(Taster_Ausspuelen) == LOW)
        {
            Serial.println("Programm geht zu Case Ausspuelen");
            State = Schritt_10;
        }

        if (digitalRead(Taster_Start) == LOW)
        {
            Serial.println("Programm geht zu Case Start");
            State = Schritt_20;
        }

        break;

    case Schritt_52:

        if (digitalRead(Taster_Ausspuelen) == LOW)
        {
            Led_Rot();
            Serial.println("Case init 2");
            Serial.println("Geht zu Case Ausspuelen");
            State = Schritt_10;
        }

        if (digitalRead(Taster_Start) == LOW)
        {
            Led_Rot();
            Serial.println("Case init 2");
            Serial.println("Programm geht zu Case Start");
            State = Schritt_20;
        }

        break;

    case Schritt_20:

        Funktion_Start();
        Serial.println("Start wurde aktiviert");

        State = Schritt_21;
        break;

    case Schritt_10:

        Led_Blau();
        Serial.println("Led auf Blau");
        Funktion_Ausspuelen();
        Serial.println("Ausspülen Fertig");
        
        State = Schritt_50;
        break;

    case Schritt_21:

        Funktion_Glaeser(Sensor_Glas_1, 0);
        Serial.println("Glas 1 Fertig");

        State = Schritt_25;
        break;

    case Schritt_25:

        Funktion_Glaeser(Sensor_Glas_2, 1);
        Serial.println("Glas 2 Fertig");

        State = Schritt_29;
        break;

    case Schritt_29:

        Funktion_Glaeser(Sensor_Glas_3, 2);
        Serial.println("Glas 3 Fertig");

        State = Schritt_33;
        break;

    case Schritt_33:

        Funktion_Glaeser(Sensor_Glas_4, 3);
        Serial.println("Glas 4 Fertig");

        State = Schritt_38;
        break;

    case Schritt_38:

        Funktion_Glaeser(Sensor_Glas_5, 4);
        Serial.println("Glas 5 Fertig");

        State = Schritt_42;
        break;

    case Schritt_42:

        Funktion_Glaeser(Sensor_Glas_6, 5);
        Serial.println("Glas 6 Fertig");

        State = Schritt_50;
        break;

    case Schritt_50:

        Funktion_Nullpunkt();
        Serial.println("Motor an Nullpunkt (Parkposition)");

        State = Schritt_52;
        break;

    default:

        Serial.println("Case defaul");
        break;
    }
}

Warum willst du wechseln? Das ist ein Multi Prozessorsystem und alles andere wie Anfänger geeignet.

Mach doch mal dem Schaltplan auf eine Seite. Oben + unten GND, Links Eingänge, rechts Ausgänge. Um deinen Schaltplan zu prüfen, braucht man Stunden. Statt 2 Minuten wenn es auf einer Seite ist. Einen Fehler gibt es schon: 1000µ am LEDStripe fehlen.

Warum schreibst du nicht hin, was der Schritt macht? Also WartenAufGlas, Fuellen usw.

Schema Shot Drescher d4.pdf (36,5 KB)
Hier das Schema auf einer Seite.
Nach meiner Recherche dient der Kondensator nur zur Spannungsstabilisierung.
Deshalb habe ich ihn wegelassen. Sollte auch ohne gehen oder ?

Da ich das Programm mit Grafcet Programmierte fand ich es angenehmer die States gerade nach den Schritten zu benennen.

Ich habe mich für diesen Arduino aus verschiedenen Gründen entschieden:

  1. Auf der Website hiess es, das dieses Board für Anfänger und Fortgeschrittene geeignet ist.
  2. Mir kam die Idee den Shot Drescher über die Arduino Cloud zu steuern. Dieses Projekt werde ich aber erst in Angriff nehmen, wen alles wie geplant Funktioniert.

Wieso ist das Board nicht für Anfänger geeignet?
Muss bei der Programmierung etwas speziell beachtet werden?


Relais direkt an µC geht nicht. Treiber notwendig

Warum 12 an Vin? Du hast doch 5V zur Verfügung.

Kann oder kann nicht. Teste es aus.