Arduino Cảm biến màu TCS3200D/TCS230

Hướng dẫn này trình bày cách giao tiếp cảm biến nhận diện màu TCS3200D/TCS230 với Arduino để đo và nhận diện các giá trị RGB từ các vật thể khác nhau. Bạn sẽ nắm vững các kỹ thuật hiệu chuẩn cảm biến và lập trình nhận diện màu sắc.

Các chủ đề được đề cập:

hướng dẫn sử dụng Arduino với mô-đun cảm biến nhận diện màu tcs3200d/tcs230

Phần cứng cần chuẩn bị

1×Arduino Uno R3
1×USB 2.0 cable type A/B (for USB-A PC)
1×USB 2.0 cable type C/B (for USB-C PC)
1×TCS3200D/TCS230 Color Recognition Sensor Module
1×dây jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino Uno
1×(Khuyến nghị) Breadboard Shield for Arduino Uno
1×(Khuyến nghị) Enclosure for Arduino Uno
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

1×DIYables STEM V3 Starter Kit (Arduino included)
1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về cảm biến màu TCS3200D/TCS230

Được xây dựng dựa trên một mảng photodiode 8x8, TCS3200D/TCS230 nhận diện màu sắc thông qua lọc quang chuyên dụng. Lưới 64 photodiode bao gồm 16 photodiode được lọc đỏ, 16 photodiode được lọc xanh lá, 16 photodiode được lọc xanh lam, và 16 photodiode chưa lọc (trong suốt). Việc phát hiện màu sắc diễn ra bằng cách chuyển đổi giữa các loại lọc và phân tích đầu ra tần số dạng sóng vuông đại diện cho cường độ ánh sáng.

Đèn LED trắng tích hợp trên hầu hết các mô-đun cung cấp ánh sáng mục tiêu đồng nhất, đảm bảo các phép đo ổn định trong các điều kiện môi trường khác nhau và cải thiện hiệu suất trong điều kiện ánh sáng yếu.

Sơ đồ chân

Các chân kết nối trên mô-đun TCS3200D/TCS230 bao gồm:

  • Chân VCC: Nguồn cấp điện (+5V).
  • Chân GND: Nối đất (0V).
  • Chân S0, S1: Ngõ vào điều khiển tần số.
  • Chân S2, S3: Ngõ vào chọn bộ lọc màu.
  • Chân OUT: Đầu ra tần số (dạng sóng vuông).
  • Chân OE: Điều khiển bật/tắt đầu ra (kích hoạt ở mức LOW). Hầu hết các mô-đun thương mại đều nối đất chân này bên trong, loại bỏ việc phải nối dây bên ngoài. Nếu chưa được kết nối trước, hãy tự nối nó với GND.
sơ đồ nối chân của module cảm biến màu tcs3200/tcs230 cho thấy các chân vcc, gnd, s0, s1, s2, s3, out.

Cách hoạt động

Vận hành cảm biến đòi hỏi cấu hình hai tham số chính: kênh màu hoạt động và cường độ tín hiệu. Các cặp chân điều khiển quản lý các thiết lập này:

Điều chỉnh đầu ra thông qua S0 và S1:

  • Cả hai ở mức thấp: Chế độ tắt nguồn
  • S0 THẤP, S1 CAO: Điều chỉnh tần số ở mức 2%
  • S0 CAO, S1 THẤP: Điều chỉnh tần số ở mức 20%
  • Cả hai CAO: Điều chỉnh tần số ở mức tối đa 100%

Lựa chọn bộ lọc thông qua S2 và S3:

  • Cả hai ở mức thấp: kênh đỏ hoạt động
  • S2 ở mức thấp, S3 ở mức cao: kênh xanh lam hoạt động
  • S2 ở mức cao, S3 ở mức thấp: kênh trong suốt (không lọc)
  • Cả hai ở mức cao: kênh xanh lá cây hoạt động

Chân OUT tạo tín hiệu sóng vuông với tần số từ khoảng 2 Hz đến 500 kHz. Các tần số cao hơn cho biết cường độ ánh sáng mạnh hơn cho kênh được chọn. Đo chiều rộng xung bằng pulseIn() cho thấy mối quan hệ nghịch đảo — xung ngắn hơn có màu sáng hơn. Việc chuyển đổi sau hiệu chuẩn cho ra các giá trị RGB chuẩn.

Tối đa hóa độ chính xác khi đọc

  • Duy trì khoảng cách giữa cảm biến và mục tiêu từ 1-3 cm, đảm bảo vị trí nhất quán.
  • Kích hoạt đèn LED trắng tích hợp trên bảng mạch để đảm bảo điều kiện chiếu sáng đồng nhất.
  • Giảm thiểu tác động của ánh sáng môi trường bằng cách che chắn cảm biến để tăng độ chính xác.

Sơ đồ đấu dây

Sơ đồ kết nối cho cảm biến màu TCS3200 và Arduino:

TCS3200 Color SensorArduino
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
sơ đồ nối dây Arduino và cảm biến màu tcs3200 cho thấy các kết nối giữa các chân.

This image is created using Fritzing. Click to enlarge image

Mã Arduino - Hiệu chuẩn cảm biến bằng độ rộng xung

Việc hiệu chuẩn môi trường là cần thiết vì đầu ra cảm biến thô biến thiên do nhiều yếu tố: cường độ đèn LED tích hợp, khoảng cách tới mục tiêu, đặc tính phản xạ của bề mặt và ánh sáng xung quanh. Xem các biến này như nhiễu đo lường. Hiệu chuẩn định lượng nhiễu này bằng cách thiết lập giới hạn tối thiểu và tối đa cho từng kênh màu, cho phép chuyển đổi chính xác sang thang RGB tiêu chuẩn 0–255 cho thiết lập cụ thể của bạn.

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 4 #define PIN_S1 3 #define PIN_S2 6 #define PIN_S3 5 #define PIN_sensorOut 7 // Variables for Color Pulse Width Measurements int redPW = 0; int greenPW = 0; int bluePW = 0; // Variables to track min and max pulse widths for calibration int redMin = 10000, redMax = 0; int greenMin = 10000, greenMax = 0; int blueMin = 10000, blueMax = 0; void setup() { // Set S0 - S3 as outputs pinMode(PIN_S0, OUTPUT); pinMode(PIN_S1, OUTPUT); pinMode(PIN_S2, OUTPUT); pinMode(PIN_S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(PIN_S0, HIGH); digitalWrite(PIN_S1, LOW); // Set Sensor output as input pinMode(PIN_sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); Serial.println("=== TCS3200 Calibration ==="); Serial.println("Point the sensor at different objects (white, black, colors)."); Serial.println("Min and Max values are tracked automatically."); Serial.println("When values look stable, note them down for the next code."); Serial.println("------------------------------------------"); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width bluePW = getBluePW(); // Delay to stabilize sensor delay(200); // Update min and max values if (redPW < redMin) redMin = redPW; if (redPW > redMax) redMax = redPW; if (greenPW < greenMin) greenMin = greenPW; if (greenPW > greenMax) greenMax = greenPW; if (bluePW < blueMin) blueMin = bluePW; if (bluePW > blueMax) blueMax = bluePW; // Print the pulse width values with min/max Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); Serial.print(" Min -> R:"); Serial.print(redMin); Serial.print(" G:"); Serial.print(greenMin); Serial.print(" B:"); Serial.println(blueMin); Serial.print(" Max -> R:"); Serial.print(redMax); Serial.print(" G:"); Serial.print(greenMax); Serial.print(" B:"); Serial.println(blueMax); Serial.println("------------------------------------------"); delay(1000); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, LOW); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(PIN_S2, HIGH); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; }

Hướng dẫn từng bước

  • Mở mã hiệu chuẩn trong Arduino IDE
  • Tải lên cho bo mạch Arduino của bạn bằng nút Tải lên
  • Mở Serial Monitor để xem các giá trị đo được và theo dõi giá trị tối thiểu/tối đa
  • Quét nhiều vật thể bằng cảm biến: các bề mặt trắng (giấy), vật màu đen, và các vật thể có màu sắc khác nhau
  • Quan sát các cập nhật tự động của giá trị tối thiểu/tối đa khi các giá trị cực trị được ghi nhận
  • Khi các số ổn định (thông thường từ 10–20 giây), ghi lại toàn bộ sáu hằng số hiệu chuẩn
COM6
Send
=== TCS3200 Calibration === Point the sensor at different objects (white, black, colors). Min and Max values are tracked automatically. When values look stable, note them down for the next code. ------------------------------------------ Red PW = 42 - Green PW = 55 - Blue PW = 60 Min -> R:42 G:55 B:60 Max -> R:42 G:55 B:60 ------------------------------------------ Red PW = 210 - Green PW = 185 - Blue PW = 172 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------ Red PW = 44 - Green PW = 57 - Blue PW = 61 Min -> R:42 G:55 B:60 Max -> R:210 G:185 B:172 ------------------------------------------
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Ví dụ, từ kết quả ở trên, các giá trị hiệu chuẩn của bạn sẽ là:

  • đỏMin = 42, đỏMax = 210
  • Xanh láMin = 55, xanh láMax = 185
  • Xanh lamMin = 60, xanh lamMax = 172

Mã Arduino - Đọc Các Giá Trị Màu RGB

/* * Mã Arduino này được phát triển bởi newbiely.vn * Mã Arduino này được cung cấp để sử dụng công khai, không có ràng buộc. * Để xem hướng dẫn chi tiết và sơ đồ kết nối, vui lòng truy cập: * https://newbiely.vn/tutorials/arduino/arduino-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define PIN_S0 4 #define PIN_S1 3 #define PIN_S2 6 #define PIN_S3 5 #define PIN_sensorOut 7 // Calibration Values // Replace these values with your actual calibration data from the previous step int redMin = 0; // Red minimum pulse width int redMax = 0; // Red maximum pulse width int greenMin = 0; // Green minimum pulse width int greenMax = 0; // Green maximum pulse width int blueMin = 0; // Blue minimum pulse width int blueMax = 0; // Blue maximum pulse width // Variables for Color Pulse Width Measurements int redPW = 0; int greenPW = 0; int bluePW = 0; // Variables for final Color values int redValue; int greenValue; int blueValue; void setup() { // Set S0 - S3 as outputs pinMode(PIN_S0, OUTPUT); pinMode(PIN_S1, OUTPUT); pinMode(PIN_S2, OUTPUT); pinMode(PIN_S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(PIN_S0, HIGH); digitalWrite(PIN_S1, LOW); // Set Sensor output as input pinMode(PIN_sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red value redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green value greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue value bluePW = getBluePW(); // Map to value from 0-255 blueValue = map(bluePW, blueMin, blueMax, 255, 0); // Delay to stabilize sensor delay(200); // Print output to Serial Monitor Serial.print("Red = "); Serial.print(redValue); Serial.print(" - Green = "); Serial.print(greenValue); Serial.print(" - Blue = "); Serial.println(blueValue); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, LOW); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(PIN_S2, HIGH); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(PIN_S2, LOW); digitalWrite(PIN_S3, HIGH); // Read the Pulse Width int PW = pulseIn(PIN_sensorOut, LOW); // Return the value return PW; }

Hướng dẫn từng bước

  • Xác định các khai báo biến hiệu chuẩn nằm ở phần đầu của mã:

Có vẻ không có nội dung nào giữa các dấu ```; vui lòng dán văn bản tiếng Anh bạn muốn dịch sang tiếng Việt.

int redMin = 0; // Độ rộng xung tối thiểu của màu đỏ

int redMax = 0; // Độ rộng xung tối đa của màu đỏ

int greenMin = 0; // Độ rộng xung tối thiểu của màu xanh

int greenMax = 0; // Độ rộng xung tối đa của màu xanh

int blueMin = 0; // Độ rộng xung tối thiểu của màu xanh

int blueMax = 0; // Độ rộng xung tối đa của màu xanh

There is no content inside the code block to translate. Please paste the English text you want translated to Vietnamese.

  • Cập nhật tất cả sáu giá trị bằng 0 bằng dữ liệu hiệu chuẩn từ bài tập trước. Ví dụ biến đổi (sử dụng kết quả hiệu chuẩn redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172):

Please provide the English text to translate.

int redMin = 42;

int redMax = 210;

int xanhToiThieu = 55;

int giaTriXanhToiDa = 185;

int xanhToiThieu = 60;

int xanhToiDa = 172;

Please provide the English content to translate (inside the triple backticks).

  • Nạp mã đã chỉnh sửa lên Arduino
  • Đặt một mục tiêu có màu trước cảm biến
  • Theo dõi đầu ra RGB trên Serial Monitor
COM6
Send
Red = 210 - Green = 35 - Blue = 20 Red = 25 - Green = 200 - Blue = 40 Red = 30 - Green = 45 - Blue = 215
Autoscroll Show timestamp
Clear output
9600 baud  
Newline  

Các giá trị RGB hiện được ánh xạ vào phạm vi chuẩn 0-255. Chiều rộng xung thấp hơn (nhiều ánh sáng) tạo ra các giá trị RGB cao hơn, và chiều rộng xung cao hơn (ít ánh sáng) tạo ra các giá trị RGB thấp hơn.

Các ứng dụng

Bây giờ bạn có thể đọc được các giá trị RGB và xây dựng các dự án như:

  • Máy phân loại theo màu: Sắp xếp các vật thể theo màu (đỏ, xanh lá cây, xanh lam)
  • Trò chơi ghép màu: Kiểm tra xem hai vật thể có cùng một màu hay không
  • Robot theo dõi đường màu: Theo dõi các đường màu trên sàn
  • Kiểm soát chất lượng: Phát hiện sản phẩm lỗi bằng màu sắc
  • Báo động kích hoạt bằng màu: Kích hoạt còi hoặc đèn LED khi phát hiện một màu cụ thể

Video Tutorial

Việc sản xuất video tốn rất nhiều thời gian. Nếu video hướng dẫn hữu ích cho việc học của bạn, hãy đăng ký kênh YouTube để ủng hộ. Nếu nhu cầu đủ cao, chúng tôi sẽ cố gắng làm thêm nhiều video.

Bài hướng dẫn liên quan