Bon, ben c'est pas simple ! :
Protocol
These LED strips are controlled by a simple, high-speed one-wire protocol on the input signal line. The protocol is documented in the WS2812B datasheet (266k pdf) and also below.
The default, idle state of the signal line is low. To update the LED colors, you need to transmit a series of high pulses on the signal line. Each high pulse encodes one bit: a short pulse (0.35 μs) represents a zero, while a long pulse (0.9 μs) represents a one. The time between consecutive rising edges should be 1.25 μs (though in our tests, the strips worked with cycle times up to approximately 6 μs). After the bits are sent, the signal line should be held low for 50 μs to send a reset command, which makes the new color data take effect (note: it is possible for low pulses as short as 6 μs to trigger a reset). The pulse widths do not have to be precise: there is a threshold that determines whether the pulse is a 0 or a 1, and a wide range of pulse widths on both sides of the threshold will work.
WS281x RGB data timing diagram.
The color of each LED is encoded as three LED brightness values, which must be sent in GRB (green-red-blue) order. Each brightness value is encoded as a series of 8 bits, with the most significant bit being transmitted first, so each LED color takes 24 bits. The first color transmitted applies to the LED that is closest to the data input connector, while the second color transmitted applies to the next LED in the strip, and so on.
24 bits represent the color of one WS2812B LED in an addressable WS2812B RGB LED strip.
To update all the LEDs in the strip, you should send all the colors at once with no pauses. If you send fewer colors than the number of LEDs on the strip, then some LEDs near the end of the strip will not be updated. For example, to update all 30 LEDs on a 1-meter strip, you would send 720 bits encoded as high pulses and then hold the signal line low for 50 μs. If multiple strips are chained together with their data connectors, they can be treated as one longer strip and updated the same way (two chained 1-meter strips behave the same as one 2-meter strip).
Each RGB LED receives data on its data input line and passes data on to the next LED using its data output line. The high-speed protocol of the WS2812B allows for fast updates; our library for the Arduino below takes about 1.1 ms to update 30 LEDs, so it is possible to update 450 LEDs faster than 60 Hz. However, constant updates are not necessary; the LED strip can hold its state indefinitely as long as power remains connected.
Implementing the protocol on a microcontroller
Since this LED strip does not use a standard protocol, a software bit-banging approach is usually needed to control it from a microcontroller. Because of the sub-microsecond timing, the bit-banging code generally needs to be written in assembly or very carefully optimized C, and interrupts will need to be disabled while sending data to the LED strip. If the interrupts in your code are fast enough, they can be enabled during periods where the signal line is low.
Note: The minimum logic high threshold for the strip data line is 3.5 V, so you should use level-shifters if you want to control these strips from 3.3 V systems. In our tests, we were able to control them with 3.3 V signals from an mbed, but using the strip out of spec like this could lead to unexpected problems.
Sample code
To help you get started quickly, we provide sample code for these microcontroller platforms:
PololuLedStrip Arduino library (also works with our Arduino-compatible A-star modules)
Example AVR C code
PololuLedStrip mbed library
Additionally, the Adafruit NeoPixel library for Arduino should work with these strips since the NeoPixels are based on the WS2812B.
Comparison with TM1804 LED Strips
These WS2812B-based strips are similar in many ways to our older high-speed TM1804 LED strips (items #2543, #2544, and #2545). The WS2812B’s timing parameters are very similar to those of the high-speed TM1804 LED strips, so you can use the same code to control either of them and you can chain one type to the other. However, the two types of strips have different, incompatible connectors, and the order of the red and green channels in the protocol is swapped: the TM1804 colors are sent in red-green-blue order while the WS2812B colors are sent in green-red-blue order.
The TM1804 is just an LED driver and it requires a separate RGB LED to be placed on the strip. Since the WS2812B combines the LED and the driver in a single package, it can be packed more densely, which is why we are able to offer strips with 60 LEDs per meter.
Unlike the TM1804 strips, these LED strips do not have an adhesive backing, but they do include mounting brackets as described above.
Comparison with APA102C LED Strips
Like the WS2812B, the APA102C used in some of our newer LED strips also combines an RGB LED and driver into a single 5050-size package, allowing them to be packed as densely as 144 LEDs per meter. However, while the WS2812B uses a one-wire control interface with strict timing requirements (timing requirements so strict that it is typically impractical to have interrupt-based events running on the controlling microcontroller while it is updating the WS2812B LEDs), the APA102C uses a standard SPI interface, with separate data and clock signals, that lets it accept a wide range of communication rates; the trade-off is that two I/O lines are required to control it instead of just one.
The APA102C provides a 5-bit color-independent brightness control that is not available on the WS2812B. This feature can be used to vary the intensity of each pixel without changing its color, and it enables much subtler variations at the low end of the LEDs’ brightness range.
In addition, the APA102C uses a much higher PWM (pulse-width modulation) frequency for controlling each color channel—about 20 kHz, compared to around 400 Hz on the WS2812B. As a result, APA102C LEDs can be less prone to flickering when recorded with a camera and are more suited to applications like persistence-of-vision (POV) displays. (The color-independent brightness is modulated separately at about 600 Hz).
For further comparison of the ICs, see the WS2812B datasheet (266k pdf) and APA102C datasheet (1MB pdf).
While our WS2812B strips and APA102C strips are physically very similar, they are not functionally compatible with each other. The easiest way to tell them apart is to look at the strips’ end connectors and the connections between each LED segment: WS2812B strips have three connections (power, data, and ground), while APA102C strips have four (power, clock, data, and ground). On strips with 30 LEDs/m, you can also check whether “WS2812B” or “APA-102C” is printed next to each LED.
|