제조공정
| × | 128 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 1 | ||||
| × | 64 |
|
|
이 램프는 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="코드">#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
제조공정
DIY LED 램프 키트는 가정에서나 전자 제품에 대해 배우기 위한 완벽한 프로젝트입니다. 이 LED 램프 키트는 환경 친화적이며 에너지 효율적이며 주택 소유자가 전기 요금을 절약하는 데 도움이 됩니다. 이러한 특성 덕분에 LED 조명은 점점 대중화되고 있습니다. LED 램프는 자체적으로 전원을 켤 수 없습니다. 일을 하려면 회로가 필요합니다. LED 키트를 만드는 것은 배우기 쉽습니다. 이 기사를 읽은 후 회로 기능이 어떻게 작동하고 LED 램프에 전원을 공급하는지 배우게 될 것입니다. 또한 이 가이드는 납땜을 통해 모든 것을
LED는 아름다운 프로젝트를 만들고 표시기 역할을 할 수 있는 다목적 구성 요소입니다. LED를 활용하는 방법은 여러 가지가 있지만 아름다움과 알림을 결합하는 방법인 LED 버튼을 제시합니다. 그러나 LED 버튼의 개념은 두 가지 의미를 가질 수 있습니다. 여러 개의 LED를 제어하는 버튼이나 버튼 형태의 LED를 의미할 수 있습니다. 이 기사에서는 LED를 버튼으로 사용하고 어떻게 작동하는지 살펴보겠습니다. 또한 휴대전화에서 LED를 제어하는 방법도 배우게 됩니다. 준비 되었나요? 시작하겠습니다! LED 버튼이란 무엇