#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?
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
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 ?
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);
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...