如何将可寻址 LED 灯条 WS2812B 连接到 Arduino
基于 LED 的照明技术的发展继续迅速。就在昨天,可以使用遥控器调节亮度和颜色的控制器控制的 RGB 色带似乎是一个奇迹。今天,市场上出现了更多功能的灯具。
基于WS2812B的LED灯条
可寻址LED灯条与标准灯条的区别 RGB 事情是 每个元素的亮度和色彩比例分别调整.这使您可以获得其他类型的照明设备根本无法访问的照明效果。可寻址 LED 灯条的发光以已知方式控制 - 使用脉冲宽度调制。该系统的一个特点是为每个 LED 配备自己的 PWM 控制器。 WS2812B芯片是将三色发光二极管和控制电路组合在一个封装中。

这些元件并联组合成一个电源带,并通过串行总线控制 - 第一个元件的输出连接到第二个元件的控制输入,依此类推。在大多数情况下,串行总线建立在两条线上,其中一条传输选通脉冲(时钟脉冲),另一条传输数据。

WS2812B 芯片的控制总线由一根线组成——数据通过它传输。数据被编码为恒定频率的脉冲,但具有不同的占空比。 一个脉冲 - 一位.每个位的持续时间为 1.25 µs,零位由持续时间为 0.4 µs 的高电平和 0.85 µs 的低电平组成。该单位看起来像 0.8 µs 的高电平和 0.45 µs 的低电平。向每个 LED 发送一个 24 位(3 字节)突发,然后是 50 µs 的低电平暂停。这意味着将为下一个 LED 传输数据,以此类推链中的所有元素。数据传输以 100 µs 的暂停结束。这表明磁带编程周期已完成,可以发送下一组数据包。

这样的协议可以通过一条线路进行数据传输,但需要保持时间间隔的准确性。允许的差异不超过 150 ns。此外,这种总线的抗噪能力非常低。任何幅度足够大的干扰都可以被控制器感知为数据。这对控制电路的导体长度施加了限制。另一方面,这使得它成为可能 功能区健康检查 无需额外的设备。如果您给灯通电并用手指触摸控制总线的接触垫,某些 LED 可能会随机亮起并熄灭。
WS2812B 元件规格
要基于地址带创建照明系统,您需要了解发光元件的重要参数。
| LED 尺寸 | 5x5mm |
| PWM调制频率 | 400赫兹 |
| 最大亮度下的电流消耗 | 每个电池 60 mA |
| 电源电压 | 5伏 |
Arduino 和 WS2812B
世界流行的 Arduino 平台允许您创建用于管理地址磁带的草图(程序)。系统的能力足够广泛,但如果在某个层面上已经不够用,那么获得的技能将足以无痛地切换到 C++ 甚至汇编程序。虽然最初的知识在 Arduino 上更容易上手。
将 WS2812B 功能区连接到 Arduino Uno (Nano)
在第一阶段,简单的 Arduino Uno 或 Arduino Nano 板就足够了。未来,更复杂的电路板可用于构建更复杂的系统。将可寻址 LED 灯条物理连接到 Arduino 板时,必须遵守几个条件:
- 由于抗噪能力低,数据线的连接导体应尽可能短(尽量在10厘米以内);
- 您需要将数据导体连接到 Arduino 板的免费数字输出 - 然后将以编程方式指定;
- 由于高功耗,无需从板上为磁带供电 - 为此目的提供了单独的电源。
灯和Arduino的公共电源线必须连接。

WS2812B 程序控制基础
已经提到,为了控制 WS2812B 微电路,需要产生一定长度的脉冲,以保持高精度。 Arduino语言中有用于形成短脉冲的命令 延迟微秒 和 微.问题是这些命令的分辨率是 4 微秒。也就是说,以给定的精度形成时间延迟是行不通的。有必要切换到 C++ 或 Assembler 工具。您可以使用专门为此创建的库通过 Arduino 组织对可寻址 LED 灯条的控制。您可以开始熟悉 Blink 程序,该程序使发光元件闪烁。
快速领导
这个库是通用的。除地址磁带外,它还支持多种设备,包括由 SPI 接口控制的磁带。它有广泛的可能性。
首先,必须包含库。这是在设置块之前完成的,该行如下所示:
#include <FastLED.h>
下一步是创建一个数组来存储每个发光二极管的颜色。它将具有名称条带和尺寸 15 - 按元素数量(最好为该参数分配一个常数)。
CRGB条[15]
在设置块中,您需要指定草图将使用的磁带:
无效设置(){
FastLED.addLeds<WS2812B, 7, RGB>(strip, 15);
整数;
}
RGB 参数设置颜色序列顺序,15 表示 LED 的数量,7 是分配用于控制的输出的数量(最好为最后一个参数分配一个常数)。
循环块以一个循环开始,该循环顺序写入数组 Red(红色发光)的每个部分:
对于 (g=0; g< 15; g++)
{strip[g]=CRGB::Red;}
接下来,将形成的数组发送到灯:
FastLED.show();
延迟 1000 毫秒(秒):
延迟(1000);
然后您可以通过在其中写入黑色以相同的方式关闭所有元素。
对于 (int g=0; g< 15; g++)
{strip[g]=CRGB::黑色;}
FastLED.show();
延迟(1000);

编译和上传草图后,磁带会以 2 秒的周期闪烁。如果您需要单独管理每个颜色组件,那么而不是行 {strip[g]=CRGB::Red;} 使用了几行:
{
剥离[g].r=100;// 设置红色元素的发光级别
剥离[g].g=11;// 绿色也一样
剥离[g].b=250;// 蓝色也一样
}
新像素
该库仅适用于 NeoPixel Ring LED 灯环,但它占用的资源较少且仅包含必需品。在 Arduino 语言中,程序如下所示:
#include <Adafruit_NeoPixel.h>
与前一种情况一样,库已连接,并且声明了 lenta 对象:
Adafruit_NeoPixel lenta=Adafruit_NeoPixel(15, 6);// 其中 15 是元素的数量,6 是分配的输出
在 setup 块中,磁带被初始化:
无效设置(){
lenta.begin()
}
在循环块中,所有元素都以红色突出显示,变量被传递给 feed,并创建了 1 秒的延迟:
for (int y=0; y<15; y++)// 15 - 灯中的元素数量
{lenta.setPixelColor(y, lenta.Color(255,0,0))};
磁带.show();
延迟(1000);
辉光以黑色记录停止:
对于 (int y=0; y< 15; y++)
{ lenta.setPixelColor(y, lenta.Color(0,0,0))};
磁带.show();
延迟(1000);

视频教程:使用地址磁带的视觉效果示例。
一旦您学会了如何使 LED 闪烁,您就可以继续学习如何创建色彩效果,包括具有平滑过渡的流行彩虹和北极光。可寻址 LED WS2812B 和 Arduino 为此提供了几乎无限的可能性。
