LED Moving Head

Hallo erstmal,
ich baue momentan einen Moving Head. Es wird, wenn er fertig ist, LED’S, 2 Schrittmotoren und ein Siebensegment Display geben, in dem die aktuelle DMX Adresse angezeigt wird. Diese Adresse soll über Taster veränderbar sein. Zwischen Arduino und Stepper (Nema 17) hängt eine H-Bridge (Pololu DRV8825). Das Ansteuern von den Motoren und LED’s über DMX ist kein Problem.
Jedoch habe ich das Problem, wenn beide Kanäle, die für die Steuerung der Motoren zuständig sind, gleichzeitig ihren Wert verändern, sich zuerst der eine und dann erst der andere Motor drehen und niemals beide Motoren gleichzeitig. Meine Frage ist nun, wie ich das hinbekomme, dass ich beide Motoren gleichzeitig ansteuern kann.
Hier ist der Code, 7 Segment, Taster usw. sind in diesem Code noch nicht berücksichtigt.

#include <DMXSerial.h>
#include <AccelStepper.h> 

int adr = 1;       // startadresse
int mult = 0;      
int val = 0;
int previous = 0;
int long newval = 0;
int val1 = 0;
int previous1 = 0;
int long newval1 = 0;
AccelStepper stepper1(1, 8, 9);
AccelStepper stepper2(1, 7, 10);

void setup () {
  DMXSerial.init(DMXReceiver);
  stepper1.setMaxSpeed(4800);  // Set speed fast enough to follow pot rotation
  stepper1.setAcceleration(4800);  //  High Acceleration to follow pot rotation  

  stepper2.setMaxSpeed(4800);  // Set speed fast enough to follow pot rotation
  stepper2.setAcceleration(4800);  //  High Acceleration to follow pot rotation  
}
void loop() {
  mult = DMXSerial.read(adr);                         
  analogWrite(3, (DMXSerial.read(adr + 1)*mult / 255)); // Rot
  analogWrite(5, (DMXSerial.read(adr + 2)*mult / 255)); // Grün
  analogWrite(6, (DMXSerial.read(adr + 3)*mult / 255)); // Blau

  val1 = DMXSerial.read(adr + 4);  // DMX Adresse 
  if ((val1 > previous1) || (val1 < previous1)) {  //Veränderung?
    newval1 = map(val1, 0, 255, 0, 400);  //eine umdrehung bei halb schritten
    stepper2.runToNewPosition(newval1);  // neue Position
    previous1 = val1;  // Wert in previos verschieben
  }
  
  val = DMXSerial.read(adr + 5);  // DMX Adresse 
  if ((val > previous) || (val < previous)) {  // veränderung?
    newval = map(val, 0, 255, 0, 800);  //eine umdrehung bei halb schritten
    stepper1.runToNewPosition(newval);  // neue Position
    previous = val;  // Wert in previos verschieben
  }
}

Peeceet:
... zuerst der eine und dann erst der andere Motor drehen ...

In der Doku zu runToNewPosition steht: "Moves the motor to the new target position and blocks until it is at position. Dont use this in event loops, since it blocks."

Du solltest eine andere Methode verwenden.

Damit willkommen im Forum :slight_smile:

/// Moves the motor (with acceleration/deceleration)
/// to the new target position and blocks until it is at
/// position. Dont use this in event loops, since it blocks.
/// \param[in] position The new target position.
void runToNewPosition(long position);

Das ist nicht das was du willst!
Warum verwendest du es dann?

Verwende doch bitte eine, oder mehrere, der anderen Methoden.
Das scheint mir zielführender.

Siehe:

/// ... You can have multiple simultaneous steppers, all moving
/// at different speeds and accelerations, provided you call their run()
/// functions at frequent enough intervals ...

Danke für die Antworten!
Was wäre denn die beste Methode um mein Problem effektiv zu lösen?
Danke im Vorhinein.

Vielleicht funktioniert moveTo() besser?

Man könnte evtl. auch das ein, oder andere, *.run() einstreuen.

Ich bin ein isschen unfähig. Könntet ihr mir sagen wie genau ich das Programm umschreiben müsste, damit es funktioniert :roll_eyes:
Danke im vorhinein!

Du sagst jedem Motor, wie weit er laufen soll, und rufst dann in loop() sein run() auf, das die Impulse erzeugt. Da macht es nichts, wenn nur jedes hundertste run() tatsächlich was tut, Hauptsache alle Motoren kommen ausreichend oft dran.

Hi

Alternativ überlegen, was der Arduino mit den Treibern macht und sich überlegen, ob man Das nicht selber auch hinbekommt.

Wird nur die neue Position übertragen oder auch, wann Diese erreicht sein soll?
Was passiert, wenn während einer Bewegung nur eine der Achsen einen anderen Wert bekommt, wann sind Beide mit Ihrer Bewegung dann fertig?

Wenn Zeit und Weg bekannt ist, kann man berechnen, wie lange man auf den nächsten Schritt warten muß.
Für beide Motoren.
Parallel.
State-Maschine könnte auch ein Suchbegriff für Dich werden.

MfG

Der Moving Head ist mittlerweile fertig, wen es interessiert:

Hi

Schön zu sehen, wenn Projekte fertig werden oder ein weiteres Stadium erreicht haben.
Mir fiel jatzt nicht auf, daß Du durch die Achse Kabel führst, vermute daher Schleifringe zur Energie-Übertragung - dem Entgegen steht aber, daß mir bisher nur 1 1/2 Umdrehungen in eine Richtung aufgefallen wären.

Erzähl Mal was zu den inneren Werten - schaut aber so schon gar nicht so verkehrt aus, Dein Moving-Head!

MfG

Es ist so das die vertikale Welle innen hohl ist, und ich die Kabeln einfach durch diese hohle Welle geführt habe. Die Welle selbst ist auf einer kleinen erhöhung gelagert, damit die Kabeln problemlos durchgefädelt werden konnten. Auf dem Foto sieht man die Erhöhung unter der die Kabel in die Welle gehen.

Bei der horizotalen Welle sind die Kabeln einfach oben drüber gefädelt, mit einer Kleinen Schleife damit die nirgends anstoßen. zusätzlich ist ein Schrumpfschlauch drüber üm sie zu schützen.

Allgemein zu den innenren Werten gib es zu sagen:
Als Hirn hab ich einen Arduino Mega verwendet, der über 3 Transistorschaltungen die RGB LEDs ansteuert. Die Spannung für die LEDs wird von einem DCDC Wandler von 12Volt (Betriebsspannung) herunter geregelt. Außerdem steuert der Arduino über Pololu drv8825 H-Bridges die beiden Schrittmotoren an. Weiters gibt der Arduino Informationen auf das 7 Segment Display aus und über 2 Taster können Automatikprogramme aufgerufen werden bzw. die DMX Startadresse eingestellt werden.

Ein problem gab es noch mit dem DMX Signal, wenn es mit dem Arduino verbunden war, hat sich dieser nicht mehr starten lassen. Aus diesem grund schaltet sich der Arduino das DMX Signal erst mit den Programmzeilen über ein Relais zu.

Wenn du noch mehr wissen willst kann ich dir gerne die komplette Dokumentation (150 Seiten) Diplomarbeit schicken.

MfG

Hi

Danke für das Angebot - wenn Du die Diplom-Arbeit 'nicht mehr brauchst', könntest Du Diese Interessenten hier zur Verfügung stellen (kA, wie Das mit Diplom-Arbeiten geregelt ist).
Selber habe ich dafür wohl keine Verwendung - würde wohl 'meinen Moving-Head' in groben Zügen Deinem nachempfinden und die Software selber ausarbeiten - da weiß ich auch gleich, wen ich hauen muß, wenn Was nicht so funktioniert ;).

Danke für Deine Ausführungen und für Dein Angebot.
GGf. solltest Du die eMail-Addy wieder raus nehmen, ruck Zuck bekommst Du vermehrt Post für irgend einen Firlefanz.

Hoffe ja, daß man Dich hier im Forum noch weitere Jahre antreffen kann.
(bzw. unten von 'NO ALERTS OR EMAILS' auf 'RECEIVE EMAIL' stellen)

MfG

Hab die Mail Adresse jetzt wieder raus genommen aber bei fragen kann man hier ja auch private Nachrichten schicken. Bzw. kann man mir über meine Website

auch gerne Nachrichten schicken.

Ich weiß leider auch nicht wie das genau geregelt ist mit Diplomarbeiten, deshalb habe ich sie hier noch nirgends hochgeladen.

Lg