Moin zusammen,
da meine Google Latein am ende sind, wende ich an Euch und hoffe Hilfe zu erhalten.
Was C++ Programmierung angeht bin ich ein ziemlicher Neuling, und habe dies diverse Verständnis Probleme.
Ich versuche ein Projekt umzusetzen mit ArtNet, Stepper und WS2812 Led, zu den einzelnen Themen gibt es
viele Projekte aber keins was die o.g. Punkte zusammen abdeckt.
Als Board verwende ich ein ESP8266 ( https://www.amazon.de/gp/product/B0754HWZSQ/ref=ppx_yo_dt_b_asin_image_o04_s00?ie=UTF8&psc=1 )
als Stepper einen A4988. Das ganze ist im Moment als STEP und DIR angeschlossen.
Artnet und Stepper laufen bereits einzeln, aber wenn ich vom Artnet den DMX wer an Stepper übergebe läufts irgendwie nicht sauber.
Es füllt sich so an, als würde die Stepper lib auf genug daten warten und erst dann sich bewegen.
Als Artnet Sender verwende ich QLC+ ( https://www.qlcplus.org/ )
Ich hoffe habt eine Idee wo mein Denkfehler ist.
MfG
Andreas
; PlatformIO Project Configuration File
[env:esp12e]
platform = espressif8266
board = nodemcuv2
framework = arduino
monitor_speed = 115200
lib_deps =
rstephan/ArtnetWifi@^1.4.0
fastled/FastLED @ ^3.4.0
waspinator/AccelStepper@^1.61
upload_speed = 921600
board_build.filesystem = littlefs
build_flags =
#include <ESP8266WiFi.h>
#include <ArtnetWifi.h>
#include <Arduino.h>
#include <FastLED.h>
#include <AccelStepper.h>
//Stepper
#define STEPPER1_DIR_PIN D4
#define STEPPER1_STEP_PIN D3
AccelStepper stepper(AccelStepper::DRIVER, STEPPER1_STEP_PIN, STEPPER1_DIR_PIN);
// WiFi stuff
const char* ssid = "FRITZ!Box 7490";
const char* password = "12345678";
// LED settings
const int numLeds = 1; // CHANGE FOR YOUR SETUP
const int numberOfChannels = numLeds * 3; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 2;
CRGB leds[numLeds];
// Art-Net settings
ArtnetWifi artnet;
WiFiUDP UdpSend;
const int startUniverse = 0; // CHANGE FOR YOUR SETUP most software this is 1, some software send out artnet first universe as 0.
// Check if we got all universes
const int maxUniverses = numberOfChannels / 512 + ((numberOfChannels % 512) ? 1 : 0);
bool universesReceived[maxUniverses];
bool sendFrame = 1;
int previousDataLength = 0;
// connect to wifi – returns true if successful or false if not
boolean ConnectWifi(void)
{
boolean state = true;
int i = 0;
WiFi.begin(ssid, password);
Serial.println("");
Serial.println("Connecting to WiFi");
// Wait for connection
Serial.print("Connecting");
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
if (i > 20){
state = false;
break;
}
i++;
}
if (state){
Serial.println("");
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
} else {
Serial.println("");
Serial.println("Connection failed.");
}
return state;
}
void initTest()
{
for (int i = 0 ; i < numLeds ; i++) {
leds[i] = CRGB(127, 0, 0);
}
FastLED.show();
delay(500);
for (int i = 0 ; i < numLeds ; i++) {
leds[i] = CRGB(0, 127, 0);
}
FastLED.show();
delay(500);
for (int i = 0 ; i < numLeds ; i++) {
leds[i] = CRGB(0, 0, 127);
}
FastLED.show();
delay(500);
for (int i = 0 ; i < numLeds ; i++) {
leds[i] = CRGB(0, 0, 0);
}
FastLED.show();
}
void onDmxFrame(uint16_t universe, uint16_t length, uint8_t sequence, uint8_t* data)
{
sendFrame = 1;
// set brightness of the whole strip
if (universe == 15)
{
FastLED.setBrightness(data[0]);
FastLED.show();
}
// Store which universe has got in
if ((universe - startUniverse) < maxUniverses) {
universesReceived[universe - startUniverse] = 1;
}
for (int i = 0 ; i < maxUniverses ; i++)
{
if (universesReceived[i] == 0)
{
//Serial.println("Broke");
sendFrame = 0;
break;
}
}
// read universe and put into the right part of the display buffer
for (int i = 0; i < length / 3; i++)
{
int led = i + (universe - startUniverse) * (previousDataLength / 3);
if (led < numLeds)
leds[led] = CRGB(data[i * 3], data[i * 3 + 1], data[i * 3 + 2]);
}
previousDataLength = length;
if (sendFrame)
{
FastLED.show();
// Reset universeReceived to 0
memset(universesReceived, 0, maxUniverses);
}
}
void setup()
{
Serial.begin(115200);
ConnectWifi();
artnet.begin();
FastLED.addLeds<WS2812, dataPin, GRB>(leds, numLeds);
initTest();
// this will be called for each packet received
artnet.setArtDmxCallback(onDmxFrame);
digitalWrite(D3, LOW); // Currently no stepper motor movement
digitalWrite(D4, LOW);
stepper.setMaxSpeed(2500);
stepper.setAcceleration(1200.0);
//stepper.setMinPulseWidth(20);
} //End Setup
void loop(){
// we call the read function inside the loop
artnet.read();
uint16_t r = artnet.read();
if(r == ART_POLL)
{
Serial.println("POLL");
}
if (r == ART_DMX)
{
// print out our data
Serial.print("universe number = ");
Serial.print(artnet.getUniverse());
Serial.print("\tdata length = ");
Serial.print(artnet.getLength());
Serial.print("\tsequence n0. = ");
Serial.println(artnet.getSequence());
Serial.print("DMX data: ");
for (int i = 0 ; i < 1 ; i++)
{
Serial.print(artnet.getDmxFrame()[i]);
int analog_in = analogRead(artnet.getDmxFrame()[i]);
stepper.runToNewPosition(analog_in); //send to stepper
//stepper.moveTo(analog_in);
//stepper.setSpeed(100);
//stepper.runSpeedToPosition();
//stepper.run();
Serial.print(" ");
}
Serial.println();
Serial.println();
}
delay(50);
}