WS2812 RGB LED系列

来自Duinopeak_COM
跳转至: 导航搜索

英文

产品简介

基于WS2812系列的RGB灯,包括超大同心圆环RGB,长形RGB灯条,独立圆环RGB盘,都可以让你仅仅使用一个主控板IO口,就可以控制所有级联起来的RGB灯!是不是有点疯狂呢?! 首先我们详细讲解一下这个最大的同心圆RGB灯环,它拥有圆形黑色的外形,61个超明亮的智能LED NeoPixels排列在一个直径86mm的圆形PCB上面。这些环形RGB灯是可以简单的通过输出引脚级联连接一个到另一个的输入引脚的(DI-->DO)。通过级联这种方式,只使用一个单片机引脚你就能控制尽可能多的LED灯!每个LED都集成了一颗驱动芯片在里面,让我们的LED变得智能和可寻址。每一个都有~18毫安恒流驱动,所以LED颜色将非常一致的,即使电压变化也是一样的,不需要外部电阻限流电阻使RGB灯环的整体设计变得苗条,就像你看到的那么简洁好用。用5V(工作电流是4-7V)的电源带动这个RGB灯环吧; 当然你也许不需要这么多个同心RGB灯环,不用着急,很简单,你只要把同心RGB圆环之间的PCB连接剪断就行了!这样就成了独立的RGB圆盘;效果如下面所示。


Ws2812-led-ring-all-1.jpgWs2812-led-ring-12-2.jpgNeopixel-1.jpgNeopixel.jpg

规格参数

  • LED 驱动芯片WS2812B(集成在LED里面)
  • 工作电压 4-7V
  • 单线通讯


应用示例

WS2812RGB使用的是一个单一的数据线和一个非常时间具体(timing-specific)协议。由于这种协议是对时间非常敏感,它需要一个实时微控制器如AVR,Arduino, PIC,mbed等它不能用于基于linux的微机或解释型的单片机如netduino或Basic Stamp之类的单片机。我们的Arduino Neopixel库支持这些小LED灯!NeoPixel库文件适合AVR内核的,如果想把它移植到其他的单片机,请让google帮助你吧。注意:需要一个8MHz或更快的处理器。
Ws2812-led-ring-12-0.jpg RGB shine 1.pngNeoPixel break01.gifNeoPixel break.gif

下面的例子演示了如何用NeoPixel的库文件来点亮一盘的RGB灯,实现炫彩的效果,当然这个程序适合WS2812系列的所有RGB灯。

在编译程序之前,请先确定你电脑上已经有了Adafruit_NeoPixel.h这个头文件,如果没有的话,请前往这里下载,点击Adafruit_NeoPixel头文件下载。 然后在把头文件解压放在你的存放程序的地方,这样的话。然后在程序中引用刚刚下载解压后的头文件,如果你不懂怎么操作这一步的话,可以前往这个地方,学习更多关于怎么导入头文件的操作,点击这里学习,正确使用Arduino丰富的库程序.

按照下面的提示,使用跳线让RGB环形灯和Arduino主控板,接上线,注意这里涉及到一些焊接的,所以首先你必须要了解一些焊接的技巧,才能很好的完成这一个步骤,如果你不懂焊接的话,没关系,可以用手轻轻的用跳线顶住RGB的焊盘,这样在Arduino上电开始运行程序的时候,也能顺利的点亮RGB灯环的。

Arduino 主控板            RGB环形灯
    5V        <-->          5V 
    pin 6     <-->          DI
    GND       <-->          GND
#include <Adafruit_NeoPixel.h>

#define PIN 6 //使用了Arduino的6号端口

// 参数 1 = number of pixels in strip
// 参数 2 = Arduino 的引脚号 (most are valid)
// 参数 3 = pixel type flags, add together as needed:
//   NEO_KHZ800  800 KHz 位流 (most NeoPixel products w/WS2812 LEDs)
//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)
//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)
//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)
//Adafruit_NeoPixel strip = Adafruit_NeoPixel(60, PIN, NEO_GRB + NEO_KHZ800);

Adafruit_NeoPixel strip = Adafruit_NeoPixel(64, PIN, NEO_GRB + NEO_KHZ800);

// 重要: To reduce NeoPixel burnout risk, add 1000 uF capacitor across
// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input
// and minimize distance between Arduino and first pixel.  Avoid connecting
// on a live circuit...if you must, connect GND first.

void setup() {
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
}

void loop() {
  // Some example procedures showing how to display to the pixels:
  colorWipe(strip.Color(255, 0, 0), 62); // Red color 62 means the number of RGB of the board
  colorWipe(strip.Color(0, 255, 0), 62); // Green color 62 means the number of RGB of the board
  colorWipe(strip.Color(0, 0, 255), 62); // Blue color 62 means the number of RGB of the board
  // Send a theater pixel chase in...
  theaterChase(strip.Color(127, 127, 127), 62); // White
  theaterChase(strip.Color(127,   0,   0), 62); // Red
  theaterChase(strip.Color(  0,   0, 127), 62); // Blue

  rainbow(20
  );
  rainbowCycle(20);
  theaterChaseRainbow(50);
}

// Fill the dots one after the other with a color
void colorWipe(uint32_t c, uint8_t wait) {
  for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, c);
      strip.show();
      delay(wait);
  }
}

void rainbow(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256; j++) {
    for(i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel((i+j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

// Slightly different, this makes the rainbow equally distributed throughout
void rainbowCycle(uint8_t wait) {
  uint16_t i, j;

  for(j=0; j<256*5; j++) { // 5 cycles of all colors on wheel
    for(i=0; i< strip.numPixels(); i++) {
      strip.setPixelColor(i, Wheel(((i * 256 / strip.numPixels()) + j) & 255));
    }
    strip.show();
    delay(wait);
  }
}

//Theatre-style crawling lights.
void theaterChase(uint32_t c, uint8_t wait) {
  for (int j=0; j<10; j++) {  //do 10 cycles of chasing
    for (int q=0; q < 3; q++) {
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, c);    //turn every third pixel on
      }
      strip.show();
     
      delay(wait);
     
      for (int i=0; i < strip.numPixels(); i=i+3) {
        strip.setPixelColor(i+q, 0);        //turn every third pixel off
      }
    }
  }
}

//Theatre-style crawling lights with rainbow effect
void theaterChaseRainbow(uint8_t wait) {
  for (int j=0; j < 256; j++) {     // cycle all 256 colors in the wheel
    for (int q=0; q < 3; q++) {
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, Wheel( (i+j) % 255));    //turn every third pixel on
        }
        strip.show();
       
        delay(wait);
       
        for (int i=0; i < strip.numPixels(); i=i+3) {
          strip.setPixelColor(i+q, 0);        //turn every third pixel off
        }
    }
  }
}

// Input a value 0 to 255 to get a color value.
// The colours are a transition r - g - b - back to r.
uint32_t Wheel(byte WheelPos) {
  if(WheelPos < 85) {
   return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
  } else if(WheelPos < 170) {
   WheelPos -= 85;
   return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  } else {
   WheelPos -= 170;
   return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
}

资源

媒体文件:DuinopeakRainbowPixelRing-24-schematic.png

购买

支持

如果你有什么困难或者好的点子, 你可以来我们的DuinoPeak论坛参与讨论.

外部链接

链接到外部网页将会给你提供更多应用创意,文档/数据表或软件库

优酷上的视频