İçindekiler:

Nokta Işık Modeli: 6 Adım
Nokta Işık Modeli: 6 Adım

Video: Nokta Işık Modeli: 6 Adım

Video: Nokta Işık Modeli: 6 Adım
Video: Когда У NPC В ИГРЕ ПОЯВИЛСЯ СПОНСОР - EPIC NPC MAN на Русском 2024, Temmuz
Anonim
Image
Image
Nokta Işık Deseni
Nokta Işık Deseni
Nokta Işık Deseni
Nokta Işık Deseni

"Işığı kendi ellerimle kontrol edebilir ve kendi irademi ifade edebilir miyim?" fikriyle başladım.

Kendi renklerinizi oluşturmanıza, bu renklerle kendi desenlerinizi tasarlamanıza ve çeşitli animasyon efektlerini deneyimlemenize olanak sağlayan bir 'Nokta Işık Deseni'dir.

Adım 1: Malzemeler

Malzemeler
Malzemeler
Malzemeler
Malzemeler
Malzemeler
Malzemeler
Malzemeler
Malzemeler
  1. Arduino UNO x 13
  2. WS2901 veya WS2811 piksel LED şerit (130 LED)
  3. Düğme anahtarı x 1
  4. Snap anahtarı x 65
  5. Potansiyometre x 65
  6. Gökkuşağı kablosu
  7. Yeterince güç SMPS
  8. İletken kablo
  9. Akrilik şeffaf yuvarlak çubuk (30 mm çap)
  10. Siyah renk Akrilik levha (5T) (500mm*790mm) x 2, (500mm*35mm) x 2, (790mm*35mm) x 2

Adım 2: İnşaat Planı

Inşaat planı
Inşaat planı
Inşaat planı
Inşaat planı
Inşaat planı
Inşaat planı
Inşaat planı
Inşaat planı

Adım 3: Donanım: Devre Tasarımı

Donanım: Devre Tasarımı
Donanım: Devre Tasarımı
Donanım: Devre Tasarımı
Donanım: Devre Tasarımı
Donanım: Devre Tasarımı
Donanım: Devre Tasarımı
  1. Akrilik plakayı yukarıdaki yapı gibi kesin. (bkz. adım2)

  2. Potansiyometre deliğinin üstüne ve altına bir parça neo-piksel LED konur ve toplam 65 çift neo-piksel LED takılır.
  3. Tek bir Arduino pini oluşturmak için bir çift neo-piksel LED birbirine bağlanmıştır.
  4. Potansiyometre deliklerine 65 potansiyometre takın. (Yeni pikselli bir yüzeyin karşı tarafına koyun.)
  5. Anahtar deliklerine uyması için 65 geçmeli anahtarı takın.
  6. Beş adet 65 parça donanımı bir Arduino UNO'ya bağlamak için on üç bölgenin her birine toplam on üç Arduino UNO bağlanmıştır.
  7. Ekli fotoğrafta gösterildiği gibi, potansiyometreleri, geçmeli anahtarları ve neo-piksel LED'leri Arduino UNO'nun pinlerine kablo ile bağlayın. (bkz. adım2)
  8. Birkaç Arduino UNO'nun GND ve 5V pinleri kablo tellerine toplanır, ardından harici güce bağlanır. (bkz. adım2)
  9. Hava basıncı ile tozu temizleyin.

Adım 4: Donanım: Akrilik Kesim

Donanım: Akrilik Kesim
Donanım: Akrilik Kesim
Donanım: Akrilik Kesim
Donanım: Akrilik Kesim
Donanım: Akrilik Kesim
Donanım: Akrilik Kesim
  1. Akrilik çubuğu 50 mm uzunluğunda kesin.

  2. Akrilik çubuğun bir tarafı, potansiyometrenin denetleyici kısmına uyacak şekilde boyut ve derinlikte delinir.
  3. Akrilik çubuk, potansiyometreye tam olarak sığabilecek bir boşluk sağlamak için delikten biraz daha geniş kesilir.
  4. Diğer taraf, ışığın düzgün bir şekilde iletilebilmesi için biraz zımpara kağıdı verir.

Adım 5: Arduino Programlama Kodu

www.kasperkamperman.com/blog/arduino/ardui…

'hsb'den rgb'ye' kodu를 참고한 사이트

#Dahil etmek

//'adafruit_neopixel'헤더파일라는 외부 라이브러리를 포함

//네오픽셀 연결 핀번호 선언

#PIN1 tanımla 2 #PIN2 tanımla 3 #PIN3 tanımla 4 #PIN4 tanımla 5 #PIN5 tanımla 6

#define NUMPIXELS 2 //네오픽셀 LED 갯수

#define NUM_LIGHTS 5 //작동 모듈갯수(네오픽셀 오브젝트 갯수)

//네오픽셀 오브젝트 Dizi 선언

Adafruit_NeoPixel piksel = { Adafruit_NeoPixel(NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS, PIN3, NEO_KHRBZ + NEO_KHZ800), PINO_KHRB + NEO_800, PINO_KHRBZ Adafruit_NeoPixel(NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800) }; ////네오픽셀을 사용하기 위해 객체 하나를 생성한다. //첫번째 인자값은 네오픽셀의 LED의 개수 //두번째 인자값은 네오픽셀이 연결된 아두이노의 핀번호 //세번째 인자값은 네오픽셀의 타입에 따라 바뀌는 bayrak

//////////////////////////////////////////////////////////////

//////HSV 를 RGB로 변환하는 함수 getRGB()를 위한 변수와 함수 선언

const bayt 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 renkler[5][3], int indeksi) {

val = dim_curve[val]; sat = 255 - dim_curve[255 - sat];

//색조, 채도 및 밝기 (HSB / HSV)를 RGB로 변환

//dim_curve는 밝기값 및 채도 (반전)에서만 사용됩니다. //이것은 가장 자연스럽게 보입니다.

int r;

int g; int b; int tabanı;

if (sat == 0) {

renkler[indeks][0] = değer; renkler[indeks][1] = değer; renkler[indeks][2] = değer; } Başka {

taban = ((255 - sat) * değer) >> 8;

geçiş (renk tonu / 60) {

durum 0: r = değer; g = (((val - taban) * renk tonu) / 60) + taban; b = baz; kırmak;

dava 1:

r = (((val - taban) * (60 - (renk tonu % 60))) / 60) + taban; g = değer; b = baz; kırmak;

durum 2:

r = baz; g = değer; b = (((val - taban) * (renk tonu % 60)) / 60) + taban; kırmak;

durum 3:

r = baz; g = (((val - taban) * (60 - (renk tonu % 60))) / 60) + taban; b = değer; kırmak;

durum 4:

r = (((val - taban) * (renk tonu % 60)) / 60) + taban; g = baz; b = değer; kırmak;

durum 5:

r = değer; g = baz; b = (((val - taban) * (60 - (ton % 60))) / 60) + taban; kırmak; }

renkler[indeks][0] = r;

renkler[indeks][1] = g; renkler[indeks][2] = b; }

}

int rgb_colors[NUM_LIGHTS][3]; //네오픽셀 오브젝트갯수마다 rgb rengi 선언

int renk tonu[NUM_IŞIK]; //네오픽셀 오브젝트갯수마다 renk tonu 선언 int sat[NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 명도 선언 int parlak[SAYI_IŞIK]; //네오픽셀 오브젝트갯수마다 밝기 서언

//일반 변수 선언

int startSwitch = {8, 9, 10, 11, 12}; // açık/kapalı 버튼 핀번호 boolean startState = {yanlış, yanlış, yanlış, yanlış, yanlış}; // açık/kapalı 상태변수

const int colorPin = {A0, A1, A2, A3, A4}; // 가변저항 핀번호

int colorVal = {0, 0, 0, 0, 0}; // 가변저항 초기값

int animasyonDüğmesi = 7; // 애니메이션 모드변환 버튼 핀번호

/////////////////////////////////////////////////

//애니메이션 모든 변환을 위한 버튼 디바운싱 변수선언 //디바운싱? 짧은 시간내 많은 이벤트가 발생하는것에 대한 문제에 대해서 지정된 시간 간격으로 함수를 호출하여 해결 int buttonState; // 입력 핀으로부터의 현재 판독값 int lastButtonState = YÜKSEK; // 이전의 판독값은 켜진상태로 unsigned long lastDebounceTime = 0; // 출력핀이 마지막으로 전환된 시간은 0으로 unsigned long debounceGecikme = 50; // 디바운싱 타임설정;출력이 깜빡이면 증가한다 int MOD = 0; //애니메이션 모드변수

int B_Interval[5]; //블링킹을 위한 각 모듈의 랜덤 속도 변수

int B_Min = 100; //블링킹 최단속도; int B_Maks = 500; //블링킹 최장속도; int R_Interval = 50; //레인보우 애니메이션 속도 변수 int D_Interval = 10; //디밍 속도 변수

boolean B_state[5]; //블링킹을 위한 각 모듈의 상태변수

///////////////////////////////////////////////////////

//멀티테스킹 애니메이션을 위한 시간변수 선언

imzasız uzun akımMillis; //현재시간 변수

imzasız uzun B_previousMillis[5]; //각 모듈의 블링킹 타이머 imzasız uzun DR_Millis[5]; //각 모듈의 디밍 랜덤 타이머(예비) unsigned long R_previousMillis; //레인보우 타이머 imzasız uzun D_previousMillis; //디밍 타이머

boolean firstRainbow = true; //레인보우 색상 초기화 상태변수

int RainbowSpeed; //레인보우 변환변수

int Parlak = 100; //디밍 초기값 int Parlaklık Faktörü = 1; //디밍 증감 값 //////////////////////////////////////// /////////////////////////////////

geçersiz kurulum() {

for (int i = 0; i < NUM_LIGHTS; i++) { piksel.begin(); //네오픽셀 오브젝트 초기화 }

//버튼 인풋 설정

for (int i = 0; i < NUM_LIGHTS; i++) { pinMode(startsSwitch, INPUT_PULLUP); //on/off 버튼 인풋 설정 } pinMode(animationButton, INPUT_PULLUP); //애니메이션 버튼 인풋 설정

for (int i = 0; i < NUM_LIGHTS; i++) { B_Interval = int(rastgele(B_Min, B_Max)); //모듈별 블링킹 랜덤 속도(인터발) 변수 생성 }

Seri.başla(9600); //통신 설정

}

boşluk döngüsü () {

MOD = CheckAnimMode(); //모드에 애니메이션체크모드함수를 넣는다

//버튼과 가변저항을 값을 각각 읽어 변수에 지정한다.

for (int i = 0; i < NUM_LIGHTS; i++) { startState = !digitalRead(startsSwitch); //açık/kapalı 버튼에서 읽은 값의 반대값을 startState에 넣어준다 //startState = digitalRead(startsSwitch); colorVal = analogRead(colorPin); //가변저항에서 읽은 값을 가변저항 초기값에 넣는다 }

geçiş (MODE) { //애니메이션함수 스위치문

durum 0: on(); //on함수 실행 break; //조건문에서 빠져나가라

dava 1:

gökkuşağı(); //gökkuşağı함수 실행 ara;

durum 2:

karartma(); // karartma함수 실행 ara;

durum 3:

yanıp sönüyor(); //yanıp sönüyor함수 실행 ara; }

for (int i = 0; i < NUM_LIGHTS; i++) { piksel.show(); //네오픽셀 오브젝트 배열 켜라 }

}

/////////////////////////////////////////////////////////////

int CheckAnimMode() {

//애니메이션 선택 버튼을 읽어 모드를 결정한다.

///////////////////////////////////////////// /// akımMillis = millis(); // 시간 측정 int okuma = digitalRead(animationButton); if (okuma != lastButtonState) { //입력핀으로부터 이전의 버튼의 상태와 판독값 비교 lastDebounceTime = millis(); //현재 시간을 출력핀이 마지막으로 전환된 시간에 넣음 }

if ((currentMillis - lastDebounceTime) > debounceDelay) {

if (okuma != buttonState) { //입력핀으로부터 받은 현재값과 판독값과 비교

buttonState = okuma; //판독값을 buttonState에 대입

if (buttonState == LOW) { //버튼상태가 꺼져있다면

MOD++; //버튼모드 1씩 증가 if (MODE > 3) { MODE = 0; ilkGökkuşağı = doğru; //레인보우 색상 초기화 상태 켜짐 Parlaklık Faktörü = 1; //디밍 증감값 Parlak = 15; //밝기는 15 } } } }

lastButtonState = okuma; //판독값을 이전의 버튼상태에 대입

dönüş MODU; 함수를 종료하고 modu함수로 값을 리턴하라 }

////////////////////////////////////////////////////////////////////

//animasyon modu işlevi

//üzerinde

geçersiz on() { Serial.println("açık"); //시리얼 모니터에 on을 써라 for (int i = 0; i < NUM_LIGHTS; i++) { color_set(i, colorVal); //가변저항 값에 따라 컬러 셋팅 } }

//Gökkuşağı

void gökkuşağı() { Serial.println("yağmur"); //시리얼 모니터에 yağmur을 써라 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); //레인보우컬러셋팅 }

}

// Karartma

void karartma() { Serial.println("dimm"); //시리얼모니터에 dimm을 써라 Serial.println(Parlak); //시리얼모니터에 Bright를 써라 if (currentMillis - D_previousMillis > D_Interval) { //흐른 시간값이 디밍 인터벌 값보다 크면 D_previousMillis = currentMillis; //현재시간을 이전의 디밍 시간에 넣어라 Parlak += Parlaklık Faktörü; //밝기에 디밍 증감값 1씩 올려라 } if (Parlak 254) { Parlaklık Faktörü = -1 * Parlaklık Faktörü; } Parlak = kısıtla(Parlak, 99, 254); //변수 밝기값을 최소값99~최대값254 사이의 값으로 한정한다

for (int i = 0; i < NUM_LIGHTS; i++) { dim_color_set(i, Bright); //디밍컬러셋팅 } }

//Yanıp sönüyor

void yanıp sönme() { Serial.println("yanıp sönme"); //시리얼모니터에 yanıp söner를 써라

for (int i = 0; i B_Interval) { //흐른 시간값이 블링크 인터벌 값보다 크면

B_previousMillis = şu ankiMillis; //현재시간을 이전의 블링크 시간에 넣어라 B_state = !B_state; //각 모듈의 블링킹 상태변수의 값의 반대값을 대입하라 } } for (int i = 0; i < NUM_LIGHTS; i++) { if (B_state) { //모듈의 블링킹 상태가 읽 히면 color_set(i, colorVal); //가변저항 값에 따라 컬러 셋팅 } else { noColor_set(i); //읽히지 않으면 컬러 셋팅 하지않음 } }

}

////////////////////////////////////////////////////////////////////////////////////////

//çekirdek işlevi

//renk seti

void color_set(int dizin, int colorSenser) {

if (startState[index]) { ton[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++) { piksel[index].setPixelColor(i, piksel[index]. Color(rgb_colors[index][0], rgb_colors[index][1], rgb_colors[index] [2])); } //픽셀컬러 셋팅을 rgb_colors의 r, g, b으로 설정 } else noColor_set(index); //컬러셋팅 하지않음 }

//////noColor seti

void noColor_set(int indeksi) { //컬러셋팅 하지않는 함수 설정

for (int i = 0; i < NUMPIXELS; i++) { piksel[index].setPixelColor(i, piksel[index]. Color(0, 0, 0)); } //픽셀컬러 세팅을 0, 0, 0으로 설정 }

////dimColor seti

void dim_color_set(int dizin, int BC) { //디밍컬러셋팅 함수 설정

if (startState[index]) { ton[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++) { piksel[index].setPixelColor(i, piksel[index]. Color(rgb_colors[index][0], rgb_colors[index][1], rgb_colors[index] [2])); } ///픽셀컬러 셋팅을 rgb_colors의 r, g, b으로 설정 } else noColor_set(index); //컬러셋팅 하지않음 }

Adım 6: Bitmiş Bir Görünüm

Önerilen: