Skip to main content

Part 18 - Color Sensor with Arduino


Color Sensor with Arduino


Present by :- Yasas Sadeepa

ඔන්න පොරොන්දු උන විදිහටම අපි අද කතා කරන්න යන්නෙ Color Sensor පිළිබදව. Color Sensor එකක් කියන්නෙ Colors හදුනාගෙන ඒ Colors පිළිබද තොරතුරු Microcontroller එකට දැනුම් දෙන Sensor එකක්.

අපි අද කතා කරන්න යන්නෙ TCS3200 කියන Sensor එක භාවිතා වෙන Color Sensor Module දෙකක් පිළිබදව (2 රූපය)


*මේ Color Sensor එක මගින් Colors Detect කරගනු ලබන්නෙ 8×8 Photodiode Array එකක් මගින්. එනම් Photodiode 64ක් මගින්. (3 රූපය )

*මෙම Photodiode එක මගින් Detect කරනුලැබූ Colors, Signal එකක් ආකාරයට Out කිරීම සදහා Current to Freequency Converter එකක් භාවිතා කරනු ලබනවා. (4 රූපය )

*අවසානයේදී Arduino එකට ලැබෙන Freequency එකට අනුව වර්ණ නිශ්චය කිරීම සිදු කරනු ලබනවා.

*මෙම Photodiode එකෙහි Colors 3කින් යුතු Filters පිහිටා තිබෙනවා. එනම් රතු වර්ණයෙන් යුත් Filters 16, කොළ වර්ණයෙන් යුත් Filters 16, නිල් වර්ණයෙන් යුත් Filters 16ක් සහ Filters නොමති Photodiode 16ක් වශයෙනි.

*මෙම Photodiode 16 බැගින් Parallel ආකාරයට සම්බන්ධ කර තිබේ.

* මෙහිදී S2 හා S3 කියන Pin 2ක භාවිතා කිරීමෙන් යම් කිසි වර්ණයකට අදාල Photodiode Select කරගැනීමේ හැකියාවක් පවතිනවා. (5 රූපය )


*තවද S0 හා S1 කියන Pin 2 මගින් Out කරනු ලබන Freequency එක තුළනය කිරීමේ හැකියාවක් පවතිනවා.

අද අපි කරන්න යන්නේ වර්ණ කීපයක් හදුනාගෙන එම වර්ණයන් LCD Display එකක Display කිරීමයි.
මේ සදහා අවශ්‍ය වෙනවා,

1) TCS3200 Color Sensor Module × 1:-
             http://scionelectronics.com/product/color-sensor/ (6 රූපය)

හෝ
                  http://scionelectronics.com/product/color-recognition-sensor-module-gy-31/  (7 රූපය )  ~ ( අදුරේදී වුවද Colors Detect කරගැනීමට හැකියි. මෙහි ඇති White Color LED 4 අවශ්‍ය පරිදි On කිරීමට හෝ Off කිරීමට හැකියි)




4) 10k Potentiometer × 1  :- http://scionelectronics.com/product/b-10k-2/

5) 220♎ Resistor × 1 :-  http://scionelectronics.com/product/220%CF%89/


මම මේ බඩු ටික ගත්තෙ Scion Electronics එකෙන්. ඔයාලටත් Warranty එකක් එක්කම ගන්න පුලුවන්.

දැන පහත ආකාරයට Color Sensor Module එක සම්බන්ධ කරගන්න.

Sensor       Arduino
S0     -   D8
S1      -   D9
S2     -   D10
S3      -  D13
OUT  -  D3
VCC  -  5V
GND  -  GND

GY-31 Module එකක් නම් පහත ආකාරයට සම්බන්ධ කරගන්න.

Sensor       Arduino
S0     -   D8
S1      -   D9
S2     -   D10
S3      -  D13
OUT  -  D3
LED   - D2
VCC  -  5V
GND  -  GND

LCD Display එක සම්බන්ධ කරගන්න ආකාරය මීට පෙර කොටස්වල පැහැදිලි කරල තියනවා.

LCD Display Pin Conection :-
LCD            ARDUINO
VSS -         GND
VDD -        5V
VO -          Potentiometer
RS -           D7
RW -         GND
E -             D12
D4 -          D11
D5 -          D4
D6 -          D5
D7 -          D6
A -            5V (With 220♎ Resistor)
K -            GND

ඉන් පසු ඔබ භාවිතා කලේ 6 රූපයේ දැක්වෙන Color Sensor Module එක නම් පහත Code එක Upload කරන්න.

/****** YS Coding *******
*                       *
  GY-32 Color Sensor *
        Coding
*                       *
*************************/
// Color Sensor Pin Difine (You can change this pin numbers)//
#define s0 8
#define s1 9
#define s2 10
#define s3 13
#define outPin 3
//**********************************************************\\
boolean DEBUG = true;
//Define  Variables//
int red;
int green;
int blue;
String color = "";
int count = 0;
long startTiming = 0;
long elapsedTime = 0;
//*******************\\
#include <LiquidCrystal.h> // Include LiquidCrystal Library (For LCD Display)
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // Pin substination for LCD
//Starting Setup\\
void setup() {
  //Out from Arduino becomes Input to Sensor\\
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
//*****************************************\\
 
  pinMode(outPin, INPUT); //Out from Sensor becomes Input to Arduino
  digitalWrite(s0, HIGH);
  digitalWrite(s1, HIGH);
  Serial.begin(9600); // Start the Serial Communication
 
  lcd.begin(16, 2); //Define LCD Display
  lcd.print("YS Coding");
  Serial.println("YS Present Color Detector");
  startTiming = millis();
}
//Starting Loop\\
void loop() {
  digitalWrite(led, LOW); //You can change this (HIGH / LOW).... You can Turn On / Off LEDs
 
  getColor();
  if (DEBUG) printData();
  elapsedTime = millis() - startTiming;
  if (elapsedTime > 1000)
  {
    showDataLCD();
    startTiming = millis();
  }
}
// Set RGB color values\\
void getColor(){
  readRGB();
  if (red > 43 && red < 72 && green > 55 && green < 87 && blue > 58 && blue < 92) color = "WHITE";
  else if (red > 305 && red < 400 && green > 380 && green < 450 && blue > 380 && blue < 450) color = "BLACK";
  else if (red > 63 && red < 130 && green > 217 && green < 355 && blue > 198 && blue < 307) color = "RED";
  else if (red > 108 && red < 287 && green > 78 && green < 287 && blue > 118 && blue < 302) color = "GREEN";
  else if (red > 48 && red < 59 && green > 79 && green < 112 && blue > 113 && blue < 162) color = "YELLOW";
  else if (red > 137 && red < 367 && green > 93 && green < 241 && blue > 85 && blue < 132) color = "BLUE";
  else  color = "NO_COLOR";
}
//*****************************************************************************************************************\\
/* Read RGB components */
void readRGB(){
  red = 0;
  green = 0;
  blue = 0;
  int n = 10;
  for (int i = 0; i < n; ++i){
    digitalWrite(s2, LOW);
    digitalWrite(s3, LOW);
    red = red + pulseIn(outPin, LOW);
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    green = green + pulseIn(outPin, LOW);
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    blue = blue + pulseIn(outPin, LOW);
  }
  red = red / n;
  green = green / n;
  blue = blue / n;
}
//Showing capured data at LCD Display\\
void showDataLCD(void){
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print("R");
  lcd.setCursor (1, 0);
  lcd.print("    ");
  lcd.setCursor (1, 0);
  lcd.print(red);
  lcd.setCursor (5, 0);
  lcd.print(" G");
  lcd.setCursor (7, 0);
  lcd.print("    ");
  lcd.setCursor (7, 0);
  lcd.print(green);
  lcd.setCursor (12, 0);
  lcd.print("B");
  lcd.setCursor (13, 0);
  lcd.print("    ");
  lcd.setCursor (13, 0);
  lcd.print(blue);
  lcd.setCursor (0, 1);
  lcd.print("Color: ");
  lcd.setCursor (7, 1);
  lcd.print("        ");
  lcd.setCursor (7, 1);
  lcd.print(color);
}
//************************\\
//Showing captured data at Serial Monitor\\
void printData(void){
  Serial.print("red= ");
  Serial.print(red);
  Serial.print("   green= ");
  Serial.print(green);
  Serial.print("   bluee= ");
  Serial.print(blue);
  Serial.print (" - ");
  Serial.print (color);
  Serial.println (" detected!");
}
//**********************************************\\
/***************************************************
* YS Coding
* Arduino Programming Part-18
* GY-31 Color Sensor Coding
* ****************** END **************************/
*/

මෙහිදි void getColor යන්න යටතේ ඇති අගයන් ගැලපෙන පරිදි වෙනස් කරගත යුතු වේ.
Code එක Code එකෙහි Comments මගින් විස්තර කර තිබේ.

ඔබ භාවිතා කලේ 7 රූපයේ දැක්වෙන GY-31 Color Sensor Module එක නම් පහට Code එක Upload කරන්න. මෙම Code එකෙහි ඇති වෙනස් කම නම් LED On / Off කිරීම සදහා පහසුකම සලසා තිබීම සහ RGB value අතර ඇති වෙනස්කම පමණි.

/****** YS Coding *******
*                       *
  GY-32 Color Sensor *
        Coding
*                       *
*************************/
// Color Sensor Pin Difine (You can change this pin numbers)//
#define s0 8
#define s1 9
#define s2 10
#define s3 13
#define outPin 3
#define led 2
//**********************************************************\\
boolean DEBUG = true;
//Define  Variables//
int red;
int green;
int blue;
String color = "";
int count = 0;
long startTiming = 0;
long elapsedTime = 0;
//*******************\\
#include <LiquidCrystal.h> // Include LiquidCrystal Library (For LCD Display)
LiquidCrystal lcd(12, 11, 4, 5, 6, 7); // Pin substination for LCD
//Starting Setup\\
void setup() {
  //Out from Arduino becomes Input to Sensor\\
  pinMode(s0, OUTPUT);
  pinMode(s1, OUTPUT);
  pinMode(s2, OUTPUT);
  pinMode(s3, OUTPUT);
  pinMode(led, OUTPUT);
  //*****************************************\\
 
  pinMode(outPin, INPUT); //Out from Sensor becomes Input to Arduino
 
  digitalWrite(s0, HIGH);
  digitalWrite(s1, HIGH);
  Serial.begin(9600); // Start the Serial Communication
 
  lcd.begin(16, 2); //Define LCD Display
  lcd.print("YS Coding");
  Serial.println("YS Present Color Detector");
  startTiming = millis();
}
//Starting Loop\\
void loop() {
  digitalWrite(led, HIGH); //You can change this (HIGH / LOW).... You can Turn On / Off LEDs
 
  getColor();
 
  if (DEBUG) printData();
  elapsedTime = millis() - startTiming;
  if (elapsedTime > 1000){
    showDataLCD();
    startTiming = millis();
  }
}
// Set RGB color values\\
void getColor() {
  readRGB();
  if (red > 7 && red < 58 && green > 8 && green < 65 && blue > 5 && blue < 48) color = "WHITE";
  else if (red > 73 && red < 120 && green > 77 && green < 148 && blue > 52 && blue < 90) color = "BLACK";
  else if (red > 13 && red < 72 && green > 45 && green < 127 && blue > 32 && blue < 98) color = "RED";
  else if (red > 50 && red < 130 && green > 25 && green < 120 && blue > 30 && blue < 100) color = "GREEN";
  else  color = "NO_COLOR";
}
//*****************************************************************************************************************\\
/* Read RGB components */
void readRGB() {
  red = 0;
  green = 0;
  blue = 0;
  int n = 10;
  for (int i = 0; i < n; ++i) {
    digitalWrite(s2, LOW);
    digitalWrite(s3, LOW);
    red = red + pulseIn(outPin, LOW);
    digitalWrite(s2, HIGH);
    digitalWrite(s3, HIGH);
    green = green + pulseIn(outPin, LOW);
    digitalWrite(s2, LOW);
    digitalWrite(s3, HIGH);
    blue = blue + pulseIn(outPin, LOW);
  }
  red = red / n;
  green = green / n;
  blue = blue / n;
}
//Showing capured data at LCD Display\\
void showDataLCD(void) {
  lcd.clear();
  lcd.setCursor (0, 0);
  lcd.print("R");
  lcd.setCursor (1, 0);
  lcd.print("    ");
  lcd.setCursor (1, 0);
  lcd.print(red);
  lcd.setCursor (5, 0);
  lcd.print(" G");
  lcd.setCursor (7, 0);
  lcd.print("    ");
  lcd.setCursor (7, 0);
  lcd.print(green);
  lcd.setCursor (12, 0);
  lcd.print("B");
  lcd.setCursor (13, 0);
  lcd.print("    ");
  lcd.setCursor (13, 0);
  lcd.print(blue);
  lcd.setCursor (0, 1);
  lcd.print("Color: ");
  lcd.setCursor (7, 1);
  lcd.print("        ");
  lcd.setCursor (7, 1);
  lcd.print(color);
}
//************************\\
//Showing captured data at Serial Monitor\\
void printData(void){
  Serial.print("red= ");
  Serial.print(red);
  Serial.print("   green= ");
  Serial.print(green);
  Serial.print("   blue= ");
  Serial.print(blue);
  Serial.print (" - ");
  Serial.print (color);
  Serial.println (" detected!");
}
//**********************************************\\
/***************************************************
* YS Coding
* Arduino Programming Part-18
* GY-31 Color Sensor Coding
* ****************** END **************************/

මෙහිද ගැලපෙන ආකාරයට void getColor යටතේ ඇති RGB අගයන් වෙනස් කරගන්න.

ඉතින් තව එක දෙයක් කියන්නම් මගෙන් ගොඩක් දෙනෙක් Comment වලින් වගේම inbox ඇවිල්ලත් අහල තිබ්බ කොළඹින් පිට ඉන්න අයට මේ Arduino Parts ගන්න තැනක් නැද්ද කියල.  ඉතින් මන් හිතුව මන් බඩු ගන්න තැන ගැන ඔයාලට කිව්ව නම් ඒක ඔයගොල්ලන්ට පහසුවක් වෙයි කියල.

"Scion Electronics"  ( සයන් ඉලෙක්ට්‍රොනික්ස් ) ඔයාලට Arduino සම්බන්ධ ඕනෙම item එකක් Warranty එකක් සහිතව ගන්න පුලුවන් මේ ශොප් එකෙන්. මාලබේ ස්ලිට් කැම්පස් එක ඉස්සරහ වගේම මොරටුව කැම්පස් එක ඉස්සරහත් මෙයාලගෙ shop තියනව. ඔයගොල්ලො පිට පලාතක ඉන්නව නම් ඔයාලට පුලුවන් ගෙදරටම මේ භාණ්ඩ ගෙන්න ගන්න. මෙයාලගෙ Web Site එකේ සියලුම Item ගැන විස්තර තියනව. ( http://scionelectronics.com/ ) වගකීමක් සහිතවම ඔයාලට ඕනෙ කරන Arduino Parts ගන්න පුලුවන්.


ආඩුඊනෝ ප්‍රෝග්‍රෑමිං Part 19 තුළින් නැවත හමු වෙමු.

Ratings



HTML Comment Box is loading comments...

Comments

Popular posts from this blog

Arduino පිළිබද දැණුම බෙදාගන්න එකතු වෙන්න අපි සමග. Arduino Advance කොටස් සමගම Arduino Basic ඉගෙනගන්න. ඒ වගේම Programing , Network වගේ දේවල් ඉගෙන ගන්න... විශිෂ්ඨයෙක් වෙන්න එකතු වෙන්න අපිත් එක්ක Popular Article :-  OV7670 with Arduino Arduino Time Symbols & Operators HC-12