Raspberry Pi Cảm Biến Màu TCS3200D/TCS230

Hướng dẫn toàn diện này sẽ chỉ cho bạn cách kết nối cảm biến màu TCS3200D/TCS230 với Raspberry Pi để đo màu chính xác và trích xuất giá trị RGB. Bạn sẽ nắm vững quy trình hiệu chuẩn và phát triển khả năng nhận dạng màu trong các dự án của mình.

Mục tiêu học tập:

Raspberry Pi với module cảm biến nhận dạng màu tcs3200d tcs230 tutorial

Linh Kiện Cần Thiết

1×Raspberry Pi 5
1×Module Cảm Biến Nhận Dạng Màu TCS3200D/TCS230
1×breadboard (bo mạch thí nghiệm)
1×Dây Jumper
1×(Khuyến nghị) Screw Terminal Block Shield for Raspberry Pi
1×(Khuyến nghị) Raspberry Pi Prototyping Base Plate & Breadboard Kit
1×(Khuyến nghị) HDMI Touch Screen Monitor for Raspberry Pi

Or you can buy the following kits:

1×DIYables Sensor Kit (30 sensors/displays)
1×DIYables Sensor Kit (18 sensors/displays)

Về Cảm Biến Màu TCS3200D/TCS230

Cảm biến TCS3200D/TCS230 sử dụng ma trận photodiode được sắp xếp theo lưới 8×8 để phát hiện màu thông qua lọc quang học. Trong mảng 64 phần tử này, 16 photodiode có bộ lọc phổ đỏ, 16 khác sử dụng bộ lọc xanh lá cây, 16 sử dụng bộ lọc xanh dương, và 16 còn lại hoạt động không có bộ lọc (phản ứng trong suốt). Việc đo màu xảy ra bằng cách kích hoạt các bộ lọc cụ thể và phân tích tín hiệu ra dạng sóng vuông được điều chế tần số.

Các mảng LED trắng tích hợp sẵn trên module thông thường cung cấp ánh sáng chiếu sáng ổn định cho mục tiêu, duy trì độ ổn định của phép đọc bất kể biến động ánh sáng bên ngoài và tăng cường hiệu suất trong môi trường thiếu sáng.

Sơ Đồ Chân

Các kết nối có sẵn trên bo mạch cảm biến TCS3200D/TCS230:

  • Chân VCC: Đầu vào điện áp cung cấp (+5V).
  • Chân GND: Tham chiếu đất (0V).
  • Chân S0, S1: Bộ chọn tỉ lệ tần số đầu ra.
  • Chân S2, S3: Bộ chọn bộ lọc kênh màu.
  • Chân OUT: Đầu ra sóng vuông được điều chế tần số.
  • Chân OE: Đầu vào cho phép đầu ra (kích hoạt khi ở mức LOW). Các module tiêu chuẩn thường nối cứng chân này với GND bên trong. Nếu không được kết nối, hãy nối thủ công 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

Cách Hoạt Động

Hai cài đặt quan trọng điều khiển hành vi của cảm biến: kênh màu nào được kích hoạt và độ mạnh tín hiệu đầu ra. Hai cặp đầu vào điều khiển quản lý các chức năng này:

Điều khiển tỉ lệ tần số (chân S0 và S1):

  • S0=LOW, S1=LOW: Trạng thái tắt nguồn
  • S0=LOW, S1=HIGH: Hệ số tỉ lệ 2%
  • S0=HIGH, S1=LOW: Hệ số tỉ lệ 20%
  • S0=HIGH, S1=HIGH: Hệ số tỉ lệ 100% (tốc độ đầy đủ)

Chọn kênh màu (chân S2 và S3):

  • S2=LOW, S3=LOW: Photodiode đỏ hoạt động
  • S2=LOW, S3=HIGH: Photodiode xanh dương hoạt động
  • S2=HIGH, S3=LOW: Photodiode trong suốt hoạt động (không lọc)
  • S2=HIGH, S3=HIGH: Photodiode xanh lá cây hoạt động

Chân OUT cung cấp tần số sóng vuông trong khoảng khoảng 2 Hz đến 500 kHz. Tần số tăng theo cường độ ánh sáng—ánh sáng sáng hơn tạo ra đầu ra tần số cao hơn. Bằng cách đo thời gian xung (có mối tương quan nghịch—thời gian ngắn hơn cho thấy ánh sáng mạnh hơn), chúng ta có thể chuyển đổi các phép đo này sang định dạng RGB thông thường 0-255 thông qua hiệu chuẩn.

Đạt Được Độ Chính Xác Tối Ưu

  • Giữ cảm biến ở vị trí cách mục tiêu đo 1-3 cm với góc căn chỉnh ổn định.
  • Sử dụng hệ thống chiếu sáng LED trắng tích hợp để có ánh sáng có thể lặp lại.
  • Che chắn cảm biến khỏi ánh sáng môi trường thay đổi để tăng cường tính nhất quán của phép đo.

Sơ Đồ Kết Nối

Cấu hình kết nối cảm biến màu TCS3200 với Raspberry Pi:

Cảm Biến Màu TCS3200Raspberry Pi
VCC5V
GNDGND
OUTGPIO23
S0GPIO8
S1GPIO7
S2GPIO24
S3GPIO25
sơ đồ kết nối Raspberry Pi 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 Raspberry Pi - Hiệu Chuẩn Độ Rộng Xung

Hiệu chuẩn loại bỏ nhiễu môi trường khỏi các phép đo thô. Các biến số bao gồm cường độ đầu ra LED, khoảng cách mục tiêu, khả năng phản xạ vật liệu, và ánh sáng phòng đều ảnh hưởng đến kết quả đọc. Hãy nghĩ về chúng như những lỗi hệ thống cần được đo lường. Quy trình hiệu chuẩn xác định độ rộng xung tối thiểu và tối đa trên tất cả các kênh màu, thiết lập ranh giới tham chiếu để chuyển đổi dữ liệu thô thành giá trị RGB chính xác 0–255 phù hợp với môi trường triển khai của bạn.

# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-tcs3200d-tcs230-color-sensor import RPi.GPIO as GPIO import time # Pin Definitions (all on same physical row for easy wiring) OUT_PIN = 23 # Raspberry Pi GPIO23 pin connected to OUT (physical pin 16) S0_PIN = 8 # Raspberry Pi GPIO8 pin connected to S0 (physical pin 24) S1_PIN = 7 # Raspberry Pi GPIO7 pin connected to S1 (physical pin 26) S2_PIN = 24 # Raspberry Pi GPIO24 pin connected to S2 (physical pin 18) S3_PIN = 25 # Raspberry Pi GPIO25 pin connected to S3 (physical pin 22) # Set up GPIO mode GPIO.setmode(GPIO.BCM) GPIO.setup(S0_PIN, GPIO.OUT) GPIO.setup(S1_PIN, GPIO.OUT) GPIO.setup(S2_PIN, GPIO.OUT) GPIO.setup(S3_PIN, GPIO.OUT) GPIO.setup(OUT_PIN, GPIO.IN) # Set frequency scaling to 2% (S0=LOW, S1=HIGH) for reliable timing on Raspberry Pi GPIO.output(S0_PIN, GPIO.LOW) GPIO.output(S1_PIN, GPIO.HIGH) # Variables to track min and max pulse widths for each color red_min = 999999 red_max = 0 green_min = 999999 green_max = 0 blue_min = 999999 blue_max = 0 def read_pulse_width(): """Read the pulse width from OUT pin in microseconds""" # Wait for pulse to go HIGH timeout = time.time() + 0.1 # 100ms timeout while GPIO.input(OUT_PIN) == GPIO.LOW: if time.time() > timeout: return 0 # Measure HIGH pulse duration pulse_start = time.time() timeout = time.time() + 0.1 while GPIO.input(OUT_PIN) == GPIO.HIGH: if time.time() > timeout: return 0 pulse_end = time.time() # Return duration in microseconds return int((pulse_end - pulse_start) * 1000000) def read_red(): """Read red color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.LOW) time.sleep(0.01) return read_pulse_width() def read_green(): """Read green color pulse width""" GPIO.output(S2_PIN, GPIO.HIGH) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() def read_blue(): """Read blue color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() try: print("=== TCS3200 Calibration ===") print("Point the sensor at different objects (white, black, colors).") print("Min and Max values are tracked automatically.") print("When values look stable, note them down for the next code.") print() while True: # Read all three colors (average of 3 readings for stability) red_readings = [read_red() for _ in range(3)] green_readings = [read_green() for _ in range(3)] blue_readings = [read_blue() for _ in range(3)] red_pw = sum(r for r in red_readings if r > 0) // max(1, len([r for r in red_readings if r > 0])) green_pw = sum(g for g in green_readings if g > 0) // max(1, len([g for g in green_readings if g > 0])) blue_pw = sum(b for b in blue_readings if b > 0) // max(1, len([b for b in blue_readings if b > 0])) # Update min values if red_pw > 0 and red_pw < red_min: red_min = red_pw if green_pw > 0 and green_pw < green_min: green_min = green_pw if blue_pw > 0 and blue_pw < blue_min: blue_min = blue_pw # Update max values if red_pw > red_max: red_max = red_pw if green_pw > green_max: green_max = green_pw if blue_pw > blue_max: blue_max = blue_pw # Display current readings and min/max print("-" * 42) print(f"Red PW = {red_pw} - Green PW = {green_pw} - Blue PW = {blue_pw}") print(f" Min -> R:{red_min} G:{green_min} B:{blue_min}") print(f" Max -> R:{red_max} G:{green_max} B:{blue_max}") time.sleep(0.5) except KeyboardInterrupt: print("\nCalibration stopped") print(f"\nFinal calibration values:") print(f"redMin = {red_min}, redMax = {red_max}") print(f"greenMin = {green_min}, greenMax = {green_max}") print(f"blueMin = {blue_min}, blueMax = {blue_max}") finally: GPIO.cleanup()

Các Bước Thực Hiện

  • Sao chép code và lưu vào file, ví dụ: tcs3200_calibration.py
  • Chạy script:
PuTTY - Raspberry Pi
python3 tcs3200_calibration.py
  • Đưa cảm biến tiếp xúc với các bề mặt đa dạng: vật liệu trắng (giấy máy in), đồ vật đen, cùng các vật phẩm nhiều màu
  • Quan sát ranh giới Min/Max cập nhật tự động khi phát hiện các giá trị cực trị
  • Khi các giá trị ổn định (thường là 10-20 giây), nhấn Ctrl+C để dừng
  • Ghi lại tất cả sáu tham số hiệu chuẩn được hiển thị
PuTTY - Raspberry Pi
=== 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 ------------------------------------------ Calibration stopped Final calibration values: redMin = 42, redMax = 210 greenMin = 55, greenMax = 185 blueMin = 60, blueMax = 172

Ví dụ tham số hiệu chuẩn được trích xuất từ kết quả trên:

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

Code Raspberry Pi - Đo Giá Trị RGB

# Mã Raspberry Pi này được phát triển bởi newbiely.vn # Mã Raspberry Pi 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/raspberry-pi/raspberry-pi-tcs3200d-tcs230-color-sensor import RPi.GPIO as GPIO import time # Pin Definitions (all on same physical row for easy wiring) OUT_PIN = 23 # Raspberry Pi GPIO23 pin connected to OUT (physical pin 16) S0_PIN = 8 # Raspberry Pi GPIO8 pin connected to S0 (physical pin 24) S1_PIN = 7 # Raspberry Pi GPIO7 pin connected to S1 (physical pin 26) S2_PIN = 24 # Raspberry Pi GPIO24 pin connected to S2 (physical pin 18) S3_PIN = 25 # Raspberry Pi GPIO25 pin connected to S3 (physical pin 22) # Calibration values - REPLACE with your calibrated values! red_min = 0 red_max = 0 green_min = 0 green_max = 0 blue_min = 0 blue_max = 0 # Set up GPIO mode GPIO.setmode(GPIO.BCM) GPIO.setup(S0_PIN, GPIO.OUT) GPIO.setup(S1_PIN, GPIO.OUT) GPIO.setup(S2_PIN, GPIO.OUT) GPIO.setup(S3_PIN, GPIO.OUT) GPIO.setup(OUT_PIN, GPIO.IN) # Set frequency scaling to 2% (S0=LOW, S1=HIGH) for reliable timing on Raspberry Pi GPIO.output(S0_PIN, GPIO.LOW) GPIO.output(S1_PIN, GPIO.HIGH) def read_pulse_width(): """Read the pulse width from OUT pin in microseconds""" # Wait for pulse to go HIGH timeout = time.time() + 0.1 # 100ms timeout while GPIO.input(OUT_PIN) == GPIO.LOW: if time.time() > timeout: return 0 # Measure HIGH pulse duration pulse_start = time.time() timeout = time.time() + 0.1 while GPIO.input(OUT_PIN) == GPIO.HIGH: if time.time() > timeout: return 0 pulse_end = time.time() # Return duration in microseconds return int((pulse_end - pulse_start) * 1000000) def read_red(): """Read red color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.LOW) time.sleep(0.01) return read_pulse_width() def read_green(): """Read green color pulse width""" GPIO.output(S2_PIN, GPIO.HIGH) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() def read_blue(): """Read blue color pulse width """ GPIO.output(S2_PIN, GPIO.LOW) GPIO.output(S3_PIN, GPIO.HIGH) time.sleep(0.01) return read_pulse_width() def map_value(value, in_min, in_max, out_min, out_max): """Map value from one range to another""" if in_max == in_min: return out_min return int((value - in_min) * (out_max - out_min) / (in_max - in_min) + out_min) def constrain(value, min_val, max_val): """Constrain value between min and max """ return max(min_val, min(value, max_val)) try: print("TCS3200 Color Sensor - RGB Reading") print() while True: # Read pulse widths for all colors (average of 3 readings for stability) red_readings = [read_red() for _ in range(3)] green_readings = [read_green() for _ in range(3)] blue_readings = [read_blue() for _ in range(3)] red_pw = sum(r for r in red_readings if r > 0) // max(1, len([r for r in red_readings if r > 0])) green_pw = sum(g for g in green_readings if g > 0) // max(1, len([g for g in green_readings if g > 0])) blue_pw = sum(b for b in blue_readings if b > 0) // max(1, len([b for b in blue_readings if b > 0])) # Convert to 0-255 RGB values # Lower pulse width = brighter = higher RGB value red_value = map_value(red_pw, red_min, red_max, 255, 0) green_value = map_value(green_pw, green_min, green_max, 255, 0) blue_value = map_value(blue_pw, blue_min, blue_max, 255, 0) # Constrain to 0-255 range red_value = constrain(red_value, 0, 255) green_value = constrain(green_value, 0, 255) blue_value = constrain(blue_value, 0, 255) # Display RGB values print(f"Red = {red_value} - Green = {green_value} - Blue = {blue_value}") time.sleep(0.5) except KeyboardInterrupt: print("\nProgram stopped") finally: GPIO.cleanup()

Các Bước Thực Hiện

  • Xác định các biến hiệu chuẩn ở đầu code:
red_min = 0 red_max = 0 green_min = 0 green_max = 0 blue_min = 0 blue_max = 0
  • Thay thế tất cả sáu giá trị zero với dữ liệu hiệu chuẩn đã đo. Ví dụ sử dụng các giá trị redMin = 42, redMax = 210, greenMin = 55, greenMax = 185, blueMin = 60, blueMax = 172:
red_min = 42 red_max = 210 green_min = 55 green_max = 185 blue_min = 60 blue_max = 172
  • Lưu code đã cập nhật vào file, ví dụ: tcs3200_sensor.py
  • Chạy script:
PuTTY - Raspberry Pi
python3 tcs3200_sensor.py
  • Đặt mẫu màu trước cảm biến
  • Kiểm tra kết quả RGB trong terminal
PuTTY - Raspberry Pi
TCS3200 Color Sensor - RGB Reading Red = 210 - Green = 35 - Blue = 20 Red = 25 - Green = 200 - Blue = 40 Red = 30 - Green = 45 - Blue = 215

Các giá trị RGB hiển thị tuân theo thang đo tiêu chuẩn 0-255. Độ rộng xung giảm (cho thấy phản xạ sáng hơn) tạo ra đầu ra RGB cao hơn; độ rộng xung kéo dài (phản xạ mờ hơn) cho giá trị thấp hơn.

Ý Tưởng Ứng Dụng Dự Án

Với khả năng đo RGB hoạt động, bạn có thể phát triển:

  • Hệ thống phân loại màu: Phân loại đối tượng theo màu sắc (phân biệt đỏ/xanh lá/xanh dương)
  • Thiết bị xác minh màu: Xác nhận tính nhất quán màu sắc giữa các mẫu
  • Robot theo dõi đường màu: Robot điều hướng dọc theo các dấu hiệu màu
  • Kiểm tra chất lượng trực quan: Phát hiện khiếm khuyết sản xuất thông qua phân tích màu sắc
  • Tự động hóa kích hoạt màu: Thực hiện hành động khi phát hiện màu sắc 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