Go Down

Topic: Schrittmotor 28BYJ48 am Arduino (Read 259 times) previous topic - next topic

Lotti-Karrotti

Hallo Forum,

ich habe einen Schrittmotor 28BYJ48/ ULN2003APC (Steckchip, Treiberboard mit den 4 roten LEDs) am Arduino. Den möchte ich eigentlich nur ganz trivial per Druck auf den Taster nach rechts drehen und mit erneutem Druck nach links drehen lassen. Ob das Zeit- oder Umdrehungsbasierend ist, ist mir nicht wichtig. Ich muss dann, wenn alles klappt sowieso herumprobieren. Nun sind meine Programmierkenntnisse miserabel... sagen wir einfach, ich hab so gut, wie keine.

Ich hab natürlich ein paar Test- Sketche gefunden. Ich hab aber kein Plan, wie ich das umschreiben soll. Kann mir dabei jemand helfen?
Also ganz simpel: Druck auf Taster, Motor dreht rechts (n Sekunden oder n RPM). Erneuter Druck: entgegengesetzt das Ganze.


Ich will die Nummer ja hier nicht so verkaufen, wie "hier habt Ihr, jetzt kümmert Euch", aber mit einem "das musste dich mal hinsetzten und Grundsachen lernen", ist auch irgendwie doof.


Hier mal der Test Sketch:


const int motorPin1 = 8;  // Blue   - In 1
const int motorPin2 = 9;  // Pink   - In 2
const int motorPin3 = 10; // Yellow - In 3
const int motorPin4 = 11; // Orange - In 4
                          // Red    - pin 5 (VCC)

unsigned int lowSpeed  = 10000; // Notabene: nicht über 16000
unsigned int highSpeed =  1000;

void setup() {
  pinMode(motorPin1, OUTPUT);
  pinMode(motorPin2, OUTPUT);
  pinMode(motorPin3, OUTPUT);
  pinMode(motorPin4, OUTPUT);
}

void loop()
{ unsigned long n = millis() / 3000; // 3 Sekunden

  switch(n % 8)
  { case 0: stop();               break;
    case 1: rechtsrum(lowSpeed);  break;
    case 2: stop();               break;
    case 3: linksrum(lowSpeed);   break;
    case 4: stop();               break;
    case 5: rechtsrum(highSpeed); break;
    case 6: stop();               break;
    case 7: linksrum(highSpeed);  break;
  }
}

void rechtsrum(unsigned int motorSpeed)
{ // 1
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 2
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 3
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 4
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 5
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, LOW);
  delayMicroseconds(motorSpeed);

  // 6
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);

  // 7
  digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);

  // 8
  digitalWrite(motorPin4, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, HIGH);
  delayMicroseconds(motorSpeed);
}

void linksrum(unsigned int motorSpeed)
{ // 1
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);

  // 2
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);

  // 3
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);

  // 4
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, HIGH);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);

  // 5
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, LOW);
  delayMicroseconds(motorSpeed);

  // 6
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, HIGH);
  digitalWrite(motorPin4, HIGH);
  delayMicroseconds(motorSpeed);

  // 7
  digitalWrite(motorPin1, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delayMicroseconds(motorSpeed);

  // 8
  digitalWrite(motorPin1, HIGH);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin4, HIGH);
  delayMicroseconds(motorSpeed);
}

void stop()
{ digitalWrite(motorPin4, LOW);
  digitalWrite(motorPin3, LOW);
  digitalWrite(motorPin2, LOW);
  digitalWrite(motorPin1, LOW);
}



Im Anhang ist der zweite Test- Sketch

DrDiettrich

Ein paar Grundlagen solltest Du schon lernen. Z.B. daß Code mit Code Tags </> gepostet werden sollte, damit nicht mittendrin Smilies auftauchen. Und die Abfrage von Buttons gehört auch zu den Grundlagen, für die Du Beispiele sogar in der IDE findest.

Wenn Du Dir obiges Beispiel für Schrittmotoren ansiehst, da gibt es die zwei Funktionen linksrum() und rechtsrum(). Die rufst Du abwechselnd auf, wenn der Button gedrückt wird, und so oft wie gesteppt werden soll. Versuch's mal und melde Dich wieder.

agmue

Schaue Dir mal die Programmbibliothek AccelStepper an, die könnte Dir das Programmieren erleichtern. Funktioniert auch mit Deinem unipolaren Motor.

jurs

Also ganz simpel: Druck auf Taster, Motor dreht rechts (n Sekunden oder n RPM). Erneuter Druck: entgegengesetzt das Ganze.
[/quote]

Und beim dritten Tastendruck wieder anhalten?

Ich würde eine Finite State Machine (FSM, Zustandsautomat für drei Zustäne programmieren, die ich erstnal per Enumeration durchzähle STOP, CLOCKWISE und COUNTERCLOCKWISE für die drei Zustände
- Anhalten
- im Uhrzeigersinn drehen
- im Gegenuhrzeigersinn drehen

Und im wesentlichen müssen drei State-Funktionen geschrieben werden, die entsprechend agieren und die von der loop() Funktion aus entsprechend dem Zustand immer wieder und wieder aufgerufen werden.

Funktionsnamen beispielsweise stop() und clockwise() und (counterclockwise().

Und natürlich eine buttonPressed() Funktion, die im Fall, dass der Tastschalter gedrückt wird, true zurückliefert, damit der Zustand umgeschaltet werden kann.

Dein Testsketch sieht mir danach aus, als wenn Tastendrücke da bisher keine Rolle spielen, sondern Du eine reine Zeitsteuerung für acht verschiedene Zustände implementiert hast, wobei vier von den acht Zuständen die stop() Funktion aufrufen, also identisch sind.

Go Up