Kreuztisch mit Schrittmotoren bestücken

Fertige Geräte mit Bilden, Schaltungen, Programmen vorstellen.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe mal zum Testen den Frästisch mit der Tischbohrmaschine verbunden. So könnte ich dann Bohrloch-Positionen automatisch anfahren. Muss ich mal testen. Und ich besorge mir mal ein paar Fräser, um zu sehen, ob ich mit den gerade mal 2800 Umdrehungen auch ein bischen fräsen könnte, wenn auch langsam. Aber alte Leute haben Zeit :(oo):

Hier das Bild, des ersten Versuchs:
.
Frästisch_Bohrmaschine.jpg
Frästisch_Bohrmaschine.jpg (294.51 KiB) 1420 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Soooo, Satz mit "x", war wohl nix. Die Scheppach Bohrmaschine hat ein Schnellwechselfutter mit Konus. Wenn ich da werend dess Lauf´s eine seitliche Kraft auf den Fräser/Bohrer bringe. Löst sich der Konus und das Borhrfutter fliegt mir um die Ohren. :(o): :(o): Also ich kann diese Einrichtung so wie sie ist, nur zum schnellen gezielten Bohren verwenden.

Franz
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Max »

Hallo Franz,
Löst sich der Konus und das Borhrfutter fliegt mir um die Ohren.
das mit dem Bohrfutter verstehe ich aber nicht. Das Futter hat doch
einen MK2 Schaft? Dieser hält normalerweise schon mindestens einen
6mm Schaftfräser in Seitwärtsbewegung.'
Vielleicht ist der Vorschub der Schrittmotoren zu schnell.
Falls ich mal zu faul zum Umspannen bin, fräse ich auch schnon mal mit
8mm in Alu mit dem Bohrfutter. Der Maschinenkonus muss natürlich sauber und unbeschädigt sein.
Das Bohrfutter mit einem Kunststoffhammer oder Aluhammer leicht in den Konus klopfen,
sorgt ebenfalls für einen guten Halt.

Gruß
Max
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Max hat geschrieben: Do 17. Nov 2022, 16:47 Der Maschinenkonus muss natürlich sauber und unbeschädigt sein.
Das Bohrfutter mit einem Kunststoffhammer oder Aluhammer leicht in den Konus klopfen,
sorgt ebenfalls für einen guten Halt.
Hallo Max.
Danke dir für die Info. Die Maschine ist nagelneu. Dann mache ich das mit dem Hämmerchen. Bin gespannt ob es funktioniert. Ich habe mir extra für den Anfang nur Holz genommen. Aber nach den ersten Millimetern war Feierabent. Das teste ich morgen, danke.

Franz

PS: Der Fräser ist sicher auch nicht der Hit. EIn Fräser für Holz, Messing, Kupfer. Von Alu steht da nichts. Der einzige den es dort gab war ein 5mm. Aber ok, ich mache es mal mit ganz wenig Vorschub.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe inzwischen übrigens mal das Bohrfutter mit dem Holzhammer und als das nicht ging, auch mit einem leichte Metalhammer befestigt. Aber trotzdem, keine Chanche. Ich habe das Vorhaben aufgegeben. :roll: Oder sagen wir mal vertagt. :)
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe die Software für meinen Kreuztisch ein wenig ändern müßen, weil ich die zwei Anschlusspins die zu Tasten im Basisgerät und zu Tasten im externen Steuergerät gehen getauscht habe. Ich habe die Verdrahtung im Basis-Steuergerät ein bischen verfeinert habe. Mir hat es nicht gefallen, dass ich zu den Steuergeräte mit einzeln gesteckten Drähten gagangen bin, und habe jetzt umgebaut dass ich mit 3-Pol. und mit 5.Pol. Steckern zum Joystik und anderen Steuergeräten gehen kann. Das sind stabielere Steckverbindungen.

Daher also hier das aktuelle Programm. Aber wenn man es benutzt hat mal kein Problem, wenn man die Verdrahtungs-Änderung nicht auch macht. Die beiden Anschlusspunkte sind für zwei Tasten an verschiedenen Stellen, die aber das selbe machen. Deshalb merkt man die Änderung nicht. Nur wenn man mal die Fuktion eine der beiden Tasten ändern will, merkt man es, weil man dann die falsche Taste ändert. :(o): Ich habe übrigens jeder der beiden Tasten einen eigenen Port gegeben, weil ich noch in der Entwiklung des Gerätes war, und noch offen war, ob ich die Starttaste wirklich im Bedienteil und in der Basissteuerung brauchte. Wenn ich beide Tasten auf dem selben Port angeschlossen hätte, müßte man bei der Änderung der Funktion einer der beiden Tasten, wieder die Verdrahtung ändern. Wenn jede Taste ihren eigenen Port hat, kann man den einfach umprogrammieren und muss nichts umverdrahten.

Code: Alles auswählen

/*
  ################################################################################################################
  +++++++++++++++++++++++++++++++Kreuztisch_Pr._V3.6 vom 20.05.2023+++++++++++++++++++++++++++++++++++++++++++++++
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  programm 3.6 ist keine große Änderung, da habe ich nur A7 und A8 getauscht, weil ich bei mir 
  die Verdrahtung der beiden Punkte in der Steuerung geändert habe. Da die beiden Punkte die 
  selbe Funktion haben merkt man es nicht. 
  Kreuztisch Steuerung mit Schrittmototoren erstellt mit der Mobatools Lib. die ich sehr empfehlen kann.
  Die Fahrdaten werden mit Excel eingegeben, auf eine SD-Karte mit Trennung durch Semikolon exportiert,
  und vom Arduino wieder ausgelesen.
  Die beötigten Daten in einer Fahrdaten Zeile sind:
  Position 1: Motor / Achse 1 - 3 für X, Y, Z
  Position 2: Fahren ja / nein. Im Moment immer 1
  Position 3: Dir, also rechts / links = 1 - 2
  Position 4: Tempo 1 - 1000
  Position 5: Schritte 1 - 250000
  Das ist die Version 3.2 als erster Lauffähiger Code.
  Die Pins des Kartenlesers sind beim Arduino Mega:
  Miso Pin 50
  Mosi Pin 51
  SCK Pin 52
  CS Pin 53
  GND und VCC 5 Volt natürlich auch noch.
  Der Kartenleser macht Karten bis 32GB
  Mit FAT16/FAT32-Partition
  Wenn die Fahrgeschwindigkeit zu gering ist, kann man in der Lib.Datei "MobaTools.h"
  "#define CYCLETIME       200" ändern auf "#define CYCLETIME       100"
  Dann das Programm nochmal neu auf den Arduino übertragen.
  !!!Achtung!!! die Mobatools.d ist dann für dieses Programm i.O.
  aber muss danach wieder in den ursprünglichen Zustand versetzt werden !!
  Wir belegen mit SPI und I2C mindestens 27-30 Pin´s also fallen kleinere Arduinos aus.
  Im Moment sind es nur 23 Pin´s aber für Spindel ein/aus, Kühlung, Absaugung,
  sollte man sich die Möglichkeit offen halten. Also lieber mit 30 rechnen!!!
  Ich habe immer gerne Luft nach oben, wenn ich was baue.
  ###############################################################################################################
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---SD Kartenleser-------------------------------
#include <SPI.h>
#include <SD.h>
File myFile;

byte gelesen = 0;
const byte chipSelectPin = 53;
const String filename = "Mappe1.csv";
char zeilenBuffer[30];
char auswerteBuffer[6][8];
byte automatik = 0;
//----------------Sonderzeichen-------------------
#define OHM   "\xF4"    // Zeichen für Ohm
#define AE    "\xE1"    // Zeichen für "ä"
#define OE    "\xEF"    // Zeichen für "ö"
#define SS    "\xE2"    // Zeichen für "ß"
#define OBEN    "\x5E"    // Zeichen für "hoch"
#define RECHTS   "\176" // Pfeil nach rechts
#define LINKS   "\177"  // Pfeil nach links
#define UE  "\365"      // Zeichen für "ü"
#define GRAD  "\337C"   // Zeichen für "Grad" Celsius
//------------------------------------------------
#define MAX8BUTTONS // spart Speicher, da nur 8 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
// Pindefinitions - change to your needs
//----------Motor 1-------------------------------
const byte dirPin1       = 5;
const byte stepPin1      = 4;
const byte enaPin1       = 6;
//----------Motor 2-------------------------------
const byte dirPin2       = 9;
const byte stepPin2      = 8;
const byte enaPin2       = 10;
//----------Motor 3-------------------------------
const byte dirPin3       = 44;
const byte stepPin3      = 43;
const byte enaPin3       = 45;
//----------Taster--------------------------------
const byte button1Pin   = A1; //---Motor1 links--- Joystick
const byte button2Pin   = A2; //---Motor1 rechts-- Joystick
const byte button3Pin   = A3; //---Motor2 links--- Joystick
const byte button4Pin   = A4; //---Motor2 rechts-- Joystick
const byte button5Pin   = A5; //---Motor3 links--- Basis
const byte button6Pin   = A6; //---Motor3 rechts-- Basis
const byte button7Pin   = A7; //---Programm Start--- Basis
const byte button8Pin   = A8; //---Programm Start im Bedienteil
//--------------Taste zum Entsperren, wenn Stopp durch fahren==0
const byte entsperrtaste = A9; // Taste "Weiter" nach Bohrstopp, im Bedienteil
//----------Tempo_Poti---------------------------------------------------------------
const byte potPin       = A0;   // Poti muss ein analoger Eingang sein
const int STEPS_REVOLUTION = 1600;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster02 300ms aussetzen
const unsigned long Pausezeit01 = 1000;
//--------Fahrdaten------------------------------------------------------------------
byte motor = 0;               // Achsenauswahl 1-2-3 ist X-Y-Z
byte fahren = 1;              // Motoren bewegen
byte richtung = 0;            // Richtung der Bewegung 1 oder 2
int tempo1 = 0;               // Tempo für Handsteuerung, wird vom Poti eingestellt
int tempo2 = 0;               // Tempo zum Fräsen
int tempo = 0;                // Wird vom Programm zur übergabe benutzt
float mm = 0;
float multiplikator = 25;
float teiler = 10000;
long schritte = 0;   // Schritte die der Motor fahren soll
//-----------------------------------------------------------------------------------
//Stepper einrichten ( 1600 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepperX( STEPS_REVOLUTION, STEPDIR );  // 1600 Steps/ Umdrehung
MoToStepper myStepperY( STEPS_REVOLUTION, STEPDIR );  // 1600 Steps/ Umdrehung
MoToStepper myStepperZ( STEPS_REVOLUTION, STEPDIR );  // 1600 Steps/ Umdrehung
// Taster einrichten
// Den Tasternamen die Indizes 0...7 zuordnen
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 };
// muss als byte definiert sein, damit ein enfaches sizeof funktioniert
const byte buttonPins[] = { button1Pin, button2Pin, button3Pin, button4Pin, button5Pin, button6Pin, button7Pin, button8Pin};
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
// the speed pot ist read only every 'speedintervall' ms

int vspeed = 0;                 //Steppergeschwindigkeit in U/min*10
//==============================================================================================================
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(entsperrtaste, INPUT_PULLUP); // Eingang für Entsaperrtaste
  //-----------------------------Motor 1----------------------------------------------------
  myStepperX.attach( stepPin1, dirPin1 );
  myStepperX.attachEnable( enaPin1, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperX.setSpeed( 200 );
  myStepperX.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );                  // 100ms Tickerzeit
  //------------------------------Motor 2-----------------------------------------------------
  myStepperY.attach( stepPin2, dirPin2 );
  myStepperY.attachEnable( enaPin2, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperY.setSpeed( 200 );
  myStepperY.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  //-----------------------------Motor 3------------------------------------------------------
  myStepperZ.attach( stepPin3, dirPin3 );
  myStepperZ.attachEnable( enaPin3, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperZ.setSpeed( 200 );
  myStepperZ.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  //------------------------------------------------------------------------------------------
  //----------CD_Kartenleser aktivieren-------------------------------------------------------
  pinMode(SS, OUTPUT);
  while (!Serial);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelectPin)) // Ist SD Karte nicht ansprechbar?
  {
    Serial.println("Initialisierung fehlgeschlagen!");
    lcd.setCursor (0, 0);
    lcd.print(F("!! Karten_Fehler !!"));
    while (1); // Wenn Karte nicht ansprechbar, ist hier Programm Ende !!!
  }
  lcd.setCursor (0, 1);
  lcd.print(F("                   "));
  lcd.setCursor (0, 1);
  lcd.print(F(" Karte ist bereit! "));
  //-----------------------------------------------------------------------------------------
}
//=============================================================================================================
void loop() {
  lcd.setCursor (0, 0);
  lcd.print(F("Kreuztisch_Pr._V3.5 "));
  //------SD_Karte öffnen zum Lesen-------------------------------------------------------
  if (automatik == 1)
  {
    lcd.setCursor (0, 2);
    lcd.print(F("  Automatik l"AE"uft  "));
    lcd.setCursor (0, 3);
    lcd.print(F("                   "));
    lcd.setCursor (0, 1);
    lcd.print(F("                   "));
    myFile = SD.open(filename);
    if (myFile)
    {
      while (myFile.available())
      {
        if (fahren == 1)
        {
          leseZeile();
          ausgabeZeile();
          teileZeile();
          ausgabeWerte();
        }
        else {
          // ---------------Ist Taste Weiter gedrückt??---------------------------------
          if (digitalRead(entsperrtaste) == 0)
          {
            fahren = 1;
            lcd.setCursor (0, 2);
            lcd.print(F("    Weiterfahren   "));
          }
        }
      }
      // schließe die Datei:
      myFile.close();
      //Serial.println(F(" geschlossen!"));
      automatik = 0;
      lcd.setCursor (0, 2);
      lcd.print (F("                    "));
      lcd.setCursor (0, 2);
      lcd.print (F(" Karte abgearbeitet "));
    }
    else
    {
      // Wenn die Datei nicht geöffnet wurde, drucke einen Fehler :
      //Serial.print("Fehler beim öffnen von ");
      //Serial.println(filename);
    }
  }
  //--------------------------------------------------------------------------------------
  button.processButtons();          // Taster einlesen und bearbeiten

  // Speed alle 100ms neu einlesen und setzen
  if ( speedIntervall.tick() ) {
    // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 1800);  //Poti mappen auf 2 ... 180 Umdr/Min
    //min speed =2 and max speed =180 rpm
    tempo1 = vspeed;
    tempo = tempo1;
    if (millis() - Sekundenablauf01 >= Pausezeit01)  // 1000msec abgelaufen?
    {
      lcd.setCursor (0, 3);
      lcd.print (F("  VSPEED = "));
      lcd.setCursor (12, 3);
      lcd.print (F("     "));
      lcd.setCursor (12, 3);
      lcd.print (vspeed);
      Sekundenablauf01 = millis();
    }
    myStepperX.setSpeed( tempo );
    myStepperY.setSpeed( tempo );
    myStepperZ.setSpeed( tempo );
  }
  //----------------------------------------------------------------
  // Drehen Motor1 rechtsrum
  if (button.pressed(Button1) ) {
    //Taster1 gedrückt
    tempo = tempo1;
    myStepperX.rotate( 1 );          // Stepper1 dreht vorwärts
  }
  if ( button.released(Button1) ) {
    //Taster1 losgelassen
    myStepperX.rotate(0);             // Stepper1 stoppt
  }

  //Drehen Motor1 linksrum
  if (button.pressed(Button2) ) {
    //Taster2 gedrückt
    tempo = tempo1;
    myStepperX.rotate( -1 );         // Stepper1 dreht rückwärts
  }
  if ( button.released(Button2) ) {
    //Taster2 losgelassen
    myStepperX.rotate(0);    // Stepper1 stoppt
  }
  //-----------------------------------------------------------------
  // Drehen Motor2 rechtsrum
  if (button.pressed(Button3) ) {
    //Taster3 gedrückt
    tempo = tempo1;
    myStepperY.rotate( 1 );          // Stepper2 dreht vorwärts
  }
  if ( button.released(Button3) ) {
    //Taster3 losgelassen
    myStepperY.rotate(0);            // Stepper2 stoppt
  }

  //Drehen Motor2 linksrum
  if (button.pressed(Button4) ) {
    //Taster4 gedrückt
    tempo = tempo1;
    myStepperY.rotate( -1 );         // Stepper2 dreht rückwärts
  }
  if ( button.released(Button4) ) {
    //Taster4 losgelassen
    myStepperY.rotate(0);            // Stepper2 stoppt
  }
  //-----------------------------------------------------------------
  // Drehen Motor3 rechtsrum
  if (button.pressed(Button5) ) {
    //Taster5 gedrückt
    tempo = tempo1;
    myStepperZ.rotate( 1 );          // Stepper3 dreht vorwärts
  }
  if ( button.released(Button5) ) {
    //Taster5 losgelassen
    myStepperZ.rotate(0);             // Stepper3 stoppt
  }

  //Drehen Motor3 linksrum
  if (button.pressed(Button6) ) {
    //Taster6 gedrückt
    tempo = tempo1;
    myStepperZ.rotate( -1 );         // Stepper3 dreht rückwärts
  }
  if ( button.released(Button6) ) {
    //Taster6 losgelassen
    myStepperZ.rotate(0);            // Stepper3 stoppt
  }
  if (button.pressed(Button7) ) {
    //Taster7 gedrückt
    automatik = 1;                  // Automatik von SD Karte starten
  }
  if ( button.released(Button7) ) {
    //Taster7 losgelassen
  }
  if (button.pressed(Button8) ) {
    //Taster8 gedrückt
    automatik = 1;                  // Automatik von SD Karte starten
  }
  if ( button.released(Button8) ) {
    //Taster8 losgelassen
  }
  //-----------------------------------------------------------------

}
//=========================================================================================
void leseZeile()
{
  char myChar = '\0';
  static byte bufferPosition = 0;
  if (bufferPosition == 0) memset(zeilenBuffer, '\0', sizeof(zeilenBuffer));
  while (myFile.available() && myChar != '\n')
  {
    myChar = myFile.read();
    if (isPrintable(myChar))
    {
      zeilenBuffer[bufferPosition] = myChar;
      bufferPosition++;
    }
  }
  // Hier ist ZeilenEnde / DateiEnde
  bufferPosition = 0;
}
//=========================================================================================
void ausgabeZeile()
{
  Serial.print(F("eingelesene Zeile ist: "));
  Serial.println(zeilenBuffer);
}
//=========================================================================================
void teileZeile()
{
  // zeilenbuffer in auswerteBuffer umschreiben
  memset(auswerteBuffer, '\0', sizeof(auswerteBuffer) / sizeof(auswerteBuffer[0]));
  strcpy (auswerteBuffer[0], strtok(zeilenBuffer, ";"));
  strcpy (auswerteBuffer[1], strtok(NULL, ";"));
  strcpy (auswerteBuffer[2], strtok(NULL, ";"));
  strcpy (auswerteBuffer[3], strtok(NULL, ";"));
  strcpy (auswerteBuffer[4], strtok(NULL, ";"));
  strcpy (auswerteBuffer[5], strtok(NULL, ";"));
  //Serial.println(F("Puffer geteilt!"));
}
//========================================================================================
void ausgabeWerte()
{
  for (byte b = 0; b < sizeof(auswerteBuffer) / sizeof(auswerteBuffer[0]); b++)
  {
    //Serial.print(F("Wert "));
    //Serial.print(b);
    //Serial.print(F(" ist: "));
    //Serial.println(auswerteBuffer[b]);
    motor = atoi(auswerteBuffer[0]);
    fahren = atoi(auswerteBuffer[1]);
    richtung = atoi(auswerteBuffer[2]);
    tempo = atoi(auswerteBuffer[3]);
    myStepperX.setSpeed(tempo);
    myStepperY.setSpeed(tempo);
    myStepperZ.setSpeed(tempo);
    mm = atoi(auswerteBuffer[5]);
    schritte = (mm * 10000) / 25;
    if (b == 0)
    {
      lcd.setCursor (0, 3);
      lcd.print(F("                    "));
      lcd.setCursor (0, 0);
      lcd.print(F("                    "));
      //----Display Motor1-------------
      if (motor == 1)
      {
        lcd.setCursor (1, 0);
        lcd.print("Mot X");
        lcd.print (F(" "));
        if (richtung == 1)
        {
          lcd.print(F(RECHTS));
        }
        if (richtung == 2)
        {
          lcd.print(F(LINKS));
        }
      }
      //----Display Motor2-------------
      if (motor == 2)
      {
        lcd.setCursor (1, 0);
        lcd.print("Mot Y");
        lcd.print (F(" "));
        if (richtung == 1)
        {
          lcd.print(F("v"));
        }
        if (richtung == 2)
        {
          lcd.print(F(OBEN));
        }
      }
      //----Display Motor3-------------
      if (motor == 3)
      {
        lcd.setCursor (1, 0);
        lcd.print("Mot Z");
        lcd.print (F(" "));
        if (richtung == 1)
        {
          lcd.print(F(OBEN));
        }
        if (richtung == 2)
        {
          lcd.print(F("v"));
        }
      }
      lcd.print (F(" "));
      lcd.print(mm);
      lcd.print("mm");
    }
    //-------------Motor 1 fahren------
    if (motor == 1)
    {
      if (richtung == 1)
      {
        myStepperX.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperX.doSteps(-schritte);
      }
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
    //-------------Motor 2 fahren------
    if (motor == 2)
    {
      if (richtung == 1)
      {
        myStepperY.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperY.doSteps(-schritte);
      }
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
    //------------Motor 3 fahren-------
    if (motor == 3)
    {
      if (richtung == 1)
      {
        myStepperZ.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperZ.doSteps(-schritte);
      }
      if (fahren == 0)
      {
        lcd.setCursor (0, 2);
        lcd.print(F(" --- BOHRSTOPP --- "));
      }

      motor = 0;
      richtung = 0;
      schritte = 0;
    }
  }//---------fahren ende-----------------
  while (myStepperX.moving() > 0) {}
  while (myStepperY.moving() > 0) {}
  while (myStepperZ.moving() > 0) {}
}
.
Schrittmotoren_am_Kreuztisch.JPG
Schrittmotoren_am_Kreuztisch.JPG (597.71 KiB) 842 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich baue den Kreuztisch gerade nochmal neu auf. Die Nema 23 Motoren hatten manchmal Schrittverluste, weil so ein Gusseisener Tisch mit seinen Gusseisen Schienen doch dann, wenn man ihn eine Zeit lang nicht benutzt schwergängiger wird. Jetzt habe ich an beiden Motoren jeweils ein 10:1 Planetengetriebe dran gebaut. OK, jetzt ist der Tisch langsammer, und ich muss dann, wenn ich das Ding wieder Mechanisch aufgebaut habe, Testen mit welcher Schrittweite ich dann fahre. Ich hatte 1600 Schritte pro Umdrehung, habe jetzt schon mal 800 Schritte getestet und überlege, ob ich sogar auf 400 Schritte runter gehe. Aber jetzt muss ich erst mal mechanisch fertig aufbauen.

Kommende Woche bekomme ich das Alumaterial, dass ich alles neu aufbauen kann.

Servus, bis dahin.
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe jetzt schon mal 400 Schritte getestet. Es scheint gut zu funktionieren.
Mit dem Getriebe 10:1 ist es dann 4000 Schritte eine Umdrehung.
Bei dem Tisch ist eine Umdrehung 4mm. Das heißt 1mm ist 1000 Schritte, oder 1 Schritt ist 0,001 mm !!
Der Tisch kann in der Länge 0 - 330mm fahren. Dann sind 330mm 330.000 Schritte. Also sehr einfach umzurechnen.
Wenn ich ihn in den nächten Tagen wieder fertig habe, werde ich das ausmessen. Dann lasse ich den Tisch eine Std. lang hin und her laufen und er sollte dann am Ende trotzdem wieder ganz genau am Startpunkt enden. So er keine Schritte verliert. :(o): :(o):

Ohne die Getriebe waren es 1600 Schritte = eine Umdrehung für 4mm. Also 1mm 400 Schritte, oder 1 Schritt = 0,0025mm.
Jetzt mit Getriebe sind es 4000 Schritte = eine Umdrehung für 4mm. Also 1mm 1000 Schritte, oder 1 Schritt = 0,001mm.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

So, heute habe ich den Kreuztisch wieder Motorisiert mit den neuen 10:1 Planetengetrieben. Morgen muss ich noch ein bischen was befestigen, heute wars mir da draußen eindeutig zu kalt. :???:
Die Wellenverbinder, besonders der am Längsmotor eiern schon sehr. Aber das ist eigentlich nur ein Schönheitsfehler, weil ich den Motoren die nötige Bewegungsfreiheit gelassen habe. Ich werde aber trotzdem versuchen, auf einer Drehbank was vernünftiges anzufertigen. Kann aber sein, dass ich dann trotzdem ein Problem behalte. Wenn die Wellen am Kreuztisch unwuchtig sind, werde ich das nicht ändern können. Aber Franzelchen hat ja Zeit, für eine bestmögliche Lösung. Die Verkabelung ist verbesserungsfähig ja, das möchte ich nochmal ändern. Aber ich bin auf nem guten Weg. :oo: Die Steuerung tausche ich auch noch aus. Da habe ich eine , die besser eingerichtet ist. Aber dazu muß ich auch die Motorkabel anpassen. Das wird also beides in einem Wisch erledigt.

Hier ist mal ein Bild vom jetzigen stand:
.
Kreutztisch_10 zu 1_Getriebe.jpg
Kreutztisch_10 zu 1_Getriebe.jpg (947.34 KiB) 394 mal betrachtet
Ob ich den Antrieb noch auf 3D erweitere, weiß ich noch nicht. Für die Arbeiten, die ich meistens machen muss, ist es nicht erforderlich, aber die Steuerung hat ja schon X,Y,Z Achse, der Z - Treiber ist auch schon drin. Es ginge also nur noch darum, vom Handrad auf Motor umzubauen. Motor habe ich, also nur noch ein Schnecken-Getriebe, dass ich genug Untersetzung habe, dann wäre das ganze fertig. Mal schauen. Ein Schritt ist jetzt 0,001mm, 1mm ist 1000 Schritte, also leicht umzusetzen. :(oo): Die Umrechng muss ich im Programm noch anpassen. Dann sollte wieder alles laufen.
Benutzeravatar
Admin
Administrator
Beiträge: 1196
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Habe die Aufhängung von Längsmotor ein bischen stabieler konstruiert. Total unflexibel kann ich ihn nicht befestigen, weil ja die Wellenverbinder sehr viel Bewegungsfreiheit vordern. :roll:
.
Kreuztisch_06.10.23.jpg
Kreuztisch_06.10.23.jpg (750.41 KiB) 369 mal betrachtet
Ich habe jetzt doch nicht auf 400 Schritte je Motorumdrehung eingestellt, sondern auf 800 Schritte. Mit dem Getriebe sind das dann 8000 Schritte pro Umdrehung. Mir den Microschritten läuft er genauer und leister.
1mm ist also jetzt 2000 Schritte.
.
Kreuztisch Mechanik.JPG
Kreuztisch Mechanik.JPG (119.82 KiB) 342 mal betrachtet
Der Angepasste Code ist:

Code: Alles auswählen

/*
  ################################################################################################################
  +++++++++++++++++++++++++++++++Kreuztisch_Pr._V4.0 vom 08.10.2023+++++++++++++++++++++++++++++++++++++++++++++++
  ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  programm 3.6 ist keine große Änderung, da habe ich nur A7 und A8 getauscht, weil ich bei mir
  die Verdrahtung der beiden Punkte in der Steuerung geändert habe. Da die beiden Punkte die
  selbe Funktion haben merkt man es nicht.
  Kreuztisch Steuerung mit Schrittmototoren erstellt mit der Mobatools Lib. die ich sehr empfehlen kann.
  Die Fahrdaten werden mit Excel eingegeben, auf eine SD-Karte mit Trennung durch Semikolon,exportiert,
  und vom Arduino wieder ausgelesen.
  Die beötigten Daten in einer Fahrdaten Zeile sind:
  Position 1: Motor / Achse 1 - 3 für X, Y, Z
  Position 2: Fahren ja / nein. Fahren ist "1" Bohrstopp ist "0"
  Position 3: Dir, also rechts / links = 1 - 2
  Position 4: Tempo 1 - 1800
  Position 5: Schritte 1000 - 600000
  Das ist die Version 4.0 als aktueller Lauffähiger Code.
  Die Pins des Kartenlesers sind beim Arduino Mega:
  Miso Pin 50
  Mosi Pin 51
  SCK Pin 52
  CS Pin 53
  GND und VCC 5 Volt natürlich auch noch.
  Der Kartenleser macht Karten bis 32GB
  Mit FAT16/FAT32-Partition
  Wenn die Fahrgeschwindigkeit zu gering ist, kann man in der Lib.Datei "MobaTools.h"
  "#define CYCLETIME       200" ändern auf "#define CYCLETIME       100"
  Dann das Programm nochmal neu auf den Arduino übertragen.
  !!!Achtung!!! die Mobatools.d ist dann für dieses Programm i.O.
  aber muss danach wieder in den ursprünglichen Zustand versetzt werden !!
  Wir belegen mit SPI und I2C mindestens 27-30 Pin´s also fallen kleinere Arduinos aus.
  Im Moment sind es nur 23 Pin´s aber für Spindel ein/aus, Kühlung, Absaugung,
  sollte man sich die Möglichkeit offen halten. Also lieber mit 30 rechnen!!!
  Ich habe immer gerne Luft nach oben, wenn ich was baue.
  ###############################################################################################################
*/
#include <LiquidCrystal_I2C.h>
LiquidCrystal_I2C lcd(0x27, 20, 4);
//---SD Kartenleser-------------------------------
#include <SPI.h>
#include <SD.h>
File myFile;

byte gelesen = 0;
const byte chipSelectPin = 53;
const String filename = "Mappe1.csv";
char zeilenBuffer[30];
char auswerteBuffer[6][8];
byte automatik = 0;
//----------------Sonderzeichen-------------------
#define OHM   "\xF4"    // Zeichen für Ohm
#define AE    "\xE1"    // Zeichen für "ä"
#define OE    "\xEF"    // Zeichen für "ö"
#define SS    "\xE2"    // Zeichen für "ß"
#define OBEN    "\x5E"    // Zeichen für "hoch"
#define RECHTS   "\176" // Pfeil nach rechts
#define LINKS   "\177"  // Pfeil nach links
#define UE  "\365"      // Zeichen für "ü"
#define GRAD  "\337C"   // Zeichen für "Grad" Celsius
//------------------------------------------------
#define MAX8BUTTONS // spart Speicher, da nur 8 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
// Pindefinitions - change to your needs
//----------Motor 1-------------------------------
const byte dirPin1       = 5;
const byte stepPin1      = 4;
const byte enaPin1       = 6;
//----------Motor 2-------------------------------
const byte dirPin2       = 9;
const byte stepPin2      = 8;
const byte enaPin2       = 10;
//----------Motor 3-------------------------------
const byte dirPin3       = 44;
const byte stepPin3      = 43;
const byte enaPin3       = 45;
//----------Taster--------------------------------
const byte button1Pin   = A1; //---Motor1 links--- Joystick
const byte button2Pin   = A2; //---Motor1 rechts-- Joystick
const byte button3Pin   = A3; //---Motor2 links--- Joystick
const byte button4Pin   = A4; //---Motor2 rechts-- Joystick
const byte button5Pin   = A5; //---Motor3 links--- Basis
const byte button6Pin   = A6; //---Motor3 rechts-- Basis
const byte button7Pin   = A7; //---Fräsen Start--- Basis
const byte button8Pin   = A8; //---Fräsen Start im Bedienteil
//--------------Taste zum Entsperren, wenn Stopp durch fahren==0 (Bohrstopp)
const byte entsperrtaste = A9; // Taste "Weiter" nach Bohrstopp, im Bedienteil
//----------Tempo_Poti---------------------------------------------------------------
const byte potPin       = A0;   // Poti muss ein analoger Eingang sein
const int STEPS_REVOLUTION = 800;
unsigned long Sekundenablauf01 = 0; // Tastenabfrage von Taster02 300ms aussetzen
const unsigned long Pausezeit01 = 1000;
//--------Fahrdaten------------------------------------------------------------------
byte motor = 0;               // Achsenauswahl 1-2-3 ist X-Y-Z
byte fahren = 1;              // Motoren bewegen
byte richtung = 0;            // Richtung der Bewegung 1 oder 2
int tempo1 = 0;               // Tempo für Handsteuerung, wird vom Poti eingestellt
int tempo2 = 0;               // Tempo zum Fräsen
int tempo = 0;                // Wird vom Programm zur übergabe benutzt
float mm = 0;
float multiplikator = 25;
float teiler = 10000;
long schritte = 0;   // Schritte die der Motor fahren soll
//-----------------------------------------------------------------------------------
//Stepper einrichten ( 1600 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepperX( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
MoToStepper myStepperY( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
MoToStepper myStepperZ( STEPS_REVOLUTION, STEPDIR );  // 800 Steps/ Umdrehung
// Taster einrichten
// Den Tasternamen die Indizes 0...7 zuordnen
enum { Button1 = 0, Button2, Button3, Button4, Button5, Button6, Button7, Button8 };
// muss als byte definiert sein, damit ein enfaches sizeof funktioniert
const byte buttonPins[] = { button1Pin, button2Pin, button3Pin, button4Pin, button5Pin, button6Pin, button7Pin, button8Pin};
MoToButtons button( buttonPins, sizeof(buttonPins), 20, 500 );

MoToTimebase speedIntervall;    // Zeitinterval zum Auslesen des Speedpotentiometers
// the speed pot ist read only every 'speedintervall' ms

int vspeed = 0;                 //Steppergeschwindigkeit in U/min*10
//==============================================================================================================
void setup()
{
  lcd.begin();
  lcd.backlight();
  Serial.begin(9600);
  pinMode(entsperrtaste, INPUT_PULLUP); // Eingang für Entsaperrtaste
  //-----------------------------Motor 1----------------------------------------------------
  myStepperX.attach( stepPin1, dirPin1 );
  myStepperX.attachEnable( enaPin1, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperX.setSpeed( 200 );
  myStepperX.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  speedIntervall.setBasetime( 100 );                  // 100ms Tickerzeit
  //------------------------------Motor 2-----------------------------------------------------
  myStepperY.attach( stepPin2, dirPin2 );
  myStepperY.attachEnable( enaPin2, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperY.setSpeed( 200 );
  myStepperY.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  //-----------------------------Motor 3------------------------------------------------------
  myStepperZ.attach( stepPin3, dirPin3 );
  myStepperZ.attachEnable( enaPin3, 10, LOW );        // Enable Pin aktivieren ( LOW=aktiv )
  myStepperZ.setSpeed( 200 );
  myStepperZ.setRampLen( 100 );                       // Rampenlänge 100 Steps bei 20U/min
  //------------------------------------------------------------------------------------------
  //----------CD_Kartenleser aktivieren-------------------------------------------------------
  pinMode(SS, OUTPUT);
  while (!Serial);
  Serial.println("Initializing SD card...");
  if (!SD.begin(chipSelectPin)) // Ist SD Karte nicht ansprechbar?
  {
    Serial.println("Initialisierung fehlgeschlagen!");
    lcd.setCursor (0, 0);
    lcd.print(F("!! Karten_Fehler !!"));
    while (1); // Wenn Karte nicht ansprechbar, ist hier Programm Ende !!!
  }
  lcd.setCursor (0, 1);
  lcd.print(F("                   "));
  lcd.setCursor (0, 1);
  lcd.print(F(" Karte ist bereit! "));
  //-----------------------------------------------------------------------------------------
}
//=============================================================================================================
void loop() {
  lcd.setCursor (0, 0);
  lcd.print(F("Kreuztisch_Pr._V4.1 "));
  //------SD_Karte öffnen zum Lesen-------------------------------------------------------
  if (automatik == 1)
  {
    lcd.setCursor (0, 2);
    lcd.print(F("  Automatik l"AE"uft  "));
    lcd.setCursor (0, 3);
    lcd.print(F("                   "));
    lcd.setCursor (0, 1);
    lcd.print(F("                   "));
    myFile = SD.open(filename);
    if (myFile)
    {
      while (myFile.available())
      {
        if (fahren == 1)
        {
          leseZeile();
          ausgabeZeile();
          teileZeile();
          ausgabeWerte();
        }
        else {
          // ---------------Ist Taste Weiter gedrückt??---------------------------------
          if (digitalRead(entsperrtaste) == 0)
          {
            fahren = 1;
            lcd.setCursor (0, 2);
            lcd.print(F("    Weiterfahren   "));
          }
        }
      }
      // schließe die Datei:
      myFile.close();
      //Serial.println(F(" geschlossen!"));
      automatik = 0;
      lcd.setCursor (0, 2);
      lcd.print (F("                    "));
      lcd.setCursor (0, 2);
      lcd.print (F(" Karte abgearbeitet "));
    }
    else
    {
      // Wenn die Datei nicht geöffnet wurde, drucke einen Fehler :
      //Serial.print("Fehler beim öffnen von ");
      //Serial.println(filename);
    }
  }
  //--------------------------------------------------------------------------------------
  button.processButtons();          // Taster einlesen und bearbeiten

  // Speed alle 100ms neu einlesen und setzen
  if ( speedIntervall.tick() ) {
    // wird alle 100ms aufgerufen ( Tickerzeit = 100ms im setup() )
    vspeed = map((analogRead(potPin)), 0, 1023, 20, 1800);  //Poti mappen auf 2 ... 180 Umdr/Min
    //min speed =2 and max speed =180 rpm
    tempo1 = vspeed;
    tempo = tempo1;
    if (millis() - Sekundenablauf01 >= Pausezeit01)  // 1000msec abgelaufen?
    {
      lcd.setCursor (0, 3);
      lcd.print (F("  VSPEED = "));
      lcd.setCursor (12, 3);
      lcd.print (F("     "));
      lcd.setCursor (12, 3);
      lcd.print (vspeed);
      Sekundenablauf01 = millis();
    }
    myStepperX.setSpeed( tempo );
    myStepperY.setSpeed( tempo );
    myStepperZ.setSpeed( tempo );
  }
  //----------------------------------------------------------------
  // Drehen Motor1 rechtsrum
  if (button.pressed(Button1) ) {
    //Taster1 gedrückt
    tempo = tempo1;
    myStepperX.rotate( 1 );          // Stepper1 dreht vorwärts
  }
  if ( button.released(Button1) ) {
    //Taster1 losgelassen
    myStepperX.rotate(0);             // Stepper1 stoppt
  }

  //Drehen Motor1 linksrum
  if (button.pressed(Button2) ) {
    //Taster2 gedrückt
    tempo = tempo1;
    myStepperX.rotate( -1 );         // Stepper1 dreht rückwärts
  }
  if ( button.released(Button2) ) {
    //Taster2 losgelassen
    myStepperX.rotate(0);    // Stepper1 stoppt
  }
  //-----------------------------------------------------------------
  // Drehen Motor2 rechtsrum
  if (button.pressed(Button3) ) {
    //Taster3 gedrückt
    tempo = tempo1;
    myStepperY.rotate( 1 );          // Stepper2 dreht vorwärts
  }
  if ( button.released(Button3) ) {
    //Taster3 losgelassen
    myStepperY.rotate(0);            // Stepper2 stoppt
  }

  //Drehen Motor2 linksrum
  if (button.pressed(Button4) ) {
    //Taster4 gedrückt
    tempo = tempo1;
    myStepperY.rotate( -1 );         // Stepper2 dreht rückwärts
  }
  if ( button.released(Button4) ) {
    //Taster4 losgelassen
    myStepperY.rotate(0);            // Stepper2 stoppt
  }
  //-----------------------------------------------------------------
  // Drehen Motor3 rechtsrum
  if (button.pressed(Button5) ) {
    //Taster5 gedrückt
    tempo = tempo1;
    myStepperZ.rotate( 1 );          // Stepper3 dreht vorwärts
  }
  if ( button.released(Button5) ) {
    //Taster5 losgelassen
    myStepperZ.rotate(0);             // Stepper3 stoppt
  }

  //Drehen Motor3 linksrum
  if (button.pressed(Button6) ) {
    //Taster6 gedrückt
    tempo = tempo1;
    myStepperZ.rotate( -1 );         // Stepper3 dreht rückwärts
  }
  if ( button.released(Button6) ) {
    //Taster6 losgelassen
    myStepperZ.rotate(0);            // Stepper3 stoppt
  }
  if (button.pressed(Button7) ) {
    //Taster7 gedrückt
    automatik = 1;                  // Automatik von SD Karte starten
  }
  if ( button.released(Button7) ) {
    //Taster7 losgelassen
  }
  if (button.pressed(Button8) ) {
    //Taster8 gedrückt
    automatik = 1;                  // Automatik von SD Karte starten
  }
  if ( button.released(Button8) ) {
    //Taster8 losgelassen
  }
  //-----------------------------------------------------------------

}
//=========================================================================================
void leseZeile()
{
  char myChar = '\0';
  static byte bufferPosition = 0;
  if (bufferPosition == 0) memset(zeilenBuffer, '\0', sizeof(zeilenBuffer));
  while (myFile.available() && myChar != '\n')
  {
    myChar = myFile.read();
    if (isPrintable(myChar))
    {
      zeilenBuffer[bufferPosition] = myChar;
      bufferPosition++;
    }
  }
  // Hier ist ZeilenEnde / DateiEnde
  bufferPosition = 0;
}
//=========================================================================================
void ausgabeZeile()
{
  Serial.print(F("eingelesene Zeile ist: "));
  Serial.println(zeilenBuffer);
}
//=========================================================================================
void teileZeile()
{
  // zeilenbuffer in auswerteBuffer umschreiben
  memset(auswerteBuffer, '\0', sizeof(auswerteBuffer) / sizeof(auswerteBuffer[0]));
  strcpy (auswerteBuffer[0], strtok(zeilenBuffer, ";"));
  strcpy (auswerteBuffer[1], strtok(NULL, ";"));
  strcpy (auswerteBuffer[2], strtok(NULL, ";"));
  strcpy (auswerteBuffer[3], strtok(NULL, ";"));
  strcpy (auswerteBuffer[4], strtok(NULL, ";"));
  strcpy (auswerteBuffer[5], strtok(NULL, ";"));
  //Serial.println(F("Puffer geteilt!"));
}
//========================================================================================
void ausgabeWerte()
{
  for (byte b = 0; b < sizeof(auswerteBuffer) / sizeof(auswerteBuffer[0]); b++)
  {
    //Serial.print(F("Wert "));
    //Serial.print(b);
    //Serial.print(F(" ist: "));
    //Serial.println(auswerteBuffer[b]);
    motor = atoi(auswerteBuffer[0]);
    fahren = atoi(auswerteBuffer[1]);
    richtung = atoi(auswerteBuffer[2]);
    tempo = atoi(auswerteBuffer[3]);
    myStepperX.setSpeed(tempo);
    myStepperY.setSpeed(tempo);
    myStepperZ.setSpeed(tempo);
    mm = atoi(auswerteBuffer[5]);
    schritte = (mm * 2000);
    if (b == 0)
    {
      lcd.setCursor (0, 3);
      lcd.print(F("                    "));
      lcd.setCursor (0, 0);
      lcd.print(F("                    "));
      //----Display Motor1-------------
      if (motor == 1)
      {
        lcd.setCursor (1, 0);
        lcd.print("Mot X");
        lcd.print (F(" "));
        if (richtung == 1)
        {
          lcd.print(F(RECHTS));
        }
        if (richtung == 2)
        {
          lcd.print(F(LINKS));
        }
      }
      //----Display Motor2-------------
      if (motor == 2)
      {
        lcd.setCursor (1, 0);
        lcd.print("Mot Y");
        lcd.print (F(" "));
        if (richtung == 1)
        {
          lcd.print(F("v"));
        }
        if (richtung == 2)
        {
          lcd.print(F(OBEN));
        }
      }
      //----Display Motor3-------------
      if (motor == 3)
      {
        lcd.setCursor (1, 0);
        lcd.print("Mot Z");
        lcd.print (F(" "));
        if (richtung == 1)
        {
          lcd.print(F(OBEN));
        }
        if (richtung == 2)
        {
          lcd.print(F("v"));
        }
      }
      lcd.print (F(" "));
      lcd.print(mm);
      lcd.print("mm");
      
      lcd.setCursor (4, 3);
      lcd.print(F("              "));
      lcd.setCursor (4, 3);
      lcd.print(("Schr. "));
      lcd.print(schritte);
    }
    //-------------Motor 1 fahren------
    if (motor == 1)
    {
      if (richtung == 1)
      {
        myStepperX.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperX.doSteps(-schritte);
      }
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
    //-------------Motor 2 fahren------
    if (motor == 2)
    {
      if (richtung == 1)
      {
        myStepperY.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperY.doSteps(-schritte);
      }
      motor = 0;
      richtung = 0;
      schritte = 0;
    }
    //------------Motor 3 fahren-------
    if (motor == 3)
    {
      if (richtung == 1)
      {
        myStepperZ.doSteps(schritte);
      }
      if (richtung == 2)
      {
        myStepperZ.doSteps(-schritte);
      }
      if (fahren == 0)
      {
        lcd.setCursor (0, 2);
        lcd.print(F(" --- BOHRSTOPP --- "));
      }

      motor = 0;
      richtung = 0;
      schritte = 0;
    }
  }//---------fahren ende-----------------
  while (myStepperX.moving() > 0) {}
  while (myStepperY.moving() > 0) {}
  while (myStepperZ.moving() > 0) {}
}
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: Ahrefs [Bot] und 4 Gäste