Ich versuche mal ein wenig Licht in die Sache zu bringen. Da sind mir noch mehr Dinge aufgefallen, die ich nicht so recht in dem Code von Inka verstehe. Wie das Verwenden von runSpeed(). Das soll immer wieder aufgerufen werden (?), damit der Motor seine Schritte tut, allerdings ruft Inka danach immer wieder die move()-Methode auf? Die Verwendung von move(), setSpeed() usw. verstehe ich noch nicht so recht.
Aber zunächst mal was anderes:
die Klassenreferenz: http://www.airspayce.com/mikem/ardui...elStepper.html
zu: stepper_VL, stepper_HL, stepper_VR, stepper_HR, stepper_MAX
habe ich keine Werte gefunden, welche verbergen sich dahinter?
Übersetzung:
Sie können mehrere gleichzeitige Stepper verwenden, die sich alle mit unterschiedlichen Geschwindigkeiten und Beschleunigungen bewegen,
vorausgesetzt, Sie rufen ihre run () - Funktionen in ausreichend regelmäßigen Abständen auf.
Die aktuelle Position ist auf 0 und die Zielposition auf 0 eingestellt. Die Standardeinstellung für MaxSpeed und Acceleration ist 1.0.
Die Motorpins werden während des Konstruktors durch einen Aufruf von enableOutputs () in den OUTPUT-Modus initialisiert.
setEnablePin()
--------------
Legt die Aktivierungs-PIN-Nummer für Schritttreiber fest. 0xFF zeigt unbenutzt an (Standard). Andernfalls, wenn ein Pin gesetzt ist,
wird der Pin beim Aufruf von enableOutputs () eingeschaltet und beim Aufruf von disableOutputs () ausgeschaltet.
Der Ordnung halber würde ich den Enable-Pin über diese Methode, für alle 4988, festlegen. Auch wenn es, zumindest scheinbar, an
der LIB vorbei funktioniert.
stop()
------
Der Stepper soll unter Verwendung der aktuellen Geschwindigkeits- und
Beschleunigungsparameter so schnell wie möglich anhalten.
disableOutputs()
----------------
Deaktivieren Sie die Motor-Pin-Ausgänge, indem Sie alle auf LOW stellen. Abhängig vom Design Ihrer Elektronik kann dies
die Stromversorgung der Motorspulen unterbrechen, um Strom zu sparen. Dies ist nützlich, um Arduino-Energiesparmodi
zu unterstützen: Deaktivieren Sie die Ausgänge für den Ruhezustand und aktivieren Sie sie dann erneut mit enableOutputs(),
bevor Sie erneut einen Schritt ausführen. Wenn der Aktivierungs-Pin definiert ist, wird er in den OUTPUT-Modus
versetzt und der Pin auf deaktiviert gesetzt.
isRunning()
-----------
Überprüft, ob der Motor gerade läuft.
Hier habe ich Zweifel, wegen dem UND-Operator.
Code:
/***********************************************************/
boolean fahrt_fertig()
{
return stepper[stepper_VL].isRunning() && stepper[stepper_HL].isRunning() && stepper[stepper_VR].isRunning()
&& stepper[stepper_HR].isRunning();
}
"1" und "0" ergibt normalerweise "0".
fahrt_fertig() gäbe FALSE, wenn nur 1 Motor nicht mehr läuft.
Wenn alle Ergebnisse von isRunning() zusammengeführt werden
sollen, würde ich das ändern in folgenden Code, mit dem ODER-Operator.
Code:
/***********************************************************/
boolean fahrt_fertig()
{
return stepper[stepper_VL].isRunning() || stepper[stepper_HL].isRunning() || stepper[stepper_VR].isRunning()
|| stepper[stepper_HR].isRunning();
}
Dann gäbe fahrt_fertig() ein FALSE, wenn alle Motoren nicht mehr laufen.
Folgender Code, um die Stepper anzuhalten.
Code:
/***********************************************************/
void alle_stepper_stop(void)
{
for (idx = stepper_VL; idx < stepper_MAX; idx++)
{
stepper[idx].stop();
stepper[idx].disableOutputs();
}
/*
digitalWrite(enbl_VL, HIGH);
digitalWrite(enbl_HL, HIGH);
digitalWrite(enbl_VR, HIGH);
digitalWrite(enbl_HR, HIGH);
reboot();
*/
}
stop() soll den Motor - so schnell wie möglich - anhalten.
disableOutputs() sollte den a4988 Motortreiber abschalten,
so dass der Motor sofort anhalten sollte.
Normalerweise erst stoppen, dann abschalten.
Später dann wieder anschalten enableOutputs() und den Motor bewegen.
MfG
- - - Aktualisiert - - -
Auch mal bitte prüfen, ob der Code der Fernbedienung ohne Verzögerung im Programm ankommt, ob von dort irgendwo die Verzögerung (vorwärts auf rückwärts) herrührt.
- - - Aktualisiert - - -
Beispiel:
stepper[index].setEnablePin(Pinnummer);
siehe auch: setPinsInverted()
stepper[index].setPinsInverted(false,false,true); //weil der Enable ein invertierender Eingang ist
Lesezeichen