Modelbaan uitlichten m.b.v. WS2812 (Neopixel) leds en Arduino.

Gestart door Ajean, 03 december 2014, 22:52:28 PM

Ajean

Modelbaan uitlichten m.b.v. WS2812 (Neopixel) leds en Arduino.

In dit forum is al eens geschreven over het uitlichten van je modelbaan d.m.v. led strips, zowel strips met witte leds als strips met RGB leds, al dan niet digitaal aangestuurd.
Het "nadeel" van deze strips is dat alle leds bij aansturing de zelfde kleur weergeven.
Bij nacht simulatie geven bijvoorbeeld alle leds dezelfde  kleur blauw weer.
Wil je echter een meer realistische dag/nacht simulatie (bijvoorbeeld links van je baan komt de zon op en is het lichter terwijl  het rechts nog nacht en donker is, of je wilt een gedeelte van je baan met een net iets andere kleur belichten) dan zul je een andere manier van uitlichten moeten zoeken.
Een manier is, volgens mij, je modelbaan uitlichten m.b.v. WS2812 (Neopixel) leds die aangestuurd worden door een Arduino micro controller. WS2812 (Neopixel) leds zijn  RGB leds met een ingebouwde controller zodat iedere led afzonderlijk kan worden aangestuurd, zowel op kleur als op helderheid. Ook zijn fade in/fade out als ook knipper effecten mogelijk.
Op dit moment ben ik bezig een proefopstelling te maken om met alle mogelijkheden te experimenteren. Uiteindelijk wil ik komen tot een ,DCC aangestuurde, automatische dag/nacht simulatie.
Ik hou jullie op de hoogte van mijn vorderingen.

Adri

Meer informatie: https://learn.adafruit.com/adafruit-neopixel-uberguide/overview

dani

De kruik is te water gegaan...
De kruik is niet meer.

janieburton

 

Ajean

Hallo,

Om het een en ander te testen heb ik een proefopstelling gemaakt van 8 Neopixel leds en de onderstaande sketch geschreven, die zeker fraaier en sneller zal kunnen. Zeker als je uitgaat van 60 leds die uiteindelijk aangestuurd moeten worden.

De bedoeling is dat bij het indrukken van knop 1 de dagverlichting wordt opgestart en bij het indrukken van knop 2 de nachtverlichting.
Nu doet zich echter het probleem voor dat de proefopstelling niet reageert op de knoppen. Verder is per led de overgang van de ene naar de andere kleur tamelijk abrupt en zou ik die graag meer vloeiender willen hebben. De gekozen kleuren zijn willekeurig.
Een bijkomende vraag is of de brichtness per led kan worden ingesteld?
Iedere hulp en tips zijn welkom.

Groeten,

Adri

Gebruikte sketch:

#include "FastLED.h"
#define NUM_LEDS 8
#define DATA_PIN 6
#define BRIGHTNESS 25
int Button1 = 5;
int Button2 = 7;
int statusDag = 0;
int statusNacht = 0;
// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
FastLED.addLeds<NEOPIXEL, DATA_PIN, RGB>(leds, NUM_LEDS);
FastLED.setBrightness( BRIGHTNESS );
pinMode(Button1, INPUT_PULLUP);
pinMode(Button2, INPUT_PULLUP);
}

void loop(){
//Status Buttons
statusDag = digitalRead(Button1);
statusNacht = digitalRead(Button2);
if (statusNacht == HIGH && statusDag == LOW) // Beide knoppen bekijken op waarde, bij tegelijk 2 knoppen indrukken mag er niets gebeuren
{
delay(50);
// Turn the LED on, then pause
leds[0].setRGB(255,255,153);
leds[1].setRGB(255,255,153);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(255,255,204);
leds[1].setRGB(255,255,204);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(153,204,255);
leds[1].setRGB(153,204,255);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(102,178,255);
leds[1].setRGB(102,178,255);
FastLED.show();
delay(500);
}
if (statusNacht == LOW && statusDag == HIGH) // Beide knoppen bekijken op waarde, bij tegelijk 2 knoppen indrukken mag er niets gebeuren
{
delay(50);
// Turn the LED on, then pause
leds[0].setRGB(180,255,153);
leds[1].setRGB(180,255,153);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(180,255,204);
leds[1].setRGB(180,255,204);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(140,204,255);
leds[1].setRGB(140,204,255);
FastLED.show();
delay(500);
// Turn the LED on, then pause
leds[0].setRGB(80,178,255);
leds[1].setRGB(80,178,255);
FastLED.show();
delay(500);
}
}

minitreintje

Inderdaad, het zal nooit werken... Dat komt door deze voorwaarde:

CiteerBeide knoppen bekijken op waarde, bij tegelijk 2 knoppen indrukken mag er niets gebeuren

Doordat je dit gebruikte:

pinMode(Button1, INPUT_PULLUP);
pinMode(Button2, INPUT_PULLUP);


Wordt met digitalRead() steeds de knoppen als HIGH gelezen door de PULLUP. De oplossing is gewoon inverteren met '!':

statusDag = !digitalRead(Button1);
statusNacht = !digitalRead(Button2);


groeten Dylan
Märklin C-rail modulebaan met Arduino

dani

inderdaad, klopt...

En wat de helderheid en kleurovergang betreft , kan je met je RGB waarden verder spelen.

Belagrijk om te onthouden is dat  de VERHOUDING   rood-groen-blauw bepalend is voor de eigenlijke kleur, terwijl de WAARDE van Rood-Groen-Blauw de helderheid bepaalt.

Voro elke parameter (R,;G en B) is de waarde van belang.

Test het eens uit : neem een verhouding van 3:0:1  voor R-G-B

stel eerst in ôp   RGB waarde       120-0-40      (juiste verhouding, lage intensiteit)
stel daarna in op RGB waarde      240-0-80   (zelfde verhouding, hoge intensiteit)

In principe zou de kleur ongeveer dezelfde zijn, maar bij de tweede" setting is het licht helderder.

Nu kan het wel zijn dat door afwijkingen in de LEDs de kleur toch wat verschillend is... maar dat zou in theorie verwaarloosbaar zijn.
De praktijk toont echter andere resultaten, alnaargelang welke LEDs je hebt.
De kruik is te water gegaan...
De kruik is niet meer.

Ajean

@ Dani,

Bedankt voor het me op weg helpen wat betreft helderheid en kleurovergang.

Om te kunnen experimenteren heb ik de onderstaande sketch geschreven en deze voldoet aan mijn verwachtingen.
Alleen de overgang van de ene helderheid c.q. kleur naar de andere vind ik iets te abrupt. Graag zou ik deze wat vloeiender willen hebben (fade in, fade out)
Ik ben op internet gaan rondneuzen en heb m. i. wel wat gevonden http://danne.stayskal.com/software/fastfader/ maar ik snap de programmeerregels niet en weet ze dus ook niet toe te passen in mijn sketch.
Of zijn er nog andere oplossingen?
Alvast bedankt voor het meedenken.

Groeten,

Adri

Experimenteer sketch:

#include "FastLED.h"


// How many leds in your strip?
#define NUM_LEDS 8
// For led chips like Neopixels, which have a data line, ground, and power, you just
// need to define DATA_PIN.  For led chipsets that are SPI based (four wires - data, clock,
// ground, and power), like the LPD8806 define both DATA_PIN and CLOCK_PIN
#define DATA_PIN 6
#define BRIGHTNESS 30
// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
    FastLED.addLeds<NEOPIXEL, DATA_PIN, RGB>(leds, NUM_LEDS);
    FastLED.setBrightness( BRIGHTNESS );
    }

void loop(){
   // Turn the LED off, then pause
   leds[0].setRGB(0,0,0);
   leds[1].setRGB(0,0,0);
   leds[2].setRGB(0,0,0);
   leds[3].setRGB(0,0,0);
   leds[4].setRGB(0,0,0);
   leds[5].setRGB(0,0,0);
   leds[6].setRGB(0,0,0);
   leds[7].setRGB(0,0,0);
   FastLED.show();
   delay(2000);
  // Turn the LED on, then pause
   leds[0].setRGB(60,0,20);
   leds[1].setRGB(60,0,20);
   leds[2].setRGB(60,0,20);
   leds[3].setRGB(60,0,20);
   leds[4].setRGB(60,0,20);
   leds[5].setRGB(60,0,20);
   leds[6].setRGB(60,0,20);
   leds[7].setRGB(60,0,20);
   FastLED.show();
   delay(5000);
  // Turn the LED on, then pause
   leds[0].setRGB(120,0,40);
   leds[1].setRGB(120,0,40);
   leds[2].setRGB(120,0,40);
   leds[3].setRGB(120,0,40);
   leds[4].setRGB(120,0,40);
   leds[5].setRGB(120,0,40);
   leds[6].setRGB(120,0,40);
   leds[7].setRGB(120,0,40);
   FastLED.show();
   delay(5000);
  // Turn the LED on, then pause
   leds[0].setRGB(180,0,60);
   leds[1].setRGB(180,0,60);
   leds[2].setRGB(180,0,60);
   leds[3].setRGB(180,0,60);
   leds[4].setRGB(180,0,60);
   leds[5].setRGB(180,0,60);
   leds[6].setRGB(180,0,60);
   leds[7].setRGB(180,0,60);
   FastLED.show();
   delay(5000);
  // Turn the LED on, then pause
   leds[0].setRGB(240,0,80);
   leds[1].setRGB(240,0,80);
   leds[2].setRGB(240,0,80);
   leds[3].setRGB(240,0,80);
   leds[4].setRGB(240,0,80);
   leds[5].setRGB(240,0,80);
   leds[6].setRGB(240,0,80);
   leds[7].setRGB(240,0,80);
   FastLED.show();
   delay(5000);
   }



Ajean

Hallo,

Na veel pogingen is het me nog steeds niet gelukt om per led de overgang van de ene kleur naar een anderen vloeiend te laten verlopen. De abrupte wisseling van kleur is nog steeds duidelijk te zien.
Dit zelfde geld voor de wisseling van helderheid

In de library van zowel Adafruit_NeoPixel als die van FastLed zijn voorbeelden te vinden waarin deze overgang wel vloeiend gebeurt.

In de bijbehorende sketches is me echter niet duidelijk met welke programregel(s) dit aangestuurd wordt.

Wellicht basiskennis maar mijn programmeer ervaring ligt in een ver verleden en was vooral database gericht (Clipper) en is daarom wat roestig.

Graag hulp.

Groeten,

Adri

Gerolf

Kan je die waarden in setrgb niet vervangen door variabelen, en die met een for ... next doen overvloeien?
Groeten uit "Marche-en-Bières"   ** Modelspoor is plezant **   TPIII-H0-DC-Zelfbouw