/*
  Einstellungen am TB6600 für 6400 Schritte pro Umdrehung
  und für den Nema 17 Motor mit 1,0 bis 1,2 Amp.
  Dippschalter 6   5   4   3   2   1
  Stellungen   0n  off on  off off off
  und für den Nema 17 Motor mit 1,5 bis 1,7 Amp.
  Dippschalter 6   5   4   3   2   1
  Stellungen   off on  on  off off off
*/
#include <Wire.h> // Kommunikation mit Arduino IDE
#include <LiquidCrystal_I2C.h> // LCD Display

// LCD Display´s haben Adresse 0x27 oder 0x3F !!
LiquidCrystal_I2C lcd(0x27, 2, 1, 0, 4, 5, 6, 7, 3, POSITIVE);
#define BAUD (115200)
//------Steuerung für den ersten Schrittmotor------------------
word x1 = 0;
word schritte1 = 6400;
byte richtung1 = HIGH;
byte schrittposition1 = 0;
// Der Microwert für pwzeit & whzeit nicht unter 200 !
unsigned long pwablauf1 = 0;// Pulswechselablaufzeit1
unsigned long whablauf1 = 0;// Wiederhohlablaufzeit1
unsigned long rampenstart1 = 500;
unsigned long rampenende1 = 50;
word rampenrichtung1 = 1;
unsigned long mini1 = rampenstart1;
unsigned long maxi1 = rampenende1;
byte enable1 = 6;
byte dir1 = 5;
byte pul1 = 4;
//--------------------------------------------------------------
//------Steuerung für den zweiten Schrittmotor------------------
word x2 = 0;
word schritte2 = 6400;
byte richtung2 = HIGH;
byte schrittposition2 = 0;
// Der Microwert für pwzeit & whzeit nicht unter 200 !!
unsigned long pwablauf2 = 0;// Pulswechselablaufzeit2
unsigned long whablauf2 = 0;// Wiederhohlablaufzeit2
unsigned long rampenstart2 = 500;
unsigned long rampenende2 = 50;
word rampenrichtung2 = 1;
unsigned long mini2 = rampenstart2;
unsigned long maxi2 = rampenende2;
byte enable2 = 10;
byte dir2 = 9;
byte pul2 = 8;
//--------------------------------------------------------------
void setup()
{
  Wire.begin();
  lcd.begin(20, 4);  // initialize the lcd for 20 chars 4 lines, turn on backlight
  lcd.backlight();   // LCD Beleuchtung ein
  lcd.clear();
  lcd.setCursor(0, 0);
  lcd.print("Motor1 ");
  lcd.print(schritte1);
  lcd.print(" Schritte");
  lcd.setCursor(0, 1);
  lcd.print("Tempo1 ");
  lcd.print(rampenstart1);
  lcd.print("-");
  lcd.print(rampenende1);
  lcd.print(" Micro");
  lcd.setCursor(0, 2);
  lcd.print("Motor2 ");
  lcd.print(schritte2);
  lcd.print(" Schritte");
  lcd.setCursor(0, 3);
  lcd.print("Tempo2 ");
  lcd.print(rampenstart2);
  lcd.print("-");
  lcd.print(rampenende2);
  lcd.print(" Micro");
  //----------Steuerpins für den ersten Treiber aktivieren-------
  Serial.begin(BAUD);
  pinMode(enable1, OUTPUT); // Enable1
  pinMode(dir1, OUTPUT); // Step1
  pinMode(pul1, OUTPUT); // Dir1
  digitalWrite(6, LOW); // Set Enable1 low
  //---------------------------------------------------------------
  //----------Steuerpins für den zweiten Treiber aktivieren--------
  pinMode(enable2, OUTPUT); // Enable2
  pinMode(dir2, OUTPUT); // Step2
  pinMode(pul2, OUTPUT); // Dir2
  digitalWrite(enable2, LOW); // Set Enable2 low
  //---------------------------------------------------------------
}

void loop()
{
  //---------------------------------------------------------------------
  //----------Treiber eins aktivieren------------------------------------
  //---------------------------------------------------------------------
  digitalWrite(enable1, HIGH); // Set Enable high
  digitalWrite(dir1, richtung1); // Set Dir
  if (x1 < schritte1)    // Ziel noch nicht erreicht?
  {
    //----------------------Motor 1----------------------------------------
    //---------------------Schritt 0---------------------------------------
    if ((schrittposition1 == 0) && (micros() - whablauf1 >= mini1)) {
      digitalWrite(pul1, HIGH); // Step auf high
      schrittposition1 = 1;  // Steuerung für Schritt 1 einstellen
      pwablauf1 = micros(); // Timer für Schritt 1 starten
    }
    //----------------------Motor 1----------------------------------------
    //---------------------Schritt 1---------------------------------------
    if ((schrittposition1 == 1) && (micros() - pwablauf1 >= mini1)) {
      digitalWrite(pul1, LOW); // Step auf low
      schrittposition1 = 0;  // Steuerung für Schritt 0 einstellen
      whablauf1 = micros(); // Timer für Schritt 0 starten
      x1++;
      //-----------------------------------------------------------------
      //-----------------Rampensteuerung Motor1--------------------------
      if (x1 <= rampenstart1) {
        rampenrichtung1 = HIGH;
      } else {
        rampenrichtung1 = LOW;
      }
      if (rampenrichtung1 == HIGH) {
        if (mini1 > maxi1) {
          mini1 = mini1 - 1; // Rampe für Motor 1 Gas geben
        }
      }
      if (rampenrichtung1 == LOW) {
        if (x1 + rampenstart1 > schritte1) {
          mini1 = mini1 + 2; // Rampe für Motor 1 bremsen
        }
      }
      //-----------------------------------------------------------------
    }
  }
  //-------------------------Motor 1-------------------------------------
  //----------------------Ziel erreicht ?--------------------------------
  if (x1 == schritte1) {
    x1 = 0;
    richtung1 = !richtung1; // Dir Richtung wechseln
    mini1 = rampenstart1; //Rampe für Motor 1 Neustart
    mini2 = rampenstart2; //Rampe für Motor 2 Neustart
  }
  //---------------------------------------------------------------------


  //---------------------------------------------------------------------
  //----------Treiber zwei aktivieren------------------------------------
  //---------------------------------------------------------------------
  digitalWrite(enable2, HIGH); // Set Enable high
  digitalWrite(dir2, richtung2); // Set Dir
  if (x2 < schritte2)    // Ziel noch nicht erreicht?
  {
    //----------------------Motor 2--------------------------------------
    //---------------------Schritt 0-------------------------------------
    if ((schrittposition2 == 0) && (micros() - whablauf2 >= mini2)) {
      digitalWrite(pul2, HIGH); // Step auf high
      schrittposition2 = 1;  // Steuerung für Schritt 1 einstellen
      pwablauf2 = micros(); // Timer für Schritt 1 starten
    }
    //----------------------Motor 2--------------------------------------
    //---------------------Schritt 1-------------------------------------
    if ((schrittposition2 == 1) && (micros() - pwablauf2 >= mini2)) {
      digitalWrite(pul2, LOW); // Step auf low
      schrittposition2 = 0;  // Steuerung für Schritt 0 einstellen
      whablauf2 = micros(); // Timer für Schritt 0 starten
      x2++;
      //-----------------------------------------------------------------
      //-----------------Rampensteuerung Motor2--------------------------
      if (x2 <= rampenstart2) {
        rampenrichtung2 = HIGH;
      } else {
        rampenrichtung2 = LOW;
      }
      if (rampenrichtung2 == HIGH) {
        if (mini2 > maxi2) {
          mini2 = mini2 - 1; // Rampe für Motor 1 Gas geben
        }
      }
      if (rampenrichtung2 == LOW) {
        if (x2 + rampenstart2 > schritte2) {
          mini2 = mini2 + 2; // Rampe für Motor 1 bremsen
        }
      }
      //----------------------------------------------------------------
    }
  }
  //-------------------------Motor 2------------------------------------
  //----------------------Ziel erreicht ?-------------------------------
  if (x2 == schritte2) {
    x2 = 0;
    richtung2 = !richtung2; // Dir Richtung wechseln
    delay(1000); // Eine Sekunde Pause
  }
  //--------------------------------------------------------------------
}