Zur Abwechslung mal etwas „mechanisches“: eine Schrittmotorsteuerung.
Die Komponenten
– ein UNO Board
– ein Steppershield V1.0
– 4 Tasten (Einschalter)
– ein Stepper Motor 28BYJ-48
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);
}
}
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
Klicke, um auf Stepper-Motor-28BJY-48-Datasheet.pdf zuzugreifen