HonestQiao 发表于 2022-6-19 00:46

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

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

<p>&nbsp;</p>

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

<p></p>

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

<p>&nbsp;</p>

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

<p>商家可以在这种点阵上,输出图案或者文字来做宣传。</p>

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

<p>&nbsp;</p>

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

<p></p>

<p>&nbsp;</p>

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

<p>用得少的,可以单颗使用,用得多的,也可以上千颗使用,连连连就成。</p>

<p>&nbsp;</p>

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

<p>&nbsp;</p>

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

<p></p>

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

<p><br />
然后设置,需要设置其可被普通用户使用,否则可能遇到权限问题:</p>

<p></p>

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

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

<p></p>

<p>&nbsp;</p>

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

<p></p>

<p>仔细连好线,别连错了:</p>

<p></p>

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

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

<p><br />
在上面的数据中,每24bytes数据,我分成了3行。</p>

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

<p>&nbsp;</p>

<p>除了发送的数据,SPI还需要设置发送的速度,经验值为6.4MHz,也就是6400000。</p>

<p><br />
通过学习Linux下spidev的编程,最终的代码如下:</p>

<p></p>

<p>上面的代码,看起来不少,重点不多:</p>

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

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

<p><br />
在上面定义的发送数据中:</p>

<p></p>

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

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

<p>c155b8f51e93047bf5c86998a264a458<br />
&nbsp;</p>

qwe123z 发表于 2022-6-19 16:13

<p>写得很详细,很不错.写得很详细,很不错.写得很详细,很不错.</p>
页: [1]
查看完整版本: 【国产RISC-V Linux板 昉·星光VisionFive试用报告】C语言编程控制WS2812B炫彩灯珠