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