Светодиодная матричная лампа с горячим клеем
Компоненты и расходные материалы
![]() |
| × | 128 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
![]() |
| × | 1 | |||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 64 |
Необходимые инструменты и машины
![]() |
|
Приложения и онлайн-сервисы
![]() |
|
Об этом проекте
Эта лампа была основана на аналогичной лампе под названием "Fiber Optic" LED Matrix от jbumstead. При использовании OpenSCAD цель состояла в том, чтобы заменить 12-миллиметровый диффузный цифровой RGB-светодиод, используемый в конструкции jbumstead, на дешевые RGB-ленты WS2812B и сделать контейнер для светодиодов и электроники как можно более тонким, чтобы можно было использовать более дешевые 7-миллиметровые клеевые стержни.

Печать корпуса
Единственная часть, которая требует поддержки, - это «Матрица горячего клея - Bottom.stl». Я использовал толщину слоя 0,2 мм и заполнение 15%. Я обнаружил, что увеличение размера отверстия с помощью сверла 19/64 "после печати упростило вставку клеевых стержней в соответствующие отверстия.
Сборка секции лампы
1. Разрежьте светодиодные ленты WS2812B на 16 полосок по 8 светодиодов в каждой.
2. Вы не можете соединить светодиодные ленты вместе непосредственно на верхней или нижней формах, так как они размещаются на каждой форме в перевернутом виде. Наклейте 8 полосок на плоскую поверхность так, чтобы центр каждой полосы был на расстоянии 15 мм от соседней полосы. Расположите полосы так, чтобы все альтернативные полосы были обращены в противоположном направлении.

Убедитесь, что DIN находится в верхнем левом углу. Подключите полоски, как показано выше. Я использовал проволочную обмотку, но вы можете использовать любую тонкую изолированную медную проволоку. После подключения подключите три длинных многожильных провода к GND, DIN и + 5V. Эти провода пройдут через отверстие и соединятся с GND, DOUT и + 5V нижней секции. Теперь пропустите три проволоки через отверстие на форме «Матрица горячего клея - верхняя часть держателя» и осторожно поместите полоски вверх дном в соответствующие каналы. Полоски должны прилегать ровно. Если нет, проверьте правильность расположения полосок. Они идут только в одном направлении. Также есть каналы для проводов. Как только светодиодные ленты будут размещены на месте, закрепите их лентой Blue Painters Tape.

3. Аналогичным образом подключите нижнюю пластину. DOUT вверху справа. Добавьте три длинных многожильных провода к VCC, DIN и GND перед тем, как перевернуть полоски на форму. Эти провода подойдут к печатной плате.

4. Не подключайте провода к верхней части, пока все клеевые стержни не будут на месте.
Добавление клеящих стержней
Это потребует некоторого терпения. Для начала нужно разобрать клеевые стержни. 7-миллиметровые клеевые стержни, которые вы получаете на eBay, имеют длину около 100 метров. Я обнаружил, что они немного различаются. Моя поставлялась упаковками по 30 штук, так что у меня было 90 палочек, чтобы найти 64 одинаковой длины. Также мне потребовалось увеличить размер отверстий с помощью сверла 19/64 "после печати, чтобы облегчить их установку в отверстия.
Я также использовал прозрачную соломинку для питья, чтобы соединить три провода, соединяющие верхнюю и нижнюю полоски вместе.
Добавляйте клеящие стержни по одному ряду, начиная с одного конца и продвигаясь к другому концу. Когда все они будут на своих местах, измерьте расстояние между верхом и низом в каждом углу. Все они должны быть ТОЧНО одинаковыми. В противном случае отрегулируйте глубину клеевых стержней соответственно. Когда вы будете довольны выравниванием, удалите клеевые стержни с каждого угла и верните их на место с небольшим количеством суперклея. (Не наносите суперклей на светодиод). Это должно сделать конструкцию достаточно прочной.

Соедините верхнюю и нижнюю полосы
Осторожно поднимите нижнюю планку возле отверстия, обрежьте три провода и припаяйте их на месте. От + 5В до + 5В, DIN (вверху) на DOUT (внизу), GND на GND.
Изготовление печатной платы
Я включил файлы Eagle, если вы хотите, чтобы плата производилась серийно, или сделайте то же, что и я, и сделайте ее самостоятельно. Свою доску я сделал тонерным методом. Вы можете просто использовать кусок прототипной платы, если хотите, поскольку схема очень упрощена и ее легко подключить. 4 монтажных отверстия следует просверлить сверлом 2,5 мм и нарезать резьбу метчиком 3 мм. Используйте винты M3 6 мм, чтобы удерживать плату на месте.
ВАЖНО:Установите выход регулятора постоянного тока на 5 В, ПРЕЖДЕ чем прикрепить его к плате.

Окончательная разводка
Подключите ползунковый потенциометр, нажимной переключатель, выключатель питания и розетку постоянного тока, как показано ниже:

Подключите провода от светодиодных лент к печатной плате.
Программное обеспечение
Включенное программное обеспечение запускает серию тестовых анимаций. Кнопка переключает доступные анимации. Потенциометр регулирует скорость анимации.
Код
- GlueMatrixTest.ino
- Button.h
- Button.cpp
GlueMatrixTest.ino C / C ++
#include#ifdef __AVR__ #include # endif # include "Button.h" #define PIN_LED 2 # define PIN_SWITCH 3 # define PIN_POT A0 # define LEDS 128 // Parameter 1 =количество пикселей в полосе // Параметр 2 =номер вывода Arduino (большинство из них действительны) // Параметр 3 =флаги типа пикселя, при необходимости сложите вместе:// NEO_KHZ800 800 кГц битовый поток (большинство продуктов NeoPixel со светодиодами WS2812) / / NEO_KHZ400 400 кГц (классический 'v1' (не v2) пиксели FLORA, драйверы WS2811) // NEO_GRB Пиксели подключены к потоку битов GRB (большинство продуктов NeoPixel) // Пиксели NEO_RGB подключены для потока битов RGB (пиксели FLORA v1, а не v2) // Пиксели NEO_RGBW связаны для битового потока RGBW (продукты NeoPixel RGBW) Adafruit_NeoPixel strip =Adafruit_NeoPixel (LEDS, PIN_LED, NEO_GRB + NEO_KHZ800); Режим кнопки =Button (PIN_SWITCH); bool modePressed =false снизу и сверху; // Физическая карта светодиодов Светодиодные матрицы // Светодиод внизу (сзади, сверху) // 064 049 048 033 032 017 016 001 // 063050 047 034 031 018 015 002 // 062051 046 035 030 019 014 003 / / 061052045036029020 013 004 // 060 053044037 028 021 012 005 // 059 054 043 038 027 022 011 006 // 058055 042 039 026 023 010 007 // 057 056 041 040 025 024 009008 / / (Вид спереди сверху) // Светодиод сверху (вид сзади сверху) // 065 080 081096097112113128 // 066079082095098111114127 // 067 078083094099110115126 // 068 077 084093 100109116125 // 069 076 085092 101108117124 // 070 075 086091 102107118123 // 071074087090103106119122 // 072073088 089 104 105 120 121 // ( Вид спереди сверху) const uint8_t botLED [] PROGMEM ={64,49,48,33,32,17,16,1, 63,50,47,34,31,18,15,2, 62,51,46 , 35,30,19,14,3, 61,52,45,36,29,20,13,4, 60,53,44,37,28,21,12,5, 59,54,43,38 , 27,22,11,6, 58,55,42,39,26,23,10,7, 57,56,41,40,25,24,9,8,}; const uint8_t topLED [] PROGMEM ={65,80,81,96,97,112,113,128, 66,79,82,95,98,111,114,127, 67,78,83,94,99,110,115,126, 68,77,84,93,100,109,116,125, 69,76,85,92,101,108,117,124, 70,75 , 86,91,102,107,118,123, 71,74,87,90,103,106,119,122, 72,73,88,89,104,105,120,1 21}; // Хранение текущих значений int red =128; int green =128; int blue =128; int pattern =1; // ВАЖНО:Чтобы снизить риск выгорания NeoPixel, добавьте конденсатор 1000 мкФ на выводы питания // пикселей, добавьте Резистор 300 - 500 Ом на входе данных первого пикселя // и минимизирует расстояние между Arduino и первым пикселем. Избегайте подключения // в цепи под напряжением ... если необходимо, сначала подключите GND .void setup () {Serial.begin (115200); pinMode (PIN_LED, ВЫХОД); pinMode (ПИН_ПЕРЕКЛЮЧАТЕЛЬ, ВХОД); pinMode (PIN_POT, ВХОД); // Пиксельная полоса Serial.println ("Setup ()"); strip.begin (); strip.show (); // Инициализируем все пиксели на "выключено" // Обратные вызовы кнопок //mode.Background(ButtonBackground); // Устанавливаем ISR для смены вывода на выводе MODE Button ::PinChangeSetup (PIN_SWITCH);} void loop () {if (modePressed) {pattern =(pattern% 8) + 1; strip.clear (); } modePressed =false; Serial.print («Режим»); Serial.print (выкройка, DEC); Serial.println (); переключатель (шаблон) {case 1:colorWipe (strip.Color (255, 0, 0)); ломать; // Красный случай 2:colorWipe (strip.Color (0, 255, 0)); ломать; // Зеленый вариант 3:colorWipe (strip.Color (0, 0, 255)); ломать; // Синий корпус 4:TheaterChase (strip.Color (127, 127, 127)); ломать; // Белый корпус 5:rainbow (); ломать; случай 6:rainbowDifference (); ломать; случай 7:rainbowCycle (); ломать; случай 8:rainbowCycleDifference (); ломать; случай 9:TheaterChaseRainbow (); ломать; } если (! modePressed) {modePressed =mode.Pressed (); }} // Прерывание кнопки режима для выхода из петель и т. Д. // PCINT1 обрабатывает изменения выводов для выводов от A0 до A5ISR (PCINT2_vect) {modePressed =modePressed | (mode.State () ==LOW);} void ButtonBackground (void) {} // Заполняем точки одну за другой с помощью colorvoid colorWipe (uint32_t c) {int total =strip.numPixels () / 2; for (uint16_t i =0; i 0 &&! modePressed; i--) {uint8_t botIndex =pgm_read_byte (&botLED [i]) - 1; strip.setPixelColor (botIndex, 0); uint8_t topIndex =pgm_read_byte (&topLED [i]) - 1; strip.setPixelColor (topIndex, 0); strip.show (); задержка (карта (analogRead (PIN_POT), 0, 1024, 100, 0)); }} void rainbow () {int total =strip.numPixels () / 2; for (uint16_t j =0; j <256 &&! modePressed; j ++) {for (uint16_t i =0; i Button.h Заголовочный файл C
/ * Класс:ButtonAuthor:John Bradnam ([email protected]) Цель:библиотека Arduino для обработки кнопок * / # pragma once # include "Arduino.h" #define DEBOUNCE_DELAY 5 // Скорость повторения # define REPEAT_START_SPEED 500 # define REPEAT_INCREASE_SPEED 50 # define REPEAT_MAX_SPEED 50class Button {public:// Простой конструктор Button (int Pin); // Фоновая функция вызывается в цикле ожидания или повтора void Background (void (* pBackgroundFunction) ()); // Функция повтора вызывается при нажатии кнопки void Repeat (void (* pRepeatFunction) ()); // Проверяем, нажата ли и отпущена ли кнопка // Будет вызывать функцию повтора, если она предусмотрена bool Pressed (); // Вернуть состояние кнопки (ВЫСОКОЕ или НИЗКОЕ) - НИЗКОЕ =Нажато int State (); // Настройка прерывания при смене вывода // ISR (PCINT0_vect) прерывание при смене вывода для D8 на D13 // ISR (PCINT1_vect) прерывание при смене вывода для A0 на A5 // ISR (PCINT2_vect) прерывание при смене вывода для D0 на D7 static void PinChangeSetup (byte штырь); частный:int _pin; void (* _repeatCallback) (недействительно); void (* _backgroundCallback) (void);};Button.cpp C / C ++
#include "Button.h" Button ::Button (int pin) {_pin =pin; pinMode (_pin, INPUT);} // Устанавливаем функцию для вызова с задержкой или повторением циклаvoid Button ::Background (void (* pBackgroundFunction) ()) {_backgroundCallback =pBackgroundFunction;} // Устанавливаем функцию для вызова, если система требует повторенияvoid Button ::Repeat (void (* pRepeatFunction) ()) {_repeatCallback =pRepeatFunction;} static void Button ::PinChangeSetup (байтовый контакт) {* digitalPinToPCMSK (контакт) | =бит (digitalPinToPCMSKbit (контакт)); // включение вывода PCIFR | =bit (digitalPinToPCICRbit (pin)); // очищаем все ожидающие прерывания PCICR | =bit (digitalPinToPCICRbit (pin)); // разрешить прерывание для группы} // Проверяет, была ли кнопка нажата и отпущена // возвращает истину, если кнопка была нажата и отпущена // если предоставлен повторный обратный вызов, обратный вызов вызывается, пока нажата клавишаbool Button ::Pressed ( ) {булево нажато =ложь; if (digitalRead (_pin) ==LOW) {длинное ожидание без знака =millis () + DEBOUNCE_DELAY; в то время как (миллис () <ждать) {если (_backgroundCallback! =NULL) {_backgroundCallback (); }} if (digitalRead (_pin) ==LOW) {// Настройка цикла повтора if (_repeatCallback! =NULL) {_repeatCallback (); } длинная скорость без знака =REPEAT_START_SPEED; беззнаковое долгое время =миллис () + скорость; в то время как (digitalRead (_pin) ==LOW) {если (_backgroundCallback! =NULL) {_backgroundCallback (); } если (_repeatCallback! =NULL &&millis ()> =время) {_repeatCallback (); беззнаковый длинный быстрее =скорость - REPEAT_INCREASE_SPEED; если (быстрее> =REPEAT_MAX_SPEED) {скорость =быстрее; } время =миллис () + скорость; }} нажата =истина; }} return Press;} // Возвращаем текущее состояние кнопки int Button ::State () {return digitalRead (_pin);}
Изготовленные на заказ детали и корпуса
Файлы STL для 3D-печати stl_files_vSNeOCJWDn.zipСхема


Производственный процесс