Anmelden

Archiv verlassen und diese Seite im Standarddesign anzeigen : Suche Serviceleistung Schrittmotorsteuerung - kann mir jemand einen Code schreiben? (Bezahlung)



Andi#87
23.09.2025, 13:37
Hallo, mangels eigener Fähigkeit...

Kann mir von Euch jemand einen Code schreiben für eine auf meinen Bedarf zugeschnittene Schrittmotorsteuerung? Bezahlung nach Vereinbarung. Für Arduino (wenn möglich UNO Atmega 328 - ggf. mit Porterweiterung MUX). Drehgeber/Encoder, 2 Richtungstasten, eine Taste für "Turbo", eine Taste für "Langsam". 4 (oder wenn möglich sogar 6) Positionstasten ("Recall"), eine "Store"-Taste zum speichern einer zuvor angefahrenen Position. Wichtig ist, dass die gespeicherten 4 (oder eben 6) Positionen nach Stromtrennung oder Reset korrekt erhalten bleiben (Eprom). Ein Display (i2c, 1602) zur Anzeige der Positionen.

(Wollte das hier eigentlich unter "Stellenanzeigen" eintragen, aber ich habe nicht entdecken können, wie/wo ich das machen kann. Deswegen hier im Forum reingesetzt.)

Andi

Andi#87
24.09.2025, 14:11
Ich entnehme den ausbleibenden Antworten, dass das möglicherweise garnicht so einfach ist...(?) Falls jemand unter Euch dazu Hinweise oder Vorschläge hat, würde ich mich freuen, wenn Ihr mir damit weiterhelfen könntet. Ich schätze, das mit dem Speichern ist der Knackpunkt. Ich habe bisher dazu 2 Möglichkeiten gefunden: entweder nach einem Stromausfall eine Referenzfahrt machen, oder einen (teuren) Schrittmotor mit aufgesetztem Absolutwert-Encoder verwenden. Aber hierfür fehlen mir einfach die Kenntnisse...

Andi

Holomino
24.09.2025, 17:12
Naja,
12 Tasten als 4x3 Matrix, I2C-Bus zum Display und zwei Ausgänge für Takt und Richtung klingen nicht sooo kompliziert.
Wobei:
- wie wird die Speicherstelle (1..6) der Store-Taste angewählt?
- Wozu ist der Drehgeber/Encoder?
- Warum nicht einfach den Controller bei "Stromaus" batteriegepuffert in den Sleep schicken?
- Müssen nicht solche Parameter, wie "Turbo" und "Langsam" über das Display und die Tasten einstellbar sein?
- Gibt's dann u. U. auch noch Beschleunigungsrampen mit Parametern?

Es kommt maßgeblich auf's Beiwerk an, wie lange es dauert und was Du letztendlich dafür bezahlen musst.
Und es kommt natürlich auch darauf an, wie weit Deine Hardware ist und wie stabil sie läuft, damit Missverständnisse oder zeitlicher Verzug gar nicht erst auftreten können.

Andi#87
25.09.2025, 12:34
Danke für Deine Antwort. Der Code selbst ist nicht das große Problem. Ich habe einen Code, der funktioniert. Das Problem ist die Speicheroption bzw. der Erhalt dieser gespeicherten Positionen nach Neustart oder Reset. Diese Daten gehen verloren bzw. verschieben sich. Die Batteriepufferung ist eine gute Idee. Da muss ich mal suchen, wie sowas gemacht wird, denn einfach eine Batterie parallel zum Netzteil anklemmen ist ja eher nicht zu empfehlen ;-) Da wird sich in den unendlichen Weiten sicher ein Schaltplan finden.

Danke
Andi

Holomino
25.09.2025, 13:36
Wenn es nur um den Datenerhalt geht, reicht wahrscheinlich auch ein Goldcap, der Dir nach dem Abschalten der Versorgungsspannung die Gelegenheit gibt, die Werte ins EEPROM zu schreiben.

Beim Reset geht das aber auch nur, wenn Du den eigentlichen Reset-Button auf einen freien Portpin umlegst, der auf Knopfdruck die Werte speichert und anschließend einen Softreset ausführt.

Moppi
25.09.2025, 23:41
Ich hänge mich einfach mal mit rein, weil es gerade schon spät ist und mein Tagwerk eigentlich vollbracht. Wenn ich mich so an meine Steuerung mit Schrittmotor Nema17 und Atmega328P-PU erinnere, ist da nichts mit Eprom. Die Schrittmotorsteuerung an sich ist ja nicht so schwer. Auf einem Atmega328 kann man eben nichts speichern und auch nicht, wenn man da einen Reset ausführt. Also gespeichert werden muss, nachdem die letzte Aktion erfolgte und bevor Spannungsversorgung ausfällt oder Reset erfolgt. Wenn es unbedingt gespeichert werden muss, fielen mir eine SD-Karte ein und ein ESP8266 wegen dem Flash, das ist gut, verbraucht aber mehr als ein Atmega328.

SD-Karte am UNO:

VCC: An den 5V-Pin des Arduino.GND: An den GND-Pin des Arduino.
CS (Chip Select): Normalerweise Pin 10, aber Sie können ihn im Code anpassen.
MOSI (Master Out Slave In): Pin 11 am Arduino Uno.
MISO (Master In Slave Out): Pin 12 am Arduino Uno.
SCK (Serial Clock): Pin 13 am Arduino Uno.

Ich denke, das würde ich in Erwägung ziehen. Oder auch das Folgende, frisch aus den Zutaten meiner Backstube:

W25Q80RVSNJM:FLASH - NOR (SLC) Speicher IC 8Mbit SPI

Kurze Befragung des Orakels: es sagt das funktioniert (ohne Gewähr).

Die Pins des Arduino Uno, die du dafür benötigst, sind:


D10 (SS - Slave Select)
D11 (MOSI - Master Out, Slave In)
D12 (MISO - Master In, Slave Out)
D13 (SCK - Serial Clock)

So weit mir gesagt wurde ist das Teil ganz beliebt, als kleiner Speicher und sehr robust. - Und ..... günstig.

Damit wäre das Problem, so glaube ich, gelöst.

Andree-HB
26.09.2025, 06:20
...ist da nichts mit Eprom.

...warum sollte das nicht gehen:
https://docs.arduino.cc/learn/built-in-libraries/eeprom/

Man sollte allerdings drauf achten:
"Note: An EEPROM write takes 3.3 ms to complete. The EEPROM memory has a specified life of 100,000 write/erase cycles, so you may need to be careful about how often you write to it."

- - - Aktualisiert - - -

by the way, Andi - ohne zu wissen, was genau Dein Anwendungsfall ist...es gibt als absolute Positionserkennung sogenannte "Glasmaßstäbe":
https://de.wikipedia.org/wiki/Glasma%C3%9Fstab

z.B.
https://de.aliexpress.com/item/33060084701.html

...dazu ist die Position auch nach Unterbrechung der Stromversorgung eindeutig, bzw. man benötigt keine Referenzfahrt. (zumindest bei Absolutwertgeber, es gibt auch inkrementelle Wertgeber)

oberallgeier
26.09.2025, 09:44
.. - Warum nicht einfach den Controller bei "Stromaus" batteriegepuffert in den Sleep schicken? ..Siehe bei mikrocontroller.net / Markus Frejek / AVR-Transistortester .. Features (https://www.mikrocontroller.net/articles/AVR-Transistortester#Features)
".. Stromverbrauch im ausgeschalteten Zustand: < 20 nA .."

Mein Pacer (für Lauf- und Gymnastiktraining) läuft damit und mit nem 9V-Block monatelang (wenn er mir nicht zu oft grün+rot vor-blinken muss *gg*).


.. Wenn ich mich so an meine Steuerung mit Schrittmotor Nema17 und Atmega328P-PU erinnere, ist da nichts mit Eprom .. Auf einem Atmega328 kann man eben nichts speichern und auch nicht, wenn man da einen Reset ausführt ..Oh oh aua - da MUSS ich einfach anmerken: Abgesehen von andern Aussagen steht in den 328er Datenblättern die ICH besitze etwa so:


.. High Endurance Non-volatile Memory Segments ...
̶ 256/512/512/1KBytes EEPROM ..(Meine uralte Plattitüde: ".. Controller programmieren ohne das Datenblatt zu lesen ist eines der letzten großen Abenteuer unserer Tage ..")
Selbst ein tiny13 hat 64 Bytes EEPROM! Single-Chip und 8-Bit-Harvard-Architektur bringens eben.


... by the way, Andi - ohne zu wissen, was genau Dein Anwendungsfall ist...es gibt als absolute Positionserkennung sogenannte "Glasmaßstäbe" ...Ahhh, Andree ist eben schneller. Dazu ne Anmerkung: aus nem alten Drucker hab ich so nen Maßstab (glasklarer Plastikstreifen mir hauchdünnen Markierungen) ausgebaut. Liegt (mit Lese-Schlitzblock) bei meinen Anschauungsmatrerialien!

Moppi
26.09.2025, 09:58
...warum sollte das nicht gehen:
https://docs.arduino.cc/learn/built-...raries/eeprom/ (https://docs.arduino.cc/learn/built-in-libraries/eeprom/)


Auflösung des Widerspruchs, im ausgeruhten Zustand:

Eproms sind UV-Löschbar. Sowas hat der ATmega328 nicht und es würde auch dem Zweck nicht entsprechen.
Den internen EEprom zu verwenden ist eine andere Sache und wäre möglich.

Aber ich habe nicht bedacht, dass diese kontextuelle, qualitative Abwertung in meinem Gedankengang nicht verstanden wird und die Aussage stattdessen als absolute, quantitative Falschaussage (man könnte gar nichts speichern) interpretiert wird.

Weitere Überlegung:

Ob man das unbedingt benutzen sollte, ist nicht ganz klar. Es kommt vor allem auf die Menge der zu schreibenden Daten an. Nach Recherche hat der interne immerhin 100.000 Schreibzyklen pro Byte mit insgesamt 1024 Byte. Wie viele Positionsänderungen sollen denn gespeichert werden? Wenn es 1 Pro Konfiguration ist: absolut kein Problem. Je nach Schreibhäufigkeit sollte man sich eine Strategie bezüglich des Schreibens ausdenken, um die Lebensdauer zu verlängern (Wear Leveling). Man könnte ein Speichermenge als Ringpuffer nutzen. Beispielsweise 512Byte für 2Byte Positionsdaten. Das erhöht die Lebensdauer auf 100.000 x 256.

---

Die ursprüngliche Diskussion hat sich durch die kritischen Anmerkungen zum EEPROM und die terminologische Verwirrung von meinem Vorschlag entfernt.


Meine Lösung basiert auf einer proaktiven, verschleißarmen Speicherung während der Aktion und einer passiven Reaktion bei Stromausfall.


Wann speichern? Bei sicherer Spannungsversorgung. Die aktuelle Position wird sofort im externen Flash gespeichert, nachdem der Schrittmotor seine Bewegung abgeschlossen hat.
Der W25Q80 SPI Flash ist günstig, bietet 1 MB Speicherplatz und schont das interne EEPROM. Kein eventuelles Risiko des Totalausfalls des ATmega328P-PU bei unsicherer Speicherung während Stromausfalls im internen EEPROM.
Wear Leveling: Die einfache Implementierung eines Ringpuffers im Speicher verteilt die Schreibzyklen über Tausende von Sektoren und sorgt für eine praktisch unbegrenzte Lebensdauer (in Verbindung mit der hohen Speicherkapazität und den im Verhältnis extrem geringen Datenmengen).


Stromausfall während der Bewegung:
Wenn der Stromausfall während der Verstellung des Motors oder des Speicherns auftritt, ist die tatsächliche Position des Motors grundsätzlich unsicher und die gespeicherte Daten könnten korrupt sein. Ein Goldcap würde den ATmega und Speicher am Laufen halten und für eine sichere Speicherung im letzten Moment sorgen, aber er könnte keine korrekte Position des Motors speichern, da diese physikalisch bereits verloren ist.


Neustart und Wiederherstellung:


Startverhalten: Beim nächsten Start liest der ATmega den letzten gültigen Datensatz aus dem Flash.
Sicherheitsmodus: Sollte der Motor durch den Stromausfall manuell verstellt worden sein, reicht die Speicherlösung allein nicht aus. Dann muss das System entweder eine Referenzfahrt durchführen (z.b. zurück zum Endschalter) oder einen Absolutwert-Encoder verwenden.
Da das Programm nicht wissen kann ob der Motor seine Position noch erreicht hat, wäre nach dem Neustart eine Referenzfahrt das sichere Szenario (ohne Absolutwert-Encoder).


Deep Power-Down Mode des W25Q80RVSNJM: Die typische Stromaufnahme beträgt <1µA bei einer Versorgungsspannung von 2.7V bis 3.6V. Damit passt der Flash perfekt zum ATmega328P im Power-Down Mode. Um eine Batterie zu schonen wäre es sinnvoll den Atmega328P-PU mit 3.3V zu betreiben. Mit 8MHz internem Oszillator oder externen 8MHz (was die Stabilität verbessert).

Ich muss noch was hinzufügen, es betrifft die Frage wie der Goldcap ganz genau ins Spiel kommt.
Über eine Diode den Goldcap laden, dann kann die Versorgungsspannung an einem dafür geeigneten Pin angeschlossen werden. Bleibt die Spannung vor der Diode weg, ist dies das Signal, das Schreiben der letzten Daten zu beenden und alles in einen Sleep Modus zu versetzen. Somit ist es möglich über eine längere Zeit die Spannungsversorgung zu gewährleisten, bis die Hauptversorgungsspannung wieder da ist. Die Zeiträume können je nach Größe des Kondensators recht lang sein (>1h), wenn wir von einem geschätzten Strom von 100 uA in den sparsamsten Modi ausgehen.

Andree-HB
26.09.2025, 15:47
...was ein angedichtetes "E" dann doch für Irritationen auslösen kann. :-)

Ich hätte tatsächlich einen doch noch recht aktuellen Microcontroller niemals in die Nähe eines UV-löschbaren Speicher in Verbindung gebracht, daher leider das falschlesen dieses sehr wichtigen, gedacht ergänzenden Doppelbuchstabens.
(Ich musste nun gleich wieder an meine erste, mustergespeicherte Lichtsteuerung (mittels Eprom) aus einer ELRAD-Ausgabe aus den 70ern denken...aber ich will hier nicht den Thread mit alten Geschichten entführen) ;-)

Holomino
27.09.2025, 11:27
Ahh, nicht ganz einfach, aber auch nicht schwierig.
Das UNO-Board hat noch einen zweiten Controller als Programmierschnittstelle und auch eine Power-LED. Mit Sleep auf dem Mega328 erreicht man nur eine Stromabsenkung von 50 auf 33mA. Das ist nicht optimal für eine Pufferbatterie.

Was aber geht. Der VIn-Pin des Boards liegt zwischen eingangsseitiger Schutzdiode und Spannungsregler. Da könnte man einen fetten 16V-Elko mit 10mF = 10mAs/V dranhängen, der sich auf die typische Netzteilspannung von 7..12V auflädt. Bei 50mA Stromaufnahme des UNO-Boards sollte die Entladung des Elkos dann ja rechnerisch 200ms pro Volt überbrücken können.
Wenn das UNO-Board (Reset-Schaltung) oder das Netzteil (Überstrom) wegen des Elko-Ladens beim Einschalten bockig sind, kann man auch noch einen Widerstand (zum Laden) parallel zu einer Diode (zum Entladen) zwischen VIn und Elko hängen.

Und weil ja eh schon eine Schutzdiode vor VIn liegt, die die Spannung vom Elko quasi abschneidet kann man dann auch per Spannungsteiler messen, wann das Netzteil abgeschaltet wurde.

oberallgeier
27.09.2025, 17:08
.. Das UNO-Board .. Mit Sleep auf dem Mega328 erreicht man nur eine Stromabsenkung von 50 auf 33mA .. nicht optimal ..Klar, stimmt. ABER - ich hatte in meinem Post (#8 weiter oben) auf den Transistortester von Markus Frejek hingewiesen. Der benutzt in seiner Schaltung zum Bauteiltester (https://www.mikrocontroller.net/wikifiles/f/f0/Schaltplan_transistortester.png) eine (ok ok - ZUsätzliche) kleine Transistorstufe, mit der er im AUS-Zustand nach eigenen Aussagen eine Absenkung in den Bereich von einstelligen Nanoampere erreicht. Ich hatte an meinem Nachbau den extrem geringen Strombedarf in diesem Bereich feststellen können - wobei ich die Nanos nur mit einem Trick messen konnte. Klar, die Anforderung ".. Für Arduino (wenn möglich UNO Atmega 328 .." ist da natürlich nicht erfüllbar.

Moppi
30.09.2025, 04:02
Ich habe mich intensiv mit dem Problem der Datenspeicherung im EEPROM beschäftigt und denke, ich habe eine robuste Lösung gefunden: b (https://www.roboternetz.de/community/threads/80355-Open-Source-EEPROMWearLevel-V1-0-0-%C2%96-EEPROM-Verschlei%C3%9F-und-Log-Funktion)itte in meinen Blog schauen.

Ziel war es, das Speichern im EEPROM zu einer zuverlässigen und langlebigen Sache zu machen, ohne dass man sich ständig um die begrenzte Lebensdauer Sorgen machen muss. Es ermöglicht das Speichern immer dann, wenn sich Daten ändern. Die Bibliothek nutzt die gesamte EEPROM-Partition als Ringpuffer und verteilt die Schreibzyklen gleichmäßig. Das verlängert die Lebensdauer um ein Vielfaches (z.B. von ca. 2,7 Jahren auf über 80 Jahre bei 100 Schreibvorgängen pro Tag). Jeder Datensatz wird mit einer CRC-Prüfsumme gespeichert. Das garantiert beim Neustart, dass immer der letzte, vollständige und valide Datensatz gelesen wird – unvollständige Daten (z.B. entstanden durch einen plötzlichen Stromausfall) werden ignoriert. Falls es auch der letzte Stand vor einem Stromausfall genügt (und nicht zwingend der wichtig ist, der bei einem Stromausfall geschrieben wird), wäre noch nicht mal ein Power-Backup zwingend notwendig.

--

Mir ging das nicht aus dem Kopf und da ist mir noch was unkonventionelles eingefallen. Am besten eine Rechnung dazu:

128 Blöcke×100.000 Zyklen=12,8 Mio. Schreibvorgänge. Bei 525.960 Schreibvorgängen pro Jahr (alle 1 Minute) ergibt das >24 Jahre (12,8 Mio./525.960). Wenn wir nur 512 Byte nutzen, halbiert sich die Zahl auf >12 Jahre. Das wären 1024 Byte /128 = 8 Byte pro Datensatz (mit etwa ~ 4 Byte Nutzdaten). Verdoppeln wir das auf 8 Byte Nutzdaten, sind wir bei immer noch >7 Jahre bei 512 Byte und > 15 Jahre bei 1024 Byte die wir im EEPROM nutzen.

Die dauernde Speicherung in kurzen Abständen macht die Daten redundant und damit sicher bei einem Stromausfall.