산업 제조
산업용 사물 인터넷 | 산업자재 | 장비 유지 보수 및 수리 | 산업 프로그래밍 |
home  MfgRobots >> 산업 제조 >  >> Manufacturing Technology >> 제조공정

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

이 튜토리얼에서는 개별 주소 지정이 가능한 RGB LED 또는 WS2812B LED 스트립을 아두이노로 제어하는 방법을 배웁니다. 더 자세한 내용은 아래 비디오를 시청하거나 작성된 튜토리얼을 읽어보세요.

개요

먼저 몇 가지 기본 예제를 통해 작동 원리를 설명한 뒤, 이 LED들을 활용한 정말 멋진 아두이노 프로젝트인 DIY 인터랙티브 LED 커피 테이블을 살펴보겠습니다. 이 커피 테이블은 WS2812B LED, 물체 감지용 적외선 근접 센서, 커스텀 제작 안드로이드 앱으로 색상을 제어하는 HC-05 블루투스 모듈을 탑재합니다. 이 프로젝트는 저와 Creativity Hero 유튜브 채널의 마리야와의 협업입니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

WS2812B LED 작동 원리

LED 스트립을 자세히 살펴봅시다. 5050 타입 RGB LED에 매우 컴팩트한 WS2812B LED 드라이버 IC가 내장되어 있습니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

빨강, 초록, 파랑 세 개별 LED의 강도에 따라 원하는 어떤 색상도 구현할 수 있습니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

이 LED들의 장점은 아두이노 보드의 단일 핀만으로 전체 LED 스트립을 제어할 수 있다는 점입니다. 각 LED 양끝에 세 개의 커넥터가 있습니다. 두 개는 전원용, 하나는 데이터용입니다. 화살표는 데이터 흐름 방향을 나타냅니다. 이전 LED의 데이터 출력 패드가 다음 LED의 데이터 입력 패드에 연결됩니다. 원하는 크기로 스트립을 자를 수 있고, 와이어를 사용해 LED 간 거리를 둘 수도 있습니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

전원은 5V로 작동하며, 빨강, 초록, 파랑 각 LED는 약 20mA를 소모하므로 최대 밝기에서 LED 하나당 총 60mA가 듭니다. 아두이노가 USB로 전원 공급될 때 5V 핀은 약 400mA까지, 배럴 전원 커넥터로 전원 공급될 때는 약 900mA까지 처리할 수 있습니다.

더 많은 LED를 사용해 전류 소모가 위 한계를 넘으면 별도의 5V 전원 공급 장치를 사용해야 합니다. 이 경우 두 그라운드 라인도 서로 연결해야 합니다. 또한 아두이노와 LED 스트립 데이터 핀 사이에 약 330옴 저항을 연결해 노이즈를 줄이고, 5V와 그라운드 사이에 약 100uF 커패시터를 연결해 전원 공급을 평활화하는 것이 좋습니다.

아두이노와 WS2812B LED 예제

예제 1

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

예제로 20개 LED 길이의 스트립을 사용하며, 앞서 설명한 대로 330옴 저항을 통해 아두이노에 연결하고 별도 5V 전원으로 전원 공급합니다. 프로그래밍에는 FastLED 라이브러리를 사용합니다. 이 라이브러리는 훌륭하고 문서화가 잘 되어 있어 WS2812B LED를 쉽게 제어할 수 있습니다.

이 예제에 필요한 구성품은 아래 링크에서 구할 수 있습니다:

  • WS2812B LED 스트립
  • 아두이노 보드
  • 5V 6A DC 전원 공급 장치

첫 번째 예제의 아두이노 소스 코드:

#include <FastLED.h> 
#define LED_PIN 7 
#define NUM_LEDS 20 
CRGB leds[NUM_LEDS]; 
void setup() { 
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS); 
} 
void loop() { 
  leds[0] = CRGB(255, 0, 0); FastLED.show(); delay(500); 
  leds[1] = CRGB(0, 255, 0); FastLED.show(); delay(500); 
  leds[2] = CRGB(0, 0, 255); FastLED.show(); delay(500); 
  leds[5] = CRGB(150, 0, 255); FastLED.show(); delay(500); 
  leds[9] = CRGB(255, 200, 20); FastLED.show(); delay(500); 
  leds[14] = CRGB(85, 60, 180); FastLED.show(); delay(500); 
  leds[19] = CRGB(50, 255, 20); FastLED.show(); delay(500); 
}

설명: FastLED 라이브러리를 포함하고, LED 스트립 데이터가 연결된 핀, LED 개수, CRGB 타입 배열을 정의합니다. 이 타입은 빨강, 초록, 파랑 세 색상 채널용 1바이트 데이터 멤버 세 개를 포함합니다.

setup 섹션에서는 앞서 정의한 매개변수로 FastLED를 초기화합니다. 메인 loop에서는 LED를 원하는 대로 제어할 수 있습니다. CRGB 함수로 세 매개변수(빨강, 초록, 파랑)를 사용해 어떤 LED든 어떤 색상으로든 설정할 수 있습니다. 변경 사항을 LED에 반영하려면 FastLED.show() 함수를 호출해야 합니다.

예제 2

"for" 루프를 사용해 쉽게 애니메이션을 만들 수 있습니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

두 번째 예제의 아두이노 소스 코드:

#include <FastLED.h> 
#define LED_PIN 7 
#define NUM_LEDS 20 
CRGB leds[NUM_LEDS]; 
void setup() { 
  FastLED.addLeds<WS2812, LED_PIN, GRB>(leds, NUM_LEDS); 
} 
void loop() { 
  for (int i = 0; i <= 19; i++) { 
    leds[i] = CRGB ( 0, 0, 255); 
    FastLED.show(); 
    delay(40); 
  } 
  for (int i = 19; i >= 0; i--) { 
    leds[i] = CRGB ( 255, 0, 0); 
    FastLED.show(); 
    delay(40); 
  } 
}

첫 번째 "for" 루프는 20개 모든 LED를 첫 번째부터 마지막까지 파란색으로 40밀리초 간격으로 켭니다. 두 번째 "for" 루프는 마지막부터 첫 번째까지 역순으로 빨간색으로 켭니다.

FastLED 라이브러리에는 정말 흥미로운 애니메이션과 라이트 쇼를 만드는 데 사용할 수 있는 다른 많은 기능들이 있으니, 상상력을 발휘해 다음 LED 프로젝트를 빛나게 만드세요.

WS2812B LED를 사용한 인터랙티브 LED 커피 테이블

처음에 언급한 DIY 인터랙티브 LED 커피 테이블 프로젝트를 살펴보겠습니다. 이 프로젝트는 저와 Creativity Hero의 마리야와의 협업입니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

그녀의 웹사이트 기사에서 나무 구조 자르기/조립부터 전자 부품 납땜/연결까지 테이블 제작 전 과정을 확인할 수 있습니다. 여기서는 전자 부품 작동 원리, 커스텀 안드로이드 애플리케이션 제작, 아두이노 프로그래밍 방법을 설명하겠습니다.

이 프로젝트의 전체 회로도입니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

테이블은 45개의 주소 지정 가능 LED, 45개의 적외선 근접 센서, HC-05 블루투스 모듈로 구성되며 모두 아두이노 메가 보드에 연결됩니다. 회로는 5V 6A 전원 공급 장치로 전원 공급됩니다.

이 예제에 필요한 구성품은 아래 링크에서 구할 수 있습니다:

  • WS2812B LED 스트립
  • IR 근접 센서
  • HC-05 블루투스 모듈
  • 아두이노 보드
  • 5V 6A DC 전원 공급 장치

관련: 아두이노로 RGB LED 사용하기 | 튜토리얼

소스 코드

이 프로젝트의 아두이노 코드입니다. 블루투스 색상 제어 기능을 제외하면 코드가 실제로 매우 간단합니다.

#include "FastLED.h" 
#define NUM_LEDS 45 
#define LED_PIN 2 
#define COLOR_ORDER GRB 
CRGB leds[NUM_LEDS]; 
void setup() { 
  FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS); 
  FastLED.setBrightness(brightness); 
  // 45개 근접 센서 핀을 입력으로 설정, 디지털 핀 3부터 48까지 
  for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) { 
    pinMode(pinNo, INPUT); 
  } 
} 
void loop() { 
  for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) { 
    leds[pinNo] = CRGB( 0, 255, 0); // 모든 45개 LED를 녹색으로 설정 
    // 특정 센서 위에 물체가 감지되면 해당 LED 켜기 
    if ( digitalRead(pinNo + 3) == LOW ) { 
      leds[pinNo] = CRGB( 0, 0, 255); // 반응형 LED를 파란색으로 
    } 
  } 
  FastLED.show(); // LED 업데이트 
  delay(20); 
}

설명: 앞서 설명한 대로 기본 매개변수를 정의하고 45개 근접 센서 핀을 입력으로 설정합니다.

메인 loop에서 단일 "for" 루프로 모든 LED를 특정 색상으로 설정하고, 근접 센서가 물체를 감지했는지 확인합니다. 감지되면(이 경우 LOW 로직 상태), 해당 반응형 색상을 해당 LED에 설정합니다. 마지막에 FastLED.show() 함수로 LED 색상을 업데이트합니다.

블루투스 색상 제어 기능을 포함하려면 코드를 더 추가하고 안드로이드 앱을 만들어야 합니다. HC-05 블루투스 모듈 아두이노 사용법과 MIT 앱 인벤터로 안드로이드 앱 만드는 법은 별도 튜토리얼에서 다루었으니 참고하세요.

안드로이드 앱 작동 방식입니다. 색상 팔레트 이미지에서 색상을 고를 수 있고, 두 개의 체크 버튼으로 선택한 색상을 반응형 LED나 배경 LED 중 어디에 적용할지 선택하며, 슬라이더로 밝기를 조절합니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

앱 블록을 보면 색상 팔레트 이미지가 놓인 캔버스를 터치했을 때 .GetPixelColor 블록으로 선택한 색상의 빨강, 초록, 파랑 값을 얻고 블루투스 SendText 블록으로 텍스트 형태로 아두이노에 전송합니다.

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

선택된 체크박스에 따라 다른 첫 문자(마커)를 보내 아두이노에서 수신 시 구분할 수 있게 합니다. 슬라이더 위치 변경 시에도 10~100 값이 "3" 마커와 함께 텍스트 형태로 전송됩니다.

아래에서 안드로이드 앱과 MIT 앱 인벤터 프로젝트 파일을 다운로드할 수 있습니다:

아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

DIY_Reactive_LED_Table_Control

1 file(s) 0.00 KB Download 아두이노로 WS2812B LED 마스터하기 - 단계별 완벽 가이드

DIY_Reactive_LED_Table_Control MIT App Inventor Project File

1 file(s) 208.06 KB Download

블루투스 기능이 포함된 아두이노 코드:

#include <SoftwareSerial.h> 
#include "FastLED.h" 
#define NUM_LEDS 45 
#define LED_PIN 2 
#define COLOR_ORDER GRB 
CRGB leds[NUM_LEDS]; 
SoftwareSerial Bluetooth(53, 52); // 아두이노(RX, TX) - 블루투스 (TX, RX) 
// 초기 배경 색상 
int backR = 100; 
int backG = 50; 
int backB = 10; 
// 초기 반응형 색상 
int reactiveR = 10; 
int reactiveG = 50; 
int reactiveB = 100; 
int brightness = 50; // 초기 밝기 
String dataIn = ""; 
void setup() { 
  FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS); 
  FastLED.setBrightness(brightness); 
  Serial.begin(38400); 
  Bluetooth.begin(38400); // 블루투스 모듈 기본 보드레이트 
  for (int pinNo = 0 + 3; pinNo <= 45 + 3; pinNo++) { 
    pinMode(pinNo, INPUT); 
  } 
} 
void loop() { 
  if (Bluetooth.available() > 0) { 
    dataIn = Bluetooth.readString(); 
    delay(20); 
    if (dataIn.startsWith("1")) { 
      delay(10); 
      String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G")); 
      reactiveR = stringR.toInt(); 
      String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B")); 
      reactiveG = stringG.toInt(); 
      String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E")); 
      reactiveB = stringB.toInt(); 
    } 
    else if (dataIn.startsWith("2")) { 
      String stringR = dataIn.substring(dataIn.indexOf("R") + 1, dataIn.indexOf("G")); 
      backR = stringR.toInt(); 
      String stringG = dataIn.substring(dataIn.indexOf("G") + 1, dataIn.indexOf("B")); 
      backG = stringG.toInt(); 
      String stringB = dataIn.substring(dataIn.indexOf("B") + 1, dataIn.indexOf("E")); 
      backB = stringB.toInt(); 
    } 
    else if (dataIn.startsWith("3")) { 
      String stringBrightness = dataIn.substring(dataIn.indexOf("3") + 1, dataIn.length()); 
      brightness = stringBrightness.toInt(); 
      FastLED.setBrightness(brightness); 
    } 
  } 
  for (int pinNo = 0; pinNo <= NUM_LEDS-1; pinNo++) { 
    leds[pinNo] = CRGB( backR, backG, backB); 
    if ( digitalRead(pinNo + 3) == LOW ) { 
      leds[pinNo] = CRGB( reactiveR, reactiveG, reactiveB); 
    } 
  } 
  FastLED.show(); 
  delay(20); 
}

설명: 아두이노와 HC-05 블루투스 모듈 간 시리얼 통신을 정의합니다(모듈이 연결된 핀). setup에서 이 모듈이 작동하는 보드레이트를 설정합니다. 메인 loop에서 Bluetooth.available() 함수로 스마트폰에서 수신 데이터가 있는지 확인합니다. 데이터가 있으면 Bluetooth.readString() 함수로 문자열로 수신합니다. .startsWith() 함수로 첫 문자(마커)를 확인해 반응형 색상, 배경 색상, 밝기 중 무엇을 변경할지 판단합니다.

.substring() 함수로 수신된 텍스트에서 빨강, 초록, 파랑 값을 추출해 정수로 변환합니다. 이 값들은 아래 "for" 루프에서 앞서 설명한 대로 색상을 설정하고 LED를 켜는 데 사용됩니다. 같은 방식으로 LED 밝기도 조절합니다.

이상으로 튜토리얼을 마칩니다. 아래 댓글 섹션에서 자유롭게 질문해 주세요.

제조공정

  1. 아두이노로 범용 IR 리모컨 만들기: 단계별 가이드
  2. 아두이노, 1Sheeld, IR 제어로 만능 안드로이드 리모컨 만들기
  3. 아두이노 파워 컨트롤 센터: N-FET, P-FET, 릴레이 & RTC 키트
  4. 원격 IoT 제어 커스텀 로봇 팔: 아두이노 MKR1000과 심링크(Simulink) 활용
  5. 아두이노 블루투스로 LED 제어하기 - HC-05 & MIT App Inventor 입문 가이드
  6. 펌마타(Firmata)와 엑스박스 원 게임패드로 아두이노 로버 원활하게 제어하기
  7. 아두이노로 지구 질량 측정하기: 단계별 DIY 가이드
  8. 스마트 아두이노 4족 보행 로봇 제작: 단계별 완벽 가이드
  9. 볼트 IoT와 아두이노 우노로 구현하는 무선 LED 밝기 제어 (PWM 6채널)
  10. 아두이노와 프로세싱으로 실시간 디지털 나침반 만들기