Kreuztisch mit Schrittmotoren bestücken

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

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe jetzt noch eine Schutzabdeckung der Wellen gegen die Späne angebaut. Das ist 5mm Alu, also stabil genug, um es gleich auch als Werkzeugablage zu nutzen. Das Ding funktioniert jetzt ausgezeichnet. Also diese Getriebe sind Gold wert. Damit gewinne ich keinen Preis in Geschwindigkeit, aber dafür in Genauigkeit und das ist für mich der wichtige Punkt, da ich damit keine Produktion beginnen möchte, sondern nur meine paar Teile bearbeiten möchte.

So sieht das Ding jetzt aus:
.
Kreuztisch mit Schutz gegen Späne.jpg
Kreuztisch mit Schutz gegen Späne.jpg (904.79 KiB) 494 mal betrachtet
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich habe gestern noch den Endschalter montiert, der in einem Recheck geführt wird, das genauso groß ist, wie der komplette Bewegungsraum meines Kreuztisches. Das sind ja nur gute 300mm x 100mm. Wenn der Kreuztisch an die mechanischen Enden rechts, linkes, oben, unten kommt, kommt der Endschalter auch an die Grenzen seines Rechteckes und dann wird der Rechner in den Reset geschickt. Der Tisch stoppt dann also sofort, und lässt sich nicht mehr bewegen. Da bleibt er, bis ich eine Entriegelungstaste drücke und den Tisch mit Handsteuerung mit nem Joystick wieder ins "freie Fahrwasser" bewege. Dabei muss man dann aber aufpassen, dass man in die richtige Richtung fährt, weil sonst der Enschalter abgerissen werden kann!! OK, man muss eben schon ein wenig mitdenken, wenn man eine Maschine bedient. Wenn der Tisch dann wieder frei ist, kann kann ich die Entriegelungstaste wieder auslassen. Ist ein recht einfaches System, dadurch muss ich nicht in allen vier Richtungen jeweils einen Endschalter installieren. Ich habe einfach nicht den Platz an dem Kreuztisch, diese 4 Schalter sinnvoll anzubringen. da ich keinen Schönheitspreis gewinnen will, sondern nur eine gute Funktion brauche, ist das für mich eine gute Lösung. Ich mache mal in den kommenden Tagen ein Bild, oder ein Video.

Das Blech, dass ich am Bild oben links am Tisch unten montiert habe, dass keine Späne in die Spindel kommen, habe ich inzwischen nach oben verlegt, weil es unten, wenn ich den Tisch ganz nach rechts gefahren habe, die Bewegung des Tisches behinderte. Ich musste es daher doch oben montieren. Jetzt sind also die Spindel-Spritzschutz Bleche auf beiden Tischenden oben montiert. Dadurch habe ich jetzt das Problem, dass ich in diese Schienen am Tisch nicht mehr so einfach Schrauben oder Muttern einführen kann. Aber ich habe eine Möglichkeit gefunden dass es trotzdem leicht eingeführt werden kann.

Grüße
Franz :(V):
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Max »

Servus Franz,

wo bleiben die Späne?

Grüße aus dem Allgäu
Max
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Hallo Max. :(V):

Die Späne sind im Staubsauger. :lol:
Am Foto sieht man oben auf der Steuerung einen Joystick. Mit dem steuere ich den Tisch. Also um den Fräser zu positionieren, um dann automatisch weiter zu fahren, oder um mit Handsteuerung zu fräsen, wie in dem Video der unter dem Bild verlinckt ist. Links neben dem Joystick ist ein Poti, mit dem ich die Fahrgeschwindigkeit des Tisches regeln kann. Diese Enstellung gilt nur für die Manuelle Bewegung des Tisches. Für die Automatische Fahrt wir ja Richtung, Strecke, Tempo mit Daten von der SD-Karte übergeben.
Ich habe je gerade den Video gemacht. Da ist mir aufgefallen, dass ja die Späne immer eine Richtung haben :(o): :(o): welch eine Erleuchtung :(o): :(o): und habe beschlossen da eine Absaugung dran zu bauen. Ich glaube da kann man fast die ganzen Späne auffangen. :(oo):

Einen Video habe ich unter dem Bild verlinkt!
.
Kreuztisch_26_10_23_V02.jpg
Kreuztisch_26_10_23_V02.jpg (365.92 KiB) 420 mal betrachtet
Und hier ist mal ein Video von einem kleinen Test. Das automatische Fräsen zeige ich später noch. Da muß ich erst eine passende Datei machen.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Hier noch eine Anpassung. Die betrifft den Umbau mit den beiden Getrieben. Dadurch wurde der Tisch etwas langsamm.
Die Lib. "MobaTools.h" musste ich etwas Modifizieren.
In der Lib. ist die Zeile "#define CYCLETIME 200"
Die muss man ändern auf "#define CYCLETIME 100"
Dann hat man für den Speed nicht mehr nur 20 - 1800 zur Verfügung, sondern 20 - 3750.
damit komme ich dann wieder mit der Geschwindigkeit zurecht.

Hier daher nochmal die Bewegungsdaten die man auf der SD - Karte eintragen muss, für den Automatischen Lauf.
!! ACHTUNG !! Die Fahrrichtung 1 für recht oder runter, 2 für links oder hoch, sind die Fahrrichtungen des Fräsers !! Da es leichte ist, sich die Fahrrichtung dess Fräsers vorzustellen. Da sich ja der Tisch bewegt, und nicht der Fräser, fährt der Tisch natürlich dann nach links, dass der Fräser in der Vorstellung, vor dem Geistigen Auge, nach rechts fahren kann. :(o): :roll:
.
Kreuztisch Mechanik.JPG
Kreuztisch Mechanik.JPG (114.12 KiB) 357 mal betrachtet
Max
Beiträge: 78
Registriert: Di 27. Sep 2022, 17:37
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Max »

Servus Franz,
das sieht ja schon ganz gut aus und funktioniert wohl auch soweit.
Fräsen würde ich aber, bei einem nicht so stabilen Aufbau, lieber
im Gegenlauf. Das heißt, die Fräsbewegung vom Werkstück weg.
Beim Gleichlauffräsen kann es passieren, dass der Fräser ins Werkstück hineingezogen
wird und das Ergebnis wäre dann Werkzeugbruch oder das Werkstück
wird zerstört.
Weiterhin viel Erfolg.
Gruß
Max
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Ich stelle hier mal schnell die Teile zusammen, die ich für die Maschine benutze.
Der Fräsmotor.
Der Frästisch.
Der Bohr- und Fräsständer.

Zum Bohren nimmt man eine handelsübliche Handbohr-Maschine. Die habe den 40mm Hals, den man dann anstelle des Fräsmotors einspannen kann.
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Max hat geschrieben: Fr 27. Okt 2023, 11:23 Fräsen würde ich aber, bei einem nicht so stabilen Aufbau, lieber im Gegenlauf.
Dieser Tisch und der Ständer sind eigentlich sehr stabil. Da ist keine Luft für Bewegung die ich nicht will.
"Gegenlauf" heißt dann wohl, der Fräser dreht sich rechts rum, dann muss ich gegen die Drehrichtung also von Rechts nach Links fahren? Das würde heißen, wenn ich das Teil im Video Fräse, müßte ich erst die Linke Seite von unten nach oben, und dann nicht nach rechts und wieder runter, sondern erst nach unten zum Ausgangspunkt, dann nach rechts und wieder hoch?

Der Tisch ist nicht wie die üblichen kleinen Fäsen nur von der Spindel gehalten, sondern wird geführt von zwei Gusseisernen Schienen für jede Richtung. Deshalb war die Kraft ohne die Getriebe auch zu wenig. Jetzt muss ich aufpassen, dass nichts im Weg ist, z.B. war da ein Bohrer 3mm noch im Loch, und ich bin weiter gefahren. :agt: Dann fährt der Tisch eben weiter und schrottet den Bohrer. :(o): :(o): Also Schrittverluste kann ich mir jetzt mit den Getrieben nicht mehr vorstellen. Vorher nur mit dem Nema 23 an den Wellen, was das leider möglich. Also ohne die Getriebe kann ich mir das nicht mehr vorstellen. Das ging nur gut, weil ich die Schienen seeeehr gut geschmiert habe. Als der Tisch dann länger nicht mehr benutzt wurde, war alles schwergängiger, und die Schrittverluste kamen dann mit dieser Schwergängigkeit. Dann war mein Interesse an dem Teil natürlich erst mal auf Null. :(o): :(o):

Schönes WE
Franz
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Hier ist mal eine Excel Datei, wie ich sie brauche. Sie muss aber für die Steuerung in *.cvs gespeichert werden, dass die Datei von der Steuerung gelesen und ausgewertet werden kann!!
.
Kreuztisch_Ecxel_Datei.jpg
Kreuztisch_Ecxel_Datei.jpg (87.4 KiB) 370 mal betrachtet
Jede Zeile ist eine Fahrt.
Spalte A = Achse 1, 2, oder 3, bzw. X, Y, Z
Spalte B = 1 für fahren, 0 für Bohrstopp
Spalte C = 1 für nach rechts oder runter / 2 für nach links oder hoch
Spalte D = Vorschub - Tempo 200 - 3750
Spalte E = Schritte die gefahren werden müßen. 1mm ist 2000 Schritte
Spalte F = mm Vorschub
Die Spalte F muss als Text Formatiert werden, dass man Zahlen mit "." anstelle "," schreiben kann. Dann muss die Tabelle als *.CSV Datei mit Trennzeichen gespeichert werden. Bei Zahlen mit "," wird der Teil hinterm Komma nicht berücksichtigt!!

Die Fräse fährt die in der Datei eingetragenen Schritte. Die "mm" Angaben werden nur im Display angezeigt. Das heißt die Schritte mm x 2000 sind Substantiell für die Richtigkeit der Fahrstrecke. Die mm sind nur wichtig für die Anzeige im Display bei der Fahrt.

Für einen Bohrstopp (Spalte B = 0 und Spalte A = 3) sind die mm aus der Spalte F, die Anzeige der Bohrerstärke im Display.

Und hier ist nochmal das aktuelle Programm stand heute: Die vorherigen Programme sind hiermit nicht mehr akzeptabel.

Code: Alles auswählen

/*
  ################################################################################################################
  +++++++++++++++++++++++++++++++Kreuztisch_Pr._V5.1 vom 29.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 200 - 3750
  Position 5: Schritte 10 - 600000
  Das ist die Version 5.1 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 schritte = 0;   // Schritte die der Motor fahren soll
long schritte2 = 0;
//-----------------------------------------------------------------------------------
//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
//##########################################################################################
//############################      SETUP       ############################################
//##########################################################################################
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! "));
  //-----------------------------------------------------------------------------------------
}
//##########################################################################################
//############################       LOOP       ############################################
//##########################################################################################
void loop() {
  lcd.setCursor (0, 0);
  lcd.print(F("Kreuztisch_Pr._V5.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, 3750);  //Poti mappen auf 20 ... 3750 Umdr/Min
    //min speed =20 and max speed =3750 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 = atol(auswerteBuffer[0]);
    fahren = atol(auswerteBuffer[1]);
    richtung = atol(auswerteBuffer[2]);
    tempo = atol(auswerteBuffer[3]);
    schritte = atol(auswerteBuffer[4]);
    if (schritte < 1)
    {
      schritte = mm * 2000;
    }
    schritte2 = schritte;
    mm = atof(auswerteBuffer[5]);
    myStepperX.setSpeed(tempo);
    myStepperY.setSpeed(tempo);
    myStepperZ.setSpeed(tempo);

    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"));
        }
      }
      if (fahren == 0)
      {
        lcd.setCursor (1, 0);
        lcd.print(F("Bohrer"));
      }
      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(schritte2);
    }
    //-------------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) {}
}
Benutzeravatar
Admin
Administrator
Beiträge: 1199
Registriert: Mo 20. Apr 2020, 09:47
Wohnort: 82441 Ohlstadt
Kontaktdaten:

Re: Kreuztisch mit Schrittmotoren bestücken

Beitrag von Admin »

Jetzt habe ich mir mal eine Montageplatte gebohrt für das große Gehäuse. Das sind zur Zeit 15 Löcher. Die vier etwas größeren Löcher an den 4 Ecken sind Befestigungslöcher die schon bei der Produktion der Platte mit gelasert wurden. Daheralso nur 15 gebohrte. Und es hat jetzt suuuper funktioniert. Man muss bei den Bohrdaten aufpassen, besser 2-3x kontrollieren, sonst bohrt man Schrott. Denn ein Loch mit falschen Positionsdaten, dann sind alle folgenden Löcher auch um dieses Maß verschoben. Man gibt ja immer nur die mm / Schritte / Richtung X oder Y Achse ein, die man fahren muss bis zum nächsten Loch. Bei meinem ersten Versuch mit so einer Montageplatte waren die Pos. Daten für das Loch 5 falsch, somit waren die 10 darauf folgenden auch falsch :(o): :(o):

Aber OK, ich speichere mir ja den Bohrplan für folgende Platten, somit bin ich bei den kommenden Platten garantiert Fehlerfrei und eben sehr genau.

Das erste Loch muss man Ausmessen und markieren. Dann fährt man mit dem Bohrer genau dorthin Bohrt das erste Loch, und startet dann das Automaitk - Programm. Das erste Loch sieht man noch am Bild, weil ich es mit einem roten Stift angekreuzt habe. Links oben am Bild.

Es ist ein recht entspannes Arbeiten, weil man nur warten muss, bis mal wieder den Bohrer runterdrücken muss, ohne auf irgendwas zu achten. :(oo):
Übrigens ist das Werkstück nicht idial Fotografiert. Deshalb sieht es bei den 4 Bohrungen rechts oben, so aus, als ob sie nicht in einer Linie und nicht gerade zur Oberkannte verlaufen. Aber das täuscht und liegt nur an meinen sagenhafen Fotokünsten. :(o): :(o):
.
Montageplatte_groß_Bohrbild_2.jpg
Montageplatte_groß_Bohrbild_2.jpg (267.99 KiB) 336 mal betrachtet
Das sind die Excel Bohrdaten für diese Platte:
.
Montageplatte_gross_Bohrdaten.jpg
Montageplatte_gross_Bohrdaten.jpg (189.57 KiB) 338 mal betrachtet
Antworten

Zurück zu „Fertige Projekte Vorstellen“

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 34 Gäste