【赛昉科技昉·星光RISC-V单板计算机试用体验】Debian-StarFive下的SPI驱动WS2812B炫彩灯珠

描述

本文来源电子发烧友社区,作者:HonestQiao, 帖子地址:https://bbs.elecfans.com/jishu_2287630_1_1.html

流水灯效果(开发板体验视频,详见作者原文链接)

本帖最后由 HonestQiao 于 2022-6-19 00:22 编辑

赛昉科技昉·星光RISC-V单板计算机上,为我们提供了40Pin接口,其中就要SPI接口。
今天的实例分享,就是使用SPI来驱动WS2812B炫彩灯珠。

WS2812B是个好东西,在很多场合,都能使用。

赛昉科技

节假日,有很多地方,也用到了上面这种炫彩灯带装点气氛。

另外,还有下面这种点阵炫彩灯板:
赛昉科技

作为技术宅男,情人节or七夕做一个,保准抱得美人夜归!

另外,在很多开发板上,也提供了一颗WS2812B灯珠,方便测试使用:
赛昉科技


除了上面的单颗、点阵、条带等,还能根据自己需要,给整成各种各样的形状。
因为,它本质上,都是有一颗颗小灯珠给连起来的:
赛昉科技

可以单颗使用,也可以上千颗使用。

今天不玩复杂的,就先分享,驱动WS2812B灯板上的单颗灯珠(第一颗)的方法。

首先,请参考官方文档,启用SPI:
赛昉科技


启用成功后,登录系统,执行命令 ls -lh /dev/spi*,就能看到/dev/spidev0.0:
赛昉科技

然后设置/dev/spidev0.0可被普通用户使用:
赛昉科技


WS2812B的电源,需要单独的5V供电,不要使用40Pin的接口,输出电流有限制,避免产生副作用。
我使用的是用USB接口接了一个USB2TTL,把其中的电源+给WS2812B灯板供电。
赛昉科技


参考官方文档,后,具体的连线如下:
赛昉科技


连好后如下:
赛昉科技


然后,就可以使用python进行编程,通过spi控制WS2812B灯珠了。

首先,需要安装spidev:
赛昉科技

安装后spidev后,我们就在python中,通过spidev控制WS2812B了。

其次,通过网上众多的WS2812B资料,了解到,要控制一颗灯珠,需要发送24bits的数据,每8bits为一组,分别用于控制GRB三种颜色。
而控制设备发送数据的时候,通常需要发送24bytes,具体如下:
赛昉科技

第一行,WS2812B自身的控制器收到后,每byte会解析为0或者1,以上0x80解析为0,0xf8解析为1,最终为8bits:00000001,表示G的亮度为0x01。
如果第一行,全部为0xf8,则最终为11111111,表示G的亮度为0xff,也就是255。
如果第一行,全部为0x80,则最终为00000000,表示G的亮度为0x00,也就是0,熄灭。
以上的0x80和0xf8为经验数值,大家可以查看网上的资料了解。

除了发送的数据,SPI还需要设置发送的速度,经验值为6.4MHz,也就是6400000。
最终的代码如下:
赛昉科技


上面的代码,重点只有下面三条:
  • spidev.SpiDev():实例化一个spidev设备
  • spi.open(0, 0):打开/dev/spi0.0
  • spi.xfer(ledArray, speed_hz):以指定的速率发送需要的数据

然后,就是交替发送[0,0,0]和[1,0,0]来控制第一颗灯珠GRB,从而形成亮灭效果了。


在发送数据的定义数组中:

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

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

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分