Ich habe mir folgendes Sketch zusammengebastelt. Nun wir es so sein, dass in der Finalversion der Schrittmotor nur alle 5 Minuten diese 170 Steps (also 30 Grad) ausführen wird - es soll eine Uhr werden welche sich im 5 Minuten takt bewegt.
Nun würde ich gerne alle 4 Ausgänge vom Arduino (Pin 8-11) jeweils nach dem 5-Minuten Impuls auf 0 setzen auch um Strom zu sparen, da der Schrittmotor, um die Stellung zu halten immer recht warm ist.
Wie könnte ich das anstellen, hat jemand eine Idee?
#include <Stepper.h>
int button1 = 4; //button pin, connect to ground to move servo
bool press1 ;
bool oldpress1 = false;
bool sweep1state = false;
int switchPin = 4; // switch is connected to pin 4
int val; // variable for reading the pin status
int buttonState; // variable to hold the button state
int buttonPresses = 0;
int stepCount = 0;
const int stepsPerRevolution = 4; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() {
pinMode(button1, INPUT_PULLUP);
// set the speed at 1500 rpm:
myStepper.setSpeed(1500);
// initialize the serial port:
Serial.begin(9600);
#define STEPS 48
}
void loop() {
press1 = digitalRead(button1); // check button1
if (press1 == LOW && oldpress1 == HIGH) // test if button has been pressed
{
sweep1state = HIGH; // if yes
}
if (sweep1state == HIGH)
{
myStepper.step(170);
Serial.print("steps:");
Serial.println(stepCount);
stepCount++;
sweep1state = LOW;
}
}
Nur so als kleine Weiterbildung zwischendurch:
Die meisten Schrittmotortreiber mögen es überhaupt nicht wenn man die Spulenanschlüsse während Strom fließt abklemmt oder anklemmt oder gar wiederholt Verbindung "antippen" wegnehmen. Die Spulen haben eine Induktivität und wenn man den Stromfluss unterbricht entsteht eine Spannungsspitze die sehr viel höher als die Versorgungsspannung sein kann. Ich habe das auch erst durch Zerstören von drei Schrittmotortreibern lernen müssen.
Also der Schrittmotortreiber zu liebe immer erst Versorgungsspannung abschalten und dann anschließen/abklemmen.
Wenn man die Versorgungsspannung abklemmt, dann funktionieren die Freilaufdioden der Treiber nicht mehr, dann brennen die Endtransistoren durch. Man müßte die Spannungsanschlüsse kurzschließen, aber das geht nicht so schnell. Vielleicht hilft ein ausreichend großer Elko am Treiber, in den sich die Spulen nach dem Abschalten noch entladen können?
Wenn der Zeiger ein Leichtgewicht ist bzw. an beiden Enden Gewicht hat also so halbwegs ausbalanciert ist
kann man den Strom auch ein Stück herunterdrehen. Manche Schrittmotortreiber haben auch die Möglichkeit den Strom durch einen Steuereingang zu reduzieren. Ganz abschalten bedeutet das das Haltemoment des Schrittmotors nahezu null ist. Dann müsste der Zeiger schon sehr gut ausbalanciert sein damit er durch sein Eigengewicht sich nicht weiterdreht.
Eine Lösungsmöglichkeit dafür wäre ein selbsthemmendes Schneckenradgetriebe oder eine Art Bremse bei der man den Widerstand feinfühlig einstellen kann. Die Bremse hält den Zeiger auf Position aber wenn der Schrittmotor drehen will kriegt er das hin.
Wenn die Uhr nur alle 5 Minuten 5 Teilstriche weiterwandern soll weil du es so haben willst kann man das machen.
Es wäre aber auch möglich den Zeiger fast kontinuierlich oder einmal pro Minute vorrücken zu lassen.
Magst du mal beschreiben wie groß die Uhr / die Zeiger sind und was für technische Daten der Schrittmotor hat?
Und was für ein Treiber die Spulen schaltet?
Ich würde gerne abschätzen ob man den Strom runterdrehen kann.
viele Grüße Stefan
Das sagt daß der Motortreiber 4 Ansteuerungspin hat. Da fallen die meisten Strom Treiber aus der Betrachtung.
Es bleiben eigentlich nur der ULN2003 mit einem 28BYJ-48 übrig. Der wäre auch eine der ersten Wahl für das antreiben eines Zeigers.
@ Draht, Bitte erleuchte uns bezüglich der verwendeten Hardware (Motor und Motortreiber)
Und zusätzlich zu deiner Zeitrechnung.
Nun wir es so sein, dass in der Finalversion der Schrittmotor nur alle 5 Minuten diese 170 Steps (also 30 Grad) ausführen wird - es soll eine Uhr werden welche sich im 5 Minuten takt bewegt.
Wenn 170 schritte 30° entspricht dann sind das 1020Schritte pro Umdrehung.
Wenn aber 170 Schritte alle 5 Minuten gemacht werden sollen dann sind das 2040 Schritte pro Stunde.
Macht jetzt der Minutenzeiger 1 oder 2 Umdrehungen pro Stunde?
Andererseits hat der 28BYJ-48 nicht genau 2048 Schritte in Vollschrittmodus sondern laut Stepper Motors — Precise Position Control | by J3 | Jungletronics | Medium ein Getriebe mit der Übersetzung von nur 8910: 567.424 oder 405:25.792 oder 1: 63,683951 oder mit Vollschritte sind das 2.037,886 Schritte pro Umdrehung. Da sind 170 nur ein Näherungswert. Da Du sowieso einen Home Sensor brauchst, würde ich diese kleine Ungenauigkeit durch Anfahren des Homsensors zB bei 12h das Ausgleichen.
Das sind nur die Daten, nicht das Modell. Also bitte das Modell oder die Seite wo Du ihn gekauft hast.
Getriebeübersetzung: 1/85 als Zahnräder werden meist ungerade Übersetzungen mit Primzahlen verwendet damit nicht glaiche Zähne von 2 Zahnräder immer wieder zusammenkommen sondern alle Zähne des einen alle Zähne des anderen in Eingriff kommen.
Bei 1/85 und 48 Schritte pro Umdrehung sind das 4080 Schritte pro Umdrehung.
Aber wie gesagt ist 1/85 nur eine gerundetes Übersetzungsverhältnis.
Es könnte der 35byj46 Motor sein.
Aha. Also der Schrittmotor hat ein Drehmoment von 500 bis 650 gf.cm.
Das sind umgerechnet 0.064 Nm.
Aus der Skizze werde ich noch nicht recht schlau. Sieht aus wie das Ziffernblatt.
Aber wie sehen denn die Zeiger aus und wie sind die an der Achse befestigt? Einseitig oder mittig?
Den Schrittmotor habe ich bei https://de.elv.com/schrittmotor-12-v-dc-60-ma-winkel-75-48-schritte-109086
und bei Vellemann gefunden. Da steht was von "Verkleinerungsfaktor" hat der noch ein Untersetzungsgetriebe dran?
Das ergäbe dann ein Drehmoment von 0.064 Nm * 85 = 5,4 Nm. Das wäre in der Tat sehr kräftig.
Ohne Untersetzungsgetriebe reicht der gerade mal dazu einen Zeigerfinger aus Pappe "nenene-Das-Drehmoment-ist-zu-klein" Winken zu lassen.
Einen Halbleiter "TIP21" habe ich mit googeln nicht gefunden. Ist der aus DDR-Beständen? ;-))
Oder haste dich verschrieben?
Um den Drehmomentbedarf zu ermitteln könntest du folgendes machen:
Sofern die "Kelle" (Suppenkelle? Maurerkelle?) noch einen dünnen Holzstab befestigen und auf dem Drehpunkt lagern
Dann am Holzstab ein kleines Gegengewicht so anhängen das das Ding im Gleichgewicht ist.
Abstand Drehpunkt (in Meter) * Gramm Gewicht / 100 = Nm
Das ganze Rad dreht sich im Uhrzeigersinn. Die äusseren "Kellen" sind wie 12 Zeiger, diese drehen sich an der 15 Uhr Stelle und zeigen die Zeitt an. Man kann sich das so vorstellen, wie die Strassenarbeiter, welche mit den grünen und roten kellen am Anfang und Schluss der Baustelle den Verkehr regeln. Ist das verständlich?
Ja verstehe ich. Also weitgehend ausbalanciert weil symmetrisch aufgebaut.
Hat der Motor nun ein Getriebe oder nicht? Wenn du den Motor mit 400 Schritten pro Sekunde ansteuerst
saust der dann im Kreis oder ist das eine gemächliche Drehung?
also bei diesem Sketch braucht er etwa 20 Sekunden für eine 360 Gradumdrehung.
#include <Stepper.h>
int button1 = 4; //button pin, connect to ground to move servo
bool press1 ;
bool oldpress1 = false;
bool sweep1state = false;
int switchPin = 4; // switch is connected to pin 4
int val; // variable for reading the pin status
int buttonState; // variable to hold the button state
int buttonPresses = 0;
int stepCount = 0;
const int stepsPerRevolution = 4; // change this to fit the number of steps per revolution
// for your motor
// initialize the stepper library on pins 8 through 11:
Stepper myStepper(stepsPerRevolution, 8, 9, 10, 11);
void setup() {
pinMode(button1, INPUT_PULLUP);
// set the speed at 1500 rpm:
myStepper.setSpeed(1500);
// initialize the serial port:
Serial.begin(9600);
#define STEPS 48
}
void loop() {
press1 = digitalRead(button1); // check button1
if (press1 == LOW && oldpress1 == HIGH) // test if button has been pressed
{
sweep1state = HIGH; // if yes
}
if (sweep1state == HIGH)
{
myStepper.step(-2040);
Serial.print("steps:");
Serial.println(stepCount);
stepCount++;
sweep1state = LOW;
digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);
}
oldpress1 = press1;
}
StefanL38:
Ja verstehe ich. Also weitgehend ausbalanciert weil symmetrisch aufgebaut.
Hat der Motor nun ein Getriebe oder nicht? Wenn du den Motor mit 400 Schritten pro Sekunde ansteuerst
saust der dann im Kreis oder ist das eine gemächliche Drehung?
Ja, ist ausbalanciert, braucht jedoch trotzdem noch "etwas" Kraft, da er an der 15 Uhr-Position die Kelle jeweils über eine Mechanik drehen muss.
Bis auf die Angabe, daß der Stepper 4 Steps pro Umdrehung braucht (Das empfinde ich als seeehr sportlich).
4 (Steps pro Umdrehung) x 1500 (Umdrehungen pro Minute) -> 6000 Steps pro Minute.
Nach ca. 20 Sekunden ist die Umdrehung vollbracht -> 6000:3 -> ~2000 Steps/Umdrehung.
3 Umdrehungen die Minute.
Diese 2000 decken sich halbwegs mit den 2048, Die ebenfalls in Deinem Sketch genannt werden.
Die Frage ist, ob Dein Getriebe genau 2048 Steps/Umdrehung braucht, oder was Krummes.
myStepper.step(-2040);
Dürfte die Ziel-Position angeben (und für die 20 Sekunden Laufzeit sorgen - ggf. blockierend?),
Mache Dir eine Markierung auf den Motor und lasse Ihn 10x2040 Steps laufen - wenn Er nach 10 Umdrehungen wieder genau die Markierung trifft, hast Du ein 'gerades Getriebe'.
Meine 28BYJ-48 sind alle 'gerade' - allerdings gibt's Da auch Andere und Du hast ja eh einen ganz anderen Motor.
Wenn's schief ist - eine Referenzierung (irgendwo) auf dem Ziffernblatt, so kannst Du nach spätestens einer Umdrehung die Step's angleichen.