Offroad GTI
17.11.2025, 11:59 |
Arduino Programmierung "speciale" (Elektronik) |
Ich habe da mal wider ein Programmierproblem.
Grindstone war mitte des Jahres ja schon so freundlich, mir ein Programm zu schreiben. Dieses Programm soll jetzt noch erweitert werden.
Das Hauptproblem besteht darin, dass die verschiedenen Betriebsmodi nur über zwei Digitalausgänge der übergeordneten SPS codiert werden können.
Hier erst mal eine verbale Beschreibung (ich weiß, ein Timing-Diagramm wäre besser und kann ich auch nachreichen).
1) Automatik-Betrieb
Zunächst mal soll über SPI ein BCD-Schalter ausgelesen werden (dafür habe ich schon ein Sketch, welches eingebunden werden kann) welcher die Anzahl der Impulse vorgibt.
Wenn über START ein kurzer Impuls kommt, sollen die entsprechende Anzahl an Impulsen (mit einem bestimmten ganzzahligen Faktor multipliziert) an den Schrittmotortreiber ausgegeben werden. Der Binärausgang für die Drehrichtung soll dabei auf 0 bleiben (ist nur eine willkürliche Festlegung). Nachdem alle Impulse ausgegeben wurden, soll über den Binärausgang ENDE ein kurzer Impuls an die SPS zurück gegeben werden.
Wenn über START zwei kurze Impulse kommen, soll auch die entsprechende Anzahl an Impulsen an den Schrittmotor ausgegeben werden. Der Binärausgang für die Drehrichtung soll dabei aber auf 1 für die andere Drehrichtung wechseln und es soll auch wieder eine Rückmeldung an die SPS erfolgen.
2) Hand-Betrieb
Der Digitaleingang HAND wird von der SPS auf 1 gesetzt und es kommt (mit kurzer Verzögerung) von START ein Impuls, soll der Digitalausgang für die Impulse zum Schrittmotor so lange 'laufen', wie HAND auf 1 steht. Wie im Automatik-Betrieb soll der Binärausgang für die Drehrichtung dabei auf 0 bleiben.
Wenn über START dann zwei kurze Impulse kommen soll das gleiche passieren, nur auch wieder in die andere Richtung.
Ich wüsste zumindest keine andere Variante, wie diese Funktionen sonst mit nur zwei Eingängen realisiert werden könnten.
Bei diesem Lastenheft wüsste ich schon gleich gar nicht, wie ich mit der Programmierung anfangen sollte...
Vielleicht kann der Kollege Schleifstein ja nochmal helfen (gerne auch gegen eine Aufwandsentschädigung)
Gruß, Mathias |
Offroad GTI
24.05.2026, 09:59
@ grindstone
|
Arduino Programmierung "speciale" |
» Ganz einfach: In der Schleife wird der Schalterstatus geprüft, und wenn
» der Schalter angesprochen hat, wird die Abbruchbedingung der Schleife
» gesetzt. Also einfach die Variable "motorschritte_h" auf "0" setzen, dann
» wird die Schleife beim nächsten Durchlauf verlassen.
Klingt gut.
» Diese Schalterabfrage solltest du dann aber auf den Automatikbetrieb beschränken, denn sonst
» kannst du das Werkzeug auch von Hand nicht mehr zurückfahren ("stop"
» heißt "stop", egal welche Richtung), es sei denn, du siehst eine weitere
» Möglichkeit vor, das Endschaltersignal von Hand zu unterbrechen.
Die SPS ist so programmiert, dass die Endschalter frei gefahren werden können.
Endschalter Rechts angefahren, Vorwahlschalter steht aber auf Links --> verfahren nach Links möglich (und umgekehrt)
» Auch kein Problem, nur würde ich vorschlagen, das etwas anders umzusetzen.
Für andere Ideen bin ich immer offen.
» Anderen könntest du den Unterschied der Verfahrwege individuell anpassen
» und wärst du nicht auf den Faktor 10 festgelegt.
Es gibt aber nur den Faktor 10 (die "Maschinenkonstante" 2,61 bleibt ja jeweils gleich)
» Schritte einfach nur durch 10 teilst, wird die Einerstelle der
» Kodierschalter praktisch wirkungslos (es sei denn, genau das ist deine
» Absicht).
Das ist nicht die Absicht.
Der BCD-Schalter wird als Zahl xyz eingelesen.
Beim Hobeln soll daraus xy,z mm werden und beim Fräsen xyz mm.
» Ebenfalls kein Problem. Der Flankenzähler wird zusätzlich noch auf die
» Werte "3" und "4" abgefragt und jeweils die entsprechenden Parameter für
» Drehrichtung und Faktor gesetzt.
Stimmt, da hab ich schon wieder zu kompliziert gedacht.
» Hier Q&D und ungetestet mein Programmvorschlag (die Änderungen habe ich
» jeweils mit drei Sternchen gekennzeichnet):
Danke  |
grindstone

Ruhrpott, 23.05.2026, 12:52 (editiert von grindstone am 23.05.2026 um 23:58)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Die Wünsche und Ideen reißen leider nicht ab.
Das wusste schon Johann Martin Miller: "Je mehr er hat, je mehr er will, nie schweigen seine Klagen still"
Oder etwas freundlicher ausgedrückt: "Appetit kommt beim Essen".
» Jetzt ist jedoch aufgefallen, dass die Endschalter der Maschine noch nicht
» an den Arduino zurück gemeldet werden. Beim Testen war die Schrittweite
» immer so klein, dass dies kein Problem darstellte. Es gibt ja noch den
» DI10, welcher als "Totmannschalter" herhalten könnte. Wenn der auf "1"
» ist, ist alles i.O. Fällt er auf "0" wurde ein Endschalter angefahren oder
» es ist sonst etwas passiert. In diesem Fall soll dann die Impulsausgabe
» sofort gestoppt und der Programmablauf zurückgesetzt werden. Nur wie kann
» man die while-Schleife am besten unterbrechen?
Ganz einfach: In der Schleife wird der Schalterstatus geprüft, und wenn der Schalter angesprochen hat, wird die Abbruchbedingung der Schleife gesetzt. Also einfach die Variable "motorschritte_h" auf "0" setzen, dann wird die Schleife beim nächsten Durchlauf verlassen. Diese Schalterabfrage solltest du dann aber auf den Automatikbetrieb beschränken, denn sonst kannst du das Werkzeug auch von Hand nicht mehr zurückfahren ("stop" heißt "stop", egal welche Richtung), es sei denn, du siehst eine weitere Möglichkeit vor, das Endschaltersignal von Hand zu unterbrechen.
» Im Fräsbetrieb sind die Schrittweiten tendenziell immer größer, sodass
» der Wunsch auf kaum, dahingehend eine Unterscheidung zu Treffen.
» Fräsbetrieb: "Schritte=BCD"
» Hobelbetrieb: "Schritte=BCD/10" (dies ist aktuell umgesetzt)
Auch kein Problem, nur würde ich vorschlagen, das etwas anders umzusetzen. Statt der Variblen "motorschritte_h" und "motorschritte_f" solltest du für beide Fälle nur eine Variable "motorschritte" und stattdessen verschiedene Faktoren ( "faktor_h" und "faktor_f" ) verwenden. Das hätte mehrere Vorteile: Zum Einen bräuchtest du bei der Auswertung des Endschalters (siehe oben) nicht zwischen fräsen und hobeln zu unterscheiden, zum Anderen könntest du den Unterschied der Verfahrwege individuell anpassen und wärst du nicht auf den Faktor 10 festgelegt. Außerdem: Wenn du die Schritte einfach nur durch 10 teilst, wird die Einerstelle der Kodierschalter praktisch wirkungslos (es sei denn, genau das ist deine Absicht).
»
» Fräsen/Hobeln/Links/Rechts könnte man mit weiteren Impulsen über den
» Flankenzähler innerhalb der Torzeit realisieren. Nur wie dann weiter?? Der
» Ablauf soll in beiden Fällen der selbe sein, nur die Anzahl der
» Motorschritte unterscheidet sich um den Faktor 10.
Ebenfalls kein Problem. Der Flankenzähler wird zusätzlich noch auf die Werte "3" und "4" abgefragt und jeweils die entsprechenden Parameter für Drehrichtung und Faktor gesetzt.
EDIT:
Hier Q&D und ungetestet mein Programmvorschlag (die Änderungen habe ich jeweils mit drei Sternchen gekennzeichnet):
https://www.elektronik-kompendium.de/forum/upload/20260523235634.ino -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
22.05.2026, 18:50
@ Offroad GTI
|
Arduino Programmierung "speciale" |
Die Wünsche und Ideen reißen leider nicht ab.
Das Anpassen der Pausenzeiten für das bestehende Programm stellt ja kein Problem dar. Dann läuft auch alles ruckelfrei.
Jetzt ist jedoch aufgefallen, dass die Endschalter der Maschine noch nicht an den Arduino zurück gemeldet werden. Beim Testen war die Schrittweite immer so klein, dass dies kein Problem darstellte. Es gibt ja noch den DI10, welcher als "Totmannschalter" herhalten könnte. Wenn der auf "1" ist, ist alles i.O. Fällt er auf "0" wurde ein Endschalter angefahren oder es ist sonst etwas passiert. In diesem Fall soll dann die Impulsausgabe sofort gestoppt und der Programmablauf zurückgesetzt werden. Nur wie kann man die while-Schleife am besten unterbrechen?
Über ein Relais die Impulsausgabe an den Treiber zu unterbrechen, wäre dann Plan B.
Im Fräsbetrieb sind die Schrittweiten tendenziell immer größer, sodass der Wunsch auf kaum, dahingehend eine Unterscheidung zu Treffen.
Fräsbetrieb: "Schritte=BCD"
Hobelbetrieb: "Schritte=BCD/10" (dies ist aktuell umgesetzt)
Fräsen/Hobeln/Links/Rechts könnte man mit weiteren Impulsen über den Flankenzähler innerhalb der Torzeit realisieren. Nur wie dann weiter?? Der Ablauf soll in beiden Fällen der selbe sein, nur die Anzahl der Motorschritte unterscheidet sich um den Faktor 10.
Anbei das aktuelle Programm als neue Basis (da ein paar Kleinigkeiten angepasst wurden)
https://www.elektronik-kompendium.de/forum/upload/20260522184922.ino |
Offroad GTI
01.05.2026, 13:05
@ grindstone
|
Arduino Programmierung "speciale" |
» nämlich etwas verwirrt. Ich nehme an, der Handbetrieb dient zum Einrichten
» und der Automatikbetrieb zum Vorschub des Werkzeugs vor jedem Arbeitsspiel.
Genau.
Die Mechanik der Maschine ist echt ziemlich geil. Ich hab ja nur die Steuerung beigesteuert  |
grindstone

Ruhrpott, 30.04.2026, 14:53
@ Offroad GTI
|
Arduino Programmierung "speciale" |
Damit wird für mich jetzt auch einiges klarer. Dass es bei einer (offensichtlichen) CNC-Maschine nur *einen* Schrittmotor gab, hatte mich nämlich etwas verwirrt. Ich nehme an, der Handbetrieb dient zum Einrichten und der Automatikbetrieb zum Vorschub des Werkzeugs vor jedem Arbeitsspiel. Damit bekommt auch das "Bewegung beendet" - Signal einen Sinn. Da kann -da gebe ich dir Recht- die Schrittfrequenz im Automatikbetrieb einen festen Wert bekommen. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
grindstone

Ruhrpott, 29.04.2026, 20:13
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» » (Mal ganz nebenbei: Ich weiß immer noch nicht, was der
» » Apparat
» » eigentlich macht ).
» Sowas: https://www.youtube.com/watch?v=mA8WJKC23-g
Beeindruckend!  -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
29.04.2026, 15:12 (editiert von Offroad GTI am 29.04.2026 um 15:14)
@ grindstone
|
Arduino Programmierung "speciale" |
» Wirklich seltsam! Du könntest versuchsweise die beiden Zeilen
» delayMicroseconds(2);
» jeweils durch
» delayMicroseconds((int)impulslaenge);
» ersetzen. Dann sind Puls und Pause gleich lang. Vielleicht hilft das ja.
Ein genauerer Blick in die Anleitung (passend zu deiner Signatur ) des DM860 Treibers kann auch helfen.
Die minimale Pulsbreite ist dort mit 2,5µs spezifiziert ...da-dum....
» » Superschnell ist das jetzt nicht.
» Aber immer noch deutlich schneller als die Mechanik,
Ohne Frage.
» Ansonsten kreist er in einer Warteschleife herum. "delay" heißt ja nicht,
» dass der Prozessor stehenbleibt. Die Zeiten, die er für die Berechnungen
» braucht, werden durch entsprechend kürzere Wartezeiten ausgeglichen. Aber
» eigentlich sind sie (siehe oben) vernachlässigbar.
Stimmt auch wieder.
» zu sagen. (Mal ganz nebenbei: Ich weiß immer noch nicht, was der Apparat
» eigentlich macht ).
Sowas: https://www.youtube.com/watch?v=mA8WJKC23-g |
grindstone

Ruhrpott, 29.04.2026, 08:58
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» » Ein brummender Schrittmotor bedeutet, dass die Taktfrequenz zu hoch ist.
»
» Seltsamer Weise nicht. Es war nicht der Endbereich der Frequenz, sondern
» irgendwo dazwischen.
Wirklich seltsam! Du könntest versuchsweise die beiden Zeilen
delayMicroseconds(2);
jeweils durch
delayMicroseconds((int)impulslaenge);
ersetzen. Dann sind Puls und Pause gleich lang. Vielleicht hilft das ja.
» » Der Arduino ist auf jeden Fall
» » schnell genug.
» 100µs für das Auslesen des Analogports haben wir ja schon festgestellt.
» Superschnell ist das jetzt nicht.
Aber immer noch deutlich schneller als die Mechanik, im Verhältnis etwa wie Fußgänger vs. Düsenjäger.
» » Wenn du
» » während einer Bewegung eine konstante Geschwindigkeit haben möchtest,
» » lass einfach die Finger von dem Einstellknopf.
» Der rechnet ja trotzdem permanent im Hintergrund...
Ansonsten kreist er in einer Warteschleife herum. "delay" heißt ja nicht, dass der Prozessor stehenbleibt. Die Zeiten, die er für die Berechnungen braucht, werden durch entsprechend kürzere Wartezeiten ausgeglichen. Aber eigentlich sind sie (siehe oben) vernachlässigbar.
» Wenn das Poti dann auf der "falschen Position" stand, hat sich der
» Schrittmotor nicht gerührt.
Das ist dann eine Eigenart deines Schrittmotortreibers. Da kann ich nichts zu sagen. (Mal ganz nebenbei: Ich weiß immer noch nicht, was der Apparat eigentlich macht ).
» » Die Pulsbreite ist relativ uninteressant. Es kommt auf die Taktfrequenz
» an.
» Klar. Andererseits definieren wir ja im Programm nicht direkt eine
» Frequenz, sondern nur Impulse und Pausenzeiten.
Das ist das Gleiche, nur mit einem andern Namen.  -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
28.04.2026, 18:47
@ grindstone
|
Arduino Programmierung "speciale" |
» Ein brummender Schrittmotor bedeutet, dass die Taktfrequenz zu hoch ist.
Seltsamer Weise nicht. Es war nicht der Endbereich der Frequenz, sondern irgendwo dazwischen.
» Der Arduino ist auf jeden Fall
» schnell genug.
100µs für das Auslesen des Analogports haben wir ja schon festgestellt. Superschnell ist das jetzt nicht.
» Wenn du
» während einer Bewegung eine konstante Geschwindigkeit haben möchtest,
» lass einfach die Finger von dem Einstellknopf.
Der rechnet ja trotzdem permanent im Hintergrund...
Wenn das Poti dann auf der "falschen Position" stand, hat sich der Schrittmotor nicht gerührt.
» Die Pulsbreite ist relativ uninteressant. Es kommt auf die Taktfrequenz an.
Klar. Andererseits definieren wir ja im Programm nicht direkt eine Frequenz, sondern nur Impulse und Pausenzeiten.
» Wenn du willst, kannst du ja für den Automatikbetrieb eine feste Taktrate
» vorgeben.
So der Plan. |
grindstone

Ruhrpott, 28.04.2026, 12:52 (editiert von grindstone am 28.04.2026 um 13:01)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Es gibt bestimmte Frequenzbereiche, in welchen der Schrittmotor nur
» 'komisch brummt'. Der Arduino kommt da anscheined mit der Impulserzeugung
» nicht hinterher und schickt Kaudawelsch an den Treiber.
Ein brummender Schrittmotor bedeutet, dass die Taktfrequenz zu hoch ist. Da solltest du das Programm noch einmal richtig auf die Mechanik einmessen, wie ich es weiter oben beschrieben habe. Der Arduino ist auf jeden Fall schnell genug.
» Das Einlesen des Analogwertes und Umrechnen in die entsprechende Pausenzeit
» würde ich ja immer noch gerne in einer ausgelagerten Routine haben.
Was soll das bringen? Selbst der relativ behäbige Arduino ist um Größenordnungen schneller als jede Schrittmotor-Mechanik. Da bleibt zwischen den einzelnen Impulsen genug Zeit für Berechnungen. Wenn du während einer Bewegung eine konstante Geschwindigkeit haben möchtest, lass einfach die Finger von dem Einstellknopf.
» Weiterhin hat sich rausgestellt, dass für den Automatik-Modus auch auf
» diese Funktion verzichtet, und dort wie ursprünglich mit festen
» Pulsbreiten gearbeitet werden kann.
Die Pulsbreite ist relativ uninteressant. Es kommt auf die Taktfrequenz an. Wenn du willst, kannst du ja für den Automatikbetrieb eine feste Taktrate vorgeben. Oder 2 Potis für unterschiedliche Geschwindigkeiten bei Automatik oder Hand. Es sind ja noch genug Analogeingänge frei. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
27.04.2026, 12:22
@ grindstone
|
Arduino Programmierung "speciale" |
» Ggf. würde mich eine Mitteilung über den Stand der Dinge interessieren.
»
Mich auch
Hat sich leider wieder etwas gezogen, aber am Wochenende konnte die Steuerung an der Maschine getestet werden.
Leider verlief der Test nur zum Teil erfolgreich.
Es gibt bestimmte Frequenzbereiche, in welchen der Schrittmotor nur 'komisch brummt'. Der Arduino kommt da anscheined mit der Impulserzeugung nicht hinterher und schickt Kaudawelsch an den Treiber.
Das Einlesen des Analogwertes und Umrechnen in die entsprechende Pausenzeit würde ich ja immer noch gerne in einer ausgelagerten Routine haben.
Weiterhin hat sich rausgestellt, dass für den Automatik-Modus auch auf diese Funktion verzichtet, und dort wie ursprünglich mit festen Pulsbreiten gearbeitet werden kann. |
grindstone

Ruhrpott, 23.04.2026, 13:59 (editiert von grindstone am 24.04.2026 um 15:09)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Im "Trockendock" funktioniert soweit auch alles. Der Probebetrieb an der
» Maschine dauert man wieder ein bisschen.
Ggf. würde mich eine Mitteilung über den Stand der Dinge interessieren.
Der Thread hat tatsächlich die 4000-Views-Marke geknackt. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
02.04.2026, 14:28
@ grindstone
|
Arduino Programmierung "speciale" |
» Da habe ich mich wohl etwas missverständlich ausgedrückt. Ich meinte
» damit, dass du die Werte für "impulslaengemax" und "impulslaengemin" im
» Programm-Quelltext auf die Apparatur anpassen solltest, die der Arduino
» steuern soll.
Das war schon soweit klar
Im "Trockendock" funktioniert soweit auch alles. Der Probebetrieb an der Maschine dauert man wieder ein bisschen. |
grindstone

Ruhrpott, 15.03.2026, 17:48 (editiert von grindstone am 15.03.2026 um 17:50)
@ Offroad GTI
|
Arduino Programmierung "speciale" |
» Eine hardware-basierte Zeitkonstante finde ich noch nicht so gut, werde es
» aber mal probieren.
» Die Berechnung auszulagern (mit dem Nachteil, dass dann keine Einstellung
» während der Laufzeit der Schleifen möglich ist) wäre dann immer noch
» eine Option...Oder es geht doch irgendwie mit Interrupts...
Da habe ich mich wohl etwas missverständlich ausgedrückt. Ich meinte damit, dass du die Werte für "impulslaengemax" und "impulslaengemin" im Programm-Quelltext auf die Apparatur anpassen solltest, die der Arduino steuern soll.
Dazu empfehle ich folgendes Procedere: Zuerst setzt du "impulslaengemin" auf 1.0 und "impulslaengemax" auf 0. Das Poti drehst du auf höchste Geschwindigkeit. Dann lässt du den Schrittmotor laufen und erhöhst den Wert für "impulslaengemax" so weit, dass der Schrittmotor auch beim Anlaufen keine Schritte verliert.
Anschließend drehst du das Poti auf langsamste Geschwindigkeit und änderst "impulslaengemin" so, daß der Schrittmotor mit der von dir gewünschten Minimalgeschwindigkeit läuft.
Theoretisch sollte es jetzt passen, in der Praxis kann es sein, dass du den Wert für "impulslaengemax" noch einmal nachjustieren musst. -- Es ist unter der Würde eines Technikers, die Gebrauchsanweisung zu lesen! |
Offroad GTI
15.03.2026, 11:27
@ grindstone
|
Arduino Programmierung "speciale" |
» https://www.elektronik-kompendium.de/forum/upload/20260306142243.ino
»
» Die geeigneten Werte für "impulslaengemax" und "impulslaengemin" hängen
» von deiner Hardware ab, die musst du empirisch ermitteln (auf gut deutsch:
» Ausprobieren). Die Werte beeinflussen sich gegenseitig, du musst also
» eventuell noch ein paarmal nachjustieren.
Danke dir (konnte leider nicht früher antworten).
Eine hardware-basierte Zeitkonstante finde ich noch nicht so gut, werde es aber mal probieren.
Die Berechnung auszulagern (mit dem Nachteil, dass dann keine Einstellung während der Laufzeit der Schleifen möglich ist) wäre dann immer noch eine Option...Oder es geht doch irgendwie mit Interrupts... |