Wenn du damit die Hardware Treiber Module meinst, nein. Die haben keine Variablen, merken sich nichts. Beim enablen/disablen kann es höchtens einen Ruckler um +- 1/2 Schritt geben, also so rund um 1° Drehung.
Es ist ein Software Problem.
MfG Klebwax
Druckbare Version
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.
"1" und "0" ergibt normalerweise "0".Code:/***********************************************************/
boolean fahrt_fertig()
{
return stepper[stepper_VL].isRunning() && stepper[stepper_HL].isRunning() && stepper[stepper_VR].isRunning()
&& stepper[stepper_HR].isRunning();
}
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.
Dann gäbe fahrt_fertig() ein FALSE, wenn alle Motoren nicht mehr laufen.Code:/***********************************************************/
boolean fahrt_fertig()
{
return stepper[stepper_VL].isRunning() || stepper[stepper_HL].isRunning() || stepper[stepper_VR].isRunning()
|| stepper[stepper_HR].isRunning();
}
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
ich gebe ja zu, das ganze basiert auf anderen steppern und treibern (siehe anhang), auf einer anderen LIB (CustomStepper) und auf meiner naivität das ganze irgendwie auf die neue situation "anzupassen"...
diese bezeichnungen beziehen sich auf die vier stepper (V_orne L_inks usw.) und im zusammenhang mit der variablen "idx" sollen diese in der schleife:Zitat:
zu: stepper_VL, stepper_HL, stepper_VR, stepper_HR, stepper_MAX
habe ich keine Werte gefunden, welche verbergen sich dahinter?
alle vier gleichzeitig in bewegung gesetzt werden, ohne diese schleife liefen die früher nacheinander an...Code:for (idx = stepper_VL; idx < stepper_MAX; idx++)
{
stepper[idx].run();
// delay(1);
}
Ich versuch jetzt mal das ganze mit direkten anweisungen an die DIR und STEP pins der stepper zu realisieren, ohne LIB :-)
so, dieser
kommt ohne eine stepper-lib aus, funktioniert soweit...Code:
//libraries
#include <IRremoteInt.h>
#include <ir_Lego_PF_BitStreamEncoder.h>
#include <IRremote.h>
#include <Bounce2.h>
uint8_t RECV_PIN = 13;
uint8_t taste = 0;
uint8_t zaehler = 1;
//resett pin definieren
#define PIN2RESET 10
// DIR und STEP pins definieren
#define dirPin_VL 2
#define stepPin_VL 3
#define dirPin_HL 4
#define stepPin_HL 5
#define dirPin_VR 6
#define stepPin_VR 7
#define dirPin_HR 8
#define stepPin_HR 9
//enable pins definieren
#define enbl_VL 40
#define enbl_HL 42
#define enbl_VR 41
#define enbl_HR 43
//definiere steps pro umdrehung:
#define stepsPerRevolution 200
//IR pin definieren
IRrecv irrecv(RECV_PIN);
decode_results results;
// debouncer instanz definieren
Bounce debouncer = Bounce();
void setup()
{
// deklariere pins als output:
pinMode(dirPin_VL, OUTPUT);
pinMode(stepPin_VL, OUTPUT);
pinMode(dirPin_HL, OUTPUT);
pinMode(stepPin_HL, OUTPUT);
pinMode(dirPin_VR, OUTPUT);
pinMode(stepPin_VR, OUTPUT);
pinMode(dirPin_HR, OUTPUT);
pinMode(stepPin_HR, OUTPUT);
Serial.begin(115200);
Serial.println("code----/home/georg/Arduino/outdoor_robo/stepper/test_vier_stepper/ohne_lib/remote_vier_stepper_switch_1_enbl_bounce");
//resett pin zustand definieren
pinMode(PIN2RESET, INPUT);
// IR empfänger pin mit bounce verbinden
debouncer.attach(RECV_PIN);
// debounce interval in ms
debouncer.interval(5);
// starte IR receiver
irrecv.enableIRIn();
// deaktiviere enable pins:
digitalWrite(enbl_VL, HIGH);
digitalWrite(enbl_HL, HIGH);
digitalWrite(enbl_VR, HIGH);
digitalWrite(enbl_HR, HIGH);
//resett pin aktivieren
digitalWrite(PIN2RESET, HIGH);
}
void loop()
{
// aktiviere enable pins:
digitalWrite(enbl_VL, LOW);
digitalWrite(enbl_HL, LOW);
digitalWrite(enbl_VR, LOW);
digitalWrite(enbl_HR, LOW);
// Update the Bounce instance :
debouncer.update();
// Get the updated value :
zaehler = debouncer.read();
if (zaehler == 1)
{
zaehler = 0;
// taste = 0;
if (irrecv.decode(&results))
{
taste = results.value;
Serial.println(taste);
// delay(1000);
irrecv.resume(); // Receive the next value
}
}
tasten_abfrage();
}
/***********************************************************/
void tasten_abfrage(void)
{
switch (taste)
{
case 151 ://taste 1 große FB
{
if (taste == 151 )
{
Serial.println("szenario_1");
Serial1.println("szenario_1");
//fahre szenario_1
delay (1000);
break;
}
}
case 103://taste 2 große FB
{
if (taste == 103)
{
Serial.println("szenario_2");
Serial1.println("szenario_2");
//fahre szenario_2
delay (1000);
break;
}
}
case 79://taste 3 große FB
{
if (taste == 79)
{
Serial.println("szenario_3");
Serial1.println("szenario_3");
//fahre szenario_3
delay (1000);
break;
}
}
case 207://taste 4 große FB
{
if (taste == 207)
{
Serial.println("szenario_4");
Serial1.println("szenario_4");
//fahre szenario_4
delay (1000);
break;
}
}
case 253://OK taste, motor stop
{
if (taste == 253)
{
alle_stepper_stop();
break;
}
}
case 61:// rotate rechts große FB
{
if (taste == 61)
{
rechts_drehen();
break;
}
}
case 221:// rotate links große FB
{
if (taste == 221)
{
links_drehen();
break;
}
}
case 157:// fahre vor große FB
{
if (taste == 157)
{
vorwaerts();
break;
}
}
case 87:// fahre rückwärts große FB
{
if (taste == 87)
{
rueckwaerts();
break;
}
}
}
}
/***********************************************************/
void alle_stepper_stop(void)
{
//enable pins deaktivieren
digitalWrite(enbl_VL, HIGH);
digitalWrite(enbl_HL, HIGH);
digitalWrite(enbl_VR, HIGH);
digitalWrite(enbl_HR, HIGH);
reboot();
}
/***********************************************************/
void vorwaerts(void)
{
// aktiviere enable pins:
digitalWrite(enbl_VL, LOW);
digitalWrite(enbl_HL, LOW);
digitalWrite(enbl_VR, LOW);
digitalWrite(enbl_HR, LOW);
//richtung bestimmen
digitalWrite(dirPin_VL, LOW);
digitalWrite(dirPin_HL, LOW);
digitalWrite(dirPin_VR, HIGH);
digitalWrite(dirPin_HR, HIGH);
for (int i = 0; i < stepsPerRevolution; i++)
{
digitalWrite(stepPin_VL, HIGH);
digitalWrite(stepPin_HL, HIGH);
digitalWrite(stepPin_VR, HIGH);
digitalWrite(stepPin_HR, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin_VL, LOW);
digitalWrite(stepPin_HL, LOW);
digitalWrite(stepPin_VR, LOW);
digitalWrite(stepPin_HR, LOW);
delayMicroseconds(2000);
}
}
/**********************************************************/
void rueckwaerts(void)
{
// aktiviere enable pins:
digitalWrite(enbl_VL, LOW);
digitalWrite(enbl_HL, LOW);
digitalWrite(enbl_VR, LOW);
digitalWrite(enbl_HR, LOW);
//richtung bestimmen
digitalWrite(dirPin_VL, HIGH);
digitalWrite(dirPin_HL, HIGH);
digitalWrite(dirPin_VR, LOW);
digitalWrite(dirPin_HR, LOW);
for (int i = 0; i < stepsPerRevolution; i++)
{
digitalWrite(stepPin_VL, HIGH);
digitalWrite(stepPin_HL, HIGH);
digitalWrite(stepPin_VR, HIGH);
digitalWrite(stepPin_HR, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin_VL, LOW);
digitalWrite(stepPin_HL, LOW);
digitalWrite(stepPin_VR, LOW);
digitalWrite(stepPin_HR, LOW);
delayMicroseconds(2000);
}
}
/***********************************************************/
void rechts_drehen(void)
{
// enable pins aktivieren
digitalWrite(enbl_VL, LOW);
digitalWrite(enbl_HL, LOW);
digitalWrite(enbl_VR, LOW);
digitalWrite(enbl_HR, LOW);
//richtung bestimmen
digitalWrite(dirPin_VL, LOW);
digitalWrite(dirPin_HL, LOW);
digitalWrite(dirPin_VR, LOW);
digitalWrite(dirPin_HR, LOW);
for (int i = 0; i < stepsPerRevolution; i++)
{
digitalWrite(stepPin_VL, HIGH);
digitalWrite(stepPin_HL, HIGH);
digitalWrite(stepPin_VR, HIGH);
digitalWrite(stepPin_HR, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin_VL, LOW);
digitalWrite(stepPin_HL, LOW);
digitalWrite(stepPin_VR, LOW);
digitalWrite(stepPin_HR, LOW);
delayMicroseconds(2000);
}
}
/**********************************************************/
void links_drehen(void)
{
//enable pins aktivieren
digitalWrite(enbl_VL, LOW);
digitalWrite(enbl_HL, LOW);
digitalWrite(enbl_VR, LOW);
digitalWrite(enbl_HR, LOW);
//richtung bestimmen
digitalWrite(dirPin_VL, HIGH);
digitalWrite(dirPin_HL, HIGH);
digitalWrite(dirPin_VR, HIGH);
digitalWrite(dirPin_HR, HIGH);
for (int i = 0; i < stepsPerRevolution; i++)
{
digitalWrite(stepPin_VL, HIGH);
digitalWrite(stepPin_HL, HIGH);
digitalWrite(stepPin_VR, HIGH);
digitalWrite(stepPin_HR, HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin_VL, LOW);
digitalWrite(stepPin_HL, LOW);
digitalWrite(stepPin_VR, LOW);
digitalWrite(stepPin_HR, LOW);
delayMicroseconds(2000);
}
}
/***********************************************************/
void reboot()
{
pinMode(PIN2RESET, OUTPUT);
digitalWrite(PIN2RESET, LOW);
delay(100);
}
/***********************************************************/
/************************************************************/
die erweiterungen / aufnahmen für die A4988 sowie der stärkere akku sind noch unterwegs, erst dann, mit der notwendigen einstellung der ströme zu den steppern kann ich sagen wie es weitergeht...
wieder eine kleinigkeit:
Anhang 34473
Anhang 34474
Anhang 34475
ich hoffe - auch wenn ich noch gar nicht weiss, ob das ding auch wirklich was wird - es damit etwas "outdoortauglicher" gemacht zu haben. Das ausdenken, entwerfen, drucken und montieren hat riesig spass gemacht...
Bei mir ist oft der weg das ziel :-)
Geht mir immer genauso....dir kommt eine Idee.
Die reift einige Tage im Kopf, und dann setzt du dich an Blender (oder halt das bevorzugte CAD-Programm), und die Idee reift weiter, nimmt virtuell Form an.
Tage später (oder Stunden, oder Wochen) liegt die Idee fertig vor dir.
Ich liebe den 3D-Drucker.:)
Und mir gehts genauso: der Werdegang ist oft sogar spannender als das eigentliche Endergebnis....
Inka, ich kann es zwar ahnen, was Du da gedruckt hast, aber bin mir nicht sicher, ob es das ist, was ich denke. Schreib doch einfach dabei, was es ist! Hmmm, sieht so aus, asl ob ein Bild seitenverkehrt ist. Kann das sein?
Hat riesig Spaß gemacht .. der Weg ist das Ziel. Bist Du schon am Ende? - Hoffentlich nicht! ;)
MfG
es ist eine kappe für die vier leitungen zum schrittmotor - damit die nicht so schutzlos im freien herumhängen. Und seitenverkehrt nur insofern, dass auf dem linken rad die kappe schon drauf war, am rechten noch nicht. Oder umgekehrt... :-)
Und am ende bin ich noch lange nicht, ich wollte mir das warten auf teile etwas verkürzen... ;-)
btw (wir haben ja kein unterforum): Bei meinem 3D drucker ist der platz für die filamentspule etwas begrenzt. Hat schon jemand filament von einer grossen (1kg) auf eine kleinere (0,5kg) spule umgewickelt? Geht das überhaupt vernünftig?
Dann sollten wir das jetzt so machen, dass wir die 3D-Drucker-Sachen unter Konstruktion/CAD rein stellen: https://www.roboternetz.de/community...e-Fritzing-u-a
Vielleicht einen Thread mit dem Thema: 3D-Drucker - Hilfe/Probleme/Suche
Dort kann jeder sich dranhängen, wenn es um die Hardware von 3D-Druckern geht. Noch sind es nicht so viele, die dort was schreiben würden, denke ich, vielleicht wird später ein Unterforum draus.
Und vielleicht einen Thread mit dem Thema: 3D-Druck CAD/Slicer
Dort kann jeder sich dranhängen, wenn es dazu Fragen gibt.
Zuerst aber:
Umwickeln kannst Du das, wenn Du willst. Geht das venünftig? - Nein. Dabei wird später das Abwickeln etwas erschwert, dennoch funktioniert das trotzdem. Jedenfalls bei meinem Drucker bisher immer. Habe schon Filamentspulen gekauft, wo ein Rest aufgewickelt war, da ist das dann auch nicht anders, dass sich die Wicklungen hinterher etwas verheddern, durch Überkreuzen - liegt am Material.
Wer jetzt aufmerksam ist, wird bemerken (so wie ich jetzt gerade) dass 3D-Druck automatisch verlinkt wird, auf eine weitere Seite von Frank, unserm Forenbetreiber hier. Dort hat er wohl auch was für 3D-Drucker übrig (habe da noch nicht genau geschaut). Vielleicht hat er sich das dann jetzt so gedacht!?
MfG
Du müsstest dir ne simple Vorrichtung bauen:
die Spender-Rolle sollte leicht gebremst werden (gerade PLA verhält sich wie ne Feder, das wickelt sich alleine teilweise ab), und die Empfänger-Rolle solltest du manuell oder auch elektrisch drehen. Wichtig ist, dass dein Filament immer _leicht_ unter Spannung steht, dann müsste das sich auch gut aufwickeln.
Entgegen der landläufigen Meinung ist es nämlich Wurst, wie "ordentlich" ein Fliament aufgewickelt ist- meine sind oft gar nicht so toll aufgewickelt.
Interessiert den Drucker überhaupt nicht.
Nur Knoten darf es natürlich nicht geben.
Manche Filamente neigen übrigens zum brechen, wenn sie auf zu dünne Durchmesser aufgerollt werden.....