Skip to main content

Userspace Raspberry Pi PWM/PCM/SPI library for SK6812 and WS281X LEDs.

Project description

Userspace Raspberry Pi library for controlling WS281X LEDs. This includes WS2812 and SK6812RGB RGB LEDs Preliminary support is now included for SK6812RGBW LEDs (yes, RGB + W) The LEDs can be controlled by either the PWM (2 independent channels) or PCM controller (1 channel) or the SPI interface (1 channel).

Background:

The BCM2835 in the Raspberry Pi has both a PWM and a PCM module that are well suited to driving individually controllable WS281X LEDs. Using the DMA, PWM or PCM FIFO, and serial mode in the PWM, it’s possible to control almost any number of WS281X LEDs in a chain connected to the appropriate output pin. For SPI the Raspbian spidev driver is used (/dev/spidev0.0). This library and test program set the clock rate to 3X the desired output frequency and creates a bit pattern in RAM from an array of colors where each bit is represented by 3 bits as follows.

Bit 1 - 1 1 0
Bit 0 - 1 0 0

GPIO Usage:

The GPIOs that can be used are limited by the hardware of the Pi and will vary based on the method used to drive them (PWM, PCM or SPI). Beware that the GPIO numbers are not the same as the physical pin numbers on the header.

PWM:

PWM0, which can be set to use GPIOs 12, 18, 40, and 52.
Only 12 (pin 32) and 18 (pin 12) are available on the B+/2B/3B

PWM1 which can be set to use GPIOs 13, 19, 41, 45 and 53.
Only 13 is available on the B+/2B/PiZero/3B, on pin 33

PCM:

PCM_DOUT, which can be set to use GPIOs 21 and 31.
Only 21 is available on the B+/2B/PiZero/3B, on pin 40.

SPI:

SPI0-MOSI is available on GPIOs 10 and 38.
Only GPIO 10 is available on all models.
See also note for RPi 3 below.

Power and voltage requirements

WS281X LEDs are generally driven at 5V. Depending on your actual LED model and data line length you might be able to successfully drive the data input with 3.3V. However in the general case you probably want to use a level shifter to convert from the Raspberry Pi GPIO/PWM to 5V.

It is also possible to run the LEDs from a 3.3V - 3.6V power source, and connect the GPIO directly at a cost of brightness, but this isn’t recommended.

The test program is designed to drive a 8x8 grid of LEDs e.g.from Adafruit (http://www.adafruit.com/products/1487) or Pimoroni (https://shop.pimoroni.com/products/unicorn-hat). Please see the Adafruit and Pimoroni websites for more information.

Know what you’re doing with the hardware and electricity. I take no reponsibility for damage, harm, or mistakes.

Important warning about DMA channels

You must make sure that the DMA channel you choose to use for the LEDs is not already in use by the operating system.

For example, using DMA channel 5 will cause filesystem corruption on the Raspberry Pi 3 Model B. See: https://github.com/jgarff/rpi_ws281x/issues/224

The default DMA channel (10) should be safe for the Raspberry Pi 3 Model B, but this may change in future software releases.

Limitations:

PWM

Since this library and the onboard Raspberry Pi audio both use the PWM, they cannot be used together. You will need to blacklist the Broadcom audio kernel module by creating a file /etc/modprobe.d/snd-blacklist.conf with

blacklist snd_bcm2835

If the audio device is still loading after blacklisting, you may also need to comment it out in the /etc/modules file.

On headless systems you may also need to force audio through hdmi Edit config.txt and add:

hdmi_force_hotplug=1
hdmi_force_edid_audio=1

A reboot is required for this change to take effect

Some distributions use audio by default, even if nothing is being played. If audio is needed, you can use a USB audio device instead.

PCM

When using PCM you cannot use digital audio devices which use I2S since I2S uses the PCM hardware, but you can use analog audio.

SPI ~~

When using SPI the ledstring is the only device which can be connected to the SPI bus. Both digital (I2S/PCM) and analog (PWM) audio can be used.

Many distributions have a maximum SPI transfer of 4096 bytes. This can be changed in /boot/cmdline.txt by appending

spidev.bufsiz=32768

On a RPi 3 you have to change the GPU core frequency to 250 MHz, otherwise the SPI clock has the wrong frequency. Do this by adding the following line to /boot/config.txt and reboot.

core_freq=250

SPI requires you to be in the gpio group if you wish to control your LEDs without root.

Comparison PWM/PCM/SPI

Both PWM and PCM use DMA transfer to output the control signal for the LEDs. The max size of a DMA transfer is 65536 bytes. Since each LED needs 12 bytes (4 colors, 8 symbols per color, 3 bits per symbol) this means you can control approximately 5400 LEDs for a single strand in PCM and 2700 LEDs per string for PWM (Only PWM can control 2 independent strings simultaneously) SPI uses the SPI device driver in the kernel. For transfers larger than 96 bytes the kernel driver also uses DMA. Of course there are practical limits on power and signal quality. These will be more constraining in practice than the theoretical limits above.

When controlling a LED string of 240 LEDs the CPU load on the original Pi 2 (BCM2836) are: PWM 5% PCM 5% SPI 1%

4.2.3

  • Fix: Added support for Pi 4 Rev 1.2 - 0xa03112, 0xb03112, 0xc03112

4.2.2

  • Fix: Fixed Slice support when setting pixels

  • New: Added support for Revision 0xa02083

  • New: Added support for Revision 0xa22083

4.2.1

  • Fix: Added white colour channel to Color()

4.2.0

  • New: Added support for Raspberry Pi 4

4.1.0

  • New: Added support for the Pi 3A+

  • Fix: Bugfix for ARM64 support

4.0.0

  • Warning: Removed “neopixel” module from this library, use “rpi_ws281x” instead, see #8

3.1.0

  • New: Exposed all contents of ws for easy access to strip_type constants

  • Fix: Matched functionality of upstream legacy library by supporting strip_type

  • Note: Default strip type is WS2811_STRIP_GRB

3.0.7

  • New: Added support for Pi 3B+

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

rpi_ws281x-4.2.3.tar.gz (66.1 kB view details)

Uploaded Source

Built Distributions

rpi_ws281x-4.2.3-cp37-cp37m-linux_armv7l.whl (104.7 kB view details)

Uploaded CPython 3.7m

rpi_ws281x-4.2.3-cp35-cp35m-linux_armv7l.whl (110.6 kB view details)

Uploaded CPython 3.5m

rpi_ws281x-4.2.3-cp34-cp34m-linux_armv7l.whl (90.3 kB view details)

Uploaded CPython 3.4m

rpi_ws281x-4.2.3-cp27-cp27mu-linux_armv7l.whl (89.0 kB view details)

Uploaded CPython 2.7mu

File details

Details for the file rpi_ws281x-4.2.3.tar.gz.

File metadata

  • Download URL: rpi_ws281x-4.2.3.tar.gz
  • Upload date:
  • Size: 66.1 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.3

File hashes

Hashes for rpi_ws281x-4.2.3.tar.gz
Algorithm Hash digest
SHA256 265a395410cc7199f779c4209ca3970b7211896b86dbaa4731bdc3569d2e595f
MD5 17a714941043621e81f592e6a137dd92
BLAKE2b-256 036c46fad1bace9d5917190fd76e1550ec6727010cff6d3e5818b8c3a5405ba3

See more details on using hashes here.

File details

Details for the file rpi_ws281x-4.2.3-cp37-cp37m-linux_armv7l.whl.

File metadata

  • Download URL: rpi_ws281x-4.2.3-cp37-cp37m-linux_armv7l.whl
  • Upload date:
  • Size: 104.7 kB
  • Tags: CPython 3.7m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/2.0.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/43.0.0 requests-toolbelt/0.9.1 tqdm/4.36.1 CPython/3.7.3

File hashes

Hashes for rpi_ws281x-4.2.3-cp37-cp37m-linux_armv7l.whl
Algorithm Hash digest
SHA256 de182acceab047030056e2ab0dd2bd2632f2375f60d9a94cf7e3a8a4033834a0
MD5 4b1361f72706955de7c42d5480acaec5
BLAKE2b-256 f9e313390da99f1741683bbf8f1d44f2960da736a34d848f220479ce4726345b

See more details on using hashes here.

File details

Details for the file rpi_ws281x-4.2.3-cp35-cp35m-linux_armv7l.whl.

File metadata

  • Download URL: rpi_ws281x-4.2.3-cp35-cp35m-linux_armv7l.whl
  • Upload date:
  • Size: 110.6 kB
  • Tags: CPython 3.5m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.3

File hashes

Hashes for rpi_ws281x-4.2.3-cp35-cp35m-linux_armv7l.whl
Algorithm Hash digest
SHA256 185d7ae138a5633cf4cd707c55d7190b34810cc3f5e5682c820ddf1dade20914
MD5 e1c23e082cbf954167042a5fb9563b4c
BLAKE2b-256 a6135a5290467f47b69eb0564c7fdd21f00d578f029d1ee5c088ca9c30c51b34

See more details on using hashes here.

File details

Details for the file rpi_ws281x-4.2.3-cp34-cp34m-linux_armv7l.whl.

File metadata

  • Download URL: rpi_ws281x-4.2.3-cp34-cp34m-linux_armv7l.whl
  • Upload date:
  • Size: 90.3 kB
  • Tags: CPython 3.4m
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.3

File hashes

Hashes for rpi_ws281x-4.2.3-cp34-cp34m-linux_armv7l.whl
Algorithm Hash digest
SHA256 544f09353ccb578452d0478470460d3425f40e8dd7433131a95239daeae83303
MD5 76811cf0eee80a811c956cc861d1b083
BLAKE2b-256 99b9bcc8f6437076ab59607c00c2c1fe3faad8bb914f8abb08ed1f1c52bc38fe

See more details on using hashes here.

File details

Details for the file rpi_ws281x-4.2.3-cp27-cp27mu-linux_armv7l.whl.

File metadata

  • Download URL: rpi_ws281x-4.2.3-cp27-cp27mu-linux_armv7l.whl
  • Upload date:
  • Size: 89.0 kB
  • Tags: CPython 2.7mu
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/1.13.0 pkginfo/1.5.0.1 requests/2.22.0 setuptools/41.0.1 requests-toolbelt/0.9.1 tqdm/4.32.2 CPython/3.5.3

File hashes

Hashes for rpi_ws281x-4.2.3-cp27-cp27mu-linux_armv7l.whl
Algorithm Hash digest
SHA256 bc3a22e55c2a10de5c4dfb23c13dceff66162e77eb7176701f1a0d5ae8b97695
MD5 89579638dacd7c76b7af6611fedf0bca
BLAKE2b-256 e116c405abf9a7e3ab890c41255cbe77aacdcf592760fb7cbee7ff533d598554

See more details on using hashes here.

Supported by

AWS AWS Cloud computing and Security Sponsor Datadog Datadog Monitoring Fastly Fastly CDN Google Google Download Analytics Microsoft Microsoft PSF Sponsor Pingdom Pingdom Monitoring Sentry Sentry Error logging StatusPage StatusPage Status page