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."
/// 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 ...
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.
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.
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!
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.
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)
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.