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