Hallo Liebes Forum
Ich bin neu hier und hoffe Ihr könnt mir vielleicht einen Tipp geben, wie ich mein Arduino Projekt fertigstellen kann.
Hier ein paar kurze Infos zum Projekt:
Ich möchte einen automatischen Spulenwickler bauen. Ich benutze einen Arduino Uno und ein Motorshield mit 4 Anschlüsssen, um zwei Motoren zu steuern. Einmal einen 9v DC Motor, der über Anschluss M3 des Motor Shields angesteuert wird und dann noch einen 9v Steppemotor, der mit anschluss M1 und M2 des Motor Shields verbunden ist.
Dieser Steppermotor treibt eine kleine Traverse an. Im void setup home ich die Stepper-traverse mit Hilfe einer z-limit switch von meinem Ender 3. Nachdem die Traverse erfolgreich die home position erreicht hat, startet der DC-Motor und der Code geht in den void loop über.
Im void loop möchte ich zwei dinge machen: zum einen möchte ich die Traverse ausgehend vom Nullpunkt nach links und rechts bewegen. Zum anderen möchte ich mit Hilfe eines Reed Kontaktes die Umdrehungen des Motors zählen, sodass dc motor und stepper motor automatisch abgeschaltet werden, sobald eine bestimmte maximale Umdrehungszahl erreicht ist. Hier liegt mein Problem!
Ich möchte, dass mir der serielle monitor aller 3 millisekunden den wert des reed kontaktes ausgibt und gleichzeitig die traverse bewegt. Jedoch scheint dies nicht möglich zu sein. Entweder liest der serielle monitor den reed wert zwar korrekt, aber der code bleibt im ersten loop stecken.
Oder aber der stepper bewegt sich genau so wie gewollt, aber ich kriege nur einmal pro loop einen wert für den reed pin ausgegeben, was dazu führt, dass die umdrehungen nicht korrekt gezählt weren. Alles andere funktioniert bereits perfekt!
KANN MIR BITTE BITTE IRGENDJEMAND HELFEN???
Hier ist mein code:
#include <AccelStepper.h>
#include <AFMotor.h>
#define LIMIT_SWITCH_PIN 2
#define HOMING_SPEED -150 // Geschwindigkeit für die Rückwärtsbewegung beim Homing
#define STEPS_PER_MM 80 // 80 Schritte pro Millimeter
#define HOMING_DISTANCE_MM -20.0 // Distanz in mm, die sich die Traverse vom Limit Switch zurück bewegen soll
#define TRAVERSE_LOOP_DISTANCE_MM 10.0 // Traverse Loop Distanz in mm
#define DC_MOTOR_SPEED_PERCENT 100 // Geschwindigkeit des DC Motors in Prozent
#define TRAVERSE_SPEED_MM_PER_S 10 // Geschwindigkeit der Traverse in mm/s
AF_Stepper motor1(200, 1);
AF_Stepper motor2(200, 2);
AF_DCMotor motor(3); // Initialisiere das Motor Shield
const int reedPin = A0; // Definiere den Pin für den Reed-Kontakt
int rotationCount = 0; // Zähler für die Umdrehungen
const int targetRotationCount = 100; // Zielanzahl von Umdrehungen
int previousReedState = LOW; // Vorheriger Reed-Zustand
unsigned long previousTime = 0; // Vorherige Zeit für die Reed-Zustandsüberprüfung
void forwardstep1() {
motor1.onestep(FORWARD, INTERLEAVE);
}
void backwardstep1() {
motor1.onestep(BACKWARD, INTERLEAVE);
}
void forwardstep2() {
motor2.onestep(FORWARD, INTERLEAVE);
}
void backwardstep2() {
motor2.onestep(BACKWARD, INTERLEAVE);
}
AccelStepper stepper1(forwardstep1, backwardstep1);
void setup() {
pinMode(LIMIT_SWITCH_PIN, INPUT_PULLUP); // Konfiguriere den Limit-Switch als INPUT mit Pull-Up-Widerstand
stepper1.setMaxSpeed(200.0);
stepper1.setAcceleration(100.0);
// Starte die Homing-Funktion
while (digitalRead(LIMIT_SWITCH_PIN) != LOW) {
stepper1.setSpeed(HOMING_SPEED);
stepper1.runSpeed();
}
// Berechne die Anzahl der Schritte basierend auf der angegebenen Distanz
float homing_steps = HOMING_DISTANCE_MM * STEPS_PER_MM;
// Bewege die Traverse in die entgegengesetzte Richtung um die angegebene Distanz
stepper1.setSpeed(HOMING_SPEED);
stepper1.move(-homing_steps); // Negatives Vorzeichen für die entgegengesetzte Richtung
while (stepper1.distanceToGo() != 0) {
stepper1.run();
}
stepper1.setCurrentPosition(0);
// Warte 5 Sekunden
delay(5000);
Serial.begin(9600);
// Starte den Motor auf Stufe 200/255
motor.setSpeed(map(DC_MOTOR_SPEED_PERCENT, 0, 100, 0, 255));
motor.run(BACKWARD);
}
//////////////////////////////////////////////////////////////////////////////////////////////////////
void loop() {
unsigned long currentTime = millis(); // Aktuelle Zeit in Millisekunden
// Setze Geschwindigkeit und Beschleunigung für die Bewegung
stepper1.setMaxSpeed(TRAVERSE_SPEED_MM_PER_S * STEPS_PER_MM);
stepper1.setAcceleration(100000.0);
// Berechne die Anzahl der Schritte basierend auf der Traverse Loop Distance
float traverse_loop_steps = TRAVERSE_LOOP_DISTANCE_MM * STEPS_PER_MM;
// Bewegung vorwärts um die angegebene Distanz
stepper1.moveTo(traverse_loop_steps);
stepper1.runToPosition();
// Bewegung rückwärts um die gleiche Distanz zur Ausgangsposition (Punkt 0)
stepper1.moveTo(0);
stepper1.runToPosition();
// Überprüfe den Reed-Zustand alle 3 Millisekunden
if (currentTime - previousTime >= 3) {
previousTime = currentTime; // Aktualisiere die Zeit für die nächste Überprüfung
// Lese den Zustand des Reed-Kontakts
int reedState = digitalRead(reedPin);
// Gib den Zustand des Reed-Kontakts im seriellen Monitor aus
Serial.print("Reed-Zustand: ");
Serial.println(reedState);
// Überprüfe, ob der Reed-Zustand von 0 auf 1 gewechselt hat (steigende Flanke)
if (reedState == HIGH && previousReedState == LOW) {
rotationCount++; // Erhöhe den Zähler für die Umdrehungen
Serial.print("Umdrehung ");
Serial.println(rotationCount);
// Überprüfe, ob die Zielanzahl an Umdrehungen erreicht wurde
if (rotationCount >= targetRotationCount) {
// Stoppe den DC-Motor
motor.run(RELEASE);
Serial.println("DC-Motor gestoppt");
// Stoppe den Schrittmotor
stepper1.stop();
Serial.println("Schrittmotor gestoppt");
}
}
// Speichere den aktuellen Reed-Zustand für den nächsten Durchlauf
previousReedState = reedState;
}
}
////////////////////////////////////////////////////////////////////////////////////////////////////////////////
