1. Giới thiệu
Người ta thường dùng các loại cảm biến màu sắc để phân loại các đối tượng dựa vào màu sắc, kiểm tra các màu sắc phù hợp. Trong bài viết này mình sẽ hướng dẫn các bạn sử dụng cảm biến màu TSC3200.
Hình 1: Module TSC3200
Cảm biến màu sắc được cấu tạo gồm một con photodiode dùng để lọc màu sắc, xung quanh con cảm biến này là 4 bóng đèn led dùng để chiếu sáng đối tượng cần nhận dạng màu. Cấu tạo của cảm biến này gồm 2 chân S2 và S3 dùng để lọc màu sắc khi nhận được tín hiệu điều khiển, cách điều khiển chúng như sau:
Cảm biến có 2 cổng dùng để chuyển đổi dòng điện đầu ra thành tần số của tín hiệu ra. Cách điều khiển hai cổng này như sau:
Trong bài viết này tôi sử dụng mức tần số 20%.
2. Chuẩn bị
Arduino UNO r3 | x1 |
Cảm biến TSC3200 | x1 |
Cáp kết nối Arduino | x1 |
Cáp đực cái | x6 |
Giấy màu để test | x3 |
3. Nối dây và cài đặt
3.1. Cách nối dây:
Bảng các chân kết nối
Hình 2: Sơ đồ kết nối
3.2. Cài đặt
3.2.1 Nạp code chương trình
#define S0 6
#define S1 7
#define S2 8
#define S3 9
#define sensorOut 10
int r = 0;
int g = 0;
int b = 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);
}
int readColor()
{
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
r = pulseIn(sensorOut, LOW);
delay(50);
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
g = pulseIn(sensorOut, LOW);
delay(50);
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
b = pulseIn(sensorOut, LOW);
delay(50);
Serial.println("R = "+(String)r + " G = "+(String)g + " B = "+(String)b);
return -1;
}
void loop() {
readColor();
delay(1000);
}
Sau khi nạp chương trình thành công, ta bật cửa sổ Serial Monitor lên và đặt màu sắc vào cho hệ thống nhận dạng. Lúc này chương trình sẽ đưa ra màu sắc cho đối tượng của mình, nó sẽ thường dao động trong một khoảng nào đó (hình 3). Lúc này ta sẽ dịch chuyển đối tượng qua lại gần cảm biến, sau đó xác định ngưỡng màu của đối tượng (hình 4).
Hình 3: Màu của đối tượng mà module phát hiện được
Hình 4: Xác định ngưỡng màu
Làm tương tự với các màu cần xác định và tìm ra ngưỡng màu của chúng để tìm ra giá trị nhỏ nhất và lớn nhất của mỗi màu R, G, B và đặt tên cho chúng.
3.2.2 Test chương trình với ngưỡng màu
Sau khi xác định xong các ngưỡng màu, ta nhập chúng vào đoạn code sau đây:#define S0 6
#define S1 7
#define S2 8
#define S3 9
#define sensorOut 10
int r = 0;
int g = 0;
int b = 0;
int colors[3][6];
void initColor()
{
colors[0][0] = x;//Min R 14
colors[0][1] = x;//Max R 18
colors[0][2] = x;//Min G 17
colors[0][3] = x;//Max G 23
colors[0][4] = x;//Min B 27
colors[0][5] = x;//Max B 32
//---------------------------
colors[1][0] = x;//R
colors[1][1] = x;
colors[1][2] = x;///G
colors[1][3] = x;
colors[1][4] = x;//B
colors[1][5] = x;
//---------------------------
colors[2][0] = x;//R
colors[2][1] = x;
colors[2][2] = x;///G
colors[2][3] = x;
colors[2][4] = x;//B
colors[2][5] = x;
}
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);
initColor();
// Begins serial communication
Serial.begin(9600);
}
int readColor()
{
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
r = pulseIn(sensorOut, LOW);
delay(50);
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
g = pulseIn(sensorOut, LOW);
delay(50);
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
b = pulseIn(sensorOut, LOW);
delay(50);
//Serial.println("R = "+(String)r + " G = "+(String)g + " B = "+(String)b);
for(int i =0; i < 3; i++){
if(r >= colors[i][0] && r <= colors[i][1] &&
g >= colors[i][2] && g <= colors[i][3] &&
b >= colors[i][4] && b <= colors[i][5])
{
return i;
}
}
return -1;
}
void loop() {
int c = readColor();
if(-1 < c){
if(c==0)
Serial.println("Đây là màu 1");
if(c==1)
Serial.println("Đây là màu 2");
if(c==2)
Serial.println("Đây là màu 3");
}
delay(1000);
}
Ở đây chúng ta có ba màu tương đương với colors[0], colors[1] và colors[2]. Mỗi màu sẽ có 6 giá trị tương ứng với giá trị min và max của một màu đó. VD: colors[0][0] là giá trị min cho R của màu thứ nhất, colors[0][1] là giá trị max cho R của màu thứ nhất. Giá trị colors[0][2] là giá trị min cho G của màu thứ nhất.
Trong đoạn code trên, ta thay “x” bằng giá trị thực tế của màu ta cần xác định. Ví dụ như hình 4 thì phần màu 1 của ta sẽ là:colors[0][0] = 14;
colors[0][1] = 18;
colors[0][2] = 17;
colors[0][3] = 23;
colors[0][4] = 27;
colors[0][5] = 32;
4. Bài tập
Xây dựng hệ thống phân loại màu sắc:
Mô tả hệ thống: Người ta có một lượng lớn sản phẩm gồm 6 nhóm màu khác nhau. Yêu cầu xây dựng một hệ thống để phân loại các sản phẩm ra thành 6 nhóm dựa vào màu sắc.
Hướng dẫn thực hiện: Xây dựng mô hình như hình xx. Khi đối tượng rớt xuống thì servo 1 sẽ kéo sang cảm biến màu. Cảm biến màu sẽ xác định xem đây là màu gì và sẽ điều khiển servo 2 xoay đến đúng vị trí tương ứng, sau đó servo 1 sẽ đưa đối tượng thả xuống theo máng trượt rơi xuống hộp tương ứng. Quá trình này sẽ được lặp đi lặp lại liên tục.