Thay đổi màu sắc dây led RGB WS2812B bằng vật thể màu sắc

Thay đổi màu sắc led RGB WS2812B bằng vật thể màu sắc

Thay đổi màu sắc dây led RGB WS2812B bằng vật thể màu sắc

Trong bài viết nay chúng ta sẽ thay đổi màu sắc của dây led RGB bằng cách nhận diện màu sắc của vật thể bằng cảm biến màu sắc TCS3200. Khi chúng ta đưa vật thể có màu sắc cho cảm biến màu sắc nhận diện thì dây led RGB sẽ sáng theo màu sắc của vật thể đó.

Chuẩn bị

Chức nắng các linh kiện được sử dụng

  • Board UnoX:

    • Đọc gía trị dữ liệu màu sắc từ cảm biến màu sắc.
    • Xuất tín hiệu điều khiển dây led sáng theo màu sắc đã đọc được.
  • Cảm biến màu sắc TCS3200:

    • Nhận biết màu sắc từ vật thể.
    • Gửi dữ liệu màu sắc nhận biết được về UnoX.
  • Dây led RGB WS2812B:

    • Nhận tín hiệu điều khiển từ UnoX.
    • Sáng theo màu sắc theo tín hiệu từ UnoX.
  • Dây cắm:

    • Giúp kết nối các linh kiện với nhau.

Kết nối cảm biến màu sắc TCS3200 và board UnoX

Bảng đấu nối và hình ảnh đấu nối cảm biến màu sắc TCS3200 và UnoX, sử dụng header đực-cái để đấu nối.

UnoXCảm biến TCS3200
4S0
5S1
6S2
7S3
8OUT
5VVCC
5VVCC
GNDGND
GNDGND

Kết nối dây led RGB WS2812B và board UnoX

Bảng đấu nối dây led RGB WS2812B và board UnoX, sử dụng header đực-đực để đấu nối.

UnoXLED RGB WS2812B
5V5V
GNDGND
9Din

Source code

Giới thiệu các thư viện sử dụng:

  • Thư viện Adafruit_NeoPixel.h (Link Download)

    • Thư viện Adafruit_NeoPixel.h được sử dụng để điều khiển dây led RGB WS2812B
    • Đầu tiên để sử dụng thư viện, phải khởi tạo thư viện dùng hàm pixels.begin() trong void setup().
    • Hàm pixels.setPixelColor(i, pixels.Color(255,255,255)) :

      • i: là biến đếm từ 0 đến i, dây led sẽ sáng từ led 1 tới led thứ i.
      • pixels.Color(255,255,255): led sẽ nhận các giá trị màu sắc Red, Green, Blue, giá trị sẽ từ 0, 0, 0 đến 255, 255, 255. Led sẽ hiển thị màu sắc theo các giá trị này.
    • Hàm pixels.show() sẽ gửi giá trị màu sắc được cập nhật qua dây led RGB.
  • Thư viện avr/power.h (Thư viện này có sẵn trong Arduino IDE)

    • Thư viện này cung cấp các macro giúp bật/tắt dây led dễ dàng, giúp tiết kiệm năng lượng.
// Các thư viện sử dụng
#include <Adafruit_NeoPixel.h>  
#ifdef __AVR__  
#include <avr/power.h>  
#endif  
   
 // Gán chân số 9 là chân xuất tín hiệu điều khiển dây led
#define PIN      9  
   
 // Số led muốn điều khiển
#define NUMLED 60
   
Adafruit_NeoPixel pixels = Adafruit_NeoPixel(NUMLED, PIN, NEO_GRB + NEO_KHZ800);  

/*Gán các chân S0, S1, S2, S3 của cảm biến màu sắc và chân số 8 là cân 
gửi tín dữ liệu màu sắc từ cảm biến đến UnoX*/
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
 
int frequency = 0;
int Red, Green, Blue;
 
void setup() {
  // Thiết lập các chân S0, S1, S2, S3 là chân OUTPUT và sensorOut là chân INPUT
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(sensorOut, INPUT);
 
  // Setting frequency-scaling to 20%
  digitalWrite(S0,HIGH);
  digitalWrite(S1,LOW);
 
  Serial.begin(9600);
  pixels.begin(); // Khởi tạo thư viện Adafruit_NeoPixel

  
}
 
void loop() {
  // Thiết lập để cảm biến đọc được màu đỏ
  digitalWrite(S2,LOW);
  digitalWrite(S3,LOW);
  // Đọc tần số màu sắc từ cảm biến
  frequency = pulseIn(sensorOut, LOW);
  // Đặt lại giá trị tần số đầu vào cho cảm biến để giá trị tần số từ 0 -> 255
  frequency = map(frequency, 25,72,255,0);
  if (frequency < 0) {
    frequency = 0;
  }
  if (frequency > 255) {
    frequency = 255;
  }
  Red= frequency;
  // Hiển thị giá trị tần số màu đỏ lên serial monitor
  Serial.print("R= ");
  Serial.print(frequency);// In ra tần số màu đỏ
  Serial.print("  ");
  delay(100);   // Delay 100ms
 
  // Thiết lập để cảm biến đọc được màu lục
  digitalWrite(S2,HIGH);
  digitalWrite(S3,HIGH);
  // Đọc tần số màu sắc từ cảm biến
  frequency = pulseIn(sensorOut, LOW);
  // Đặt lại giá trị tần số đầu vào cho cảm biến để giá trị tần số từ 0 -> 255
  frequency = map(frequency, 30,90,255,0);
  if (frequency < 0) {
    frequency = 0;
  }
  if (frequency > 255) {
    frequency = 255;
  }
  Green = frequency;
  // Hiển thị giá trị tần số màu đỏ lên serial monitor
  Serial.print("G= ");
  Serial.print(frequency);// In ra tần số màu lục
  Serial.print("  ");
  delay(100);
 
  // Thiết lập để cảm biến đọc được màu lục
  digitalWrite(S2,LOW);
  digitalWrite(S3,HIGH);
  // Đọc tần số màu sắc từ cảm biến
  frequency = pulseIn(sensorOut, LOW);
  // Đặt lại giá trị tần số đầu vào cho cảm biến để giá trị tần số từ 0 -> 255
  frequency = map(frequency, 25,70,255,0);
  if (frequency < 0) {
    frequency = 0;
  }
  if (frequency > 255) {
    frequency = 255;
  }
  Blue = frequency;
  // Hiển thị giá trị tần số màu đỏ lên serial monitor
  Serial.print("B= ");
  Serial.print(frequency);// In ra tần số màu xanh dương
  Serial.println("  ");
  
  for(int i=0;i<NUMLED;i++){

    // Xuất tín hiệu giá trị của 3 màu Red, Green, Blue đến dây led
    pixels.setPixelColor(i, pixels.Color(Red,Green,Blue)); 

    pixels.show(); // Hàm này sẽ gửi dữ liệu màu sắc được cập nhật tiếp theo đến dây led
  }
}

Kết quả

  • Sau khi hoàn thành ta sẽ được kết quả như clip.

Lưu ý: Nên sử dụng giấy màu để cảm biến có thể đọc được màu dễ hơn và led sẽ hiển thị màu sắc chuẩn hơn