Nhận biết màu

Ứng dụng nhận biết màu sắc của các vật

Nhận biết màu sắc

Ứng dụng nhận biết màu sắc của các vật dựa vào cảm biến màu sắc TCS3200 và board UnoX.

Các màu sắc trong tự nhiên được tạo ra bởi 3 màu cơ bản là màu đỏ, màu xanh lá cây và xanh lam. Ví dụ, màu vàng là sự kết hợp của màu xanh lá và màu đỏ.

Mỗi màu sắc có 1 cường độ ánh sánh khác nhau, cảm biến màu sắc sẽ chuyển cường độ ánh sánh này thành 1 khoảng giá trị tần số của 3 màu đỏ, xanh lá, xanh dương. Chúng ta dựa các tần số này để phân loại màu sắc.

Chuẩn bị

Các linh kiện cần chuẩn bị

  • 1xboard UnoX.

    • Đọc dữ liệu của cảm biến màu sắc.
    • Xử lí dữ liệu đọc được để phân loại màu sắc.
  • 1xcảm biến màu sắc TCS3200.

    • Cảm biến cho ra 1 khoảng tần số với mỗi màu sắc khác nhau.
    • Điện áp cung cấp: 3-5VDC.
  • 1xbó dây cắm breadboard male-famale.

    • Dây để kết nối UnoX với cảm biến màu sắc.
  • Giấy màu.

    • Đặt trước cảm biến để kiểm tra màu sắc của vật.

Đấu nối

Bảng đấu nối UnoX và cảm biến màu sắc

Cảm biến màu sắcBoard UnoX
Chân VCCChân 5VDC
Chân GNDChân GND
Chân S0Chân 5
Chân S1Chân 6
Chân S2Chân 10
Chân S3Chân 9
Chân OUTChân 11

Lưu ý: Cảm biến màu sắc có thể hoạt động bằng nguồn điện khác mà không sử dụng nguồn của UnoX. Ở trường hợp dùng nguồn khác, chân GND của nguồn cấp cho cảm biến và chân GND trên board UnoX phải được nối chung với nhau.

Mã nguồn

Mô tả nội dung

  • Khai báo các chân của cảm biến kết nối với UnoX và cấu hình IN/OUT cho các chân này.
  • Lấy dữ liệu tần số các màu đỏ, xanh lá, xanh lam của 1 vật với hàm readRGB().
  • Dựa vào dữ liệu này, cài đặt khoảng tần số để nhận biết được vật thông qua các hàm isRed(), isGreen(), isBlue(), isNoColor().
  // Khai báo các chân kết nối của cảm biến với UnoX
  #define PIN_S0    5
  #define PIN_S1    6
  #define PIN_S2    10
  #define PIN_S3    9
  #define PIN_DATA  11

  int dataRed;      // Biến lưu dữ liệu màu đỏ
  int dataGreen;    // Biến lưu dữ liệu màu xanh lá
  int dataBlue;     // Biến lưu dữ liệu màu xanh dương

  void setup()
  {
      // Cài đặt chế độ IN/OUT cho các chân của cảm biến
      pinMode(PIN_S0, OUTPUT);
      pinMode(PIN_S1, OUTPUT);
      pinMode(PIN_S2, OUTPUT);
      pinMode(PIN_S3, OUTPUT);
      pinMode(PIN_DATA, INPUT);

      // Khởi tạo Serial tốc độ truyền nhận 115200bps
      Serial.begin(115200);

      // In ra dòng chữ: Khoi tao Serial
      Serial.println("Khoi tao Serial");

      // Bước cài đặt tỉ lệ tần số ngõ ra, PIN_S0 và PIN_S1 là HIGH
      digitalWrite(PIN_S0, HIGH);
      digitalWrite(PIN_S1, HIGH);
  }

  void readRGB()
  {
      /*********************** Lấy dữ liệu của ánh sáng đỏ ************************/
      // Cài đặt chân PIN_S2 và PIN_S3 ở trạng thái LOW để lấy dữ liệu ánh sáng đỏ
      digitalWrite(PIN_S2, LOW);
      digitalWrite(PIN_S3, LOW);
      // Lưu dữ liệu số xung đọc được vào biến dataRed
      dataRed = pulseIn(PIN_DATA, LOW);
      // Hiển thị dữ liệu thông qua Serial monitor
      Serial.print("Red data= ");
      Serial.println(dataRed);
      delay(10);  // Delay 10ms để đọc các dữ liệu khác.

      /*********************** Lấy dữ liệu của ánh sáng xanh lá ************************/
      // Cài đặt chân PIN_S2 và PIN_S3 ở trạng thái HIGH để lấy dữ liệu ánh sáng xanh lá
      digitalWrite(PIN_S2, HIGH);
      digitalWrite(PIN_S3, HIGH);
      dataGreen = pulseIn(PIN_DATA, LOW);
      Serial.print("Green data= ");
      Serial.println(dataGreen);
      delay(10);

      /*********************** Lấy dữ liệu của ánh sáng xanh lam ************************/
      // Cài đặt chân PIN_S2 = LOW và PIN_S3 = HIGH để lấy dữ liệu ánh sáng xanh lam.
      digitalWrite(PIN_S2, LOW);
      digitalWrite(PIN_S3, HIGH);
      dataBlue = pulseIn(PIN_DATA, LOW);
      Serial.print("Blue data= ");
      Serial.println(dataBlue);
      delay(10);
  }

  bool isRed();
  bool isGreen();
  bool isBlue();
  bool isNoColor();

  void loop()
  {
      readRGB();

      if (isRed()) {            // Nếu giá trị của hàm isRed() trả về là true
        Serial.println("RED");  // In ra Serial monitor chữ RED
      } else if (isGreen()) {
        Serial.println("GREEN");
      } else if (isBlue()) {
        Serial.println("BLUE");
      } else if (isNoColor()) {
        Serial.println("NO COLOR");
      }
      delay(300);
  }

  bool isRed()
  {
      if (dataRed <=360  && dataRed >= 290 && dataGreen <= 540 && dataGreen >= 500 && dataBlue <= 165 && dataBlue >= 125) {
        return true;
      } else {
        return false;
      }
  }

  bool isGreen()
  {
      if (dataRed <= 400 && dataRed >= 360 && dataGreen <= 290 && dataGreen >= 240 && dataBlue <= 110 && dataBlue >= 80) {
        return true;
      } else {
        return false;
      }
  }

  bool isBlue()
  {
      if (dataRed <= 520 && dataRed >= 460 && dataGreen <= 300 && dataGreen >= 265 && dataBlue <= 100 && dataBlue >= 75) {
        return true;
      } else {
        return false;
      }
  }

  bool isNoColor()
  {
      if (dataRed >= 500 && dataGreen >= 500 && dataBlue >= 140) {
        return true;
      } else {
        return false;
      }
  }

Kết quả

  • Chúng ta di chuyển các màu đỏ, xanh lá, xanh lam đến gần cảm biến ánh sáng thì trên màn hình Serial của Arduino IDE sẽ hiện màu tương ứng.
  • Nếu không đặt các màu gần cảm biến thì trên Serial sẽ hiện “NO COLOR”.

Ứng dụng mở rộng

  • Phân loại sản phẩm dựa vào màu sắc.
  • Làm xe tự động chạy dựa vào màu sắc của vạch kẻ đường.