WS2812外形图
最近家里准备搞装修,想自已做点有个性的灯,能够调出任意色彩,在触摸屏上可以快速调出常的配方或者是动感色彩。最后因为2812用一根线控制,所有灯的数据线是串联的,每种色单有255级亮度可调,我非常喜欢。
对于不了解的模块,当然先是百度上查文档,看到各种文章,也大概对2812有了个一理解,最不理解的是级联,就是数据是怎么一级一级传到后面的,因为没有地址的概念,肯定是不能单独寻址的,所有文章中对级联只说了句“每经过一个灯球,数据减小24bit",为了完全明白,我先写段程序到arduino中,为了简单易懂,程序只写了控制4个灯,多灯同理。
点击这里查看WS2812数据手册。
程序
下载到arduino后,在第每个灯的数据输入(Data In,简写Din)脚分别接逻辑分析仪的通道0-3,用来采集每个灯珠的输入数据。
逻辑分析仪采集每个DIN数据
采集到的数据
从逻辑图可以看出,数据越来越少,每个灯有24bit的控制数据(R/G/B各8位,每8位值越大表示该色灯越亮,255最亮,0关闭),每经过一个灯,数据减小24bit,到最后一个灯,输出是没有数据的。
换句话简单的说:就是每个灯截取前24bit数据,放到自已的控制器中,多的不要,只要24bit,余的的数据直接输出到下一级。
打个简单比方要明白点:班上有50个同学,发50张问卷,先给第一个同学,第一个同学拿一张(表面,不是最下面)后,将余下的49张传给下一位同学,下一位同学再拿一张后将余下的48张传给下一位同学……
我是这么理解的,DIN、数据寄存器、DOUT相当于一个单刀双掷开关,输入就是DIN,输出可能是数据寄存器,也可能是DOUT。
每次传输数据前,DIN先和内部数据寄存器接通,24bit数据送到数据寄存器,当够了24bit时,会产生一个类似溢出中断(当然也有可能是计数器),将DIN和数据寄存器断开同时和DOUT数据输出接通,这样就达到留下最早的24bit数据,余下的数据达到后一个2812,后一个2812也一样的将雁过拔毛,留下24bit,余下的传给再下一个2812,同理……
这样讲是不是大家都明白2812的控制原理了呢?
2812如同网上说的一样,对时序要求很严格,他不是以高电平代表1,低电平代表0,而是以一个周期中,高电平时间大于临界值为1,小于临界值为0。速度要达到800Kb,一个bit的周期为1.25us。
逻辑1电平
由逻辑图可以看出,要发送数据”1“,高电平脉宽为810ns,低电平脉宽为440ns。
逻辑0电平
由逻辑图可以看出,要发送数据”0“,高电平脉宽为310ns,低电平脉宽为940ns。
需要注意的是:一、因为没有”地址“概念,所以不能对单灯物理寻址,每次发送数据,都要将全部数据”刷新“一次,程序上先将每个灯的数据映射到内存区域,要改变那个点的数据,先在内存中计算出来,再批量将内存显示数据(所有灯点的内存射,值为灯数*3 byte)发送,发关时先发送高位,再发送低位,先发送G信号(第一灯),再发送R信号(第一灯),最后发送B信号(第一灯),然后再发送G信号(第二灯)……
二、每次开始,都应”复位“,就是写一串0数据到每个灯,让所有灯熄灭。
三、如果将DIN置低电平超过80us,则被认为是复位信号,复位信号不会熄灭已经点亮的灯,只是让信号重新传输而已。
四、空闲状态一直是低电平,这样自动复位,下次信号来了又从第一个灯开始数据传送。