산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

뜨거운 접착제 LED 매트릭스 램프

구성품 및 소모품

Digilent WS2812 주소 지정 가능 LED 스트립
IP60(미터당 LED 60개, 비방수, 총 128개 LED)
× 128
Arduino Nano R3
× 1
3A 미니 DC-DC 강압 컨버터 전압 조정기
× 1
저항 10k 옴
× 1
저항 330옴
× 1
커패시터 470μF
10V 로우 프로파일 유형
× 1
10K lin 45mm 슬라이더 전위계(30mm 스트로크 길이 예:Bourns PTA3043 )
× 1
작은 푸시 버튼
× 1
작은 로커 스위치
× 1
DC 전원 소켓(패널 버전)
× 1
7mm x 100mm 접착제 스틱
× 64

필요한 도구 및 기계

3D 프린터(일반)

앱 및 온라인 서비스

Arduino IDE

이 프로젝트 정보

이 램프는 jbumstead의 "Fiber Optic" LED Matrix라는 유사한 램프를 기반으로 했습니다. OpenSCAD를 사용하여 목표는 jbumstead의 설계에 사용된 12mm 확산 디지털 RGB LED를 저렴한 WS2812B RGB 스트립으로 교체하고 LED 및 전자 제품을 위한 컨테이너를 가능한 한 얇게 만들어 저렴한 7mm 접착제 스틱을 사용할 수 있도록 하는 것이었습니다.

케이스 인쇄

지원이 필요한 유일한 부분은 "Hot Glue Matrix - Bottom.stl"입니다. 0.2mm 레이어 높이와 15% 채우기를 사용했습니다. 인쇄 후 19/64" 드릴을 사용하여 구멍 크기를 늘리면 각 구멍에 글루 스틱을 더 쉽게 삽입할 수 있다는 것을 알았습니다.

램프 섹션 조립

1. WS2812B LED 스트립을 각각 8개의 LED가 포함된 16개의 스트립으로 자릅니다.

2. LED 스트립은 각 폼에 거꾸로 배치되므로 상단 또는 하단 폼에 직접 연결할 수 없습니다. 각 스트립의 중심이 인접한 스트립에서 15mm 떨어진 평평한 표면에 8개의 스트립을 붙입니다. 모든 대체 스트립이 반대 방향을 향하도록 스트립을 정렬합니다.

DIN이 왼쪽 상단 모서리에 있는지 확인합니다. 위와 같이 스트립을 배선합니다. 나는 와이어 랩 와이어를 사용했지만 얇은 절연 구리 와이어를 사용할 수 있습니다. 배선이 완료되면 GND, DIN 및 +5V에 3개의 긴 다중 가닥 전선을 추가합니다. 이 전선은 구멍을 통과하여 하단 섹션의 GND, DOUT 및 +5V와 연결됩니다. 이제 "Hot Glue Matrix - Holder Top" 양식의 구멍을 통해 세 개의 와이어를 공급하고 스트립을 각 채널에 거꾸로 조심스럽게 놓습니다. 스트립은 평평하게 놓여야 합니다. 스트립이 올바른 방향인지 확인하지 않으면 확인하십시오. 그들은 한 방향으로만 갑니다. 전선을 위한 채널도 있습니다. LED 스트립이 제자리에 있으면 파란색 페인트 테이프를 사용하여 제자리에 고정합니다.

3. 밑판도 같은 방법으로 배선합니다. DOUT은 오른쪽 상단에 있습니다. 스트립을 폼에 거꾸로 놓기 전에 3개의 긴 다중 가닥 와이어를 VCC, DIN 및 GND에 추가합니다. 이 전선은 PCB로 연결됩니다.

4. 접착제 스틱이 모두 제자리에 고정될 때까지 상단 섹션의 와이어를 아직 연결하지 마십시오.

글루 스틱 추가

약간의 인내가 필요합니다. 먼저 접착제 스틱을 분류해야합니다. eBay에서 구입한 7mm 글루 스틱의 길이는 약 100m입니다. 나는 그들이 약간 다르다는 것을 발견했습니다. 내 것은 30개들이 팩으로 들어왔기 때문에 비슷한 길이의 64개를 찾기 위해 90개의 스틱이 있었습니다. 또한 인쇄 후 구멍에 더 쉽게 맞도록 19/64" 드릴을 사용하여 구멍 크기를 늘려야 했습니다.

또한 투명한 빨대를 사용하여 상단 및 하단 스트립을 함께 연결하는 세 개의 와이어를 배치했습니다.

접착제 스틱을 한 번에 한 줄씩 추가하십시오. 한쪽 끝에서 시작하여 다른 쪽 끝까지 작업하십시오. 그들이 모두 제자리에 있으면 각 모서리에서 상단과 하단 사이의 거리를 측정하십시오. 그것들은 모두 정확히 같아야 합니다. 그렇지 않은 경우 접착제 스틱의 깊이를 적절하게 조정하십시오. 정렬에 만족하면 각 모서리에서 글루 스틱을 제거하고 소량의 슈퍼 글루로 제자리에 다시 놓습니다. (LED에 슈퍼 접착제를 바르지 마십시오). 이렇게 하면 구조가 매우 견고해집니다.

상단 및 하단 스트립 연결

구멍 근처에서 하단 스트립을 조심스럽게 들어 올리고 3개의 와이어를 다듬은 다음 제자리에 납땜합니다. +5V ~ +5V, DIN(상단) ~ DOUT(하단), GND ~ GND.

PCB 만들기

보드를 상업적으로 만들고 싶거나 내가 한 것처럼 직접 만들고 싶다면 Eagle 파일을 포함했습니다. 토너 방식으로 보드를 만들었습니다. 회로도가 매우 간단하고 배선하기 쉽기 때문에 원하는 경우 프로토 보드를 사용할 수 있습니다. 4개의 장착 구멍은 2.5mm 드릴과 3mm 탭으로 만든 나사로 뚫어야 합니다. 6mm M3 나사를 사용하여 보드를 제자리에 고정합니다.

중요:보드에 고정하기 전에 DC 레귤레이터의 출력을 5V로 설정하십시오.

최종 배선

슬라이드 전위차계, 푸시 스위치, 전원 스위치 및 DC 전원 소켓을 아래와 같이 배선합니다.

LED 스트립의 전선을 PCB에 연결합니다.

소프트웨어

포함된 소프트웨어는 일련의 테스트 애니메이션을 실행합니다. 버튼은 사용 가능한 애니메이션을 순환합니다. 전위차계는 애니메이션의 속도를 조정합니다.

<섹션 클래스="섹션 컨테이너 섹션 축소 가능" id="코드">

코드

<울>
  • GlueMatrixTest.ino
  • 버튼.h
  • Button.cpp
  • GlueMatrixTest.inoC/C++
    #include #ifdef __AVR__ #include #endif#include "Button.h#define PIN_LED 2#define PIN_SWITCH 3#define PIN_POT A0#define LEDS 128// 매개변수 1 =스트립의 픽셀 수// 매개변수 2 =Arduino 핀 번호(대부분 유효)// 매개변수 3 =픽셀 유형 플래그, 필요에 따라 함께 추가:// NEO_KHZ800 800 KHz 비트스트림(대부분의 NeoPixel 제품(WS2812 LED 포함))/ / NEO_KHZ400 400 KHz(클래식 'v1'(v2 아님) FLORA 픽셀, WS2811 드라이버)// NEO_GRB 픽셀은 GRB 비트스트림용으로 연결됨(대부분의 NeoPixel 제품)// NEO_RGB 픽셀은 RGB 비트스트림용으로 연결됨(v2가 아닌 v1 FLORA 픽셀) // NEO_RGBW 픽셀은 RGBW 비트스트림용으로 연결됩니다(NeoPixel RGBW 제품) Adafruit_NeoPixel 스트립 =Adafruit_NeoPixel(LEDS, PIN_LED, NEO_GRB + NEO_KHZ800);Button mode =Button(PIN_SWITCH);bool LED modePressed =false;//Physical용 LED 맵 LED 어레이//LED 바닥(위에서 뒤에서 본)///064 049 048 033 032 017 016 001//063 050 047 034 031 018 015 002//062 051 0903 014010 025 024 009 008 057 056 // 041 040 / 061 052 045 036 029 020 013 004 060 // 053 044 037 028 021 012 005 059 // 054 043 038 027 022 011 006 058 // 055 042 039 026 023 010 007 / /(앞에서 본)//LED 탑 (위에서 본 뒤)//065 080 081 096 097 112 113 128//066 079 082 095 098 111 114 127//067 09014 0809 // 071 074 087 090 103 106 119 122 072 // 073 088 089 104 077 084 093 100 109 116 125 069 // 076 085 092 101 108 117 124 070 // 075 086 091 102 107 118 123 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 소진 위험을 줄이려면//픽셀 전원 리드에 1000uF 커패시터를 추가하고 다음을 추가합니다. 첫 번째 픽셀의 데이터 입력//에 300 - 500 Ohm 저항을 사용하고 Arduino와 첫 번째 픽셀 사이의 거리를 최소화합니다. 연결을 피하십시오// 라이브 회로에 ... 필요한 경우 GND를 먼저 연결하십시오.void setup() { Serial.begin(115200); 핀모드(PIN_LED, 출력); 핀모드(PIN_SWITCH, 입력); 핀모드(PIN_POT, INPUT); //픽셀 스트립 Serial.println("Setup()"); strip.begin(); 스트립쇼(); // 모든 픽셀을 'off'로 초기화 //버튼 콜백 //mode.Background(ButtonBackground); //모드 핀의 핀 변경을 위한 ISR 설정 Button::PinChangeSetup(PIN_SWITCH);}void loop() { if (modePressed) { pattern =(pattern % 8) + 1; 스트립.clear(); } modePressed =거짓; Serial.print("모드"); Serial.print(패턴, DEC); 직렬.println(); 스위치(패턴) { 경우 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(); 부서지다; } if (!modePressed) { modePressed =mode.Pressed(); }}//루프를 벗어나기 위한 모드 버튼 인터럽트 etc//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 <총 ​​&&!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); 스트립쇼(); 지연(지도(아날로그 읽기(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); 스트립쇼(); 지연(지도(아날로그 읽기(PIN_POT), 0, 1024, 100, 0)); }}무지개() { 정수 합계 =strip.numPixels() / 2; for(uint16_t j=0; j <256 &&!modePressed; j++) { for(uint16_t i=0; i <총 ​​&&!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); } 스트립.쇼(); 지연(지도(analogRead(PIN_POT), 0, 1024, 40, 0)); }} 무효 rainbowDifference() { int total =strip.numPixels() / 2; for(uint16_t j=0; j <256 &&!modePressed; j++) { for(uint16_t i=0; i <총 ​​&&!modePressed; i++) { uint32_t c =Wheel((i+j) &255); uint8_t botIndex =pgm_read_byte(&botLED[i]) - 1; strip.setPixelColor(botIndex, c); c =휠((i+j+64) &255); uint8_t topIndex =pgm_read_byte(&topLED[i]) - 1; strip.setPixelColor(topIndex, c); } 스트립.쇼(); 지연(지도(analogRead(PIN_POT), 0, 1024, 40, 0)); }}// 약간 다르지만, 이는 무지개를 전체에 균등하게 분배합니다.void rainbowCycle() { int total =strip.numPixels() / 2; for(uint16_t j=0; j <256*5 &&!modePressed; j++) { // 휠의 모든 색상 5주기 for(uint16_t i=0; i  
    Button.hC 헤더 파일
    /*클래스:Button저자:John Bradnam([email protected]) 목적:버튼을 처리하는 Arduino 라이브러리*/#pragma once#include "Arduino.h#define DEBOUNCE_DELAY 5//반복 속도#define REPEAT_START_SPEED 500# 정의 REPEAT_INCREASE_SPEED 50#define REPEAT_MAX_SPEED 50class Button{ public://간단한 생성자 Button(int Pin); //대기 또는 반복 루프에 있을 때 호출되는 배경 함수 void Background(void (*pBackgroundFunction)()); //버튼을 눌렀을 때 호출되는 반복 함수 void Repeat(void (*pRepeatFunction)()); //버튼을 눌렀다 떼는지 테스트 //버튼이 제공되면 반복 기능을 호출합니다. bool Pressed(); //버튼 상태 반환(HIGH 또는 LOW) - LOW =눌림 int State(); //핀 변경 인터럽트 설정 //ISR(PCINT0_vect) D8 ~ D13용 핀 변경 인터럽트 //ISR(PCINT1_vect) A0 ~ A5용 핀 변경 인터럽트 //ISR(PCINT2_vect) D0 ~ D7용 핀 변경 인터럽트 static void PinChangeSetup(byte 핀); 개인:int _pin; 무효(*_repeatCallback)(무효); 무효(*_backgroundCallback)(무효);};
    Button.cppC/C++
    #include "Button.h"Button::Button(int pin){ _pin =pin; pinMode(_pin, INPUT);}//지연 또는 반복 루프에서 호출할 함수 설정void Button::Background(void (*pBackgroundFunction)()){ _backgroundCallback =pBackgroundFunction;}//반복 시스템이 필요한 경우 호출할 함수 설정void Button ::반복(무효(*pRepeatFunction)()){ _repeatCallback =pRepeatFunction;}정적 무효 버튼::PinChangeSetup(바이트 핀) { *digitalPinToPCMSK(핀) |=비트(digitalPinToPCMSKbit(핀)); // 핀 PCIFR 활성화 |=bit (digitalPinToPCICRbit(pin)); // 미해결 인터럽트를 모두 지웁니다 PCICR |=bit (digitalPinToPCICRbit(pin)); // 그룹에 대한 인터럽트 활성화 }//버튼을 눌렀다가 떼면 테스트// 버튼을 눌렀다가 놓으면 true를 반환합니다. // 반복 콜백이 제공되면 키가 눌려져 있는 동안 콜백이 호출됩니다.bool Button::Pressed( ){ 부울 누름 =거짓; if (digitalRead(_pin) ==LOW) { 부호 없는 긴 대기 =millis() + DEBOUNCE_DELAY; while (millis() <대기) { if (_backgroundCallback !=NULL) { _backgroundCallback(); } } if (digitalRead(_pin) ==LOW) { //반복 루프 설정 if (_repeatCallback !=NULL) { _repeatCallback(); } 부호 없는 긴 속도 =REPEAT_START_SPEED; 부호 없는 긴 시간 =millis() + 속도; while (digitalRead(_pin) ==LOW) { if (_backgroundCallback !=NULL) { _backgroundCallback(); } if (_repeatCallback !=NULL &&millis()>=시간) { _repeatCallback(); unsigned long 더 빠름 =속도 - REPEAT_INCREASE_SPEED; if (더 빠른>=REPEAT_MAX_SPEED) { 속도 =더 빠름; } 시간 =millis() + 속도; } } 누름 =참; } } 반환 누름;}//현재 버튼 반환 stateint Button::State(){ return digitalRead(_pin);}

    맞춤형 부품 및 인클로저

    3D 인쇄용 STL 파일 stl_files_vSNeOCJWDn.zip

    회로도

    Eagle 형식의 회로도 및 PCB Eagle_files_D8oAM5ngf5.zip

    제조공정

    1. 할로겐 램프
    2. 접착제
    3. 핫도그
    4. 용암 램프
    5. 열기구
    6. 고급 접착제
    7. LED 매트릭스 + 모션 센서 도어 디스플레이 [Arduino Holiday]
    8. 사운드에 의한 8x LED 조명
    9. Arduino Quadruped
    10. 차세대 LED 기반 데이터 통신용 소재