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
}
}