Ledstrips


De ledstrip op de afbeelding heeft links een rode led, dan een uit, de derde van links is groen en de rechter is oranje.
Er zijn ledstrips waarvan de leds een vaste kleur hebben, ledstrips met RGB mogelijkheid waardoor de hele strip leds van kleur kan veranderen en er zijn ledstrips waarvan je elke led onafhankelijk de kleur en de intentieteid kan instellen.
Die laatst genoemde ledstrip heeft bij elke led op de strip een IC.
De ledstrips zijn voorzien van doorknip punten waar je de ledstrip op lengte kan inkorten. Die afknip punten zijn dan meteen ook de mogelijke verbindt punten. Even de eventuele beschermlaag verwijderen en draadjes aan solderen.
Sluit die ledstrips nu niet rechtstreeks aan je Arduino of ESP6266. Het vermogen dat de ledstrip kan trekken is vaak te groot voor de maximale uitgang vermogen van de Arduino en ESP8266. Per led kan 20mA per kleur getrokken worden met 3 kleuren dus 60 mA terwijl de Arduino max. 50 mA per poort aan kan.
Leds kunnen voorzien zijn van een voorschakel weerstand zodat ze een hogere spanning aan kunnen. Koop je een led strip, kijk dan dus ook met welke voltage je de leds kan laten branden. Scheelt een hoop uitzoek werk.
Met 2 aansluitingen op de strip zijn het vaak 1 kleurige leds die een plus en min verwachten. (Ik ben nog geen wisselstroom leds tegen gekomen.)
Met 3 aansluitingen op de strip zijn het vaak 3 kleurige leds die een plus en een min verwachten en een data puls.
Met 4 aansluitingen op de strip zijn het soms RGB leds met 1 min (of plus) en 3 + banen om de kleuren aan te sturen. Er zijn ook adreseerbare led strips met 4 aansluitingen. Dan, plus, min, klok en data aansluiting.
De getoonde 'bruine Buiten ledstrook' is een uitzondering. 12 Volt aansluiting (staat er niet op) en 4 aansluitingen voor 3x witte led. De strook heeft een beschermlaag en elke led bestaad uit drie maal een witte led. Bij de aansluiting staat duidelijk vermeld RGB. Een gezamelijke plus.De blauw/grijze binnen ledstrook heeft ook een RGB vermelding (is dat ook) en de vermelding 12V +.

Ik kocht bij Wish HC-F5V-30L-30LED-W en kreeg op het zakje de aansluit gegevens. Length 1 m. Voltage 5V. max power 9W, VCC=red Gnd=White en Dat is green. Water afstotend met aansluit verbindingen. En ze kunnen er niet tegen als je ze per ongeluk op 12V aansluit.

Met IC strips

De 1 meter niet waterdichte 5V WS2812B ledstrip wordt in dec.2018 op Ebay aangeboden voor $2,50.
De WS2811 12V voor ca. $2.00.
Er wordt een WS2811 IC in een 5050 led behuizing geplaatst en WS2812 genoemd.

De WS2811 en WS2812 hebben 3 aansluitingen. Plus, min en schakeldraad. Bij mijn draad is dat +5V D0 en Gnd. Netjes aangegeven op de strip. Let er op dat 1 zijde de invoer kant is en de andere zijde de uitvoerkant. Sluit je de uitvoer kant als invoer kant aan dan gebeurt er niets.
Ook dat is aangegeven op de strip met pijltjes.
Je schuift data de ledtrip in, 4 leds is dus 4x 24 bits data inklokken.
Van elke led moet je de intentieteid van de 3 kleuren aangeven.

Aansluiten:
Gebruik b.v. een led strip driver om een ledstip aan te sturen of ULN2003 om direct met poorten de ledstrip aan te sturen. Elke kleur van de RGBled op de ledstrip kan 20 mA trekken. Per led dus (3 kleuren x 20mA) 60 mA, elke Arduino mag max 50 mA per poort leveren. Sluit de V+ dus niet op de 5V out van de Arduino of welke uitgang dan ook. De data kan je wel op de Arduino aansluiten, ik raad wel aan om zo'n 500 Ohm voorschakelweerstand tussen de Arduino uitgang en de ledstrip D te monteren voor bescherming van de Arduino.


Niet programeerbare ledstrips:
Het aansturen is niet zo bijzonder, de R G B via b.v. de PWM uitgangen van een Arduino. De ledstrip krijgt meestal de + via de voeding en de - schakel je. Voor rechtstreekse aansturing is de ULN2003 ideaal. Aansturen via TX RX is hier beschreven.

Programeerbare ledstrips:
Nu hebben de meeste programeerbare leds, 5V voeding nodig en de Arduino ook. Je kan dus wel de Arduino van spanning voorzien 5V in die gelijk is aan de spanning voor de ledstrip.
Tijdens het programeren gebruik je de USB van de PC en een extra voeding voor de ledstrip.
De strip heeft een ingang en een uitgang. vermoedelijk zie je pijltjes bij de letters V+ D Gnd. De pijltjes wijzen de ledstrip in (ingang) of de ledstrip uit (uitgang bedoeld om een doorkoppeling naar de volgende ledstrip te maken).
De ingang moet je gebruiken voor de Arduino de ledstrip te laten bedienen. Gebeurt er niets? Kijk dan of je per ongeluk de verkeerde kant van de ledstrip aangesloten heb.
Meestal werkt het makkelijker met een library, in dit geval FastLed.
Download de fastLed library door op deze librarylink te klikken. Rename de library naar FastLED en plaats het in de Arduino library, vermoedelijk ergens in c://programfiles(x86)/arduino/library.
Start de Arduino IDE (opnieuw) en wacht tot alle updates klaar zijn. Via bestand voorbeelden fastLED laadt je b.v. colorPallette.
Ledpin is de Arduino uitgang pin.
Numleds is aantal leds op de strip.
De Engelstalige handleiding is op Gidhub te vinden met de link onder aan deze pagina.
Een simpele voorbeeld sketch is blink, door de Leds[0] te veranderen in een volgend getal [1] kan je elke led afzonderlijk bedienen. Onthoud dat 0 de eerste led is.

leds[0] = CRGB::Red;
leds[1] = CRGB::Green;
leds[2] = CRGB::Blue;
leds[3] = CRGB::Green;
FastLED.show();
delay(500);

// Now turn the LED off, then pause
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.show();
delay(500);
Met Fastled kan je dus een enkele led bedienen.
het 2e object is FastLED zelf voor elke led(strip) die je aansluit. Je deeld aan FastLED mede welke chipset, welke pinnen aangesloten zijn, hoeveel LEDs aangesloten zijn en wat CRGB array gebruikt moet worden bij die leds.

void setup() {
//Fast LED.addLeds<CHIPSET,6>(leds, NUM_LEDS);
Fast LED.addLeds<WS2812,5>(leds,4);
}
Daarna moet je op bepaalde momenten aangeven als je de leds wil tonen.
FastLED.show();

Maar nu kan een led alleen vooraf ingestelde kleuren tonen. Wil je jouw eigen intentietijd instellen per led:

leds[i].r = 25;
leds[i].g = 25;
leds[i].b = 25;
Nu kan je de intensiteit per kleur per led aan geven. voor i kan je elke led aan geven in je ledstring en de r g b dus per led bepalen.
Ik heb er het volgende van gemaakt:

// adjusted example 'BLINK' sketch bij Peter Hogenstijn
#include "FastLED.h"

// How many leds in your strip?
#define NUM_LEDS 4

// 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 3
// #define CLOCK_PIN 13

// Define the array of leds
CRGB leds[NUM_LEDS];

void setup() {
// Uncomment/edit one of the following lines for your leds arrangement.
// FastLED.addLeds<WS2811, DATA_PIN, RGB>(leds, NUM_LEDS);
// FastLED.addLeds<WS2812, DATA_PIN, RGB>(leds, NUM_LEDS);
FastLED.addLeds<WS2812B, DATA_PIN, RGB>(leds, NUM_LEDS);

}

void loop() {
// alle leds uit
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.show();
delay(300);
// Turn the LED on, then pause
leds[0].r=10;
leds[0].g=10;
leds[0].b=10;
FastLED.show();
delay(1000);
leds[1].r=10;
leds[1].g=10;
leds[1].b=10;
FastLED.show();
delay(1000);
leds[2].r=10;
leds[2].g=10;
leds[2].b=10;
FastLED.show();
delay(1000);
leds[3].r=10;
leds[3].g=10;
leds[3].b=10;
FastLED.show();
delay(1000);
// leds stuk voor stuk uit
leds[3] = CRGB::Black;
FastLED.show();
delay(1000);
leds[2] = CRGB::Black;
FastLED.show();
delay(1000);
leds[1] = CRGB::Black;
FastLED.show();
delay(1000);
leds[0] = CRGB::Black;
FastLED.show();
delay(1000);

leds[0] = CRGB::Black;
leds[1] = CRGB::Red;
leds[2] = CRGB::Green;
leds[3] = CRGB::Black;
FastLED.show();
delay(500);

// Now turn the LED off, then pause
leds[0] = CRGB::Red;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Green;
FastLED.show();
delay(500);
leds[0] = CRGB::Red;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Green;
FastLED.show();
delay(500);
// alle leds uit
leds[0] = CRGB::Black;
leds[1] = CRGB::Black;
leds[2] = CRGB::Black;
leds[3] = CRGB::Black;
FastLED.show();
delay(300);
leds[0] = CRGB::Red;
FastLED.show();
delay(500);
leds[0] = CRGB::Black;
leds[1] = CRGB::Red;
FastLED.show();
delay(500);
leds[1] = CRGB::Black;
leds[2] = CRGB::Red;
FastLED.show();
delay(500);
leds[2] = CRGB::Black;
leds[3] = CRGB::Red;
FastLED.show();
delay(500);
leds[3] = CRGB::Blue;
FastLED.show();
delay(500);
leds[2] = CRGB::Blue;
leds[3] = CRGB::Black;
FastLED.show();
delay(500);
leds[1] = CRGB::Blue;
leds[2] = CRGB::Black;
FastLED.show();
delay(500);

leds[0] = CRGB::Blue;
leds[1] = CRGB::Black;
FastLED.show();
delay(500);
leds[0] = CRGB::Green;
FastLED.show();
delay(300);
leds[0] = CRGB::Black;
leds[1] = CRGB::Green;
FastLED.show();
delay(300);
leds[1] = CRGB::Black;
leds[2] = CRGB::Green;
FastLED.show();
delay(300);
leds[2] = CRGB::Black;
leds[3] = CRGB::Green;
FastLED.show();
delay(300);
}

Een beetje meer informatie over FastLed vind je op de fastled handleiding (Eng.talig) bij de link onderaan deze pagina.


Achtergrond informatie:
De datasheet van de WS2812 geeft aan dat je voor elke kleur per led 8 bits moet gebruiken. Dus 3 kleuren x 8 bits = 24 bits per led. Dan geeft de datasheet aan dat je 50 ms (microseconden (1 miljoenste seconde)) moet wachten voor je de volgende in klokt.Die rusttijd voor inklokken zal bij de 2801 wel anders zijn.
After the pixel power-on reset, the DIN port receive data from controller, the first pixel collect initial 24bit data then sent to the internal data latch, the other data which reshaping by the internal signal reshaping amplification circuit sent to the next cascade pixel through the DO port. After transmission for each pixel,the signal to reduce 24bit. pixel adopt auto resha -ping transmit technology, making the pixel cascade number is not limited the signal transmission, only depend on the speed of signal transmission. Ik moet nu kijken of ik alle leds van de ledstrip achter elkaar moet in klokken en dan 500 ms moet wachten of dat ik na elke led inklokken 50 ms moet wachten. Ik verwacht dat ik alle leds moet inklokken en dan 500 ms moet wachten.
Bij 4 leds, als ik bij de eerste led Groen vol wil laten oplichten FF0000 , bij de tweede led rood vol wil laten oplichten 00FF00, derde led blauw 0000FF en vierde led alles wil laten oplichten FFFFFF dus vermoedelijk moet ik digitaal 1111 1111 0000 0000 0000 0000 rust versturen.
Hier heb ik al aangegeven waarom binair 1111 1111 (decimaal 255), hexadecimaal FF is. Op Pololu vind ik het antwoord, ik moet de data voor alle leds in de string tegelijk verzenden. Elke led ontvangt de data van de vorige led en na 50 mS rust gaat hij het uitvoeren. De Arduino gebruikt ca 1.1mS om de data voor 30 leds in te klokken. Dat houdt in dat je ongeveer 450 Leds op een ledstring kan benaderen zonder in de problemen te komen.
Minimale spanning is 3,5V dus als je een ESP8266 wil gebruiken is een levelshifter beslist aan te raden. Echter er zijn redelijk goede ervaringen met 3,3V aansturing.
Bij Pololu geeft men aan dat een 40 mS rust was voldoende voor het data inlezen in de Led.

Zonder library uitproberen:
Met de library (er zijn er 3 te vinden op internet, ik gebruik Fastleds.) dus een hele mooie licht show.
Om eens te kijken hoe het werkt wil ik ook zonder library een ledstrip laten werken.
De versie zonder library voor de 2801, dus niet voor de WS2812!!. Gevonden bij Arduino forum


// based on: Nathan Seidle SparkFun Electronics 2011
// adjusted: Peter Hogenstijn 2018
int ledPin = 13; //On board LED
int data = 5; // data aansluiting van ledstring
#define STRIP_LENGTH 4 //4 LEDs on this strip
long strip_colors[STRIP_LENGTH];

void setup() {
pinMode(data, OUTPUT);
pinMode(ledPin, OUTPUT);

//Clear out the array
for(int x = 0 ; x < STRIP_LENGTH ; x++)
strip_colors[x] = 0;
randomSeed(analogRead(0));
}


void loop() {
//Pre-fill the color array with known values
strip_colors[0] = 0xFF0000; //Bright Red
strip_colors[1] = 0x00FF00; //Bright Green
strip_colors[2] = 0x0000FF; //Bright Blue
strip_colors[3] = 0x010000; //Faint red
strip_colors[4] = 0x800000; //1/2 red (0x80 = 128 out of 256)
post_frame(); //Push the current color frame to the strip

delay(2000);

while(1){ //Do nothing
addRandom();
post_frame(); //Push the current color frame to the strip

digitalWrite(ledPin, HIGH); // set the LED on
delay(250); // wait for a second
digitalWrite(ledPin, LOW); // set the LED off
delay(250); // wait for a second
}

}
//Throws random colors down the strip array
void addRandom(void)
{
int x;

//First, shuffle all the current colors down one spot on the strip
for(x = (STRIP_LENGTH - 1) ; x > 0 ; x--)
strip_colors[x] = strip_colors[x - 1];

//Now form a new RGB color
long new_color = 0;
for(x = 0 ; x < 3 ; x++){
new_color <<= 8;
new_color |= random(0xFF); //Give me a number from 0 to 0xFF
//new_color &= 0xFFFFF0; //Force the random number to just the upper brightness levels. It sort of works.
}

strip_colors[0] = new_color; //Add the new random color to the strip
}
//Takes the current strip color array and pushes it out
void post_frame (void)
{
//Each LED requires 24 bits of data
//MSB: R7, R6, R5..., G7, G6..., B7, B6... B0
//Once the 24 bits have been delivered, the IC immediately relays these bits to its neighbor
//Pulling the clock low for 500us or more causes the IC to post the data.
// kijk voor welke led het bedoeld is
for(int LED_number = 0 ; LED_number < STRIP_LENGTH ; LED_number++)
{
long this_led_color = strip_colors[LED_number]; //24 bits of color data
// zet de kleur goed
for(byte color_bit = 23 ; color_bit != 255 ; color_bit--)
{
//Feed color bit 23 first (red data MSB)
long mask = 1L << color_bit;
//The 1'L' forces the 1 to start as a 32 bit number, otherwise it defaults to 16-bit.

if(this_led_color & mask)
digitalWrite(data, HIGH);
else
digitalWrite(data, LOW);
}
}

//Pull clock low to put strip into reset/post mode
//digitalWrite(CKI, LOW);
delayMicroseconds(500); //Wait for 500us to go into reset
}

Bovenstaande door mij aangepaste sketch voor de WS2812, van Nathan Seidle, voor de 2801 geeft aan 500 ms rust en de datasheet van de WS2812 geeft aan 50 ms. Ik krijg als resultaat uit de bovenstaande sketch een rood knipperlicht en 2x gedimde rode leds.
De data wordt ingeklokt met digitalWrite.
Ik heb rode leds en 2x knipperende rode leds dus 3x data ingevoerd over 4 leds. Dat klopt met de verwachting maar niet dat ik alleen rood zie, Ik wil ook andere kleuren zien.

for(byte color_bit = 23 ; color_bit != 255 ; color_bit--)
{
//Feed color bit 23 first (red data MSB)
long mask = 1L << color_bit;
//The 1'L' forces the 1 to start as a 32 bit number, otherwise it defaults to 16-bit.

if(this_led_color & mask)
digitalWrite(data, HIGH);
else
digitalWrite(data, LOW);
}
Dit sketch deel is me onduidelijk, color_bit = 23 snap ik (24 bits per led) maar als color_bit geen 255 is dan is color_bit leeg?
Vervolgens een masker voor color_bit die 32 bits nummer moet geven i.p.v. 16 bits nummer om de data of hoog door te geven of laag.
Dat masker deel heb ik bij Arduino nog niet eerder gezien.

Eens kijken met andere aansturingen
Dus TX (digitaal1 aan de data van de ledstrip.
Voeding in orde maken en een programma laden.


void setup() {
// put your setup code here, to run once:
Serial.begin(9600);
}

void loop() {

Serial.write ("FF 00 00 00 FF 00 00 00 FF FF FF FF",HEX);

delay(50);
}

Ik krijg rood knipperende leds, dus niet wat ik verwacht maar wel meer dan niets.;-)
Vermoedelijk moet ik dus die poort rechtstreeks aansturen daar heb ik hier al eens over geschreven.
Dan het volgende uit proberen:


/* Aansturen via poort digitaal 13
van een RGB ledketen SW2812
experiment P.Hogenstijn
*/
void setup()
{
Serial.begin(9600);
}
void loop()
{
// 4 Leds x 24 bits = 96 bits
for(int i=0; i<96; I++)
{
// alles aan
PORTB |=_BV(PB5);

}
delay(10000)
for(int i=0; i<96; I++)
{
// alles uit
PORTB &=~_BV(PB5);
}
delay(10000)
}

En helemaal niets te zien. Met andere woorden, het is me nog niet gelukt om de lichtstrip zonder library aan te sturen.


Bronnen:
engineerathome.com
learn.adafruit.com
customfx.nl

Programeerbare IC strips

Op tweaking4all.nl (zie link) staat het allemaal erg mooi beschreven.
Bronnen:
fastled handleiding
Fast leds demo
howtomechatronics.com
tweaking4all.nl
randomnerdtutorials.com
tested.com
Arduino forum
pololu.com
kleuren instellen