Industriële fabricage
Industrieel internet der dingen | Industriële materialen | Onderhoud en reparatie van apparatuur | Industriële programmering |
home  MfgRobots >> Industriële fabricage >  >> Manufacturing Technology >> Productieproces

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

Onderdelen en benodigdheden

Digilent WS2812 Addressable LED Strip (IP60, 60 LEDs/m, niet waterdicht, totaal 128 LEDs) 128
Arduino Nano R3 1
3A Mini DC-DC step-down converter voltageregelaar 1
Weerstand 10k ohm 1
Weerstand 330 ohm 1
Condensator 470 µF (10V low profile) 1
10K lin 45mm Schuifpotmeter (30mm slaglengte, bv. Bourns PTA3043) 1
Kleine drukknop 1
Kleine wipschakelaar 1
DC-voedingsconnector (paneelversie) 1
7mm x 100mm Lijmstaven 64

Benodigde tools en machines

  • 3D-printer (algemeen)

Apps en online diensten

  • Arduino IDE

Over dit project

Deze lamp is gebaseerd op een vergelijkbare lamp genaamd Fiber Optic LED Matrix van jbumstead. Met OpenSCAD was het doel om de 12mm Diffused Digital RGB LED's uit jbumsteads ontwerp te vervangen door goedkopere WS2812B RGB-strips en de behuizing voor de LED's en elektronica zo dun mogelijk te maken, zodat goedkopere 7mm lijmstaven gebruikt kunnen worden.

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

De behuizing printen

Het enige deel dat supports vereist is Hot Glue Matrix - Bottom.stl. Ik gebruikte een laaghoge van 0,2mm en 15% infill. Ik ontdekte dat het vergroten van de gaten met een 19/64" boor na het printen het gemakkelijker maakte om de lijmstaven in de gaten te krijgen.

De lampsectie monteren

  1. Snij de WS2812B LED-strips in 16 strips van elk 8 LEDs.
  2. Je kunt de LED-strips niet direct op de boven- of ondervorm aansluiten omdat ze omgekeerd worden geplaatst. Plak 8 strips op een vlakke oppervlak met het midden van elke strip 15mm van de angrenzende strip. Rangschik de strips zodat elke andere strip de tegenovergestelde richting uitwijst.
DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

Zorg dat DIN in de linkerbovenhoek zit. Wire de strips zoals hierboven getoond. Ik gebruikte wire-wrap draad, maar je kunt elke dun geïsoleerde koperdraad gebruiken. Zodra het bedraad is, voeg drie lange meeraderige draden toe aan GND, DIN en +5V. Deze draden gaan door een gat en verbinden met GND, DOUT en +5V van de ondersectie. Voer nu de drie draden door het gat in de Hot Glue Matrix - Holder Top vorm en plaats de strips omgekeerd zorgvuldig in hun respectieve kanalen. De strips moeten plat liggen. Als niet, controleer of de strips de juiste kant op zitten. Ze passen maar op één manier. Er zijn ook kanalen voor de draden. Zodra de LED-strips in positie zijn, bevestig ze met blauw schilderstape.

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display
  1. Wire de onderplaat op een vergelijkbare manier. DOUT is rechtsboven. Voeg de drie lange meeraderige draden toe aan VCC, DIN en GND voordat je de strips omgekeerd op de vorm plaatst. Deze draden gaan naar de PCB.
DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display
  1. Verbind de draden van de bovensectie nog niet totdat alle lijmstaven op hun plaats zitten.

De lijmstaven toevoegen

Dit vereist wat geduld. Eerst moet je de lijmstaven sorteren. De 7mm lijmstaven van eBay zijn ongeveer 100mm lang. Ik ontdekte dat ze iets variëren. Mijn verpakkingen bevatten 30 stuks, dus ik had 90 staven om 64 van vergelijkbare lengte te vinden. Ook moest ik de gaten vergroten met een 19/64" boor na het printen om ze makkelijker te laten passen.

Ik gebruikte ook een heldere drinkstroom om de drie draden die de boven- en onderstrips verbinden, in te plaatsen.

Voeg de lijmstaven rij voor rij toe, beginnend aan één kant en werkend naar de andere kant. Zodra ze allemaal zitten, meet de afstand tussen boven en onder aan elke hoek. Ze moeten ALLEMAAL PRECIES HETZELFDE zijn. Zo niet, pas de diepte van de lijmstaven aan. Zodra je tevreden bent over de uitlijning, haal de lijmstaven uit elke hoek en zet ze terug met een klein beetje superlijm. (Geen superlijm op de LED). Dit maakt de structuur robuust.

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

Boven- en onderstrips verbinden

Til de onderstrip bij het gat voorzichtig op, knip de drie draden tot lengte en soldeer ze op hun plek. +5V aan +5V, DIN (boven) aan DOUT (onder), GND aan GND.

De PCB maken

Ik heb de Eagle-bestanden bijgevoegd als je de printplaat commercieel wilt laten maken of zelf wilt maken zoals ik. Ik maakte mijn bord met de toner-methode. Je kunt ook gewoon een stuk prototypebord gebruiken omdat het schema heel simpel is en makkelijk op te bouwen. De 4 montagegaten moeten uitgeboord worden met een 2,5mm boor en een draad gemaakt met een 3mm tap. Gebruik 6mm M3 schroeven om het bord vast te zetten.

BELANGRIJK: Stel de uitgang van de DC-regelaar op 5V IN voordat je het op het bord monteert.

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

Eindbedrading

Wire de schuifpotmeter, drukknop, voedingsschakelaar en DC-voedingsconnector zoals hieronder getoond:

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

Verbind de draden van de LED-strips met de PCB.

Software

De bijgevoegde software draait een reeks testanimaties. De knop schakelt door de beschikbare animaties. De potmeter regelt de snelheid van de animaties.

Code

GlueMatrixTest.ino (C/C++)

#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
#include <avr/power.h>
#endif
#include "Button.h"
#define PIN_LED 2
#define PIN_SWITCH 3
#define PIN_POT A0
#define LEDS 128

Adafruit_NeoPixel strip = Adafruit_NeoPixel(LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);
Button mode = Button(PIN_SWITCH);
bool modePressed = false;

// Fysieke LED mapping voor onder- en bovenarrays
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,121
};

int red = 128, green = 128, blue = 128;
int pattern = 1;

void setup() {
  Serial.begin(115200);
  pinMode(PIN_LED, OUTPUT);
  pinMode(PIN_SWITCH, INPUT);
  pinMode(PIN_POT, INPUT);
  strip.begin();
  strip.show();
  Button::PinChangeSetup(PIN_SWITCH);
}

void loop() {
  if (modePressed) {
    pattern = (pattern % 8) + 1;
    strip.clear();
  }
  modePressed = false;
  Serial.print("Mode ");
  Serial.print(pattern, DEC);
  Serial.println();
  switch (pattern) {
    case 1: colorWipe(strip.Color(255, 0, 0)); break;
    case 2: colorWipe(strip.Color(0, 255, 0)); break;
    case 3: colorWipe(strip.Color(0, 0, 255)); break;
    case 4: theaterChase(strip.Color(127, 127, 127)); break;
    case 5: rainbow(); break;
    case 6: rainbowDifference(); break;
    case 7: rainbowCycle(); break;
    case 8: rainbowCycleDifference(); break;
    case 9: theaterChaseRainbow(); break;
  }
  if (!modePressed) modePressed = mode.Pressed();
}

ISR (PCINT2_vect) {
  modePressed = modePressed | (mode.State() == LOW);
}

void colorWipe(uint32_t c) {
  int total = strip.numPixels() / 2;
  for(uint16_t i=0; i < total && !modePressed; i++) {
    uint8_t botIndex = pgm_read_byte(&botLED[i]) - 1;
    strip.setPixelColor(botIndex, c);
    uint8_t topIndex = pgm_read_byte(&topLED[i]) - 1;
    strip.setPixelColor(topIndex, c);
    strip.show();
    delay(map(analogRead(PIN_POT), 0, 1024, 100, 0));
  }
  for(uint16_t i=total; 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();
    delay(map(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 < total && !modePressed; i++) {
      uint32_t c = Wheel((i+j) & 255);
      uint8_t botIndex = pgm_read_byte(&botLED[i]) - 1;
      strip.setPixelColor(botIndex, c);
      uint8_t topIndex = pgm_read_byte(&topLED[i]) - 1;
      strip.setPixelColor(topIndex, c);
    }
    strip.show();
    delay(map(analogRead(PIN_POT), 0, 1024, 40, 0));
  }
}

void rainbowDifference() {
  int total = strip.numPixels() / 2;
  for(uint16_t j=0; j < 256 && !modePressed; j++) {
    for(uint16_t i=0; i < total && !modePressed; i++) {
      uint32_t c = Wheel((i+j) & 255);
      uint8_t botIndex = pgm_read_byte(&botLED[i]) - 1;
      strip.setPixelColor(botIndex, c);
      c = Wheel((i+j+64) & 255);
      uint8_t topIndex = pgm_read_byte(&topLED[i]) - 1;
      strip.setPixelColor(topIndex, c);
    }
    strip.show();
    delay(map(analogRead(PIN_POT), 0, 1024, 40, 0));
  }
}

void rainbowCycle() {
  int total = strip.numPixels() / 2;
  for(uint16_t j=0; j < 256*5 && !modePressed; j++) {
    for(uint16_t i=0; i < total && !modePressed; i++) {
      uint32_t c = Wheel(((i * 256 / total) + j) & 255);
      uint8_t botIndex = pgm_read_byte(&botLED[i]) - 1;
      strip.setPixelColor(botIndex, c);
      uint8_t topIndex = pgm_read_byte(&topLED[i]) - 1;
      strip.setPixelColor(topIndex, c);
    }
    strip.show();
    delay(map(analogRead(PIN_POT), 0, 1024, 40, 0));
  }
}

void rainbowCycleDifference() {
  int total = strip.numPixels() / 2;
  for(uint16_t j=0; j < 256*5 && !modePressed; j++) {
    for(uint16_t i=0; i < total && !modePressed; i++) {
      uint32_t c = Wheel(((i * 256 / total) + j) & 255);
      uint8_t botIndex = pgm_read_byte(&botLED[i]) - 1;
      strip.setPixelColor(botIndex, c);
      c = Wheel(((i * 256 / total) + j + 64) & 255);
      uint8_t topIndex = pgm_read_byte(&topLED[i]) - 1;
      strip.setPixelColor(topIndex, c);
    }
    strip.show();
    delay(map(analogRead(PIN_POT), 0, 1024, 40, 0));
  }
}

void theaterChase(uint32_t c) {
  int total = strip.numPixels() / 2;
  for (int j=0; j < 10 && !modePressed; j++) {
    for (int q=0; q < 3 && !modePressed; q++) {
      for (uint16_t i=0; i < total && !modePressed; i+=3) {
        uint8_t botIndex = pgm_read_byte(&botLED[i+q]) - 1;
        strip.setPixelColor(botIndex, c);
        uint8_t topIndex = pgm_read_byte(&topLED[i+q]) - 1;
        strip.setPixelColor(topIndex, c);
      }
      strip.show();
      delay(map(analogRead(PIN_POT), 0, 1024, 1, 150));
      for (uint16_t i=0; i < total && !modePressed; i+=3) {
        uint8_t botIndex = pgm_read_byte(&botLED[i+q]) - 1;
        strip.setPixelColor(botIndex, 0);
        uint8_t topIndex = pgm_read_byte(&topLED[i+q]) - 1;
        strip.setPixelColor(topIndex, 0);
      }
    }
  }
}

void theaterChaseRainbow() {
  int total = strip.numPixels() / 2;
  for (int j=0; j < 256 && !modePressed; j++) {
    for (int q=0; q < 3 && !modePressed; q++) {
      for (uint16_t i=0; i < total && !modePressed; i+=3) {
        uint32_t c = Wheel((i+j) % 255);
        uint8_t botIndex = pgm_read_byte(&botLED[i+q]) - 1;
        strip.setPixelColor(botIndex, c);
        uint8_t topIndex = pgm_read_byte(&topLED[i+q]) - 1;
        strip.setPixelColor(topIndex, c);
      }
      strip.show();
      delay(map(analogRead(PIN_POT), 0, 1024, 1, 150));
      for (uint16_t i=0; i < total && !modePressed; i+=3) {
        uint8_t botIndex = pgm_read_byte(&botLED[i+q]) - 1;
        strip.setPixelColor(botIndex, 0);
        uint8_t topIndex = pgm_read_byte(&topLED[i+q]) - 1;
        strip.setPixelColor(topIndex, 0);
      }
    }
  }
}

uint32_t Wheel(byte WheelPos) {
  WheelPos = 255 - WheelPos;
  if (WheelPos < 85) return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);
  if (WheelPos < 170) {
    WheelPos -= 85;
    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);
  }
  WheelPos -= 170;
  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);
}

Button.h (C Header)

#pragma once
#include "Arduino.h"
#define DEBOUNCE_DELAY 5
#define REPEAT_START_SPEED 500
#define REPEAT_INCREASE_SPEED 50
#define REPEAT_MAX_SPEED 50

class Button {
public:
  Button(int Pin);
  void Background(void (*pBackgroundFunction)());
  void Repeat(void (*pRepeatFunction)());
  bool Pressed();
  int State();
  static void PinChangeSetup(byte pin);
private:
  int _pin;
  void (*_repeatCallback)(void);
  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(byte pin) {
  *digitalPinToPCMSK(pin) |= bit(digitalPinToPCMSKbit(pin));
  PCIFR |= bit(digitalPinToPCICRbit(pin));
  PCICR |= bit(digitalPinToPCICRbit(pin));
}

bool Button::Pressed() {
  bool pressed = false;
  if (digitalRead(_pin) == LOW) {
    unsigned long wait = millis() + DEBOUNCE_DELAY;
    while (millis() < wait) {
      if (_backgroundCallback != NULL) _backgroundCallback();
    }
    if (digitalRead(_pin) == LOW) {
      if (_repeatCallback != NULL) _repeatCallback();
      unsigned long speed = REPEAT_START_SPEED;
      unsigned long time = millis() + speed;
      while (digitalRead(_pin) == LOW) {
        if (_backgroundCallback != NULL) _backgroundCallback();
        if (_repeatCallback != NULL && millis() >= time) {
          _repeatCallback();
          unsigned long faster = speed - REPEAT_INCREASE_SPEED;
          if (faster >= REPEAT_MAX_SPEED) speed = faster;
          time = millis() + speed;
        }
      }
      pressed = true;
    }
  }
  return pressed;
}

int Button::State() { return digitalRead(_pin); }

Aangepaste onderdelen en behuizingen

STL-bestanden voor 3D-printen: stl_files_vSNeOCJWDn.zip

Schema's

DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display
DIY Hot Glue LED Matrix Lamp – Bouw je eigen kleurrijke display

Schema en PCB in Eagle-formaat: eagle_files_D8oAM5ngf5.zip

Productieproces

  1. Halogeenlampen: Technologie, Geschiedenis en Toekomst – Experts Inzicht
  2. De Geschiedenis, Productie en Toekomst van Lijm: Van Oude Hechtmiddelen tot Moderne Innovaties
  3. Hot Dogs: Geschiedenis, Productie, Voeding en Toekomstige Trends
  4. Lava Lamp: Geschiedenis, Ontwerp en Productiegeheimen
  5. Luchtballonnen: Van de Gebroeders Montgolfier tot Modern Vliegen
  6. Superlijm: chemie, productie en kwaliteitscontrole
  7. Interactieve LED-matrix deurdisplay met PIR-bewegingsensor – Arduino vakantiegroet
  8. Geluidsgeactiveerd 8-LED Lichtdisplay met Arduino
  9. Bouw een Slimme Arduino Vierpotige Robot: Stap-voor-Stap Handleiding
  10. Een 8×8 LED-matrix aansturen met Arduino Nano – Zonder drivers of bibliotheken
  11. Revolutionaire Materialen Drijven Next-Gen LED Datacommunicatie