meta data for this page
  •  
Übersetzungen dieser Seite:
  • de-informal

Dies ist eine alte Version des Dokuments!


Stepper-Motor ansteuern

zurück zur Übersicht

Bei einem Stepper-Motor können verschiedene Wicklungen im Motor einzeln angesteuert werden. Dadurch kann der Motor in Bruchteilen einzelner Umdrehungen bewegt werden. In Verbindung mit einem Getriebe entsteht dadurch die Möglichkeit, sehr feine Bewegungen vorzunehmen.
Der Stepper-Motor aus dem Beispiel verfügt über 4 getrennt voneinander ansteuerbare Wicklungen, weswegen auch das Board mit dem Steuerungsmodul für den Motor über 4 Anschlüsse verfügt.

Stepper-Motor_manually_minimal.ino
/*
 * PIN-Belegung:
 * Pins D0-D3 des NodeMCU an Pins IN1-IN4 am Motorboard
 * 
 * Motor dreht in der Schleife abwechselnd links und rechts herum.
 */
 
#define IN1 D0  // Input 1 am Motormodul
#define IN2 D1  // Input 2 am Motormodul
#define IN3 D2  // Input 3 am Motormodul
#define IN4 D3  // Input 4 am Motormodul
#define LEFT 0  // Richtungsangabe für Steppermotor
#define RIGHT 1  // Richtungsangabe für Steppermotor
 
// Forward Declarations
void init_stepper();
void step(int s);
int next_step(int currentStep, int currentDirection);
void test_stepper();
void init_echo();
void read_distance();
 
// Konstanten
const int positions[8][4] = { // Abbildung aller 8 Stellungen des
  {LOW, LOW, LOW, HIGH},      // Motors vor dem Getriebe durch
  {LOW, LOW, HIGH, HIGH},     // Beschaltung der 4 Motorwicklungen
  {LOW, LOW, HIGH, LOW},
  {LOW, HIGH, HIGH, LOW},
  {LOW, HIGH, LOW, LOW},
  {HIGH, HIGH, LOW, LOW},
  {HIGH, LOW, LOW, LOW},
  {HIGH, LOW, LOW, HIGH}
};
const float sndSpd = 0.034; // Schallgeschwindigkeit in cm pro us
 
// globale Variablen
int curStep = 0;  // aktueller Schrittzustand
int curDir = RIGHT;  // aktuelle Drehrichtung
long duration;  // Messdauer für Echolot
float distance; // Entfernung für Echolot
 
int curPos = 0;  // aktuelle Motorstellung
int gotoPos = 0; // gewünschte Motorstellung
 
 
/* ---------- main functions ---------- */
 
/**
 * setup
 */
void setup() 
{
  // Serielle Konsole
  Serial.begin(9600);
  Serial.println("Setup");
 
  // Stepper initialisieren
  pinMode(IN1, OUTPUT);
  pinMode(IN2, OUTPUT);
  pinMode(IN3, OUTPUT);
  pinMode(IN4, OUTPUT);
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
}
 
/**
 * loop
 */
void loop() 
{
  // rechts drehen
  for (int i = 0; i < 64; i++)
  {
    // Stellung 1
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 2
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 3
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 4
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 5
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 6
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, HIGH);
    delay(5);
    // Stellung 7
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delay(5);
    // Stellung 8
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delay(5);
  }
 
  // Motor stromlos schalten
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(1000);
 
  // links drehen
  for (int i = 0; i < 64; i++)
  {
    // Stellung 8
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delay(5);
    // Stellung 7
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, HIGH);
    delay(5);
    // Stellung 6
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, HIGH);
    delay(5);
    // Stellung 5
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 4
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, HIGH);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 3
    digitalWrite(IN1, LOW);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 2
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, HIGH);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(5);
    // Stellung 1
    digitalWrite(IN1, HIGH);
    digitalWrite(IN2, LOW);
    digitalWrite(IN3, LOW);
    digitalWrite(IN4, LOW);
    delay(5);
  }
  // Motor stromlos schalten
  digitalWrite(IN1, LOW);
  digitalWrite(IN2, LOW);
  digitalWrite(IN3, LOW);
  digitalWrite(IN4, LOW);
  delay(2000);
}

zurück zur Übersicht