From 62fd450e621c8c46a93082f8e5f5417a32ef3fb8 Mon Sep 17 00:00:00 2001 From: Jim Mussared Date: Wed, 11 Aug 2021 15:22:29 +1000 Subject: drivers/neopixel: Add common machine.bitstream-based neopixel module. Signed-off-by: Jim Mussared --- drivers/neopixel/neopixel.py | 44 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 44 insertions(+) create mode 100644 drivers/neopixel/neopixel.py (limited to 'drivers/neopixel/neopixel.py') diff --git a/drivers/neopixel/neopixel.py b/drivers/neopixel/neopixel.py new file mode 100644 index 0000000000..9ed5155c72 --- /dev/null +++ b/drivers/neopixel/neopixel.py @@ -0,0 +1,44 @@ +# NeoPixel driver for MicroPython +# MIT license; Copyright (c) 2016 Damien P. George, 2021 Jim Mussared + +from micropython import const +from machine import bitstream + +_BITSTREAM_TYPE_HIGH_LOW = const(0) +_TIMING_WS2818_800 = (400, 850, 800, 450) +_TIMING_WS2818_400 = (800, 1700, 1600, 900) + + +class NeoPixel: + ORDER = (1, 0, 2, 3) + + def __init__(self, pin, n, bpp=3, timing=1): + self.pin = pin + self.n = n + self.bpp = bpp + self.buf = bytearray(n * bpp) + self.pin.init(pin.OUT) + self.timing = ( + (_TIMING_WS2818_800 if timing else _TIMING_WS2818_400) + if isinstance(timing, int) + else timing + ) + + def __len__(self): + return self.n + + def __setitem__(self, index, val): + offset = index * self.bpp + for i in range(self.bpp): + self.buf[offset + self.ORDER[i]] = val[i] + + def __getitem__(self, index): + offset = index * self.bpp + return tuple(self.buf[offset + self.ORDER[i]] for i in range(self.bpp)) + + def fill(self, color): + for i in range(self.n): + self[i] = color + + def write(self): + bitstream(self.pin, _BITSTREAM_TYPE_HIGH_LOW, self.timing, self.buf) -- cgit v1.2.3