meta data for this page
- de-informal
Dies ist eine alte Version des Dokuments!
Stepper-Motor ansteuern
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); }