본문 바로가기
전기/Arduino

[Arduino] WS2812 5*5 (RGB LED) #2 example operation

by 자유로운 생활 2023. 1. 28.
728x90
반응형

WS2812 5 by 5 _ RGB LED

Arduino Mega 2560

Oscilloscope

 

지난 포스팅에서, WS2812 동작 방법에 대해 알아봤습니다.

제가 가지고 있는 것은 WS2812가 아니라 WS2812B 였었죠!

 

아무튼 0 code 와 1 code 조합으로 

한 개의 픽셀 당 24 bit 씩 데이터를 날려줘야 한다는 사실까지 확인했습니다.

오실로스코프를 이용해서 0 code 와 1 code 가 잘 나오는지와

두 개의 픽셀을 동작시키는데, 48 개의 0 code 와 1 code 조합을 뿌려줘야 했었습니다.

 

지난 포스팅 링크는 아래에 있으니, 

아직 확인하지 않은 분들께서는 아래 링크에서 확인해주세요!

https://jauroun.tistory.com/40

 

[Arduino] WS2812 5*5 (RGB LED) #1 동작 방법

WS2812B 5*5 Intellgent control LED light source 이번에는 RGB LED 를 한번 동작시켜볼까 합니다. LED...뭐 당연히 번쩍번쩍 불빛을 내며 동작할 겁니다. 근데 대체 어떻게 생겼고, 또 어떻게 사용하는 거야? 저

jauroun.tistory.com

 

 

자, 이번에는 예제를 통해 동작을 확인해보고,

밝기 조정 및 색깔 조정하는 방법에 대해 알아봅시다!

 

 

1. 예제 프로그램 (example) 설명

 

아두이노에서 예제를 쉽게 받아 볼 수 있다는 것은 다들 아시죠?

저는 그 중에서 

Adafruit_NeoPixel 예제를 사용했습니다.

(이 예제를 이용한 특별한 이유가 있는 것은 아니고,

그냥 WS2812 검색했더니 나오길래 그냥 활용한 것 뿐입니다.)

 

예제를 아주 살~짝 수정해서,

테스트 확인용으로 사용했습니다.

아래를 보시죠!

 

#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
#define NUMPIXELS 2 // Popular NeoPixel ring size

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'
  for(int x=0; x<NUMPIXELS; x++)
  {
     pixels.setPixelColor(x, pixels.Color(0, 0, 0));
     pixels.show();
     delay(DELAYVAL);
  }  
  for(int i=0; i<NUMPIXELS; i++) 
  { // For each pixel...
    pixels.setPixelColor(i, pixels.Color(0, 150, 0)); ///bright green color
    pixels.show();   // Send the updated pixel colors to the hardware.
    delay(DELAYVAL); // Pause before next pass through loop
  }
}

위의 소스가 제가 활용한 예제 입니다.

 

간단히 쪼개서 살펴볼까요?

#define PIN        6 // On Trinket or Gemma, suggest changing this to 1
#define NUMPIXELS 2 // Popular NeoPixel ring size

우선 이 부분에서 

PIN 은 6번핀 즉, Arduino Mega 2560 PWM 포트 쪽을 보시면,

2~13번 번호가 있는데, 그 중에서 6번핀을 사용하겠다는 뜻입니다.

만약 다른 핀을 이용하시려면 바꿔줘야 하겠죠?

 

NUMPIXELS 은 픽셀의 수 입니다.

저는 WS2812-5*5 를 가지고 있어, 총 25개의 픽셀을 동작시켜야 하지만

테스트를 위해 2개의 픽셀만 사용했습니다.

만약, 5개의 픽셀을 사용하시려면 2 대신 5라고 적어주시면 됩니다.

 

  pixels.begin();

pixels.begin() 은 핀 설정하는 부분입니다.

좀 전에 위에서 6번핀을 사용한다고 했었죠?

6번핀을 출력으로 사용한다고 설정하는 역할을 합니다.

어떻게 아냐구요?

예제의 Adafruit_NeoPixel.cpp 를 열어보면,

pixels.begin() 함수 내용이 있습니다. 참고하세요~!

 

void loop() 
{
//  pixels.clear(); // Set all pixel colors to 'off'
  for(int x=0; x<NUMPIXELS; x++)
  {
     pixels.setPixelColor(x, pixels.Color(0, 0, 0));
     pixels.show();
     delay(DELAYVAL);
  }  
  for(int i=0; i<NUMPIXELS; i++) 
  { // For each pixel...
    pixels.setPixelColor(i, pixels.Color(0, 150, 0)); ///bright green color
    pixels.show();   // Send the updated pixel colors to the hardware.
    delay(DELAYVAL); // Pause before next pass through loop
  }
}

자, 이 부분이 실질적으로 동작시키는 알고리즘입니다.

 

pixels.Color(?, ??, ???)색깔을 정하는 부분입니다.

 

이전 포스팅에서,

픽셀 한 개를 동작시키기 위해서는

24개의 0 code, 1 code 조합을 WS2812에 보내줘야 한다고 했습니다.

24개 중 처음 8개는 Green, 다음 8개는 Red, 그 다음 8개는 Blue 를 위해!

즉, 초록색, 빨간색, 파란색 순서로!

 

처음 pixels.Color(0, 0, 0) 은 초록색, 빨간색, 파란색을 다 0으로 해라.

즉, 픽셀을 꺼버려라! 라는 의미입니다.

 

참고로, 저는 이번에 픽셀의 색깔을

초록색으로 켰다가 껐다가 해 볼 예정입니다.

 

pixels.Color(0, 150, 0)은 뭘까요?

아니, 초록색을 켰다가 끌거라면서!

그럼 pixels.Color(150, 0, 0) 이어야 하는거 아닙니까!

초록색, 빨간색, 파란색 순서로 보내야 한다면서요!!!

 

이 예제의 경우 pixels.Color 함수는 

이상하게도 빨간색, 초록색, 파란색 순서로 출력하게 되어있습니다.

아마도 제가 가진 것과는 다른 RGB LED 용도인가 봅니다.

아무튼, pixels.Color(?, ??, ???) 에서 

? = 빨강

?? = 초록

??? = 파랑

임을 기억합시다!

 

그리고 150이란 숫자초록색 LED의 밝기 입니다.

이 값이 작을수록 약해지고, 커질수록 세집니다.

최대값은 255로, 각 색깔마다 8비트 씩이기 때문에

0000 0000 ~ 1111 1111 까지, 즉, 255가 최대입니다.

 

그래서, 초록색으로 동작시키기 위해, pixels.Color(0, 150, 0) 인 것입니다.

초록만 어떤 값이 있고, 빨간색과 파란색은 사용하지 않겠다 라는 뜻인거죠.

 

pixels.setPixelColor(i, pixels.Color(0, 150, 0);

어느 픽셀을 동작시킬 것인지 결정하는 부분입니다.

for문 안에 있기 때문에, i = 0, 1 이 됩니다.

(앞에서 NUMPIXELS = 2로 설정했기 때문)

즉, i=0 ===> 첫번째 픽셀

i=1 ===> 두번째 픽셀

을 의미합니다.

 

지금까지,

어느 픽셀 동작시킬지도 결정했고, 

어떤 색으로 동작시킬지도 결정했습니다.

 

그런데 pixels.show() 는 뭘까요?

이 함수를 쓰지 않으면 실제 LED는 동작하지 않습니다.

 

우리가 바닥에 돈이 떨어져 있는 것을 보고,

'저거 주워야지' 생각만 한다고해서 제 손에 돈이 들어오지 않죠?

생각 후에 '행동'을 해야 합니다.

 

'첫번째 픽셀에 초록색 출력해야지' 생각한 것이 지금까지 했던 것이고,

pixels.show()가 있어야 실제로 '출력'이 되는 것이죠!

 

 

2. 예제 프로그램 (example) 동작

 

자, 이제 확인해보죠.

동작시킬 순서는 다음과 같습니다.

첫번째 픽셀 off → 0.5s 딜레이 → 두번째 픽셀 off → 0.5s 딜레이

→ 첫번째 픽셀 초록색 on → 0.5초 딜레이 → 두번째 픽셀 초록색 on → 0.5초 딜레이

→ ... 반복

 

 

2개의 픽셀 초록색으로 동작시켜보기

위의 영상을 보시면, 원하는대로 동작하고 있죠?

초록색 빛이 켜졌다가 꺼졌다가 합니다.

당연히 25개 중 2개만 동작하도록 수정하였으니,

픽셀은 2개만 동작하고 있습니다.

동작할 때의 신호를

오실로스코프 파형으로 동시에 찍었으니 참고하세요.

 

 

3. WS2812 동작 관련 파형 분석

 

LED가 원하는 대로 동작하는 것 같긴한데,

아두이노에서 어떤 신호를 보내주고 있는 것일까?

지난 포스팅에서 0 code 와 1 code 파형을 확인해 봤습니다.

 

이번 테스트 동작의 파형도 한번 확인을 해보죠!

궁금하잖아요!

 

Oscilloscope Waveforms

Top Left : Pixel 1 off & Pixel 2 off

Top Right : Pixel 1 green & Pixel 2 off

Bottom Left : Pixel 1 green & Pixel 2 green

Bottom Right : Pixel 1 Off & Pixel 2 green

 

조금 더 자세히 살펴보겠습니다.

Pixel 1 Off, Pixel 1 On(Green)

4개 파형 중 하나를 확대해 봤습니다.

 

첫번째 픽셀은 꺼졌고, 두번째 픽셀은 초록색 빛을 발광할 때의 결과입니다.

첫번째 픽셀용 24의 code 는 모두 0 이네요.

즉, 초록색, 빨간색, 파란색 그 어느 색깔도 출력하지 않고 있는 상태죠.

 

두번째 픽셀용 24개의 code를 보면,

처음 8개의 코드(초록색용 8개의 코드)에 1 code가 섞여있고,

빨간색과 파란색용 코드는 모두 0 입니다.

 

즉, 두번째 픽셀용 24개 코드는 10010110 00000000 00000000 인 상태네요.

여기서, 10010110 은 십진수로 150 입니다.

초록색에만 1 code가 섞여있으니, 당연히 초록색 빛깔이 날 것이고,

아까 150을 함수에 입력했었죠?

그러니 150을 뜻하는 10010110 이란 코드가 생성된 것이죠.

 

만약에 파란색을 켜고 싶다면, 

00000000 00000000 xxxxxxxx

파란색을 의미하는 3번째의 8개 코드(xxxxxxxx) 안에 1 code가 섞여 있겠죠?

 

어떠신가요?

이렇게 파형으로 보니 좀 이해가 되셨나요?

부디 도움이 되셨길 바랍니다.

 

추가적으로, 시간이 있을 때

다른 색깔과 다른 밝기로 한번 테스트를 해보겠습니다.

 

이번 포스팅은 여기까지 하겠습니다.

감사합니다.

 

 

 

 

 

 

 

 

 

 

 

728x90
반응형