매뉴얼 활용

아두이노, 네오픽셀, 3d 프린터를 이용한 크리스마스 트리 만들기
작성자 : 행복물건개발자 등록일 : 2017-12-30 조회수 : 3025

첨부파일

Step 1 : 소개

Step

네오픽셀 (WS2812B) LED 스트립을 이용한 크리스마스 트리 만들기

안녕하세요! 행복물건개발자 박은찬입니다.

혹시 그거 아세요? 싼타 할아버지에게 편지를 쓰면 답장을 해 준답니다! 핀란드 싼타클로스 할아버지 주소로 편지를 쓰면 됩니다. 그러면 싼타 할아버지가 답장을 해 주십니다!

주소는 여기에요.

Santa Claus
Santa Claus Main Post Office
FI-96930 Arctic Circle
FINLAND

저는 지금 핀란드에서 거주하고 있는데, 싼타의 나라라서 그런지 몰라도 여기 저기에서 크리스마스 장식이 화려하게 되어 있는 것을 쉽게 발견할 수 있습니다. 제가 거주하고 있는 아파트를 멀리서 보면 베란다에 온통 크리스마스 장식을 한 가구들이 많이 있지요. 그리고 이 곳은 낮의 길이가 3~5시간정도로 짧아져서 밤이 정말 길어요! 그래서 화려한 불빛으로 장식을 한 덕을 톡톡히 볼 수 있지요.

곧 크리스마스가 다가옵니다. 행복물건개발자로서 뭔가 하나 만들어 보고 싶은데 아주 간단한 재료로 크리스마스 트리 장식을 만들어볼까 합니다.

약 3만원 정도의 가격으로 세상에 하나밖에 없는 크리스마스 장식을 만들어 보세요. 코딩을 하셔도 되고 안하셔도 됩니다. 코드는 미리 모두 준비해 두었습니다. 이제 여러분은 응용해 보세요! 자신만의 코드로 크리스마스 트리 불빛을 요리 조리 바꿔보세요. 블루투스를 연결해서 색깔을 조절해 볼 수도 있겠지요. 코딩에 자신이 없으시면 3d 프린팅 체험 정도로도 뿌듯함을 느끼실 수 있을거예요.

설명을 보시고 잘 모르시겠으면 언제든지 댓글이나 질문 남겨주세요 ^^


관련 링크

code for arduino
https://github.com/happythingsmaker/ChristmasNeoPixel/blob/master/171125_ChristmasNeoPixel.ino

3d models
https://www.thingiverse.com/thing:2668669

Youtube Video
https://www.youtube.com/watch?v=257uMjfjePQ

Instruction (Korean)
https://happythingsmaker.gitbooks.io/christmasneopixel/content/

Creator's blog 

http://happyThingsMaker.com

Step 2 : 하드웨어

Step

 

하드웨어

하드웨어를 만들기 위해서 어떤 재료를 썼는지, 어디서 샀는지, 파일은 어디에 있는지 회로는 어떻게 구성하는지에 대한 간단한 설명입니다.

반드시 아두이노를 쓸 필요는 없습니다. 그냥 자신의 목적에 맞게 다양한 옵션을 선택할 수 있습니다. 이미 기존에 나와 있는 상용 제품을 사용해도 무방합니다. 

Step 3 : 재료 및 구매처

Step

 

아두이노 코딩을 직접 체험 + 커스터마이징 (약 27000원)

재료명링크선택 가이드가격
아두이노 우노 R3[네이버 쇼핑 링크] 약 6,000원
WS2812B (네오픽셀 호환)[링크]100cm (60 LED)선택18000원
 혹은 알리익스프레스 (1m /60/IP65 선택) (중국 직구 시 약 8천원)
3d 프린터 출력물직접 출력하셔야 합니다.  
목봉 8mm(저는 약 40cm 길이 막대 3개를 사용했습니다)[네이버쇼핑 링크] 약 2500원

아두이노 코딩 없이 그냥 제작을 위한 부품 링크 (약 31000원)

재료명링크선택 가이드가격
3d 프린터 출력물직접 출력하셔야 합니다.  
WS2812B (네오픽셀 호환)[링크]100cm (60 LED)선택18,000원
네오픽셀 컨트롤러[링크] 약 10,000원
전원 공급용 케이블[링크]집에 있는 USB 충전기를 사용하도록 합니다.약 1,000원
목봉 8mm(저는 약 40cm 길이 막대 3개를 사용했습니다)[네이버쇼핑 링크] 약 2,500원

아두이노 코딩 없이 그냥 미리 입력해 놓은 프로그램에 의해서 구동되도록 하고 싶으신 분들은 위의 링크에서 구매를 하시면 됩니다.

네오픽셀 컨트롤러 동작 예 (멋진데요?)

주의: 구매처는 참고만 하시길 바랍니다. 저는 모두 중국에서 직구를 했습니다.

중국 직구 주소

WS2812B (1m 짜리 / 60LED / IP67) 선택 약 8천원

https://www.aliexpress.com/item/1m-4m-5m-WS2812B-Smart-led-pixel-strip-Black-White-PCB-30-60-144-leds-m/2036819167.html?spm=a2g0s.9042311.0.0.EvmmEM

WS2812B 컨트롤러 약 5천원

https://www.aliexpress.com/item/USB-Switch-Cable-for-5V-3-Pin-WS2812-LED-RGB-Strip-Pixel-Module-Light-Control-with/32820285313.html?spm=2114.search0104.3.109.lhPXJh&ws_ab_test=searchweb0_0,searchweb201602_5_10152_10065_10151_10344_10068_10345_10342_10343_10340_10341_10541_10562_10084_10083_10304_10307_10302_10539_5080015_10312_10059_10313_10314_10534_10533_100031_10604_10603_10103_10594_10557_10596_10595_10142_10107,searchweb201603_1,ppcSwitch_5&algo_expid=c13388d7-4e03-4a5f-9e25-6a87432e8a2b-13&algo_pvid=c13388d7-4e03-4a5f-9e25-6a87432e8a2b&rmStoreLevelAB=2 

Step 4 : 3d 프린터 파일 공유

Step

 

thinggiverse


띵기버스에 파일을 모두 올려두었습니다. 우측에 DOWNLOAD ALL FILES 를 클릭하시면 STL 확장자를 가진 파일들을 다운로드 가능합니다.

https://www.thingiverse.com/thing:2668669

별모양 조각 (11개 출력)

별모양 각 뿔을 출력합니다. 3d 프린터를 사용하는데에 익숙하신 분들은 Spiral Vase 모드로 출력하셔도 좋습니다. 간단히 설명드리면, 원하는 모양의 외벽만 출력하는 것입니다. 바닥면의 출력이 다 끝나면 외벽을 계속해서 쌓아 나갑니다. 조명을 다루는 프린팅 작품이기 때문에 내부가 비어있으면 더욱 보기 좋답니다. 관련 영상은 여기를 클릭하세요.

나무봉 꽂는 꼭데기 부품 (1개 출력)

이 부분은 Spiral Vase 모드로 출력하시면 안됩니다. 내부를 아무리 못해도 5% 이상은 채워 주셔야 합니다. 트리를 지지하는 부품이며 각 막대봉이 고정될 부분이기 때문에 튼튼해야 합니다. 5%면 충분합니다.

조립 방법

조립은 아주 간단합니다. 각각의 조각을 글루건을 이용해서 붙여주시면 됩니다. 글루가 없다면 순간접착제를 사용하셔도 무방합니다만 마르는 시간이 좀 걸릴 수 있습니다. [글루 구매 링크] 다용도 글루건을 사용하시면 됩니다. 딱히 정해진 건 없지만 너무 뜨거운 온도의 글루건을 사면 냄새 때문에 머리가 좀 아픕니다. 40W 짜리를 사용하고 있는데 머리가 좀 아프네요. 이 것보다 약간 약한 것을 구매하는 것을 추천합니다.

혹시라도 3D 프린터에 대해 공부가 필요하시다면

3D 프린터에 관한 거의 모든 정보를 얻을 수 있는 https://www.youtube.com/channel/UC-TbOuCyTywTg9G9e_LWAbg (메이커다은쌤)

3D 프린터의 모든 것 - STL&띵기버스- https://youtu.be/-GLiCZ6y1r8 (장성윤 님)

3D 프린터를 구매를 원하신다면

[한국 구매처 링크]

참고로 해외에서는 Anet A8을 많이 사용하는 것 같아요. 저는 P802MA 를 사용하고 있습니다. 가성비가 좋아요.

[알리익스프레스 구매 링크] 

Step 5 : 회로도

Step

 

아두이노 우노

반드시 USB 충전기를 통해서 전원을 연결하시길 바랍니다.

아두이노WS2812B
Vin+ (VCC)
GND- (GND)
3번 핀IN

네오픽셀과 아두이노 사이에 저항을 달아줄 필요가 있긴 하지만 그냥 안달아줘도 잘 동작해서 이렇게 연결했습니다. 아두이노와 다른 부품들을 연결하는 방법에 대해 궁금하시다면 다음 링크를 참고하세요

아두이노 케이블 연결 (카카오팹 자료)

아두이노는 [핀 헤더]를 가지고 있습니다. 저 보드 좌우에 까만 곳들이 바로 헤더핀이 암놈 헤더핀인거죠. 헤더핀은 케이블을 쉽게 연결할 수 있도록 해 주는 아주 고마운 녀석입니다.

이 곳에 전선을 꽂기 참 쉬운데요 어떤 전선을 넣으면 될까요? 바로 Dupont 케이블입니다. 숫놈 Dupont 케이블을 구매하시면 쉽게 케이블질(?) 을 하실 수 있습니다.

위에서 볼 수 있듯, 끝 부분이 금속으로 되어 있기 때문에 쉽게 꽂을 수 있습니다. 그리고 케이블을 중간에 잘라서 다른 케이블과 결속하기 쉽지요.

+

 

아두이노 나노 + 확장 보드

우노와 동일 

Step 6 : 소프트웨어

Step

 

아두이노로 나만의 불빛을 만들고 싶으신 분들은 소프트웨어를 아두이노에 넣으셔야 합니다. 업로드 한다고 표현을 하지요. 아두이노 기초 지식이 있으신 분들은 바로 소스코드를 사용하시면 되겠습니다. 라이브러리를 사용해야 하는데요, 그 설명은 다른 사이트 링크로 설명을 대신할까 합니다.

 

Step 7 : 관련 사전 지식

Step

 

아두이노 관련

아두이노를 한 번도 다뤄본 적이 없으시다면

옵션 1 : 컨트롤러를 사서 그냥 예쁘게 쓴다.

옵션 2 : 아두이노 관련 강좌를 듣고 온다

https://www.youtube.com/watch?v=JDGu4C_Jusg (심프팀)

위 영상에서는 아두이노 선택 가이드 및 어떻게 프로그램을 아두이노에 업로드 할 수 있는지 자세히 설명이 되어 있습니다.

네오픽셀 관련

네오픽셀 관련 설명

http://www.makewith.co/page/project/1002/story/2351/ (메이크위드)

https://www.kocoafab.cc/tutorial/view/40(코코아팹)

https://www.youtube.com/watch?v=eUm32CFvEdc (이준혁님)

아두이노 라이브러리를 사용하는 방법

https://kocoafab.cc/tutorial/view/228 (코코아팹)

http://codingrun.com/100 (코딩런)

아두이노로 네오픽셀 사용하기

본 소스코드를 위한 라이브러리 파일 다운로드

https://github.com/adafruit/Adafruit_NeoPixel/archive/master.zip

다운로드 하지 않고 바로 사용하는 방법

아두이노 - Sketch - Include Library - Manage Libraries
거기에서 원하는 라이브러리 이름을 입력하고 엔터를 칩니다. 그러면 유명한 라이브러리들은 주루룩 나옵니다.

 

Step 8 : 소프트웨어 소스코드

Step

 

소스코드 설명

네오픽셀 라이브러리 설치 후 소스코드 구동해야함

아두이노 소스코드 업로드 방법 및 [네오픽셀 라이브러리] 설치 방법은 [관련 사전 지식] 페이지 참고

소스코드 링크

https://github.com/happythingsmaker/ChristmasNeoPixel/blob/master/171125_ChristmasNeoPixel.ino

// 네오픽셀로 크리스마스 트리만들기 프로젝트

#include <Adafruit_NeoPixel.h>
//#include <Bounce2.h>

#define PIN 4
#define MIC_0_PIN 2
#define MIC_1_PIN 3
//#define DEALY 15
#define DEALY 30
#define BUTTON_DEBOUNCE_PERIOD 20 //ms
#define LED_COUNT 70

//네오픽셀을 사용하기 위해 객체 하나를 생성한다.
//첫번째 인자값은 네오픽셀의 LED의 개수
//두번째 인자값은 네오픽셀이 연결된 아두이노의 핀번호
//세번째 인자값은 네오픽셀의 타입에 따라 바뀌는 flag
Adafruit_NeoPixel strip = Adafruit_NeoPixel(LED_COUNT, PIN, NEO_GRB + NEO_KHZ800);

//Bounce buttonMic = Bounce();

void setup() {
    strip.begin(); //네오픽셀을 초기화하기 위해 모든LED를 off시킨다
    strip.show();
    //pinMode(MICPIN, INPUT);

    //마이크로 입력 하려면 여기를 해제하시오
    //    attachInterrupt(digitalPinToInterrupt(MIC_0_PIN), checkSound, FALLING);
    //    attachInterrupt(digitalPinToInterrupt(MIC_1_PIN), checkSound, FALLING);

}
int cnt = 0;
bool soundFlag = true;
long lastTime = 0;
void loop() {
    while (1) {
        //heartBeat(100, 20, 20, 1500);
        specialDelay(1000);
        //delay(1000);
        //        if (soundFlag == true) {
        //            rotateVisual();
        //        }

        if (lastTime + 15000 < millis()) {
            soundFlag = true;
            lastTime = millis();
        }
    }

}

void specialDelay(long timeMs) {
    while (timeMs--) {
        delay(1);
        if (soundFlag == true) {
            rotateVisual();
        }
    }


}
void rotateVisual() {

    switch (cnt++ % 6) {
        case 0:
            //녹색 랜덤
            colorWipe(strip.Color(random(0, 127), 255, random(0, 127)), DEALY); //녹색 출력
            colorWipe(strip.Color(random(0, 64), 255, random(0, 64)), DEALY); //녹색 출력
            colorWipe(strip.Color(random(0, 20), 255, random(0, 20)), DEALY); //녹색 출력
            break;
        case 1:
            //올랜덤
            colorWipe(strip.Color(random(0, 255), random(0, 255), random(0, 255)), DEALY); //올랜덤 출력
            colorWipe(strip.Color(random(0, 128), random(0, 128), random(0, 128)), DEALY); //올랜덤 출력
            colorWipe(strip.Color(random(0, 50), random(0, 50), random(0, 50)), DEALY); //올랜덤 출력
            break;
        case 2:
            //빨간 랜덤
            colorWipe(strip.Color(255, random(0, 255), random(0, 255)), DEALY); //빨간색 출력
            colorWipe(strip.Color(255, random(0, 127), random(0, 127)), DEALY); //빨간색 출력
            colorWipe(strip.Color(255, random(0, 64), random(0, 64)), DEALY); //빨간색 출력
            break;
        case 3:
            //파란 랜덤
            colorWipe(strip.Color(random(0, 127), random(0, 127), 255), DEALY); //파란색 출력
            colorWipe(strip.Color(random(0, 127), random(0, 127), 255), DEALY); //파란색 출력
            colorWipe(strip.Color(random(0, 127), random(0, 127), 255), DEALY); //파란색 출력
            break;
        case 4:
            // 올컬러 랜덤 올포지션
            colorAllRandom();
            colorAllRandom();
            colorAllRandom();
            break;
        case 5:
            rainbowCycle(DEALY / 2); //레인보우
            rainbowCycle(DEALY / 2); //레인보우
            break;
        case 6:
            theaterChase(strip.Color(random(0, 127), random(0, 127), 255), DEALY * 2); //파란색 출력
            theaterChase(strip.Color(random(0, 127), random(0, 127), 255), DEALY * 2); //파란색 출력
            theaterChase(strip.Color(random(0, 127), random(0, 127), 255), DEALY * 2); //파란색 출력
            break;
        case 7:
            theaterChase(strip.Color(127, 127, 127), DEALY * 2); //흰색 출력
            theaterChase(strip.Color(127, 127, 127), DEALY * 2); //흰색 출력
            theaterChase(strip.Color(127, 127, 127), DEALY * 2); //흰색 출력
            colorWipe(strip.Color(0, 0, 0), DEALY); //off
            break;
        case 8:
            //씨어터 빨간 랜덤
            theaterChase(strip.Color(127,   random(0, 127),   random(0, 127)), DEALY);
            theaterChase(strip.Color(127,   random(0, 127),   random(0, 127)), DEALY);
            theaterChase(strip.Color(127,   random(0, 127),   random(0, 127)), DEALY);
            colorWipe(strip.Color(0, 0, 0), DEALY); //off

            break;
        case 9:
            //빨 녹 파 랜덤 하나씩
            colorWipe(strip.Color(255, random(0, 255), random(0, 255)), DEALY); //빨간색 출력
            colorWipe(strip.Color(random(0, 25), 255, random(0, 25127)), DEALY); //녹색 출력
            colorWipe(strip.Color(random(
					목록으로