Hilfe bei einen Nema 17

Hallo, ich bin 63 Jahre Alt und neu hier und habe eine frage bezüglich Arduino UNO TMC2208 Treiber für Nema 17 Schritmotor.

vom Programmieren habe ich nicht viel Ahnung! brauch deshalb eure Hilfe.

Ich benötige einen Code um besagten Motor anzusteuern damit er exakt eine Umdrehung in der Minute macht.

Momentan benutze ich diesen wo man die Geschwindigkeit mit einen Poti einstellt. Das ist mir aber zu ungenau.

void setup()
{
pinMode(4, OUTPUT); //Define pins and set direction
pinMode(7, OUTPUT);
digitalWrite(7, LOW);
}

void loop()
{int stepPin = 4; //Define travel stepper motor step pin
int dirPin = 7; //Define travel stepper motor direction pin
int motSpeed = 5; //Initial motor speed (delay between pules, so a smaller delay is faster)
motSpeed = map(analogRead(A0),0,1023,50,1); //Read in potentiometer value from A0, map to a delay between 1 and 50 milliseconds
digitalWrite(stepPin, HIGH); //Step the motor with the set delay
delay(motSpeed);
digitalWrite(stepPin, LOW);
delay(motSpeed);
}

Danke schon mal für eure Hilfe.

Brauchst du eine Regelung der Geschwindigkeit mit dem Poti, oder willst Du mit dem Poti dafür sorgen, dass der Motor genau 1 U/Minute macht?
Also wenn Du nur die eine Geschwindigkeit benötigst, also 1U/Min. , dann kannst Du das bei nem Stepper sehr viel einfacher über Steps/Zeit machen, da die Anzahl Step/Umdrehhung eine feste Grösse ist. Der Stepper den Du hast, hat (sehrwahrscheinlich) entweder 200 Steps / Umdrehhung bei einem Schrittwinkel von 1.8° / Step. - oder der Motor hat 400 Steps / Umdrehung, bei einem Schrittwinkel von 0.9°. welchen Motortyp du genau hast, also ob mit 1.8° oder 0.9° müsstest Du noch aus den Motordatenblatt ermitteln und uns mitteilen, wobei die 1.8° bei der Nema17 Grösse , häufiger sind. Dann kommt noch der TMC2208 dazu, bei so langsamen Bewegungen solltest Du nicht mit Vollschritt arbeiten sondern z.B 1/16 Microschritt. den TMC2208 kann man über drei Anschlüsse (glaub die heissen M0, M1, M2) kannst Du die Microsteps des Treibers einstellen über High Low legung der entsprechenden Anschlüsse, Dazu musst Du das Datenblatt des TMC2208 konsultieren.
Darauf must du nur noch die eingestellten Mikroschritte mit den Steps / Umdrehungen des Motors multiplizieren, dann weisst Du , wieviel Schritte / Minute Du an Deinen Motor respektive den TMC2208 senden musst, dann macht Dein Motor ganz genau die eine Umdrehung / Minute.

Eine Umdrehung pro Minute hört sich nach Minutenzeiger einer Uhr an.
Wenn das eine Uhr ist und du möchtest über Tage und Wochen ein möglichst genaue Uhrzeit haben, dann solltest du das entweder mit einem RTC-Modul Real-Time-Clock
Typ DS3231 kombinieren oder als Microcontroller einen ESP32 verwenden.

Der ESP32 lässt sich ebenfalls mit der Arduino-IDE programmieren und kann WLAN. Du verbindest den ESP32 mit deinem häuslichen WLAN und kannst dann die Internetzeit benutzen.

Egal wo die Zeit herkommt, du hast dann einen Programmteil der den Schrittmotor ansteuert und einen Programmteil der die Schrittmotorzeit mit der ganz genauen Zeit vergleicht.

Wenn Abweichung größer als zum Beispiel 2 Sekunden dann mache einige Ausgleichsschritte oder eine Ausgleichspause um den Zeiger wieder mit der genauen Zeit zu synchronisieren.

Das war bis jetzt eine allgemeine Beschreibung. Du hast wahrscheinlich noch keine Vorstellung wie man das programmiert.

Dafür ist ja diesem Forum da. Es gibt eine Menge unterschiedlicher User die alle unterschiedliche Ansätze von Hilfe anbieten. Von extrem kurz gehaltenen Stichworten über "kauf dir ein gutes Programmier-Buch" über Code-Beispiele und noch eine Menge anderer Arten.

Beschreibe mit welcher Art DU gut lernen kannst.

Wenn du etwas nicht verstehst dann frage nach. Manche User hier posten hochtrabenden Code der für Anfänger WIRKLICH schwer zu verstehen ist. Manche User verstehen das erst wenn man ZWANZIG nachfragen gestellt hat. (und manche user scheinbar auch niemals) .

Wenn du Nachfragen zum Code stellst die nach einer Zeile, oder auch nur nach einem einzelnen Wort fragen dann ist das in Ordnung. Man kann daran erkennen das du dich mit dem Programm auseinandersetzt und lernen willst.

Also immer her mit den Fragen. Das ganze Spektrum an Fragen ist willkommen.
Angefangen bei
"Wo finde ich einen Erklärkurs für Anfänger"
über "Was ist eine library?" und wie installiert man das?
"Wo finde ich ein Beispielprogramm zu einer RTC-Uhr?"
"Wo finde ich ein Beispielprogramm zu ESP32 / Internetzeit"

was bedeutet das "const" ?
was bedeutet "enum"?
usw. usw. usf.
Das sind alles Fragen die deine Bereitschaft zu lernen zum Ausdruck bringen. Und wenn jemand diese Bereitschaft zeigt dann gibt es immer neue Antworten.

viele Grüße

Stefan

Hallo.

ich brauche nur eine konstante Geschwindigkeit von 1U/Min.
den Motor den ich habe macht 200 Steps und hat einen Schrittwinkel von 1.8° / Step.
Das mit Microsteps habe ich schon eingestellt auf MS2
Den Sketch den ich momentan benutze habe ich so aus dem Netz, da ich wie gesagt von Programmieren ( Noch ) nicht sehr viel Ahnung habe.

Gruß Harald

Hallo Stefan ,

Danke für die Info, und ja es soll eine Uhr werden.

Aber aller Anfang ist schwer, und vor allem in meinem Alter.

Dazu kommt noch das ich kein englisch kann und mir alles via Google übersetzen muss.

Gruß Harald

Aus dem dass du nichts über eine Uhr in deiner Antwort geschrieben hast, schlussfolgere ich es geht NICHT um eine Uhr. Sondern irgendetwas anderes.

1 Umdrehung pro Minute. Das lässt sich schon machen.
Dann mal anders gefragt
in einer Minute 1 Umdrehung
in 10 Minuten 10 Umdrehungen
in 60 Minuten 60 Umdrehungen
in 5 Stunden 300 Umdrehungen
Wenn man keinen ganz ultraspeziellen Microcontroller benutzt dann wird man über längere Zeit eine Abweichung vom exakten Wert haben.
Und die ist dann meistens auch temperaturabhängig.

Wie lange wird dein Motor kontinuierlich am Stück betrieben?
Wie groß darf die maximale Abweichung sein?

Davon hängt ab wie man das lösen kann

  • Microcontrollertyp
  • Programm

Nim dir Deepl als übersetzer ist genauer.

Auf wieviele Microsteps hast Du eingestellt? Das musst du uns schon mitteilen, weil ich mir sonst erst das datenblatt besorgen muss, und da heruslesen muss, wasDu eingestellt has, bevor ich anfangen kann , dir nen Beispiel-Code zu liefen, der dir auch die 1 U/Min erzeugt.

LG Deltaflyer

Also wenn du NUR MS2 auf High (vio) gesetzt hast, dann hast du 1/4 Microstep eingestellt , richtig?

Ich hbabe MS1 und MS2 auf vio gestzt also 1/16 Microstep

Gruß Harald

in einer Minute 1 Umdrehung

in 10 Minuten 10 Umdrehungen

in 60 Minuten 60 Umdrehungen

in 5 Stunden 300 Umdrehungen

Das ist richtig und der Motor soll wenn möglich im Dauerbetrieb laufen

Danke für die Ifo

Du scheinst mein posting nur ungenau gelesen zu haben.

Jetzt lese bitte genau:

Der exakte Wert nach 24 Stunden wäre
24 * 60 = 1440 Umdrehungen
Wäre es OK wenn der Motor statt 1440 nur 1200 Umdrehungen gemacht hat?

Wäre es OK wenn der Motor statt 1440 nur 1600 Umdrehungen gemacht hat?

vermutlich nicht.
Entweder du bist in der Lage eine solche Angabe zu machen oder ich höre auf zu posten.

Es ist ok wenn der motor 1600 Umdrehungen statt 1440 Umdrehungen macht.

Also hier mal ein kleiner Sketch, der anhand der Einstellungen on Steps die der Motor hat (200/U) und den eingestellten Microsteps (bei Dir 16) berechnet , wieviele impulse (Steps) in der Minute gesendet werden müssen und wie lange das Intervall zwischen 2 schriten sein muss, um auf die erforderliche Anzahl Schritte / Minute zu kommen, damit der Motor 1 Umdrehung in der Minute macht.


```cpp
uint8_t microStep = 16;         // eingestellte Microstep vom TMC2208
uint8_t mot_Step_pro_U = 200;  // Step's / Umdrehung des Motors entspricht Schrittwinkel 1.8°
uint16_t step_pro_Umdrehung = microStep * mot_Step_pro_U; // erforderliche Schritte für eine Umdrehung
uint32_t Intervall = 60000/step_pro_Umdrehung;            // zeitabstand zwischen 2 Steps in Millisekunden
uint32_t intervallStart = 0;
uint8_t dirPin =  4;           // Pin für Motor Drehrichtung
uint8_t stepPin = 7;           // Pin für die Schritt Impulse



void setup() {
  // put your setup code here, to run once:
pinMode(dirPin, OUTPUT);  //Define pins and set direction
pinMode(stepPin, OUTPUT);
digitalWrite(stepPin, LOW);
intervallStart = millis();  // start für die Zeitmessung um die richtige Anzahl Steps/Minute zu senden
}

void loop() {
  // put your main code here, to run repeatedly:
  if(millis() - intervallStart >= Intervall) {  //wenn das intervall zwisschen 2 Steps abgelaufen
    intervallStart = millis();                  // neue intervall Messung initiieren
    sende_1_Step();                               // 1 Step an den Motortreiber senden
  }
}

void sende_1_Step() {
digitalWrite(stepPin, HIGH);
delayMicroseconds(2);       // 100ns, also 0.1 Mikrosekn würden dem TMC2208 reichen einen Impuls zu erfassen 
digitalWrite(stepPin, LOW);
}

Gleiche Funktion
im Prizip sehr ähnlicher Programmaufbau
andere Variablennamen

const byte stepPin = 4;
const byte dirPin  = 7;

unsigned long myStepTimer;

const unsigned long fullStepsRev = 200UL;
const unsigned long microsteps   = 16UL;
const unsigned long stepsRev     = fullStepsRev * microsteps;
const unsigned long rpm = 1;

const unsigned long pulseWaitMs = (1000UL * 60UL) / (stepsRev * rpm); 

unsigned long PulseHighMicroSecs = 200;


void setup() {
  pinMode(stepPin, OUTPUT); //Define pins and set direction
  pinMode(dirPin,  OUTPUT);
  digitalWrite(dirPin, LOW);
}


void loop() {
  if ( TimePeriodIsOver(myStepTimer,pulseWaitMs) ) {
    oneStepPulse();
  }
}


void oneStepPulse() {
  digitalWrite(stepPin,HIGH);
  delayMicroseconds(PulseHighMicroSecs);
  digitalWrite(stepPin,LOW);
}


// easy to use helper-function for non-blocking timing
// explanation see here
// https://forum.arduino.cc/t/example-code-for-timing-based-on-millis-easier-to-understand-through-the-use-of-example-numbers-avoiding-delay/974017
boolean TimePeriodIsOver (unsigned long &startOfPeriod, unsigned long TimePeriod) {
  unsigned long currentMillis  = millis();
  if ( currentMillis - startOfPeriod >= TimePeriod ) {
    // more time than TimePeriod has elapsed since last time if-condition was true
    startOfPeriod = currentMillis; // a new period starts right here so set new starttime
    return true;
  }
  else return false;            // actual TimePeriod is NOT yet over
}

damit haste jetzt funktionierenden Code aber null gelernt.

Ist das das was du willst?

Wenn man das ganze mit den MobaTools macht dann schnurrt der Code zusammen auf

#include <MobaTools.h>
const byte stepPin1 = 4; 
const byte dirPin1  = 7;  

const int stepsPerRev = 200 * 16;    // Steps per revolution - may need to be adjusted

MoToStepper stepper1( stepsPerRev, STEPDIR );  // create a stepper instance

void setup() {
  stepper1.attach( stepPin1, dirPin1 );
  stepper1.setSpeed( 10 ); // 1 rev/min = 1 * 10 = 10 (if stepsPerRev is set correctly)
  stepper1.setRampLen( stepsPerRev / 2); // Ramp length is 1/2 revolution
  
  stepper1.rotate(1); // start turning, 1=vorward, -1=backwards                    
}

void loop() {
}

Darum habe ich meinen Code auch ausführlich dokumentiert, und aufgrund seiner nicht so guten Englischkenntnisse auch weitestgehend in deutsch, damit er ne Grundlage zum lernen hat.

Ja Danke.

Hallo Harald,
darf ich fragen, was das für eine Uhr werden soll? Nur um einen Zeiger zu drehen, erscheint mir ein Nema17 doch sehr überdimensioniert. Oder wird es eine Kirchturmuhr :wink:
Und soll es auch eine Stundenanzeige geben?

Um einen Stepper im Dauerbetrieb mit konstanter langsamer Geschwindigkeit zu betreiben sind die MobaTools nicht so besonders geeignet. Ohne weitere Vorkehrungen im Sketch dreht .rotate() nicht wirklich endlos, auch wenn es in diesem Fall 466 Tage dauern würde, bis der Motor stehen bleibt.

Gruß, Franz-Peter