Делаем RGB LED Pixels WS2801 своими руками.

 

По задумке потолок должен подсвечиваться равномерно по всему периметру комнаты 20 кв/м, метраж получается около 20 метров, покупать 20 метров ленты по 90$ за 5 метров в мои планы не входило.
Значит будем делать самодельные модули, на Ebay были закуплены чипы WS2801, и RGB светодиоды в кол-ве 500 шт.
Схема стандартная из даташита на чип WS2801, с небольшими изменениями.
Питание схемы 12v, было выбрано дабы исключить просадку по питанию из-за большой длины ленты, и дабы не городить огород из блоков питания а использовать основной Б.П который работает у меня на 12 вольтовые светодиодные светильники.

Размер одного модуля 30 х 15 мм, на борту два RGB светодиода, для удобства сборки и настройки, модули скомпонованы на П.П в 5 рядов по 4 штуки, итого на плате размером 10 х15 см получилось 20 модулей.

  • Напряжение питания - 12 v .
  • Ток потребления одного модуля -(режим смены цветов. max - 20 mA.), (режим белого. max- 70 mA).

Схема в Splan7.0
П.П в Sprint-Layout 6, так получилось что отмаркирован только верхний правый модуль.
Все детали SMD типоразмера 1206, отдельно хочется сказать про RGB светодиоды, учтите при повторении что они разные по цоколёвке, есть RGB, а также и GRB (мой случай), для уверенности нужно проверять, я не спроста на схеме их разукрасил.

Немного фото процесса изготовления, на подложке 333 от самоклейки печатаем первый слой M1 (предварительно подготовив подложку, прогрев её немного утюгом, или прогоняем на принтере в холостую, печатаем пустой файл, для меньшей усадки в дальнейшем, важно для точного совмещения слоёв).
Также на всех слоях ставим галку "печатать перекрестия углов", по ним будем совмещать слои.
Слой M2 (лицевой) печатаем зеркально.
Ложим шаблон со слоем M1 на подготовленную плату, фиксируем, приглаживая утюгом только настолько чтобы тонер прилип к плате, переворачиваем заготовку медью вверх, и ложим шаблон со слоем M2, предварительно аккуратно обрезав как можно точнее лишнюю бумагу по перекрестию углов.
Самый важный, и ответственный момент в изготовлении плат, на фото я обвёл красным, куда смотреть при совмещении шаблонов, как можно точнее совмещаем углы шаблонов, и уже капитально проглаживаем обе стороны платы.





Травить плату пришлось под покровом ночи, так как плата 100 х 150, пришлось стырить с кухни эмалированную ёмкость для холодца чтоб жена невидела этого изврата.
Смывать тонер очень хорошо жидкостью для снятия лака, она неразмазывает тонер по плате, а снимает его хлопьями, в этом деле темнота нам тоже в помощь, смываем под вытяжкой на кухне, тампончики в окно для конспирации, чтоб не воняли.



Далее самый приятный момент запайка компонентов, однако после пятой планки интузиазм у меня поубавился, и чтоб не забить совсем на это дело, за вечер я больше двух планок стараюсь не делать, попутно занимаюсь програмной частью.
Сначала паяем переходы потом лудим всё кроме светодиодов, далее моем плату (я мою спиртом с зубной щёткой) и только в самом конце напаиваем светодиоды, у них линзы сделаны из силиконоподобной массы, и от моющего средства им настанет кирдык.


Для проверки пикселей подключим их к Arduino micro, и зальём скетч strandtest с github который выводит на пиксели волну радуги, незабудьте в среде программирования Arduino подключить библиотеку Adafruit-WS2801.
Вот текст скетча, я перевёл строки где настраивается конфигурация выводов, и указывается кол-во пикселей.

#include "SPI.h"
#include "Adafruit_WS2801.h"
// Выбираем контакты на плате arduino для вывода.
uint8_t dataPin = 2; // arduino_micro SDA пин (D2)
uint8_t clockPin = 3; // arduino_micro SCL пин (D3)

// Don't forget to connect the ground wire to Arduino ground,
// and the +5V wire to a +5V supply

// Указываем количество пикселей, например 16 шт
Adafruit_WS2801 strip = Adafruit_WS2801(16, dataPin, clockPin);

// Optional: leave off pin numbers to use hardware SPI
// (pinout is then specific to each board and can't be changed)
//Adafruit_WS2801 strip = Adafruit_WS2801(25);

// For 36mm LED pixels: these pixels internally represent color in a
// different format. Either of the above constructors can accept an
// optional extra parameter: WS2801_RGB is 'conventional' RGB order
// WS2801_GRB is the GRB order required by the 36mm pixels. Other
// than this parameter, your code does not need to do anything different;
// the library will handle the format change. Examples:
//Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin, WS2801_GRB);
//Adafruit_WS2801 strip = Adafruit_WS2801(25, WS2801_GRB);

void setup() {

strip.begin();

// Update LED contents, to start they are all 'off'
strip.show();
}

void loop() {
// Some example procedures showing how to display to the pixels

colorWipe(Color(255, 0, 0), 50);
colorWipe(Color(0, 255, 0), 50);
colorWipe(Color(0, 0, 255), 50);
rainbow(20);
rainbowCycle(20);
}

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

for (j=0; j < 256; j++) { // 3 cycles of all 256 colors in the wheel
for (i=0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel( (i + j) % 255));
}
strip.show(); // write all the pixels out
delay(wait);
}
}

// Slightly different, this one makes the rainbow wheel equally distributed
// along the chain
void rainbowCycle(uint8_t wait) {
int i, j;

for (j=0; j < 256 * 5; j++) { // 5 cycles of all 25 colors in the wheel
for (i=0; i < strip.numPixels(); i++) {
// tricky math! we use each pixel as a fraction of the full 96-color wheel
// (thats the i / strip.numPixels() part)
// Then add in j which makes the colors go around per pixel
// the % 96 is to make the wheel cycle around
strip.setPixelColor(i, Wheel( ((i * 256 / strip.numPixels()) + j) % 256) );
}
strip.show(); // write all the pixels out
delay(wait);
}
}

// fill the dots one after the other with said color
// good for testing purposes
void colorWipe(uint32_t c, uint8_t wait) {
int i;

for (i=0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}

/* Helper functions */

// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}

//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 Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if (WheelPos < 170) {
WheelPos -= 85;
return Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}

Для Arduino micro на atmega 32u4 блок схема подключения пикселей будет как на картинке ниже, запитываем Arduino и пиксели от 12v, через пин VIN, после компиляции и заливки скетча, должна появиться радуга.
Небольшое видео как это работает.

Продолжение следует.

 

 

 

при перепечатке материалов, обязательна ссылка на источник.
обратная связь umnik62@yandex.ru