마이크로비트네오픽셀터치센서이용하여 돼지등동작하는 것을 확인 했다. 그러나 실생활에 사용하기 위해서는 배터리 이용해야 하고, 전원 ON/OFF를 할 수 있어야 하고, 편하게 사용 할 수 있어야 한다. 어떻게든 마이크로비트로 가능 하겠지만 시중에 다른 사람들이 만들어 놓은 돼지등 무드등을 본다면 꽤나 휴대성 면에서 떨어진다. 그래서 그런 부분을 해결 하고자, 지 저금통 & 아두이노 나노 & 배터리 & 네오픽셀 & ON/OFF 스위치 & 충반전 모듈 & 터치 모듈& 여러개의 점퍼선을 가지고 만들어 봤다. 만든지는 꽤 됐는데, 이제서야 글을 쓴다 ㅡ.ㅡ


예전에도 그러했듯이 완성품 동영상을 보자.

<터치로 동작하는 돼지등 무드등 동영상>


며칠동안 밤에 들고 다녔는데, 괜찮은거 같다. 한여름 공원에 모여 얘기할때 옆에 돼지 무드등 있는거 상상해 보니, 좋다^^.


그럼 만들어 보자!


돼지 무드등 만들기 #1

재료

 돼지 저금통

 아두이노 나노

 배터리

 네오픽셀

 ON/OFF 스위치

 충반전 모듈

 터치 모듈

*다이소에서 500원에 구입 가능한 돼지 저금통이다. 

*꽤 오래전에 알리에서 구입한 것이다. 싼 가격에 막 쓸 수 있어서 좋다.

*LI-PO 18650 3.7V 500mA다. 옛날 휴대폰 충전지로 사용 가능 하다.

*일반 LED로 사용 가능 하며, 내가 원하는 색을 사용 할 수 있어서 대부분 네오식셀을 사용한다. 제어 하기도 편하다.

*돼지 무드등을 켜고 끄기 위해 필요하다.

*TP4056은 배터리를 충전 시키기 위한 모듈이다. 두가지 종류가 있다. 돼지 무드등에 사용한 배터리는 이미 보호 회로가 있기 때문에 충전 기능만 있는 모듈을 사용했다.

*알리에서 싸게 구입한 모듈이다. 앞에 어느 정도 두께가 가로 막아도 터치 동작이 잘 된다.

원래 계획은 아두이노 나노보다 더 작은 ATTINY85 모듈을 사용 할려고 했으나, 터치 센서 연결 후 프로그램 업로드를 하기 위해 컴퓨터에 연결 하면 인식을 못한다. 어떤 경우는 부트로트가 날라가 버린다 ㅠㅠ. 입력핀 쪽으로 기준 이상의 전류가 흘러 망가지는거 같은데...... 나중에 알아 봐야 겠다.


돼지 무드등 만들기 #2

재료들 연결 하기

회로도























실제 연결 사진

<회로도 사진>




<연결 사진>

*fritzing으로 회로도 그리는건 거의 처음이라 잘 다루지 못한다. 포토샵으로는 마구마구 변형이 가능한데......


*돼지 무드등에 들어가기 전 사진이 없다 ㅠㅠ. 그래서 동영상에 있는걸 캡쳐 했더니......


돼지 무드등 만들기 #2

코드

코드

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
#include <Adafruit_NeoPixel.h>
#include <MsTimer2.h>
#ifdef __AVR__
  #include <avr/power.h>
#endif
 
#define PIN 6
#define TouchSensor 9 // Pin for capactitive touch sensor
 
boolean currentState = LOW;
boolean lastState = LOW;
int event = 0;
int eventCount = 0;
Adafruit_NeoPixel strip = Adafruit_NeoPixel(6, PIN, NEO_GRB + NEO_KHZ800);
 
 
void setup() {
  Serial.begin(9600);
  pinMode(TouchSensor, INPUT);
  strip.begin();
  strip.show(); // Initialize all pixels to 'off'
  
  MsTimer2::set(60, backGroundRun);
  MsTimer2::start();
}
 
void loop() {
     
  currentState = digitalRead(TouchSensor);
    if (currentState == LOW && lastState == HIGH){
      eventCount++;
      event = eventCount % 3;
  }
  lastState = currentState;
 
}
 
void backGroundRun()
{
  if(event == 0)
  {
    for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(25500));
    }
    strip.show();
  }else if(event == 1)
  {
    for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(02550));
    }
    strip.show();
  }
  else
  {
    for(uint16_t i=0; i<strip.numPixels(); i++) {
      strip.setPixelColor(i, strip.Color(255255255));
    }
    strip.show();
  } 
}
cs

*Color Scripter사요하는 것도 거의 처음이다. 편하다. 

 사이트에 들어가 

 코드 붙혀 넣고,

 필요한 설정을 한 다음,

 클립코드로 복사하고,

 원하는 곳에 붙혀넣기 하면 된다.


*팁으로 편집창에는 정상적으로 보이나, 실제 표시되는 것은 가운데 정렬로 된다. 그냥 선택 후 왼쪽 정렬 해주면 간단하게 해결 된다.


*단색만 지정할 경우는 backGroundRun()부분은 빼도 된다. 그 부분을 루프에 넣으면 된다.


*이벤트는 간단하게 손가락을 뗄때, 동작하도록 했다. 원래 코드에는 롱터치도 구현했지만, 뺐다!


블로그 이미지

김코치 나미쵸

컴퓨터 코치 김코치 컴퓨터 자격증 취득과 아는 힘의 즐거움을 드립니다. 나도 할 수 있다는 자신감은 덤으로 드립니다. 기초부터 실무까지 김코치를 찾아 주세요.

댓글을 달아 주세요

일단 무슨 기능인지 결과를 먼저 보자

<기능 추가한 동영상>

그렇다. 그냥 뺑글뺑글 도는 기능 추가한 것이다. 소스 코드에는 여러가지 흔적이 있지만 그냥 이걸 보여주는 걸로 만족 ㅋ


아래는 작업 과정이다.

이랬던 뒷면이 

<오크통뱅크 상판 뒷면_작업 하기전>

이렇게 바뀌었다. --.--

<오크통뱅크 상판 뒷면_작업 후>

막손이라 정리가 잘 안된다. <- 잘 안된거 숨기기 위해 글씨는 작게......


원래 오크통네오픽셀아두이노 나노가 들어갈 자리는 없다. 그런데 들어가 있다. 이유는 간단하다.

처음 배터리팩과 오크통을 구매할 당시 어거지로 넣다가 뺄수도 없고 완벽하게 넣을 수도 없는 중간에

걸린 상황이 되어 눈물(ㅠㅠ)을 머금고 오크통을 분해 했다. 조립하는 과정에서 공간을 만든다고 바닥을

아래의 사진처럼 만들었다.

<오크통뱅크 바닥>


분해된 오크통 재활용 하다보니 공간이 남아서 아두이노 나노를 넣을수 있었다. 그러나 꽉 찬다...... 


이제 소스 코드를 보자!

기본에 있는 예제 소스를 기본으로 몇개 추가 하고 수정 했다.


#include <Adafruit_NeoPixel.h>

//#include <MsTimer2.h>

#ifdef __AVR__

  #include <avr/power.h>

#endif


#define PIN 6


// Parameter 1 = number of pixels in strip

// Parameter 2 = Arduino pin number (most are valid)

// Parameter 3 = pixel type flags, add together as needed:

//   NEO_KHZ800  800 KHz bitstream (most NeoPixel products w/WS2812 LEDs)

//   NEO_KHZ400  400 KHz (classic 'v1' (not v2) FLORA pixels, WS2811 drivers)

//   NEO_GRB     Pixels are wired for GRB bitstream (most NeoPixel products)

//   NEO_RGB     Pixels are wired for RGB bitstream (v1 FLORA pixels, not v2)

//   NEO_RGBW    Pixels are wired for RGBW bitstream (NeoPixel RGBW products)

Adafruit_NeoPixel strip = Adafruit_NeoPixel(13, PIN, NEO_GRB + NEO_KHZ800);

uint32_t oakStrip[13] = {strip.Color(0,255,0) //초록색

                        ,strip.Color(0,255,0)       //단색으로 돌릴대는 이부분 수정해 주면 된다. 적어도 앞 부분에 5개 정도 색을 지정해야

                        ,strip.Color(0,255,0)       //이쁘게 나온다.

                        ,strip.Color(0,255,0)

                        ,strip.Color(0,255,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

                        ,strip.Color(0,0,0)

};

int onStrip[13] = {1,1,1,1,1,0,0,0,0,0,0,0,0}; //

int currentPos = 10;

int fade = 2;


// IMPORTANT: To reduce NeoPixel burnout risk, add 1000 uF capacitor across

// pixel power leads, add 300 - 500 Ohm resistor on first pixel's data input

// and minimize distance between Arduino and first pixel.  Avoid connecting

// on a live circuit...if you must, connect GND first.


void setup() {

  // This is for Trinket 5V 16MHz, you can remove these three lines if you are not using a Trinket

  #if defined (__AVR_ATtiny85__)

    if (F_CPU == 16000000) clock_prescale_set(clock_div_1);

  #endif

  // End of trinket special code


  Serial.begin(9600);

  strip.begin();

  strip.show(); // Initialize all pixels to 'off'

  //MsTimer2::set(60, onFade); //숨쉬는 기능을 적용할려면 이 부분 주석을 풀어 부면 된다.

  //MsTimer2::start();

}


void loop() {

  

  //onColor(); //단색으로 돌리기

  

  rainbow(60); //무지개색으로 돌리기


}


void onColor()

{

  for(int j = 13 ; j > 0 ; j--){

    for(int i = 0 ; i < strip.numPixels() ; i++)

    {

     strip.setPixelColor(i, oakStrip[(j+i)%strip.numPixels()]);

    }

    strip.show();

    delay(60);

  }

}


void rainbow(uint8_t wait) {

  uint16_t i, j;


  //strip.setBrightness(0);

  //currentPos = 0;


  for(j=0; j<256; j++) {

    for(i=0; i<strip.numPixels(); i++) {

      if(onStrip[(j+i)%13] == 1)

      {

        strip.setPixelColor(i, Wheel((i+j) & 255));

      }

      else

      {

        strip.setPixelColor(i, 0);

      }

    }

    strip.show();

    delay(wait);

  }

}


// Input a value 0 to 255 to get a color value.

// The colours are a transition r - g - b - back to r.

uint32_t Wheel(byte WheelPos) {

  WheelPos = 255 - WheelPos;

  if(WheelPos < 85) {

    return strip.Color(255 - WheelPos * 3, 0, WheelPos * 3);

  }

  if(WheelPos < 170) {

    WheelPos -= 85;

    return strip.Color(0, WheelPos * 3, 255 - WheelPos * 3);

  }

  WheelPos -= 170;

  return strip.Color(WheelPos * 3, 255 - WheelPos * 3, 0);

}


void onFade() // 숨시기 기능 함수

{

  if( currentPos < 3 || currentPos > 125 )

  {

    fade = fade * (-1);

  }

  currentPos = currentPos + fade;

  strip.setBrightness(currentPos);

  Serial.println(currentPos);

}


소스코드는 이렇다. 그냥 쓰면 된다. 더 좋은 방법이 있다면 댓글로 살짝 알려 줬으면 좋겠다. 그래야 나도 보고 배우니까^^

여기에 추가 기능 하다 더 넣고 싶은게 있다. 배터리 전압을 체크 하여 배터리 전압대응하는 색으로 표시하는 기능이다.

mcu 자체적으로 내부 전압을 알수 있다고 하는데...... 검색해봐야 겠다.


오크통뱅크 자료는 에다이카페에 있다. 


___LED.ino

Adafruit_NeoPixel-master.zip


블로그 이미지

김코치 나미쵸

컴퓨터 코치 김코치 컴퓨터 자격증 취득과 아는 힘의 즐거움을 드립니다. 나도 할 수 있다는 자신감은 덤으로 드립니다. 기초부터 실무까지 김코치를 찾아 주세요.

댓글을 달아 주세요