Stepper Motor zwischen den Schritten stromlos schalten

Hallo,

ich spreche hier ein Thema an, welches schon mehrmals hier im Forum andiskutiert aber leider nie fertig diskutiert wurde.

Ich habe einen D1mini, eine ULN2003 Treiber Platine und einen 28BYJ-48 Stepper Motor.
Ich verwende aus Arduino das Beispiel stepper_oneStepAtATime.

Mein Motor soll aller 15sec einen Step machen. In der Zeit zwischen den steps sollen die Ausgänge des D1mini die Treiber-Platine nicht mehr ansteuern.
Haltemoment und Positionsverlust sind für mich uninteressant. Ich benötige irgendwann über ein Getriebe eine Umdrehung pro Tag am Objekt nicht am Motor.
Die Funktion habe ich getestet leider wird mir der Motor zu warm und verbraucht sinnfrei Strom.
Ich habe gelesen, das ich folgende Zeilen einfügen muss:

digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);

Aber wo, an welcher Stelle im Arduino Beispielcode?
Kann mir bitte jemand helfen?
Danke

Dort wo du abschalten willst!

Sehe ich nicht.

Wir sehen sehen vollständigen Code.
Setze Deinen Code bitte in Codetags. Wie das geht, steht hier.

Gruß Tommy

Hallo,
wow das ging ja schnell mit antworten.
Und ja der Code fehlt, sorry mein erster Beitrag, und ja ich habe so gut wie keine Ahnung von der Materie. Daher freue ich mich schon mal, dass das Ding sich dreht.

#include <Stepper.h>

const int stepsPerRevolution = 200;  // 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, 5, 0, 4, 2);

int stepCount = 0;         // number of steps the motor has taken

void setup() {
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  // step one step:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(10000);
}

Wie gesagt, irgendwo müssen zur Abschaltung der Ausgänge des D1mini zum ULN2003 nachfolgende zeilen eingefügt werden.

digitalWrite(8, LOW);
digitalWrite(9, LOW);
digitalWrite(10, LOW);
digitalWrite(11, LOW);

Wenn ich das mache kann ich entweder nicht kompilieren oder es zeigt keine Wirkung.
Auch die Ausgänge an den Stellen wo ich kompilieren konnte auf high zu setzten zeigte keine Wirkung. Nehmt Rücksicht, bin absoluter Laie.

Danke Euch

Wenn du einen Wemos D1 mini verwendest, wird das mit den von dir genannten Pins (8 -11) sicher nicht funktionieren.

Du hast den Stepper ( ULN2003) ja so angeschlossen , angeklemmt, oder?
Die Pins 8~11 sind ja aus dem Beispiel für Uno, wie wurdest du jetzt vorgehen?

Was würde funktionieren?
Ein ESP8266 oder ESP32?
Sollte halt sehr klein sein.
Danke

Wenn du die richtigen Pins nimmst, die du auch zuvor schon eingestellt hast.
Ob es mit einem ESP8266 überhaupt funktioniert, kann ich nicht sagen. Der hat ja 3,3Volt an den Pins. Reicht das für deinen Treiber ?
Sonst kannst du auch einen Arduino Pro mini nehmen. Der hat 5Volt und ist auch recht klein.

Ich würde es so integrieren.
Die Ausgänge solle immer "low" sein außer es gibt was zu tun.
Bin halt völliger Laie.

#include <Stepper.h>

const int stepsPerRevolution = 2048;  // 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, 5, 0, 4, 2);

int stepCount = 0;         // number of steps the motor has taken

void setup() {
  // initialize the serial port:
  Serial.begin(9600);
}

void loop() {
  digitalWrite(5, LOW);
  digitalWrite(0, LOW);
  digitalWrite(4, LOW);
  digitalWrite(2, LOW);
  // step one step:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(100);
}

Das ist gut nur schiebe das vor den delay()

Wie gesagt Funktion hab ich.
Ich möchte halt nur zwischen den steps massiv strom sparen.
Es ist keine Strom-Netzverbindung vorhanden.

Ich lese mich mal zu dem Arduino Pro mini schlau. Noch nie gehöhrt.

Dir ist aber klar, dass der Stepper ohne Strom nicht hält, also gedreht werden kann.

An dieser Stelle kann der Code aufgeteilt werden. Zuerst etwas Zeit bis der Schritt ausgeführt ist, dann die Abschaltung und zuletzt das restliche Warten.

@fony: hat funktioniert,die LEDs sind jetzt mehr aus als an, leider reicht die Zeit nicht den Motor zu drehen, eigentlich auch logisch aber Danke

@HotSystems: ja ist mir klar, muss er nicht, der mech. Aufbau funktioniert, mir geht es nur um Stromsparen

@ DrDietrich: das mit dem etwas Zeit bis zur Abschaltung könnte ein Lösungsansatz werden.
Wie könnte ich da vorgehen? Man müsste den Zeitpunkt des Signalwechsels erfassen und nach zb 1 sec abschalten...

Du willst ja doch anderen Stepper nutzen, dann vergiss den ULN.

Mit dem 28BYJ-48 wird der ULN2003 mitgeliefert.

Dir ist klar daß der 28BYJ-48 nicht 200 Schritte pro Umdrehung hat, sonder je nach Info und Model bzw Quellen 2048, 2037.88642 oder 516.096 auch 513 Schritte pro Umdrehung bei Vollschritten; Doppelt so viele bei Halbschritten. ( Getriebe 64:1; 63.68395:1 bzw 16.032:1; 16,128:1. Motor ist immer 32 Schritte Pro Umdrehung in Vollschritt)

Man findet das genaue Übersetzungsverhältnis durch abzählen der Zahnräder (was aber das Öffnen des Motors notwendig macht und nicht sicher zerstörungsfrei möglich ist)
oder durch wiederholtes Drehen in eine Richtung um ein Vielfaches der angenommenen Schritte pro Umdrehung. Ein Anbringen eines Zeigers aus Karton / Klebesteifens und eines Referenzstrichs am Motor erleichtert die Kontrolle. Auch 10 bis 20 oder 100 Umdrehungen verbessern die Ablesegenauigkeit.
Grüße Uwe

Quellen:

Vielen Dank für Eure Antworten. Ich habe viel Input erhalten und mich damit auseinander gesetzt. Ich bleibe bei meiner Hardware. Sie funktioniert.

Leider bin ein noch schlechtere Laie in diesem Thema, wie ich dachte.
Daher meine konkrete Frage @ DrDiettrich oder gern an jeden der mir helfen möchte.
Wie genau könnte ich die das Umsetzen? Es klingt für mich genau nach dem, was ich suche.

Was ich hier im Forum so gelesen habe könnte ich es wohl mit einem Interrupt umsetzten. Bin aber völlig planlos.

Danke für etwaige Hilfe

delay(StepZeit);
Stepper abschalten
delay(RestZeit);
Stepper einschalten

Ich habe als Ausgangssketch mal einen ohne Library von Roboter-Bausatz genommen, weil ich ihn für recht einfach verständlich halte.

Habe ihn so erweitert, daß er (1) nach dem Step 2ms wartet, bevor er (2) den Motor abschaltet und dann (3) den nächsten Schritt nach 10 Sekunden seit dem letzten Schritt ausführt (ohne Delay, damit man unabhängig noch an der Wartezeit rumschrauben kann)
Pins noch auf die von Dir verwendeten abändern.. :innocent:

#define STEPPER_PIN_1 8
#define STEPPER_PIN_2 9
#define STEPPER_PIN_3 10
#define STEPPER_PIN_4 11

int step_number = 0;
unsigned long delay_timer;


void setup() {
  pinMode(STEPPER_PIN_1, OUTPUT);
  pinMode(STEPPER_PIN_2, OUTPUT);
  pinMode(STEPPER_PIN_3, OUTPUT);
  pinMode(STEPPER_PIN_4, OUTPUT);
}


void loop() {
  if ((millis() - delay_timer) >= 10000) {    // 10 Sekunden vergangen?
    delay_timer = millis();
    OneStep(false);         // Drehrichtung vorwärts/rückwärts durch true/false
  }
  // hier kann noch mehr passieren
}


void OneStep(bool dir){
  if(dir){
    switch(step_number){
      case 0:
      digitalWrite(STEPPER_PIN_1, HIGH);
      digitalWrite(STEPPER_PIN_2, LOW);
      digitalWrite(STEPPER_PIN_3, LOW);
      digitalWrite(STEPPER_PIN_4, LOW);
      break;
      case 1:
      digitalWrite(STEPPER_PIN_1, LOW);
      digitalWrite(STEPPER_PIN_2, HIGH);
      digitalWrite(STEPPER_PIN_3, LOW);
      digitalWrite(STEPPER_PIN_4, LOW);
      break;
      case 2:
      digitalWrite(STEPPER_PIN_1, LOW);
      digitalWrite(STEPPER_PIN_2, LOW);
      digitalWrite(STEPPER_PIN_3, HIGH);
      digitalWrite(STEPPER_PIN_4, LOW);
      break;
      case 3:
      digitalWrite(STEPPER_PIN_1, LOW);
      digitalWrite(STEPPER_PIN_2, LOW);
      digitalWrite(STEPPER_PIN_3, LOW);
      digitalWrite(STEPPER_PIN_4, HIGH);
      break;
    } 
  } else {
    switch(step_number){
      case 0:
      digitalWrite(STEPPER_PIN_1, LOW);
      digitalWrite(STEPPER_PIN_2, LOW);
      digitalWrite(STEPPER_PIN_3, LOW);
      digitalWrite(STEPPER_PIN_4, HIGH);
      break;
      case 1:
      digitalWrite(STEPPER_PIN_1, LOW);
      digitalWrite(STEPPER_PIN_2, LOW);
      digitalWrite(STEPPER_PIN_3, HIGH);
      digitalWrite(STEPPER_PIN_4, LOW);
      break;
      case 2:
      digitalWrite(STEPPER_PIN_1, LOW);
      digitalWrite(STEPPER_PIN_2, HIGH);
      digitalWrite(STEPPER_PIN_3, LOW);
      digitalWrite(STEPPER_PIN_4, LOW);
      break;
      case 3:
      digitalWrite(STEPPER_PIN_1, HIGH);
      digitalWrite(STEPPER_PIN_2, LOW);
      digitalWrite(STEPPER_PIN_3, LOW);
      digitalWrite(STEPPER_PIN_4, LOW);
    } 
  }
  delay(2);   // Zeit warten bis Einzelschritt ausgeführt ist

  // Motor abschalten
  digitalWrite(STEPPER_PIN_1, LOW);
  digitalWrite(STEPPER_PIN_2, LOW);
  digitalWrite(STEPPER_PIN_3, LOW);
  digitalWrite(STEPPER_PIN_4, LOW);
  
  step_number++;  
  if (step_number > 3) { step_number = 0; }
}

Vielen Dank an alle Kommentatoren,
@ DrDietrich
hatte mir schon lange die Lösung genannt, ich hatte sie nicht erkannt
@ der Geppi
der Code hat nicht funktiert, da immer nur ein Ausgang geschaltet wurde und somit der Motor nicht bestromt werden konnte aber er hat mir die Augen weit geöffnet...

die Lösung war dann ganz schnell und einfach in meinemCode umgestzt

void loop() {

  // step one step:
  myStepper.step(1);
  Serial.print("steps:");
  Serial.println(stepCount);
  stepCount++;
  delay(250);
  digitalWrite(5, LOW);
  digitalWrite(0, LOW);
  digitalWrite(4, LOW);
  digitalWrite(2, LOW);
  delay(1000);
}

Vielen Dank Euch Allen