Arduino und Schrittmotoransteuerung?!

Hi,

ersteinmal.. nachdem ich lange hier im Forum gelesen habe und mich auch schon an dem einem oder anderen probiert habe, bin ich jetzt auf ein Problem gestossen was ich nicht lösen kann.
Besser gesagt ich verzweifel daran =)

Es geht um folgendes:

Schrittmotor ansteuern und verstehen O_o

Als Treiber für den Schrittmotor habe ich nen L293 genommen.. weil die 298 & 297 immernoch beier post liegen :frowning:

Dann hab ich mit dem Bespiel von der arduino.cc seite rumprobiert.. (motorknob wenn ich mich nich irre)

Lief eigentlich auch, nur leider ganzschön ruckelig. Umgeschrieben weil damit kann ich so nix anfangen....

Zunächst wollte ich einfach nur durch einen Schalter einen Schritt weiterfahren.

Hier mein Quelltext:

#include <Stepper.h>

#define STEPS 200


Stepper stepper(STEPS, 8, 9, 10, 11);


int previous = 0;
int pin=3; //Schalter 1
 int val = 20;
  


void setup()
{

  stepper.setSpeed(150);
  digitalWrite(pin,HIGH);
}

void loop()
{

  
   if(!digitalRead(pin))
    {
      stepper.step(val + previous);
      delay(100);
    
    }
     
  
  previous = val;
}

Dreht und macht auch nach optischer Kontroller ungefähr die angegebenen Schritte.

Jeddoch wenn ich jetzt probiere noch einen Taster einzubauen der runterzählt, und dann in die andere Richtung dreht. Passiert nix.

Genauer gesagt, hab ich irgendwie auchnochnich verstanden wie die Library mittels der anweisung Stepper.steps den Stepper in bewegung bringt.
Addiern bekomm ich ja hin... aber das wars auch schon.

Hoffe hier ist jmd, der mir nen Tip oder nen gutes Beispiel geben kann, wo einfach nen Stepper mit zwei Schaltern gesteuert wird.
Damit ich die Grundzüge nochmal verstehe. Am meisten lässt mich die Library noch im dunkeln stehen....

Vielen dank im vorraus und beste Grüße

Ben

So einen schritt weiter. Das funktioniert so.

Sieht für die erfahrenen Augen vielleicht nicht ganz edel aus. Aber erfüllt erstmal die Auflagen =)

//Beide Richtungen L - R mit Zwei Tastern - Schrittmotor
#include <Stepper.h>

#define STEPS 200

Stepper stepper(STEPS, 8, 9, 10, 11);

int previous = 0;
int pin=3; //Schalter 1
int pin2=0;//Schalter 2

void setup()
{
  
  stepper.setSpeed(150); //GESCHWINDIGKEIT
  digitalWrite(pin,HIGH);//Schalter1
  digitalWrite(pin2,HIGH);//Schalter2
}

void loop()
{
  // Varialben
  int val = 200;
  int val2 = val;

   if(!digitalRead(pin))
    {
      stepper.step(val);
      delay(100);
    
    }
   if(!digitalRead(pin2))
      {
        val = 0;
      stepper.step(val - val2);
      delay(100);
    
    }
    
  previous = val;
}

Kann ich das so verstehen:

Wenn ich über den Befehl Stepper.steps nen Positiven wert bis 200 sende, dreht er in die eine Richtung. Wenn der Wert negativ ist, der er in die andere Richtung?

Ich vermute..

Wie würde sowas den in vernünftig aussehen? =)

So drehen tut er sich ja... nur steh ich jetzt vor nem neuen Problem:

-Ich will den Schrittmotor über zwei Taster manuell verfahren können
-Serielle eingabe -2000 +2000 die auch zur bewegung des servos führt

Leider ist mein beispielprogramm schon so verfuscht das ich garnix mehr verstehe. Wäre super wenn man wer drüber schauen könnte.

Die Anweisung über Serial an die Schrittmotoren hab ich weggelassn.. weil ich noch beim auslesen scheitere =(

Schrittmotoren drehen per Schalter auchnicht, sobald ich meine "Auslese schleife eingebaut habe"

Und der wiedergegebene Wert ist irgendwie immer einen Zehnerschritt kleiner =(

hier der code

#include <Stepper.h>
#define STEPS 200
Stepper stepper(STEPS, 8, 9, 10, 11);
int previous = 0;
int pin=3; //Schalter 1
int pin2=2;//Schalter 2

int incomingByte;  
char Data[8];
int i = 0;
unsigned long Zeit;

void setup()
{
  Serial.begin(9600);
  Serial.print("Schrittmotorsteuerung durch Tastatureingabe ueber Serial");
  Serial.println();
  Serial.print("gebe bitte xxx xxx xxx ein ");
 
  stepper.setSpeed(150); //GESCHWINDIGKEIT
  digitalWrite(pin,HIGH);//Schalter1
  digitalWrite(pin2,HIGH);//Schalter2
}

void loop() {
 
  do {
    
   // Varialben
  int val = 50;
  int val2 = val;

   if(!digitalRead(pin))
    {
      stepper.step(val);
      delay(50);
    
    }
   if(!digitalRead(pin2))
      {
        val = 0;
      stepper.step(val - val2);
      delay(50);
    }
    
  previous = val; 
    
     if (Serial.available()) {
       Data[i] = Serial.read();
       i++;
       }    
     if(i<1)Zeit = millis();
     } while (i<7&&(millis()-Zeit) < 500);
  
   
   Data[i] = 0;    
 
    Serial.print(incomingByte);
 
  
  incomingByte = atof(Data);  // Wert von String zu Zahl wandeln
   i=0;
 
}

danke im vorraus... falls sich wer meldet...

So...

jetzt funktioniert das schoma soweit wie ich wollte.

Einziges Problem: Ich muss in der Serial-Anwendung... meine Stepper bewegung immer mit 0 bestätigen. Sonst tut sich nix

das liegt wohl an Data*=0 aber was anderes funktioniert nicht... hab jetzt schon ettlich beispiele durchforstet...*
am liebsten würd ich es so haben, dass der Stepper sich bewegt sobald ich Enter gedrückt habe....
hier nochmal der neue code falls sich wer erbarmt...
```
*#include <Stepper.h>
#define STEPS 200
Stepper stepper(STEPS, 8, 9, 10, 11);
int previous = 0;
int pin=3; //Schalter 1
int pin2=2;//Schalter 2

int incomingByte;  
char Data[8];
int i = 0;
unsigned long Zeit;

void setup()
{
Serial.begin(9600);
Serial.print("Schrittmotorsteuerung durch Tastatureingabe ueber Serial");
Serial.println();
Serial.print("gebe bitte xxx xxx xxx ein ");

stepper.setSpeed(150); //GESCHWINDIGKEIT 150max
digitalWrite(pin,HIGH);//Schalter1
digitalWrite(pin2,HIGH);//Schalter2
}

void loop() {

do {
 
 // Varialben
int val = 1;
int val2 = val;

if(!digitalRead(pin))
  {
    stepper.setSpeed(15);
    stepper.step(val);
    delay(50);
 
  }
 if(!digitalRead(pin2))
    {
      val = 0;
      stepper.setSpeed(15);
    stepper.step(val - val2);
    delay(50);
  }
 
previous = val;
 
   if (Serial.available()) {
     Data[i] = Serial.read();
     i++;
     }    
   if(i<1)Zeit = millis();
   } while (i<7&&(millis()-Zeit) < 500);

Data[i] = 0;

Serial.print(incomingByte);
  Serial.println();
 
 
if(incomingByte > 0)
    {
    stepper.step(incomingByte);
    delay(50);
  }
if(incomingByte < 0)
    {
    stepper.step(incomingByte);
    delay(50);
  }

incomingByte = atof(Data);  // Wert von String zu Zahl wandeln
 i=0;

}*
```