12月25日,一年一度的圣诞节又来啦!虽然这是西方的节日,但现在也都被商家们大肆炒作,变成了刺激消费的噱头。而作为消费者的我们,也乐在其中。之前,我看到某购物平台上推出了WS2812灯带,144灯每米才40元,感觉可以买几米来玩玩~我们都知道,WS2812点灯原理很简单,就是逐个灯写入24bit的颜色。其中,T0H≈0.35us,T0L≈0.8us,T1H≈0.7us,T1L≈0.6us。对于一颗灯珠来说,至少需要0.2~0.3ms。灯珠之间不需要信号延迟,但两组信号量之间需要不小于50us的延迟,如下图所示:对于有几百颗装饰灯的灯带来说,每次刷新颜色需要秒级的延迟,是可以忽略的。虽然我出差在外,但这丝毫不影响我规划圣诞树的装饰。在距离圣诞节的前几天,先把代码写好,到货直接用。手边正好有块树莓派,拿块8灯的WS2812B-8先充数,做一个树莓派点灯的demo!把WS2812的控制线接到GPIO1上,连接电源(只有少量几个灯珠,板上的3.3V或者5V都行,实际接灯带的话,估计得使用外置电源)和地,就可以看到灯珠在不断变换色彩了,效果图如下:咳咳,手机拍摄的效果还真是难看……不过不管怎么说,显示变颜色的功能还是实现得很好的。原理其实很简单,就是把随机颜色写到每个灯珠上。值得注意的是,在代码 /usr/local/lib/python3.7/dist-packages/rpi_ws281x/rpi_ws281x.py中,已经明确提示只有支持PWM的GPIO口才能运行这段代码。从树莓派的资料上查到,唯一硬件PWM口为Pin12(GPIO.1),也就是上图中的LED_PIN=18。但实际测试,可以发现设置LED_PIN的取值还可以是10(Pin19,MOSI)、12(Pin32,GPIO.26)、21(Pin40,GPIO.29),而且居然还都可以用!然而,其它某些我之前试过支持软PWM的接口反而是不能用的,不太明白其原因……目前看来,圣诞节是没法回去过了,但我把代码共享出来,如果有需要的小伙伴,请点击底部“阅读原文”进行下载。
最后,祝大家圣诞夜成双成对!