WS2812模块接线教程

序言

WS2812是一种集成了电流控制芯片的低功耗的RGB三色灯。我们特别钟爱这款简单的组合LED。它已经在很多款商品中得到应用,包括下面这个的WS2812 Breakout板。

而 LilyPad Pixel 也是这样一类电路板,但是它的LED则是位于一个紫色的圆环之内。这种做法使它有利于缝合在衣物或者其他纺织物,那么就可以很方便的嵌入一个智能纺织物的项目中。

最后,WS2812还是各种LED灯带的灵魂所在,这种灯带有以下四种规格:密封的5m,密封的1m,裸露的5m,裸露的1m。

让WS2812真正独特的是它的控制方式。嵌入在LED里面的IC通过一种独一无二的单总线接口和外界进行通讯。有了已经写好的驱动库,使得我们可以很容易去控制它。加上他们可以级联,也就是我们可以通过将一个LED的信号输出端连接至另外一个LED,以此类推,创造出数以百计的LED组成的灯带。要是你连接的LED足够多,那么你就可以作出很棒的动画了!

在这个教程里,我们将会带你熟悉一下WS2812的工作方式。首先,我们先说明一下上面提到的几块板子是的连接方式,也就是LilyPad或者LED灯带。然后我们先把教程放一边,把Arduino的代码了解了解。

材料准备

显然,你先需要一个WS2812的板子或者灯带。LED连得越多就越好玩!在例子里我们会把5块板子连接在一起用,不过这并不妨碍你把例程很方便地应用于到其他的项目。

在我们开始展示例程给你们看之前,你还需要一个微型处理器。使用它我们才能给LED发送0/1的控制信号。我们用的板子是 Arduino Uno,但是一些其他的Arduino板子也是可以的。而且你也可以把例程的代码移植到你喜欢的微处理器上。

现在,你还需要把LED板和Arduino板进行连接。你可以用洞洞板,也可以用杜邦线直接连接它们,随你喜欢。

工具

为了我们的电路板足够稳定,你还需要把所要用到的引脚都焊接好。那意味着你至少一把电烙铁和一些焊锡。你可以点击我们的“如何焊接”教程去学习焊接如果你是第一次焊接的话。

建议阅读

这些板子都不难使用。如果你之前有用过任何的Arduino板,那你应该能很快上手WS2812了。如果你还没搞懂什么是Arduino,或者你还不熟悉下面的这些东西,那你应该考虑阅读一下这些教程。

W2812 上视图

WS2812比我们乍一看以为的复杂的多,它看起来像一个普通的5050-sized(5x5mm)LED,但实际上远不止这么简单,它里面是有一个电流控制集成电路的。如果你仔细看的话,你会看到那些藏在里面的微小的芯片, 芯片上还有几根金丝连接到LED上。

非常细腻的WS2812的内部细节

这款LED本身很像普通的RGB(红、绿、黄)LED。每一种颜色的亮度可以通过脉宽调制,,,实现256级的分级控制。这意味着它能通过组合RGB的亮度,实现16,777,216(2563)种颜色。所以你可以调制出任何的颜色,无论是白色到黑色(关闭RGB),还是到橙色到红褐色。

电路板的引出脚

这款电路板安置有一颗多彩LED在板上,并且留出了几个引脚用于控制LED。

下面我们来介绍一下四个独立的引脚:

5V-这个引脚需要由一个5V-7V的直流电源接入。电压过高(7V)的话会烧毁LED,电压太低(5V)的话则会造成亮度过低,甚至造成LED不工作。

GND-公共引脚,接地,即接电源的负极。

DI-微控制器(或者是另外一个WS2812)的数据从这个引脚传入LED。

DO-数据从这里输出给下一级的WS2812,如果这个WS2812是最后一级,则可直接悬空此引脚。

数据传输接口

注意:

以下的介绍很简单,甚至对你理解这块板子如何使用也没有太大的作用.(那应该是库应该做的,对吧?!)之所以我还是要谈及,是因为这个接口实在是太特别了。

这个用于微处理器和WS2812数据传输的接口很奇怪。它只有一条线,但是却不像已有的标准,如UART串行接口。这个接口的时序很特别。只有逻辑0和逻辑1,而逻辑0或1各有它们自己对应的脉冲宽度。

逻辑0和逻辑1的时序图

在一个低电平的复位脉冲(至少维持50us)后,这些数据以24位二进制数–每种颜色8位二进制数,被按顺序地发送出去.

一串24位二进制数–每种颜色8位二进制数。先是绿色,然后是红色,最后是蓝色。

某种特定的颜色(RGB之一)的值越大,则这种颜色的亮度越大。如果每种颜色(RGB)都被设置为0,则LED被关闭。如果每种颜色都被设置为最大,即255,那么LED会显示为它能显示的最亮的白色。

综上所述,这个接口的时序是非常的特别的。为了让这些灯亮起来,你需要一个能发出精确时间脉冲的处理器,例如Arduino;而树莓派或者pcDuino是不能发出精确时间脉冲的。如果有一位数据的脉冲周期短于1ms,则可能会造成LED发出深紫色的光而不是你要的纯紫色。

硬件连接

这种LED最棒的地方就在于它们很容易连在一起。微控制器的的一个引脚就可以控制起整个灯带。在下面这个例子里,我们将会连接5个LED以做示范,而你可以连接十倍数目甚至更多的LED,都是可以的。

焊接/缝制/接线

组装电路的第一步就是要实现控制板和LED的可靠连接。你需要焊接所有的接头或者直接接线。又或者把你的LilyPad Pixel板用电线缝起来,或者用线把LED串起来,连成一条灯带。

如果你打算把LED和面包板或者其他定型的板连接起来,那么用杜邦线是最好的选择。

面包板上连接在一起的WS2812板。藏在下方的白线是用于连接上级的DO和下级的DI的。

如果你打算做一条大的灯带,你可能需要把接口焊接在一起

通过连接DI和DO将WS2812板连成链状(不要忘了供电)。

选择一个直流电源

WS2812需要大约5V才能工作。它可以在4V到7V的范围内工作,但是5V的电源可以直接在很多的板子上引用过来。例如Arduino上的5V电源,就是一个很好的LED电源。

同时,你也要考虑到你的灯带需要多少的电流去驱动。一般来说,一个亮度全开的LED,他的板子需要至少60mA(每个通道20mA)。如果你把10块LED板连到一起,那么你最好找一个600mA的电源。是的!如果你串了很多个这些LED,那就要确保你的电源能提供上这些电流。如果你最后决定你要用一个外部电源,那你要确保你的电源地和Arduino的地有连到一起。

连接Arduino

Arduino的连接是想当容易的。你可以用Arduino上的5V和GND给LED板供电。然后你仅需要挑出一个空闲的I/O口用来控制LED。那么在例程里我们是用了pin 4口。要连接很多LED板的话,只需要把信号输出口和下一级的信号输入口连接。同时,要确保每块板子都有被供电。

保护你的WS2812

除了上述的连接,我们推荐添加以下的步骤以确保你的WS2812工作更加稳定。

加一个大的电解电容

在WS2812连接电源前,在电源和地之间并联一个大电容。它的容值在100uF到1000uF间最好。

这个电容可以让你的电源输出更加平滑。WS2812的负载电流的变化范围很广,当电流上下变化时,它可以补偿电源的电流变化,保证电源的稳定输出。这个电容的作用相当于一个电源储备库,在电源充足的时候把能量储存起来。

另外,尝试把这个电容尽量靠近你的WS2812。

串联一个电阻在信号线中间

Arduino的输出口和WS2812的输入口间串联一个小电阻将会有助于保护输出口。阻值的话在220到470欧比较合适。

尽量把电阻放得离WS2812更近一些。

不要把线接的过长!

导线其实是没办法完美地导电的。很多时候导线是会造成一定的压降的,特别是当它们很长的时候。为了保证电源的有效供应,电源和Arduino、WS2812间的连线要尽可能的短以保证压降最小。

添加固件

为了我们的例程,我们最好先使用 Adafruit’s fantastic NeoPixel库。

点击这里下载例程,还有Adafruit’s fantastic NeoPixel库。这个库在 Adafruit NeoPixel文件夹里,例程是在WS2812_Breakout_Example文件夹里。

你需要先装好这个库。点击这里,可以看如何安装Arduino的库。

库装好了之后,打开WS2812_Breakout_Example.ino。在你下载代码前,先确认你已经调整过了宏定义PIN和LED_COUNT了。PIN定义了哪个引脚和第一块pixel板连接,LED_COUNT定义了一共有多少LED要驱动。接着,让我们下载代码然后玩起来吧!

NeoPixel的库

设置

在使用库之前,有几行代码需要你设置一下。首先,在最一开始那里的代码,有个结构体,你可能希望它是一个全局变量。

COPY CODE

#define PIN 4

#define LED_COUNT 8

 

// Create an instance of the Adafruit_NeoPixel class called “leds”.

// That’ll be what we refer to from here on…

Adafruit_NeoPixel leds = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);

PIN和LED——COUNT参数也需要设置一下,PIN定义了哪个引脚和第一块pixel板连接,LED_COUNT定义了一共有多少LED要驱动。

剩下的设置就是在setup()函数前的leds.begin()函数。

点亮一颗LED

用Adafruit NeoPixel库点亮一颗LED只需要两个步骤。第一步,你必须按要求用leds.setPixelColor(position, color) 函数设置它的颜色。函数里的颜色参数可以是任意的24位RGB值,或者是3各颜色用3个独立的字节。例如:

COPY CODE

leds.setPixelColor(4, 0xFF00FF);    // Set fourth LED to full red, no green, full blue

leds.setPixelColor(4, 0xFF, 0x00, 0xFF)  // Also set fourth LED to full red, no green, full blue

设置好了一个LED的颜色后,不代表它就会开始工作。为了让它真正工作,你需要调用函数callleds.show()。注意,调用这个函数会让所有的LED以设置好的颜色工作。

Setting a pixel’s color does not equate to that pixel actually turning on though. For that, you need to callleds.show(). Note that when this function is called any LED that was previously set will turn on.

代码的其他部分

在你已经掌握如何使用NeoPixel库后,剩下的代码都是在控制LED的颜色的。在这个例程里还有一些有趣的功能,例如实现彩虹灯等。希望你可以利用它们去做一些更有创造力的动画。

在WS2812_Definitions.h这个头文件里,还定义了一些标准颜色的列表。里面有从黑色到白色的所有颜色。

祝你玩得开心!


cc

原始文章采用CC BY-SA 4.0,您可以自由地:

  • 演绎 — 修改、转换或以本作品为基础进行创作
  • 在任何用途下,甚至商业目的。
  • 只要你遵守许可协议条款,许可人就无法收回你的这些权利。

本文由翻译美国开源硬件厂商Sparkfun(火花快乐)的相关教程翻译,原始教程采用同样的CC BY-SA 4.0协议,为便于理解和方便读者学习使用,部分内容为适应国内使用场景稍有删改或整合,这些行为都是协议允许并鼓励的。

原始文章及相关素材链接:

https://learn.sparkfun.com/tutorials/ws2812-breakout-hookup-guide?_ga=1.266035463.946766378.1445226389