아두이노에서 네오픽셀을 사용할 때 유용하게 쓰이는 Adafruit_NeoPixel 라이브러리의 대표적인 예제인 strandtest.ino를 살펴보고 있습니다.
Adafruit NeoPixel에 대한 소개와 라이브러리, 예제 소개 등은 아래의 포스트를 확인해 주세요.
▶ 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 컨트롤러를 사용할 경우에는 관련 라이브러리도 추가합니다.
▶ 3. 네오픽셀이 연결된 아두이노의 핀 번호를 정의합니다.
// 아두이노의 어떤 핀에 NeoPixel이 연결되어 있습니까?
// Trinket 이나 Gemma를 사용할 경우 1번 핀에 연결할 것을 추천합니다.
#define LED_PIN 6 : 아두이노 디지털6번 핀에 연결되어 있습니다.
▶ 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의 비트스트림으로 제어된다.' 라는 의미입니다.
▶ 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)을 넣으면 밝기값과 연동하여 최종적인 색상값이 정해지게 됩니다.
▶ 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() 함수를 사용하여 셋팅된 컬러값을 네오픽셀에 반영합니다.
네오픽셀 연출 함수들을 자세히 살펴보시려면, 다음 포스팅을 참고 해 주세요.
아두이노 라이브러리의 예제 파일 활용 방법 (feat. LiquidCrystal.h) (0) | 2022.07.14 |
---|---|
개발 중에 잘 되던 동작이 안될 때 어떻게 하시나요? (1) | 2022.07.13 |
[네오픽셀] 아두이노 Adafruit NeoPixel 예제 분석 (3/3) (0) | 2022.07.11 |
[네오픽셀] 아두이노 Adafruit NeoPixel 예제 파일 분석 (1/3) (0) | 2022.07.11 |