We are working on a Halloween decoration with multiple skeleton heads that we want to use multiple strands of 2 WS2811 lights in each head to flash in the eyes. I am relatively new working with the Raspberry pico and doing pretty well on my lessons with normal LED's. I found code that works for the WS2811 as it did not react as well to the neopixel code that works with WS2812 which is more common.
My question is, am I able to use multiple strands? The pin number is set way at the top of the code and then used when the State machine is created under variable sm. So, I don't see how I can add more sets of 2 lights for each head on another pin. If we can't figure this out and make it work with the WS2811, we will do it with other LED's but these are bigger and fully weather resistant already. They would be perfect for the project.
Code:
# Example using PIO to drive a set of WS2812 LEDs.import array, timefrom machine import Pinimport rp2# Configure the number of LEDs.NUM_LEDS = 2PIN_NUM = 1brightness = 0.5@rp2.asm_pio(sideset_init=rp2.PIO.OUT_LOW, out_shiftdir=rp2.PIO.SHIFT_LEFT, autopull=True, pull_thresh=24)def ws2812(): T1 = 2 T2 = 5 T3 = 3 wrap_target() label("bitloop") out(x, 1) .side(0) [T3 - 1] jmp(not_x, "do_zero") .side(1) [T1 - 1] jmp("bitloop") .side(1) [T2 - 1] label("do_zero") nop() .side(0) [T2 - 1] wrap()# Create the StateMachine with the ws2812 program, outputting on pinsm = rp2.StateMachine(0, ws2812, freq=8_000_000, sideset_base=Pin(PIN_NUM))# Start the StateMachine, it will wait for data on its FIFO.sm.active(1)# Display a pattern on the LEDs via an array of LED RGB values.ar = array.array("I", [0 for _ in range(NUM_LEDS)])##########################################################################def pixels_show(): dimmer_ar = array.array("I", [0 for _ in range(NUM_LEDS)]) for i,c in enumerate(ar): r = int(((c >> 8) & 0xFF) * brightness) g = int(((c >> 16) & 0xFF) * brightness) b = int((c & 0xFF) * brightness) dimmer_ar[i] = (g<<16) + (r<<8) + b sm.put(dimmer_ar, 8) time.sleep_ms(10)def pixels_set(i, color): ar[i] = (color[1]<<16) + (color[0]<<8) + color[2]def pixels_fill(color): for i in range(len(ar)): pixels_set(i, color)BLACK = (0, 0, 0)RED = (0, 255, 0)YELLOW = (155, 250, 0)GREEN = (255, 0, 0)CYAN = (255, 0, 255)BLUE = (0, 0, 255)PURPLE = (0, 180, 255)WHITE = (255, 255, 255)COLORS = (BLACK, RED, YELLOW, GREEN, CYAN, BLUE, PURPLE, WHITE)while True: for color in COLORS: pixels_fill(color) pixels_show() time.sleep(2)
Statistics: Posted by Chakora — Thu Sep 19, 2024 8:25 pm — Replies 0 — Views 49