这次试用的这块RISC-V单板计算机上,为我们提供了40Pin接口,其中就有SPI接口。
今天要分享的,就是在Debian下,使用SPI来驱动ws2812B炫彩灯珠。
WS2812B可是个好东西,应用的场合非常之多:
节假日,很多商场、娱乐场所、小区等,都安装了这种炫彩灯带装点节日的气氛。
除了条带状的,下面这种点阵的也很常用:
作为玩板子的宅男,在2月14日或者农历7月7日,给心爱的她做一个心形的炫彩灯板,一定能打动她。
此外,有不少开发板,也提供了一颗WS2812B灯珠,例如ESP32-C3上,比常见的LED可控性强多了。
WS2812B可以用于单颗、点阵、条带等,根据实际需要,可以任意定制。
因为,它是由一颗颗小灯珠给连起来的,可以用柔性材料给保护起来,防水防潮。
用得少的,可以单颗使用,用得多的,也可以上千颗使用,连连连就成。
今天的分享,咱们先不玩复杂的,先驱动WS2812B灯板上的第一颗。
第一步,我们要参考官方文档,启用SPI以便可以在后面的编程中使用:
成功启用后,登录系统,可以查看该设备的挂载点:
然后设置,需要设置其可被普通用户使用,否则可能遇到权限问题:
单颗WS2812B灯珠需要的电流不是很大,但是,后续可能要控制整个板子,那就需要不小的电流了。
40Pin虽然可以输出5V,但是其电流非常有限。所以,请使用单独的5V供电,不要使用40Pin的接口,避免产生副作用。
在我的实际使用中,我用了一个USB2TTL,把其中的5V用于给WS2812B供电。
参考官方中关于40Pin的说明,具体的连线如下:
仔细连好线,别连错了:
准备妥当,现在可以开始使用c语言,对spidev进行编程,从而通过spi控制WS2812B灯珠了。
查看了网上提供的WS2812B资料,可以了解到,要控制WS2812B的灯珠,需要让灯珠控制器收到24bits的数据,每8Bits为一组,分别用于控制GRB三种颜色。
但是控制设备发送数据的时候,确需要24bytes的数据,具体如下:
每一行,WS2812B自身的控制器收到后,会将每byte解析为0或者1,以上0x80解析为0,0xf8解析为1。
如果第一行,全部为0xf8,则最终为11111111,表示G的亮度为0xff,也就是255。
如果第一行,全部为0x80,则最终为00000000,表示G的亮度为0x00,也就是0,熄灭。
以上的0x80和0xf8为经验数值,大家可以查看网上的资料了解。
除了发送的数据,SPI还需要设置发送的速度,经验值为6.4MHz,也就是6400000。
通过学习Linux下spidev的编程,最终的代码如下:
上面的代码,看起来不少,重点不多:
循环部分,就是交替发送并解码为[0,0,0]和[1,0,0]来控制第一颗灯珠GRB,从而形成亮灭效果了。
在上面定义的发送数据中:
前面说了,可以通过设置0x80和0xf8,来控制G的亮度。
同样的,还可以设置第二行、第三行,来控制GRB三中颜色的力度,从而达到炫彩的目的。
具体的颜色数目:255 * 255 * 255 = 16581375,160多万,真得很炫彩。
以上展示的,是控制第一颗灯珠,需要24bytes的数据;而发送2组24bytes数据,就可以控制两颗;以此类推,要控制更多的,就发送24倍数组bytes了。
下面的视频,就是控制了64颗,形成了简单流水灯的效果: