kopia lustrzana https://github.com/blaz-r/pi_pico_neopixel
added support for all orders of RGB / RGBW
rodzic
c6f9acbb5b
commit
ef3af1a746
|
@ -35,4 +35,4 @@ For new settings to take effect you write:
|
||||||
pixels.show()
|
pixels.show()
|
||||||
```
|
```
|
||||||
|
|
||||||
Library is extended verison of https://github.com/blaz-r/pico_python_ws2812b, originaly forked from https://github.com/benevpi/pico_python_ws2812b.
|
Library is extended verison of https://github.com/blaz-r/pico_python_ws2812b, originally forked from https://github.com/benevpi/pico_python_ws2812b.
|
|
@ -2,10 +2,10 @@
|
||||||
# simplify working with gradients
|
# simplify working with gradients
|
||||||
|
|
||||||
import time
|
import time
|
||||||
from neopixel import neopixel
|
from neopixel import Neopixel
|
||||||
|
|
||||||
numpix = 60
|
numpix = 60
|
||||||
strip = neopixel(numpix, 1, 1, "RGB")
|
strip = Neopixel(numpix, 1, 1, "GRB")
|
||||||
|
|
||||||
red = (255, 0, 0)
|
red = (255, 0, 0)
|
||||||
orange = (255, 50, 0)
|
orange = (255, 50, 0)
|
||||||
|
|
|
@ -1,10 +1,10 @@
|
||||||
import time
|
import time
|
||||||
import neopixel
|
from neopixel import Neopixel
|
||||||
import random
|
import random
|
||||||
|
|
||||||
numpix = 60 # Number of NeoPixels
|
numpix = 60 # Number of NeoPixels
|
||||||
# Pin where NeoPixels are connected
|
# Pin where NeoPixels are connected
|
||||||
strip = neopixel.neopixel(numpix, 0, 0, "RGBW")
|
strip = Neopixel(numpix, 1, 1, "GRB")
|
||||||
|
|
||||||
colors_rgb = [
|
colors_rgb = [
|
||||||
(232, 100, 255), # Purple
|
(232, 100, 255), # Purple
|
||||||
|
@ -19,8 +19,8 @@ colors_rgbw = [color+tuple([0]) for color in colors_rgb]
|
||||||
colors_rgbw.append((0, 0, 0, 255))
|
colors_rgbw.append((0, 0, 0, 255))
|
||||||
|
|
||||||
# uncomment colors_rgbw if you have RGBW strip
|
# uncomment colors_rgbw if you have RGBW strip
|
||||||
# colors = colors_rgb
|
colors = colors_rgb
|
||||||
colors = colors_rgbw
|
# colors = colors_rgbw
|
||||||
|
|
||||||
max_len=20
|
max_len=20
|
||||||
min_len = 5
|
min_len = 5
|
||||||
|
|
|
@ -1,8 +1,8 @@
|
||||||
import time
|
import time
|
||||||
from neopixel import neopixel
|
from neopixel import Neopixel
|
||||||
|
|
||||||
numpix = 60
|
numpix = 60
|
||||||
strip = neopixel(numpix, 0, 0, "RGBW")
|
strip = Neopixel(numpix, 0, 0, "RGBW")
|
||||||
|
|
||||||
red = (255, 0, 0)
|
red = (255, 0, 0)
|
||||||
orange = (255, 165, 0)
|
orange = (255, 165, 0)
|
||||||
|
@ -17,7 +17,7 @@ colors_rgb = (red, orange, yellow, green, blue, indigo, violet)
|
||||||
colors_rgbw = [color+tuple([0]) for color in colors_rgb]
|
colors_rgbw = [color+tuple([0]) for color in colors_rgb]
|
||||||
colors_rgbw.append((0, 0, 0, 255))
|
colors_rgbw.append((0, 0, 0, 255))
|
||||||
|
|
||||||
# uncomment colors_rgbw if you have RGBW strip
|
# uncomment colors_rgb if you have RGB strip
|
||||||
# colors = colors_rgb
|
# colors = colors_rgb
|
||||||
colors = colors_rgbw
|
colors = colors_rgbw
|
||||||
|
|
||||||
|
|
32
neopixel.py
32
neopixel.py
|
@ -33,18 +33,32 @@ def sk6812():
|
||||||
wrap()
|
wrap()
|
||||||
|
|
||||||
|
|
||||||
# delay here is the reset time. You need a pause to reset the LED strip back to the initial LED
|
# Delay here is the reset time. You need a pause to reset the LED strip back to the initial LED
|
||||||
# however, if you have quite a bit of processing to do before the next time you update the strip
|
# however, if you have quite a bit of processing to do before the next time you update the strip
|
||||||
# you could put in delay=0 (or a lower delay)
|
# you could put in delay=0 (or a lower delay)
|
||||||
class neopixel:
|
#
|
||||||
def __init__(self, num_leds, state_machine, pin, mode="RGB", delay=0.001):
|
# Class supports different order of individual colors (GRB, RGB, WRGB, GWRB ...). In order to achieve
|
||||||
|
# this, we need to flip the indexes: in 'RGBW', 'R' is on index 0, but we need to shift it left by 3 * 8bits,
|
||||||
|
# so in it's inverse, 'WBGR', it has exactly right index. Since micropython doesn't have [::-1] and recursive rev()
|
||||||
|
# isn't too efficient we simply do that by XORing (operand ^) each index with 3 (0b11) to make this flip.
|
||||||
|
# When dealing with just 'RGB' (3 letter string), this means same but reduced by 1 after XOR!.
|
||||||
|
# Example: in 'GRBW' we want final form of 0bGGRRBBWW, meaning G with index 0 needs to be shifted 3 * 8bit ->
|
||||||
|
# 'G' on index 0: 0b00 ^ 0b11 -> 0b11 (3), just as we wanted.
|
||||||
|
# Same hold for every other index (and - 1 at the end for 3 letter strings).
|
||||||
|
|
||||||
|
class Neopixel:
|
||||||
|
def __init__(self, num_leds, state_machine, pin, mode="RGB", delay=0.001):
|
||||||
self.pixels = array.array("I", [0 for _ in range(num_leds)])
|
self.pixels = array.array("I", [0 for _ in range(num_leds)])
|
||||||
self.mode = set(mode)
|
self.mode = set(mode) # set for better performance
|
||||||
# RGBW uses different PIO state machine configuration
|
|
||||||
if 'W' in self.mode:
|
if 'W' in self.mode:
|
||||||
|
# RGBW uses different PIO state machine configuration
|
||||||
self.sm = rp2.StateMachine(state_machine, sk6812, freq=8000000, sideset_base=Pin(pin))
|
self.sm = rp2.StateMachine(state_machine, sk6812, freq=8000000, sideset_base=Pin(pin))
|
||||||
|
self.shift = {'R': (mode.index('R') ^ 3) * 8, 'G': (mode.index('G') ^ 3) * 8,
|
||||||
|
'B': (mode.index('B') ^ 3) * 8, 'W': (mode.index('W') ^ 3) * 8}
|
||||||
else:
|
else:
|
||||||
self.sm = rp2.StateMachine(state_machine, ws2812, freq=8000000, sideset_base=Pin(pin))
|
self.sm = rp2.StateMachine(state_machine, ws2812, freq=8000000, sideset_base=Pin(pin))
|
||||||
|
self.shift = {'R': ((mode.index('R') ^ 3) - 1) * 8, 'G': ((mode.index('G') ^ 3) - 1) * 8,
|
||||||
|
'B': ((mode.index('B') ^ 3) - 1) * 8, 'W': 0}
|
||||||
self.sm.active(1)
|
self.sm.active(1)
|
||||||
self.num_leds = num_leds
|
self.num_leds = num_leds
|
||||||
self.delay = delay
|
self.delay = delay
|
||||||
|
@ -90,17 +104,17 @@ class neopixel:
|
||||||
# Set red, green and blue value of pixel on position <pixel_num>
|
# Set red, green and blue value of pixel on position <pixel_num>
|
||||||
# Function accepts (r, g, b) tuple or individual rgb values3
|
# Function accepts (r, g, b) tuple or individual rgb values3
|
||||||
def set_pixel(self, pixel_num, rgb_w):
|
def set_pixel(self, pixel_num, rgb_w):
|
||||||
|
pos = self.shift
|
||||||
|
|
||||||
red = round(rgb_w[0] * (self.brightness() / 255))
|
red = round(rgb_w[0] * (self.brightness() / 255))
|
||||||
green = round(rgb_w[1] * (self.brightness() / 255))
|
green = round(rgb_w[1] * (self.brightness() / 255))
|
||||||
blue = round(rgb_w[2] * (self.brightness() / 255))
|
blue = round(rgb_w[2] * (self.brightness() / 255))
|
||||||
|
white = 0
|
||||||
# if it's (r, g, b, w)
|
# if it's (r, g, b, w)
|
||||||
if len(rgb_w) == 4 and 'W' in self.mode:
|
if len(rgb_w) == 4 and 'W' in self.mode:
|
||||||
white = round(rgb_w[3] * (self.brightness() / 255))
|
white = round(rgb_w[3] * (self.brightness() / 255))
|
||||||
# bits are of form 0bGGRRBBWW
|
|
||||||
self.pixels[pixel_num] = green << 24 | red << 16 | blue << 8 | white
|
self.pixels[pixel_num] = white << pos['W'] | blue << pos['B'] | red << pos['R'] | green << pos['G']
|
||||||
else:
|
|
||||||
self.pixels[pixel_num] = green << 16 | red << 8 | blue
|
|
||||||
|
|
||||||
# Rotate <num_of_pixels> pixels to the left
|
# Rotate <num_of_pixels> pixels to the left
|
||||||
def rotate_left(self, num_of_pixels):
|
def rotate_left(self, num_of_pixels):
|
||||||
|
|
Ładowanie…
Reference in New Issue