Inhoudsopgave:
- Stap 1: Materialen
- Stap 2: Bouwplan
- Stap 3: Hardware: Circuitontwerp
- Stap 4: Hardware: acryl snijden
- Stap 5: Arduino programmeercode
- Stap 6: Een afgewerkte look
Video: Puntlichtpatroon: 6 stappen
2024 Auteur: John Day | [email protected]. Laatst gewijzigd: 2024-01-30 11:17
Ik begon met het idee van "Kan ik licht met mijn eigen handen besturen en mijn eigen wil uitdrukken?"
Het is een 'Dot Light Pattern' waarmee je zelf je eigen kleuren kunt maken, je eigen patronen met die kleuren kunt ontwerpen en verschillende animatie-effecten kunt ervaren.
Stap 1: Materialen
- Arduino UNO x 13
- WS2901 of WS2811 pixel ledstrip (130 leds)
- Knop schakelaar x 1
- Snap-schakelaar x 65
- Potenmeter x 65
- Regenboog kabel
- Vermogen voldoende SMPS
- Geleider kabel
- Transparante ronde staaf van acryl (30 mm diameter)
- Zwarte kleur acrylplaat (5T) (500 mm * 790 mm) x 2, (500 mm * 35 mm) x 2, (790 mm * 35 mm) x 2
Stap 2: Bouwplan
Stap 3: Hardware: Circuitontwerp
-
Snijd de acrylplaat zoals de bovenstaande structuur. (zie stap 2)
- Een stuk neo-pixel LED wordt op de boven- en onderkant van het gat van de potentiaalmeter geplaatst en er zijn in totaal 65 paar neo-pixel LED's bevestigd.
- Een paar neo-pixel-LED's zijn met elkaar verbonden om een enkele Arduino-pin te vormen.
- Monteer 65 potentiaalmeters in de gaten van de potentiaalmeter. (Zet het aan de andere kant van een neo-gepixeld oppervlak.)
- Bevestig 65 klikschakelaars die bij de schakelaargaten passen.
- In totaal zijn er dertien Arduino UNO's aan elk van de dertien zones bevestigd om vijf stukken van 65 stukjes hardware in één Arduino UNO te binden.
- Zoals te zien is op de bijgevoegde foto, sluit u de potentiaalmeters, snapschakelaars en neo-pixel-LED's via draad aan op de pinnen van de Arduino UNO. (zie stap 2)
- GND- en 5V-pinnen van verschillende Arduino UNO's worden verzameld in kabeldraden en vervolgens aangesloten op externe voeding. (zie stap 2)
- Verwijder het stof door luchtdruk.
Stap 4: Hardware: acryl snijden
- Snijd de acrylstaaf op een lengte van 50 mm.
- De ene kant van de acrylstaaf is geboord op de maat en diepte om overeen te komen met het controllergedeelte van de potentiaalmeter.
- De acrylstaaf is iets breder getrimd dan het gat voor een speling die goed in de potentiaalmeter past.
-
De andere kant geeft een beetje schuurpapier zodat het licht netjes kan worden doorgelaten.
Stap 5: Arduino programmeercode
www.kasperkamperman.com/blog/arduino/ardui…
'hsb naar rgb'-code를 참고한 사이트
#erbij betrekken
//'adafruit_neopixel'헤더파일라는 외부 라이브러리를 포함
//네오픽셀 연결 핀번호 선언
#define PIN1 2 #define PIN2 3 #define PIN3 4 #define PIN4 5 #define PIN5 6
#define NUMPIXELS 2 //네오픽셀 LED 갯수
#define NUM_LIGHTS 5 //작동 모듈갯수(네오픽셀 오브젝트 갯수)
//네오픽셀 오브젝트 Array 선언
Adafruit_NeoPixel-pixels = { Adafruit_NeoPixel(NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800), NEOPixel(NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800), NEOPixel(NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS,HGR PIN3, NEO_NeoPixel Adafruit_NeoPixel(NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800)}; ////네오픽셀을 사용하기 위해 객체 하나를 생성한다. //첫번째 인자값은 네오픽셀의 LED의 개수 //두번째 인자값은 네오픽셀이 연결된 핀번호 //세번째 인자값은 네오픽셀의 타입에 바뀌는 vlag
//////////////////////////////////////////////////////////////
//////HSV 를 RGB로 변환하는 함수 getRGB()를 위한 변수와 함수 선언
const-byte dim_curve = {
0, 1, 1, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 6, 6, 6, 6, 6, 6, 6, 6, 7, 7, 7, 7, 7, 7, 7, 8, 8, 8, 8, 8, 8, 9, 9, 9, 9, 9, 9, 10, 10, 10, 10, 10, 11, 11, 11, 11, 11, 12, 12, 12, 12, 12, 13, 13, 13, 13, 14, 14, 14, 14, 15, 15, 15, 16, 16, 16, 16, 17, 17, 17, 18, 18, 18, 19, 19, 19, 20, 20, 20, 21, 21, 22, 22, 22, 23, 23, 24, 24, 25, 25, 25, 26, 26, 27, 27, 28, 28, 29, 29, 30, 30, 31, 32, 32, 33, 33, 34, 35, 35, 36, 36, 37, 38, 38, 39, 40, 40, 41, 42, 43, 43, 44, 45, 46, 47, 48, 48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, 68, 69, 70, 71, 73, 74, 75, 76, 78, 79, 81, 82, 83, 85, 86, 88, 90, 91, 93, 94, 96, 98, 99, 101, 103, 105, 107, 109, 110, 112, 114, 116, 118, 121, 123, 125, 127, 129, 132, 134, 136, 139, 141, 144, 146, 149, 151, 154, 157, 159, 162, 165, 168, 171, 174, 177, 180, 183, 186, 190, 193, 196, 200, 203, 207, 211, 214, 218, 222, 226, 230, 234, 238, 242, 248, 255, }; //
void getRGB(int hue, int sat, int val, int kleuren [5][3], int index) {
val = dim_curve[val]; sat = 255 - dim_curve [255 - zat];
//색조, 채도 및 밝기 (HSB / HSV)를 RGB로 변환
//dim_curve는 밝기값 및 채도 (반전)에서만 사용됩니다. //이것은 가장 자연스럽게 보입니다.
int r;
intg; int b; int basis;
als (za == 0) {
kleuren[index][0] = waarde; kleuren[index][1] = waarde; kleuren[index][2] = waarde; } anders {
basis = ((255 - sat) * val) >> 8;
schakelaar (tint / 60) {
geval 0: r = val; g = (((val - basis) * tint) / 60) + basis; b = basis; pauze;
zaak 1:
r = (((val - basis) * (60 - (tint % 60))) / 60) + basis; g = waarde; b = basis; pauze;
geval 2:
r = basis; g = waarde; b = (((val - basis) * (tint % 60)) / 60) + basis; pauze;
geval 3:
r = basis; g = (((val - basis) * (60 - (tint % 60))) / 60) + basis; b = waarde; pauze;
geval 4:
r = (((val - basis) * (tint % 60)) / 60) + basis; g = basis; b = waarde; pauze;
geval 5:
r = waarde; g = basis; b = (((val - basis) * (60 - (tint % 60))) / 60) + basis; pauze; }
kleuren[index][0] = r;
kleuren[index][1] = g; kleuren[index][2] = b; }
}
int rgb_colors[NUM_LIGHTS][3]; //네오픽셀 오브젝트갯수마다 RGB-kleur 선언
int tint [NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 tint 선언 int sat [NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 명도 선언 int brint [NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 밝기 서언
//일반 변수 선언
int startsSwitch = {8, 9, 10, 11, 12}; // aan/uit 버튼 핀번호 boolean startState = {false, false, false, false, false}; // aan/uit
const int colorPin = {A0, A1, A2, A3, A4}; //
int kleurwaarde = {0, 0, 0, 0, 0}; //
int animatieButton = 7; // 애니메이션 모드변환 버튼 핀번호
/////////////////////////////////////////////////
//애니메이션 모든 변환을 위한 버튼 디바운싱 변수선언 //디바운싱? 짧은 시간내 많은 이벤트가 발생하는것에 대한 문제에 대해서 지정된 시간 간격으로 함수를 호출하여 해결 int buttonState; // 입력 핀으로부터의 현재 판독값 int lastButtonState = HOOG; // 이전의 판독값은 켜진상태로 unsigned long lastDebounceTime = 0; // 출력핀이 마지막으로 전환된 시간은 0으로 unsigned long debounceDelay = 50; // 디바운싱 타임설정;출력이 깜빡이면 증가한다 int MODUS = 0; //애니메이션
int B_Interval[5]; //블링킹을 위한 각 모듈의 랜덤 속도 변수
int B_Min = 100; //블링킹 최단속도; int B_Max = 500; //블링킹 최장속도; int R_Interval = 50; //레인보우 애니메이션 속도 변수 int D_Interval = 10; //디밍 속도 변수
booleaanse B_status[5]; //블링킹을 위한 각 모듈의 상태변수
///////////////////////////////////////////////////////
//멀티테스킹 애니메이션을 위한 시간변수 선언
niet-ondertekende lange stroom Millis; //현재시간
niet-ondertekende lange B_previousMillis[5]; //각 모듈의 블링킹 타이머 unsigned long DR_Millis[5]; //각 모듈의 디밍 랜덤 타이머(예비) unsigned long R_previousMillis; //레인보우 타이머 unsigned long D_previousMillis; //디밍
boolean firstRainbow = waar; //레인보우 색상 초기화 상태변수
int RainbowSpeed; //레인보우
int Helder = 100; //디밍 초기값 int BrightnessFactor = 1; //디밍 증감 값 ///////////////////////////////////////////// //////////////////////////////////////
ongeldige setup() {
for (int i = 0; i < NUM_LIGHTS; i++) { pixels.begin(); //네오픽셀 오브젝트 초기화 }
//버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i++) { pinMode(startsSwitch, INPUT_PULLUP); // aan/uit 버튼 인풋 설정 } pinMode (animatieknop, INPUT_PULLUP); //애니메이션 버튼 인풋 설정
for (int i = 0; i <NUM_LIGHTS; i++) { B_Interval = int(willekeurig (B_Min, B_Max)); //모듈별 블링킹 랜덤 속도(인터발) 변수 생성 }
Serieel.begin(9600); //통신
}
lege lus() {
MODUS = CheckAnimMode(); //모드에 애니메이션체크모드함수를 넣는다
//버튼과 가변저항을 값을 각각 읽어 변수에 지정한다.
for (int i = 0; i <NUM_LIGHTS; i++) { startState = !digitalRead(startsSwitch); //aan/uit 버튼에서 읽은 값의 반대값을 startState에 넣어준다 //startState = digitalRead(startsSwitch); colorVal = analogRead(colorPin); //가변저항에서 읽은 값을 가변저항 초기값에 넣는다 }
schakelaar (MODE) { //애니메이션함수 스위치문
geval 0: aan(); //op함수 실행 pauze; //조건문에서
zaak 1:
regenboog(); // regenboog함수 실행 pauze;
geval 2:
dimmen(); // dimmen함수 실행 pauze;
geval 3:
knipperend(); //knipperend함수 실행 pauze; }
for (int i = 0; i < NUM_LIGHTS; i++) { pixels.show(); //네오픽셀 오브젝트 배열 켜라 }
}
/////////////////////////////////////////////////////////////
int CheckAnimMode() {
//애니메이션 선택 버튼을 읽어 모드를 결정한다.
////////////////////////////////////////////////// /// currentMillis = millis(); // 시간 측정 int reading = digitalRead(animationButton); if (lezing != lastButtonState) { //입력핀으로부터 이전의 버튼의 상태와 판독값 비교 lastDebounceTime = millis(); //현재 시간을 출력핀이 마지막으로 전환된 시간에 넣음 }
if ((currentMillis - lastDebounceTime) > debounceDelay) {
if (lezing != buttonState) { //입력핀으로부터 받은 현재값과 판독값과 비교
buttonState = lezen; //판독값을 knopStatus에 대입
if (buttonState == LAAG) { //버튼상태가 꺼져있다면
MODUS++; //버튼모드 1씩 증가 if (MODE > 3) {MODUS = 0; firstRainbow = waar; //레인보우 색상 초기화 상태 켜짐 Helderheidsfactor = 1; //디밍 증감값 Helder = 15; //밝기는 15 } } } }
lastButtonState = lezen; //판독값을 이전의 버튼상태에 대입
terug MODUS; 함수를 종료하고 modus함수로 값을 리턴하라 }
////////////////////////////////////////////////////////////////////
// animatie modus functie
//Aan
void on() { Serial.println("aan"); //시리얼 모니터에 on을 써라 for (int i = 0; i <NUM_LIGHTS; i++) { color_set(i, colorVal); //가변저항 값에 따라 컬러 셋팅 } }
//Regenboog
void rainbow() { Serial.println("regen"); //시리얼 모니터에 rain을 써라 if (firstRainbow) { RainbowSpeed = 0; //레인보우 속도 초기화 firstRainbow = false; //레인보우 색상 초기화 상태 꺼짐 } if (millis() - R_previousMillis > R_Interval) { //흐른 시간값이 레인보우 인터벌 값보다 크면 R_previousMillis = currentMillis; //현재시간을 이전의 레인보우 시간에 넣어라 RainbowSpeed += 10; //레인보우 변환변수에 10을 더해라 }
for (int i = 0; i <NUM_LIGHTS; i++) { color_set(i, (colorVal + RainbowSpeed) % 1023); //레인보우컬러셋팅 }
}
//Dimmen
void dimming() { Serial.println("dimm"); //시리얼모니터에 dimm을 써라 Serial.println(Helder); //시리얼모니터에 Helder를 써라 if (currentMillis - D_previousMillis > D_Interval) { //흐른 시간값이 디밍 인터벌 값보다 크면 D_previousMillis = currentMillis; //현재시간을 이전의 디밍 시간에 넣어라 Helder += Helderheidsfactor; //밝기에 디밍 증감값 1씩 올려라 } if (Helder 254) { BrightnessFactor = -1 * BrightnessFactor; } Helder = beperken (Helder, 99, 254); //변수 밝기값을 최소값99~최대값254 사이의 값으로 한정한다
for (int i = 0; i <NUM_LIGHTS; i++) { dim_color_set(i, Bright); //디밍컬러셋팅 } }
// Knipperend
void knipperend() { Serial.println("knipper"); //시리얼모니터에 knipperen를 써라
voor (int i = 0; i B_Interval) { //흐른 시간값이 블링크 인터벌 값보다 크면
B_previousMillis = huidigeMillis; //현재시간을 이전의 블링크 시간에 넣어라 B_staat = !B_staat; //각 모듈의 블링킹 상태변수의 값의 반대값을 대입하라 } } for (int i = 0; i < NUM_LIGHTS; i++) { if (B_state) { //모듈의 블링킹 상태가 읽 히면 color_set(i, colorVal); //가변저항 값에 따라 컬러 셋팅 } else { noColor_set(i); //읽히지 않으면 컬러 셋팅 하지않음 } }
}
////////////////////////////////////////////////////////////////////////////////////////
//kernfunctie
//kleurenset
void color_set(int index, int colorSenser) {
if (startState[index]) { hue[index] = map(colorSenser, 0, 1023, 0, 359); //0~1023값을 0~359값으로 매핑한 값을 가지고 색상값으로 지정(colorSenser에) getRGB(hue[index], 255, 255, rgb_colors, index); for (int i = 0; i < NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[index]. Color(rgb_colors[index][0], rgb_colors[index][1], rgb_colors[index] [2])); } //픽셀컬러 셋팅을 rgb_colors의 r, g, b으로 설정 } else noColor_set(index); //컬러셋팅 하지않음 }
//////geen kleur ingesteld
void noColor_set (int index) { //컬러셋팅 하지않는 함수 설정
for (int i = 0; i <NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[index]. Color(0, 0, 0)); } //픽셀컬러 세팅을 0, 0, 0으로 설정 }
////dimColor set
void dim_color_set(int index, int BC) { //디밍컬러셋팅 함수 설정
if (startState[index]) { hue[index] = map(colorVal[index], 0, 1023, 0, 359); //0~1023값을 0~359값으로 매핑한 값을 가지고 색상값으로 지정(colorVal에) getRGB(hue[index], 255, BC, rgb_colors, index); for (int i = 0; i < NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[index]. Color(rgb_colors[index][0], rgb_colors[index][1], rgb_colors[index] [2])); } ///픽셀컬러 셋팅을 rgb_colors의 r, g, b으로 설정 } else noColor_set(index); //컬러셋팅 하지않음 }
Stap 6: Een afgewerkte look
Aanbevolen:
Game Design in Flick in 5 stappen: 5 stappen
Game-ontwerp in Flick in 5 stappen: Flick is een heel eenvoudige manier om een game te maken, vooral zoiets als een puzzel, visuele roman of avonturengame
Gezichtsdetectie op Raspberry Pi 4B in 3 stappen: 3 stappen
Gezichtsdetectie op Raspberry Pi 4B in 3 stappen: In deze Instructable gaan we gezichtsdetectie uitvoeren op Raspberry Pi 4 met Shunya O/S met behulp van de Shunyaface-bibliotheek. Shunyaface is een bibliotheek voor gezichtsherkenning/detectie. Het project streeft naar de hoogste detectie- en herkenningssnelheid met
Doe-het-zelfspiegel in eenvoudige stappen (met LED-stripverlichting): 4 stappen
DIY make-upspiegel in eenvoudige stappen (met behulp van LED-stripverlichting): In dit bericht heb ik een doe-het-zelfspiegel gemaakt met behulp van de LED-strips. Het is echt gaaf en je moet ze ook proberen
Hoe plug-ins in WordPress te installeren in 3 stappen: 3 stappen
Hoe plug-ins in WordPress te installeren in 3 stappen: In deze tutorial laat ik je de essentiële stappen zien om de WordPress-plug-in op je website te installeren. In principe kunt u plug-ins op twee verschillende manieren installeren. De eerste methode is via ftp of via cpanel. Maar ik zal het niet opsommen, want het is echt compl
Akoestische levitatie met Arduino Uno stap voor stap (8 stappen): 8 stappen
Akoestische levitatie met Arduino Uno Stap voor stap (8-stappen): ultrasone geluidstransducers L298N Vrouwelijke DC-adapter voeding met een mannelijke DC-pin Arduino UNOBreadboardHoe dit werkt: eerst upload je code naar Arduino Uno (het is een microcontroller uitgerust met digitale en analoge poorten om code te converteren (C++)