hello, my stepper wont turn faster, making that noise. i dont know why, other steppers have the same problem.
i try to run a stepper test code and it doesnt change anything. i use 1/16 step cause with full or half the stepper move realy slow. maybe the pros could help me cause i am a arduino beginner (noob;) )
here is a video of my problem please copy the link cause somehow the video doesnt work.
#include <SoftwareSerial.h>
#include <LiquidCrystal_I2C.h>
#include <AccelStepper.h>
// Definition der Pins für SoftwareSerial
const int rxPin = 10; // RX Pin des Arduino
const int txPin = 11; // TX Pin des Arduino
// Definition der Pins für Taster
const int increment10Pin = 2; // Taster für 10-Grain-Schritte
const int increment1Pin = 3; // Taster für 1-Grain-Schritte
const int increment0_1Pin = 4; // Taster für 0,1-Grain-Schritte
const int increment0_01Pin = 5; // Taster für 0,01-Grain-Schritte
const int startButtonPin = 6; // Startknopf
// Definition der Pins für Schrittmotoren (mit Stepper-Driver-Board)
const int stepper1EnablePin = 7; // Enable Pin für Stepper 1
const int stepper1DirPin = 8; // Direction Pin für Stepper 1
const int stepper1StepPin = 9; // Step Pin für Stepper 1
const int stepper2EnablePin = 12; // Enable Pin für Stepper 2
const int stepper2DirPin = 13; // Direction Pin für Stepper 2
const int stepper2StepPin = 14; // Step Pin für Stepper 2
// SoftwareSerial Objekt
SoftwareSerial mySerial(rxPin, txPin);
// LCD Display initialisieren (Adresse 0x27, 16 Zeichen, 2 Zeilen)
LiquidCrystal_I2C lcd(0x27, 16, 2);
// Schrittmotoren initialisieren (mit Stepper-Driver-Board)
AccelStepper stepper1(AccelStepper::DRIVER, stepper1StepPin, stepper1DirPin);
AccelStepper stepper2(AccelStepper::DRIVER, stepper2StepPin, stepper2DirPin);
// Variablen für das Zielgewicht
float targetWeight = 0.0;
float currentWeight = 0.0;
const float maxWeight = 100.0; // Maximalgewicht in Grain
// Timing
unsigned long previousMillis = 0;
unsigned long weightUpdateInterval = 100; // Zeitintervall für Gewichtsanfrage (in ms)
unsigned long correctionDelay = 600; // Korrekturzeit (in ms)
// Statusvariablen
bool running = false;
bool targetAchieved = false; // Statusvariable, ob das Zielgewicht erreicht wurde
bool weightStabilized = false;
bool correctionActive = false;
unsigned long startTime = 0;
// Befehle
const byte requestWeightCommand[] = {0x1B, 0x70}; // [ESC] + [p]
void setup() {
// Serielle Schnittstelle für PC und Waage
Serial.begin(9600);
mySerial.begin(9600);
// LCD Display starten
lcd.init();
lcd.backlight();
// Pinmodi für Taster
pinMode(increment10Pin, INPUT_PULLUP);
pinMode(increment1Pin, INPUT_PULLUP);
pinMode(increment0_1Pin, INPUT_PULLUP);
pinMode(increment0_01Pin, INPUT_PULLUP);
pinMode(startButtonPin, INPUT_PULLUP);
// Schrittmotoren initialisieren
pinMode(stepper1EnablePin, OUTPUT);
pinMode(stepper2EnablePin, OUTPUT);
digitalWrite(stepper1EnablePin, LOW); // Stepper 1 aktivieren
digitalWrite(stepper2EnablePin, LOW); // Stepper 2 aktivieren
stepper1.setMaxSpeed(10000); // Doppelte Maximalgeschwindigkeit
stepper1.setAcceleration(1000); // Doppelte Beschleunigung
stepper2.setMaxSpeed(10000); // Doppelte Maximalgeschwindigkeit
stepper2.setAcceleration(1000); // Doppelte Beschleunigung
// Startmeldung
Serial.println("System bereit. Bitte Startknopf drücken.");
lcd.setCursor(0, 0);
lcd.print("System bereit");
}
void loop() {
unsigned long currentMillis = millis();
// Taster abfragen und Zielgewicht einstellen
if (digitalRead(increment10Pin) == LOW) {
targetWeight += 10.0;
delay(200); // Entprellung
}
if (digitalRead(increment1Pin) == LOW) {
targetWeight += 1.0;
delay(200); // Entprellung
}
if (digitalRead(increment0_1Pin) == LOW) {
targetWeight += 0.1;
delay(200); // Entprellung
}
if (digitalRead(increment0_01Pin) == LOW) {
targetWeight += 0.01;
delay(200); // Entprellung
}
// Zielgewicht auf dem Display anzeigen
lcd.setCursor(0, 0);
lcd.print("Ziel: ");
lcd.print(targetWeight, 2);
lcd.print(" grain");
// Startknopf abfragen
if (digitalRead(startButtonPin) == LOW && !running) {
running = true;
targetAchieved = false;
weightStabilized = false;
correctionActive = false;
startTime = currentMillis;
Serial.println("Startknopf gedrückt, System startet.");
lcd.setCursor(0, 1);
lcd.print("Starten...");
// Waage nullen und 0,3 Sekunden warten
mySerial.write(0x1B); // ESC
mySerial.write(0x74); // t (TARE)
unsigned long tareStart = millis();
while (millis() - tareStart < 300) {
// Wartezeit ohne delay
}
}
// Gewicht abfragen
if (running && currentMillis - previousMillis >= weightUpdateInterval) {
previousMillis = currentMillis;
// Gewichtsanfrage an die Waage
mySerial.write(requestWeightCommand, sizeof(requestWeightCommand));
// Gewichtsdaten lesen
if (mySerial.available()) {
char buffer[20];
int index = 0;
while (mySerial.available()) {
char incomingByte = mySerial.read();
if (incomingByte == '\n') {
buffer[index] = '\0';
break;
} else {
buffer[index++] = incomingByte;
}
}
currentWeight = atof(buffer); // Gewicht als float konvertieren
// Aktuelles Gewicht auf dem Display anzeigen
lcd.setCursor(0, 1);
lcd.print("Gewicht: ");
lcd.print(currentWeight, 2);
lcd.print(" grain");
// Überprüfen, ob das Zielgewicht erreicht wurde
if (currentWeight >= targetWeight) {
targetAchieved = true;
}
}
}
// Schrittmotoren steuern
if (running) {
float percentage = (currentWeight / targetWeight) * 100;
// Stepper 1 steuern
if (percentage < 96.0) {
stepper1.setSpeed(map(percentage, 0, 86, 80, 6) * (2048 / 60)); // Doppelte Geschwindigkeit
stepper1.runSpeed();
if (percentage >= 96.0) {
stepper1.move(-2048 / 4); // 1/4 Umdrehung in die andere Richtung
stepper1.runToPosition();
}
}
// Stepper 2 steuern
if (percentage >= 96.0 && percentage < 100.0) {
stepper2.setSpeed(map(percentage, 96, 98, 50, 6) * (2048 / 60)); // Doppelte Geschwindigkeit
stepper2.runSpeed();
if (percentage >= 100.0) {
stepper2.move(-2048 / 4); // 1/4 Umdrehung in die andere Richtung
stepper2.runToPosition();
}
}
// Korrektur nach 100%
if (percentage >= 100.0 && !weightStabilized) {
weightStabilized = true;
correctionActive = true;
startTime = currentMillis;
}
// Nachkorrektur
if (correctionActive && currentMillis - startTime >= correctionDelay) {
correctionActive = false;
stepper2.setSpeed(1 * (2048 / 60)); // 1 U/min
stepper2.runSpeed();
// System beenden
running = false;
Serial.println("Zielgewicht erreicht, System angehalten.");
lcd.setCursor(0, 1);
lcd.print("Ziel erreicht ");
stepper1.stop();
stepper2.stop();
}
}
}