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

Arduino를 사용하여 WS2812B 개별 주소 지정 가능 LED를 제어하는 ​​방법

<메인 클래스="사이트 메인" id="메인">

이 튜토리얼에서는 Arduino를 사용하여 개별적으로 주소 지정이 가능한 RGB LED 또는 WS2812B LED 스트립을 제어하는 ​​방법을 배웁니다. 자세한 내용은 다음 동영상을 보거나 아래에 작성된 튜토리얼을 참조하세요.

개요

먼저 몇 가지 기본 예제를 통해 작동 원리를 설명한 다음 이 LED를 사용하는 정말 멋진 Arduino 프로젝트인 DIY 대화형 LED 커피 테이블을 살펴보겠습니다. 커피 테이블에는 WS2812B LED, 물체 감지를 위한 적외선 근접 센서, 맞춤형 Android 앱을 통해 색상을 제어하기 위한 HC-05 Bluetooth 모듈이 있습니다. 이 프로젝트는 실제로 저와 Creativity Hero YouTube 채널의 Marija가 공동 작업한 것입니다.

WS2812B LED 작동 방식

먼저 LED 스트립을 자세히 살펴보겠습니다. 초소형 WS2812B LED 드라이버 IC가 집적된 5050 RGB LED로 구성되어 있습니다.

3개의 개별 Red, Green, Blue LED의 강도에 따라 원하는 색상을 시뮬레이션할 수 있습니다.

이 LED의 장점은 Arduino 보드의 단일 핀으로 전체 LED 스트립을 제어할 수 있다는 것입니다. 각 LED에는 각 끝에 3개의 커넥터가 있습니다. 2개는 전원 공급용이고 1개는 데이터용입니다. 화살표는 데이터 흐름 방향을 나타냅니다. 이전 LED의 데이터 출력 패드는 다음 LED의 데이터 입력 패드에 연결됩니다. 스트립을 원하는 크기로 절단할 수 있으며 일부 와이어를 사용하여 LED의 거리를 둘 수 있습니다.

전원 공급에 관해서는 5V에서 작동하고 각 빨강, 녹색 및 파랑 LED는 약 20mA를 소모하거나 최대 밝기에서 각 LED에 대해 총 60mA를 소모합니다. Arduino가 USB를 통해 전원이 공급될 때 5V 핀은 약 400mA만 처리할 수 있고 배럴 전원 커넥터를 사용하여 전원을 공급할 때 5V 핀은 약 900mA를 처리할 수 있습니다.

더 많은 LED를 사용하고 LED가 소모하는 전류량이 위에서 언급한 제한을 초과하는 경우 별도의 5V 전원 공급 장치를 사용해야 합니다. 이러한 경우 두 개의 접지선을 서로 연결해야 합니다. 또한 해당 라인의 노이즈를 줄이기 위해 Arduino와 LED 스트립 데이터 핀 사이에 약 330옴의 저항을 사용하고 전원 공급 장치를 매끄럽게 하기 위해 5V 및 접지에서 약 100uF의 커패시터를 사용하는 것이 좋습니다. .

Arduino 및 WS2812B LED의 예

예시 1

이제 예를 들어 위에서 설명한 대로 330옴 저항을 통해 Arduino에 연결되고 별도의 5V 전원 공급 장치로 전원이 공급되는 20개의 LED 긴 스트립을 사용하겠습니다. Arduino 프로그래밍을 위해 FastLED 라이브러리를 사용합니다. 이것은 WS2812B LED를 쉽게 제어할 수 있는 훌륭하고 잘 문서화된 라이브러리입니다.

아래 링크에서 이 예시에 필요한 구성요소를 얻을 수 있습니다.

다음은 첫 번째 예제의 Arduino 소스 코드입니다.

#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);
}Code language: Arduino (arduino)

설명:  따라서 먼저 FastLED 라이브러리를 포함하고, LED 스트립 데이터가 연결된 핀을 정의하고, LED 수를 정의하고, CRGB 유형의 어레이를 정의해야 합니다. 이 유형에는 3개의 빨강, 녹색 및 파랑 색상 채널 각각에 대해 3개의 1바이트 데이터 멤버가 있는 LED가 포함됩니다.

설정 섹션에서 위에서 정의한 매개변수로 FastLED를 초기화하기만 하면 됩니다. 이제 우리가 원하는 방식으로 LED를 제어할 수 있는 메인 루프입니다. CRGB 기능을 사용하면 Red, Green 및 Blue 색상의 세 가지 매개변수를 사용하여 모든 LED를 원하는 색상으로 설정할 수 있습니다. LED에서 변경 사항을 적용하려면 FastLED.show() 함수를 호출해야 합니다.

예시 2

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

다음은 두 번째 예제의 Arduino 소스 코드입니다.

#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);
  }
}Code language: Arduino (arduino)

여기에서 첫 번째 "for" 루프는 40밀리초 지연으로 첫 번째 LED에서 마지막 LED까지 20개의 모든 LED를 파란색으로 켭니다. 다음 "for" 루프는 20개의 모든 LED에 다시 불이 켜지지만 이번에는 마지막 LED에서 첫 번째 LED까지 빨간색으로 역순으로 켜집니다.

FastLED 라이브러리는 정말 흥미로운 애니메이션과 조명 쇼를 만드는 데 사용할 수 있는 다른 많은 기능을 갖추고 있으므로 다음 LED 프로젝트를 빛나게 만드는 것은 오직 당신의 상상에 달려 있습니다.

WS2812B LED를 사용한 대화형 LED 커피 테이블

이제 서두에서 언급한 DIY 인터랙티브 LED 커피 테이블 프로젝트를 살펴보겠습니다. 그래서 이것은 저와 Creativity Hero의 Marija와의 콜라보레이션 프로젝트였습니다.

그녀의 웹사이트 기사에서 그녀가 나무 구조물을 자르고 조립하는 것부터 모든 전자 부품을 함께 납땜하고 연결하는 것까지 테이블을 만드는 전체 과정을 설명하고 있습니다. 여기에서는 전자 부품이 어떻게 작동하는지, 맞춤형 Android 애플리케이션을 구축하고 Arduino 보드를 프로그래밍하는 방법을 설명합니다.

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

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

아래 링크에서 이 예시에 필요한 구성요소를 얻을 수 있습니다.

관련: Arduino에서 RGB LED를 사용하는 방법 | 튜토리얼

소스 코드

다음은 이 프로젝트의 Arduino 코드이며 Bluetooth 색상 제어 기능을 제외하면 코드가 실제로 매우 간단하다는 것을 알 수 있습니다.

#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);
  // Set the 45 proximity sensors pins as inputs, from digital pin 3 to pin 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);    // Set all 45 LEDs to green color 
    // If an object is detected on top of the particular sensor, turn on the particular led
    if ( digitalRead(pinNo + 3) == LOW ) {
      leds[pinNo] = CRGB( 0, 0, 255); // Set the reactive LED to bluee
    }
  }
  FastLED.show(); // Update the LEDs
  delay(20);
}Code language: Arduino (arduino)

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

단일 "for" 루프를 사용하는 메인 루프에서 모든 LED를 특정 색상으로 설정하고 근접 센서가 물체를 감지했는지 여부도 확인합니다. 이것이 사실이거나 이 경우 LOW 논리 상태이면 특정 반응 색상이 특정 LED로 설정됩니다. 마지막에 FastLED.show() 함수를 사용하여 LED 색상을 업데이트합니다.

Bluetooth 색상 제어 기능을 포함하려면 코드 줄을 더 추가하고 Android 앱을 만들어야 합니다. Arduino와 함께 HC-05 Bluetooth 모듈을 사용하는 방법과 MIT App Inventor 온라인 애플리케이션을 사용하여 나만의 Android 애플리케이션을 만드는 방법에 대한 별도의 자습서가 이미 있으므로 자세한 내용은 언제든지 확인할 수 있습니다.

Android 앱이 작동하는 방식은 다음과 같습니다. 색상을 선택할 수 있는 색상 팔레트 이미지, 선택한 색상을 반응 또는 배경 LED에 적용할지 여부를 선택할 수 있는 두 개의 확인 버튼 및 밝기를 조정하는 슬라이더로 구성됩니다.

앱의 블록을 살펴보면 색상 팔레트 이미지가 배치된 캔버스를 만졌을 때 어떤 일이 발생하는지 알 수 있습니다. .GetPixelColor 블록을 사용하여 선택한 색상에 대한 빨강, 녹색 및 파랑 값을 가져오고 Bluetooth SendText 블록을 사용하여 이 정보를 텍스트 형식으로 Arduino에 보냅니다.

선택한 체크박스에 따라 Arduino에서 텍스트를 수신할 때 도움이 되는 다른 첫 번째 문자 또는 마커를 보냅니다. 슬라이더의 위치를 ​​변경할 때도 마찬가지입니다. 10에서 100 사이의 값이 "3"이라는 마커가 앞에 있는 텍스트 형식으로 Arduino에 전송됩니다.

아래에서 Android 앱과 MIT App Inventor 프로젝트 파일을 다운로드할 수 있습니다.

DIY_Reactive_LED_Table_Control

파일 1개 0.00KB 다운로드

DIY_Reactive_LED_Table_Control MIT 앱 인벤터 프로젝트 파일

파일 1개 208.06KB 다운로드

Arduino 코드는 다음과 같습니다.

#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); // Arduino(RX, TX) - Bluetooth (TX, RX)

// Initial background color 
int backR = 100;
int backG = 50;
int backB = 10;

// Initial reactive color 
int reactiveR = 10;
int reactiveG = 50;
int reactiveB = 100;

int brightness = 50; // Initial brightness

String dataIn = "";

void setup() {
  FastLED.addLeds<WS2812, LED_PIN, COLOR_ORDER>(leds, NUM_LEDS);
  FastLED.setBrightness(brightness);
  Serial.begin(38400);
  Bluetooth.begin(38400); // Default baud rate of the Bluetooth module

  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);
}Code language: Arduino (arduino)

설명: 먼저 Arduino와 HC-05 Bluetooth 모듈 또는 모듈이 연결된 핀 간의 직렬 통신을 정의해야 합니다. 설정 섹션에서 이 모듈이 작동하는 전송 속도를 설정해야 합니다. 그런 다음 Bluetooth.available() 함수를 사용하는 메인 루프에서 스마트폰에서 들어오는 데이터가 있는지 확인합니다. 그것이 사실이라면 Bluetooth.readString() 함수를 사용하여 데이터를 문자열로 받습니다. 그런 다음 .startsWith() 함수를 사용하여 첫 번째 문자 또는 마커를 확인하고 반응 색상, 배경 또는 밝기를 변경할지 여부를 확인합니다.

.substring() 함수를 사용하여 수신된 텍스트에서 Red, Green 및 Blue 값을 추출하고 정수로 변환합니다. 그런 다음 이 값은 앞에서 설명한 대로 색상을 설정하고 LED를 켜는 "for" 루프에서 사용됩니다. 같은 방법으로 LED의 밝기를 조정합니다.

이것이 이 튜토리얼의 전부입니다. 아래 댓글 섹션에서 언제든지 질문하세요.


제조공정

  1. IR 리모콘 해킹 방법
  2. Arduino, 1Sheeld 및 Android를 사용한 범용 원격 제어
  3. Arduino 제어 센터
  4. IoT를 사용하여 로봇 팔 원격 제어
  5. Bluetooth가 탑재된 Arduino로 LED 제어!
  6. Firmata 및 Xbox One 컨트롤러를 사용하여 Arduino Rover 제어
  7. Arduino를 사용하여 지구의 질량을 측정하는 방법
  8. Arduino Quadruped
  9. 볼트와 Arduino를 사용하여 LED 밝기 제어
  10. Arduino 및 Processing IDE를 사용하여 나침반을 만드는 방법