Arduino Schrittmotorsteuerung mit LCD Keypad Shield

Hallo Community,

ich stehe vor einem Problem und hoffe, dass jemand hier mir helfen kann. Mein Projekt beinhaltet die Steuerung eines Schrittmotors, um eine bestimmte Menge Flüssigkeit zu dosieren. Dies hat ohne Probleme funktioniert, als ich den Schrittmotor direkt mit dem Arduino angesteuert habe. Der Motor bewegte sich einwandfrei.

Nun habe ich ein LCD Keypad Shield (standardmäßige Pins für RS, E, D4, D5, D6, D7) hinzugefügt, um das Volumen auf dem Display anzuzeigen. Nachdem ich den Code angepasst habe, bewegt sich der Motor jedoch nicht mehr, obwohl der Bildschirm korrekt funktioniert.

Hier sind einige Details zu meinem Projekt:

  • Ich verwende einen Schrittmotor mit Mikroschritten (16 Mikroschritte pro Schritt).
  • Die Gesamtanzahl der Schritte pro Umdrehung beträgt 3.200 (3200 Schritte entsprechen 1 ml).
  • Die Schrittmotorkonfiguration wurde mit AccelStepper (Bibliothek) vorgenommen, und der Motor wird auf Pins 6 (DIR) und 5 (PUL) angeschlossen.
  • Der Treiber ist ein tb6600 mit 9-42V
  • Der Steppermotor ein 42BYG mit 1.7 A Phase Current

Hier ist der ursprüngliche Code:

tippeconst int microsteps = 16;  // Anzahl der Mikroschritte pro Schritt
const int fullStepsPerRevolution = 200;  // Anzahl der vollen Schritte pro Umdrehung des Schrittmotors
const int stepsPerRevolution = microsteps * fullStepsPerRevolution;  // Gesamtschritte pro Umdrehung einschließlich Mikroschritte
const int motorPin = 5;  // Nur Pin 5 wird verwendet

void setup() {
  // Konfiguration des Pins als Ausgang
  pinMode(motorPin, OUTPUT);
}

void loop() {
  // Bewegung des Schrittmotors, um das Volumen zu entleeren
  float targetVolume = 5.0;  // Das Zielvolumen, das entleert werden soll (in Millilitern)
  int targetSteps = int(targetVolume * stepsPerRevolution);

  // Bewege den Schrittmotor zuerst in die Richtung "Vorwärts"
  for (int i = 0; i < targetSteps; i++) {
    digitalWrite(motorPin, HIGH);
    delayMicroseconds(500);  // Setzen Sie die gewünschte Geschwindigkeit (Sie können dies anpassen)
    digitalWrite(motorPin, LOW);
    delayMicroseconds(500);  // Setzen Sie die gewünschte Geschwindigkeit (Sie können dies anpassen)
  }

  // Hier können Sie weitere Aktionen hinzufügen, nachdem das Volumen entleert wurde

  // Endlosschleife beenden
  while (true) {
    // Hier können Sie weitere Aktionen ausführen, wenn nötig
  }
}
 

Hier ist der angepasste Code:


#include <LiquidCrystal.h>
#include <AccelStepper.h>

// Konfiguration für das LCD Keypad Shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Standardpins für RS, E, D4, D5, D6, D7

const int microsteps = 16;  // Anzahl der Mikroschritte pro Schritt
const int fullStepsPerRevolution = 200;  // Anzahl der vollen Schritte pro Umdrehung des Schrittmotors
const int stepsPerRevolution = microsteps * fullStepsPerRevolution;  // Gesamtschritte pro Umdrehung einschließlich Mikroschritte

AccelStepper myStepper(1, 5, 6);  // Pin 5 für PUL und Pin 6 für DIR
float targetVolume = 10.0;  // Das Zielvolumen, das entleert werden soll (in Millilitern)

void setup() {
  // Initialisierung des LCD
  lcd.begin(16, 2); // 16 Zeichen x 2 Zeilen

  // Konfiguration des Schrittmotors
  myStepper.setMaxSpeed(500); // Setzen Sie die gewünschte Geschwindigkeit (Sie können dies anpassen)
  myStepper.setAcceleration(100); // Setzen Sie die gewünschte Beschleunigung (Sie können dies anpassen)

  // Berechnen der Schritte für das Zielvolumen
  long targetSteps = long(targetVolume * stepsPerRevolution);

  // Anzeigen des Zielvolumens auf dem LCD
  lcd.setCursor(0, 0);
  lcd.print("Target (ml): ");
  lcd.print(targetVolume, 1); // 1 Dezimalstelle anzeigen
}

void loop() {
  // Bewegung des Schrittmotors, um das Volumen zu entleeren
  long targetSteps = long(targetVolume * stepsPerRevolution);
  myStepper.moveTo(targetSteps);

  while (myStepper.distanceToGo() != 0) {
    myStepper.run();
  }

  // Endlosschleife beenden
  while (true) {
    // Hier können Sie weitere Aktionen ausführen, wenn nötig
  }
}

Wenn ich den Schrittmotor direkt am Arduino anschließe, funktioniert er einwandfrei. Aber wenn das LCD Keypad Shield mit dem oben angegebenen Code angeschlossen ist, bewegt sich der Motor nicht, obwohl die LCD-Anzeige funktioniert.

Habe ich möglicherweise ein Problem mit der Verdrahtung oder gibt es eine mögliche Konfliktquelle im Code? Ich wäre für jeden Hinweis oder Ratschlag sehr dankbar.

Vielen Dank im Voraus für Ihre Unterstützung!

Wenn Du Pins mehrfach belegst passiert sowas.
Grüße Uwe

@uwefed hat dir schon was geschrieben, nur übersehen das du auch Pin 1 nutzt, der so wie 0 ist zuständig für die Verbindung Arduino zu PC, also Tabu, wen dir die Pin's ausgehen kann man auch A0 bis A5 nehmen die kann man auch als Digital Aus, Eingänge nutzen

Danke :innocent:

Falls Du das hier meinst:

da ist die 1 kein Pin, sondern sagt, dass es 2 Pins gibt (DIR+Step)
Quelle. Ich hatte auch erst Deinen Gedanken.

Gruß Tommy

Ups Danke hatte noch nie mit Stepper zu tun

wow. Wurde rehabiliert... :wink:
Hätte es aber selbst sehen müssen. :sleepy:

Du verweist da auf einen ziemlich alten Stand. ( der auch laut README nicht mehr 'in use' ist ). Eine aktuelle Dokumentation der Accelstepper gibt es hier.

Der Sketch zeigt auch schön die Problematik bei der intensiven Verwendung von 'magic numbers'.
Als erster Parameter bei der Instanziierung der AccelStepper sollte hier besser 'AccelStepper::DRIVER' verwendet werden, dann gibt es keine Verwechselung mit Pin-Nummern.
Und wenn man am Anfang des Sketches allen verwendeten Pins sprechende Namen zuordnet, fällt eine Mehrfachverwendung des gleichen Pins auch schneller auf - und kann leichter korrigiert werden (Wenn man im Sketch dann auch konsequent diese Namen verwendet :wink:).

Danke für die Aktualisierung. Das war mir als Erstes über den Weg gelaufen. 'AccelStepper::DRIVER' und die anderen Anmerkungen sind natürlich viel besser, als 'magic numbers'.

Gruß Tommy

Wo hast Du denn die Vorlage für deinen Sketch her - Das am Ende von loop() ist ziemlich sinnfrei, oder besser gesagt vollkommener Blödsinn und stört nur, wenn Du den Sketch mal erweitern willst ( Bitte nicht dem Kommentar folgen )

Danke, ich werde versuchen, den Code etwas zu überarbeiten. Hoffentlich funktioniert er dann.
Edit: Wäre das hier so, wie du es gemeint hast?

#include <LiquidCrystal.h>
#include <AccelStepper.h>

// Konfiguration für das LCD Keypad Shield
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // Standardpins für RS, E, D4, D5, D6, D7

// Konfiguration für den Schrittmotor mit Mikroschritten
const int microsteps = 16; // Anzahl der Mikroschritte pro Schritt
AccelStepper myStepper(AccelStepper::DRIVER, 5, 6); // Verwenden Sie AccelStepper::DRIVER für den Treibermodus

float targetVolume = 10.0; // Das gewünschte Zielvolumen in ml

void setup() {
  // Initialisierung des LCD
  lcd.begin(16, 2); // 16 Zeichen x 2 Zeilen

  // Konfiguration des Schrittmotors
  myStepper.setMaxSpeed(500); // Setzen Sie die gewünschte Geschwindigkeit (Sie können dies anpassen)
  myStepper.setAcceleration(100); // Setzen Sie die gewünschte Beschleunigung (Sie können dies anpassen)

  // Berechnen Sie die Anzahl der Schritte für 10 ml Injektion
  long targetSteps = 10 * microsteps; // 1 Schritt entspricht 1 ml (bei 16 Mikroschritten pro Schritt)
  myStepper.moveTo(targetSteps);

  // Anzeigen des Zielvolumens auf dem LCD
  lcd.setCursor(0, 0);
  lcd.print("Target (ml): ");
  lcd.print(targetVolume, 1); // 1 Dezimalstelle anzeigen
}

void loop() {
  // Führen Sie den Schrittmotor aus, bis das Zielvolumen erreicht ist
  while (myStepper.distanceToGo() != 0) {
    myStepper.run();

    // Hier können Sie weitere Aktionen und Logik für Ihr Projekt hinzufügen
  }

e
}

Du hast jetzt zwar das sinnfreie while(true) weggelassen. Aber die wesentlichen Hinweise zu den Pin-Zuordnungen (vor allem die Doppelbelegung von Pin 5+6) hast Du ignoriert. D.h. der Sketch wird nach wie vor nicht funktionieren.

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