SMS - StepperMotorStage
Projekt mit ESP32, DRV8825, NEMA17, Switches zur LinearStage-Steuerung
Quellen
Mouser :
Datasheet DRV8825
texas instruments :
Produktseite DRV8825
starthardware.org :
StepperMotor mit dem DRV8825 steuern
Übersicht
Grundlage Elektronik-Modul-1: Esp32StepperMotorDRV8825
Esp32StepperMotorDRV8825 - Esp32UnoBoard mit DRV8825, NEMA17
Grundlage Elektronik-Modul-2: Esp32StepperMotorDRV8825Switch s
Esp32StepperMotorDRV8825Switch - Esp32UnoBoard mit DRV8825, NEMA17, Switches
Periodische Hin- und Herfahrt eines selbstgedruckten MotorStages
StepperMotorStage: NEMA17, DRV8255, Switches und LinearStage
1. Fahrt zum Endschalter: SwitchLimitHigh
• Nach dem Programmstart fährt der StepperMotor in positiver Richtung.
• Dies kann der Benutzer an der Drehrichtung des Motor-Zahnrads gegen den Uhrzeigersinn sehen.
• Der Distance-Counter zählt positiv und die Zahnstange bewegt sich aus unserer Sicht nach rechts.
• Anzeige: "Positive Direction", Heraufzählen des Distance-Counters
2. Ein-/Ausfahrt Endschalter: SwitchLimitHigh
• Sobald der linke LimitSwitch (SwitchLimitHigh) die Zahnstange verliert,
• meldet die Anzeige "SwitchLimitHigh: OFF" (der Distance-Counter beträgt ungefähr +3300steps).
• Sofort versucht die Zustandsmaschine den Motor in negativer Richtung mit
• Feinstschritt-Auflösung aus dem Endschalter LIMITHIGH herauszufahren.
• Aktiviert die Zahnstange den Endschalter beim Verlassen wieder,
• fährt der StepperMotor in negativer Richtung mit voller Geschwindigkeit.
• Anzeige: "Negative Direction", Herunterzählen des Distance-Counters.
3. Reference-Schalter: SwitchReference -> OFF
• Bei der Fahrt zum negativen Ende verliert der ReferenceSchalter (SwitchReference) die Zahnstange.
• Die Anzeige meldet: "SwitchReference: OFF", der Distance-Counter besitzt einen Zählstand um Null.
4. Fahrt zum Endschalter: SwitchLimitHigh
• Sobald der mittlere LimitSwitch (SwitchLimitLow) den Verlust der Zahnstange registriert,
• meldet die Anzeige "SwitchLimitLow: OFF" (der Distance-Counter beträgt ungefähr -3700steps).
• Der Motor versucht sofort in positiver Richtung mit FeinstSchrittAuflösung
• aus dem Endschalter LIMITLOW herauszufahren.
• Aktiviert die Zahnstange den Endschalter SwitchLimitLow wieder,
• fährt der Motor mit voller Geschwindigkeit weiter in positiver Richtung.
5. Reference-Schalter: SwitchReference -> ON
• Bei der Fahrt zum positiven Ende erfasst der ReferenceSchalter (SwitchReference) die Zahnstange.
• Die Anzeige meldet: "SwitchReference: ON", der Distance-Counter wird genullt und damit der
• der Nullpunkt der Distance-Messung neu definiert.
Damit wiederholen sich alle Ereignisse prinzipiell endlos entsprechend 1. bis 5.
Hardware
Entsprechend der "Grundlage Elektronik-Modul-2: Esp32StepperMotorDRV8825Switch" :
Esp32StepperMotorDRV8825Switch - Esp32UnoBoard mit DRV8825, NEMA17, Switches
wird der MotorStage mit seinen End- und Referenz-Schaltern verdrahtet (vgl. auch Übersichts-Video):
Verdrahtung: ESP32UnoBoard, DRV8255, NEMA17, Switches
Software
Das Programm "2207231702_Esp32StepperMotorStage_02V01" steuert den StepperMotor
mit gekoppeltem LinearStage voll automatisiert:
#include "Define.h"
//
#include "LCDisplayI2C.h"
#include "Switch.h"
#include "StepperDRV8825.h"
//
//
enum EMainAction
{
maIdle = 0,
maMovePositive = 1,
maMoveNegative = 2,
maLeaveLimitHigh = 3,
maExitLimitHigh = 4,
maLeaveLimitLow = 5,
maExitLimitLow = 6
};
//
EMainAction MainAction = maIdle;
long unsigned MillisPreset;
long int DistancePreset = 0L;
//
CLCDisplayI2C LCDisplayI2C(0x27, 4, 20);
long int TicksDisplay = 0;
//
void OnSwitchLimitHighChanged(EStateSwitch state);
void OnSwitchReferenceChanged(EStateSwitch state);
void OnSwitchLimitLowChanged(EStateSwitch state);
//
CStepperDRV8825 StepperDRV8825(PIN_MOTOR_STEP,
PIN_MOTOR_DIRECTION,
PIN_MOTOR_PRECISIONM0,
PIN_MOTOR_PRECISIONM1,
PIN_MOTOR_PRECISIONM2,
PIN_MOTOR_ENABLEN);
//
void Display(int row, int col, const char* text);
//
CSwitch SwitchLimitHigh(PIN_SWITCH_LIMITHIGH, false,
OnSwitchLimitHighChanged);
CSwitch SwitchReference(PIN_SWITCH_REFERENCE, false,
OnSwitchReferenceChanged);
CSwitch SwitchLimitLow(PIN_SWITCH_LIMITLOW, false,
OnSwitchLimitLowChanged);
//
void OnSwitchLimitHighChanged(EStateSwitch state)
{
switch (state)
{
case sswOff: // LSHigh opened!
SerialPC.println("\r\nSwitchLimitHigh: ..opened..");
Display(2, 0, "SwitchLimitHigh: OFF");
if (StepperDRV8825.IsOpened())
{
MainAction = maLeaveLimitHigh;
SerialPC.println("MainAction: LeaveLimitHigh");
SerialPC.println("StepperMotor: MoveNegative-LeaveLimitHigh");
StepperDRV8825.Move(sdNegative, srThirtyTwo,
STEPPERIOD_LIMIT_US, STEPCOUNT_FULL);
}
break;
case sswOn:
SerialPC.println("\r\nSwitchLimitHigh: __closed__");
Display(2, 0, "SwitchLimitHigh: ON ");
if (maLeaveLimitHigh == MainAction)
{
SerialPC.println("StepperMotor: Halt");
StepperDRV8825.Halt();
SerialPC.println("MainAction: ExitLimitHigh");
MainAction = maExitLimitHigh;
}
break;
default: //
SerialPC.println("nc");
break;
}
}
//
void OnSwitchReferenceChanged(EStateSwitch state)
{
switch (state)
{
case sswOff: // SR opened!
SerialPC.println("\r\nSwitchReference: ..opened..");
Display(2, 0, "SwitchReference: OFF");
if (StepperDRV8825.IsOpened())
{
SerialPC.println("StepScale: *** Negative ***");
}
break;
case sswOn:
SerialPC.println("\r\nSwitchReference: __closed__");
Display(2, 0, "SwitchReference: ON ");
if (StepperDRV8825.IsOpened())
{
SerialPC.println("StepScale: --- Zero Position ---");
StepperDRV8825.SetDistance(0L);
SerialPC.println("StepScale: *** Positive ***");
}
break;
default: //
SerialPC.println("nc");
break;
}
}
//
void OnSwitchLimitLowChanged(EStateSwitch state)
{
switch (state)
{
case sswOff: // LSLow opened!
SerialPC.println("\r\nSwitchLimitLow: ..opened..");
Display(2, 0, "SwitchLimitLow: OFF ");
if (StepperDRV8825.IsOpened())
{
MainAction = maLeaveLimitLow;
SerialPC.println("MainAction: LeaveLimitLow");
SerialPC.println("StepperMotor: MovePositive-LeaveLimitLow");
StepperDRV8825.Move(sdPositive, srThirtyTwo,
STEPPERIOD_LIMIT_US, STEPCOUNT_FULL);
}
break;
case sswOn:
SerialPC.println("\r\nSwitchLimitLow: __closed__");
Display(2, 0, "SwitchLimitLow: ON ");
if (maLeaveLimitLow == MainAction)
{
SerialPC.println("StepperMotor: Halt");
StepperDRV8825.Halt();
SerialPC.println("MainAction: ExitLimitLow");
MainAction = maExitLimitLow;
}
break;
default: //
SerialPC.println("nc");
break;
}
}
//----------------------------------------------------
void Display(int row, int col, const char* text)
{
LCDisplayI2C.SetCursor(row, col);
LCDisplayI2C.print(text);
}
//----------------------------------------------------
void setup()
{
SerialPC.begin(115200);
delay(333);
SerialPC.println("");
SerialPC.println("***************************");
SerialPC.println("* Esp32StepperMotorStage *");
SerialPC.println("* Version....: 02V01 *");
SerialPC.println("* DateTime...: 2207231648 *");
SerialPC.println("* Author.....: OMdevelop *");
SerialPC.println("***************************");
//
pinMode(PIN_LEDSYSTEM, OUTPUT);
digitalWrite(PIN_LEDSYSTEM, HIGH);
//
SwitchLimitHigh.Open();
SwitchReference.Open();
SwitchLimitLow.Open();
//
delay(100);
//
StepperDRV8825.Open();
DistancePreset = StepperDRV8825.GetDistance();
//
Wire.begin();
LCDisplayI2C.Init();
LCDisplayI2C.BacklightOn();
//
SerialPC.println("Initialisation done");
delay(333);
//
//
// 01234567890123456789
LCDisplayI2C.SetCursor(0, 0);
LCDisplayI2C.print("E32StepperMotorStage");
LCDisplayI2C.SetCursor(1, 0);
LCDisplayI2C.print("Version : 01V06 ");
LCDisplayI2C.SetCursor(2, 0);
LCDisplayI2C.print("DateTime: 2207152002");
LCDisplayI2C.SetCursor(3, 0);
LCDisplayI2C.print("Author : OMdevelop ");
delay(3000);
LCDisplayI2C.Clear();
Display(0, 0, "E32StepperMotorStage");
Display(1, 0, "Version : 01V06 ");
Display(2, 0, "Start Movement... ");
Display(3, 0, "Distance: stp");
//
MillisPreset = millis();
MainAction = maIdle;
SerialPC.println("MainAction: Idle");
//
TicksDisplay = millis();
}
void loop()
{
SwitchLimitHigh.Execute();
SwitchReference.Execute();
SwitchLimitLow.Execute();
StepperDRV8825.Execute();
//
if (DistancePreset != StepperDRV8825.GetDistance())
{
DistancePreset = StepperDRV8825.GetDistance();
SerialPC.printf("\r*** Distance: %+7ld", DistancePreset);
if (300 <= (millis() - TicksDisplay))
{
TicksDisplay = millis();
LCDisplayI2C.SetCursor(3, 9);
LCDisplayI2C.printf("%+6ld", DistancePreset);
}
}
//
if (ssIdle == StepperDRV8825.GetStateStep())
{
switch (MainAction)
{
case maIdle:
if (MILLIS_IDLE <= (millis() - MillisPreset))
{
MainAction = maMovePositive;
SerialPC.println("MainAction: MovePositive...");
SerialPC.println("StepperMotor: MovePositive");
StepperDRV8825.Move(sdPositive, srThirtyTwo,
STEPPERIOD_NORMAL_US, STEPCOUNT_FULL);
Display(2, 0, "Positive Direction..");
}
break;
//----------------------------------------------------------
case maMoveNegative:
break;
case maLeaveLimitLow:
break;
case maExitLimitLow:
MainAction = maMovePositive;
SerialPC.println("MainAction: MovePositive");
SerialPC.println("StepperMotor: MovePositive...");
StepperDRV8825.Move(sdPositive, srThirtyTwo,
STEPPERIOD_NORMAL_US, STEPCOUNT_FULL);
Display(2, 0, "Positive Direction..");
break;
//----------------------------------------------------------
case maMovePositive:
break;
case maLeaveLimitHigh:
break;
case maExitLimitHigh:
MainAction = maMoveNegative;
SerialPC.println("MainAction: MoveNegative");
SerialPC.println("StepperMotor: MoveNegative...");
StepperDRV8825.Move(sdNegative, srThirtyTwo,
STEPPERIOD_NORMAL_US, STEPCOUNT_FULL);
Display(2, 0, "Negative Direction..");
break;
}
}
}
//
Download des VSCode-Projekts: 2207231702_Esp32StepperMotorStage_02V01.zip
Programm-Terminal-Ausgabe: 2207231702_Esp32StepperMotorStage_02V01
WebSites
Project
Elektronik