Schrittmotorsteuerung

Zur Abwechslung mal etwas „mechanisches“: eine Schrittmotorsteuerung.

Die Komponenten
– ein UNO Board
– ein Steppershield V1.0
– 4 Tasten (Einschalter)
– ein Stepper Motor 28BYJ-48

schrittmotorsteuerung-tastenanschluss
Belegung und Anschluss der Tasten

Die Requirements:
Die vier Tasten dienen zur Steuerung des Motors
– Motor vorwärts drehen
– Motor rückwärts drehen
werden beide Tasten gedrückt, stoppt der Motor. Also keine Drehung.
– Motor schneller drehen(min. 2 ms)
– Motor langsamer drehen(max. 52 ms)
werden beide Tasten gedrückt, bleibt die Geschwindigkeit unverändert.

Der Sketch

#include <AFMotor.h>

// Für Ausgabe über seriellen Monitor auskommentieren
// verringert auf jeden Fall die Drehgeschwindigkeit (immer gleich)
// nur ohne DEBUG funktioniert die Geschwindigkeitssteuerung
// #define DEBUG

AF_Stepper motor(512, 1); // nach Datenblatt eingestellt

int PinTimeDown = 14;
int PinForward = 15;
int PinBackward = 16;
int PinTimeUp = 17;

int TimeUp = LOW;
int TimeDown = LOW;

int Forward = LOW;
int Backward = LOW;

int VelocityMin = 2; // ms
int VelocityMax = 52; // ms
int Velocity = VelocityMin; // ms

void setup()
{
// Taster einlesen
pinMode(PinTimeDown, INPUT);
pinMode(PinForward, INPUT);
pinMode(PinBackward, INPUT);
pinMode(PinTimeUp, INPUT);

// Stepper initialisieren
#ifdef DEBUG
Serial.begin(9600); // set up Serial library at 9600 bps
Serial.println(„Stepper Test!“);
#endif
motor.setSpeed(100);
}

void loop()
{
// Tasten einlesen
// Richtung
Forward = digitalRead(PinForward);
Backward = digitalRead(PinBackward);

// Geschwindigkeit
TimeUp = digitalRead(PinTimeUp);
TimeDown = digitalRead(PinTimeDown);

#ifndef DEBUG
delay(Velocity);
#endif
if (Forward != Backward)
{ // eine gültige eingabe!
if (Forward == HIGH)
{ // Stepper vorwärts bewegen
motor.onestep(FORWARD, SINGLE);
#ifdef DEBUG
Serial.println(„Stepper Vorwaerts!“);
#endif
}
if (Backward == HIGH)
{ // Stepper rückwärts bewegen
motor.onestep(BACKWARD,SINGLE);
#ifdef DEBUG
Serial.println(„Stepper Rueckwaerts!“);
#endif
}
}
if (TimeUp != TimeDown)
{
if (TimeUp == HIGH)
{
#ifdef DEBUG
Serial.println(„TimeUp!“);
#endif
if (Velocity < VelocityMax)
{
Velocity++;
}
#ifdef DEBUG
Serial.print(„Time = „);
Serial.println(Velocity,DEC);
#endif
}
if (TimeDown == HIGH)
{
#ifdef DEBUG
Serial.println(„TimeDown!“);
#endif
if (Velocity > VelocityMin)
{
Velocity–;
}
#ifdef DEBUG
Serial.print(„Time = „);
Serial.println(Velocity,DEC);
#endif
}
motor.setSpeed(100);
}
}

schrittmotorsteuerung1-screenshot
Ausführung mit #DEBUG

In der Ausführung
Die Taster wurden als HIGH Aktiv auf die analogen Ports 14(A0) bis 17(A3) gelegt. Die Zuordnung der Analogports zur digitalausgabe – Bibliothek war nicht so einfach herauszufinden. Mit dem DEBUG Schalter lassen sich die Print Ausgaben auf dem seriellen Monitor ausgeben (Werkzeuge -> serieller Monitor). Das ist sehr hilfreich zum Debuggen, in diesem Fall um zu sehen, ob die Tasten funktionieren. Die onestep Routine scheint nichtblockierend zu sein. Daher ist es sinnreich eine Wartezeit von mindestens 2ms einzuhalten, das entspricht der maximalen Geschwindigkeit. Das wurde manuell ausgetestet.

Achtung Verbrennungsgefahr!
Der Motor wird im Betrieb sehr heiß.

Links

Info zu Schrittmotorsteuerung
https://arduino-info.wikispaces.com/SmallSteppers

Anschluss eines Schrittmotors
https://www.adafruit.com/product/858

Adafruit Motorshield V1.0
https://learn.adafruit.com/adafruit-motor-shield/overview

Adafruit Motorshield V2.0
https://learn.adafruit.com/adafruit-stepper-dc-motor-featherwing/usage

Motordatenblatt 28BYJ-48
http://www.raspberrypi-spy.co.uk/wp-content/uploads/2012/07/Stepper-Motor-28BJY-48-Datasheet.pdf

Veröffentlicht von

Jürgen

Ich bin Software Ingenieur und habe meine Schwerpunkte in allen Aktivitäten, die zur Software Entwicklung gehören. Am längsten bin ich als Software Entwickler von Embedded Software in C tätig.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.