Werte Mitglieder, ich versuche gerade einen Steppermotor mittels den MobaTools zu steuern. Es ist mir soweit auf gelungen. Der Stepper Motor wird von einem arduino uno angesteuert und soll ein Lokschuppen Tor öffnen und schließen. Ich hätte jedoch eine Frage für den Befehl void myStepper.setZero( );
Kann ich die Position des Steppers auch in einer Variablen ablegen und wenn ja wie muss ich dies tun? Der Grund ist jener, ich möchte beim Anlegen der Spannung die aktuelle Stepper Position abfragen aus folgendem Grund. Aufgrund der Position weiß ich dann ob das Tor offen oder geschlossen ist. Wenn es z.B offen wäre möchte ich die Funktion zum öffnen sperren und nur die Funktion zum schließen freigeben oder eben umgekehrt da sonst der Stepper in einer Ecke hängt. Ich würde dann den Variablen Inhalt in einem Eprom ablegen welcher beim Start des Programms ausgelöst wird. Sollte es eine professionellere Variante geben bin ich ganz offen für Tipps und Ratschläge, wie gesagt ich bin noch ein blutiger Anfänger in Sachen Programmierung.
Wenn ich hier das ino File meines bescheidenen Werkes posten darf, würde ich das gerne tun ich bin sicher da gibt es einiges zu kritisieren aber nur so kann ich noch etwas lernen.
Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden. Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.
Wenn Du mit myStepper.moveTo( long stepPos ); positionierst, dann mußt Du Dir stepPos merken. Dann weißt Du, welche Position Du als letzte anfahren wolltest.
Ich würde ggf. die Verwendung (mindestens) eines Endschalters oder einer optischen Auf/Zu-Erkennung in Erwägung ziehen.
Ich kann natürlich nicht beurteilen, ob sowas "schön" (sprich: genügend unsichtbar) in Deinen Lokschuppen einzubauen ist.
Natürlich darfst Du Code posten; wie das geht weißt Du ja z.B. aus "servosteuerung-mit-attiny84" von vor drei Jahren.
Danke für die Rückmeldung. Da 3 Jahre eine lange Zeit sind und ich in dieser nichts mit dem Arduino gemacht habe, muss ich mich erst langsam wieder einfinden und so einiges ist in den 3 Jahren in Vergessenheit geraten. Nur schön langsam finde ich mich wieder zurecht. Bin ja auch nicht mehr der jüngste
Das mit dem Endschalter habe ich mir auch schon überlegt. Leider ist in so einem H0 Lokschuppen nicht viel Platz dafür. Der Endschalter könnte mir vielleicht auch bei meinem weiteren Problem helfen. Ich verwende die Funktion button.processButtons() und habe schon einige Versuche unternommen die Betätigung von 2 Tasten von 4 zu sperren bzw nur im Einstellzustand (Ein Arduino Port ist auf GND gelegt) zuzulassen. Leider bisher OHNE Erfolg und bin damit mit meinem Latein auch schon am Ende. Anscheinend geht es mit dieser Funktion nicht. Mit dem Posten des Code muss ich mich nochmals auseinandersetzen. Wie gesagt in 3 Jahren habe ich einiges vergessen
Danke für die Rückmeldung und den Hinweis ich werde mir das noch einmal in der Anleitung genauer ansehen. Die Verwendung von Servos ist leider nicht Möglich da der Platz dazu nicht ausreicht.
Ein Schrittmotor benötigt einen Referenzpunkt, den man meist mit einem Endpunkt zusammenlegt. Nach dem Einschalten bewegt sich das Tor in Richtung Endpunkt, außer der Endpunkt ist bereits erreicht.
Anstelle eines Tasters kann man auch eine Scheibe für die Istposition verwenden, minimal mit einer Spur für offen und einer für geschlossen.
Ich kenne jemanden (@schorsch55), der Lokschuppen für Spur Z mit einem Servo ausstattet. Hast Du eine noch kleinere Spur? 1
An der Software für Disco-im-Coutisch war ich geringfügig beteiligt, weshalb ich sie mir mal persönlich ansehen durfte Den Lokschuppen konnte ich allerdings nicht auf einem Foto entdecken, ist eine der neueren Kreationen. Eventuell verrät er Dir ja seinen Trick
Dann zeig doch mal deinen Versuch. Nur wenn wir wissen, was Du versucht hast, kann man auch auf einen Fehler aufmerksam machen und eine Korrektur vorschlagen.
Für einen Moba-Kollegen habe ich vor ein paar Jahren mal eine Steuerung für Lokchuppentore gemacht. Der hat Servos verwendet, und die Tore ( wie einen Unterflur-Weichenantrieb ) von unten mir Servos bewegt. Im Prinzip also einfach die Achse der Torscharniere nach unten durch die Platte verlängert. Da gab es dann keine Platzprobleme im Schuppen.
Hallo Marbin,
also dann oute ich mich mal. Ich habe für eine Wagenhalle (4-ständig mit Doppeltoren) Servos verwendet. Wären nach dem "Achsenbetrieb" 8 Stück. Zuviel und ich habe Spur Z, also noch weniger Platz. Habe es so gelöst, das je 1 Servo 2 Tore bewegt. Hier im Versuchsaufbau zu sehen: Servoantrieb für Toröffner/schließer
Als Auslöser kann man Taster nehmen oder wie ich, Hallsensoren.
Bei Fragen, einfach fragen
Das mit dem Referenzpunkt wäre mir klar, deshalb würde ich ja gerne als erstes in einem "Programmiermodus" diesen Referenzpunkt mit zwei Tastern einstellen und dann speichern. Wenn dann die Stromversorgung wieder aktiviert wird sollte dieser Referenzpunkt übernommen werden und dann ist es ein leichtes den Stepper wieder die benötigten Schritte zum öffnen oder schließen durchführen zu lassen. Wichtig wäre mir noch das man die Tasten zum öffnen und schließen mittels SW verriegeln kann so das wenn das Tor geschlossen ist nur die Taste zum öffnen betätigt werden kann und umgekehrt denn sonst bringt der gespeicherte Referenzpunkt gar nichts. Ich habe spur H0 und schon einige Schuppen mit Servos gesehen. Da ich in meinem Fundus aber einiges an Linearstepper habe möchte ich diese gerne verwenden. Die Bewegung ist einfach viel schöner als mit Servos finde ich.
Was machst Du, wenn das Tor in der Zwischenzeit manuell bewegt wurde?
Der Referenzpunkt muss nach jedem Einschalten angefahren werden. Speichern bringt nichts.
Danke für deine Rückmeldung. Da ich den Versuch nicht gespeichert und schon geändert habe muss ich diesen erst wieder programmieren. Dann werde ich gerne diesen hier posten um meine Fehler zu beseitigen. So eine Schuppentor Lösung die du beschrieben hast habe ich schon einmal gesehen, leider habe ich unter dem Schuppen sehr wenig Platz da sich hier ein Schattenbahnhof befindet und ich bei möglichen Defekten ich nur sehr schwer heran kommen würde. Deshalb strebe ich eine Lösung im Dach des Schuppens an. Das Herstellen eines Prints wäre für mich kein Problem und da ich in meinem Fundus eine Menge kleiner Schrittmotoren habe die ich einmal bekommen habe würde ich diese auch gerne verwenden.
Was sind denn das für Motore? Davon hängt ja auch die Ansteuerung ab. Stepper ist nicht gleich Stepper - da gib'ts schon Unterschiede.
Wenn die Durchzugskraft der Stepper recht klein ist ( für die Tore braucht es ja auch nicht viel Kraft ) könnte man die auch einfach gegen einen Anschlag ( z.B. 'Tor zu' ) laufen lassen um den 'Startpunkt' zu bestimmen.
Das funktioiert für Stepper nicht. Da ist der Referenzpunkt eine mechanische 'Null-Position'. Für den Stepper ist das immer '0'. Was willst Du da speichern?
Hallo Schorsch, danke für deine Rückmeldung. Das Video gefällt mir und ist gut gemacht. Da ich aber in meinem Fundus eine Menge Lineare Steppermotoren habe würde ich diese gerne Verwenden, daher kommt für mich eine Servo Lösung nicht in Frage. Auch ich würde gerne mit 4 Tastern arbeiten. 2 Taster zum einstellen des Referenzpunktes z.b bei geschlossenen Toren und mit den anderen beiden die Tore öffnen und schließen. Das stepper_03 File in den Moba Beispielen kommt meiner Anforderung schon sehr nahe und das funktioniert auch soweit schon. Ich habe nur noch Probleme das ich die beiden Tasten zum einstellen des Referenzpunktes nur im Einstellmodus verwenden möchte und das ist mir bisher noch nicht gelungen, aber ich arbeite daran eine Lösung zu finden. Auch die Idee von wno158 mit einem Endschalter gefällt mir und ich bin gerade am Überlegen was mir dieser bringen könnte und wie ich diesen am besten umsetze.
Das sieht mir programmiertechnisch ja sehr nach einem Zustandsautomaten / Schrittkette / Finite State Machine aus.
Ich vermute, dass sogar noch ein Taster mehr (oder ein Doppel- bzw. langer Tastendruck) zum Erreichen des "Programmiermodus" erforderlich sein wird.
Wenn Du Referenzpunkte setzen kannst wird zusätzliche Hardware sich vielleicht mit ein paar Randbedingungen erübrigen. Diese wären:
Referenzpunkte setzen ist möglich
Die Tore bewegen sich zwischen Strom aus und Strom wieder an nicht (falls doch, ist eine neue Referenzfahrt nötig)
Die Schrittmotoren werden so angesteuert und die Mechanik ist so leichtgängig, dass keine Schrittverluste vorkommen (falls doch...)
Bei einem Schrittmotor weißt Du ja eigentlich immer wo er steht, denn Du steuerst ihn ja selbst an. Wenn der Referenzpunkt "Tor zu" ist musst Du "nur" noch nach jeder regulären Torbewegung (X Schritte auf, Y Schritte zu) die aktuelle Position ins EEPROM schreiben. Beim Programmstart liest Du den Wert dann aus.
Da kannst Du ungefähr 100000 Mal auf und zufahren, das ist die Anzahl möglicher Schreibvorgänge.
Mit eurer Mithilfe habe ich nun einen funktionsfähigen Code zusammengebracht. Er Funktioniert für einen Stepper und somit 1 Tor so wie ich es aktuell mir vorgestellt habe. Was mir noch ein wenig Kopfzerbrechen macht ist die Tatsache das beim Einschalten der Stromversorgung das Programm aktuell nicht die Stepperposition sowie den Referenzpunkt kennt. Wie ich dies speicher bzw im Setup zur Verfügung stelle muss ich mir noch überlegen. Sollte jemand einen Tipp für mich haben ich bin offen. Für Kritik und Tipps was ich am Code noch verbessern kann wäre ich natürlich dankbar. Ich Überlege auch ob ich den Code nicht in einem Tiny unterbringen sollte. Den Code muss ich natürlich noch erweitern für einen zweiten Stepper da ich ja zwei Tore habe. Danke für eure Unterstützung sowie der Tipps und Hinweise.
/*****************************************************************************************************************************
Torsteuerung des Vollmer Lokschuppen 45752 mittels eines Linearen bipolaren Stepper über 4 Pins und eine H-Brücke.
/*****************************************************************************************************************************
*/
#define MAX8BUTTONS // spart Speicher, da nur 4 Taster benötigt werden (saves RAM)
#include <MobaTools.h>
const byte button1Pin = A1;
const byte button2Pin = A2;
const byte button3Pin = A3;
const byte button4Pin = A4;
int aktpos; // aktuelle Stepper position
const int FULLROT1 = 800; //Stepper einrichten ( 800 Schritte / Umdrehung )
MoToStepper Step1(FULLROT1); // HALFSTEP ist default
const byte stPn[] = { 2, 4, 3, 5 }; // bei bipolarem Stepper (4-Draht) über eine H-Brücke müssen gegebenenfalls die inneren Pins
// vertauscht werden (Spule 1: 1. und 3. Pin, Spule 2: 2. und 4. Pin)
enum { Button1 = 0, Button2, Button3, Button4 }; // Den Tasternamen die Indizes 0...3 zuordnen
const byte buttonPins[] = { button1Pin, button2Pin, button3Pin, button4Pin }; // muss als byte definiert sein, damit ein enfaches sizeof funktioniert
MoToButtons button(buttonPins, sizeof(buttonPins), 20, 500);
void setup() {
Serial.begin(9600);
Serial.println("Stepper test!");
Step1.attach(stPn[0], stPn[1], stPn[2], stPn[3]); // Anschluß an digitalen Ausgängen
Step1.setSpeed(300); // Steppergeschwindigkeit
Step1.setRampLen(FULLROT1 / 4); // = 1/4 Umdrehung
}
void loop() {
button.processButtons(); // Taster einlesen
if (button.pressed(Button1)) { // Taster1 gedrückt (Tor schließen Referenzpunkt einstellen)
Step1.attach(stPn[0], stPn[1], stPn[2], stPn[3]); // Anschluß an digitalen Ausgängen
Step1.rotate(1); // Motor 1 schließt Tor
}
if (button.released(Button1)) { // Taster1 losgelassen
Step1.rotate(0); // Stepper stoppt
Step1.setZero(); // Referenzpunkt setzen
aktpos = Step1.currentPosition();
Serial.println(aktpos);
Step1.detach(); // Motor deaktivieren
}
if (button.pressed(Button2)) { // Taster2 gedrückt (Tor öffnen Referenzpunkt einstellen)
Step1.attach(stPn[0], stPn[1], stPn[2], stPn[3]); // Anschluß an digitalen Ausgängen
Step1.rotate(-1); // Motor 1 öffnet Tor
}
if (button.released(Button2)) { // Taster2 losgelassen
Step1.rotate(0); // Stepper stoppt
Step1.setZero(); // Referenzpunkt setzen
aktpos = Step1.currentPosition();
Serial.println(aktpos);
Step1.detach(); // Motor deaktivieren
}
if ((button.pressed(Button3)) && (aktpos == -2300)) { // Taster3 wurde gedrückt und Tor ist offen
Step1.attach(stPn[0], stPn[1], stPn[2], stPn[3]); // Anschluß an digitalen Ausgängen
Step1.doSteps(2300); // x Schritte vorwärts, Tor schließt
while (Step1.moving()); // warten bis Stillstand
aktpos = Step1.currentPosition();
Serial.println(aktpos);
Step1.detach(); // Motor deaktivieren
}
if ((button.pressed(Button4)) && (aktpos == 0)) { // Taster4 wurde gedrückt und Tor ist geschlossen
Step1.attach(stPn[0], stPn[1], stPn[2], stPn[3]); // Anschluß an digitalen Ausgängen
Step1.doSteps(-2300); // x Schritte rückwärts, Tor öffnet
while (Step1.moving());
aktpos = Step1.currentPosition();
Serial.println(aktpos);
Step1.detach(); // Motor deaktivieren
}
}
Das hatte ich dir in #15 schon erklärt, und auch @Tommy56 hat Dir das schon gesagt: Beim Einschalten ist die Position des Steppers und auch ein 'Referenzpunkt' prinzipiell nicht bekannt. Deshalb braucht es bei einem Stepper nach dem Einschalten immer eine Referenzfahrt.
Bei einem Servo ist das anders, da ein Servo im Gegensatz zu einem Stepper seine eigene Position kennt.
Was Du in beiden Fällen brauchst, ist eine Justage um die Endpositionen für TOR AUF und TOR ZU zu kennen.
Zuerst mal würde ich den Tastern sinnvolle Namen geben und nicht einfach durchnumerieren. So weist Du auch in einem Jahr noch, welcher Taster wofür da ist ( und uns hilft es auch ungemein beim Helfen ). Das gilt eigentlich allgemein für alle Variablen und Konstantenbezeichner.
Du solltest für die Torsteuerung absolute Zielpositionen verwenden ( nachdem Du den Referenzpunkt angefahren hast ). Dann löst sich auch das Problem mit der Verriegelung der Tasten von alleine. Du kannst dann z.B. den 'AUF' Taster so oft drücken wie Du willst, das Tor wird nie weiter als bis zur 'AUF' Position fahren.
Ausserdem ist der Code so nicht blockierend. Du kannst Das Tor auch wieder schließen, bevor es ganz auf ist.
Auch das Abschalten des Motors kannst Du den MobaTools überlassen.
Hier mal eine Simulation mit absoluten Positionen:
Wobei das sicher noch nicht der Endzustand ist
P.S. Die Led's in der Simulation dienen nur dazu, das Abschalten des Motors zu visualisieren.