Hallo Gemeinde!
gibt es die Möglichkeit mit einem Schrittmotor exakte Grade anzufahren?
dh ich möchte die Zielposition und Dynamiken einstellen
auf meinem Schrittmotor (mit Getriebe) wird ein Finger montiert, damit soll auf einer Scheibe eine Position angefahren usw.
habs mit MobaTools gerade probiert und lief auch ganz gut,
jetzt bemerke ich , dass er die Richtung nicht mehr umkehrt, ich versuche gerade 360° plus und minus zu fahren. sketch_feb24a.ino (1.1 KB)
habe, am Treiber die Minus (rote Kabel) auf Minus, per Plus sollten die Pins zum Treiber schreiben.
es scheint, dass der DIR nicht angesteuert wird, vorher hat es aber funktioniert?
1 Zeile Problembeschreibung = 1 Woche bis zur Lösung des Problems
2 Zeilen Problembeschreibung = 0,5 Wochen bis zur Lösung des Problems
10 Zeilen Problembeschreibung = 0,1 Wochen bis zur Lösung des Problems
50 Zeilen Problembeschreibung = 1-2 Stunden bis zur Lösung des Problems
Nach allem was man aus deinem Foto erkennen kann ist das kein Servomotor sondern ein bipolarer Schrittmotor .
Ein Servomotor hat einen Encoder der Impulse an die Steuerung zurückmeldet wenn er sich dreht. Erkennbar daran, dass entweder weitere Kabel vom Motor zum Motortreiber gehen oder dass der Motortreiber direkt am Motor sitzt. (Dann sind die Encoderkabel im Gehäuse)
Ein Schrittmotor hat keinerlei Rückmeldung.
Ein Schrittmotor kann nur mit einer bestimmten Maximaldrehzahl aus dem Stand gestartet werden. Start/Stop-Drehzahl. Wenn man höhere Drehzahlen erreichen will dann braucht man eine Beschleunigungsrampe.
Warum dein Motor mit höherer Speed-Einstellung nur noch in eine Richtung dreht kann man allein aus dieser Mitteilung nicht analysieren.
Ich würde mal ein Multimeter zwischen Masse und Dir-Eingang anschliessen und dann messen ob die Spannung bei niedriger Drehzahl wo beide Richtungen laufen wechselt wenn du die Drehrichtung wechselst.
Und dann die gleiche Messung bei höherer Drehzahl.
Wenn die Spannung in der gleichen Art wechselt dann liegt es nicht am DIR-Eingang.
Dann ist höchstwahrscheinlich einfach die Drehzahl zu hoch,
oder der Strom zu niedrig. Man kann den Strom aber nur auf den vom Hersteller empfohlenen Maxwert setzen. Sonst wird der Motor zu heiss und geht kaputt.
Servo war ein verschreiber, Schrittmotor (wie Überschrift) ist korrekterweise, wie du schreibst
der Unterschied ist mir klar.
wenn ich den DIR auf 5V hänge, ändert er die Richtung, das liegt mM am Programm?
Es gibt da so ein paar "kleinliche" Regeln in der deutschen Rechtschreibung die Kennzeichnen ob etwas eine Frage ist oder eine Aussage.
Ein Fragezeichen kennzeichnet eine Frage. Ein Punkt am Ende des Satzes kennzeichnet eine Aussage / Feststellung.
Das Hauptding ist aber das man aus so einem dürren Satz eben nicht analysieren kann was dir Ursache des Problems ist.
Dazu müsstest du schon mal so kleinlich sein und haarklein genau beschreiben was
diese Analyse
ergeben hat
Aber vielleicht postest du lieber kleine kurze Sätze.
Dann braucht es halt die Kleinigkeit von 3 Monaten ("3" ist doch eine schön kleine Zahl oder) bis das Problem analysiert und gelöst ist.
Habe mir mal den Sketch aus post #7 angesehen (hier für alle lesbar):
#include <MobaTools.h>
// Adjust pins, steps and time as needed
unsigned int iRefState = 0; // Schrittindikator
const byte stepPin = 4;
const byte dirPin = 3;
const int stepsProUmdr = 1036/5.3; // Steps per Revolution ( exammple with 1/4 microsteps )
int stepsPos1 = 1036; // Steps to be executed every intervall
MoToStepper myStepper ( stepsProUmdr, STEPDIR );
void setup() {
// put your setup code here, to run once:
myStepper.attach( stepPin, dirPin );
myStepper.setSpeed( 2000 ); // 60 Umdrehungen/Min
myStepper.setRampLen( 20 );
}
void loop() {
// put your main code here, to run repeatedly:
// PROCEDURE ----------------------------------------
switch (iRefState) {
// ------------------------------------------------
case 0: //
if (myStepper.moving() == 0)
{ delay(2000);
myStepper.doSteps( stepsPos1 );
iRefState++;
break;
}
case 1: //
if (myStepper.moving() == 0)
{ delay(2000);
myStepper.doSteps( stepsPos1 *-1 );
iRefState=0;
break;
}
}
}
Wenn ich ihn recht verstehe, sollte im loop() zwischen den beiden case-Alternativen gewechselt werden. Allerdings sind die break;-Anweisungen (kritisch auf jeden Fall das im case 0: - Zweig) an der falschen Stelle, da sie innerhalb der if-Bedingung stehen und damit nur greifen, wenn die Bedingung erfüllt ist.
M.E. wäre dies korrekt:
#include <MobaTools.h>
// Adjust pins, steps and time as needed
unsigned int iRefState = 0; // Schrittindikator
const byte stepPin = 4;
const byte dirPin = 3;
const int stepsProUmdr = 1036 / 5.3; // Steps per Revolution ( exammple with 1/4 microsteps )
int stepsPos1 = 1036; // Steps to be executed every intervall
MoToStepper myStepper ( stepsProUmdr, STEPDIR );
void setup() {
// put your setup code here, to run once:
myStepper.attach( stepPin, dirPin );
myStepper.setSpeed( 2000 ); // 60 Umdrehungen/Min
myStepper.setRampLen( 20 );
}
void loop() {
// put your main code here, to run repeatedly:
// PROCEDURE ----------------------------------------
switch (iRefState) {
// ------------------------------------------------
case 0: //
{
if (myStepper.moving() == 0)
{ delay(2000);
myStepper.doSteps( stepsPos1 );
iRefState++;
}
break;
};
case 1: //
{
if (myStepper.moving() == 0)
{ delay(2000);
myStepper.doSteps( stepsPos1 * -1 );
iRefState = 0;
}
break;
};
}
}
Das hängt doch davon ab wo es positioniert ist.
Wenn man das so allgemein beantworten will wie du fragst dann würde die Antwort lauten
"es verhält sich anders" . Und so allgemein hilft es natürlich nicht.
Die Variable die hinter dem switch in Klammern steht ist die switch-case-variable.
Wenn das break ausserhalb von if-bedingungen steht dann wird es immer in dem case ausgeführt der gerade zutrifft.
"Der gerade zutrifft" meint:
die Switch-case-variable hat einen bestimmten Wert
Dann wird der Code unter dem case ausgeführt dessen Wert die switch-case-variable hat.
das break sorgt dafür dass alle anderen cases übersprungen werden.
ohne break werden die anderen cases auch noch auf zutreffend geprüft.
Wenn man dann die switch-case-variable in einem case auf einen anderen Wert setzt dann wird dieser case der dem neuen Wert entspricht im gleichen Durchlauf auch noch ausgeführt. Das will man aber (meistens) nicht.
Meistens will man es so haben, dass die switch-casestruktur nach dem abrbeiten eines cases sofort verlassen wird und neu "von aussen" aufgerufen wird.
Ohje ob das verständlich ist??? Ich habe da so meine Zweifel. Aber für Beispiele bin ich jetzt zu Faul
Es sei denn, man möchte ganz sicher, dass mehrere case-Anteile unmittelbar nacheinander ausgeführt werden.
Ist das break; in einer nicht ausgeführten if-Bedingung hjnter dem case, geht es nahtlos in den nächsten case über, egal welchen Wert die switch-Variable hat ...
Natürlich gibt es auch interessante Möglichkeiten, genau das auszunutzen, aber hier wohl eher nicht!