Arduino Tronxy XS5A Umbau

Hallo erstmal zusammen!

Erstmal vorab warum ich hier nach eurer Hilfe frage. Und zwar machen mein Kollege und ich zurzeit unser Technikerprojekt in der Technikerschule.

Thema ist es in einer Firma Formen zu vergießen mit einer speziellen Maschine. Zurzeit passiert das von Hand von einem Mitarbeiter. Unsere Aufgabe ist es nun diesen Vorgang zu automatisieren. Das Ganze wollen wir mit einem 3D Drucker realisieren dem Tronxy XS5A Pro. Dort wo der Druckkopf normalerweise sitzt, werden wir die Spritzdüse der anderen Maschine befestigen und dann die einzelnen Positionen anfahren und vergießen. Das alles soll natürlich nach Betätigung der Start Taste auf einem Display automatisiert laufen.

Hierzu haben wir alles soweit aufgebaut und verkabelt. Zur Steuerung nutzen wir einen arduino Mega 2560 und ein CNC Shield V3 mit den A4988 Treibern.

Jetzt fragen wir uns welche Bibliothek wir dafür am besten nutzen um die einzelnen Schrittmotoren zu programmieren. Darüber hinaus sind wir für jede Tipps offen wie würdet ihr das Ganze realisieren?

Wir sind wirklich für jeden Tipp dankbar!

Viele Grüße

https://www.youtube.com/results?search_query=arduino+mega+2560+cnc+shield+v3

Viel Glück

Für Schrittmotoransteuerung die MobaTools weil diese library eine,
den Code nicht blockierende Schrittausgabe hat.

Die MobaTools kann man sich in der Arduino-IDE über den Library-Manager installieren.
Allerdings sind diese ganzen Stepper-libraries alle darauf angewiesen dass man die Achsen
nacheinander ansteuert. Wenn da unbedingt 3D-Verfahren gefordert ist, dann würde ich auch ESTLCAM umsteigen. ESTLCAM ist eigentlich eine 3D CNC-Frässoftware. Aber wenn man einen Fräser in 3D herumfahren kann und dabei noch mehrere weitere Schaltsignale (normalerweise Frässpindel an / aus, Kühlmittel an / aus schalten kann dann kann man so ein "Fräsprogramm" auch zum befüllen nehmen. Wenn es um das Befüllen geht könnte man bei ganz kleinem Vorschub 0,001 mm und ganz kleiner Zustellung einen winzigen oder auch mittelgroßen Kreis abfahren lassen und währenddessen befüllen.

Dann verlagert sich die Arbeit auf das erstellen der entsprechenden "Fräs"- äh pardon "Füllprogramme"
Das wiederum geht auch sehr komfortabel aus einer DXF-Zeichnung heraus.
Auf der DXF-Zeichnung sind die Umrisse der Formen und eine "Bohrung" = Füllposition eingezeichnet. Und an der "Bohrung" = Füllposition macht man dann die langsame Kreisbewegung. Oder wenn das Sinn macht auch in der Form mit etwas Abstand vom Rand die Form abfahren.

ESLTCAM kann man kostenlos testen und die Lizenz kostet schlappe 50 Euro.
Das ist ein unschlagbares Preisleistungsverhältnis.

Jetzt weiß ich natürlich nicht wie eure Aufgabenstellung lautet.
Ob da das selber entwickeln der Steuerungssoftware auf Arduino ein zwingendes muss ist oder nicht.

Oder ob es noch andere Kriterien gibt. Also zum Beispiel die Formen sehen alle ganz unterschiedlich aus aber es gibt eine Art Referenzpunkt der über eine optische Abstastung per "scannen" gefunden wird und dann weiß die Maschine im Verhaltnis zum Referenzpunkt muss ich jetzt diese Position anfahren damit das Befüllen an der richtigen Stelle erfolgt. Das spräche wieder für eine selbst entwickelte Steuerungssoftware.

vgs

Also wir sollen schon selbst ein Programm entwickeln. Das haben wir soweit erledigt. Der Drucker fährt nun alle Formen einzeln an.

Jetzt gehts an die Programmierung der Home Position, sowie die anschließende Implementierung eines Displays.

Über das Display wollen wir ein Start und Stop Button, sowie ein Home Button programmieren. und über das Display sollen mindestens zwei Verschiedene zu vergießende Formen abgebildet werden.

Und was ist jetzt die Frage?

Eigentlich war bis gestern einiges unklar, was nun aber klar geworden ist während dem programmieren.

Jedoch hab ich zurzeit noch das Problem, dass ich die Motoren mit dem Befehl stepper.stop(); nicht gestoppt bekomme mit Hilfe der Accelstepper.h Bibliothek.

Und ich stehe vor der Frage wie ich die Home Position programmiere?

Und bei vielen Codes von anderen sehe ich, dass sie jedes mal den EN Pin des Shields ansteuern wo sich mir die Frage stellt warum??

Ich würde nach wie vor die MobaTools empfehlen.

tja wenn man da etwas genaueres sagen soll dann müsstest du schon mal den Sketch posten.

Es gibt eine automatische Funktion um den Code eines kompletten Sketches zu posten
Nur drei Schritte in 30 Sekunden:

In der Arduino-IDE

  • 1.) Drücke Strg-T um den Code automatisch formatieren zu lassen
  • 2.) Mache einen Rechtsklick mit der Maus und wähle die Option Für Forum kopieren
  • 3.) Wechsle zum Posting und drücke Strg-V um den Inhalt der Zwischenablage einzufügen
    fertig

Home-Position bestimmen macht man ungefähr so:
in einer Schleife immer nur einen Schritt ausgeben und dann schon nachsehen ob der Referenzsensor geschaltet hat.

Wenn das ganze nachher produktiv eingesetzt werden solltet ihr der Maschine professionelle induktive Initiatoren gönnen. Die Profiausführung kostet 50 Euro das Stück
Aber das ist es in einer Firma die eine zuverlässig und automatisch arbeitende Maschine braucht auf jeden Fall Wert.

Wenn das jetzt nur so ne Schul-Sandkasten-Spielerei ist dann tut es auch ein induktiver Näherungssensor vom Chinesen

Ein Kompromiss wäre der hier

NPN-Schaltausgang ist viel leichter zu händeln als PNP.

Ich würde den Öffner nehmen. Das hat den Vorteil dass er im Normalzustand geschlossen ist. Das bedeutet wenn das Signal außerhalb der Referenzfahrt fehlt ist da Kabelbruch. Weil Normalzustand ja Signal liegt an ist.

Also Referenzfahrt (Homing) macht man langsamer als Positionieren.
Man fährt in Richtung Referenzsensor einen Schritt ausgeben checken ob der Ref-Sensor kurz "Ini" (von Initator) genannt schaltet. Wenn nein noch einen Schritt ausgeben usw.
Schritte mitzählen. Wenn man schon mehr Schritte ausgegeben hat als der mechanische Fahrweg ist stimmt was nicht => In Störung gehen.
Sonst wenn der Ini geschaltet hat. Das ist gleichbedeutend mit die Mechanik ist im Bereich des Inis dann wieder gaaaanz langsam von Ini wegfahren bis er gerade umschaltet.
Das gibt eine Wiederholgenauigkeit von mindestens 0,1 mm. Mit spielfreien Kugelumlaufspindeln oft auch 0,02 mm.

Danach wird im Programm die Variable die die Koordinate wiederspiegelt auf den richtigen Wert gesetzt. Diesen Wert muss man beim Einrichten einmal durch mehrere Versuche ermitteln und speichert ihn dann in den Voreinstellungen der Maschine ab (EEPROM evtl. FRAM) weil man in FRAM 12 Milliarden mal reinschreiben kann. In einen EEPROM nur 100.000 mal. Da muss man aufpassen dass man keine Schleife baut die den microprozessor-internen EEPROM kaputt nudelt.

Enable nach jedem Schritt macht keinen Sinn.

Ein induktiver Näherungssensor hat keine beweglichen Teile. Deshalb kann da auch nichts verschleißen. Die sind superzuverlässig.

vgs

hier der Code:

#include <AccelStepper.h>



// Define stepper motor connections and motor interface type. Motor interface type must be set to 1 when using a driver:
#define YdirPin 6
#define YstepPin 3
#define YmotorInterfaceType 1
#define XdirPin 5
#define XstepPin 2
#define XmotorInterfaceType 1
unsigned long lastMillis1;


// Create a new instance of the AccelStepper class:
AccelStepper Y = AccelStepper(YmotorInterfaceType, YstepPin, YdirPin);
AccelStepper X = AccelStepper(XmotorInterfaceType, XstepPin, XdirPin);

void setup() {
  // Set the maximum speed in steps per second:
  Y.setMaxSpeed(1000);
  X.setMaxSpeed(1000);
  lastMillis1 = millis();


}

void loop()
{

  // Set the current position to 0:
  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);


  // Run the motor forward at 200 steps/second until the motor reaches 400 steps (2 revolutions):



  while (Y.currentPosition() != 500)
    while (X.currentPosition() != 500)

    {
      Y.setSpeed(500);
      X.setSpeed(500);
      Y.runSpeed();
      X.runSpeed();

    }



  // Reset the position to 0:

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor backwards at 600 steps/second until the motor reaches -200 steps (1 revolution):
  while (Y.currentPosition() != 800)
    while (X.currentPosition() != -800)



    {

      Y.setSpeed(500);
      X.setSpeed(-500);
      Y.runSpeed();
      X.runSpeed();

    }



  // Reset the position to 0:

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 5000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }





  /////////////////////////////

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 10000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 15000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }


  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 20000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }


  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 25000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 30000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 35000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 40000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 45000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 250)
    while (X.currentPosition() != -250)


      if ((millis() - lastMillis1) >= 50000) {

        Y.setSpeed(500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != 420)
    while (X.currentPosition() != 420)


      if ((millis() - lastMillis1) >= 55000) {

        Y.setSpeed(500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 60000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 65000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 70000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 75000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 80000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 85000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 90000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 95000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 100000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -250)
    while (X.currentPosition() != 250)


      if ((millis() - lastMillis1) >= 105000) {

        Y.setSpeed(-500);
        X.setSpeed(500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -500)
    while (X.currentPosition() != -500)


      if ((millis() - lastMillis1) >= 110000) {

        Y.setSpeed(-500);
        X.setSpeed(-500);
        Y.runSpeed();
        X.runSpeed();


      }

  Y.setCurrentPosition(0);
  X.setCurrentPosition(0);

  // Run the motor forward at 400 steps/second until the motor reaches 600 steps (3 revolutions):
  while (Y.currentPosition() != -500)
    while (X.currentPosition() != 500)

    {

      Y.setSpeed(-500);
      X.setSpeed(500);
      Y.runSpeed();
      X.runSpeed();


    }

  while (true);
}

Die Home Position wollten wir mit endschaltern anfahren die mechanisch durch die Achse betätigt werden.

Das wurde ich nicht unterschreiben :wink:
Als ich noch im Kundendienst war hat jeder Monteur Minimum einen im Auto,
und es war egal ob das PEPPERL+FUCHS, Sick oder Schmersal, am schnellsten waren die mit Transistor am Ausgang defekt, muss aber dazu sagen das die Dinger wurden nicht geschont mussten am tag mehrere hundert mall schalten, waren jedoch viel besser als reine Magnetschalter

Ich war 4,5 Jahre bei einer Sondermaschinenbaufirma als Programmierer.
Fahrgestellnummern Präger an die Karosse dranschieben Pneumatizylinder zubeissen lassen
Fahrgestellnummer ins Blechritzen. In 3 Minuten das nächste Fahrzeug. 24/7
Da kam das nur gaaanz selten vor, dass ein Ini mal kaputt war. Wenn da alle zwei Wochen ein Ini kaputt gewesen wäre dann hätte VW, Mercedes, BMW usw.richtig dolle gemeckert.
"Baut da mal was richtig haltbares ein"

Ausserdem hätte man das in den Logfiles sehen müssen, da wurde jeder Pups mitgeschrieben.
vgs

Bei uns (Aufzugtechnik) sind wir auf Ultraschall-Positionssystem USP vom Schmersal umgestiegen == keine Schalter, Sensoren mehr, nur ein Draht im Schacht und ein mechanische Endschalter im Schachtkopf, super zum einstellen und fast Wartungsfrei.

Sollte man als Techniker nicht wissen, was der EN (Enable) Pin eines IC's macht??

Ich sag mal so.. Wenn an dem EN Pin ein Steuersignal (HIGH) oder durch Beschaltung, die Eingangsspannung (HIGH) liegt, ist das IC eingeschaltet und nimmt Strom auf.

Was der Pin macht weiß ich.

Jedoch steuer ich diesen in meinem Programm nicht an und es sind trotzdem alle Treiber aktiv. Das ist das was mich so wundert?

Zitat aus der Anleitung von AZ-Delivery

Wenn Sie den EN-Pin auf LOW schalten, wird der Treiber aktiviert.
Standardmäßig ist dieser Pin LOW geschaltet, so dass der Treiber immer
aktiviert ist. Schalten Sie ihn HIGH, um den Treiber zu deaktivieren.

Das heißt der EN-Eingang hat auf der Treiberplatine einen pull-down-Widerstand.
Ohne äußere Beschaltung ist der Treiber aktiv.

Wenn man den Treiber abschalten möchte dann muss man den EN-Eingang mit einem IO-pin verbinden und wenn dieser IO-Pin dann HIGH geschaltet wird ist der Treiber abgeschaltet. = Spulen des Schrittmotors werden nicht bestromt.

So wie nennt man das jetzt: LOW-active oder HIGH-active?
Weil pin LOW heißt Funktion "Treiber bestromt den Motor" = abschalten deaktiviert
pin HIGH heißt Funktion "Treiber bestromt den Motor nicht = abschalten ist aktiviert.

Ein Beispiel an dem man sieht: Zu kurze Beschreibung ("low active") kann zu Verwirrung führen.
vgs

Seite 10; siehst du, dass bei dem IC der Enable Pin negiert ist, sprich es ist dauerhaft aktiviert bis ein HIGH Signal anliegt.

Warum den Drucker umbauen? Der hat (auch softwaremässig) alles, was benötigt wird, um genau zu positionieren.
Ich würde einfach einen Arduino nehmen und den die passenden G-Codes an den Drucker senden lassen.
Das Einzige, was man ändern muss ist, daß man eine serielle Schnittstelle an den Drucker baut. Dazu sucht man den USB/Seriell-Wandler und lötet einfach zwei Drähte (plus GND) an die entsprechenden Pins an. Dazu sollte man vorher den Chip auslöten und die Leitungen für TxD und RxD an die nun frei gewordenen Lötflächen auf der Platine löten.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.