דפוס אור נקודה: 6 שלבים
דפוס אור נקודה: 6 שלבים
Anonim
Image
Image
דפוס אור נקודה
דפוס אור נקודה
דפוס אור נקודה
דפוס אור נקודה

התחלתי עם הרעיון של "האם אוכל לשלוט באור במו ידי ולהביע את רצוני?"

זהו 'דפוס אור נקודה' המאפשר לך ליצור צבעים משלך בעצמך, לעצב דפוסים משלך בצבעים אלה ולחוות אפקטים של אנימציה שונים.

שלב 1: חומרים

חומרים
חומרים
חומרים
חומרים
חומרים
חומרים
חומרים
חומרים
  1. ארדואינו UNO x 13
  2. פס LED WS2901 או WS2811 (130 נוריות LED)
  3. מתג כפתור x 1
  4. מתג הצמד x 65
  5. מד פוטנציאל x 65
  6. כבל קשת
  7. הספק מספיק SMPS
  8. כבל מוליך
  9. מוט עגול שקוף אקריליק (קוטר 30 מ"מ)
  10. לוח אקריליק בצבע שחור (5T) (500 מ"מ*790 מ"מ) x 2, (500 מ"מ*35 מ"מ) x 2, (790 מ"מ*35 מ"מ) x 2

שלב 2: תוכנית בנייה

תכנית בניה
תכנית בניה
תכנית בניה
תכנית בניה
תכנית בניה
תכנית בניה
תכנית בניה
תכנית בניה

שלב 3: חומרה: עיצוב מעגלים

חומרה: עיצוב מעגלים
חומרה: עיצוב מעגלים
חומרה: עיצוב מעגלים
חומרה: עיצוב מעגלים
חומרה: עיצוב מעגלים
חומרה: עיצוב מעגלים
  1. חותכים את צלחת האקריליק כמו המבנה לעיל. (ראה שלב 2)

  2. חתיכה אחת של LED ניאו-פיקסל מונחת בחלק העליון והתחתון של חור מד הפוטנציאל, ובסך הכל מחוברים 65 זוגות נוריות ניאו-פיקסל.
  3. זוג נוריות ניאו-פיקסל מחוברות יחד ליצירת סיכת ארדואינו אחת.
  4. התאימו 65 מטרי פוטנציאל לחורים של מד הפוטנציאל. (שים אותו בצד הנגדי של משטח ניאו-פיקסל.)
  5. חבר 65 מתגי הצמד שיתאימו לחורי המתג.
  6. סך הכל שלוש עשרה UNOs Arduino מחוברים לכל אחד משלושת האזורים על מנת לקשור חמש חתיכות של 65 חתיכות חומרה ל- UNO אחד של Arduino.
  7. כפי שמוצג בתמונה המצורפת, חבר את מטרי הפוטנציאל, מתגי הצמד ונוריות הניאו-פיקסל לפינים של ה- Arduino UNO באמצעות חוט. (ראה שלב 2)
  8. סיכות GND ו- 5V של מספר UNOs של Arduino נאספות לחוטי כבלים, ולאחר מכן מחוברות לחשמל חיצוני. (ראה שלב 2)
  9. הסר את האבק על ידי לחץ אוויר.

שלב 4: חומרה: חיתוך אקרילי

חומרה: חיתוך אקרילי
חומרה: חיתוך אקרילי
חומרה: חיתוך אקרילי
חומרה: חיתוך אקרילי
חומרה: חיתוך אקרילי
חומרה: חיתוך אקרילי
  1. חותכים את מוט האקריליק באורך של 50 מ מ.

  2. צד אחד של מוט האקריליק נקדח לגודל ולעומק כך שיתאים לחלק הבקר של מד הפוטנציאל.
  3. מוט האקריליק נחתך מעט רחב יותר מהחור לצורך פינוי שיכול להשתלב היטב במד הפוטנציאל.
  4. הצד השני נותן מעט נייר זכוכית כך שניתן יהיה להעביר את האור בצורה מסודרת.

שלב 5: קוד תכנות Arduino

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

קוד 'hsb ל- 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_GRB + NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN4, NEO_GRB + NEO_KHZ800), Adafruit_NeoPixel (NUMPIXELS, PIN5, NEO_GRB + NEO_KHZ800)}; //// 네오 픽셀 을 사용 하기 위해 객체 하나 를 생성 한다. // 첫번째 인자 값 은 네오 픽셀 의 LED 의 개수 // 두번째 인자 값 은 네오 픽셀 이 연결된 아두 이노 의 핀 세번째 // 세번째 인자 값 은 네오 픽셀 의 타입 에 바뀌는 바뀌는 바뀌는

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

////// 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 colors [5] [3], int index) {

val = dim_curve [val]; sat = 255 - dim_curve [255 - שבת];

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

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

int r;

int g; int b; בסיס int;

אם (שבת == 0) {

צבעים [אינדקס] [0] = val; צבעים [אינדקס] [1] = val; צבעים [אינדקס] [2] = val; } אחר {

בסיס = ((255 - שבת) * ואל) >> 8;

מתג (גוון / 60) {

מקרה 0: r = val; g = (((val - בסיס) * גוון) / 60) + בסיס; b = בסיס; לשבור;

תיק 1:

r = (((val - בסיס) * (60 - (גוון % 60)))) / 60) + בסיס; g = val; b = בסיס; לשבור;

מקרה 2:

r = בסיס; g = val; b = (((val - base) * (גוון % 60)) / 60) + בסיס; לשבור;

מקרה 3:

r = בסיס; g = (((val - בסיס) * (60 - (גוון % 60)))) / 60) + בסיס; b = val; לשבור;

מקרה 4:

r = (((val - base) * (גוון % 60)) / 60) + בסיס; g = בסיס; b = val; לשבור;

מקרה 5:

r = val; g = בסיס; b = (((val - base) * (60 - (גוון % 60)))) / 60) + בסיס; לשבור; }

צבעים [אינדקס] [0] = r;

צבעים [אינדקס] [1] = גרם; צבעים [אינדקס] [2] = ב; }

}

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

int hue [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 גוון 선언 int ישב [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 명도 선언 int brignt [NUM_LIGHTS]; // 네오 픽셀 오브젝트 갯수 마다 밝기 서언

// 일반 변수 선언

int startsSwitch = {8, 9, 10, 11, 12}; // on/off 버튼 핀 번호 בוליאני startState = {false, false, false, false, false}; // הפעלה/כיבוי 상태 변수

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

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

int animationButton = 7; // 애니메이션 모드 변환 버튼 핀 번호

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

// 애니메이션 모든 변환 을 위한 버튼 디 바운싱 변수 선언 // 디 바운싱? Button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button button. // 입력 핀 으로부터 의 현재 판독 값 last int lastButtonState = HIGH; // 이전 의 판독 값 은 켜진 상태 로 unsigned long lastDebounceTime = 0; // 출력 핀 이 마지막 으로 전환 된 시간 은 0 de 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]; // 블 링킹 을 위한 각 모듈 의 상태 변수

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

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

זרם ארוך לא חתום מיליס; // 현재 시간 변수

B_previousMillis ארוך [5]; // 각 모듈 의 블 링킹 타이머 DR_Millis ארוך [5] לא חתום; // 각 모듈 의 디밍 랜덤 타이머 예비 (예비) R_previousMillis ארוך ללא סימן; // 레인보우 타이머 D_previousMillis ארוך ללא חתימה; // 디밍 타이머

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

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

int Bright = 100; // 디밍 초기 값 int BrightnessFactor = 1; // 디밍 증감 값 //////////////////////////////////////// //////////////////////////////////////////

הגדרת בטל () {

עבור (int i = 0; i <NUM_LIGHTS; i ++) {פיקסלים . מתחילים (); // 네오 픽셀 오브젝트 초기화}

// 버튼 인풋 설정

עבור (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 (אקראי (B_Min, B_Max)); // 모듈 별 블 링킹 랜덤 속도 (인터발) 변수 생성}

Serial.begin (9600); // 통신 설정

}

לולאת חלל () {

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

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

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

לעבור (MODE) {// 애니메이션 함수 스위치 문

מקרה 0: on (); // בהפסקה; 실행; // 조건문 에서 빠져 나가라

תיק 1:

קשת בענן(); // קשת בענן 실행 실행 שבירה;

מקרה 2:

עמעום (); // עמעום 실행 실행 הפסקה;

מקרה 3:

עִפעוּף(); // מהבהב 실행 실행 הפסקה; }

עבור (int i = 0; i <NUM_LIGHTS; i ++) {פיקסלים .show (); // 네오 픽셀 오브젝트 배열 켜라}

}

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

int CheckAnimMode () {

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

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

if ((currentMillis - lastDebounceTime)> debounceDelay) {

אם (קריאה! = buttonState) {// 입력 핀 으로부터 받은 현재 값 과 판독 값 과 비교

buttonState = קריאה; // כפתור 판독 값 을 מדינה 에 대입

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

MODE ++; // 버튼 모드 1 씩 증가 אם (MODE> 3) {MODE = 0; firstRainbow = true; // 레인보우 색상 초기화 상태 켜짐 BrightnessFactor = 1; // 디밍 증감 값 בהיר = 15; // 밝기 는 15}}}}

lastButtonState = קריאה; // 판독 값 을 이전 의 버튼 상태 에 대입

החזר MODE; 함수 를 종료 하고 מצב 함수 로 값 을 리턴 하라}

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

// פונקציית מצב אנימציה

//עַל

void on () {Serial.println ("on"); // 시리얼 모니터 에 ב- 을 써라 עבור (int i = 0; i <NUM_LIGHTS; i ++) {color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅}}

//קשת בענן

קשת חלל () {Serial.println ("גשם"); // 시리얼 모니터 에 גשם 써라 써라 אם (firstRainbow) {RainbowSpeed = 0; // 레인보우 속도 초기화 firstRainbow = false; // 레인보우 색상 초기화 상태 꺼짐} if (millis () - 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 (בהיר); // 시리얼 모니터 에 בהיר 를 써라 אם (currentMillis - D_previousMillis> D_Interval) {// 흐른 시간 값 이 디밍 인터벌 보다 보다 크면 D_previousMillis = currentMillis; // 현재 시간 을 이전 의 디밍 시간 에 넣어 라 Bright += BrightnessFactor; // 밝기 에 디밍 증감 씩 1 씩 올려라} if (Bright 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 = currentMillis; // 현재 시간 을 이전 의 블링크 시간 에 넣어 라 B_state =! B_state ; // 각 모듈 의 블 링킹 상태 의 값 의 반대 값 을 대입 하라}} עבור (int i = 0; i <NUM_LIGHTS; i ++) {if (B_state ) {// 모듈 의 블 링킹 상태 가 읽 히면 color_set (i, colorVal ); // 가변 저항 값 에 따라 컬러 셋팅} אחר {noColor_set (i); // 읽히지 않으면 컬러 셋팅 하지 않음}}

}

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

// פונקציות ליבה

// סט צבע

void color_set (index index, int colorSenser) {

if (startState [index]) {hue [index] = map (colorSenser, 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 가지고 색상 값 값 으로 color (colorSenser 에) getRGB (גוון [אינדקס], 255, 255, rgb_colors, index); עבור (int i = 0; i <NUMPIXELS; i ++) {פיקסלים [אינדקס]. setPixelColor (i, פיקסלים [אינדקס]. צבע (rgb_colors [index] [0], rgb_colors [index] [1], rgb_colors [index] [2])); } // 픽셀 컬러 셋팅 을 rgb_colors 의 r, g, b 으로 설정} אחר noColor_set (אינדקס); // 컬러 셋팅 하지 않음}

////// ערכת noColor

void noColor_set (אינדקס int) {// 컬러 셋팅 하지 않는 함수 설정

עבור (int i = 0; i <NUMPIXELS; i ++) {פיקסלים [אינדקס]. setPixelColor (i, פיקסלים [אינדקס]. צבע (0, 0, 0)); } // 픽셀 컬러 세팅 을 0, 0, 0 으로 설정}

//// ערכת dimColor

void dim_color_set (אינדקס int, int BC) {// 디밍 컬러 셋팅 함수 설정

if (startState [index]) {hue [index] = map (colorVal [index], 0, 1023, 0, 359); // 0 ~ 1023 값 을 0 ~ 359 값 으로 매핑 한 값 가지고 색상 값 값 으로 color (colorVal 에) getRGB (גוון [אינדקס], 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 으로 설정} אחר noColor_set (אינדקס); // 컬러 셋팅 하지 않음}

שלב 6: מבט מוגמר