공작소굴

아두이노에서 네오픽셀을 사용할 때 유용하게 쓰이는 Adafruit_NeoPixel 라이브러리의 대표적인 예제인 strandtest.ino를 살펴보고 있습니다.

strandtest.ino

 

1. 네오픽셀 소개 및 strandtest.ino 프로그램 소개 주석

Adafruit NeoPixel에 대한 소개와 라이브러리, 예제 소개 등은 아래의 포스트를 확인해 주세요.

 

[네오픽셀] 아두이노 Adafruit NeoPixel 예제 파일 분석 (1/3)

 Adafruit 사의 네오픽셀(Neopixel)은 컬러 LED와 제어칩을 하나의 모듈로 만든 태로 1개의 신호만으로 밝기와 색상을 바꿀 수 있으며, 이론상 무한대의 네오픽셀 연결해 움직이는 무지개, 사운드

mechacave.tistory.com

 

2. 전처리 및 setup(), loop()

전처리 살펴보기

▶ 1
#include <Adafruit_NeoPixel.h>

▶ 2
#ifdef __AVR__
 #include <avr/power.h> // Required for 16 MHz Adafruit Trinket
#endif

▶ 3
// Which pin on the Arduino is connected to the NeoPixels?
// On a Trinket or Gemma we suggest changing this to 1:
#define LED_PIN    6

▶ 4
// How many NeoPixels are attached to the Arduino?
#define LED_COUNT 60

▶ 5
// Declare our NeoPixel strip object:
Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);
// Argument 1 = Number of pixels in NeoPixel strip
// Argument 2 = Arduino pin number (most are valid)
// Argument 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)


▶ 1. NeoPixel 라이브러리를 추가합니다.

#include <Adafruit_NeoPixel.h>


▶ 2. 16MHz로 동작하는 Adafruit Trinket 컨트롤러를 사용할 경우에는 관련 라이브러리도 추가합니다.

더보기
Adafruit Pro Trinket 16MHz 동작


▶ 3. 네오픽셀이 연결된 아두이노의 핀 번호를 정의합니다.

// 아두이노의 어떤 핀에 NeoPixel이 연결되어 있습니까?
// Trinket 이나 Gemma를 사용할 경우 1번 핀에 연결할 것을 추천합니다.

#define LED_PIN 6 : 아두이노 디지털6번 핀에 연결되어 있습니다.
더보기

 

Adafruit GEMMA 웨어러블용 컨트롤러 보드

 


▶ 4. 제어할 네오픽셀의 개수를 정의합니다.

// 얼마나 많은 네오픽셀이 연결되어 있습니까?

#define LED_COUNT 60 : 60개 모두 제어
#define LED_COUNT 20 : 60개 중 처음 20개만 제어


▶ 5. NeoPixel 스트립 객체를 선언합니다.

Adafruit_NeoPixel strip(LED_COUNT, LED_PIN, NEO_GRB + NEO_KHZ800);

// 인수1 = NeoPixel 스트립의 픽셀 수 ( LED_COUNT : 제어할 픽셀 개수 )
// 인수2 = 연결된 Arduino 핀 번호(대부분 가능, LED_PIN)
// 인수3 = 픽셀 유형 플래그, 필요에 따라 함께 추가
// NEO_KHZ800 : 800KHz 비트스트림(대부분의 NeoPixel 제품(WS2812 LED 포함))
// NEO_KHZ400 : 400 KHz(클래식 'v1'(v2 아님) FLORA 픽셀, WS2811 드라이버)
// NEO_GRB 픽셀은 GRB 비트스트림용으로 연결됩니다(대부분의 NeoPixel 제품).
// NEO_RGB 픽셀은 RGB 비트스트림용으로 연결됩니다(v2가 아닌 v1 FLORA 픽셀).
// NEO_RGBW 픽셀은 RGBW 비트스트림용으로 연결됩니다(NeoPixel RGBW 제품).

Red (적색) / Green (녹색) / Blue (청색) / White (백색)

▶ 'strip은, Adafruit_NeoPixel 의 객체로서, 6번 핀에 연결되어 60개의 네오픽셀을 제어하도록 선언한다. 각각의 네오픽셀은 NEO_GRB, 800KHz의 비트스트림으로 제어된다.' 라는 의미입니다.
더보기
Adafruit의 Flora v1 NeoPixel

 


setup() 함수 살펴보기

▶ 1
// setup() function -- runs once at startup --------------------------------
void setup() {

▶ 2
  // 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.

▶ 3  
  strip.begin();           // INITIALIZE NeoPixel strip object (REQUIRED)
  strip.show();            // Turn OFF all pixels ASAP
  strip.setBrightness(50); // Set BRIGHTNESS to about 1/5 (max = 255)
}


▶ 1. setup()

// 시작할 때 한 번만 실행됩니다.


▶ 2. 컨트롤러 보드에 따라 자동적으로 추가되는 구문입니다.

// Adafruit Trinket 5v 16MHz 보드를 사용할 때에 필요한 구문으로
// 다른 보드를 사용할 경우 삭제해도 됩니다. (삭제를 안한다고 해가 되는 건 아닙니다.)


▶ 3. 네오픽셀 객체(strip)를 초기화합니다.

▶ 네오픽셀 객체로 선언한 strip은 라이브러리에서 정의해 놓은 여러가지 함수들을 사용할 수 있습니다.

strip.begin()
// begin() 함수는 strip 객체를 초기화(INITIALIZE)하는 기능으로 strip을 제어하기 전 반드시 필요합니다.

strip.show()
// 실행 즉시 모든 네오픽셀이 꺼지게 됩니다. (Turn OFF)
▶ show() 함수는 네오픽셀을 지정된 값으로 모두 보여주는(show) 함수입니다.
▶ 여기서는 begin() 이후로 모든 네오픽셀의 값이 모두 (R=0, G=0, B=0) 이므로 꺼지게 됩니다.

strip.setBrightness(50)
// setBrightness(밝기값) 함수는 strip의 밝기를 조절하는 함수로 최대 255까지의 값을 인수로 받을 수 있습니다.
▶ 나중에 strip에 색상값(RGB)을 넣으면 밝기값과 연동하여 최종적인 색상값이 정해지게 됩니다.

loop() 함수 살펴보기

▶ 1
// loop() function -- runs repeatedly as long as board is on ---------------
void loop() {

▶ 2
  // Fill along the length of the strip in various colors...
  colorWipe(strip.Color(255,   0,   0), 50); // Red
  colorWipe(strip.Color(  0, 255,   0), 50); // Green
  colorWipe(strip.Color(  0,   0, 255), 50); // Blue

▶ 3
  // Do a theater marquee effect in various colors...
  theaterChase(strip.Color(127, 127, 127), 50); // White, half brightness
  theaterChase(strip.Color(127,   0,   0), 50); // Red, half brightness
  theaterChase(strip.Color(  0,   0, 127), 50); // Blue, half brightness

▶ 4
  rainbow(10);             // Flowing rainbow cycle along the whole strip

▶ 5
  theaterChaseRainbow(50); // Rainbow-enhanced theaterChase variant
}


▶ 1. loop()

// 보드가 켜져 있는 동안 계속 반복해서 실행됩니다.


▶ 2. colorWipe(컬러값, 딜레이)

// 다양한 색깔로 NeoPixel strip을 채워나갑니다.
colorWipe(strip.Color(255, 0, 0), 50);

strip.Color(Red, Green, Blue) 로 설정된 컬러값으로 첫 번째 네오픽셀 부터 차례로 50ms 마다 켜지게 합니다.
LED_COUNT 만큼 켜진 뒤 멈춥니다.


※ LED의 변화를 확인하기 쉽도록 프로그램을 수정하여 영상을 촬영하였습니다.


▶ 3. theaterChase(컬러값, 딜레이)

// 지정한 색깔의 LED가 줄지어 이동하는 듯 한, 앞의 LED를 쫒아가는(chase) 듯 한 효과를 냅니다.
theaterChase(strip.Color(127, 127, 127), 50);


※ LED의 변화를 확인하기 쉽도록 프로그램을 수정하여 영상을 촬영하였습니다.

 

▶ 4. rainbow(딜레이)

// 전체 NeoPixel strip을 따라 무지개가 흐르는 듯한 효과입니다.
rainbow(10);

 

※ 원형으로 만들면 빙글빙글 돌아가는 표현이 됩니다.

 

▶ 4. theaterChaseRainbow(딜레이)

// 레인보우 효과가 적용된 따라가기 효과 입니다.
theaterChaseRainbow(50)

 


 

 지금까지 예제파일에 나와있는 연출 함수들을 확인해 봤습니다.

 

 네오픽셀을 사용하는 방법을 간단히 정리해 보겠습니다.

 

1. 제어할 네오픽셀의 개수연결된 핀 번호를 사용하여 네오픽셀 객체를 선언하고

2. 상황별로 연출할 불빛의 색상과 움직임을 정한 뒤

3. setPixel() 함수를 사용하여 네오픽셀 각각의 컬러를 셋팅합니다.

   (빛깔만 바꾼다고 바로 반영되는 것이 아닙니다.)

4. strip.show() 함수를 사용하여 셋팅된 컬러값을 네오픽셀에 반영합니다.

 

3. 네오픽셀 연출 함수 상세보기

네오픽셀 연출 함수들을 자세히 살펴보시려면, 다음 포스팅을 참고 해 주세요.

 

[네오픽셀] 아두이노 Adafruit NeoPixel 예제 분석 (3/3)

 Adafruit_NeoPixel 라이브러리의 대표적인 예제인 strandtest.ino를 살펴보고 있습니다. 이번 포스팅에서는 예제에 있는 다양한 연출 함수들을 상세히 살펴보도록 하겠습니다. strandtest.ino 1. 네오픽셀

mechacave.tistory.com

 

 

공유하기

facebook twitter kakaoTalk kakaostory naver band