Wemos d1 mini - Schrittmotoren

Hallo zusammen,

ich möchte zwei Schrittmotoren (Nema 17) mit dem Wemos d1 mini betreiben.

Ich habe es schon mit Tasmota (Blind-Control) versucht. Die Motoren usw. laufen ohne Probleme, leider kann die Blind-Control Einstellung nicht ganz das was ich benötige.

Zum besseren Verständnis habe ich mal eine kleine Grafik eingefügt.

Wenn der Sketch fertig ist, sollte er eigentlich durch ioBroker gestartet werden.

Die Dauer der Drehbewegungen sind erst mal nicht so wichtig.

Ein Beispiel-Sketch würde mir auch schon helfen. Also der Start eines Motor von IoBroker aus.

Hat jemand eine Idee? Leider bin ich Anfänger und noch nicht so weit es alles alleine zu programmieren.

Grüße
Manfred

Hallo Manfred,

Was genau ist denn IoBroker?
Muss ich das jetzt googeln oder stellst du einen Link oder eine Kurzbeschreibung zur Verfügung?

Das gleiche mit "Tasmota (Blind-Control)" Blind Kontrolle was soll das sein?

Du scheinst davon auszugehen, dass hier Leute allwissende Experten mal eben nen Sketch zu allem und jedem au dem Ärmel posten können.

Tja was fehlt denn noch zum glücklich sein?
Ein bißchen mehr verbale Beschreibung was die verschieden dicken und verschieden langen Balken bedeuten wäre auch nicht schlecht.

Also poste mal eine detaillierte Beschreibung. Dann kann man auch konkrete Vorschläge machen.
vgs

Hallo Stefan,
natürlich erwarte ich nicht das mal eben jemand einen passenden Sketch postet.

IoBroker ist das hier:

Das ist eine "Oberfläche" um viele verschiedene System unter einem Hut zu bekommen.

Tasmota. Das dachte ich, das das wohl bekannt ist.

Ist das hier:

Eine "Firmware" für Geräte mit ESP8266 Chip.

Blindcontrol ist eine Funktion von Tasmota:

Mir würde aber auch schon eine Idee helfen, um per z.B. http ein Sketch auf einem Wemos zu starten.

Zu der Grafik. Der Ablauf sollte so sein. Die Balken sollten die Laufzeiten darstellen.

Motor 2 startet (Drehrichtung links), kurz danach startet Motor 1 (Drehrichtung rechts), dann Motor 1 aus, kurz danach Motor 2 aus.

Kurze Pause.

Motor 2 startet (Drehrichtung rechts), kurz danach startet Motor 1 (Drehrichtung rechts), dann Motor 1 aus, kurz danach Motor 2 aus.

Ende

Grüße
Manfred

Wenn die Motoren mit Tasmota laufen, kann man sie in IObroker über NodeRed sicher steuern wie mans braucht.

Hmm - mit NodeRed habe ich noch nichts gemacht. Bis jetzt nur Blockly.

Hier liegt vielleicht ein Verständnis-Problem. Der Sketch, also der Code, läuft immer, wird Schritt für Schritt abgearbeitet. Über Bedingungen kannst du aber die Reihenfolge steuern und somit bestimmte Dinge überspringen/nicht ausführen.

Ok, ein Skript läuft immer. Aber ich kann eine Aktion per http oder starten, richtig?

Als ob ich einem angeschlossenen Relais mitteile ob es schaltet oder nicht.

Grüße

"Aktion starten" trifft es noch nicht so richtig.

In einem Arduino-Sketch gibt es die function loop().

Die function loop() läuft absolut immer. Bis du dem ESP den Strom abschaltest.

Das Grundprinzip könnte man als pseudo-code so darstellen:

void loop() {
  empfangeDaten();

  if (Daten == "mach A" {
     myFunction1();
  }

  if (Daten == 17 {
     myFunction2();
  }


  if (Daten == Code28 {
     blaBlaQuatschi();
  }
}

die dritte function heißt "blaBlaQuatschi" um damit zu verdeutlichen, dass das ein Name ist den du als Programmierer in sehr weiten Grenzen selbst festlegen kannst.

Du scheinst bisher ziemlich wenig über programmieren zu wissen und an manchen Stellen falsche Vorstellungen darüber zu haben wie programme funktionieren.
Da solltest du dir gaaanz dringend Grundlagen erarbeiten. Sonst wird das ein wochenlanges herum-probieren ohne so richtig vorwärts zu kommen.

vgs

du kannst das alles auch selbst programmieren - brauchst aber im iobroker trotzdem noch etwas
was die Befehle sendet.
Tasmota arbeitet normalerweise mit mqtt, aber http versteht es eigentlich auch.

da gibts bestimmt auch blockly befehle für.

Ich verstehe was Du meinst, dazu fehlt mir aber die Zeit. Ich lerne auch nicht den kompletten inneren Aufbau einer Waschmaschine um sie eventuell auch reparieren zu können, nur weil ich einmal meine Wäsche waschen möchte.
Wenn ich erst programmieren lernen muß, macht das dann das Forum nicht überflüssig?

Nein. Ganz im Gegenteil. Das Forum ist hauptsächlich dazu da beim Programmieren lernen zu unterstützen. Es ist aber nicht dazu da fertigen Code anzuliefern. Es sei denn du vergibst einen richtigen Programmierauftrag gegen Bezahlung. Dazu gibt es auch ein Unterforum

Es geht schließlich nicht um "kann mal jemand den 40-stelligen Cheatcode für den Eintritt in den "Platinum-Level" posten sondern um 4000 bis 40000 Zeichen langen Code dessen Funktionalität sehr sehr viel vielfältiger ist als ein "CheatCode".

Du möchtest zwei Schrittmotoren auf eine bestimmte Art und Weise koordiniert laufen lassen. Aha. Aber das ist ja kein Selbstzweck. Bewegen die beiden Schrittmotoren eine Jalousie? - Wahrscheinlich nicht. Also was ist das Gesamtprojekt? Möglicherweise gibt es ganz andere Lösungsmöglichkeiten als zwei Schrittmotoren. Ob es die gibt kann man aber nur dann sagen wenn du einen Überblick über das Gesamtprojekt gegeben hast.
vgs

Ich bitte um Entschuldigung - hatte eine stressigen Tag.

War nicht der beste Post.

codeschnipsel
https://www.google.de/search?as_q=arduino+schrittmotor+democode

nicht blockierendes Timing

Ich habe jetzt mal ein wenig probiert.

Dieses läuft soweit.


/*****************************************************
 * Date: 9 july 2018
 * Written by: Usman Ali Butt
 * Property off: microcontroller-project.com
 * ***************************************************/
#include <ESP8266WiFi.h>
 
const char* ssid = "..";
const char* password = "1...7";

//Motor1
int Step1 = D3; //GPIO0---D3 of Nodemcu--Step of stepper motor driver
int Dir1  = D4; //GPIO2---D4 of Nodemcu--Direction of stepper motor driver
int En1   = D2; //GPIO2---D2 of Nodemcu--Enable of stepper motor driver

//Motor2
int Step2 = D6; //GPIO0---D6 of Nodemcu--Step of stepper motor driver
int Dir2  = D7; //GPIO2---D7 of Nodemcu--Direction of stepper motor driver
int En2   = D5; //GPIO2---D5 of Nodemcu--Enable of stepper motor driver


WiFiServer server(80);
 
void setup() {
  
  Serial.begin(115200);
  delay(10);

 //Motor 1
 pinMode(D3, OUTPUT); //Step pin as output
 pinMode(D4,  OUTPUT); //Direcction pin as output
 pinMode(D2, OUTPUT); // Enable
 digitalWrite(D4, LOW); // Currently no stepper motor movement
 digitalWrite(D3, LOW);
 digitalWrite(D2, LOW);


 //Motor 2
 pinMode(D6, OUTPUT); //Step pin as output
 pinMode(D7,  OUTPUT); //Direcction pin as output
 pinMode(D5, OUTPUT); // Enable
 digitalWrite(D7, LOW); // Currently no stepper motor movement
 digitalWrite(D6, LOW);
 digitalWrite(D5, LOW);

 
 
  // Connect to WiFi network
  Serial.println();
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);
 
  WiFi.begin(ssid, password);
 
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }
  Serial.println("");
  Serial.println("WiFi connected");
 
  // Start the server
  server.begin();
  Serial.println("Server started");
 
  // Print the IP address on serial monitor
  Serial.print("Use this URL to connect: ");
  Serial.print("http://");    //URL IP to be typed in mobile/desktop browser
  Serial.print(WiFi.localIP());
  Serial.println("/");
 
}
 
void loop() {
  // Check if a client has connected
  WiFiClient client = server.available();
  if (!client) {
    return;
  }
 
  // Wait until the client sends some data
  Serial.println("new client");
  while(!client.available()){
    delay(1);
  }
 
  // Read the first line of the request
  String request = client.readStringUntil('\r');
  Serial.println(request);
  client.flush();
 
  // Match the request
  int i=0;
  int value = LOW;
  
  if (request.indexOf("/Command=forward") != -1)  { //Move 50 steps forward
    digitalWrite(Dir1, HIGH); //Rotate stepper motor in clock wise direction
          for( i=1;i<=500;i++){
          digitalWrite(Step1, HIGH);
          delay(2);
          digitalWrite(Step1, LOW);
          delay(2);}
    value = HIGH;
  }
  
  if (request.indexOf("/Command=backward") != -1)  { //Move 50 steps backwards
    digitalWrite(Dir2, LOW); //Rotate stepper motor in anti clock wise direction
          for( i=1;i<=500;i++){
          digitalWrite(Step2, HIGH);
          delay(2);
          digitalWrite(Step2, LOW);
          delay(2);}
    value = LOW;
  }

  // Return the response
  client.println("HTTP/1.1 200 OK");
  client.println("Content-Type: text/html");
  client.println(""); //  do not forget this one
  client.println("<!DOCTYPE HTML>");
  client.println("<html>");
  client.println("<h1 align=center>Stepper motor controlled over WiFi</h1><br><br>");
  client.print("Stepper motor moving= ");
 
  if(value == HIGH) {
    client.print("Forward");
  } else {
    client.print("Backward");
  }
  client.println("<br><br>");
  client.println("<a href=\"/Command=forward\"\"><button>Forward </button></a>");
  client.println("<a href=\"/Command=backward\"\"><button>Backward </button></a><br />");  
  client.println("</html>");
  delay(1);
  Serial.println("Client disonnected");
  Serial.println("");
 
}

Die Motoren drehen sich entsprechend.

ABER

Wie bekomme ich es hin, das sich zwei Motoren gleichzeitig drehen?

Ich habe schon die AccelStepper library veruscht. Damit bekomme ich die Motoren aber nicht zum laufen. AlsTreiberbausteine kommen a4988 zum Einsatz.

Du könntest meine MobaTools probieren. Da brauchst Du dich gar nicht um die Steperzeugung kümmern, das macht die Lib im HIntergrund - auch für mehrere Motore gleichzeitig. Du musst nur angeben, was sie machen sollen. Dein Sketch läuft weiter, und die Motore drehen sich entsprechend. Du kannst also den 2. starten, während sich der erste dreht - sogar abhängig davon, wo der erste gerade ist.

1 Like

Ich habe es jetzt mit accelstepper versucht.

Dieses hier funktioniert so wie ich es benötige.

// MultiStepper.pde
// -*- mode: C++ -*-
//
// Shows how to multiple simultaneous steppers
// Runs one stepper forwards and backwards, accelerating and decelerating
// at the limits. Runs other steppers at the same time
//
// Copyright (C) 2009 Mike McCauley
// $Id: MultiStepper.pde,v 1.1 2011/01/05 01:51:01 mikem Exp mikem $

#include <AccelStepper.h>

// Define some steppers and the pins the will use
AccelStepper stepper1(1, D3, D4);
AccelStepper stepper2(1, D6, D7);

void setup()
{  

pinMode(D2, OUTPUT); // Enable Motor 1
digitalWrite(D2, LOW);

pinMode(D5, OUTPUT); // Enable Motor 2
digitalWrite(D5, LOW);

    stepper1.setMaxSpeed(2000.0);
    stepper1.setAcceleration(2500.0);
    stepper1.moveTo(2400);
    
    stepper2.setMaxSpeed(100.0);
    stepper2.setAcceleration(1000.0);
    stepper2.moveTo(1500);
}

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

    if (stepper2.distanceToGo() == 0)
  stepper2.moveTo(stepper2.currentPosition());
    stepper2.run();

    if (stepper2.currentPosition() == 1100)
  digitalWrite(D5, HIGH);

    if (stepper2.currentPosition() == 1500)
  digitalWrite(D2, HIGH);

}

Was mir jetzt noch fehlt ist, das ich die Sache per http starten kann.

So, neue Version.

Ich kann es jetzt per http "resetten"

#include <AccelStepper.h>

#include <ESP8266WiFi.h>
#include <ESP8266WebServer.h>
ESP8266WebServer server(80);
const char* ssid = "...";
const char* password = "1.....97";


// Define some steppers and the pins the will use
AccelStepper stepper1(1, D3, D4);
AccelStepper stepper2(1, D6, D7);


void setup()
{  
  Serial.begin(115200);
  Serial.println("ESP Gestartet");
  WiFi.begin(ssid, password);
  Serial.print("Verbindung wird hergestellt ...");
  while (WiFi.status() != WL_CONNECTED)
  {
    delay(500);
    Serial.print(".");
  }
  Serial.println();
  Serial.print("Verbunden! IP-Adresse: ");
  Serial.println(WiFi.localIP());
  server.onNotFound([](){
    server.send(404, "text/plain", "Link wurde nicht gefunden!");  
  });
  server.on("/startfutter1", []() {
    startfutter1();
  });
  server.begin();
  Serial.println("Webserver gestartet.");


  
pinMode(D2, OUTPUT); // Enable Motor 1
digitalWrite(D2, LOW);

pinMode(D5, OUTPUT); // Enable Motor 2
digitalWrite(D5, LOW);


    stepper1.setMaxSpeed(2000.0);
    stepper1.setAcceleration(2500.0);
    stepper1.moveTo(2400);
    
    stepper2.setMaxSpeed(100.0);
    stepper2.setAcceleration(1000.0);
    stepper2.moveTo(1500);




}

void loop(){
  server.handleClient();  

    // Change direction at the limits
    if (stepper1.distanceToGo() == 0)
  stepper1.moveTo(-stepper1.currentPosition());
    stepper1.run();

    if (stepper2.distanceToGo() == 0)
  stepper2.moveTo(stepper2.currentPosition());
    stepper2.run();

    if (stepper2.currentPosition() >= 1100)
  digitalWrite(D5, HIGH);

    if (stepper2.currentPosition() >= 1500)
  digitalWrite(D2, HIGH);

  
}


 void startfutter1(){ 
  ESP.restart();
}

Das ist eine Holzhammermethode. Anders bekomme ich es aber nicht hin. :neutral_face:

Hallo, zusammen.

Git es jemanden der das hier gegen Bezahlung programmiert?

Grüße
Manfred

Auftragsarbeiten sind in der Rubrik Jobs and Paid Consultancy (engl.) angesiedelt.

Gruß Tommy

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.