Erfahrungen und Tipps zur Steuerung von einigen Gleichstrommotoren (Seilwinden)

Hi,

da gabs doch letzte Woche schon mal so was ähnliches , da wollte jemand einen Luftballon auf einer Messe rauf und runter fahren.

Gruß

da gabs doch letzte Woche schon mal so was ähnliches , da wollte jemand einen Luftballon auf einer Messe rauf und runter fahren.

Ja, das habe ich gelesen. Meine Anwendung erfordert aber einen erheblich geringeren Maßstab und hohe Präzision, dafür wirken aber keine großen Kräfte auf die Motoren. Deshalb gehe ich mal davon aus, dass ich mit den Steppermotoren mit ULN2003-Treibern einen vielversprechenden Lösungsansatz habe. Den ich dann umgehend ausprobieren werde.

Also vielen Dank schon mal!

combie:
Die Motoren beherrschen keine Telepathie!
Auch fehlen dir noch die Endschalter bei der Zählung.

Servos brauchen nur 1 Pin. (plus Endschalter)

Einen Servo auf Dauerlauf umzubauen ist das gleiche wie einen bereits gezeigten Motor mit Getriebe zu benutzen (ok die Ansteuerung ist anders aber ansonsten sind sie ähnlich in der Funktion; sie drehen sich solange man sie in einer bestimmten Weise ansteuert).
Meines erachtens brauchen normale Servos keinen Endschalter. SeilwindenServos verbieten sich wegen dem Preis und der Größe.

Ein 180° Standart Servo hat sicher einen zu kleinen Drehwinkel um Kulissen zu bewegen. Man kann das Feedback-Potentiometer des Servos ausbauen und gegen ein 10 Gang austauschen. So kann er weit mehr drehen als Orginal. Das ist wieder ein Umbau der sich im vermehrten Platzbedaf niederschlägt.

Bezüglich Geräuschkulisse weiß ich nicht wer besser davonkommt: Billigservo, Motor mit Getriebe wie oben verlinkt, oder genannter Schrittmotor mit Getriebe.

postmaster-ino:
Präzision: Naja, bei jedem Step macht der Kleine ca. 1/2048tel Umdrehung.

Hat dieser Motor nicht eine Umdrehungsschrittzahl von fast 4096 Schritten? Bei Halbschritten verdoppelt sich die Schrittanzahl.

Grüße Uwe

uwefed:
Hat dieser Motor nicht eine Umdrehungsschrittzahl von fast 4096 Schritten?

Wenn ich es mit AccelStepper und FULL4WIRE probiere, dreht er sich bei 2048 Schritten eine Umdrehung.

@Simba21: Wegen des sanften Anlaufs empfehle ich Dir die Verwendung von AccelStepper als Programmbibliothek.

Testsketch für Schrittmotor-Set S-SPSM-5V mit Motor 28BYJ-48:

#include <AccelStepper.h>

const int stepsPerRevolution = 2048;  // here go the 2048 steps
// for your motor

// initialize the stepper library on pins 8 through 11 -> IN1, IN2, IN3, IN4
// as shown above, we need to exchange wire 2&3, which we do in the constructor
AccelStepper myStepper(AccelStepper::FULL4WIRE, 8, 10, 9, 11);

void setup()
{
  // initialize the serial port:
  Serial.begin(9600);
  myStepper.setMaxSpeed(800.0);
  myStepper.setAcceleration(1000.0);
  myStepper.moveTo(stepsPerRevolution);
}

void loop()
{
  // Change direction at the limits
  if (myStepper.distanceToGo() == 0) {
    myStepper.moveTo(-myStepper.currentPosition());
    delay(200);
  }
  myStepper.run();
}

Da der Motor von +2048 nach -2048 und zurück dreht, bewegt er sich zwei Umdrehungen!

Ich habe es nun mit einem 28BYJ-48 probiert. Es funktioniert tadellos.

Wenn ich es mit AccelStepper und FULL4WIRE probiere, dreht er sich bei 2048 Schritten eine Umdrehung.

Das kann ich bestätigen.

Die AccelStepper-Bibliothek gefällt mir sehr gut und scheint sich hervorragend für meine Zwecke zu eignen.
Die Ansteuerung über USB klappt auch sehr gut.
Ich habe an den Motor noch eine Übersetzung drangehängt, sodass die Winde fünfmal so schnell dreht, weil der Motor sonst für das Verfahren von Kulissen zu langsam wäre. Trotzdem ist er noch stark genug, was mich sehr freut, und leise noch dazu... :wink:

Vielen Dank für eure Empfehlungen!!!

Als Nächstes werde ich dann eine größere Zahl von Motoren auf einmal probieren (10 Stück). Gibt es da noch etwas, was ich beachten muss? Ich will ja den Mega nicht überfordern... :confused:

Simba21:
Es funktioniert tadellos.

Sehr gut :slight_smile:

Simba21:
Als Nächstes werde ich dann eine größere Zahl von Motoren auf einmal probieren (10 Stück). Gibt es da noch etwas, was ich beachten muss? Ich will ja den Mega nicht überfordern... :confused:

Kennst Du Dich mit endlichen Automaten, Feldern und Strukturen (struct) aus? Wenn ja, leg' los, sonst kannst Du hier fragen :slight_smile:

In einem anderen Thema habe ich gerade ein kleines Beispiel Feld aus Strukturen gezeigt.

Kennst Du Dich mit endlichen Automaten, Feldern und Strukturen (struct) aus?

Ich muss gestehen, nicht wirklich. Ich habe Dein Beispiel und die zugehörige Diskussion durchgelesen und könnte damit wohl umgehen, nur sehe ich jetzt (vielleicht den Wald vor lauter Bäumen) nicht, wie mir diese Konzepte für meine paar Motoren nützen können... :confused:

sonst kannst Du hier fragen

Also, ich wäre sehr dankbar für eine Erläuterung! :smiley:

wie mir diese Konzepte für meine paar Motoren nützen können... :confused:

Deine Motoren sollen auch mal laufen!
Richtig?

Bedienelemente/Eingabedaten wollen verarbeitet werden.

Dabei ist ein geplanter Ablauf/Reihenfolge einzuhalten.
Oder?
z.B. "laufe bis Endschalter erreicht"

Dazu wirst du eine Ablaufsteuerung bauen müssen.
Und "Ablaufsteuerung" gehört zum Bereich "Schrittkette" oder "Endlicher Automat"

Übrigens:
Nahezu jedes(99,99xx%) funktionierende Arduino Programm, welches was sinnvolles macht, ist ein endlicher Automat. Meist eine Kombination aus etlichen endlichen Automaten.
Auch wenn der Programmierer das Wort "Endlicher Automat" noch nie gehört hat, und auch nicht beabsichtigt hat einen solchen zu bauen.

Simba21:
Also, ich wäre sehr dankbar für eine Erläuterung! :smiley:

Wenn Du hier im Forum nach "agmue anleitung" suchst, findest Du Text zum Thema von mir und Links zu anderen Erklärungen. Suche Dir diejenigen raus, die Dir sympathisch sind.

Dann fange mit einem Motor an, damit wir sehen können, was Du vorhast. Derzeit habe ich viel zu wenige Informationen. Welche Taster für welchen Zweck, welche Sensoren für Referenz- und/oder Endlage, welche Anzeigen usw.

Du hast auch noch einen PC erwähnt, dessen Funktion ist derzeit gänzlich im Dunkeln.

Bitte bedenke, wir können (und wollen) nicht auf Deinen Schreibtisch schauen.

Hi,

ich hab jetzt hier mal ne Weile hier mitgelesen. Ich glaube das mit den Steppermotoren wird so gehen. Bleibt nur das Problem das man die mal referenzieren muss. oben oder unten. Oben kann man das mit einer Lichtschranke gut machen jedesmal . z.B wenn der Vorhang oben ist kann die Lichtschranke den Vorhang nicht sehen und unten druch sehen.

Wenn beim Einschalten die Lichtschranke belegt ist bist Du nicht oben dann hoch fahren bis sie belegt ist. Wenn beim Einschalten die Lichtschranke frei ist bist Du schon oben alles ok.

Eigendlich ist das mit einer Schrittkette zu aufwendig, es gibt ja nur einen Schritt. Schließlich willst Du doch über den PC die Antriebe fahren

bis oben->Lichtschranke -> stop
oder bis unten 5000 steps -> stop.

Also brauchst Du für jeden Antrieb eine Info vom PC rauf oder runter, vermutlich je einen Button. Setzten -> senden und nach 1-2 s zurück setzen.

Rentner:
... es gibt ja nur einen Schritt.

Ich komme spekulativ auf fünf Schritte. Aber ich warte erstmal auf mehr Informationen.

Simba21:
... wenn ich ca. 10 solche Motoren mit dem Arduino steuern will?

Ich habe mir gerade die MobaTools angesehen und lese dort "Library to drive the Stepper Motor 28BYJ-48 connected to SPI (MOSI,CLK,SS) Interface via shift register or 4 pins directly". Ich vermisse leider das sanfte Anfahren wie bei AccelStepper, auch bin ich mir nicht sicher, ob mehr als vier Schrittmotore möglich sind. Aber der Autor der Bibliothek ist in diesem Forum als MicroBahner ansprechbar.

Hallo,
die MobaTools waren ursprünglich schon für Modellbau - oder genauer für Modellbahn ( = MoBa ) Aufgaben gedacht. Der erste Einsatz der Stepper-Klasse war ein beschrankter Bahnübergang - und der hat üblicherweise maximal 4 Schrankenbäume -> 4 Steppermotoren. Mehr geht derzeit nicht. Auch eine Anfahr- und Bremsrampe sind bei den geringen zu bewegenden Massen da nicht nötig, und deshalb bisher nicht implementiert. Allerdings ist die Anforderung schon da, denn inzwischen wird das auch für Drehscheibensteuerung eingesetzt, und da würden Rampen schon Sinn machen. Kommt also vielleicht auch mal in einer der nächsten Versionen.
Das hilft hier aber erstmal nichts - wobei bei einem Modelltheater die Massen sicher auch nicht so groß sind, dass man Rampen unbedingt bräuchte.
Aber die Begrenzung auf maximal 4 Motoren ist derzeit halt fest - 10 sind nicht möglich.

Was mir persönlich bei der Accel-Stepper-Lib nicht gefällt, ist die Tatsachen, dass die Schrittimpulse per Methodenaufruf im loop() erzeugt werden. Damit wird die Ansteuerung der Motore stark abhängig vom Aufbau des Sketches. Da hat es hier schon einige Anfragen wegen Problem gegeben, die darauf zurückzuführen sind. Insbesonder bei einem Sketch, der neben der Schrittmotoransteuerung noch allerhand anderes machen soll, muss man da besonders aufpassen. Gegebenenfalls muss man die Methode im loop() sogar mehrfach aufrufen.

Den Referenzpunkt für die Schrittmotore würde ich auch am oberen Punkt einrichten. Evtl. eine Gabellichtschranke, die dann von der Kulisse unterbrochen wird, wenn diese ganz hochgehoben wird. Wieweit sie herabgelassen wird, kann man dann jeweils über die Schrittzahl festlegen.

MicroBahner:
Aber die Begrenzung auf maximal 4 Motoren ist derzeit halt fest - 10 sind nicht möglich.

Danke für Deine Antwort :slight_smile:

Ich frage mich gerade, wieviel Aufwand es wohl für Dich wäre, SS flexibel (an unterschiedlichen Strobes) festzulegen. Damit sollten dann doch mehrere Bahnübergänge möglich sein, oder?

agmue:
Ich frage mich gerade, wieviel Aufwand es wohl für Dich wäre, SS flexibel (an unterschiedlichen Strobes) festzulegen. Damit sollten dann doch mehrere Bahnübergänge möglich sein, oder?

Zuerst müsste ich dazu die Maximalzahl der Stepper erhöhen. Bisher sind die ganzen Daten in einem Array mit 4 Strukturen hinterlegt. Soll die Zahl der Stepper deutlich steigen, würde ich das nicht mehr mit einem statischen Array machen, das ja den Platz unabhängig von der tatsächlich genutzten Zahl von Steppern belegt. Wie schon bei Servos und Leds würde ich dann die Strukturen erst im Konstruktor anlegen, und das ganze dann als verkettete Liste aufbauen. Damit passt sich der RAM Bedarf dann dynamisch an die tatsächlich verwendete Zahl von Steppern an. Da die ganze Impulserzeugung ja im Interrupt stattfindet, müsste man auch erstmal testen, wie lang so ein Interrupt dann wird, wenn alle Stepper parallel laufen.
Das ganze ist also schon ein gewisser Aufwand, da doch einiges umzubauen wäre. Und wenn man dann schon beim Umbauen ist, sollten dann auch die Rampen mit rein. Ich hab's mal auf meine ToDo-Liste gesetzt :wink:

MicroBahner:
Zuerst müsste ich dazu die Maximalzahl der Stepper erhöhen.

Du hast zwei HC4094 für vier Stepper an einem SS für Strobe. Meine Idee wäre nun, diese Gruppe mehrmals aufzubauen, wobei Strobe an verschiedene SS geht.

Stepper4 Step1(2048,FULLSTEP);  // Strobe an 10
Stepper4 Step2(2048,FULLSTEP);
Stepper4 Step3(2048,FULLSTEP);
Stepper4 Step4(2048,FULLSTEP);

Stepper4 Step5(2048,FULLSTEP);  // Strobe an 9
Stepper4 Step6(2048,FULLSTEP);
Stepper4 Step7(2048,FULLSTEP);
Stepper4 Step8(2048,FULLSTEP);

void setup() {
    Step1.attach( SPI_1 );
    Step2.attach( SPI_2 );
    Step3.attach( SPI_3 );
    Step4.attach( SPI_4 );
    Step5.attach( SPI_1 , 9 );  // der zweite Parameter für SS ist von mir erfunden!
    Step6.attach( SPI_2 , 9 );
    Step7.attach( SPI_3 , 9 );
    Step8.attach( SPI_4 , 9 );
...
}

Das hat den Vorteil, daß nur die Bits für vier Stepper zusammen rausgeschoben werden müssen.

Der Bibliothek fehlt jetzt nur die flexible Zuordnung von SS an Pin 10 oder 9. An drei Stellen finde ich sowas:

       digitalWrite( SS, LOW );

Gute oder schlechte Idee?

Das Rausschieben der Daten ist eigentlich das kleinere Problem. Da die Daten für die - in deinem Beispiel jetzt 8 - Schrittmotore ja unterschiedlich sind, kann man sie eh nur nacheinander rausschieben, da nur eine SPI-Schnittstelle vorhanden ist. Dann kann man sie aber auch gleich einfach über eine längere Schieberegsterkette rausschieben. Bei 2 parallelen Ketten müsste man nur die Kette bedienen, bei der sich was ändert - aber das muss auch entsprechend unterschieden werden. Da stellt sich die Frage, ob es nicht einfacher ist, immer alles rauszuschieben. Das ist auch rel. wenig Aufwand.
Der größere Aufwand liegt darin, dass man erstmal die Daten für die jetzt 8 Schrittmotore berechnen muss: Wer braucht wann einen Schritt. Da ich unabhängig vom loop() bleiben möchte, muss das ja alles im Interrupt passieren.

Aber ich glaube wir sind gerade dabei einen Thread zu kapern :wink:

MicroBahner:
Aber ich glaube wir sind gerade dabei einen Thread zu kapern :wink:

Die Fragestellung in diesem Thema lautet ja, ob 10 Schrittmotore mit einem Mega2560 angesteuert werden können, wenn nicht alle gleichzeitig drehen. Mit den MobaTools schien es mir mit ein paar Schieberegistern möglich zu sein. Hat sich jetzt aber dahingehend geklärt, daß es ohne Anpassung der Bibliothek nicht geht.

@MicroBahner Danke!

So gesehen hast Du natürlich recht. Also alles gut.