IN2-Anschluss des A4988

hallo, ich habe hier einen code für einen Schrittmotor und wollte fragen, wofür der IN2-Anschluss steht (also für welchen anschluss am A4988)

// Pin-Definitionen
const int IN1_PIN = D1;
const int IN2_PIN = D2;
const int IN3_PIN = D3;
const int IN4_PIN = D4;

Danke schonmal

1 Like

Hallo

Nimm eine Suchmaschine deiner Wahl und befrage das WWW mit 'A4988'.

ich fühle mich gerade etwas dumm, weil ich nicht drauf komme

Dann gibt es ja auch ein Datenblatt zu deinem Modul.
Da kannst du auch nachsehen.

sorry aber ich komm einfach nicht drauf

lesen - verstehen - machen

Ganz einfach: für keinen. Der Code, den Du hast ist offensichtlich nicht für den A4988 geschrieben. Es gibt schließlich auch noch andere Möglichkeiten einen Stepper anzusteuern ( abhängig vom verwendeten Stepper ).
Aber genaueres könnte man nur sagen, wenn Du nicht nur so einen winzigen Schnipsel zeigst.

#include <ESP8266WiFi.h>
#include <ESPAsyncTCP.h>
#include <ESPAsyncWebServer.h>

// WiFi Zugangsdaten
const char* ssid = "Ihr SSID";
const char* password = "Ihr Passwort";

// Pin-Definitionen
const int IN1_PIN = D1;
const int IN2_PIN = D2;
const int IN3_PIN = D3;
const int IN4_PIN = D4;

// Schrittmotor-Parameter
const int stepsPerRevolution = 2048;  // Schritte pro Umdrehung
const int stepsPerDegree = stepsPerRevolution / 360;  // Schritte pro Grad
int currentPosition = 0;  // aktuelle Position des Schrittmotors
int openPosition = 90;  // Position, bei der die Klappe geöffnet ist
int closePosition = 0;  // Position, bei der die Klappe geschlossen ist

// Erstelle den Webserver
AsyncWebServer server(80);

void setup() {
  // Serielle Ausgabe starten
  Serial.begin(9600);

  // WiFi-Verbindung herstellen
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(1000);
    Serial.println("Verbindung wird hergestellt...");
  }
  Serial.println("WiFi-Verbindung hergestellt.");

  // Schrittmotor-Pins als Ausgang definieren
  pinMode(IN1_PIN, OUTPUT);
  pinMode(IN2_PIN, OUTPUT);
  pinMode(IN3_PIN, OUTPUT);
  pinMode(IN4_PIN, OUTPUT);

  // Webseite definieren
  server.on("/", HTTP_GET, [](AsyncWebServerRequest *request){
    String html = "<html><head><title>Hühnerklappe</title></head><body>";
    html += "<h1>Hühnerklappe</h1>";
    html += "<p>Aktuelle Position: " + String(currentPosition) + " Grad</p>";
    html += "<form method='post' action='/setposition'>";
    html += "<input type='text' name='position' placeholder='Position in Grad'>";
    html += "<input type='submit' value='Position setzen'>";
    html += "</form>";
    html += "<form method='post' action='/open'>";
    html += "<input type='submit' value='Klappe öffnen'>";
    html += "</form>";
    html += "<form method='post' action='/close'>";
    html += "<input type='submit' value='Klappe schließen'>";
    html += "</form>";
    html += "</body></html>";
    request->send(200, "text/html", html);
  });

  // Aktionen definieren
  server.on("/setposition", HTTP_POST, [](AsyncWebServerRequest *request){
    String positionStr = request->getParam("position")->value();
    int position = positionStr.toInt();
    int stepsToMove = abs(position - currentPosition) * stepsPerDegree;
    if (position > currentPosition) {
      moveClockwise(stepsToMove);
    } else {
      moveCounterclockwise(stepsToMove);
    }
    currentPosition = position;
    request->redirect("/");
  });
  
  server.on("/open", HTTP_POST, [](AsyncWebServerRequest *request){
    int stepsToMove = abs(openPosition - currentPosition) * stepsPerDegree;
    moveClockwise(stepsToMove);
    currentPosition = openPosition;
    request->redirect("/");
  });
  
  server.on("/close", HTTP_POST, [](AsyncWebServerRequest *request){
    int stepsToMove = abs(closePosition - currentPosition) * stepsPerDegree;
    moveCounterclockwise(stepsToMove);
    currentPosition = closePosition;
    request->redirect("/");
  });

  // Webserver starten
  server.begin();
}

void loop() {
  // Nichts zu tun
}

void moveClockwise(int steps) {
  for (int i = 0; i < steps; i++) {
    digitalWrite(IN1_PIN, HIGH);
    digitalWrite(IN2_PIN, LOW);
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, LOW);
    delayMicroseconds(500);
    digitalWrite(IN1_PIN, LOW);
    digitalWrite(IN2_PIN, HIGH);
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, LOW);
    delayMicroseconds(500);
    digitalWrite(IN1_PIN, LOW);
    digitalWrite(IN2_PIN, LOW);
    digitalWrite(IN3_PIN, HIGH);
    digitalWrite(IN4_PIN, LOW);
    delayMicroseconds(500);
    digitalWrite(IN1_PIN, LOW);
    digitalWrite(IN2_PIN, LOW);
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, HIGH);
    delayMicroseconds(500);
  }
}

void moveCounterclockwise(int steps) {
  for (int i = 0; i < steps; i++) {
    digitalWrite(IN1_PIN, LOW);
    digitalWrite(IN2_PIN, LOW);
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, HIGH);
    delayMicroseconds(500);
    digitalWrite(IN1_PIN, LOW);
    digitalWrite(IN2_PIN, LOW);
    digitalWrite(IN3_PIN, HIGH);
    digitalWrite(IN4_PIN, LOW);
    delayMicroseconds(500);
    digitalWrite(IN1_PIN, LOW);
    digitalWrite(IN2_PIN, HIGH);
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, LOW);
    delayMicroseconds(500);
    digitalWrite(IN1_PIN, HIGH);
    digitalWrite(IN2_PIN, LOW);
    digitalWrite(IN3_PIN, LOW);
    digitalWrite(IN4_PIN, LOW);
    delayMicroseconds(500);
  }
}

hier nochmal der komplette code

Ok, das dürfte für den kleinen 28BYJ-48 Stepper mit dem meist mitgeliefert ULN als Treiber gedacht sein. Da kannst Du mit einem A4988 nichts anfangen.

ok danke

Das glaube ich nicht. Die Phasen für den 28BYJ-48 Stepper sind anders als im vorgestellten Code:

Ja, der Code ist nicht optimal. So hat er nicht das maximale Haltemoment, weil immer nur eine Spule aktiv ist. Aber drehen wird er auch so ( es ist jeder 2. Schritt vom Halbschritt-Betrieb - aber eben eher die ungünstige Hälfte ). Nicht alles was man im Internet findet ist optimal :wink: .

Naja... dann kann er ja jetzt geändert werden.. der Code :wink: . Die Tabelle hilft ja dabei.

Der A4988 wie andere Microstep - Treiber haben als Eingänge einen Drehrichtungseingang ( DIR) und einen der den Motor einen Schritt weiterdreht (STEP). Diese Schritt kann je nach einstellung des Treibers Vollschritte oder unterschiedliche Zwischenschritte (Microschritte) sein.

Andere Treiber haben 4 Eingänge die 4 Ausgänge direkt schalten. Um den Motor zu drehen müssen die Ausgänge bzw die angeschlossenen Wicklungen in einer gewissen Reihenfolge (mehrere Reihenfolgen sind möglich) geschaltet werden. Solche ICs sind zB Halbbrücken in L293, L293D, SN754410, L298 oder Transistorenarrays wie ULN2003/ ULN2803 für Unidirektionale Schrittmotore wie den genannten 28BYJ-48.

Grüße Uwe

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