Hallo zusammen,
dies ist meine erste Frage in diesem Forum, da ich mich erst seit etwa 2 Wochen überhaupt mit dem Thema Arduino beschäftige - zwangsläufig im Rahmen meines Studiums.
Ich hoffe sehr, dass meine Frage nicht bereits beantwortet wurde. Ich habe lange gesucht, aber keinerlei vergleichbare Themen gefunden.
Ich muss in meinem Projekt mithilfe eines Arduino zwei Schrittmotoren ansteuern, deren Geschwindigkeit sich mithilfe zweier Potentiometer irgendwo in einem Bereich zwischen etwa 60rpm und 120rpm einstellen lassen soll. Schließlich soll die Geschwindigkeit auch noch auf einem 16x2 LCD angezeigt werden, was aber hier nicht das Problem ist.
Grundsätzlich klingt das ja mal recht easy; ich habe in meinem Fall die AccelStepper Library zur Hilfe genommen.
Zunächst dachte ich, dass ich mein Ziel erreicht hätte, habe jedoch dann festgestellt, dass sich die Schrittmotoren zwar bis zu einer Geschwindigkeit von ca. 60rpm einwandfrei linear mit der Drehung des Potis steuern lassen, danach jedoch nicht mehr. Drehe ich das Poti dann noch etwas weiter, springt der Motor plötzlich auf eine leicht höhere, aber nicht mehr veränderliche Geschwindigkeit. Drehe ich dann noch etwas weiter auf, springt der Motor auf eine noch höhere, aber wieder konstante Geschwindigkeit.
Im Display wird mir jedoch stets die eigentliche "Soll-Geschwindigkeit" weiterhin auf mehrere Nachkommastellen korrekt angezeigt. Daraus schließe ich, dass die Geschwindigkeitswerte, die ich mit meinem Potentiometer und mapping auf einen bestimmten Bereich erzeuge grundsätzlich korrekt sind und der Fehler irgendwo in der 'set.Speed()'-Funktion liegen muss. Ich komme jedoch einfach nicht darauf, wo hier der Fehler sein könnte.
Die 'set.Speed()'-Fkt hat als Eingangwerte direkt die gemappten Werte aus dem Potentiometer. Trotzdem ändert sich irgendwann die Geschwindigkeit nicht mehr bzw. sie springt nur noch auf weitestgehend konstante Werte auf und ab.
Könnte es auch am Motor liegen? Habe versucht etwas über den Motor herauszufinden, aber nicht arg viel herausfinden können, da mein Vorgänger das Setup gebaut hat. Die Beschriftung lautet aber ot-42hs40-005b. Ich denke es ist ein 1,8° Nema17.
Wenn mir hier jemand helfen könnte, wäre ich extrem dankbar, da ich mir daran seit Tagen die Zähne ausbeiße und dringend voran kommen muss. Im Anhang auch eine Grafik, die verdeutlichen soll, wie der Geschwindigkeitsverlauf ist.
Danke für eure Hilfe und LG aus Australien
#include <AccelStepper.h>
#include <LiquidCrystal.h>
// Initialize LCD
LiquidCrystal lcd(7,6,5,4,3,2);
// Define the stepper and the pins it will use
AccelStepper stepper1(AccelStepper::DRIVER, 9, 8);
AccelStepper stepper2(AccelStepper::DRIVER, 11, 10);
// Define our input button pins
const int STOP_PIN = 12;
// Define our analog pot input pin
#define SPEED_PIN1 1
#define SPEED_PIN2 2
// Define our maximum and minimum speed in steps per second (scale pot to these)
#define MAX_SPEED1 200
#define MIN_SPEED1 0.0
#define MAX_SPEED2 200
#define MIN_SPEED2 0.0
// Variables will change:
int buttonPushCounter = 0; // counter for the number of button presses
int buttonState = 0; // current state of the button
int lastButtonState = 0; // previous state of the button
void setup() {
// set up the LCD's number of columns and rows:
lcd.begin(16, 2);
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(1000000.0);
stepper2.setMaxSpeed(1000000.0);
// Set up the button inputs, with pullups
// pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT);
}
void loop() {
static char sign = 0; // Holds 1 or 0 to turn the motor on/off
// read the pushbutton input pin:
buttonState = digitalRead(STOP_PIN);
// compare the buttonState to its previous state
if (buttonState != lastButtonState) {
// if the state has changed, increment the counter
if (buttonState == HIGH) {
// if the current state is HIGH then the button went from off to on:
buttonPushCounter++;
}
// Delay a little bit to avoid bouncing
delay(50);
}
// save the current state as the last state, for next time through the loop
lastButtonState = buttonState;
if (buttonPushCounter % 2 == 0) {
sign = 0;
} else {
sign = 1;
}
//-----------------------------------------------------------------------------
static int current_speed1 = 0.0; // Holds current motor speed in steps/second
static int current_speed2 = 0.0; // Holds current motor speed in steps/second
static int analog_read_counter = 0; // Counts down to 0 to fire analog read
static int analog_value1 = 0; // Holds raw analog value.
static int analog_value2 = 0; // Holds raw analog value.
static float speed1 = 0;
static float speed2 = 0;
// We only want to read the pot every so often (because it takes a long time we don't
// want to do it every time through the main loop).
if (analog_read_counter > 0) {
analog_read_counter--;
}
else {
analog_read_counter = 3;
// Now read the pot (from 0 to 1023)
analog_value1 = analogRead(SPEED_PIN1);
analog_value2 = analogRead(SPEED_PIN2);
// Give the stepper a chance to step if it needs to
stepper1.runSpeed();
stepper2.runSpeed();
// Scale the pot's value from min to max speeds
speed1 = (((analog_value1/1023.0) * (MAX_SPEED1 - MIN_SPEED1)) + MIN_SPEED1);
speed2 = (((analog_value2/1023.0) * (MAX_SPEED2 - MIN_SPEED2)) + MIN_SPEED2);
current_speed1 = sign * speed1;
current_speed2 = sign * speed2;
// Update the stepper to run at this new speed
stepper1.setSpeed(current_speed1 * (-1));
stepper2.setSpeed(current_speed2 * (-1));
}
// This will run the stepper at a constant speed
stepper1.runSpeed();
stepper2.runSpeed();
lcd.setCursor(0, 0);
lcd.print("Rod SPS: ");
lcd.setCursor(12,0);
lcd.println(speed1);
lcd.setCursor(0,1);
lcd.print("Screw SPS: ");
lcd.setCursor(12,1);
lcd.println(speed2);
}