背景
在上一篇WS2812B认知中,WS2812B采用了github上开源的第三方实现来驱动WS2812B。但在最近看micropython类时,突然发现有这么一段内容:
从内容的描述看,micropython已经内置了一个用于驱动WS2812的库,这个库的名字叫neopixel。另外,此内容还提供了一格信息,WS2812属于NeoPixel LED,也就是说,很可能市面上有不少灯珠都使用NeoPixel LED协议。
neopixel库使用
库导入
仅仅需要在python源码中添加以下信息即可
import neopixel
指定驱动管脚
p = machine.Pin.board.X8 #实际上,在树莓派中,管脚的使用为 p = machine.Pin(8)
指定驱动管脚所驱动的ws2812个数
n = neopixel.NeoPixel(p, 32) # 此为完整的写法,其中: # bpp可以设置为3或4,3代表RGB888格式,4代表RGBW8888 # timing可以设置为0或1,0代表工作频率为400KHz,1代表工作频率为800KHz class neopixel.NeoPixel(pin, n, *, bpp=3, timing=1) 8格式
显示颜色设置
n[i] = (255, 0, 0) # i为ws2812编号,(255, 0, 0)为通用的RGB888格式排列,(255, 0, 0)代表的是红色最亮 n.__setitem__(i, (255, 0, 0)) # 也可以使用此种形式的更新方式 n.fill((255, 0, 0)) # 将所有的WS2812都设置为红色最亮
获取当前设置的颜色
n.__getitem__(i)
注意:此时仅仅是更新显示颜色,但并未更新到具体的灯珠上
获取接口上的灯珠个数
n.__len__()
将颜色推送至WS2812
n.write()
编写验证程序
由于手头上刚好有树莓派RP2040,这个最方便的玩法便是玩micropython,因此便用该板卡编写测试代码验证,验证思路为做一个四灯颜色交替闪烁的呼吸灯,具体测试代码如下:
import machine import neopixel import time neopixel_pin = machine.Pin(23) np = neopixel.NeoPixel(neopixel_pin, 4) def breathe(color): for i in range(0, 256, 4): for j in range(len(np)): np.__setitem__(j,(color[0] * i // 256, color[1] * i // 256, color[2] * i // 256)) np.write() time.sleep(0.01) for i in range(255, -1, -4): for j in range(len(np)): np.__setitem__(j,(color[0] * i // 256, color[1] * i // 256, color[2] * i // 256)) np.write() time.sleep(0.01) while True: breathe((255, 0, 0)) breathe((0, 255, 0)) breathe((0, 0, 255))
验证结果
在运行该段代码后,树莓派的板卡上可以看到红灯由暗变亮后由亮变暗,之后绿灯由暗变亮后由亮变暗,最后蓝灯由暗变量后由亮变暗,如此交替循环显示。效果与库函数描述一致。
结论
在学习知识时,我们可能会直接采用硬刚规格书,并按照理解编写实现。进一步的直接去github上搜索别人写好的库,并根据对规格书的理解验证库是否有效,是否存在明显的bug。但一旦我们深入了解后就会发现,其实不少知识属于行业内知识,在行业内这些功能早已标准化成统一的实现,此时只要按照标准化的调用,便能以很少的代码,且很少有bug的形式实现想要的功能。而这方面知识的积累,需要靠不断深耕特定行业才能清晰认识,知晓并熟练使用。