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.
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
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.
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.
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.
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
/*****************************************************
* 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.
// 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.