Lego podium

Projecten die niet passen in bovenstaande onderwerpen
Berichten: 4
Geregistreerd: 12 Jan 2020, 12:04

Lego podium

Berichtdoor kermisbrian » 15 Nov 2020, 00:37

Beste forum leden,

Mijn naam is Brian, en ik heb 3 grote passies in mijn leven.
Podiums, lego, en kermis.
Deze 3 combineer ik dan vaak als in ik bouw podiums van lego en kermissen van lego.
Nou bij het bouwen van die podiums gebruik ik steeds vaker 2812b led ook wel bekend als dreamcolor led.
Ik sloot dit dan aan op een led controller die je met je telefoon kon bedienen en ik kon prachtige light programmas afspelen.
Maar ik wou meer ik wilde een shot kunnen programmeren net als bij echte podiums. Na wat zoeken op het web kwam ik achter het fenomeen vixen.
Een gratis licht programma gemaakt voor lichtshows die op huizen werden gemaakt zoals je wel is op youtube tegen komt met kerst.
Ik dacht dat wil ik ook en na wat zoeken kwam ik er achter dat dit samen werkte met een arduino, het programma daar maakte je de show het programma verzond een signaal naar de arduino de arduino vormde dat signaal om naar het lampjes en zo gingen de lampjes branden.
Werkte prima maar ik liep tegen iets aan waar ik op vast loop.
Hier onder een video van mijn podium

https://www.youtube.com/watch?v=caxPbOuGE3w&t=4s

Als ik heel snel lampjes wou laten knipperen dan merkte ik dat die een soort van vast liep dan zei ik in het systeem knipper 10 keer per seconden en dan knipperde die misschien 1 of 2 keer per seconden en merkte je gewoon dat het een soort vast liep.
De code die ik gebruikte had ik van internet geplukt en misschien is deze helemaal niet bedoelt voor dit soort dingen maar ik was al blij dat het werkte.
Ik hoop dat iemand mij kan helpen met misschien aan te geven om wat dingen in de code aan te passen of misschien kent iemand hier betere code voor ?

Hier onder de code

#include <Artnet.h>
#include <RingBuffer.h>

/*
This example will receive multiple universes via Artnet and control a strip of ws2811 leds via
Adafruit's NeoPixel library: https://github.com/adafruit/Adafruit_NeoPixel
This example may be copied under the terms of the MIT license, see the LICENSE file for details
*/

#include <Artnet.h>
#include <Ethernet.h>
#include <EthernetUdp.h>
#include <SPI.h>
#include <Adafruit_NeoPixel.h>

// Neopixel settings
const int numLeds = 150; // change for your setup
const int numberOfChannels = numLeds * 3; // Total number of channels you want to receive (1 led = 3 channels)
const byte dataPin = 13;
Adafruit_NeoPixel leds = Adafruit_NeoPixel(numLeds, dataPin, NEO_GRB + NEO_KHZ800);

// Artnet settings
Artnet artnet;
const int startUniverse = 1; // 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;

// Change ip and mac address for your setup
byte ip[] = {2, 0, 0, 2};
byte mac[] = {0x08, 0xE9, 0xE5, 0x00, 0x69, 0xEC}; // make sure this is different than any other mac address in your network

void setup()
{
//Serial.begin(115200);
artnet.begin(mac, ip);
leds.begin();
initTest();

// this will be called for each packet received
}

void loop()
{
// we call the read function inside the loop
}

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)
{
leds.setBrightness(data[0]);
leds.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.setPixelColor(led, data[i * 3], data[i * 3 + 1], data[i * 3 + 2]);
}
previousDataLength = length;

if (sendFrame)
{
leds.show();
// Reset universeReceived to 0
memset(universesReceived, 0, maxUniverses);
}
}

void initTest()
{
for (int i = 0 ; i < numLeds ; i++)
leds.setPixelColor(i, 127, 0, 0);
leds.show();
delay(500);
for (int i = 0 ; i < numLeds ; i++)
leds.setPixelColor(i, 0, 127, 0);
leds.show();
delay(500);
for (int i = 0 ; i < numLeds ; i++)
leds.setPixelColor(i, 0, 0, 127);
leds.show();
delay(500);
for (int i = 0 ; i < numLeds ; i++)
leds.setPixelColor(i, 0, 0, 0);
leds.show();
}

Met vriendelijke groet
Brian

Advertisement

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Lego podium

Berichtdoor shooter » 15 Nov 2020, 12:16

Tja het zijn nogal wat channels die allen serieel over het lijntje moeten met led.show, dus dan kun je ook de knippersnelheid bepalen van een dergelijk lange array. Daar is weinig aan te doen, want 150 *3 is 450 bytes moeten rond. Er is wel een mogelijkheid om de zaak op te splitsen in bijvoorbeeld 2 pinnen, waardoor je dus 2 arrays tegelijk kunt sturen, (de arduino zelf is snel genoeg , maar de seriele signalen die naar de leds gaan is 'langzaam'.
Bij DMX doe je vrijwel hetzelfde door de zaak te verdelen over meerdere bussen.
verder zag ik dat je pin 13 gebruikt, beter een andere pin want op 13 staat 1 led op het printje. die led kun je beter gebruiken om te kijken of je buffer vol loopt, dan krijg je een soort waarschuwing als het te snel gaat.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 12 Jan 2020, 12:04

Re: Lego podium

Berichtdoor kermisbrian » 16 Nov 2020, 14:38

Bedankt voor uw reactie
Maar dan is er iets geks aan de hand, waarom kan die led controller in dit geval de sp107e het dan wel over een lijntje zo snel doen ?
Daarom vond ik het zelf zo gek, dus daarom dacht ik misschien zit het hem in de code dat je daar iets in kan optimaliseren waardoor dat sneller kan ?
Bij het programmeren van het podium heb ik ook gekeken wat er gebeurd als ik 1 ledje laat knipperen en de rest geen signaal stuur maar dan kon die het ook niet aan en gaf hij precies het zelfde probleem als met 150 leds.
Nogmaals ik heb echt 0 verstand van de code dus neem me daar om ten goede.
Misschien dat u me dat dan kunt uitleggen waarom het met de led controller wel kan hoge snelheid knipperen en data door sturen over 1 lijn en via de arduino niet.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Lego podium

Berichtdoor shooter » 17 Nov 2020, 16:06

zelfs met 1 knipperende led moeten toch all leds aangestuurd worden dus dat maakt geen verschil. maar je kunt dus wel de ledjes in een paar bundels verbouwen, dus bijvoorbeeld 3 strips van 50 leds. Dan gebruik je dus bijvoorbeeld 9,10,11 als pulspinnen. en daar zet je dan ieder hun eigen patroon op.
Een heel andere manier die je kunt gebruiken is met een klok diverse arduinos aansturen en dan elk een synchroon patroon geven.
paul deelen
shooter@home.nl

Berichten: 4
Geregistreerd: 12 Jan 2020, 12:04

Re: Lego podium

Berichtdoor kermisbrian » 24 Nov 2020, 02:11

Oke bedankt voor uw informatie ik ga is kijken of ik er wat meer over te weten kan komen.

Alleen dat over 1 data signaal klopt naar mijn idee toch niet helemaal.
Want als ik een led controller in dit geval de sp107e gebruik gaat ook alles over 1 datakabel en daar op kan die wel super snelle effecten doorgeven en de lampjes zo snel laten knipperen. Dat begrijp ik dan nog steeds niet.

Berichten: 4064
Geregistreerd: 16 Okt 2013, 14:31
Woonplaats: s hertogenbosch

Re: Lego podium

Berichtdoor shooter » 24 Nov 2020, 17:39

Die controller heeft gewoon een mooi stuk geheugen vast voor die communicatie, terwijl er in de arduino nog een hoop andere dingen gebeuren zoals seriele comms etc.
dus te verklaren, en je kunt natuurlijk ook zelf een functie schrijven die dat allemaal doet, en dan een stuk sneller is, dan fastled of zo.
paul deelen
shooter@home.nl

Terug naar Overige projecten

Wie is er online?

Gebruikers in dit forum: Geen geregistreerde gebruikers en 15 gasten