สารบัญ:
- ขั้นตอนที่ 1: วัสดุ
- ขั้นตอนที่ 2: แผนการก่อสร้าง
- ขั้นตอนที่ 3: ฮาร์ดแวร์: การออกแบบวงจร
- ขั้นตอนที่ 4: ฮาร์ดแวร์: การตัดอะคริลิก
- ขั้นตอนที่ 5: รหัสการเขียนโปรแกรม Arduino
- ขั้นตอนที่ 6: ดูเสร็จแล้ว
วีดีโอ: รูปแบบแสงจุด: 6 ขั้นตอน
2024 ผู้เขียน: John Day | [email protected]. แก้ไขล่าสุด: 2024-01-30 13:06
ฉันเริ่มต้นด้วยความคิดที่ว่า "ฉันสามารถควบคุมแสงด้วยมือของฉันเองและแสดงเจตจำนงของตัวเองได้หรือไม่"
มันคือ 'Dot Light Pattern' ที่ให้คุณสร้างสีของคุณเอง ออกแบบลวดลายของคุณเองด้วยสีเหล่านั้น และสัมผัสประสบการณ์เอฟเฟกต์แอนิเมชั่นต่างๆ
ขั้นตอนที่ 1: วัสดุ
- Arduino UNO x 13
- แถบ LED พิกเซล WS2901 หรือ WS2811 (130 LEDS)
- สวิตช์ปุ่ม x 1
- สแน็ปสวิตช์ x 65
- โพเทนนิ่งมิเตอร์ x 65
- สายสายรุ้ง
- พลังงานพอเพียง SMPS
- สายตัวนำ
- แท่งอะคริลิคใสทรงกลม (เส้นผ่านศูนย์กลาง 30 มม.)
- แผ่นอะครีลิคสีดำ (5T) (500mm*790mm) x 2, (500mm*35mm) x 2, (790mm*35mm) x 2
ขั้นตอนที่ 2: แผนการก่อสร้าง
ขั้นตอนที่ 3: ฮาร์ดแวร์: การออกแบบวงจร
-
ตัดแผ่นอะครีลิคเหมือนโครงสร้างด้านบน (ดูขั้นตอนที่2)
- LED นีโอพิกเซลหนึ่งชิ้นวางอยู่ที่ด้านบนและด้านล่างของรูโพเทนชิมิเตอร์ และติดไฟ LED นีโอพิกเซลรวม 65 คู่
- ไฟ LED นีโอพิกเซลคู่หนึ่งเชื่อมต่อเข้าด้วยกันเพื่อสร้างพิน Arduino ตัวเดียว
- ใส่โพเทนต์มิเตอร์ 65 ตัวเข้ากับรูโพเทนต์มิเตอร์ (วางไว้ที่ด้านตรงข้ามของพื้นผิวนีโอพิกเซล)
- ติดสวิตซ์แบบสแน็ป 65 ตัวเพื่อให้ตรงกับรูสวิตซ์
- Arduino UNO ทั้งหมด 13 ตัวถูกต่อเข้ากับแต่ละโซนจาก 13 โซน เพื่อผูกฮาร์ดแวร์ 65 ชิ้นห้าชิ้นเข้ากับ Arduino UNO หนึ่งตัว
- ดังที่แสดงในภาพที่แนบมา ให้ต่อโพเทนชิมิมิเตอร์ สแน็ปสวิตช์ และไฟ LED แบบนีโอพิกเซลเข้ากับหมุดของ Arduino UNO โดยใช้สายไฟ (ดูขั้นตอนที่2)
- พิน GND และ 5V ของ Arduino UNO หลายตัวถูกรวบรวมเข้ากับสายเคเบิล จากนั้นเชื่อมต่อกับแหล่งจ่ายไฟภายนอก (ดูขั้นตอนที่2)
- ขจัดฝุ่นด้วยแรงดันอากาศ
ขั้นตอนที่ 4: ฮาร์ดแวร์: การตัดอะคริลิก
-
ตัดแท่งอะคริลิกให้ยาว 50 มม.
- ด้านหนึ่งของแท่งอะคริลิกเจาะให้ได้ขนาดและความลึกเพื่อให้เข้ากับส่วนควบคุมของโพเทนชิมิเตอร์
- ก้านอะคริลิกถูกเล็มให้กว้างกว่ารูเล็กน้อยเพื่อให้มีระยะห่างที่พอดีกับโพเทนมิเตอร์ได้ดี
- อีกด้านให้กระดาษทรายเล็กน้อยเพื่อให้แสงส่องผ่านได้อย่างสวยงาม
ขั้นตอนที่ 5: รหัสการเขียนโปรแกรม Arduino
www.kasperkamperman.com/blog/arduino/ardui…
รหัส 'hsb to rgb' 참고한 사이트
#รวม
//'adafruit_neopixel'헤더파일라는 라 라이브러리를 포함
//네오픽셀 연결 핀번호 선언
#กำหนด PIN1 2 # กำหนด PIN2 3 # กำหนด PIN3 4 # กำหนด PIN4 5 # กำหนด PIN5 6
#define NUMPIXELS 2 //네오픽셀 LED 갯수
#define NUM_LIGHTS 5 //작동 모듈갯수(네오픽셀 오브젝트 갯수)
//네오픽셀 오브젝트 อาร์เรย์ 선언
Adafruit_NeoPixel พิกเซล = { Adafruit_NeoPixel (NUMPIXELS, PIN1, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel(NUMPIXELS, PIN2, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN3, NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN3, NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN3, NEOPIXELS Adafruit_NeoPixel(NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800) }; ////네오픽셀을 사용하기 위해 하 하나를 생성한다. //첫번째 인자값은 네오픽셀의 LED의 개수 // 인 인자값은 네오픽셀이 연결된 아두이노의 핀번호 //세번째 인자값은 네오픽셀의 타입에 따라 바뀌는 ธง
//////////////////////////////////////////////////////////////
//////HSV 를 RGB로 변환하는 함수 getRGB()를 위한 변수와 함수 선언
const ไบต์ 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, }; //
เป็นโมฆะ getRGB (สี int, int sat, int val, สี int [5][3], ดัชนี int) {
วาล = dim_curve[วาล]; sat = 255 - dim_curve[255 - sat];
//색조, 채도 및 밝기 (HSB / HSV)를 RGB로 변환
//dim_curve는 밝기값 및 채도 (반전)에서만 사용됩니다. //이것은 가장 자연스럽게 보입니다.
int r;
int กรัม; int ข; ฐานภายใน;
ถ้า (นั่ง == 0) {
สี[ดัชนี][0] = วาล; สี[ดัชนี][1] = วาล; สี[ดัชนี][2] = วาล; } อื่น {
ฐาน = ((255 - เสาร์) * วาล) >> 8;
สวิตช์ (ฮิว / 60) {
กรณีที่ 0: r = วาล; g = (((val - base) * hue) / 60) + ฐาน; b = ฐาน; หยุดพัก;
กรณีที่ 1:
r = (((val - ฐาน) * (60 - (สี % 60))) / 60) + ฐาน; ก. = วาล; b = ฐาน; หยุดพัก;
กรณีที่ 2:
r = ฐาน; ก. = วาล; b = (((val - base) * (hue % 60)) / 60) + ฐาน; หยุดพัก;
กรณีที่ 3:
r = ฐาน; g = (((val - base) * (60 - (hue % 60))) / 60) + ฐาน; b = วาล; หยุดพัก;
กรณีที่ 4:
r = (((val - ฐาน) * (สี % 60)) / 60) + ฐาน; ก. = ฐาน; b = วาล; หยุดพัก;
กรณีที่ 5:
r = วาล; ก. = ฐาน; b = (((val - base) * (60 - (hue % 60))) / 60) + ฐาน; หยุดพัก; }
สี[ดัชนี][0] = r;
สี[ดัชนี][1] = ก.; สี[ดัชนี][2] = b; }
}
int rgb_colors[NUM_LIGHTS][3]; //네오픽셀 오브젝트갯수마다 rgb สี 선언
เฉดสี [NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 hue 선언 int sat[NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 명도 선언 int brint[NUM_LIGHTS]; //네오픽셀 오브젝트갯수마다 밝기 서언
//일반 변수 선언
int startSwitch = {8, 9, 10, 11, 12}; // เปิด/ปิด 버튼 핀번호 บูลีน startState = {เท็จ เท็จ เท็จ เท็จ เท็จ}; // เปิด/ปิด 상태변수
const int colorPin = {A0, A1, A2, A3, A4}; // 가변저항 핀번호
int colorVal = {0, 0, 0, 0, 0}; // 가변저항 초기값
int animationButton = 7; // 애니메이션 모드변환 버튼 핀번호
/////////////////////////////////////////////////
//애니메이션 모든 변환을 위한 버튼 디바운싱 변수선언 //디바운싱? 간내 시간내 많은 이벤트가 발생하는것에 대한 문제에 대해서 지정된 시간 간격으로 함수를 호출하여 해결 int buttonState; // 입력 핀으로부터의 현재 판독값 int lastButtonState = สูง; // 이전의 판독값은 켜진상태로 ที่ไม่ได้ลงชื่อ long LastDebounceTime = 0; // 출력핀이 마지막으로 전환된 시간은 0으로 unsigned long debounceDelay = 50; // 디바운싱 타임설정;출력이 깜빡이면 증가한다 int MODE = 0; // 애니메이션 모드변수
int B_Interval[5]; //블링킹을 위한 각 모듈의 랜덤 속도 변수
int B_Min = 100; //블링킹 최단속도; int B_Max = 500; //블링킹 최장속도; int R_Interval = 50; //레인보우 애니메이션 속도 변수 int D_Interval = 10; //디밍 속도 변수
บูลีน B_state[5]; //블링킹을 위한 각 모듈의 상태변수
///////////////////////////////////////////////////////
//멀티테스킹 애니메이션을 위한 시간변수 선언
ไม่ได้ลงนามยาวปัจจุบันMillis; //현재시간 변수
ยาวที่ไม่ได้ลงนาม B_previousMillis[5]; //각 모듈의 블링킹 타이머 unsigned long DR_Millis[5]; //각 모듈의 디밍 랜덤 타이머(예비) unsigned long R_previousMillis; //레인보우 타이머 ไม่ได้ลงนามยาว D_previousMillis; //디밍 타이머
บูลีนก่อนเรนโบว์ = จริง; //레인보우 색상 초기화 상태변수
ภายใน RainbowSpeed; //레인보우 변환변수
int สว่าง = 100; //디밍 초기값 int BrightnessFactor = 1; //디밍 증감 값 //////////////////////////////////////////// ////////////////////////////////////
การตั้งค่าเป็นโมฆะ () {
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { พิกเซล.begin(); //네오픽셀 오브젝트 초기화 }
//버튼 อิน풋 설정
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { pinMode (startsSwitch , INPUT_PULLUP); //เปิด/ปิด 버튼 인풋 설정 } pinMode(animationButton, INPUT_PULLUP); // 애니메이션 풋 인풋 설정
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { B_Interval = int(random(B_Min, B_Max)); //모듈별 블링킹 랜덤 속도(인터발) 변수 생성 }
Serial.begin(9600); //통신 설정
}
วงเป็นโมฆะ () {
MODE = CheckAnimMode(); //모드에 애니메이션체크모드함수를 넣는다
//버튼과 가변저항을 값을 각각 읽어 변수에 지정한다.
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { startState = !digitalRead(startsSwitch); //เปิด/ปิด 버튼에서 읽은 값의 반대값을 startState에 넣어준다 //startState = digitalRead(startsSwitch); colorVal = analogRead (colorPin); // 가변저항에서 읽은 값을 가변저항 초기값에 넣는다 }
สวิตช์ (MODE) { //애니메이션함수 스위치문
กรณีที่ 0: บน (); //on함수 실행 แตก; // 조건문에서 빠져나가라
กรณีที่ 1:
รุ้ง(); //สายรุ้ง함수 실행 แตก;
กรณีที่ 2:
ลดแสง (); // dimming함수 실행 แตก;
กรณีที่ 3:
กระพริบ (); //กระพริบ함수 실행 หยุด; }
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { พิกเซล.show(); //네오픽셀 오브젝트 배열 켜라 }
}
/////////////////////////////////////////////////////////////
int CheckAnimMode() {
//애니메이션 선택 버튼을 읽어 모드를 결정한다.
/////////////////////////////////////////////////////////////////////// /// ปัจจุบันมิลลิวินาที = มิลลิวินาที (); // 시간 측정 int reading = digitalRead(animationButton); if (อ่าน != lastButtonState) { //입력핀으로부터 이전의 버튼의 상태와 판독값 비교 lastDebounceTime = มิลลิวินาที (); //현재 시간을 출력핀이 마지막으로 전환된 시간에 넣음 }
ถ้า ((currentMillis - lastDebounceTime) > debounceDelay) {
if (อ่าน != buttonState) { //입력핀으로부터 받은 현재값과 판독값과 비교
buttonState = การอ่าน; //판독값을 buttonState에 대입
ถ้า (buttonState == LOW) { //버튼상태가 꺼져있다면
โหมด++; //버튼모드 1씩 증가 if (MODE > 3) { MODE = 0; firstRainbow = จริง; //레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; //디밍 증감값 สว่าง = 15; //밝기는 15 } } } }
lastButtonState = การอ่าน; //판독값을 이전의 버튼상태에 대입
กลับโหมด; 함수를 종료하고 mode함수로 값을 리턴하라 }
////////////////////////////////////////////////////////////////////
// ฟังก์ชั่นโหมดภาพเคลื่อนไหว
//บน
เป็นโมฆะเมื่อ () { Serial.println ("เปิด"); //시리얼 모니터에 on을 써라 สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { color_set(i, colorVal); // 가변저항 값에 따라 컬러 셋팅 } }
//รุ้ง
รุ้งเป็นโมฆะ () { Serial.println ("ฝน"); //시리얼 모니터에 rain을 써라 if (firstRainbow) { RainbowSpeed = 0; //레인보우 속도 초기화 firstRainbow = false; //레인보우 색상 초기화 상태 꺼짐 } if (มิลลิวินาที () - R_previousMillis > R_Interval) { //흐른 시간값이 레인보우 인터벌 값보다 크면 R_previousMillis = currentMillis; //현재시간을 이전의 레인보우 시간에 넣어라 RainbowSpeed += 10; //레인보우 변환변수에 10을 더해라 }
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { color_set(i, (colorVal + RainbowSpeed) % 1023); //레인보우컬러셋팅 }
}
//หรี่แสง
โมฆะลดแสง () { Serial.println ("dimm"); //시리얼모니터에 dimm을 써라 Serial.println(สว่าง); //시리얼모니터에 Bright를 써라 ถ้า (currentMillis - D_previousMillis > D_Interval) { //흐른 시간값이 디밍 인터벌 값보다 크면 D_previousMillis = currentMillis; //현재시간을 이전의 디밍 시간에 넣어라 Bright += BrightnessFactor; //밝기에 디밍 증감값 1씩 올려라 } ถ้า (สว่าง 254) { BrightnessFactor = -1 * BrightnessFactor; } สว่าง = จำกัด (สว่าง 99, 254); //변수 밝기값을 최소값99~최대값254 사이의 값으로 한정한다
สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { dim_color_set (i, Bright); //디밍컬러셋팅 } }
//กระพริบตา
กะพริบเป็นโมฆะ () { Serial.println ("กะพริบ"); // 시리얼모니터에 กระพริบตา 써라
สำหรับ (int i = 0; i B_Interval) { //흐른 시간값이 블링크 인터벌 값보다 크면
B_previousMillis = ปัจจุบัน Millis; //현재시간을 이전의 블링크 시간에 넣어라 B_state = !B_state; //각 모듈의 블링킹 상태변수의 값의 반대값을 대입하라 } } สำหรับ (int i = 0; i < NUM_LIGHTS; i++) { if (B_state) { //모듈의 블링킹 상태가 읽 히면 color_set(i, colorVal); // 가변저항 값에 따라 컬러 셋팅 } else { noColor_set(i); //읽히지 않으면 컬러 셋팅 하지않음 } }
}
////////////////////////////////////////////////////////////////////////////////////////
// ฟังก์ชันหลัก
//ชุดสี
เป็นโมฆะ color_set (ดัชนี int, colorSenser int) {
ถ้า (startState [ดัชนี]) { สี [ดัชนี] = แผนที่ (colorSenser, 0, 1023, 0, 359); //0~1023값을 0~359값으로 매핑한 값을 가지고 색상값으로 지정(colorSenser에) getRGB(hue[index], 255, 255, rgb_colors, index); สำหรับ (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); //컬러셋팅 하지않음 }
//////ไม่มีชุดสี
เป็นโมฆะ noColor_set (ดัชนี int) { //컬러셋팅 하지않는 함수 설정
สำหรับ (int i = 0; i < NUMPIXELS; i++) { pixels[index].setPixelColor(i, pixels[index]. Color(0, 0, 0)); } //픽셀컬러 세팅을 0, 0, 0으로 설정 }
////dimColor set
เป็นโมฆะ dim_color_set (ดัชนี int, int BC) { //디밍컬러셋팅 함수 설정
ถ้า (startState [ดัชนี]) { สี [ดัชนี] = แผนที่ (colorVal [ดัชนี], 0, 1023, 0, 359); //0~1023값을 0~359값으로 매핑한 값을 가지고 색상값으로 지정(colorVal에) getRGB(hue[index], 255, BC, rgb_colors, index); สำหรับ (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); //컬러셋팅 하지않음 }
ขั้นตอนที่ 6: ดูเสร็จแล้ว
แนะนำ:
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: 5 ขั้นตอน
การออกแบบเกมในการสะบัดใน 5 ขั้นตอน: การตวัดเป็นวิธีง่ายๆ ในการสร้างเกม โดยเฉพาะอย่างยิ่งเกมปริศนา นิยายภาพ หรือเกมผจญภัย
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: 3 ขั้นตอน
การตรวจจับใบหน้าบน Raspberry Pi 4B ใน 3 ขั้นตอน: ในคำแนะนำนี้ เราจะทำการตรวจจับใบหน้าบน Raspberry Pi 4 ด้วย Shunya O/S โดยใช้ Shunyaface Library Shunyaface เป็นห้องสมุดจดจำใบหน้า/ตรวจจับใบหน้า โปรเจ็กต์นี้มีจุดมุ่งหมายเพื่อให้เกิดความเร็วในการตรวจจับและจดจำได้เร็วที่สุดด้วย
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: 3 ขั้นตอน
วิธีการติดตั้งปลั๊กอินใน WordPress ใน 3 ขั้นตอน: ในบทช่วยสอนนี้ ฉันจะแสดงขั้นตอนสำคัญในการติดตั้งปลั๊กอิน WordPress ให้กับเว็บไซต์ของคุณ โดยทั่วไป คุณสามารถติดตั้งปลั๊กอินได้สองวิธี วิธีแรกคือผ่าน ftp หรือผ่าน cpanel แต่ฉันจะไม่แสดงมันเพราะมันสอดคล้องกับ
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): 8 ขั้นตอน
การลอยแบบอะคูสติกด้วย Arduino Uno ทีละขั้นตอน (8 ขั้นตอน): ตัวแปลงสัญญาณเสียงล้ำเสียง L298N Dc ตัวเมียอะแดปเตอร์จ่ายไฟพร้อมขา DC ตัวผู้ Arduino UNOBreadboardวิธีการทำงาน: ก่อนอื่น คุณอัปโหลดรหัสไปยัง Arduino Uno (เป็นไมโครคอนโทรลเลอร์ที่ติดตั้งดิจิตอล และพอร์ตแอนะล็อกเพื่อแปลงรหัส (C++)
เครื่อง Rube Goldberg 11 ขั้นตอน: 8 ขั้นตอน
เครื่อง 11 Step Rube Goldberg: โครงการนี้เป็นเครื่อง 11 Step Rube Goldberg ซึ่งออกแบบมาเพื่อสร้างงานง่ายๆ ในรูปแบบที่ซับซ้อน งานของโครงการนี้คือการจับสบู่ก้อนหนึ่ง