ich habe einen kleinen Sketch für einer Stepper im Anhang, der läuft auf einem Mega 2560:
Ein Stepper-Treiber bekommt über ein 10k lin. Poti eine Schrittanzahl und soll dann diesen Wert anlaufen.
Nun ist es so, dass der Motor die Schrittzahl läuft, aber bis zum "Ziel" nach einer Anzahl von Schritten abbremst, um danach wieder zu beschleunigen und den Rest der Schritte hinter sich zu bringen.
//Bibliotheken
#include "AccelStepper.h"
// AccelStepper Setup
AccelStepper stepper(1, A0, A1); // 1 = Easy Driver
// MEGA 2560 Pin A0 verbunden mit STEP von Easy Driver
// MEGA 2560 Pin A1 verbunden mit DIR von Easy Driver
// Definieren der Variablen
int A = 0;
int B = 0;
int long Aneu = 0;
int long Astep = 0;
// Setup
void setup() {
stepper.setMaxSpeed(2400); // Einstellen der Geschwindigkeit
stepper.setAcceleration(2400); // Einstellen der Beschleunigung
}
// Programmroutine
void loop() {
A = analogRead(A15); // Auslesen des aktuellen Poti-Wertes
if ((A > B+10) || (A < B-10)) { // Überprüfen, ob sich der Poti-Wert um mehr als +/- 10 Digits gegenüber der letzten Messung verändert hat
Aneu = map(A, 0, 1023, 0, 1600); // 1600 = 1 Umdrehung des Schrittmotors
Astep = Aneu * 6; // Berechnet die nötigen Scritte für den Stepper zum Verfahren des Trays
stepper.runToNewPosition(Astep); // Schrittmotor auf neue Position fahren
B = A; // speichert neuen Wert B in A
// delay (25);
}
}
Im gleichen Aufbau läuft mit den selben Komponenten eine andere Steuerung, somit kann ich definitiv sagen, dass die Komponenten in Ordnung sind und die Stromversorgung auch mehr wie ausreichend ist.
Als Stepper Treiber ist ein EasyStepper A3967 verbaut, der Motor ist ein NEMA17
Hat jemand schon mal ähliches gehabt?
Was mir einfällt ist daß aus irgendeinem Grund die Bedingung während der Bewegung wahr wird und darum der Schrittmotor ein zweite Ansteuerung zum Ziel zu fahren bekommt. Darum Abbremst und den restlichen Weg macht.
Wie vorgeschlagen füge einige Serial.print ein um zu wissen wie oft die Bedingung wahr wird. (Einfach Astep ausgeben).
...auf solche Kommentare kann ich verzichten, die sind für mich nicht zielführend!
Sorry, aber das musste jetzt sein! Ich brauche keine Erklärungen zu dem was ich verbaut habe! Das hilft mir genauso weiter wie ein Hinweis, dass es Experimentier-Platinen mit runden und quadratischen Lötaugen gibt.
Nur zum Verständnis: meine Frage lautete, ob jemand schon einmal das oben genannte Verhalten hatte.
Du könntest ein paar serial.print() einbauen um den Zustand der Variablen zu beobachten.
Ich hatte heute schon die Variable "Aneu" im serial.print ausgegeben, aber die Werte waren soweit in Ordnung.
Kleinere Schwankungen vom Poti werden ja mit der Zeile
"if ((A > B+10) || (A < B-10)) {"
eliminiert, aber das Bewegungsprofil ist:
Änderung des Widerstandwertes
Beschleunigung des Motors
Verfahren mit maximaler Geschwindigkeit
Abbremsen auf Stillstand
unmittelbar folgendes Beschleunigen des Motors
Verfahren bis zum Ziel mit ordnungsgemäßem Abbremsen.
Bis auf das Abbremsen und Beschleunigen mitten in der Strecke ist es so wie es sein soll.
Ich werde morgen nochmal mit dem serial.print() die anderen Variablen dazunehmen und sehen was rauskommt.
Nein. Hab ich nicht. Kenne den Treiber aber weiß nicht welchen Motor Du hast.
Das Verhalten des Motors könnte ruhig aus einer Inkomptibilität zwischen Motor und Treiber resultieren bzw unzureichender Spnnungsversorgung.
Den Treiber hast Du uns genannt; den Motor nicht, nur eine Angebe der Baugröße, aus der sich grob eine Leistungsklasse ableiten kann. Sicher nicht die Nennspannung bzw Nennstrom des Motors.
Also solltest Du was Falsches verbaut haben dann hast Du was falsches verbaut. Da kannst Du es auch nicht ändern indem Du uns vorwirfst was nicht zielführendes zu schreiben.
Heißt das, pro Fahrt nur ein Aneu Wert ausgegeben?
Wenn Du die Bewegung nicht durch den Potentiometer triggerst sondern den Motor im Sketch dauernd hin und her drehen läßt, hast Du die gleiche Go und Stop bewegung?
Wenn Ja würde ich sagen daß der Sketch nicht das Problem ist sondern die Hardware.
Ich würde in Erwägung ziehen, B im setup() einmal mit dem aktuellen Wert des Potis zu initialisieren.
Analog zu den Ausführungen von @uwefed in #4:
Je nachdem wie runToNewPosition() implementiert ist (Annahme: Nicht blockierend) und wie schnell das Poti gedreht wird könnte während des Laufs von A = B = 0 an den ersten gemessenen Wert A ein weiterer, dann signifikant anderer Wert A einen zweiten Aufruf erzeugen.
An das habe ich nicht gedacht; daß einfach eine Potentiometerbewegung in 2 Schritten gemessen wird und darum auch 2 Bewegungszyklen erzeugt. Das müßte sich aber in 2 augegebenen Werten von Aneu wiederspiegeln.
Eine mögliche Lösung wäre mit der Motoransteuerung zu warten bis das Ende der Potentiometerbewegung erkannt wird und dann den Motor zu starten.
Diese genannten Komponenten laufen auf einem Platinenaufbau seit mehreren Jahren störungsfrei in einer Steuerung, die ich zum Ausprobieren nun um ein Poti erweitert habe, welches frei fliegend mit sehr kurz gehaltenen Anschlüssen verdrahtet ist.
Es ist also absolut sicher, dass die Komponenten zusammen passen! Der Motor wird mehrfach hintereinander über eine Tastaturauswertung positioniert, die zu verfahrenden Wege sind vom 1/10 mm Bereich bis mehrere 10 cm absolut exakt und zitterfrei.
Ich habe den ursprünglichen Sketch nur mit dem o.a. Schnipsel, komplett alleinstehend, überschrieben und danach dieses Verhalten gehabt, an den Komponenten kann es nicht liegen. Für das Potentiometer hatte ich ursprünglich einen Schieberegler vorgesehen, ihn aber nach dem gezeigten Verhalten gegen ein reguläres Poti ersetzt. Allerdings ohne Änderung im Verhalten.
Zuerst hatte ich die Anschlußleitungen länger, dachte dann an elektromagnetische oder kapazitive Einflüsse, deswegen hab ich sie auf ein Minimum gekürzt. Das Verhalten hat sich dadurch jedoch nicht geändert.
Ich werde mal heute Abend den Ratschlag von @wno158 mit dem aktuellen Wert vom Poti verfolgen.
Ich hab grad nochmal drüber nachgedcht...
...ich hatte mir gestern schon einmal die Werte von "Aneu" mit serial.print(Aneu) im Betrieb angesehen:
Bei einer schnellen Änderung der Achslage, bzw. des Sliders des Potis gab es nur einen Startwert und einen Endwert, bei langsamen Bewegungen eine ansteigende oder abfallende Wertereihe.
So stellte sich das gestern mit dem serial.print(Aneu) dar, das liegt mit Sicherheit an der Geschwindigkeit der seriellen Datenübertragung in Abhängigkeit der Abarbeitung des Scripts.
Ich werde mir heute Abend mal noch den Wert "Astep" und "B" anzeigen lassen, vielleicht lässt sich da was erkennen.
nimm mindestens 115200 baud.
Druck deine Variablen aus
mach ein Serial.flush
erst dann schickst du den runToNewPosition
Zeige deinen neuen Sketch.
Zeige den Serial Output mit Zeitstempel.
Beschreibe exakt wann sich dein Stepper bewegt obwohl er sich nicht bewegen hätte sollen.
Hallo,
ich würde jetzt doch mal erst die Komponenten Testen und mittels zwei delay() und zwei Fahranweisungen den Motor mal nur zwischen zwei festen Positionen hin und her fahren lassen. Dazu gibst doch sicher auch ein Beispiel bei der Lib.
aus der Doku
Moves the motor (with acceleration/deceleration) to the new target position and blocks until it is at position. Dont use this in event loops, since it blocks.
das hört sich nach einem guten Plan an!
Die einzelnen Komponenten haben eigentlich schon zusammen gespielt. Wie gesagt, sie sind fest auf einem PCB verbaut, nur der Sketch ist ein anderer...
...ich teste das nicht mit zwei verschiedenen PCB's und habe somit auch nicht andere Komponenten...
...der eine Sketch macht Fahrten nach Tastatureingabe und der andere eben nach Poti-Wert.
Ich werd's mal heute Abend so probieren und mal sehen was passiert.
In der AccelStepper Library hab ich auch noch die anderen Befehlsvarianten von "run" angesehen, auch die werd ich mal ausprobieren.
Hab den Code vorab schon mal angepasst...
Mit dem langen Weg zeigt sich gleich ob wieder Stops drin sind
der letzte Code-Schnipsel läuft ohne zu Zucken und Mucken....
...seit einer Stunde ohne warmwerden und Pausen.
Jetzt werd ich noch ein wenig Möglichkeiten ausprobieren. Vieleicht kommt ja noch die Erkenntnis, ich meld mich!
Du liest während Du an Deinem Poit drehst irgendeinen Wert ein.
Motor startet , Sketch blokiert dabei , Motor stoppt auf Position
inzwischen hast Du das Poti aber weiter gedreht
der neuer Wert wird eingelesen
das Fahren startet nochmal neu.
Wenn Du langsam genug drehst wirst Du auch 10 mal stoppen. Und wenn der Motor steht kannst Du gar nicht so schnell drehen ohne das er schon losfährt bevor du fertig mit drehen bist. Also kommst Du um eine Abfrage "Poti verdrehen ist fertig" nicht herum.