Schrittmotor mit Encoder steuern

Hallo,

ich bin neu hier im Forum, und brauch mal eure Hilfe.
Ich versuche mittels eines Encoders einen Schrittmotor mit verschiedenen Geschwindigkeiten zum Laufen zu bringen.
Ich habe die Version, die bei YouTube zu sehen ist verwendet.
Sie funktioniert auch als solche, aber ich möchte mittel Stufenschalter verschiedene Geschwindigkeiten erreichen.Habe volgenden Sketch probiert

#include <Encoder.h>

int pinE2 = 2;
int pinE3 = 3;

Encoder myEnc(pinE2, pinE3);

int pinDir = 11;
int pinStep = 12;
int v1 = 5;
int v2 = 6;
int v3 = 7;
int speedfaktor=1;

//void drehen(int schritte, int tempo);

void setup()
{
pinMode(pinDir, OUTPUT);
pinMode(pinStep, OUTPUT);
pinMode(v1, INPUT);
pinMode(v2, INPUT);
pinMode(v3, INPUT);
}
void loop()
{
if (v1==1) speedfaktor=1;
else if (v2==1) speedfaktor=5;
else if (v3==1) speedfaktor=10;

//den Wert einlesen
int encoderWert = myEnc.read();
//grösser 0
if(encoderWert > 0)
{
//motor drehen grösse der schritte & tempo frei wählbar
drehen(-100speedfaktor,150);
}
//kleiner 0
else if(encoderWert < 0)
{
//motor drehen grösse der schritte & tempo frei wählbar
drehen(100
speedfaktor,150);
}
delay(5);
//Wert des Encoders wieder auf 0 stellen
myEnc.write(0);
delay(5);
}
//Drehfunktion für den Schrittmotor
void drehen(int schritte, int tempo)
{
if(schritte > 0)
digitalWrite(pinDir,HIGH);
else
digitalWrite(pinDir,LOW);

schritte = abs(schritte);

for(int i=0; i < schritte; i++)
{
digitalWrite(pinStep, HIGH);
delayMicroseconds(tempo);
digitalWrite(pinStep, LOW);
delayMicroseconds(tempo);
}
}

Die Geschwindigkeit kann ich nur ändern, wenn ich bei
“int speedfaktor=1;”
den Wert ändere.
Ich möchte aber mit dem Drehschalter die Geschwindigkeit ändern!

Kann mir einer helfen, da meine Programierkenntnisse zu wünschen übrig lassen…?

Grüsse Hanse

hanse: Die Geschwindigkeit kann ich nur ändern, wenn ich bei "int speedfaktor=1;" den Wert ändere. Ich möchte aber mit dem Drehschalter die Geschwindigkeit ändern!

Vielleicht mal irgendwo die Stellung des Drehschalters mit digitalRead() abfragen?

Da Du oben womöglich die Pins Deines Drehschalters so deklarierst:

int v1 = 5;
int v2 = 6;
int v3 = 7;

vergleichst Du mit diesem Code nur die deklarierten Pinnummern, aber nicht die Schaltzustände an den Pins:

    if (v1==1) speedfaktor=1;
   else if (v2==1) speedfaktor=5;
   else if (v3==1) speedfaktor=10;

Alle diese Pin-Vergleiche ergeben "false".

Eventuell wolltest Du ja das machen:

    if (digitalRead(v1)==1) speedfaktor=1;
   else if (digitalRead(v2)==1) speedfaktor=5;
   else if (digitalRead(v3)==1) speedfaktor=10;

Hallo,

danke für die schnelle Antwort!
Hab das mit dem “digitalRead” auch schon probiert, aber nicht mit den Klammern um "v1,v2,v3 !
gab beim kompilieren immer eine Fehlermeldung.
Hab deine Version aufgespielt und siehe da:
Läuft “Perfekt”
nochmal vielen Dank für die schnelle Hlife!!

Kann man den Sketch mit diesem verbinden?

Dies ist ein Sketch für einen automatischen Vorschub aus einnem anderen Forum (“Karl” sei Dank)

// Parameter und Definitionen nach Gusto anpassen

// Ausgangs-Pins
#define READY   13                            // Bereitschaft
#define STEP    12                            // Pin fuer Step-Impuls
#define DIRP    11                            // Pin fuer Richtung
#define ENABLE   3                            // Pin fuer Enable fuer die Stepper-Endstufe

// Eingangs-Pins
#define POTI    A5                            // Analogeingang fuer Poti
#define SWITCH  A4                            // Geschwindigkeits-Wahlschalter

// Poti-Paramter
#define Puse    98                            // nutzbarer Drehwinkel des Potis in % (max. 100)
#define Ruhe    15                            // Ruhezone in % (min. 1)
#define MITTE  512                            // ADC-Wert Poti in Mittelstellung
                                             // sollte nicht allzu weit von 512 abweichen
// Schrittfrequenz
#define Fmin     4                            // Minimale Schrittfrequenz - nicht kleiner als 1
#define Fmax  4000                           // Maximale Schrittfrequenz - nicht groesser als 4200
#define RFAKTOR  6                            // Reduktionsfaktor Slow-Mode

#define RICHTUNG 1                            // Richtungsumkehr: auf 0 oder 1 setzen je nach Wunsch                   

#define RELEASE  1                            // Schrittmotor "loslassen" in Ruhestellung? 0/1

// ab hier nichts mehr ändern

#define Pmin ((335544L * Ruhe) >> 16)         // Minwert vom Poti
#define Pmax ((335544L * Puse) >> 16)         // Maxwert vom Poti

int p, s, l;
int f = Fmax;
long d;

int aRead() {
 int v = analogRead(POTI) - MITTE;           // 0-1023 -> -512 .. +511
 v <<= 2;                                    // ganz einfache Glaettung
 v += l;
 v += l;
 v += l;
 v >>= 2;
 l = v;
 v >>= 2;
 return v;
}

void setup() {
 uint8_t i, r;
 pinMode(READY, OUTPUT);                     // Bereitschaftsanzeige
 pinMode(STEP, OUTPUT);                      // Step
 pinMode(DIRP, OUTPUT);                      // Richtungs-Pin
 pinMode(ENABLE, OUTPUT);                    // Enable-Pin
 pinMode(SWITCH, INPUT);                     // Geschwindigkeits-Wahlschalter
 digitalWrite(SWITCH, HIGH);                 // Pullup
 digitalWrite(ENABLE, LOW);                  // Enable 0
 while (--i) {                               // Warten bis sich der ADC stabilisiert
   aRead();
   delay(3);
   digitalWrite(READY, (i & 0x40) ? HIGH : LOW);
 }
 if (abs(l) > (Pmin * 4/5)) r++;
 while (r) {                                 // Warten bis Poti stabil in Ruhezone
   aRead();
   if (abs(l) < (Pmin * 4/5)) r++;
   delay(1);
   digitalWrite(READY, (i++ & 0x20) ? HIGH : LOW);
 }
 digitalWrite(READY, HIGH);                  // Bereit
}

void loop() {
 p = aRead();                                // geglaetteten Potiwert holen
 digitalWrite(STEP, LOW);                    // Impuls-Pin auf low
#if RICHTUNG > 0
 digitalWrite(DIRP, (p < 0) ? HIGH : LOW);   // Richtungs-Pin fuer Stepper
#else
 digitalWrite(DIRP, (p > 0) ? HIGH : LOW);   // Richtungs-Pin fuer Stepper
#endif
 p = abs(p);                                 // 0 .. 512 -> Geschwindigkeit
 if (p > Pmin) {                             // aus Ruhezone?
   digitalWrite(ENABLE, HIGH);               // Enable 1
   p = constrain(p, Pmin, Pmax);             // Werte begrenzen
   if (digitalRead(SWITCH)) {
     f = map(p, Pmin, Pmax, Fmin, Fmax);     // und Poti -> Frequenz mappen
   } else {
     f = map(p, Pmin, Pmax, Fmin, Fmax / RFAKTOR);
   }
   if (f > 63) {                             // delayMicroseconds kann max. 16383us
     d = 1000000L / f;
     d -= 234;                               // Laufzeitkorrektur um 234us
     if (d > 0) delayMicroseconds(d);
   } else {                                  // bei > 16ms keine Laufzeitkorrektur noetig
     delay(1000 / f);
   }
   digitalWrite(STEP, HIGH);                 // Step an Impuls-Pin
#if RELEASE > 0
 } else {
   digitalWrite(ENABLE, LOW);                // Enable 0 - "loslassen"
#endif
 }
}