Hallo,
Zur zeit baue ich einen Bewegten Bühnenscheinwerfer, der über DMX angesteuert werden soll.
2 Motoren paralell laufen zu lassen ist mir mit Accelstepper.h und run() schon gelungen. Auch eine ansterung der Motoren über DMX ist kein Probelm. Was mir jedoch Probleme bereitet ist, wenn ich Paralell zur Motor bewegung DMX Werte einlese und diese auf LED's ausgebe. Gleichzeitig soll auch ein 7 Segment Display angesteuert werden. Wenn ich alle diese Funktionen verknüpfe funktioniert jedoch keine Motor bewegung mehr. Die motoren bekommen nur alle Sekungen einen schritt und drehen sich desshalb nur mehr sehr sehl langsam. Die unterschiedlichen Funktionen blokieren sich irgendwie gegenseitig
Hat jemand eine Lösung. Ich suche schon sehr lange, aber finde einfach nichts das Funktioniert.
Danke im Vorraus.
#include <DMXSerial.h>
#include <HCMAX7219.h>
#include <EEPROM.h>
#include "SPI.h"
#define LOAD 53
#include <AccelStepper.h>
HCMAX7219 HCMAX7219(LOAD);
int Adr=1; //DMX Adresse
int mult = 0; //Multiplikator fuer Helligkeit
int i=1; //I Fuer Booten von System
int a=1; //Zaehlvariable zum Booten
int b=0; //Zaehlvariable zum Booten
int c=0; //Zaehlvariable zum Booten
int pos1; //Motorvariable fuer Automatikprogramm
int pos2; //Motorvariable fuer Automatikprogramm
int AUTO=1; //Variable fuer den Automatikkanal ueber DMX
int x=0; //Zaehlvariable fuer Automatik Display
AccelStepper stepper1(1, 29, 3);
AccelStepper stepper2(1, 37, 2);
void setup()
{
DMXSerial.init(DMXReceiver); //DMX Empfaenger, nicht Sender
pinMode(49, INPUT);//Eingnag Taster Hoch
pinMode(47, INPUT);//Eingang Taster runter
stepper1.setMaxSpeed(1200);
stepper1.setAcceleration(10000);
stepper2.setMaxSpeed(1200);
stepper2.setAcceleration(5000);
}
void loop()
{
unsigned long lastPacket = DMXSerial.noDataSince();
if (lastPacket < 3000 && i==2)
{
if((digitalRead(49)==HIGH) || (digitalRead(47)==HIGH))
{
if ((Adr >0)&&(Adr <506))
{
if (digitalRead(49)==HIGH) //Hoch zaehlen
{
Adr=Adr+1;
}
if(digitalRead(47)==HIGH) //Runter zaehlen
{
Adr=Adr-1;
}
}
if((Adr==0)&&(digitalRead(47)==HIGH))//fall, Adr ist genau 1 (hoch)
{
Adr=Adr+1;
}
if((Adr==506)&&(digitalRead(49)==HIGH))//fall, Adr ist genau 505(runter)
{
Adr=Adr-1;
}
delay(120); //entprellen
EEPROM.write(0, Adr); //neue Adresse in das EEPROM abspeichern
HCMAX7219.Clear();
HCMAX7219.print7Seg(Adr,4); //Text "Adr" auf das Display ausgeben
HCMAX7219.print7Seg("Adr",8); //Wert der Adresse auf das Display ausgeben
HCMAX7219.Refresh();
}
mult = DMXSerial.read(Adr) *AUTO;
analogWrite(8, (DMXSerial.read(Adr + 1)*mult / 255)); // Rot Pin 8
analogWrite(9, (DMXSerial.read(Adr + 2)*mult / 255)); // Gruen Pin 9
analogWrite(10, (DMXSerial.read(Adr + 3)*mult / 255)); // Blau Pin 10
Motor();
if(DMXSerial.read(Adr+6)==255)
{
AUTO=0;
}
else
{
AUTO=1;
}
}
void Motor()
{
digitalWrite(23, LOW);
digitalWrite(25, LOW);
digitalWrite(27, LOW);
if (stepper1.distanceToGo() == 0)
{
pos1=map(DMXSerial.read(Adr + 4), 0, 255, 0, -50);
stepper1.moveTo(pos1);
}
if (stepper2.distanceToGo() == 0)
{
pos2=map(DMXSerial.read(Adr + 5), 0, 255, 0, -2700);
stepper2.moveTo(pos2);
}
stepper1.run();
stepper2.run();
}