This is the documentation for the latest (main) development branch of Zephyr. If you are looking for the documentation of previous releases, use the drop-down menu on the left and select the desired version.

WS2812 LED strip

Overview

This sample application demonstrates basic usage of the WS2812 LED strip driver, for controlling LED strips using WS2812, WS2812b, SK6812, Everlight B1414 and compatible driver chips.

Requirements

  • LED strip using WS2812 or compatible, such as the NeoPixel Ring 12 from AdaFruit.

  • Note that 5V communications may require a level translator, such as the 74AHCT125.

  • LED power strip supply. It’s fine to power the LED strip off of your board’s IO voltage level even if that’s below 5V; the LEDs will simply be dimmer in this case.

Wiring

  1. Ensure your Zephyr board, and the LED strip share a common ground.

  2. Connect the LED strip control pin (either I2S SDOUT, SPI MOSI or GPIO) from your board to the data input pin of the first WS2812 IC in the strip.

  3. Power the LED strip at an I/O level compatible with the control pin signals.

Wiring on a thingy52

The thingy52 has integrated NMOS transistors, that can be used instead of a level shifter. The I2S driver supports inverting the output to suit this scheme, using the out-active-low dts property. See the overlay file samples/drivers/led_ws2812/boards/thingy52_nrf52832.overlay for more detail.

Building and Running

This sample’s source directory is samples/drivers/led_ws2812/.

To make sure the sample is set up properly for building, you must:

  • select the correct WS2812 driver backend for your SoC. This currently should be CONFIG_WS2812_STRIP_SPI unless you are using an nRF51 SoC, in which case it will be CONFIG_WS2812_STRIP_GPIO. For the nRF52832, the SPI peripheral might output some garbage at the end of transmissions, and that might confuse older WS2812 strips. Use the I2S driver in those cases.

  • create a led-strip devicetree alias, which refers to a node in your devicetree with a worldsemi,ws2812-i2s, worldsemi,ws2812-spi or worldsemi,ws2812-gpio compatible. The node must be properly configured for the driver backend (I2S, SPI or GPIO) and daisy chain length (number of WS2812 chips).

For example devicetree configurations for each compatible, see samples/drivers/led_ws2812/boards/thingy52_nrf52832.overlay, samples/drivers/led_ws2812/boards/nrf52dk_nrf52832.overlay and samples/drivers/led_ws2812/boards/nrf51dk_nrf51822.overlay.

Some boards are already supported out of the box; see the boards directory for this sample for details.

The sample updates the LED strip periodically. The update frequency can be modified by changing the CONFIG_SAMPLE_LED_UPDATE_DELAY.

Then build and flash the application:

west build -b <board> samples/drivers/led_ws2812
west flash

When you connect to your board’s serial console, you should see the following output:

***** Booting Zephyr OS build v2.1.0-rc1-191-gd2466cdaf045 *****
[00:00:00.005,920] <inf> main: Found LED strip device WS2812
[00:00:00.005,950] <inf> main: Displaying pattern on strip

Supported drivers

This sample uses different drivers depending on the selected board:

I2S driver:

  • thingy52/nrf52832

  • nrf5340dk/nrf5340 (3.3V logic level, a logic level shifter may be required)
    • should work for other boards featuring an nRF5340 host processor

SPI driver:

  • mimxrt1050_evk

  • nrf52dk/nrf52832

  • nucleo_f070rb

  • nucleo_g071rb

  • nucleo_h743zi

  • nucleo_l476rg

GPIO driver (cortex-M0 only):

  • bbc_microbit

  • nrf51dk/nrf51822

References