Cảm Biến Màu Sắc TCS3200 với Arduino

Giới thiệu về cảm biến TCS3200

Cảm biến TCS3200 là một cảm biến màu phổ biến được sử dụng để phát hiện và đo màu sắc của ánh sáng hoặc bề mặt phản xạ. Nó hoạt động dựa trên công nghệ chuyển đổi ánh sáng thành tần số và cung cấp đầu ra số tương ứng với cường độ ánh sáng màu.

1. Cấu tạo

TCS3200 được tích hợp các thành phần chính sau:

  • Ma trận photodiode: Gồm các photodiode nhạy cảm với ba màu cơ bản (đỏ, xanh lá, xanh dương) và không lọc (clear). Có tổng cộng 64 photodiode:
    • 16 photodiode nhạy cảm với ánh sáng đỏ.
    • 16 photodiode nhạy cảm với ánh sáng xanh lá.
    • 16 photodiode nhạy cảm với ánh sáng xanh dương.
    • 16 photodiode không lọc (clear).
  • Bộ lọc màu: Có thể lựa chọn kích hoạt từng nhóm photodiode thông qua các tín hiệu điều khiển.
  • Bộ chuyển đổi ánh sáng-tần số (light-to-frequency converter): Chuyển đổi cường độ ánh sáng thành tín hiệu tần số số.
  • Tích hợp mạch điều khiển: Cung cấp đầu ra số dễ sử dụng với vi điều khiển.

2. Nguyên lý hoạt động

  • Cảm biến sử dụng các photodiode để thu nhận ánh sáng và chuyển đổi cường độ ánh sáng thành tín hiệu điện.
  • Bộ lọc màu chọn một trong ba màu cơ bản (đỏ, xanh lá, xanh dương) hoặc chế độ không lọc để đọc giá trị ánh sáng tương ứng.
  • Bộ chuyển đổi ánh sáng-tần số sẽ tạo tín hiệu số, trong đó tần số đầu ra tỷ lệ thuận với cường độ ánh sáng được cảm biến.

3. Chân kết nối

TCS3200 Pinout

GND Mass

OE Kích hoạt đầu ra (thường nối GND để kích hoạt).

S0&S1 Chọn tần số đầu ra (% scaling).

S2&S3 Chọn loại photodiode (bộ lọc màu: đỏ, xanh lá, xanh dương, hoặc clear).

OUT Tín hiệu đầu ra là sóng vuông mức TTL.

VCC Pin cung cấp nguồn cho mô-đun. Kết nối nó với nguồn điện 2,7V đến 5,5V.

4. Cách chọn chế độ tần số

Cảm biến có thêm hai chân điều khiển, S0 và S1, được sử dụng để điều chỉnh tần số đầu ra. Tần số có thể được điều chỉnh theo ba giá trị cài đặt trước khác nhau là 2%, 20% hoặc 100%. Chức năng điều chỉnh tần số này cho phép cảm biến được sử dụng với nhiều loại vi điều khiển và các thiết bị khác.

S0 và S1 dùng để chọn tỷ lệ giảm tần số đầu ra (frequency scaling):

S0 S1 Tỷ lệ tần số đầu ra
THẤP THẤP Tắt đầu ra
THẤP CAO 2%
CAO THẤP 20%
CAO CAO 100%

5. Cách chọn chế độ tần số

TCS230 phát hiện màu sắc với sự trợ giúp của một mảng 8 x 8 điốt quang, trong đó mười sáu điốt quang có bộ lọc màu đỏ, 16 điốt quang có bộ lọc màu xanh lá cây, 16 điốt quang có bộ lọc màu xanh lam và 16 điốt quang còn lại không có bộ lọc.

Nếu bạn nhìn kỹ vào cảm biến, bạn thực sự có thể nhìn thấy các bộ lọc này.

Mỗi 16 photodiode được kết nối song song, do đó, sử dụng hai chân điều khiển S2 và S3, bạn có thể chọn chân nào để đọc. Ví dụ, nếu bạn chỉ muốn phát hiện màu đỏ, bạn có thể chọn 16 photodiode lọc màu đỏ bằng cách đặt hai chân ở mức THẤP theo bảng.

Tương tự như vậy, bạn có thể chọn các loại điốt quang khác nhau bằng cách kết hợp S2 và S3 khác nhau.

S2 S3 Loại điốt quang
THẤP THẤP Màu đỏ
THẤP CAO Màu xanh da trời
CAO THẤP Xóa (Không có bộ lọc)
CAO CAO Màu xanh lá

6. Ứng dụng

  • Phân loại màu sắc sản phẩm trong dây chuyền sản xuất.
  • Phát hiện màu sắc trong các dự án Arduino.
  • Đo cường độ ánh sáng và độ sáng.
  • Sử dụng trong robot dò đường hoặc nhận diện màu sắc.

Phần cứng cần thiết:

Sơ đồ kết nối với Arduino:

Code:

#define S0 6
#define S1 5
#define S2 7
#define S3 8
#define Led_R 4
#define Led_G 3
#define Led_B 2
#define sensorOut 9
int frequency = 0, color = 0;
int R = 0, G = 0, B = 0;

void setup()
{
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(Led_R, OUTPUT);
  pinMode(Led_G, OUTPUT);
  pinMode(Led_B, OUTPUT);
  pinMode(sensorOut, INPUT);
  // Setting frequency-scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  Serial.begin(9600);
}
void loop()
{
  digitalWrite(S2, LOW);
  digitalWrite(S3, LOW);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  //Remaping the value of the frequency to the RGB Model of
  0 to 255
  frequency = map(frequency, 25, 72, 255, 0);
  // Printing the value on the serial monitor
  Serial.print("R= ");
  //printing name
  R = frequency;
  Serial.print(frequency); //printing RED color frequency
  Serial.print("  ");
  delay(100);
  // Setting Green filtered photodiodes to be read
  digitalWrite(S2, HIGH);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  //Remaping the value of the frequency to the RGB Model of
  0 to 255
  frequency = map(frequency, 30, 90, 255, 0);
  // Printing the value on the serial monitor
  G = frequency;
  Serial.print("G= ");
  //printing name
  Serial.print(frequency); //printing RED color frequency
  Serial.print("  ");
  delay(100);
  // Setting Blue filtered photodiodes to be read
  digitalWrite(S2, LOW);
  digitalWrite(S3, HIGH);
  // Reading the output frequency
  frequency = pulseIn(sensorOut, LOW);
  //Remaping the value of the frequency to the RGB Model of
  0 to 255
  frequency = map(frequency, 25, 70, 255, 0);
  // Printing the value on the serial monitor
  B = frequency;
  Serial.print("B= ");
  //printing name
  Serial.print(frequency); //printing RED color frequency
  Serial.println("  ");
  delay(100);
  if
  ((R > G) && (R > B) && (R > 280) && (R < 310))
  {
    Serial.println("This is Red color");
    digitalWrite(Led_R, HIGH);
  }
  else
  {
    digitalWrite(Led_R, LOW);
  }
  if
  ((G > R) && (G > B) && (G > 50))
  {
    Serial.println("This is Green color");
    digitalWrite(Led_G, HIGH);
  }
  else
  {
    digitalWrite(Led_G, LOW);
  }
  if
  ((B > R) && (B > G) && (B > 50 && (B < 270)))
  {
    Serial.println("This is Blue color");
    digitalWrite(Led_B, HIGH);
  }
  else
  {
    digitalWrite(Led_B, LOW);
  }
  delay(300);
}
cam bien mau sac tcs3200, tlc47 truong cong ly, trương công lý

Giải thích code

Định nghĩa các chân và biến số

#define S0 6
#define S1 5
#define S2 7
#define S3 8
#define Led_R 4
#define Led_G 3
#define Led_B 2
#define sensorOut 9

int frequency = 0, color = 0;
int R = 0, G = 0, B = 0;
  • S0, S1, S2, S3: Chân điều khiển tần số đầu ra của cảm biến màu.
  • Led_R, Led_G, Led_B: Chân kết nối với các đèn LED đỏ, xanh lá và xanh dương.
  • sensorOut: Chân đầu ra tín hiệu của cảm biến màu.
  • R, G, B: Lưu giá trị tần số đầu ra đã được chuyển đổi sang giá trị RGB.

Hàm setup()

void setup()
{
  pinMode(S0, OUTPUT);
  pinMode(S1, OUTPUT);
  pinMode(S2, OUTPUT);
  pinMode(S3, OUTPUT);
  pinMode(Led_R, OUTPUT);
  pinMode(Led_G, OUTPUT);
  pinMode(Led_B, OUTPUT);
  pinMode(sensorOut, INPUT);
  // Setting frequency-scaling to 20%
  digitalWrite(S0, HIGH);
  digitalWrite(S1, LOW);
  Serial.begin(9600);
}
  • Cấu hình các chân:
    • OUTPUT: Sử dụng để điều khiển cảm biến và LED.
    • INPUT: Nhận tín hiệu từ cảm biến.
  • Cài đặt tần số đầu ra của cảm biến:
    • S0 = HIGH, S1 = LOW → Tần số giảm xuống còn 20%.
  • Khởi tạo Serial Monitor: Để in kết quả ra màn hình.

Hàm loop()

Hàm này chạy liên tục, thực hiện các bước sau:

a. Đọc giá trị màu đỏ

digitalWrite(S2, LOW);
digitalWrite(S3, LOW);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 25, 72, 255, 0);
Serial.print("R= ");
R = frequency;
Serial.print(frequency);
Serial.print("  ");
delay(100);
  • S2, S3 = LOW: Kích hoạt diode lọc màu đỏ trong cảm biến.
  • pulseIn(sensorOut, LOW): Đọc tần số đầu ra từ cảm biến khi tín hiệu ở mức thấp.
  • map(): Chuyển đổi tần số thành giá trị trong khoảng 0-255 (chuẩn RGB).
  • Serial.print(): In giá trị màu đỏ lên Serial Monitor.

b. Đọc giá trị màu xanh lá

digitalWrite(S2, HIGH);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 30, 90, 255, 0);
G = frequency;
Serial.print("G= ");
Serial.print(frequency);
Serial.print("  ");
delay(100);
  • S2, S3 = HIGH: Kích hoạt diode lọc màu xanh lá.
  • Các bước còn lại tương tự như trên.

c. Đọc giá trị màu xanh dương

digitalWrite(S2, LOW);
digitalWrite(S3, HIGH);
frequency = pulseIn(sensorOut, LOW);
frequency = map(frequency, 25, 70, 255, 0);
B = frequency;
Serial.print("B= ");
Serial.print(frequency);
Serial.println("  ");
delay(100);
  • S2 = LOW, S3 = HIGH: Kích hoạt diode lọc màu xanh dương.
  • Các bước còn lại tương tự.

d. Xác định màu sắc và điều khiển LED

if ((R > G) && (R > B) && (R > 280) && (R < 310))
{
    Serial.println("This is Red color");
    digitalWrite(Led_R, HIGH);
}
else
{
    digitalWrite(Led_R, LOW);
}
  • Kiểm tra nếu giá trị R lớn hơn GB (vượt ngưỡng cụ thể), LED đỏ sẽ sáng.
  • Các điều kiện tương tự cho màu xanh lá và xanh dương:
    cpp
     
    if ((G > R) && (G > B) && (G > 50)) { ... }
    if ((B > R) && (B > G) && (B > 50 && (B < 270))) { ... }
  • Nếu không thỏa mãn, LED tương ứng sẽ tắt.

e. Delay giữa các lần đọc

delay(300);

Thời gian trễ để đảm bảo các lần đọc không bị trùng lặp.

Video:

 

Nhận xét

Mới hơn Cũ hơn