I'm wondering what strands can get away with the FastLED bit banging code/mode (on

gplus
(Andrew Tuline) #1

I’m wondering what strands can get away with the FastLED bit banging code/mode (on the Arduino UNO), as opposed to the WS2812B strands which can’t. I’d like to be able to add reliable IR functionality without having to resort to 2 Arduino’s. One would think that 4 pin WS2801’s or LPD8806’s fill the bill. . .

(Daniel Garcia) #2

The 4-wire based chipsets (WS2801, LPD8806, SM16796ish, P9813 (cool neon’s TCL), APA102) do not have exacting timing requirements, and you can either use the hardware SPI port or bit banging with them and still happily allow interrupts to run.

It is possible that there may still be a way to allow interrupts with the WS2812’s and have it work - but that’s some experimenting I haven’t had time to do yet, and it would require some changing of the code (it turns out that the chip’s timing requirements may not be quite as tight as i’ve been coding them out to be :slight_smile:

(Daniel Garcia) #3

For others coming along this - the reason why the 4 wire chipsets will run fine in an environment with interrupts firing is because the way they work is you set a bit value on the data line, then flip the clock line on then off, and the receiver reads the data line when it sees the clock line flip. No timing involved (other than possibly flipping the clock line faster than the receiver can detect/respond to). So, if an interrupt fires and takes a couple dozen clocks cycles to do its thing, that’s ok, it just slows your data output down a little bit.

With the 3 wire chipsets, there’s some exacting timing involved (though, possibly only at the point of differentiating between a 1 and a 0) - and on an arduino, a single bit is only 20 clocks - so an interrupt that takes a couple dozen clock cycles will completely throw off the data timing that the receiving chips are expecting.

(Andrew Tuline) #4

I finally got around to testing IR with my strip of WS2801’s and it’s awesome. Thanks so much for providing the functionality to support this.