ESP32 WS2812B library

lbruder
Posts: 14
Joined: Sat Nov 12, 2016 1:51 am

ESP32 WS2812B library

Postby lbruder » Fri Nov 25, 2016 8:40 pm

Hi all,

I've started work on a ESP32 library for driving addressable LEDs. Right now it relies on bit-banging using noploops, but with the RMT library now released, I am planning on focusing to migrate over to that as soon as possible.

I expect the interface to stay the same, but a great amount of work will be done in the led_strip.c file to use the RMT library.

Github is located here: https://github.com/Lucas-Bruder/ESP32_LED_STRIP

Please feel free to contact me with feedback and suggestions. Code isn't the prettiest right now, just wanted to focus on getting it working. If you would like to collaborate on it with me, please let me know!

Lucas

WiFive
Posts: 3529
Joined: Tue Dec 01, 2015 7:35 am

Re: ESP32 WS2812B library

Postby WiFive » Sat Nov 26, 2016 12:39 am

Have you seen https://github.com/FozzTexx/ws2812-demo

But the more the merrier! Thanks for sharing

lbruder
Posts: 14
Joined: Sat Nov 12, 2016 1:51 am

Re: ESP32 WS2812B library

Postby lbruder » Sat Nov 26, 2016 5:13 am

WiFive wrote:Have you seen https://github.com/FozzTexx/ws2812-demo

But the more the merrier! Thanks for sharing
Haven't seen that, thanks for sharing! Will definitely be useful when switching over to RMT on my library, the library for RMT is very overwhelming right now :)

User avatar
kolban
Posts: 1683
Joined: Mon Nov 16, 2015 4:43 pm
Location: Texas, USA

Re: ESP32 WS2812B library

Postby kolban » Sun Nov 27, 2016 12:08 am

Back in October there was a post that first gave reference to using RMT as the driver for NeoPixels (what I will refer to as generic WS2812s) ... that post was found here ... http://esp32.com/viewtopic.php?f=13&t=293.

It is only in the last couple of weeks that drivers for RMT have been released. Combine these with the ESP32 technical reference and the light bulb (figuratively and now literally has come on). I am delighted to report that I used the RMT driver library from C to control timings. By my calculation, the maximum possible resolution is 12.5 nano seconds. For our NeoPixels, the smallest interval we need is 350ns so we are well within specs. I found that having a cheap logic analyzer was invaluable as I could trivially visualize the signals on the output. My analyzer has a max recording rate of 24MHz which means that (in principle) it is accurate to ~50ns which is still in the correct order of being useful for NeoPixels.

I set the clock divisor to be 8 ... which effectively gives me a resolution of 100ns. I was able to set the duration to 1 and measure a length of 100ns, I then set it to 2 and measured 200ns etc etc ...

From there it was all plain sailing and I was able to control the NeoPixel without issue. Again, this is using the RMT driver library. One of the advantages of the driver library that I believe exists is that it takes care of buffer management for us. Since the RMT only has a finite amount of buffer space to hold its current stream of output, an interrupt can fire before the buffer is consumed fully so that it is "replenished" in the background. I "believe" this is handled by the driver library.

Because my sub-hobby of choice is JavaScript, I then added an RMT module to my JavaScript runtime for the ESP32 based on Duktape. This allows me to drive RMT at a high level. For example

Code: Select all

RMT.write(channel, [{level: true, duration: 13}, {level: false, duration: 4}]);
Here I pass in an array of JS objects where each object contains a level and a duration ... the function takes care of driving the RMT drivers correctly passing in the correct data.

With this RMT driver in place, I was able to easily map a NeoPixel abstraction on top of this.
Free book on ESP32 available here: https://leanpub.com/kolban-ESP32

lbruder
Posts: 14
Joined: Sat Nov 12, 2016 1:51 am

Re: ESP32 WS2812B library

Postby lbruder » Sun Nov 27, 2016 1:01 am

kolban wrote:Back in October there was a post that first gave reference to using RMT as the driver for NeoPixels (what I will refer to as generic WS2812s) ... that post was found here ... http://esp32.com/viewtopic.php?f=13&t=293.

It is only in the last couple of weeks that drivers for RMT have been released. Combine these with the ESP32 technical reference and the light bulb (figuratively and now literally has come on). I am delighted to report that I used the RMT driver library from C to control timings. By my calculation, the maximum possible resolution is 12.5 nano seconds. For our NeoPixels, the smallest interval we need is 350ns so we are well within specs. I found that having a cheap logic analyzer was invaluable as I could trivially visualize the signals on the output. My analyzer has a max recording rate of 24MHz which means that (in principle) it is accurate to ~50ns which is still in the correct order of being useful for NeoPixels.

I set the clock divisor to be 8 ... which effectively gives me a resolution of 100ns. I was able to set the duration to 1 and measure a length of 100ns, I then set it to 2 and measured 200ns etc etc ...

From there it was all plain sailing and I was able to control the NeoPixel without issue. Again, this is using the RMT driver library. One of the advantages of the driver library that I believe exists is that it takes care of buffer management for us. Since the RMT only has a finite amount of buffer space to hold its current stream of output, an interrupt can fire before the buffer is consumed fully so that it is "replenished" in the background. I "believe" this is handled by the driver library.

Because my sub-hobby of choice is JavaScript, I then added an RMT module to my JavaScript runtime for the ESP32 based on Duktape. This allows me to drive RMT at a high level. For example

Code: Select all

RMT.write(channel, [{level: true, duration: 13}, {level: false, duration: 4}]);
Here I pass in an array of JS objects where each object contains a level and a duration ... the function takes care of driving the RMT drivers correctly passing in the correct data.

With this RMT driver in place, I was able to easily map a NeoPixel abstraction on top of this.
Awesome, this information definitely helps. After more investigation today, it looks like I'll be using the rmt_write_items function; seems like the easiest way to get the strips working with minimal effort. Don't have a logic analyzer with me currently, so right now I'm doing guess and check :/ If I can't figure it out this way, things will pick up once I get back to work and have access to an oscope.

I would like to get my RMT branch merged in by Friday at the latest. In addition to the led_strip functions, I plan on adding led_wall and led_room libraries so a user can do some cool animations in their rooms where the strip may cover multiple corners on multiple walls in a room.

If anyone would like to contribute, please reach out to me at lbruder@me.com! Could use some help writing some cool animations for people to use :)

lbruder
Posts: 14
Joined: Sat Nov 12, 2016 1:51 am

Re: ESP32 WS2812B library

Postby lbruder » Sun Nov 27, 2016 3:26 am

If anyone has some time, would appreciate help with the library :)

Right now, only the first light is blinking a yellowish color. I haven't been able to get any other leds to light up. Checked out master and everything from that branch still functions correctly with bit-banging, so I know it's not the led strip.

I noticed the IR example doesn't set the duration to '0' at the end to signal the last rtm_item. When I don't add a 0 for the last duration, I've noticed that it takes a good amount longer to finish sending verses adding the 0 packet at the end of the rtm_item array.

https://github.com/Lucas-Bruder/ESP32_L ... rmt_driver

Thank you for any help!
:D

User avatar
kolban
Posts: 1683
Joined: Mon Nov 16, 2015 4:43 pm
Location: Texas, USA

Re: ESP32 WS2812B library

Postby kolban » Sun Nov 27, 2016 4:12 am

My opinion is that without a logic analyzer (for example : http://www.ebay.com/itm/24MHz-8-Channel ... 1685084604) you are working with your eyes closed. I can't stress strongly enough how useful such a tool is married with the skills to use it. If you had one of these you would be able to exactly see the timing pulses sent to the Data IN of your first NeoPixel and, by experience, from there all else fits together. While I realize you may not have one today ... I'd suggest ordering one on-line and then be patient till it arrives.
Free book on ESP32 available here: https://leanpub.com/kolban-ESP32

lbruder
Posts: 14
Joined: Sat Nov 12, 2016 1:51 am

Re: ESP32 WS2812B library

Postby lbruder » Sun Nov 27, 2016 4:22 am

kolban wrote:My opinion is that without a logic analyzer (for example : http://www.ebay.com/itm/24MHz-8-Channel ... 1685084604) you are working with your eyes closed. I can't stress strongly enough how useful such a tool is married with the skills to use it. If you had one of these you would be able to exactly see the timing pulses sent to the Data IN of your first NeoPixel and, by experience, from there all else fits together. While I realize you may not have one today ... I'd suggest ordering one on-line and then be patient till it arrives.
You're absolutely right, I'm just being impatient :)

Edit: Figured it out, silly array indexing bug

Who is online

Users browsing this forum: Google [Bot] and 82 guests