Arduino UNO R4 Cảm Biến Màu Sắc TCS3200D/TCS230

Hướng dẫn này sẽ chỉ cho bạn cách sử dụng Arduino UNO R4 và module cảm biến nhận diện màu TCS3200D/TCS230 để hiệu chỉnh và đọc giá trị RGB từ các vật thể và phát hiện màu sắc.

hướng dẫn module cảm biến nhận diện màu tcs3200d tcs230 với Arduino UNO R4

Linh Kiện Cần Thiết

1×Arduino UNO R4 WiFi hoặc Arduino UNO R4 Minima
1×(Tùy chọn) DIYables STEM V4 IoT, tương thích với Arduino Uno R4 WiFi
1×Arduino UNO R4 Minima (Thay thế)
1×Cáp USB Type-C
1×Module Cảm Biến Nhận Diện Màu TCS3200D/TCS230
1×Dây Cắm Jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Arduino UNO R4
1×(Khuyến nghị) Breadboard Shield for Arduino UNO R4
1×(Khuyến nghị) Enclosure for Arduino UNO R4
1×(Khuyến nghị) Power Splitter for Arduino UNO R4
1×(Khuyến nghị) Prototyping Base Plate & Breadboard Kit for Arduino UNO

Or you can buy the following kits:

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

Giới Thiệu Về Cảm Biến Màu TCS3200D/TCS230

TCS3200D/TCS230 là một module cảm biến nhận diện màu sử dụng ma trận 8x8 photodiode. Mười sáu photodiode có bộ lọc màu đỏ, 16 có bộ lọc màu xanh lá, 16 có bộ lọc màu xanh dương, và 16 không có bộ lọc (trong suốt). Module chuyển đổi cường độ ánh sáng thành tín hiệu tần số dạng sóng vuông. Bằng cách chuyển đổi các bộ lọc màu và đo tần số đầu ra (hoặc độ rộng xung), chúng ta có thể ước tính giá trị RGB của một vật thể.

Nhiều module bao gồm LED trắng để chiếu sáng mục tiêu. Điều này làm cho các kết quả đo đạc nhất quán hơn và giúp cảm biến phát hiện màu sắc một cách đáng tin cậy, ngay cả trong điều kiện ánh sáng yếu.

Pinout

Module cảm biến màu TCS3200D/TCS230 thường có các chân sau:

  • Chân VCC: Kết nối chân này với VCC (5V).
  • Chân GND: Kết nối chân này với GND (0V).
  • Chân S0, S1: Lựa chọn tỷ lệ tần số đầu ra.
  • Chân S2, S3: Lựa chọn bộ lọc màu.
  • Chân OUT: Đầu ra tần số dạng sóng vuông.
  • Chân OE: Cho phép đầu ra (kích hoạt ở mức LOW). Hầu hết các module đã kết nối chân này với GND bên trong, vì vậy bạn không cần phải nối dây. Nếu module của bạn không có, hãy kết nối nó với GND.
sơ đồ chân module cảm biến màu tcs3200 tcs230 hiển thị các chân vcc gnd s0 s1 s2 s3 out

Nguyên Lý Hoạt Động

Cảm biến cần được thông báo hai điều: kênh màu nào cần đo, và mức độ mạnh của tín hiệu đầu ra. Hai cặp chân điều khiển xử lý điều này:

  • S0 và S1 điều khiển tỷ lệ tần số đầu ra:
  • S0 = LOW, S1 = LOW: Tắt nguồn
  • S0 = LOW, S1 = HIGH: Tỷ lệ 2%
  • S0 = HIGH, S1 = LOW: Tỷ lệ 20%
  • S0 = HIGH, S1 = HIGH: Tỷ lệ 100%
  • S2 và S3 lựa chọn bộ lọc màu:
  • S2 = LOW, S3 = LOW: Bộ lọc đỏ
  • S2 = LOW, S3 = HIGH: Bộ lọc xanh dương
  • S2 = HIGH, S3 = LOW: Trong suốt (không có bộ lọc)
  • S2 = HIGH, S3 = HIGH: Bộ lọc xanh lá

Chân OUT xuất ra một sóng vuông (thường là 2 Hz đến 500 kHz). Tần số tỷ lệ thuận với cường độ của màu được chọn, trong khi độ rộng xung tỷ lệ nghịch. Chúng ta có thể đo độ rộng xung bằng pulseIn() và sau đó chuyển đổi nó thành giá trị RGB sau khi hiệu chỉnh.

Mẹo Để Có Kết Quả Đọc Ổn Định

  • Đặt cảm biến cách vật thể 1-3 cm và giữ góc độ nhất quán.
  • Sử dụng LED trắng tích hợp để cung cấp ánh sáng ổn định.
  • Che chắn cảm biến khỏi sự thay đổi ánh sáng môi trường để có kết quả chính xác hơn.

Sơ Đồ Kết Nối

Hình ảnh này cho thấy cách kết nối cảm biến màu TCS3200 với Arduino UNO R4:

Cảm Biến Màu TCS3200Arduino UNO R4
VCC5V
GNDGND
S0Pin 4
S1Pin 3
S2Pin 6
S3Pin 5
OUTPin 7
sơ đồ kết nối Arduino UNO R4 và cảm biến màu tcs3200 hiển thị kết nối giữa các chân

This image is created using Fritzing. Click to enlarge image

Code Arduino UNO R4 - Hiệu Chỉnh (Độ Rộng Xung)

Hiệu chỉnh là bắt buộc vì các kết quả đo thô của cảm biến bị ảnh hưởng bởi môi trường. Các yếu tố như độ sáng LED, khoảng cách, khả năng phản xạ bề mặt, và ánh sáng môi trường làm thay đổi các giá trị đo được. Bạn có thể nghĩ về những ảnh hưởng này như là "nhiễu." Bước hiệu chỉnh đầu tiên giúp bạn đo phạm vi nhiễu đó (tối thiểu và tối đa cho mỗi màu) để bạn có thể trừ đi ảnh hưởng của nó và ánh xạ các kết quả đọc thành giá trị RGB 0–255 chính xác cho thiết lập của bạn.

/* * Mã Arduino UNO R4 này được phát triển bởi newbiely.vn * Mã Arduino UNO R4 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-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define 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(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(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 current readings Serial.print("Red PW = "); Serial.print(redPW); Serial.print(" - Green PW = "); Serial.print(greenPW); Serial.print(" - Blue PW = "); Serial.println(bluePW); // Print current min/max 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("------------------------------------------"); } // Function to read Red Pulse Widths int getRedPW() { // Set sensor to read Red only digitalWrite(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Các Bước Nhanh

Thực hiện theo các hướng dẫn sau từng bước:

  • Nếu đây là lần đầu tiên bạn sử dụng Arduino Uno R4 WiFi/Minima, hãy tham khảo hướng dẫn về Arduino UNO R4 - Cài Đặt Phần Mềm.
  • Kết nối bo mạch Arduino Uno R4 với cảm biến màu theo sơ đồ được cung cấp.
  • Kết nối bo mạch Arduino Uno R4 với máy tính của bạn bằng cáp USB.
  • Khởi động Arduino IDE trên máy tính của bạn.
  • Chọn bo mạch Arduino Uno R4 phù hợp (ví dụ: Arduino Uno R4 WiFi) và cổng COM.
  • Sao chép code ở trên và mở nó trong Arduino IDE.
  • Nhấp vào nút Upload trong Arduino IDE để tải code lên Arduino UNO R4.
  • Mở Serial Monitor. Bạn sẽ thấy các kết quả đọc liên tục cùng với giá trị Min và Max.
  • Di chuyển cảm biến qua các vật thể khác nhau: một vật thể màu trắng (như giấy), một vật thể màu đen, và tùy chọn một số vật thể có màu.
  • Quan sát các hàng Min và Max cập nhật tự động khi cảm biến theo dõi các giá trị cực trị.
  • Khi các giá trị Min và Max ngừng thay đổi (thường sau 10-20 giây), đó là giá trị hiệu chỉnh của bạn - hãy ghi chúng lại.
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ả đầu ra ở trên, giá trị hiệu chỉnh của bạn sẽ là:

  • RedMin = 42, redMax = 210
  • GreenMin = 55, greenMax = 185
  • BlueMin = 60, blueMax = 172

Code Arduino UNO R4 - Đọc Giá Trị RGB

/* * Mã Arduino UNO R4 này được phát triển bởi newbiely.vn * Mã Arduino UNO R4 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-uno-r4/arduino-uno-r4-tcs3200d-tcs230-color-sensor */ // Define color sensor pins #define S0 4 #define S1 3 #define S2 6 #define S3 5 #define sensorOut 7 // Calibration Values // *Get these from the Calibration Sketch 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 RGB values int redValue = 0; int greenValue = 0; int blueValue = 0; void setup() { // Set S0 - S3 as outputs pinMode(S0, OUTPUT); pinMode(S1, OUTPUT); pinMode(S2, OUTPUT); pinMode(S3, OUTPUT); // Set Pulse Width scaling to 20% digitalWrite(S0, HIGH); digitalWrite(S1, LOW); // Set Sensor output as input pinMode(sensorOut, INPUT); // Setup Serial Monitor Serial.begin(9600); } void loop() { // Read Red Pulse Width redPW = getRedPW(); // Map to value from 0-255 redValue = map(redPW, redMin, redMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Green Pulse Width greenPW = getGreenPW(); // Map to value from 0-255 greenValue = map(greenPW, greenMin, greenMax, 255, 0); // Delay to stabilize sensor delay(200); // Read Blue Pulse Width 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(S2, LOW); digitalWrite(S3, LOW); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Green Pulse Widths int getGreenPW() { // Set sensor to read Green only digitalWrite(S2, HIGH); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; } // Function to read Blue Pulse Widths int getBluePW() { // Set sensor to read Blue only digitalWrite(S2, LOW); digitalWrite(S3, HIGH); // Define integer to represent Pulse Width int PW; // Read the output Pulse Width PW = pulseIn(sensorOut, LOW); // Return the value return PW; }

Các Bước Nhanh

  • Trong code ở trên, tìm các dòng này gần đầu:
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
  • Thay thế TẤT CẢ sáu giá trị 0 bằng các số hiệu chỉnh của bạn từ bước trước. Ví dụ, nếu hiệu chỉnh của bạn cho kết quả redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172, hãy thay đổi các dòng thành:
int redMin = 42; int redMax = 210; int greenMin = 55; int greenMax = 185; int blueMin = 60; int blueMax = 172;
  • Tải code lên Arduino UNO R4.
  • Đặt một vật thể có màu trước cảm biến.
  • Kiểm tra kết quả 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  

Giá trị RGB bây giờ được ánh xạ vào phạm vi tiêu chuẩn 0-255. Độ rộng xung thấp hơn (nhiều ánh sáng hơn) tạo ra giá trị RGB cao hơn, và độ rộng xung cao hơn (ít ánh sáng hơn) tạo ra giá trị RGB thấp hơn.

Ứng Dụng

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

  • Máy phân loại màu: Phân loại vật thể theo màu sắc (đỏ, xanh lá, xanh dương)
  • Trò chơi ghép màu: Kiểm tra xem hai vật thể có cùng màu hay không
  • Robot đi theo đường: Đi theo các đường có màu trên sàn
  • Kiểm soát chất lượng: Phát hiện sản phẩm lỗi theo màu sắc
  • Báo động kích hoạt bằng màu: Kích hoạt buzzer hoặc 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