Code für vier Schrittmotoren - Grundkonzept

Auf ein Neues und ein hallo in die Runde,
bevor ich mir wieder einen Tag sinnlos im Netz Halbwissen aneigene, lieber heute gleich zu den Profis. :wink:

Da ich etwas zum Chaos neige, weis ich mittlerweile, wie wichtig für mich eine vorher geplante Struktur ist.

Technische Voraussetzung ist ein Arduino Mega 2560 + RAMPS 1.4 + 4 DRV8255 + LCD im Set plus vier Nema17 Schrittmotoren (Stepper Motor Bipolar 59Ncm 2A; 1,8 deg (200 Stufen / Umdrehung) - Phasenwiderstand: 1.4ohms)

Spätere Verwendungszweck: alle vier Motoren sind festinstalliert und haben unterschiedlich Drehscheiben drauf die sie bewegen, zusammen mit einem Zeichengestänge mit einem Stift.

Code Varianten: jeder Motor soll Rechts- und auch Linksherum laufen können. Es sollen unterschiedliche Geschwindigkeiten, Stop and Go-Intervale, Halbdrehungen, Dreivierteldrehungen und evtl. unterschiedlich Geschwindigkeits-Intervale geben.

Da ich noch gar keine Ahnung vom Coden in Arduino habe (aber ein paar wenig Programmiererfahrungen in anderen Programmen) stellt sich für mich zuerst die Frage nach dem Grundkonzept, wie ich es an gehen soll.

Was meine ich?
Nun ihr habt ja die vielen Code-Varianten gesehen, die ich im Lauf der Zeit umsetzten will. Ich vermute die passen nicht alle gleichzeitig in eine Datei oder in den Speicher des Mega? Oder ich kann sie wahrscheinlich auch nicht in der Gesamtheit mit dem LCD auswählen und ansprechen?

Wie würdet ihr Profis so etwas technisch umsetzen? Legt ihr Euch zu jeder Variante einen eigenen Code in je einer extra Datei an und speichert die ab, und spielt ihn jeweils bei Bedarf vom Rechner auf den Mega?
Oder gibt es die Möglichkeit auf dem PC eine Oberfläche anzulegen, ähnlich einem Formular für Datenbanken, wo man jeweils ein Häckchen für die unterschiedlichsten Aufgaben macht und das ganze wird dann von da aus, jeweils auf den Mega per Kabel oder per bluetooth übertragen? (So etwas wäre mir fast am liebsten) Oder gibt schon eine Anwendung oder App in diese Richtung?
Bin mal gespannt, was ihr mir Ratten würdet. Und natürlich fange ich erst einmal immer mit einem Motor an und werde mich steigern.

Ich antworte als Amateur!

Ich arbeite mit der Arduino-IDE, jedes Programm benötigt daher ein eigenes Verzeichnis.

  1. Ein Testprogramm für einen Motor, der sich dreht.
  2. Ein Testprogramm für die Anzeige und das Poti, beispielsweise Potiwert auf LCD anzeigen.
  3. Beide Programme im Projektprogramm zusammenführen.

Verschiedene Versionen eines Programms speichere ich im selben Verzeichnis mit einer Zahl als Erweiterung, also beispielsweise ESP-NOW_one_to_many_sender_scan.ino.001.

Geht es dir um die Varianten, die im Laufe der Entwicklung entstehen, bis das endgültige Program fertig ist ? Für sowas verwende ich die Versionsverwaltung Git. ( Das ist unabhängig davon, ab man das auch auf GitHub veröffentlichen will ).
Oder geht es um Varianten, die später unterschiedliche Zeichnungen anfertigen sollen? Da würde ich schauen, dass man das mit einem Code erledigen kann, der unterschiedlich parametriert wird.

Für den finalen Aufbau:
Bei den “Code-Varianten” muss es sich gar nicht um solche handeln.
Aus Erfahrung rate ich zu genau einem Programm, das über Daten dazu überredet wird, dies oder jenes zu tun.
Da gibt es viele Möglichkeiten sowas umzusetzen; sowohl was die Funktionen als auch was die Eingabe angeht (SD-Karte, Interpreter über serielle Schnittstelle gesteuert, Schreiben einer Konfiguration ins EEPROM, “Programmierung” über ein paar Tasten und das Display…).

Eher das, wenn wir vom selben reden. Ich meine zum Beispiel: Motor 2 und 4 laufen im Verhältnis 2:1 gegen über Motor 3 und liefern eine Zeichnung. Ein anderes Mal laufen alle Motoren im Verhältnis 1:1 zu einander usw. und sofort. Ein andermal soll zum Beispiel Motor 1 stehen, Motor 2 halb so schnell laufen wie Motor 3. Wieder ein anderes mal soll Motor 2 kurzanhalten und starten, anhalten usw. und Motor 3 soll konstant weiter laufen. usw. usw.

mit einem Code erledigen kann, der unterschiedlich parametriert wird.

Kann man den so etwas komplexeres dann im LCD ansteuern? Wenn ja wäre das eine feine Sache.

Das klingt ja sehr spannend. Keine Ahnung ob ich das später schaffe, aber hättest du mal ein Beispiel, evtl. auf Youtube oder einer Webseite damit ich mir das besser vorstellen kann und verstehe.

Hallo,
ich könnte mir eine Ablaufsteuerung vorstellen. Für jedem Schritt gibt es eine Position und Geschwindikeit um auf den nächsten Schritt zu kommen. Wenn ein Motor nichts machen soll ist halt alte Position = neue Position. Weiter gehts wenn alle Ihre Position erreicht haben, eventuell noch einen zusätzliche Wartezeit.
Erstellen kannst Du die Parameter über ein Button Menue, mit Display oder auch am PC als CSV Datei. und SD Karte. Deiner Phantasie sind wenig Grenzen gesetzt. Allerdings bis dahin ist lernen, üben , lernen… angesagt. :wink:

Heinz

So ein genau für Dich passendes leider nicht, aber im Thema Mehrere-bipolar-schrittmotoren-ansteuern-aber-wie? kannst Du ja mal schauen, ob Du etwas Nützliches finden kannst.

achsen[X_ACHSE].Step.setSpeed( 200 );              // = 20 U/Min (motorspezifisch)

Anstelle der Konstanten 200 könntest Du den Wert eines Potis verwenden.

Nein, ein Beispiel habe ich leider nicht zur Verfügung.

Für den Anfang könntest Du Wertekombinationen, wie Du sie in #5 beschrieben hast, erstmal fest einprogrammieren (oder ins EEPROM legen) und über die LCD sowie ein paar Taster (vielleicht drei: vor, zurück, “Enter”) dann eine Variante auswählen und ablaufen lassen.

Dann kann Deine Maschine zwar erstmal “nur” eine vorher bestimmte Auswahl von Zeichnungen anfertigen, aber das ist möglicherweise für den Anfang ein noch beherrschbarer Umfang.
Danach könntest Du das erweitern um Abläufe (“kurz anhalten” und “starten”) und Änderungen dieser “Programme” wie von Rentner in #7 beschrieben später angehen.

Das Prinzip ist immer das gleiche - wie im verlinkten Beispiel von agmue: Eine Zustandsmaschine, die in einem bestimmten Zustand einen Satz Werte anwendet und Bedingungen für Zustandsübergänge hat. Wo die am Ende herkommen - egal (und beliebig kompliziert wenn man mag).

In einem großen Wurf das ‘Endziel’ angehen wird wohl nicht funktionieren. Anfangs solltest Du jetzt erstmal schauen, dass Du das statisch hinbekommst, dass die Motore in einem bestimmten Verhältnis zueinander laufen. Als nächstes würde ich mit dem LCD ein kleines Menü machen, wo Du die Drehzahl der Motoren dann mit dem Encoder einstellen kannst und dann mit einem ‘Startbefehl’ gehts los.
Da bekommst Du auch erstmal ein Gefühl für die Programmierung deiner HW. Da sind eine ganze Menge Teilaufgaben drin - LCD Ansteuern, Encoder auswerten, Motore ansteuern starten/stoppen. Dieses Wissen musst Du dir erstmal erarbeiten.
Mit dem Wissen kannst Du dann irgendwann an die engültige Lösung gehen - wie immer die auch aussehen mag. Erstmal musst Du ja ein Gespür dafür bekommen, was alles möglich ist, und wie man das erreichen kann. Allgemeine Programmiertechniken halt - auf deine Anwendung zugeschnitten.

Am Ende könnte ich mir auch so eine Art ‘Interpreter’ vorstellen, der dann nach einem vorgegebenen Datensatz die Abläufe steuert. Dann kannst Du mit einem Sketch die unterschiedlichsten Muster erstellen.

Bei den MobaTools ist sogar schon sowas ähnliches als Beispiel dabei. Für den Test der ganzen Steppermethoden hatte ich einen Sketch geschrieben, mit dem man die Methoden über den seriellen Monitor aufrufen kann. Also zu jeder Zeit neues Ziel vorgeben, Rampe änden Geschwindigkeit ändern u.s.w. Und diese Kommandos kann man in dem Beispielsketch auch in einer Abfolge ins EEPROM schreiben, mit einer Bedingung, wann das nächste Kommando ausgeführt werden soll.
Sowas ähnliches - nur eben nicht für einen, sondern für am Ende 7 Stepper - könnte ich mir auch für deinen Anwendungsfall vorstellen: Einen ‘Zeichnungsinterpreter’. Ich denke dass für deine Anwendung gar nicht viel Kommandos notwendig sind. Ist wahrscheinlich jetzt noch etwas ‘starker Tobak’. Aber wenn Du dir die Programmiertechniken Schritt für Schritt aneignest, wirst Du am Ende soweit sein, das hinzubekommen.

1 Like

als STL würde es auch Marlin zeichnen.

Wenn ich mich an sein Beispielvideo erinnere, wüsste ich nicht wie das funktionieren soll. Das Muster entsteht ja erst durch die Bewegung der Motore auf dem Spirographen und ist nicht vorbestimmt.
STL ist für die Beschreibung 3-dimensionaler Körper gedacht.

Im Prinzip ist es ein großer Drucker, CNC oder Laser, da brauchts nur X und Y

Der Satz trifft wohl den Nagel auf den Kopf. :grinning:
Ich werde wohl erst in einigen Wochen, manches aus diesem Thread hier verstehen.
Jetzt werde ich erst einmal darüber schlafen und Morgen werde ich wohl mit dem 1 mal 1 beginnen müssen. Und da werde ich wohl mächtig Hilfe brauchen, wie ich das am geschicktesten angehe. Und wo ich am besten Nachlesen kann oder Tutorials die es erklären usw. usw.
Testen, nachfragen, verwerfen, testen, nachfragen, denken man hat es verstanden, bis man merkt ich verstehe es gerade doch wieder nicht und zum Schluss glücklich sein, wenn man kleine Erfolge hat.
Vielen Dank in die Rund für Eure Antworten. :+1:

Dann hast Du aber keinen Spirographen, sondern einen Plotter. Das sind 2 vollkommen unterschiedliche Dinge - auch wenn beide letztendlich eine Zeichnung produzieren. Hier geht es nicht um einen Plotter.

Was skorpi080 vermutlich meint: Der Stift bewegt sich zweidimensional in einer Fläche, also X- und Y- Achse. Daher muß man der CNC-Software nur die gewünschte Form mitteilen, dann malt sie diese. Soweit stimme ich zu.

In diesem Projekt ist die Idee aber, mit sieben sich drehenden Achsen eine Grafik zu erzeugen. Das stelle ich mir eher als künstlerisch kreativen Schaffensakt vor, nicht berechnet reproduzierbar. Da ich keine CNC mit sieben Achsen kenne, bin ich hinsichtlich CNC-Software skeptisch.

Ja, das ist eben genau der Unterschied zwischen einem Plotter und einem Spirographen. Ein Spirograph ‘erzeugt’ eine Grafik, die vorher nicht bekannt ist. Wie du schreibst, es ist ein kreativer Vorgang. Durch Manipulation der Motorbewegungen kann man das Ergebnis beeinflussen.

Ein Plotter zeichnet ‘stumpf’ ein Muster nach, dass der PC vorher berechnet hat. Wenn da Kreativität drin steckt, dann fand die vorher auf dem PC statt.

Das sind 2 ganz unterschiedliche Ansätze.

Ich bin mir nicht mehr ganz sicher ( ist schon zu lange her :wink: ) aber wenn ich mich recht erinnere hatten wir schon große Fräsmaschinen mit 7 Achsen. Da wird der Fräskopf ja nicht nur in x/y/z Richtung bewegt, sondern muss auch noch in alle möglichen Richtungen schwenkbar sein, um mit dem Fräser überall hinzukommen.
3 Raumkoordinaten, +3 Schwenkachsen + Fräserrotation = 7 Achsen.
Aber eine CNC-Software ist hier fehl am Platz - egal wie komlex sie auch sein mag. Die ist immer nur dazu da, um etwas vorgegebenes möglichst genau zu produzieren.

also weiß man hier garnicht was man will und macht einfach um die Zeit totzuschlagen?
Klar, um dasselbe Gekritzel zu haben schreibt man sich die Werte auf oder lässt das Programm durchlaufen.
Aber wenn man weiß was man will, macht man ne 2D oder 3D Datei und lässt es wie ein Drucker oder CNC abfahren. Gcode eben.

Doch ich denke der TO hat deutlich geschrieben und gezeigt was er will. Nur offensichtlich kannst oder willst Du es nicht verstehen.

Es geht um einen Spirographen. Das hat nunmal mit CNC und Gcode nichts zu tun.