Schrittmotor mit Moba Tool nach Fehler selbstständig reseten

Hallo an alle,

ich sitze vor meinem ersten Arduino Projekt und bräuchte jetzt nach langem Lernen, Lesen und Ausprobieren mal Rat und Unterstützung.
Viellecht ein bisschen viel Text aber ich hoffe so alles auf einmal erklärt zu haben.
Ich plane mir ein HIFI Möbel, wo eine Schublade elektrisch geöffnet wird, wenn der Fernseher eingeschaltet wird, und sich wieder schließt wenn er ausgeschaltet wird.
Es soll noch weitere Funktionen mit DC Motoren geben, aber ich möchte eins nach anderen abarbeiten und dann implementieren.
Realisiert werden soll das ganze mit zwei Linearachsen mit Spindelantrieb und Closed Loop Stepper Motoren.
Die Komponeneten habe ich alle zusammen, das Programm mit Hilfe von Mobatools Stepper Referencee erstellt und läuft. (Herzlichen Dank an @MicroBahner), toll gemacht und wie ich finde sehr verständlich für einen absoluten Anfänger wie mich.
Den Scetch hänge ich unten an.

Das Signal (5V) soll später aus einem USB-Port des Fernsehers abgenommen werden, das beim Einschalten aktiv wird und beim Ausschalten komplett inaktiv ist. Habe ich schon getestet, klappt. Signalübertragung an den Arduino mittels Optokoppler.
Im Versuchaufbau simuliere ich das Signal mit einem Taster den ich dauerhaft drücke, bzw. loslasse.
Ich steuere auch gerade nur einen Motor mit (Step/DIR/ENA) direkt an.

Motoren: Nema 11 closed Loop Stepper mit integrietem Treiber

Arduino Uno R3 v(Später nur den Chip auf eigener Platine.)
Linearantriebe mit Spindel 250mm

Der Stepper fährt wie gewünscht zum ref Punkt(A5), und bei Tastendruck (Signal) mit Rampen an die gewünschte Position und auch wieder zurück zum Ref punkt.

Habe closed Loop Motoren mit integ. Treiber genommem, wegen Platzmangel und die Position im geschlossen Zustand immer wieder sehr genau sein muss.
Und er soll beim möglichen verklemmen, bzw. Widerstand die Schritte nicht verlieren und zum Ausgangspunkt zurückfahren.
Und genau hier komme ich nicht weiter.

Oder gibt es einfachere Lösungsansätze?

Dieser Motor(Trieber) hat kein ALM Ausgang, der mir zurückgibt ob ein Fehler aufgetreten ist.

Es gibt zwar Stepper mit externen Treibern und ALM Signal, aber ich bräuchte nach meinen Recherchen 2 davon und viel Verkabelung und Platz.

Blockiert er, resetet er zwar selbst aber das Programm nimmt in dem Moment den aktuellen Standort als neuen Ref punkt. Logisch.
Er soll aber bei nicht Erreichen der vorgebenen Position nach Zeit X zurück zum Ref Punkt und selbständig neu starten.

Wie kann man das lösen? Am tollsten wäre eine Software Lösung, da ich nicht viel Platz für die Hardware habe.
Ansonsten gerne andere Lösungsansätze.

Über Tipps und Antworten würde ich mich sehr freuen.


```cpp


#define MAX8BUTTONS  // spart Speicher, da nur 4 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
// Pindefinitions - change to your needs
const byte dirPin = 8;
const byte stepPin = 9;
const byte enaPin = 7;
const byte button1 = 2;
const byte button2 = A5;





const int STEPS_REVOLUTION = 200;
//Stepper einrichten ( 200 Schritte / Umdrehung - 1/4 Microstep )
MoToStepper myStepper(STEPS_REVOLUTION, STEPDIR);  // 200 Steps/ Umdrehung

// Taster einrichten
enum { Button1 };                       // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { button1 };  // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button(buttonPins, sizeof(buttonPins), 20, 500);

const byte refPin = A5;        // Input für Referenzpunktschalter
const byte atRefpoint = HIGH;  // Einganspegel, wenn Refpunkt erreicht

void toRefPoint() {
  // Stepper zum Referenzpunkt bewegen, und Position auf 0 setzen
  Serial.println("Referenzpunkt anfahren");
  // Im Schnellgang Richtung Refpunkt fahren ...
  if (digitalRead(refPin) != atRefpoint) {
    // ... nur wenn der Stepper nicht schon dort steht
    myStepper.setSpeedSteps(15000, 100);
    myStepper.rotate(-1);
    while (digitalRead(refPin) != atRefpoint);
  }
  digitalWrite(LED_BUILTIN, digitalRead(refPin));
  // Refschalter erreicht, anhalten
  myStepper.rotate(0);
  while (myStepper.moving());  // Bremsrampe abwarten;

  // Langsam und ohne Rampe zurück zum Schaltpunkt des Refpunktes fahren
  myStepper.setSpeed(10000);
  myStepper.setRampLen(0);
  myStepper.rotate(1);  //Richtung Referenzfahrt
  while (digitalRead(refPin) == atRefpoint);

  digitalWrite(LED_BUILTIN, digitalRead(refPin));
  Serial.println("Referenzpunkt erreicht");
  myStepper.rotate(0);
  while (myStepper.moving());
  myStepper.setZero();
  myStepper.setSpeed(12000);  //geschwindigkeit einstellen Fahrt
  myStepper.setRampLen(500);  // Rampenlänge
  Serial.println("Ende Reffahrt");
}
void setup() 
{ Serial.begin(115200); while (!Serial);
  myStepper.attach(stepPin, dirPin);
  myStepper.attachEnable(enaPin, 10, LOW);  // Enable Pin aktivieren ( LOW=aktiv )

  pinMode(LED_BUILTIN, OUTPUT);
  pinMode(refPin, INPUT_PULLUP);
  toRefPoint();
}

void loop() {
  button.processButtons();  // Taster einlesen und bearbeiten



  if (button.longPress(A5)) toRefPoint();

  
  if (button.pressed(Button1)) {
    //Taster1 gedrückt(Fernseher eingeschaltet)
    myStepper.writeSteps(0);  // Stepper fährt Schublade auf vom Ref punkt

  } else if (button.released(Button1)) {
    //Taster1 losgelassen (Fernseher ausgeschaltet)
    myStepper.writeSteps(-78300);  // Stepper Schublade zu 
  }
}

Dieser Kombination stehe ich sehr kritisch gegenüber. Wie kann denn sinnvoll reagiert werden, wenn der Motor einen Schritt nicht ausführen kann? Stattdessen würde ich einfach DC Motoren mit Endschaltern verwenden.

Wenn @c_76 keine Zwischenpositionen anfahren will/muss wäre das sicher die einfachste und platzsparendste Lösung.

Hallo, danke für die schnelle Antwort!
Habe mir schon fast gedacht das ich mit Kanonen auf Spatzen schieße.
Meint Ihr mit DC Motoren dann solche mit +/- Anschluß oder die Steppper mit A+A-/B+B- Anschlüßen? auch wegen der Nema Aufnahme an die Spindelachse.
Mit den zwei Endschaltern war auch schon ein Ansatz, aber wie löse ich auch da die Problematik des möglichen nicht erreichen der Endposition?

Nachschauen was die Bewegung verhindert, Kinder und Hunde aus der Führung entfernen usw.
Im Wiederholungsfall einen ausreichend starken Motor und Netzteil einbauen.

:smile: das ist die einfache Lösung klar. Ist in anderen Beiträgen auch schon erwähnt worden.

Der Wunschgedanke kommt aus dem Fensterheberprinzip im Auto, kommt es zu Hindernissen, Kollision oder Verkanten soll das Programm den Motor zum Ref Punkt zurückfahren. Ist eigentlich ausgeschlossen, aber wenn doch, um eine manuelles resten per Schalter zu vermeiden.
Luxus Problem, ich weiß. Aber das ganze zu lösen finde ich reizvoll und würde es gerne lernen.
Ist das überhaupt realisierbar?
Die aktuelle Position in Echtzeit Auslesen z.B?

Damit kannst Du feststellen, daß es klemmt. Aber weiter hilft Dir das auch nicht.

DC Motoren mit Endschalter an beiden Seiten und Stromessung in der Spannungsversorgung der Motoren. Wenn der Motor die Stellung A verlässt, und der Strom plötzlich ungewöhnlich hoch wird. Zurück bis der Endschalter Stellung A wieder Kontakt meldet. Ansonsten, ohne Zwischenfälle, fährt der Motor eben bis zum Endschalter Stellung B und stoppt da.

Zurück geht das Spiel eben anders herum.

Franz

PS: Ich könnte mir noch vorstellen, dass man wenn die Lade hängen bleibt, nicht wieder zurückfährt, sondern stehen bleibt und mit einem Ton meldet, dass es ein Problem gibt. Weil es ja oft der Inhalt der Lade ist, der sich veklemmt. Dann kann man vielleicht beim Warnton mit der Hand reingreifen und versuchen das Hindernis zu lösen. Wenn man es nicht schafft, und ein anderer Warnton kommt (sagen wir mal, nach einer Minute), Finger wieder raus, weil dann die Lade wieder zufährt.

1 Like

Hallo Franz,

das mit der Strommessung ist ein guter Tipp. Werde das ausprobieren.
Vielen Dank.
Schönes Wochenende

ansteigenden Strom beim Blockieren gibt es bei DC-Motoren. Bei Stepper-motoren aucb bei closed loop-stepper-motoren gibt es keinen Stromanstieg.
Der Strom fließt durch den stehenden Teil des Motors und dem stator ist es egal ob sich der Rotor wirklich dreht oder nur auf der Stelle ruckelt.
Es gibt ToF Sensoren zum Entfernung messen. Platine 1,2mm und Aufbau ca 2mm. Briefmarken groß. Vielleicht wäre das etwas.
Oder einen Näherungsschalter in einer Holzplatte versenken.

Wenn du mal Bilder von der Konstriktion postest kann man sich mehr Gedanken machen was gehen könnte.

Wenn Du für den StepperMotor den richtigen Treiber benutzt geht das sehrwohl. Einige der TMC-Treiber wie sie in 3D-Druckern verwendet werden, kennen das soenannte Sensorless-Homing, welches mittels stallerkennung, also blokade-erkennung des steppers funktioniert. die blokierkraft, die nötig ist, das sogenante Bump ist einstellbar genauer proramierbar und diese Treiber sind an nem Arduino lauffähig, müssen dann aber , für Sensorless via UART an den Controler angeschlossen werden, evt. gibt es auch TMC-Treiber, die das über SPI können, bin mir da aber nicht ganz sicher.

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.