프라모델

프라모델 LED 작업을 위한 준비 - LED Strip 예제를 통한 기본 동작 이해하기

여우래비 2020. 11. 10. 22:16
반응형

LED Strip 은 단어 뜻 그대로 LED 가 쭉 연결된 조각이라는 뜻이다. (영영사전검색시 long narrow piece)

 

가장 작은 사이즈도 성인 새끼손톱 정도는 되기 때문에, HG나 RG 같은 작은 사이즈의 킷에 작업할 때는 어쩔 수 없이 킷을 손상시켜야만 하는 경우가 생긴다.

 

아래 Dimension 참조하면, 개별 커팅시 가로 약 12mm, 세로 7mm 정도이다.  생각보다 크다.

그러나, 매우 손쉽게 3색 제어가 가능하다는 점, 그리고 저항이 이미 장착되어 있기 때문에 여타 LED 를 사용할 때 처럼 사양 검토를 하지 않아도 된다는 편리함이 있다.  5V에 전원 연결하고 아두이노의 데이터 핀 1개에 제어부를 납땜하면 끝!

 

처음 LED Strip 을 구매하면, 아래와 같은 모양이다. 

알X익스프레스에서 1만원 주고 144개 주문했더니 이렇게 롤타입으로 왔다.

 

알X익스프레스에서 무방수인 WS2812, 1m 당 144개 짜리를 사용하였다.

 

사실 LED Strip 의 용도는 프라모델 용은 아니고, 외부 장식이나 차량 등에 주로 사용되는 것 같다.  그러나 Strip 의 LED 를 분리하여 각 개별로 사용 가능하므로, 프라모델에 응용하시는 분들이 많다.  게다가, 마치 직렬 연결처럼 LED 배선이 가능하기 때문에, 필요한 전선도 최소화 할 수 있다.

 

아래는 이전에 일반 SMD Type LED 로 작업한 다X 페넥스인데, 허리춤 아래를 보면 많은 가닥의 에나멜선을 볼 수 있다.  LED Strip 을 사용하면, 이 선을 단 3개로 줄일 수 있다.

에나멜선이라 그리 굵어 보이지는 않지만 복잡하다. 

 

그럼 먼저 LED Strip 에 대한 예제를 해보기 위해 과감히 LED Strip 중 몇개를 잘라낸다.

필자의 경우 5개를 잘라내고, 빵판에 쉽게 장착하기 위해 아래와 같이 Pin 을 납땜하였다.

그리고 아래와 같이 배선한다.

LED Strip 상 화살표의 시작점이 Ground (-), 저항쪽이 Vcc (+), 그리고 가운데 단자가 신호를 입력하는 단자이다. 

 

위 그림의 오른쪽에 있는것이 바로 아두이노인데, 전세계의 뛰어난 개발자들이 이미 만들어 놓은 풍부한 예제와 각종 하드웨어를 저렴하게 사용할 수 있는 아두이노는 정말 대단한 개발 도구다.  내가 어렸을 때에도 이렇게 공부 환경이 좋았다면 진로를 진작에 전자과로 바꾸었을 것이다.

 

LED Strip 도 마찬가지로 풍부한 예제가 있다. 

아두이노 개발툴을 실행하고, 라이브러리 검색으로 가서 "neopixel" 을 검색하면 설치 가능한 라이브러리가 쭉 나온다.  우리가 사용할 라이브러리는 Adafruit NeoPixel 이므로 검색 후 설치하자.

 

설치가 완료 되었다면, 간단한 예제를 실행해 보기로 한다. 아래와 같이 파일 - 예제 - Adafruit NeoPixel - simple 을 선택한다.

 

뭐, 코드 수정할 것도 없고, 그냥 업로드 해 보자.

와! 작동이 잘 된다.  짝짝짝!

 

그럼 코드를 조금 이해해 보기로 하자.

 

 

  작동 원리 및 코드 이해

 

 

코드를 먼저 살펴보자.  아래를 보면 뭔가 복잡해 보이지만, 우리가 건드려야 하는 부분은 몇개 안되므로 너무 겁먹지 말자.

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
// NeoPixel Ring simple sketch (c) 2013 Shae Erisson
// Released under the GPLv3 license to match the rest of the
// Adafruit NeoPixel library
 
#include <Adafruit_NeoPixel.h>
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif
 
// Which pin on the Arduino is connected to the NeoPixels?
#define PIN        6 // On Trinket or Gemma, suggest changing this to 1
 
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16 // Popular NeoPixel ring size
 
// When setting up the NeoPixel library, we tell it how many pixels,
// and which pin to use to send signals. Note that for older NeoPixel
// strips you might need to change the third parameter -- see the
// strandtest example for more information on possible values.
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
 
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels
 
void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.
 
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}
 
void loop() {
  pixels.clear(); // Set all pixel colors to 'off'
 
  // The first NeoPixel in a strand is #0, second is 1, all the way up
  // to the count of pixels minus one.
  for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
 
    // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255
    // Here we're using a moderately bright green color:
    pixels.setPixelColor(i, pixels.Color(01500));
 
    pixels.show();   // Send the updated pixel colors to the hardware.
 
    delay(DELAYVAL); // Pause before next pass through loop
  }
}
cs

위 코드를 실행했을때, 동영상을 보면 녹색불이 아래쪽 LED 부터 순차적으로 켜졌다가, 다시 처음으로 돌아가는 반복 Loop 이다.   여기서는 기본적인 아두이노 코딩은 다 안다고 가정하기로 한다.

 

위에 부터 눈여겨 봐야 할 코드를 살펴보자.

1
#define PIN        6 // On Trinket or Gemma, suggest changing this to 1
cs

LED Strip 과 아두이노의 데이터 핀을 연결 할 때, 아두이노의 6번을 사용한다는 뜻이다.

 

1
2
// How many NeoPixels are attached to the Arduino?
#define NUMPIXELS 16 // Popular NeoPixel ring size
cs

주석을 해석하면 바로 알겠지만, 사용 할 LED Strip 상 LED 갯수를 의미한다. 여기서는 16개로 되어 있는데 우리는 5개를 사용하였으므로 나중에는 5로 바꾸면 된다.

 

1
Adafruit_NeoPixel pixels(NUMPIXELS, PIN, NEO_GRB + NEO_KHZ800);
cs

NeoPixel 라이브러리를 드디어 사용한다.  위에서 세팅한 아두이노 데이터 핀번호와 LED 갯수를 넣어 "pixels" 라는 객체를 만든다.  이제, 우리가 장착한 LED Strip 의 이름은 pixels 이다. 

 

1
#define DELAYVAL 500 // Time (in milliseconds) to pause between pixels
cs

작동 영상을 보면 일정 간격으로 LED 가 점등되는데, 이 간격을 조절하기 위한 명령인 delay 에 입력하는 변수이다.
밀리세컨드 단위로 500 이면 0.5초 를 뜻한다. 원하는 간격으로 조절하면 된다.

 

1
2
3
4
5
6
7
8
9
10
void setup() {
  // These lines are specifically to support the Adafruit Trinket 5V 16 MHz.
  // Any other board, you can remove this part (but no harm leaving it):
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000)
  clock_prescale_set(clock_div_1);
#endif
  // END of Trinket-specific code.
 
  pixels.begin(); // INITIALIZE NeoPixel strip object (REQUIRED)
}
cs

void setup() 은 아두이노에서 사용할 하드웨어 등이 사용 가능한 상태로 준비되도록 셋업하는 함수이다. 
pixels.begin() 은 위에서 정한 LED strip 인 pixel 을 off 하여 초기화 하는 명령이다.   기타 세팅은 건드리지 않아도 된다.

 

1
pixels.clear(); // Set all pixel colors to 'off'
cs

Loop 함수 내의 상기 명령은 혹시 모를 pixel 에 세팅되어져 있는 값들을 모두 off 로 변경하는 명령이다.

 

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
void loop() {
  pixels.clear(); // Set all pixel colors to 'off'
  // The first NeoPixel in a strand is #0, second is 1, all the way up
  // to the count of pixels minus one.
  for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
 
    // pixels.Color() takes RGB values, from 0,0,0 up to 255,255,255
    // Here we're using a moderately bright green color:
    pixels.setPixelColor(i, pixels.Color(01500));
 
    pixels.show();   // Send the updated pixel colors to the hardware.
 
    delay(DELAYVAL); // Pause before next pass through loop
  }
}
cs

 

For 문을 써서 동작을 반복시기 전에, For 문 중간의 pixels.setPixelColor(i, pixels.Color(0, 150, 0)); 를 먼저 이해해야 한다.   pixels 는 알다시피 우리가 이미 정한 LED Strip 객체 이름이고, 뒤의 점 (dot) 이하 부분이 객체의 속성이다.

 

.setPixelColor 는 객체의 색속성을 세팅하는 것으로 문법은 아래와 같다.

1
pixels.setPixelColor (n, pixels.Color(R, G, B));
cs

n: 제어할 LED 의 번호를 뜻한다. 이 예제에서 LED Strip 의 LED 개수는 5개이므로 LED 번호도 1번부터 5번까지 할당될 것 같지만, 프로그램상에서는 0번부터 4번까지 할당된다.

R: 이 위치에 0~255의 범위로 밝기를 입력하면, 해당 밝기의 적색 세팅된다.

G: 이 위치에 0~255의 범위로 밝기를 입력하면, 해당 밝기의 녹색이 세팅된다.

B: 이 위치에 0~255의 범위로 밝기를 입력하면, 해당 밝기의 청색이 세팅된다.


이 문법은 아래와 같은 형태로도 사용 가능하다.

1
pixels.setPixelColor (n, R, G, B);
cs


만약 첫번째 LED를 적색만 최대 밝기로 출력하길 원한다면 아래와 같이 세팅하면 된다.

1
pixels.setPixelColor (0, pixels.Color(255, 0, 0));
cs

녹색/청색도 255의 위치만 변경하면 된다.

3원색의 원리에 따라 색의 혼합이 가능한데, 핑크를 원한다면 적색과 청색을 동시 출력하고, 백색을 원한다면 3가지 색을 모두 세팅하면 된다.

 

1
pixels.show();   // Send the updated pixel colors to the hardware.
cs

세팅이 완료되었다면, 이제 객체를 점등시키는 명령을 줘야 하는데, .show() 가 바로 그것이다. 이제 비로소 불이 들어온다.

 

1
delay(DELAYVAL); // Pause before next pass through loop
cs

앞에서 정한 LED 점등 간격을 적용하는 명령이다. 현재 DELAYVAL 에 500이 세팅되어 있으므로, LED 는 0.5초간격으로 점등을 반복할 것이다.


이제 For 문 내부의 .setPixelColor 을 보자.

1
2
  for(int i=0; i<NUMPIXELS; i++) { // For each pixel...
    pixels.setPixelColor(i, pixels.Color(0, 150, 0));
cs

LED 순서를 변경하기 위해 변수 i를 0부터 증가시키고, LED 총 갯수인 NUMPIXELS 에 도달하기 전까지, 즉 총 5번 반복시킨다.  G 의 위치에 150이 있으므로 밝기는 중간정도임을 알 수 있다.

 

pixel.show() 명령으로 세팅된 값으로 점등시키고, delay 명령으로 점등 간격을 조절한다.

이후 i=1로 변경되는데, i=0 일때 (1번 LED) 점등 후 소등 명령을 주지 않았으므로 그대로 켜져있는 상태에서 0.5초 후 i=1인 2번 LED 가 점등된다.

i=4 까지 총 5개의 LED 가 0.5초 간격으로 순차적으로 점등되어 모든 LED 가 다 점등되면, 다시 i=0으로 돌아가 처음부터 반복된다.  참 쉽죠잉?

 

다음에는 블루투스 모듈을 사용하는 방법을 알아보기로 한다.

 

이번 포스팅 끝.

반응형