Zalo bán hàng : 0981 949 841
Email: sales@dientubachviet.com
Ứng dụng:Áp dụng để phân loại màu sắc, cảm ứng và hiệu chuẩn ánh sang mặt trời, kiểm tra dải đọc, kiểm tra màu sắc phù hợp.
Thông số kỹ thuật:
+ Điện áp cung cấp: (2.7V đến 5.5V)
+ Chuyển đổi từ cường độ ánh sáng sang tần số với độ 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.
+ Điện năng tiêu thụ thấp. Giao tiếp trực tiếp với vi điều khiển
Chức năng chân:
+ S0,S1 : Đầu vào chọn tỉ lệ tần số đầu ra .
+ S2,S3 : Đầu vào chọn kiểu photodiode.
+ OE : Đầu vào cho phép xuất tần số ở chân OUT.
+ OUT : Đầu ra là tần số thay đổi phụ thuộc cường độ và màu sắc.
+Linh kiện điện tử Module cảm biến màu TCS3200 với khả năng nhận biết 3 mầu cơ bản RGB và 4 đèn LED trắng. Các TCS3200 có thể phát hiện và đo lường gần như tất cả màu sắc có thể nhìn thấy. Ứng dụng bao gồm kiểm tra đọc dải, phân loại theo màu sắc, cảm biến ánh sáng xung quanh và hiệu chuẩn, và kết hợp màu sắc, đó chỉ là một vài ứng dụng. TCS3200 có các bộ tách sóng quang, có 2 bộ lọc màu sắc là bộ lọc màu đỏ, xanh dương, hoặc màu xanh lá, hoặc không có bộ lọc ( rõ ràng). Các bộ lọc của mỗi màu được phân bố đều khắp các mảng để loại bỏ sai lệch vị trí giữa các điểm màu. Bên trong là một bộ dao động tạo ra đầu ra sóng vuông có tần số là tỷ lệ thuận với cường độ của màu sắc lựa chọn.
Nguyên lý hoạt động cảm biến mầu của linh kiện điện tử TCS3200 :
+ Cấu tạo cảm biến TCS3200 gồm 2 khối như hình vẽ phía dưới:
+ Khối đầu tiên là mảng ma trận 8x8 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ủa linh kiện điện tử TCS3200 trong khoảng 2HZ~500KHZ. Tần số đầu ra có dạng xung vuông với tần số khác nhau khi mà màu sắc khác nhau và cường độ sáng là khác nhau.
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 của linh kiện điện tử TCS 3200:
Á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 .
+ sơ đồ đấu chân với Arduino:
Ứng dụng minh họa: Thiết bị cảm nhận màu sắc RGB, hiển thị thông số của RGB.
Chuẩn bị phần cứng
- Dây cắm.
Bạn có thể xem hình sau đây
Sau khi kết nối ta được như hình sau:
- Cắm dây USB 5V vào Arduino. Như vậy ta đã chuẩn bị xong phần cứng.
Phần lập trình , các bạn mở Arduino IDE lên và copy đoạn code dưới vào.
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
#include <TimerOne.h>
#include <LiquidCrystal.h>
LiquidCrystal lcd(8, 9, 4, 5, 6, 7); // configuration lcd
#define S0 13 // Please notice the Pin's define
#define S1 12
#define S2 11
#define S3 3
#define OUT 2
#define ledRed A1
#define ledBlu A2
#define ledGreen A3
int g_count = 0; // count the frequecy
int g_array[3]; // store the RGB value
int g_flag = 0; // filter of RGB queue
float g_SF[3]; // save the RGB Scale factor
// Init TSC230 and setting Frequency.
void TSC_Init()
{
pinMode(S0, OUTPUT); // set ouput, input
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
pinMode(OUT, INPUT);
pinMode(ledRed, OUTPUT);
pinMode(ledBlu, OUTPUT);
pinMode(ledGreen, OUTPUT);
digitalWrite(S0, LOW);// OUTPUT FREQUENCY SCALING 2%
digitalWrite(S1, HIGH);
}
// Select the filter color
void TSC_FilterColor(int Level01, int Level02)
{
if(Level01 != 0)
Level01 = HIGH;
if(Level02 != 0)
Level02 = HIGH;
digitalWrite(S2, Level01);
digitalWrite(S3, Level02);
}
void TSC_Count()
{
g_count ++ ;
}
void TSC_Callback()
{
switch(g_flag)
{
case 0:
Serial.println("->WB Start");
TSC_WB(LOW, LOW); //Filter without Red
break;
case 1:
Serial.print("->Frequency R=");
Serial.println(g_count);
g_array[0] = g_count;
TSC_WB(HIGH, HIGH); //Filter without Green
break;
case 2:
Serial.print("->Frequency G=");
Serial.println(g_count);
g_array[1] = g_count;
TSC_WB(LOW, HIGH); //Filter without Blue
break;
case 3:
Serial.print("->Frequency B=");
Serial.println(g_count);
Serial.println("->WB End");
g_array[2] = g_count;
TSC_WB(HIGH, LOW); //Clear(no filter)
break;
default:
g_count = 0;
break;
}
}
void TSC_WB(int Level0, int Level1) //White Balance
{
g_count = 0;
g_flag ++;
TSC_FilterColor(Level0, Level1);
Timer1.setPeriod(1000000);
}
void setup()
{
lcd.begin(16,2); // lcd 16x2
TSC_Init();
Serial.begin(9600);
Timer1.initialize(); // defaulte is 1s
Timer1.attachInterrupt(TSC_Callback);
attachInterrupt(0, TSC_Count, RISING);
delay(4000);
for(int i=0; i<3; i++)
Serial.println(g_array[i]);
g_SF[0] = 255.0/ g_array[0]; //R Scale factor
g_SF[1] = 255.0/ g_array[1] ; //G Scale factor
g_SF[2] = 255.0/ g_array[2] ; //B Scale factor
Serial.println(g_SF[0]);
Serial.println(g_SF[1]);
Serial.println(g_SF[2]);
}
void loop()
{
g_flag = 0;
for(int i=0; i<3; i++)
Serial.println(int(g_array[i] * g_SF[i]));
// display result on LCD
lcd.setCursor(0,0);
lcd.print("RED");
lcd.setCursor(5,0);
lcd.print("GREEN");
lcd.setCursor(12,0);
lcd.print("BLU");
lcd.setCursor(0,1);
lcd.print(g_array[0]);
lcd.setCursor(5,1);
lcd.print(g_array[1]);
lcd.setCursor(12,1);
lcd.print(g_array[2]);
// led light
if(g_array[0]> 300 && g_array[0]< 1700 && g_array[0] > g_array[1] && g_array[0] > g_array[2]){
digitalWrite(ledRed, HIGH);
digitalWrite(ledBlu, LOW);
digitalWrite(ledGreen, LOW);
}
if(g_array[1]> 300 && g_array[1]< 1700 && g_array[1] > g_array[0] && g_array[1] > g_array[2]){
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, HIGH);
digitalWrite(ledBlu, LOW);
}
if(g_array[2]> 300 && g_array[2]< 1700 && g_array[2] > g_array[1] && g_array[2] > g_array[0]){
digitalWrite(ledRed, LOW);
digitalWrite(ledGreen, LOW);
digitalWrite(ledBlu, HIGH);
}
delay(4000);
// reset led
digitalWrite(ledRed, LOW);
digitalWrite(ledBlu, LOW);
digitalWrite(ledGreen, LOW);
lcd.setCursor(0,0);
lcd.print(" ");
lcd.setCursor(0,1);
lcd.print(" ");
}