3 Schrittmotoren gleichzeitig ansteuern

Hallo.
Ich möchte mit meinem Arduino Uno, 3 Vexta Schrittmotoren gleichzeitig ansteuern.
Dafür verwende ich folgende Steuerung.

http://shop.strato.de/epages/61125483.sf/de_AT/?ObjectPath=/Shops/61125483/Products/SM33PCV3

Mit der Ansteuerung von einem Motor hatte ich bis jetzt keine Probleme. Wie kann ich aber 3 Motoren gleichzeitig ansteuern?

Das Programm sollte ungefähr so ausschauen:
(Ich hoffe ihr versteht was ich meine :slight_smile: )

Motor1 //////////////------------////////////
Motor2 ////---////----////----\\-----\\\
Motor3 --------\\\\\--------\\\\\\

Drehen vorwärts: /
Pause: -
Drehen rückwärts: \

Habt ihr eine Idee wie man sowas realisieren könnte?

Hallo,
"3 Motoren gleichzeitig ansteuern"
wohl überhaupt nicht- einen nach dem anderen.

"von einem Motor hatte"
an der von Dir genannten Karte?
Wenn ja, dann brauchst Du doch nur mit C&P den Code erweitern und die
Adressen der Treiber-IC´s ändern.

Nicht mit der Karte?
Dann wird das ohne ausführliches Datenblatt wohl nichts werden?

Das Ding ist ziemlich einfach gestrickt, es sieht so aus, als wenn für jeden
Motor ein Treiber-IC mit Leistungsendstufe vorhanden ist.
Du brauchst also von diesen Ic´s das Datenblatt, dann kannst Du auch feststellen
wie genau die angesteuert werden.
Gruß und Spaß
Andreas

Dass ich sie nicht wirklich "gleichzeitig" ansteuern kann ist mir schon klar. Ich möchte die 3 Motoren gleichzeitig laufen lassen.

Auf der Karte ist für jeden Motor ein L297 in Verbindung eines L298 verbaut.
Um den Motor zum laufen zu bekommen, wird nur die Richtung und der Tackt vom Arduino benötigt.

Hier ist der Code den ich verwendet habe um einen Motor mit der Karte zu betreiben:

int pinDir = 11;
int pinStep = 12;

void setup()
{
  pinMode(pinDir, OUTPUT);
  pinMode(pinStep, OUTPUT);
}
void loop()
{
  drehen(8000,600);
  delay(10);
  drehen(-8000,600);
  delay(10);

}
void drehen(int schritte, int tempo)
{
  if(schritte > 0)
  digitalWrite(pinDir,HIGH);
  else
  digitalWrite(pinDir,LOW);
  
  schritte = abs(schritte);
  
  for(int i=0; i < schritte; i++)
  {
    digitalWrite(pinStep, HIGH);
    delayMicroseconds(tempo);
    digitalWrite(pinStep, LOW);
    delayMicroseconds(tempo);
  }
}

Ist es überhaupt sinnvoll mit diesem Code zu arbeiten, da es extra Stepper Bibliotheken gibt?

Wenn du keinen besonders großen Aufwand betreiben möchtest, kann ich dir die AccelStepper Library empfehlen.
http://www.airspayce.com/mikem/arduino/AccelStepper/
Dort ist meines Wissens nach auch ein Beispiel-Sketch dabei, bei dem mehrere Motoren gleichzeitig bewegt werden. Schau dir den einfach mal an, vielleicht hilft es dir weiter

Grüße

Hallo,
das mit der Lib würde ich erst einmal lassen. Wenn Du sie so zum laufen
bekommst, dann weißt Du auch was passiert.
Wenn das dann mal alles läuft, kannst Du die Lib immer noch anwenden.

Du mußt die drei Motoren ja trennen, Ich habe aber keine Ahnung, ob das so
einfach funktioniert: z.B.

int pinDirM1 = 11;
int pinStepM1 = 12;
int pinDirM2 = 13;
int pinStepM2 = 14;
int pinDirM3 = 15;
int pinStepM3 = 16;

void setup()
{
  pinMode(pinDirM1, OUTPUT);
  pinMode(pinStepM1, OUTPUT);
pinMode(pinDirM2, OUTPUT);
  pinMode(pinStepM2, OUTPUT);
pinMode(pinDirM3, OUTPUT);
  pinMode(pinStepM3, OUTPUT);
}

Dann hättest Du sie getrennt.
Nun sagst Du Ihnen was Sie machen sollen

void drehenM1(int schritteM1, int tempoM1)

Erst zum schluss läßt Du sie dann drehen. Wenn Dein Sketch so läuft, dann
würde ich da einfach mal ein M1, M2 und M3 dranhängen.
Hier müßte EVA sehr gut funktionieren
Gruß und Spaß
Andreas

Danke für den Tipp mit der AccelStepper Library. Alle 3 Motoren laufen gleichzeitig :slight_smile:

Wie kann Ich denn dort Pausen einbauen?
Zum Beispiel, dass der Motor 9000 Schritte dreht, 8s wartet und dann mit verringerter Drehzahl nochmal 2000 Schritte dreht?

@Andreas: Mit der Lib ist es glaub ich um einiges einfacher. Das Problem mit dem Code zuvor ist dass durch das "Delay" der komplette Systemablauf unterbrochen wird...

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

AccelStepper stepper1(AccelStepper::FULL2WIRE, 6, 7);
AccelStepper stepper2(AccelStepper::FULL2WIRE, 8, 9);
AccelStepper stepper3(AccelStepper::FULL2WIRE, 10, 11);

void setup()
{  
    stepper1.setMaxSpeed(200.0);
    stepper1.setAcceleration(100.0);
    stepper1.moveTo(24);
    
    stepper2.setMaxSpeed(300.0);
    stepper2.setAcceleration(100.0);
    stepper2.moveTo(1000000);
    
    stepper3.setMaxSpeed(300.0);
    stepper3.setAcceleration(100.0);
    stepper3.moveTo(1000000); 
}

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

Hallo,
dieses verdammte delay() solltest Du Dir nicht angewöhnen. Ersetze es durch millis().
daelay() STOPT den Arduino.

Selbstverständlich geht es mit der Lib einfacher, aber Du hast KEINE Ahnung davon, was dort abläuft!

Geht doch schon los...
"Wie kann Ich denn dort Pausen einbauen?"
Vielleicht mit millis()?
Gruß und Spaß
Andreas

Also Ich muss sagen, dass durch die Library der Motor um einiges schöner läuft. Dort habe ich im Gegensatz zu dem vorherigen Code, die Möglichkeit, die Beschleunigung anzupassen.
Durch das Einsetzen von millis(); bekomme ich beim neuen Code eine Fehlermeldung.

Ich hab im Internet leider nicht viel zu der Funktionsweise des MultiStepper Programmes gefunden.
Kennt jemand eine I-net Seite, auf der Ich nachlesen kann, welche Funktionen dort möglich sind?
Oder hat schon jemand Erfahrungen mit der AccelStepper Lybrary gemacht?

Hallo,
die Lib ist doch bis ins kleinste beschrieben...
http://www.airspayce.com/mikem/arduino/AccelStepper/classAccelStepper.html
Dort gibt es auch ein "Stop"
Gruß und Spaß
Andreas