In addition to power and ground connections, each NeoPixel ring has a data-in connection and a data-out connection, thereby allowing you to connect a bunch of them together in series. All of this brings us to the crux of my problem. This morning, I brought one of my rings into work to show to my chum Ivan. When I proudly turned everything on, however, the result wasn't what I had expected. Instead of a glorious rainbow pattern rolling around the ring, all we saw was one lonely NeoPixel giving a very half-hearted attempt to light up.

Ivan immediately bounced over to his office and returned with a multimeter and oscilloscope. It took only a few seconds to discover that we were getting power to the ring, and the programming signal was reaching the ring's data-in pin, but there was no programming signal at the data-out pin. Hang on. I've been thinking about this as a long shift register, but it just struck me that this might not be a good analogy. Maybe we shouldn't see anything at the data-out pin unless we modify the program to behave as though there were more NeoPixels in the chain. (Hmmm... I'll have to go back and experiment further.)

It may well be that I accidently blew out the input stage to the first NeoPixel in the chain by electrostatic discharge (ESD). However, Ivan also pointed out that we were seeing a lot of overshoot and undershoot on the programming signal, as seen in the oscilloscope screenshot below.

In order to address this, we added a potentiometer into the circuit just before the signal line was presented to the NeoPixel ring. We started off with the potentiometer set to 0Ω. Then we gradually increased the resistance until the overshoot and undershoot were completely removed from the signal, as shown below. Increasing the value further started to impact the slope of the signal's edges.

The ideal value for this particular configuration was 230Ω, which we subsequently approximated by strapping two 470Ω 1/4-watt resistors in parallel. The required resistor value will no doubt depend on the characteristics of the rest of the wiring harness, so I will be repeating this procedure for future iterations of the design.

As I say, it may be that this overshoot and undershoot is not a problem, and that it was my own stupid fault that my NeoPixel ring was toasted due to my failing to take ESD precautions. On the other hand, I feel much happier knowing that we are now working with a clean programming signal. But now I must away to order a replacement NeoPixel ring. In the meantime, please feel free to post any questions or comments below.

@Max...some simple math reveals that a 1m string of 60 pixels will be refreshed at 800000 / 24 bits / 60 pixels = 555 Hz - surely too fast for the eye to see. You'd have to get up to about 50M before you could discern any delay. Very clever.

@Max, thanks for that, makes perfect sense. I think you are right about the shift register analogy - it would seem that you can stream the data to the strip so fast that to the human eye it seems as if you're addressing each pixel. (ie you could change pixel no 32 without changing the others, and stream the new data, and it will appear as if only that one pixel has changed). Very clever, I can think of all sorts of effects you could do with these things.

Do you know how fast the data is sent? (sorry, I'm one of those irritating people who likes to know exactly how everything works....)

Adafruit provide you with an Arduino library, so a lot of the nitty-gritty details are hidden for you.

When you are creating a Sketch that uses these NeoPixels, first you include their library. Next you declare / instantiate a string of these pixels -- let's say we name it "strip" -- using a type of function call. One of the parameters to this call is the number of the digital output pin you are using to drive this string; another parameter specifies the number of pixels in the string (say 60).

One of the things they do for you is to set up an array in memory -- in th ecase of our 60-pixel stribg, you can visualize this as an array 0-to-59 of 24-bit color fields (8-bits each for the red, green, and blue components).

Now you can use one of their functions to set the values assocaited with individual pixels. For example:

strip.setPixelColor(i, c);

Where 'i' is an integer of variable specifying the number of the pixel in which you are interested (0 to 59, in our case) and 'c' is the 24-bit color value.

Alternatively, you can use:

strip.setPixelColor(i, r, g, b);

Where 'i' is the number of the pixel in which you are interested and 'r,' 'g,' and 'b' are 8-bit color values specifying the red, green, and blue components of that pixel.

The important thing to note is that using the strip.setPixelColor() function doesn't actually upload values to the physical strip -- it just changes the values in the array stored in your Arduino's memery. When you are ready to update the physical strip, you call the strip.show() function -- this streams (a copy of) all of the values out of the array in memory into the physical strip -- I think the way to think about this is sort of like a shift-register -- as you start shoving data in one end, it gets passed "bucket brigade style" down the strip -- but I'm not sure as to the exact mechanism.

My chum Brian LaGrave pointed out that you can get these power adapters all over the place, but as I said to him, I'd never seen one before and I was on the Adafruit site after selecting the power supply and I was thinking "I really could do with a ... oooh, look at that!" LOL

Max, you say that each pixel is individually addressable....but looking at your roll of them in the 3rd photo, along with your description of the Data in and Data out signals it seems to me that what happens is that you tell the first LED what colour you want, then when you tell it a different colour, it passes the previous settings on to the next LED, and so on. Is that what happens? Can you control the brightness as well as the colour (i'd imagine so....)

Very tasty goodies - as is the power adapter in photo 2. I recently ordered some SMD mounting boards from Adafruit - had I known they had these I would have ordered a bunch of them as well. Really handy.

I'd like to point out that these so-called "Neopixels" are not a proprietary Adafruit product, but can be bought all over the web. The part name is WS2812 (6 pins) or WS2812B (4 pins) by worldsemi. (www.world-semi.com)That said, these LEDs are really amazing.