Adafruit NeoPXL8 Friend - 8 x Strands NeoPixel Level Shifter
Since we first started carrying NeoPixels back in 2012, the chainable RGB LEDs have taken over the world. And a big part of that success is due to the simplicity of their wiring - just one data wire, no matter how many pixels you've got. So no surprise they're everywhere, blinking away in art exhibits, maker faire demos, DJ booths, decorations and costumes.
But, at some point, every NeoPixel'er bumps into the constraints of that single-data-wire: the timing is very picky and often time your code has to stop completely so that it can burst out the data without any interruptions. This requirement makes it tough to create fast-update lighting effects, and limits the number of pixels you can drive before other hardware peripherals get attention.
Resident pixel-pro Paint Your Dragon (who coined the name NeoPixel dont-cha-know!) took on this challenge and has succeeded gloriously. By carefully examining the ATSAMD21 and ATSAMD51 datasheet he noticed you could use the Timer 0 in 'waveform' mode, and create 8 unique waveforms over DMA that would handle all the pixel-pushing for you.
Thus is born the NeoPXL8 Arduino library and NeoPXL8 Friend! The library runs on any of our ATSAMD21 (M0) and ATSAMD51 (M4) board and handles all the NeoPixeling for you, up to 8 strands of concurrent DMA output each one can be 250 pixels long for a total of 8 x 250 = 2000 pixels. That leaves you some RAM for your code to run in as well - the theoretical max is 340 pixels per strand but you'd be using all the RAM on the M0 chip.
To make connection easy, this Friend does the level-shifting and logic bootingfor you. All 8 strands have a level shifter that converts the 3.3V logic level to 5V logic, there's even a little switch-cap converter that generates the clean 5V power supply for you. Then a 100 ohm resistor in line after the buffer reduces ringing on long wiring runs.
The breadboard friendly design plugs into your perf board or breadboard, wire up the 8 data lines, ground line and a 3-5V power supply for the level shifter boost (10mA max draw). Out comes beautiful 5V logic for any NeoPixel compatibles.
You get two options for connecting NeoPixels:
- 2 x 8 Header with ground and 5V-logic signal, in pairs
- 2 x RJ-45 'Ethernet' Jacks, with ground and 5V-logic signal per twisted pair. This matches the same wiring as the OctWS2811
The Friend comes as a kit, so you can solder in the headers or jacks however you like. You can even just solder both edges to plug into a breadboard on both sides. Then, of course, you'll also need to provide lots of 5V power to the NeoPixels. Since you'll need many Amps of current, we don't manage that through the Friend - the PCB copper would be too limiting. We recommend using terminal blocks or bus bars to connect all the ground/5V power wires together and powering them from their own chunky 5V supply.
Since we are using TCC0 (Timer 0), we are limited in what pins can be used for NeoPixel output. We recommend using with Arduino Zero or Metro M0 Express, with pins 0-7, that's what our library works best with. On M4 you can use pins 2-7, 10 and 11. You can also use with ItsyBitsy M0 or M4. Check the library example for other pin configurations you can use. If you're using a Feather M0 or M4, we recommend our NeoPXL8 FeatherWing which is more compact and Feather-shaped.
While we designed this specifically for use with our SAMD21 and SAMD51 boards and library, you could use it with other boards like ESP32, Teensy or STM32, for the level shifting capabilities. You'll just have to figure out what NeoPixel driver firmware you can use and what pins are available.