sketch_69_esp_schrittmotor_steuern   (ESP8266 NodeMCU)

sketch_69_esp_schrittmotor_steuern
/*Anschluss des Schrittmotors 17HS13-0404S (Schrittwinkel 1,8 Grad) an ESP8266 NodeMCU V2 L293D Motor Shield.  
Terminal-Klemmen A- A+ und B- B+. 
Anschluss Akkupack 7,2 V (tatsaechl.Spannung bis 8V) an VM und GND.

Der Schrittmotor (Roboter-Drehung) kann in Positionen zwischen "0" und "100" bewegt werden (100 Schritte a 1,8 Grad).
"50" ist die Nullstellung, auch die Startposition. 
Der Roboterarm muss vor Einschalten manuell in diese Stellung gedreht werden. 
Im seriellen Monitor wird die neue Position eingegeben, z.B. "s100" ("s" fuer SchrittmotorDrehung).
Eingabe "s0" fuehrt zu -90 Grad und "s100" zu +90 Grad.
Durch Anwendung der Variablen "Position_alt" und "Position_neu" wird gewaehrleistet, dass bei jedem neuen Drehbefehl
kein Schritt verloren geht (stets richtiger Schaltzustand der Ausgaenge des L293D).
Es wird der Variablentyp byte verwendet, dadurch Begrenzung des Drehwinkels bei versehentlicher Fehleingabe. 
Die jeweilige neue Position wird auch im Serial Monitor angezeigt. 

Einstellung der effektiven Spannung an den Wicklungen und damit Strom und Drehmoment ueber PWM-Ausgaenge Pins D1,D2 
(max Wert ist 1023 , volle Spannung liegt an).
Beide Spulen sind immer eingeschaltet, in jeder Spule fliesst Strom.  
*/
#include "SchrittmotorDrehung.h"
byte Position_neu;
void setup()
{
  pinMode(D1, OUTPUT);                        // ENA PWM Wicklung A
  pinMode(D2, OUTPUT);                        // ENB PWM Wicklung B
  pinMode(D3, OUTPUT);                        // Drehrichtung Wicklung A
  pinMode(D4, OUTPUT);                        // Drehrichtung Wicklung B
  Serial.begin(9600);                         // Initialisierung Serial Monitor(beachte: muss auf 9600 eingestellt sein)
}
void loop()
{
  if (Serial.available() > 0)                 // Wenn Daten vom Serial Monitor da sind (d.h.eingegeben worden sind)...
  {
    int inByte = Serial.read();               // ...dann lies das erste Byte und speichere es in der Variable inByte
    switch (inByte)                           // und nimm den Wert, der uebertragen wurde, genauer unter die Lupe.
    {
      case 's':                               // wenn dieser das Zeichen (character) 's' fuer SchrittmotorDrehung ist...
        {
          Position_neu = Serial.parseInt();   // dann lies erstmal eine Zahl ein (wenn irgendetwas anderes kam, ist das Ergebnis 0)
          Serial.print ("Drehen auf Position: ");
          Serial.println (Position_neu);
          SchrittmotorDrehung();
          break;                              // hoere hier auf.
        }
      default:                                // bei unbekannten Kommandos machen wir einfach garnichts...
        break;
    }
  }
}
SchrittmotorDrehung.h
  extern byte Position_neu;             // neue Position aus dem Hauptprogramm (erneute Deklaration erforderlich) 
  byte Position_alt= 50;                // Startposition "50" bei 0 Grad 
  byte Schrittzeit = 20;                // Variable fuer delay ; 20ms entspricht Schrittfrequenz 50Hz (90 Grad in 1 Sek) 
  byte Status= 1;                       // Status 1...4 (PinsD3D4: HH,LL,LH,HL)
  
  void Status_1()
  {
  digitalWrite(D3,HIGH);
  digitalWrite(D4,HIGH); 
  delay(Schrittzeit);
  Status=1;
  }
  
  void Status_2()
  {
  digitalWrite(D3,LOW);
  digitalWrite(D4,HIGH); 
  delay(Schrittzeit);
  Status=2;
  }
  
  void Status_3()
  {
  digitalWrite(D3,LOW);
  digitalWrite(D4,LOW); 
  delay(Schrittzeit);
  Status=3;
  }
  
  void Status_4()
  {
  digitalWrite(D3,HIGH);
  digitalWrite(D4,LOW); 
  delay(Schrittzeit);
  Status=4;
  }
  
  void SchrittmotorDrehung()
  {
   analogWrite (D1,1023);
   analogWrite (D2,1023);
   int Schritte=Position_neu - Position_alt;
   Schritte=abs(Schritte);             // Bildung Absolutwert (wenn negativ entfaellt Vorzeichen) 
   for(byte i=0; i < Schritte; i++)
   {
    if(Status==1)
    {
     if(Position_neu-Position_alt>0)
     {
      Status_2(); 
     }
     else
     {
      Status_4(); 
     }
    }
    else if(Status==2)
    {
     if(Position_neu-Position_alt>0)
     {
      Status_3(); 
     }
     else
     {
      Status_1(); 
     }
    }
    else if(Status==3)
    {
     if(Position_neu-Position_alt>0)
     {
      Status_4(); 
     }
     else
     {
      Status_2(); 
     }
    }
    else if(Status==4)
    {
     if(Position_neu-Position_alt>0)
     {
      Status_1(); 
     }
     else
     {
      Status_3(); 
     }
    }
    
   }
   Position_alt= Position_neu; 
   analogWrite (D1,1023);              // nach Ende Drehung koennte Strom reduziert werde, aber Motor pfeift 
   analogWrite (D2,1023);
  }