Hallo zusammen,
das ist mein erster Beitrag - meinen Arduino Uno habe ich seit zwei Tagen und ich arbeite mich ein.
Ich hätte folgende Frage:
Ich habe einen Schrittmotor 5V mit ULN2003 an den Arduino Uo angeschlossen.
Mit drei Tastern kann ich wählen: Rechts, Links, Stop.
Folgend der Programmcode ( Kopiervorlage aus Internet).
Rechtsdrehen und Stop laufen, beim Taster Links dreht es sich auch nach rechts. Siehe Markierg " Hier Fehler" im Code. Der Wert -1 ist vieleicht nicht vorgesehen?
Könnte mir jemand eine Art "Bibliothek" empfehlen mit den Befehlen? Arbeite gelegentlich mit TIA Portal, da gibt es eine schöne Bibliothek mit allen Befehlen mit Erläutertung. Ist sowas bei Arduino verfügbar?
Danke im Voraus - schöne Grüße
Philip
#include <AccelStepper.h>
// Define the stepper and the pins it will use
AccelStepper stepper1(AccelStepper::FULL4WIRE, 11, 10, 9, 8);
// Define our three input button pins
#define LEFT_PIN 4
#define STOP_PIN 6
#define RIGHT_PIN 7
// Define our analog pot input pin
#define SPEED_PIN 0
// Define our maximum and minimum speed in steps per second (scale pot to these)
#define MAX_SPEED 500
#define MIN_SPEED 2
void setup() {
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(10000.0);
// Set up the three button inputs, with pullups
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
}
void loop() {
static float current_speed = 0.0; // Holds current motor speed in steps/second
static int analog_read_counter = 1000; // Counts down to 0 to fire analog read
static char sign = 0; // Holds -1, 1 or 0 to turn the motor on/off and control direction
static int analog_value = 0; // Holds raw analog value.
// If a switch is pushed down (low), set the sign value appropriately
if (digitalRead(LEFT_PIN) == 0) {
sign = -1; // HIER FEHLER???
}
else if (digitalRead(RIGHT_PIN) == 0) {
sign = 1;
}
else if (digitalRead(STOP_PIN) == 0) {
sign = 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 = 3000;
// Now read the pot (from 0 to 1023)
analog_value = analogRead(SPEED_PIN);
// Give the stepper a chance to step if it needs to
stepper1.runSpeed();
// And scale the pot's value from min to max speeds
current_speed = sign * (((analog_value/1023.0) * (MAX_SPEED - MIN_SPEED)) + MIN_SPEED);
// Update the stepper to run at this new speed
stepper1.setSpeed(current_speed);
}
// This will run the stepper at a constant speed
stepper1.runSpeed();
}
Ich benutze diese hier, und hatte bis jetzt noch nie probleme.
Hallo, leider läuft es in der neuen Variante nicht rund.
Woran liegt es, das das negative Vorzeichen nicht zum Richtungswechsel führt? Siehe Markierug HIER.
#include <AccelStepper.h>
// Define the stepper and the pins it will use
AccelStepper stepper1(AccelStepper::FULL4WIRE, 11, 10, 9, 8);
// Define our three input button pins
#define LEFT_PIN 4
#define STOP_PIN 6
#define RIGHT_PIN 7
void setup() {
// The only AccelStepper value we have to set here is the max speeed, which is higher than we'll ever go
stepper1.setMaxSpeed(10000.0);
// Set up the three button inputs, with pullups
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
}
void loop() {
int current_speed = 0;
// If a switch is pushed down (low), set the sign value appropriately
if (digitalRead(LEFT_PIN) == 0)
{
stepper1.run();
stepper1.runSpeed();
current_speed = 250;
stepper1.setSpeed(current_speed); //
}
else if (digitalRead(RIGHT_PIN) == 0) {
stepper1.run();
stepper1.runSpeed();
current_speed = -250; // HIER
stepper1.setSpeed(current_speed);
}
else if (digitalRead(STOP_PIN) == 0) {
stepper1.run();
stepper1.runSpeed();
current_speed = 0;
stepper1.setSpeed(current_speed);
}
}
Irgendwas stimmt nicht - wieso dreht sich der Schrittmotor immer in die gleiche Richtung? Durch Minus Vorzeichen bei stepSpeed muss doch die Richtung umgekehrt werden???
#include <AccelStepper.h>
AccelStepper stepper; // Defaults to AccelStepper::FULL4WIRE
void setup()
{
stepper.setMaxSpeed(1000);
stepper.setSpeed(-150);
}
void loop()
{
stepper.runSpeed();
}
Also jetzt klappt es - einfach selbst Programm geschrieben ohne Vorlage.
Was ist genau der Unterschied zwischen Stepper.h und AccellStepper?
#include <Stepper.h>
const int stepsPerRevolution = 2048; // change this to fit the number of steps per revolution
const int rolePerMinute = 15; // Adjustable range of 28BYJ-48 stepper is 0~17 rpm
Stepper myStepper(stepsPerRevolution, 8, 10, 9, 11);
#define LEFT_PIN 5
#define RIGHT_PIN 6
#define STOP_PIN 7
void setup() {
myStepper.setSpeed(rolePerMinute);
// initialize the serial port:
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
Serial.begin(9600);
}
void loop() {
if (digitalRead(LEFT_PIN) == LOW){
myStepper.step(1);
}
else if (digitalRead(STOP_PIN) == LOW){
myStepper.step(0);
}
else if (digitalRead(RIGHT_PIN) == LOW){
myStepper.step(-1);
}
}
Hallo Felipe,
die Stepper.h ist wesentlich einfacher gestrickt als die AccelStepper. Wenn Du da mehrere Steps ausführst, blockiert der Sketch.
Die AccelStepper hat Anfahr- und Bremsrampe, ist aber etwas komplizierter zu handhaben bezügl. der run() und runSpeed() Methoden damit der Sketch nicht blockiert. Deine Sketche oben mit der Accelstepper sind da auch nicht ok.
Wenn Du die Motoranschlüsse bei der AccelStepper in der gleichen Reihenfolge definierst, wie Du das bei der stepper.h gemacht hast, funktioniert die Richtungsumkehr auch bei der AccelStepper.
Du kannst es auch mal mit meinen MobaTools probieren. Die lassen sich über den Bibliotheksverwalter installieren. Die steuern den Stepper im Hintergrund an. Es gibt kein Blockieren im Sketch, aber Du brauchst auch keine run() oder runSpeed() Methoden einbauen.
So sähe dein Sketch dann aus: ( Die Inputs funktionieren da als Taster - der letzte Zustand der Bewegung bleibt erhalten, auch wenn Du wieder loslässt) .
#include <MobaTools.h>
const int stepsPerRevolution = 2048; // change this to fit the number of steps per revolution
const int rolePerMinute = 15; // Adjustable range of 28BYJ-48 stepper is 0~17 rpm
Stepper4 myStepper(stepsPerRevolution, FULLSTEP);
#define LEFT_PIN 5
#define RIGHT_PIN 6
#define STOP_PIN 7
void setup() {
myStepper.attach(8,9,10,11);
myStepper.setSpeed(rolePerMinute*10);
myStepper.setRampLen( 100 );
// initialize the serial port:
pinMode(LEFT_PIN, INPUT_PULLUP);
pinMode(STOP_PIN, INPUT_PULLUP);
pinMode(RIGHT_PIN, INPUT_PULLUP);
Serial.begin(115200);
}
void loop() {
if (digitalRead(LEFT_PIN) == LOW) {
myStepper.rotate(1);
}
else if (digitalRead(STOP_PIN) == LOW) {
myStepper.rotate(0);
}
else if (digitalRead(RIGHT_PIN) == LOW) {
myStepper.rotate(-1);
}
delay(10);
}
P.S. Nutze bitte Code-Tags, wenn Du Programmcode einstellst (oben links im Editor, das </> ).
Hallo Franz-Peter,
danke für die Hilfe. Das funktioniert und war eine gute Übung um den Umgang mit den Liberys zu üben.
Habe mir das pdf mit den Befehlen von mobatools runtergeladen und etwas probiert. Klappt gut.
Grüße
Philip
Hallo,
es hat sich noch eine Frage ergeben. Ich möchte einen Schrittmotor aus einem DVD - Laufwerk mit mobatoos.h libery ansteuern, entsprechend dem Programm oberhalb.
Mir ist folgendes unklar:
- Wie Motor mit Eingang auf ULN2003 Schrittmotortreibermodul verbinden?
- Wie Schrittzahl und max. Geschwindigkeit herausfinden?
Mit einem Programm mit stepper.h schaffe ich es anzusteuern, der Motor brummt aber dreht sich nicht.
Habe folgendes Programm verwendet:
Wollte das auch mit H-Brücke realisieren, diese muss ich aber erst besorgen.
Grüße
Philip
#include <Stepper.h>
// ca. Schritte pro Umdrehung
const int stepsPerRevolution = 20;
// Schrittmotor initialisieren
// Y-Achse hängt an Pin des Arduino
Stepper myStepperY(stepsPerRevolution, 8,9,10,11);
void setup() {
// Geschwindigkeit setzen
myStepperY.setSpeed(100);
// 20 Schritte (der Schlitten sollte sich in Richtung des Motors bewegen)
myStepperY.step(20);
delay(100);
}
void loop() {
// Leer
}
Felipe2607:
Ich möchte einen Schrittmotor aus einem DVD - Laufwerk mit mobatoos.h libery ansteuern, entsprechend dem Programm oberhalb.
Mir ist folgendes unklar:
- Wie Motor mit Eingang auf ULN2003 Schrittmotortreibermodul verbinden?
- Wie Schrittzahl und max. Geschwindigkeit herausfinden?
Wieviele Anschlüsse hat denn der Schrittmotor? Wenn er nur 4 Anschlüsse hat, geht das mit dem ULN2003 nicht, da brauchst Du einen Schrittmotortreiber. Der A4988, oder DRV8825 gehen gut und sind günstig.
Ob es mit einer einfachen H-Brücke geht, hängt von den elektrischen Daten des Schrittmotors ab.
Schrittzahl und mögliche Geschwindigkeit kannst Du bei einem unbekannten Motor nur experimentell ermitteln.