找回密码
 立即注册
查看: 64|回复: 3

[娱乐视频]双线制RGB灯带SK9822试玩笔记^_^

[复制链接]
  • 打卡等级:以坛为家III
  • 打卡总天数:721
  • 最近打卡:2026-04-01 04:36:57

40

主题

457

回帖

4407

积分

荣誉版主

积分
4407
发表于 2026-3-22 15:15:40 | 显示全部楼层 |阅读模式
前阵子无意间在论坛上看到了晓版主分享的一种RGB灯带APA102的玩法。

晓版主的这个帖子里是这个灯带的详细介绍和用法
↓↓↓↓↓↓↓↓↓↓↓↓↓↓

点个幻彩灯 何必单恋WS2812可以看看APA102@2线制,标准SPI
https://www.stcaimcu.com/thread-22209-1-1.html
(出处: 国芯人工智能技术交流网站)

随后也好奇买来一条灯带试着玩了一下。
虽然买到的是SK9822的控制IC的,但是跟APA102完全兼容。
于是又打开了一扇新世界的大门。

==================================================、

由于APA102/SK9822是双线同步传输,不挑速度,时序相当宽松,所以尝试了一下不用单片机,单纯靠手动敲击按键开关来发送时钟和数据信号,结果果然能供正确点亮灯带。

下面是试玩SK9822灯带的效果


人肉点亮灯带的效果(太费手指头了)


因为解析数据依靠的是时钟线上的高低电平变化,且判断数据结束是依靠具体数值的“结束码”;
而不是像WS2812那样发送数据有严格的时序要求,且依靠一段时长的0码作为结束的判断依据。
所以哪怕发送数据过程中,间隔好几分钟再进行输入,依旧能够继续解析数据。

正如晓版主所言,稳如老狗



1 喜欢他/她就送朵鲜花吧,赠人玫瑰,手有余香!
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:721
  • 最近打卡:2026-04-01 04:36:57

40

主题

457

回帖

4407

积分

荣誉版主

积分
4407
发表于 2026-3-22 15:15:59 | 显示全部楼层
由于SK9822灯带的驱动方式不同于WS2812的一线制方式,所以尝试根据SK9822的芯片手册的说明,
在STC8G1K08A单片机上,学习了一下这种灯带的工作原理和手搓点亮SK9822的驱动代码

以下是学习记录

【视频1】SK9822的驱动原理和数据格式
颜色数据的结构是:[亮度值+[蓝色值+[绿色值+[红色值8bit](这个顺序很重要)

其中亮度值的八位数据,Bit7~Bit5这三位是固定的111,Bit4~Bit0是五位的亮度值,范围是0~31。
正因为多了一组亮度值的数据,所以在控制亮度方面,比起WS2812来效率要高了很多。而且对于高出及时背的速度而言多出来的一个字节对整体速度影响也不大。
设想,如果用这个亮度值,配合RGB的亮度值,或许能搭配出比WS2812更细腻的亮度变化。
顺便学习了一下逻辑分析仪的用法,果然是好东西!



【视频2】点亮SK9822灯带的最基础的驱动部分,就是【起始码】【颜色码】和【结束码】三个部分。

虽然说对时序要求不太严格,但是对时钟的速度要求还是有上限的。
根据芯片手册的说明,最大速度在20M(比WS2812快了好多),看网上还有人说在30M下也能点亮。

实际尝试中,如果时钟速度过于快了,灯带就会乱闪或者不亮;144颗灯珠的时候,10M左右的速度是最稳的;但是最慢下限还没试出来。


【视频3】使用基础驱动函数,创建几个实用的显示函数
最简单的方式是直接发送一连串数据,来控制灯带上的多颗灯珠的显示效果;
如果想要更灵活多变的效果,可以借助缓存数组来实现。
实现的思路跟WS2812以及各种屏幕是一样的,先把要显示的效果发送进缓存数组,然后再把数组里的数据发给灯带,作为一帧“图像”。


【视频4】使用单片机的SPI驱动SK9822灯带
因为APA102/SK9822的驱动时序,完全符合SPI的规则,
解析数据的过程中:
    ·空闲时是低电平空
   
·时钟周期以上升沿开始,下降沿结束
    ·上升沿对数据采样,下降沿对数据锁存
完美符合SPI的规定
所以就借这个机会,重新复习了一下STC单片机的硬件SPI的配置过程和发送数据的过程。


发现网上有不少人认为符合I2C。但是I2C要求在空闲时必须是高电平,而APA102/SK9822规定低电平才是空闲状态,所以如果是用I2C的方式,在空闲的时候就会得到一连串的“白光”。







能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:721
  • 最近打卡:2026-04-01 04:36:57

40

主题

457

回帖

4407

积分

荣誉版主

积分
4407
发表于 2026-3-22 15:16:51 | 显示全部楼层
成功写出点亮SK9822灯带的程序之后
由于有网友询问“光波鼓”的效果实现方法,所以又尝试了一下用开关触发流星发射的效果。

实现的思路是把缓存数组分成流星【装填区】和【发射区】两个部分。
程序不断让整个数组里的灯珠数据依次向后移动一颗灯珠,
每次移动之后就在灯带上显示一次【发射区】里的数据。
每当有开关触发,就在装填区写入一组流星的数据。


根据芯片手册描述,APA102/SK9822理论上支持至少1024颗灯珠。
所以就需要考虑到单片机的内存大小了。
由于买的灯带上右144颗灯珠,
一开始的时候,是在前面的驱动程序中,已经创建了一个SK9822_Buff[ 144 ]的缓存数组。
在这个基础上又给流星灯创建了一个Star_Buff[ 5+144 ]的缓存数组。
结果就导致了,占用内存过大,即便是换成STC8G1K17,也依然溢出了。
于是超出的部分,会变成一堆乱码,在灯带上的后半部分就出现了乱闪的情况。
所以就换成了上面视频里的方法
直接在将缓存数组 SK9822_Buff[ LED_NUM ] 改成了 SK9822_Buff[ 5+LED_NUM ] (设置的一道流星是5颗灯珠)
相应的,点亮灯珠的函数,还有清空显示和刷新灯带的函数里的读取缓存的部分,也对应后移5组数据的位置。
这样就可以顺利显示了发射流星的效果了,而且之前的那些显示效果的函数也依旧都能直接用。





能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

  • 打卡等级:以坛为家III
  • 打卡总天数:721
  • 最近打卡:2026-04-01 04:36:57

40

主题

457

回帖

4407

积分

荣誉版主

积分
4407
发表于 2026-3-22 15:28:02 | 显示全部楼层

顺便记录一下关于HSV色值转成RGB色值的函数和用法
这只是转换颜色用的函数,所以对于WS2812以及其他TFT彩屏之类也都适用。
HSVtoRGB用法.jpg
能体会到发现一个不理解的现象然后找原因然后要么解决掉问题要么被问题解决掉的那种快乐是我的幸运
回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2026-4-1 08:59 , Processed in 1.997072 second(s), 64 queries .

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表