[MCU] 【国产RISC-V Linux板 昉·星光VisionFive试用报告】C语言编程控制WS2812B炫彩灯珠

HonestQiao   2022-6-19 00:46 楼主

这次试用的这块RISC-V单板计算机上,为我们提供了40Pin接口,其中就有SPI接口。
今天要分享的,就是在Debian下,使用SPI来驱动ws2812B炫彩灯珠。

 

WS2812B可是个好东西,应用的场合非常之多:

1.灯带.jpeg

节假日,很多商场、娱乐场所、小区等,都安装了这种炫彩灯带装点节日的气氛。

 

除了条带状的,下面这种点阵的也很常用:

2.点阵.jpg 商家可以在这种点阵上,输出图案或者文字来做宣传。

作为玩板子的宅男,在2月14日或者农历7月7日,给心爱的她做一个心形的炫彩灯板,一定能打动她。

 

此外,有不少开发板,也提供了一颗WS2812B灯珠,例如ESP32-C3上,比常见的LED可控性强多了。

3.开发板.jpg

 

WS2812B可以用于单颗、点阵、条带等,根据实际需要,可以任意定制。
因为,它是由一颗颗小灯珠给连起来的,可以用柔性材料给保护起来,防水防潮。

4.连接.jpg 用得少的,可以单颗使用,用得多的,也可以上千颗使用,连连连就成。

 

今天的分享,咱们先不玩复杂的,先驱动WS2812B灯板上的第一颗。

 

第一步,我们要参考官方文档,启用SPI以便可以在后面的编程中使用:

5.SPI文档.png

成功启用后,登录系统,可以查看该设备的挂载点:

6.SPI设备.png
然后设置,需要设置其可被普通用户使用,否则可能遇到权限问题:

7.SPI权限.png

单颗WS2812B灯珠需要的电流不是很大,但是,后续可能要控制整个板子,那就需要不小的电流了。

40Pin虽然可以输出5V,但是其电流非常有限。所以,请使用单独的5V供电,不要使用40Pin的接口,避免产生副作用。
在我的实际使用中,我用了一个USB2TTL,把其中的5V用于给WS2812B供电。

8.背面.jpeg

 

参考官方中关于40Pin的说明,具体的连线如下:

9.接线.png

仔细连好线,别连错了:

10.实际连接.png

准备妥当,现在可以开始使用c语言,对spidev进行编程,从而通过spi控制WS2812B灯珠了。

查看了网上提供的WS2812B资料,可以了解到,要控制WS2812B的灯珠,需要让灯珠控制器收到24bits的数据,每8Bits为一组,分别用于控制GRB三种颜色。
但是控制设备发送数据的时候,确需要24bytes的数据,具体如下:

14.C数组.png
在上面的数据中,每24bytes数据,我分成了3行。

每一行,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的编程,最终的代码如下:

15.C代码.jpeg

上面的代码,看起来不少,重点不多:

  1. 把挂载点/dev/spi0.0打开,当作文件打开即可
  2. 设置各项参数,特别是速率
  3. 发送需要的数据

循环部分,就是交替发送并解码为[0,0,0]和[1,0,0]来控制第一颗灯珠GRB,从而形成亮灭效果了。


在上面定义的发送数据中:

14.C数组.png

前面说了,可以通过设置0x80和0xf8,来控制G的亮度。
同样的,还可以设置第二行、第三行,来控制GRB三中颜色的力度,从而达到炫彩的目的。
具体的颜色数目:255 * 255 * 255 = 16581375,160多万,真得很炫彩。

以上展示的,是控制第一颗灯珠,需要24bytes的数据;而发送2组24bytes数据,就可以控制两颗;以此类推,要控制更多的,就发送24倍数组bytes了。
下面的视频,就是控制了64颗,形成了简单流水灯的效果:

演示视频

 

回复评论 (1)

写得很详细,很不错.写得很详细,很不错.写得很详细,很不错.

点赞  2022-6-19 16:13
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复