Erstes Projekt mit Arduino

Hallo Zusammen,
Ich habe mein erstes Arduino Projekt zusammen gestellt.
Ich würde darum bitten das jemand der mehr Erfahrung hat als ich kurz drüber schaut ob das Projekt so funktionieren würde ohne das die Platine durchbrennt.

Was soll es machen.

Wen ein Schalter gedrückt wird steuert dieser eine Relais an, an diesem Relais liegen am Wechsler 5V vom Arduino an. Wen das Relais 1 angesteuert wird soll das Programm starten und den Schrittmotor ansteuern und dieser soll dann 20 Grad drehen.

Verbaut hab ich einen 24V Schrittmotor und einen Schrittmotortreiber DM320T der auch mit 24 V läuft.
Das bisherige System läuft mit 24V diese Projekt soll eine Ergänzung zu dem System sein.

Den Code hab ich mir von ChatGPT erstellen lassen.

Danke im voraus

const int stepPin = 8;     // Puls-Pin an DM320T
const int dirPin = 9;      // Richtungspin an DM320T
const int buttonPin = 7;   // Pin für den Taster

const int stepsPerRevolution = 28; // Anzahl der Schritte pro Umdrehung des Motors
const float degreesPerStep = 360.0 / stepsPerRevolution; // Grad pro Schritt
const int stepsFor20Degrees = 20 / degreesPerStep; // Schritte für 20 Grad

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Taster-Pin als Eingang mit internem Pullup-Widerstand
  Serial.begin(9600); // Initialisiere die serielle Kommunikation
}

void loop() {
  // Überprüfen, ob der Taster gedrückt wurde
  if (digitalRead(buttonPin) == LOW) {
    // Drehe den Motor um 20 Grad
    rotateStepper(stepsFor20Degrees);
    
    // Warten, bis der Taster losgelassen wird
    while (digitalRead(buttonPin) == LOW) {
      delay(10); // Kurze Pause, um Taster-Prellen zu verhindern
    }
    
    // Kurze Pause, um wiederholte Aktivierungen zu verhindern
    delay(500);
  }
}

void rotateStepper(int steps) {
  digitalWrite(dirPin, HIGH); // Richtung festlegen (HIGH oder LOW)
  
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000); // Pulsbreite (kann angepasst werden)
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000); // Pause zwischen den Pulsen (kann angepasst werden)
  }
}

Lass vorerst die 24V von deinem Steppertreiber weg, dann sollte nicht viel passieren.

Statte deinen Sketch mit Serial.print ausgaben aus und probier' es aus.

Kannst du den Button sauber auslesen?

P.S.: 2024 kann man sich schon 115200 Baud für die serielle Schnittstelle gönnen.

An Pin7 dürfte ein PullDown fehlen um ein lösen des Relais erkennen zu können.

Man könnte einfacherweise mit GND und internen PullUp arbeiten.

wenn Relay nicht aktiv ist, dann Pin7 liefert alles mögliche an Zuständen.
wenn pinMode(buttonPin, INPUT_PULLUP); aktiviert ist, dann immer HIGH.
um sicher einen LOW zu bekommen muss ein Widerstand zwischen Pin7 und GND (Pulldown).
Am besten aber:
grafik

dann macht pinMode(buttonPin, INPUT_PULLUP); viel mehr Sinn.

const int stepPin = 8;     // Puls-Pin an DM320T
const int dirPin = 9;      // Richtungspin an DM320T
const int buttonPin = 7;   // Pin für den Taster

const int stepsPerRevolution = 28; // Anzahl der Schritte pro Umdrehung des Motors
const float degreesPerStep = 360.0 / stepsPerRevolution; // Grad pro Schritt
const int stepsFor20Degrees = 20 / degreesPerStep; // Schritte für 20 Grad

void setup() {
  pinMode(stepPin, OUTPUT);
  pinMode(dirPin, OUTPUT);
  pinMode(buttonPin, INPUT_PULLUP); // Taster-Pin als Eingang mit internem Pullup-Widerstand
  Serial.begin(115200); // Initialisiere die serielle Kommunikation
  digitalWrite(dirPin, HIGH); // Richtung festlegen (HIGH oder LOW)
}

void loop() {
  static bool isMotorActive = false;
  if (!digitalRead(buttonPin) && !isMotorActive) {  // Überprüfen, ob der Taster gedrückt wurde
    isMotorActive = true;
    rotateStepper(stepsFor20Degrees);    // Drehe den Motor  um ~24 Grad weil es keine Schrittteilung gibt
  }
  if (digitalRead(buttonPin) && isMotorActive)isMotorActive = false;
}

void rotateStepper(int steps) {
  for (int i = 0; i < steps; i++) {
    digitalWrite(stepPin, HIGH);
    delayMicroseconds(1000); // Pulsbreite (kann angepasst werden)
    digitalWrite(stepPin, LOW);
    delayMicroseconds(1000); // Pause zwischen den Pulsen (kann angepasst werden)
  }
}