Cảm biến màu sắc TCS3200 với Arduino – Phân biệt màu sắc

Cảm biến màu sắc TCS3200

Cảm biến màu sắc TCS3200Cảm biến màu TCS3200 tích hợp 1 dãy bộ dò ánh sáng quang bên trong, với mỗi cảm biến ứng với các màu đỏ, xanh lá, xanh dương. Các bộ lọc của mỗi màu được phân bố đều khắp cảm biến để loại bỏ sai lệch vị trí giữa các màu sắc. Bên trong cảm biến có bộ dao động tạo ra sóng vuông có tần số là tỷ lệ thuận với cường độ của màu sắc được lựa chọn.

Sơ đồ chân IC cảm biến màu sắc TCS3200.

Tên chânI/OMô tả
S0, S1 (1, 2)Idùng để chọn tỉ lệ tần số đầu ra
OE (3)Icho phép xuất tần số ở chân OUT
GND (4) mass
VDD (5) nguồn 2,7-5,5V
OUT (6)Ođưa ra tín hiệu tần số
S2, S3 (7, 8)Idùng để chọn kiểu photodiode

Tính năng

  • Chuyển đổi cường độ ánh sáng thành tần số có độ phân giải cao.
  • Lập trình lựa chọn bộ lọc màu sắc khác nhau và dạng tần số xuất ra.
  • Dễ dàng giao tiếp với vi điều khiển.
  • Điện áp đầu vào 2.7-5.5V.

Cấu tạo cảm biến màu

+Khối đầu tiên là mảng ma trận 8×8 gồm các photodiode.Bao gồm 16 photodiode có thể lọc màu sắc xanh dương (Blue),16 photodiode có thể lọc màu đỏ (Red),16 photodiode có thể lọc màu xanh lá(Green) và 16 photodiode trắng không lọc (Clear).Tất cả photodiode cùng màu được kết nối song song với nhau ,và được đặt xen kẽ nhau nhằm mục đích chống nhiễu.

Bản chất của 4 loại photodiode trên như là các bộ lọc ánh sáng có mầu sắc khác nhau .Có nghĩa nó chỉ tiếp nhận các ánh sáng có cùng màu với loại photodiode tương ứng và không tiếp nhận các ánh sáng có màu sắc khác.

Việc lựa chọn 4 loại photodiode này thông qua 2 chân đầu vào S2,S3 :

+Khối thứ 2 là bộ chuyển đổi dòng điện từ đầu ra khối thứ nhất thành tần số.

Tần số đầu ra có độ rộng xung 50% và tỉ lệ với ánh sáng có cường độ và mầu sắc khác nhau.

Tần số đầu ra nằm trong khoảng 2Hz-500Khz .

Ta có thể lựa chọn tỉ lệ tần số đầu ra ở các mức khác nhau như bảng trên cho phù hợp với phần cứng đo tần số .

Ví dụ : Tần số khi S0=H,S1=H -Fout=500Khz thì:

  • S0=H,S1=L -Fout=100Khz
  • S0=L,S1=H -Fout=10Khz
  • S0=L,S1=L -Fout=0

Nguyên lí hoạt động

Ánh sáng trắng là hỗn hợp rất nhiều ánh sáng có bước sóng màu sắc khác nhau.

Khi ta chiếu ánh sáng trắng vào một vật thể bất kì .Tại bề mặt vật thể sẽ xảy ra hiện tượng hấp thụ và phản xạ ánh sáng .

Ví dụ : Một vật thể có màu sắc đỏ khi được chiếu ánh sáng trắng thì những ánh sáng không nằm trong dải bước sóng màu đỏ sẽ bị vật thể hấp thụ .Còn ánh sáng có bước sóng nằm trong dải màu đỏ sẽ bị phản xạ ngược trở lại .Và khiến mắt ta nhận biết vật thể đó là màu đỏ.

Dựa trên nguyên lý sự phản xạ , hấp thụ ánh sáng trắng của vật thể và sự phối chộn màu sắc bởi 3 màu cơ bản Blue,Green,Red thì TCS3200 có cấu tạo là 4 bộ lọc photodiode Blue,Green,Red và clear để nhận biết màu sắc vật thể.

Mạch sơ đồ nguyên lí module cảm biến màu sắc

Cách cấu hình các chân module để sử dụng

Module cảm biến màu sắc TCS3200 dùng để phát hiện màu sắc với sự hỗ trợ của vi điều khiển. Nhưng trên thực tế, vi điều khiển đang đo tần số đầu ra trên chân số 6.

Để xác định được màu sắc của đối tượng, chúng ta cần đo tần số đầu ra chân số 6 khi mỗi bộ lọc được kích hoạt.

  • Đặt cả hai S2, S3 thành LOW, đo tần số. Bây giờ, chúng ta có được cường độ thành phần RED trong đối tượng.
  • Đặt S2 thành LOW và S3 thành HIGH để có được cường độ của thành phần BLUE trong đối tượng.
  • Đặt cả S2 và S3 thành HIGH và nhận được cường độ của thành phần GREEN trong đối tượng.
  • So sánh tần số 3 thành phần này để xác định màu sắc thực tế của đối tượng.

Trong Arduino. chúng ta có thể sử dụng hàm “pulseIn” để xác định biến thiên tần số.

Ví dụ:

digitalWrite(S2, LOW);
digitalWrite(S3, LOW);   //Activating photodiode with red filter
red = pulseIn(outpin, LOW);

Ở đây, ta nhận được giá trị tần số tương ứng với thành phần RED của đối tượng.

Tương tự, chúng ta thay đổi S2, S3 để lấy giá trị tần số tương ứng với thành phần GREEN, BLUE trong đối tượng.

Đối với một đối tượng màu RED, chúng ta nhận được giá trị xấp xỉ của red = 16, green = 53 và blue = 45

Cách lập trình

  • Đầu tiên, kết nối các chân với module với vi điều khiển
  • Đặt S0, S1 HIGH hoặc LOW để chọn tỉ lệ tần số đầu ra.
  • Trong vòng lặp, chúng ta kích hoạt từng bộ lọc màu sắc bằng cách đặt S2, S3 HIGH hoặc LOW để đo tần sô trên chân 6 để có cường độ màu tương ứng. So sánh tần số của mỗi màu để xác định màu sắc của đối tượng.

Module cảm biến màu sắc TCS3200 với Arduino

Đối với Arduino, chọn tỉ lệ tần số đầu ra là 20%.

Mạch Schematic

Sơ đồ nối chân với Arduino

TCS3200 Arduino
VCC5V
GNDGND
S0D4
S1D5
S2D7
S3D6
OUTD8

CODE

Chúng ta cần viết 2 chương trình

  1. Đọc và hiểu thị giá trị tần số ra màn hình serial monitor: Chúng ta cần ghi lại giá trị tần số khi đặt các màu sắc khác nhau trước cảm biến.
  2. Phân biệt màu sắc: Trong phần này, chúng ta cần chèn các giá trị tần số ghi lại vào chương trình để cảm biến có thể phân biệt màu khác nhau. Chúng ta sẽ phát hiện màu đỏ, xanh lục, xanh dương.

Đọc giá trị tần số

// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;

void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);

// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);

// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);

// Begins serial communication 
Serial.begin(9600);
}
void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);

// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);

// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);

// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);

// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);

// Printing the GREEN (G) value 
Serial.print(" G = ");
Serial.print(greenFrequency);
delay(100);

// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);

// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);

// Printing the BLUE (B) value 
Serial.print(" B = ");
Serial.println(blueFrequency);
delay(100);
}

Upload code xuống Arduino, mở màn hình serial monitor với baud rate ở 9600. Các bạn cần thực hiện hai phép đó: cảm biến ở xa đối tượng và cảm biến ở gần đối tượng. Ghi chép lại.

Phân biệt màu sắc

Trong chương trình này chúng ta sẽ dùng hàm map() để chuyển đổi giá trị tần số thành giá trị RGB (0-255). Trong hàm map() các bạn cần thay đổi giá trị XX thành giá trị thích hợp.

// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8

// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;

// Stores the red. green and blue colors
int redColor = 0;
int greenColor = 0;
int blueColor = 0;

void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);

// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);

// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);

// Begins serial communication
Serial.begin(9600);
}

void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);

// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the RED (R) frequency from 0 to 255
// You must replace with your own values. Here's an example: 
// redColor = map(redFrequency, 70, 120, 255,0);
redColor = map(redFrequency, XX, XX, 255,0);

// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redColor);
delay(100);

// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);

// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the GREEN (G) frequency from 0 to 255
// You must replace with your own values. Here's an example: 
// greenColor = map(greenFrequency, 100, 199, 255, 0);
greenColor = map(greenFrequency, XX, XX, 255, 0);

// Printing the GREEN (G) value 
Serial.print(" G = ");
Serial.print(greenColor);
delay(100);

// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);

// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the BLUE (B) frequency from 0 to 255
// You must replace with your own values. Here's an example: 
// blueColor = map(blueFrequency, 38, 84, 255, 0);
blueColor = map(blueFrequency, XX, XX, 255, 0);

// Printing the BLUE (B) value 
Serial.print(" B = ");
Serial.print(blueColor);
delay(100);

// Checks the current detected color and prints
// a message in the serial monitor
if(redColor > greenColor && redColor > blueColor){
Serial.println(" - RED detected!");
}
if(greenColor > redColor && greenColor > blueColor){
Serial.println(" - GREEN detected!");
}
if(blueColor > redColor && blueColor > greenColor){
Serial.println(" - BLUE detected!");
}
}

Để phân biệt giữa các màu khác nhau, có ba điều kiện:

  • Khi R là giá trị lớn nhất (trong các tham số RGB), có một đối tượng màu đỏ
  • Khi G là giá trị tối đa, có một đối tượng màu xanh lá cây
  • Khi B là giá trị tối đa, có một vật thể màu xanh

Download file

Soucre code
Datasheet

Bài viết các bạn có thể tham khảo:

Viết một bình luận

This site uses Akismet to reduce spam. Learn how your comment data is processed.