Schrittmotor ruckelt beim starten (Nullpunkt an Lichtschranke)

Hallo zusammen,

ich verwende folgenden Schrittmotor: Stepper Motor kaufen | EXP Tech

Sketch:

#include <Stepper.h>

const int stepsPerRevolution = 400; // Anzahl Schritte pro Umdrehung
Stepper myStepper(stepsPerRevolution, 12, 13); // initialize the stepper library on the motor shield

// give the motor control pins names:
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
int x = 0;

//Lichtschranke
int lichtschranke = A5;
int schrankeValue = 0;


void setup() {

  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

  Serial.begin(9600);

  myStepper.setSpeed(5);


  // Nullpunkt finden
  for (int i = 0 ; i <= 200 ; i++)
  {
    myStepper.step(1);

    schrankeValue = analogRead(lichtschranke);

    if (schrankeValue > 700)
    {
      break;
    }

  }


}



void loop() {
}

Beim Start des Skteches zuckt der Motor 1-2 Sekunden vor- und rückwärts und fährt dann wie gewollt zur Lichtschranke und bleibt stehen. Aber auch ohne die for-Schleife zuckt der Motor hin und her. Woran liegt das? Was kann ich versuchen zu ändern?

const int dirB = 13;

Der Bootloader blinkt mit der LED !

Vermutlich wäre alles gut, wenn du ALLE Eingänge des StepperTreibers mit Pullups versehen würdest.

schrankeValue = analogRead(lichtschranke);

Das sieht voll komisch aus!
Warum analog?

Die konstellation ist so: Auf dem Arduino ist ein Arduino Motor Shield und auf dem Arduino Motor Shield ist ein Wireless Shield mit Xbee Modul.

Das Motorshield braucht ja die Pins 3,8,9,11,12,13 und die anderen Digitalpins sind alle belegt (Relais,LCD-Display). Deshalb klemmt die Lichtschranke am analog, funktioniert auch wunderbar.

Wie kann ich da genau die Pullups integrieren, wenn das Motor Shield zwischen Arduino und Wireless Shield sitzt ?

Die "Analog"-Pins kannst du auch digital verwenden. Das analoge ist eine Zusatzfunktion

Es ist halt nunmal so dass am Anfang der Bootloader auf Pin 13 blinkt. Man könnnte den Bootloader entfernen. Dann kannst du aber nicht mehr über USB hochladen

Wie kann ich da genau die Pullups integrieren, wenn das Motor Shield zwischen Arduino und Wireless Shield sitzt ?

Auf dem Wireless Schild.
Die Widerstände störts ja nicht, wo sie sitzen.
(ob das hilft? Kenne deine Schilder nicht)

PS:
Könnte auch sein, dass das Schild Pulldowns möchte/braucht

hier mal nen Bild von den 3 Shields: http://www.fotos-hochladen.net/view/img0002oqfpes392a.jpg

verwendete Shields:

Versteh immer noch nicht, wie ich die Pullups oder Pulldows am Shield stecken muss...

Versteh immer noch nicht, wie ich die Pullups oder Pulldows am Shield stecken muss...

An die beiden PWM Pins.
Die gehen an Enable des Motortreibers.

Gegen 5V als Pullup
Gegen GND als Pulldown

Das Datenblatt des Motortreibers sollte dir Auskunft geben können was du da tun solltest.
Oder einfach ausprobieren... passiert schon nix.

hey, sorry dass ich mich jetzt erst zurückmelde.

also die beiden PWM pins vom motor shield sind ja 3 und 11. Jetzt pack ich in den 3. Pin vom Wireless Shield ein Jumper Kabel, das geht ins Breadboard, darüber nen Widerstand und wo geht das weitere Jumper Kabel dann rein?

Und inwiefern unterscheidet sich ein Pullup von einem Pulldown Widerstand ?

PullDown:
Pin3 - 10kOhm - GND
Pin11 - 10kOhm - GND

ODER

PullUp:
Pin3 - 10kOhm - 5V
Pin11 - 10kOhm - 5V

amanera:
Und inwiefern unterscheidet sich ein Pullup von einem Pulldown Widerstand ?

Pull-down

funktioniert leider beides nicht, weder als Pull-Up, noch als Pull-Down.

Ruckelt immer noch, sowohl beim Start, als auch beim Abfahren der Schritte.

Jemand noch ne Idee?

Mir kommen die zwei PWM Signale spanisch vor. Vielleicht möchte Dein Motortreiber 1 Schritt- und 1 Richtungssignal haben?

Ich denke mal, das deine Steppermotorinitialisierung falsch ist

DirA und DirB als Ausgang der Stepperbibliothek zu benutzen heist ja, das du ihn vorwärts und rückwärts schaltest.

Grundsätzlich versteh ich das ganze Programm nicht, da Steppermotoren eigentlich nicht per PWM gesteuert werden, sondern mit einer Frequenz. Leider finde ich nur eine Beispielbeschreibung zum DC-Motor für das Shield. Auch wenn gesagt wird, das er Steppermotoren steuern könnte.

Beispiele für DC-Motoren nutzen PWM, Steppermotoren nicht. PWM wird mit einer festen Frequenz getaktet und dabei die Pulslänge variiert. Steppermotoren drehen sich synchron zur Frequenz. DC Motoren regelt man runter indem man ihnen die Leistung wegnimmt, Stepper würden solange konstant weiter drehen bis sie zuwenig kraft haben und dann schlagartig stehen bleiben.

Schau also mal nach Beispiele zu deinem Shield die den Steppermotor beschreiben. Ansonsten leg die dir-signale auf feste Pegel (direktion also Richtung) und lege deine Stepper-lib auf 3 und 11. Und schau wie es dann funktioniert. Den so wie es aussieht gibst du ja PWM drauf und taktest dann an DIT A und DIR B rum.

chefin:
Ich denke mal, das deine Steppermotorinitialisierung falsch ist

Dem stimme ich nicht zu. Allerdings nimmt er die Bezeichnungen für DC-Motoren für die Ausgänge. Besser so:

const int pwmA = 3;  // Stepper: ENA 
const int pwmB = 11;  // Stepper: ENB
const int brakeA = 9;  // Stepper: unbenutzt
const int brakeB = 8;  // Stepper: unbenutzt
const int dirA = 12;  // Stepper: IN1 und IN2 als IN1#
const int dirB = 13;  // Stepper: IN3 und IN4 als IN3#

ENA und ENB sind enable=HIGH.

Die Anschlüsse brakeA und brakeB können hochohmig (je 10kOhm interner Pulldown), LOW oder die Lötbrücke getrennt sein.

Zu dirA und dirB ein Zitat aus der Bibliothek:

  • When wiring multiple stepper motors to a microcontroller, you quickly run
  • out of output pins, with each motor requiring 4 connections.
  • By making use of the fact that at any time two of the four motor coils are
  • the inverse of the other two, the number of control connections can be
  • reduced from 4 to 2 for the unipolar and bipolar motors.
  • A slightly modified circuit around a Darlington transistor array or an
  • L293 H-bridge connects to only 2 microcontroler pins, inverts the signals
  • received, and delivers the 4 (2 plus 2 inverted ones) output signals
  • required for driving a stepper motor. Similarly the Arduino motor shields
  • 2 direction pins may be used.

Dementsprechend ist die Initialisierung richtig:

Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2);

Hey Jungs,

ich habe eure BEiträge gelesen, aber komme nicht weiter.

Ich teste aktuell an folgendem Code:

#include <Stepper.h>

const int stepsPerRevolution = 400; // Anzahl Schritte pro Umdrehung
Stepper myStepper(stepsPerRevolution, 12, 13); // initialize the stepper library on the motor shield

// give the motor control pins names:
const int pwmA = 3;
const int pwmB = 11;
const int brakeA = 9;
const int brakeB = 8;
const int dirA = 12;
const int dirB = 13;
int x = 0;


void setup() {

  pinMode(pwmA, OUTPUT);
  pinMode(pwmB, OUTPUT);
  pinMode(brakeA, OUTPUT);
  pinMode(brakeB, OUTPUT);

  digitalWrite(pwmA, HIGH);
  digitalWrite(pwmB, HIGH);
  digitalWrite(brakeA, LOW);
  digitalWrite(brakeB, LOW);

  Serial.begin(9600);

  myStepper.setSpeed(3);

}


void loop() {

  myStepper.step(50);
  delay(2000);
  myStepper.step(-50);
  delay(2000);

}

Gleiches Problem wie vorher, Ruckelt am start kurz hin und her und läuft anschließend sehr unsauber rund. Ich habe auch aktuell einen setSpeed von "3". Wähle ich hier "10" oder höher, dreht sich der Motor garnicht mehr(bzw. hängt an einer Stelle). Kann das denn sein bei so geringer Last?

Was kann ich noch probieren ? Wäre euch echt dankbar, wenn wir das Problem lösen könnten...

Vielleicht brauchst Du ein stärkeres Netzteil?

Was braucht denn Dein Motor, und wie stark ist Dein Netzteil?

Der Motor braucht 7,4V, 280mA und das Netzteil liefert 12V bei maximal 2A.

Bin echt am verzweifeln :slight_smile: