Bei diesem Motor kann es vorkommen, dass die Übersetzung nicht exakt ist, d.h. sie sollte eigentlich 1:64 sein, ist aber meist ein Bruchteil darunter (z.B. 1:63,68395). Damit ergibt sich in diesem Beispiel, dass nicht 4096 Schritte pro Umdrehung nötig sind, sondern nur 4075,772. Für viele Anwendungen ist das wohl egal, aber wenn der Motor fortlaufend in eine Richtung drehen soll (z.B. als Sekundenzeiger einer Uhr), muss dieser Umstand berücksichtigt werden.
Im Folgenden habe ich die digitalen Pins 8..11 des Arduino zum Anschluss des Motortreibers verwendet.
Für Versuche reicht die Strom-Versorgung aus dem USB-Port (5V). Für echte Anwendungen sollte eine externe
Stromquelle verwendet werden, damit der Arduino keinen Schaden nimmt.
Der Jumper auf dem Motortreiber (rechts neben dem VCC-Pin) muss gesteckt bleiben. Durch Entfernen dieses
Jumpers wird die Stromversorgung zum Motor unterbrochen.
Pin (ULN2003) | Pin (Arduino) |
---|---|
IN1 | 8 |
IN2 | 9 |
IN3 | 10 |
IN4 | 11 |
IN5 | - |
IN6 | - |
IN7 | - |
Vcc (+5..12V) | 5V |
GND (-5..12V) | GND |
Laut Datenblatt soll der Motor in folgender Sequenz angesteuert werden:
In 1 | In 2 | In 3 | In 4 |
---|---|---|---|
0 | 0 | 0 | 1 |
0 | 0 | 1 | 1 |
0 | 0 | 1 | 0 |
0 | 1 | 1 | 0 |
0 | 1 | 0 | 0 |
1 | 1 | 0 | 0 |
1 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
#define PIN_IN1 8 // blue
#define PIN_IN2 9 // pink
#define PIN_IN3 10 // yellow
#define PIN_IN4 11 // orange
unsigned int lowSpeed = 10000; // max: 16000
unsigned int highSpeed = 1000;
void setup()
{
pinMode(PIN_IN1, OUTPUT);
pinMode(PIN_IN2, OUTPUT);
pinMode(PIN_IN3, OUTPUT);
pinMode(PIN_IN4, OUTPUT);
}
void loop()
{
unsigned long n = millis() / 3000; // 3 seconds
switch(n % 8) {
case 0: stopMotor(); break;
case 1: rotateRight(lowSpeed); break;
case 2: stopMotor(); break;
case 3: rotateLeft(lowSpeed); break;
case 4: stopMotor(); break;
case 5: rotateRight(highSpeed); break;
case 6: stopMotor(); break;
case 7: rotateLeft(highSpeed); break;
}
}
void rotateRight(unsigned int motorSpeed)
{
setMotor(LOW, LOW, LOW, HIGH, motorSpeed);
setMotor(LOW, LOW, HIGH, HIGH, motorSpeed);
setMotor(LOW, LOW, HIGH, LOW, motorSpeed);
setMotor(LOW, HIGH, HIGH, LOW, motorSpeed);
setMotor(LOW, HIGH, LOW, LOW, motorSpeed);
setMotor(HIGH, HIGH, LOW, LOW, motorSpeed);
setMotor(HIGH, LOW, LOW, LOW, motorSpeed);
setMotor(HIGH, LOW, LOW, HIGH, motorSpeed);
}
void rotateLeft(unsigned int motorSpeed)
{
setMotor(HIGH, LOW, LOW, LOW, motorSpeed);
setMotor(HIGH, HIGH, LOW, LOW, motorSpeed);
setMotor(LOW, HIGH, LOW, LOW, motorSpeed);
setMotor(LOW, HIGH, HIGH, LOW, motorSpeed);
setMotor(LOW, LOW, HIGH, LOW, motorSpeed);
setMotor(LOW, LOW, HIGH, HIGH, motorSpeed);
setMotor(LOW, LOW, LOW, HIGH, motorSpeed);
setMotor(HIGH, LOW, LOW, HIGH, motorSpeed);
}
void stopMotor()
{
setMotor(LOW, LOW, LOW, LOW, 0);
}
void setMotor(byte in1, byte in2, byte in3, byte in4, unsigned int motorSpeed)
{
digitalWrite(PIN_IN1, in1);
digitalWrite(PIN_IN2, in2);
digitalWrite(PIN_IN3, in3);
digitalWrite(PIN_IN4, in4);
delayMicroseconds(motorSpeed);
}
Das folgende Experiment verwendet die Library
Stepper.h und soll
den Schrittmotor jeweils um 360° nach links und rechts drehen.
Stellenweise hakte der Motor ein wenig, aber die Drehung wurde durchgeführt.
#include <Stepper.h>
// number of steps in one revolution of your motor
#define STEPS 2038
// set the speed in rpm
#define MOTOR_RPM 6
Stepper stepper(STEPS, 8, 10, 9, 11);
void setup()
{
}
void loop()
{
stepper.setSpeed(MOTOR_RPM);
stepper.step(STEPS);
delay(1000);
stepper.setSpeed(MOTOR_RPM);
stepper.step(-STEPS);
}
Das folgende Experiment verwendet die Library
CheapStepper.h und soll
den Schrittmotor jeweils um 360° nach links und rechts drehen.
Das Resultat war sehr gut und die Drehung flüssig!
#include <CheapStepper.h>
CheapStepper stepper (8, 9, 10, 11);
// let's create a boolean variable to save the direction of our rotation
boolean moveClockwise = true;
void setup()
{
}
void loop()
{
// move a full rotation (4096 mini-steps)
for (int s=0; s<4096; s++){
stepper.step(moveClockwise);
}
delay(1000);
moveClockwise = !moveClockwise;
}
zurück