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 කිරීමයි.
මේ සදහා අවශ්ය වෙනවා,
http://scionelectronics.com/product/color-recognition-sensor-module-gy-31/ (7 රූපය ) ~ ( අදුරේදී වුවද Colors Detect කරගැනීමට හැකියි. මෙහි ඇති White Color LED 4 අවශ්ය පරිදි On කිරීමට හෝ Off කිරීමට හැකියි)
2) 16×2 LCD Display × 1 :- http://scionelectronics.com/product/1602-character-lcd-screen-162/
3) Arduino Uno × 1 :- http://scionelectronics.com/product/arduino-uno-r3/
4) 10k Potentiometer × 1 :- http://scionelectronics.com/product/b-10k-2/
5) 220♎ Resistor × 1 :- http://scionelectronics.com/product/220%CF%89/
6) Jumper Wires :- http://scionelectronics.com/product-category/wires/jumper/
මම මේ බඩු ටික ගත්තෙ Scion Electronics එකෙන්. ඔයාලටත් Warranty එකක් එක්කම ගන්න පුලුවන්.
දැන පහත ආකාරයට Color Sensor Module එක සම්බන්ධ කරගන්න.
Sensor Arduino
S0 - D8
S1 - D9
S2 - D10
S3 - D13
OUT - D3
VCC - 5V
GND - GND
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
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
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
* *
*************************/
* *
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 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;
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
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
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);
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();
}
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();
}
}
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();
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";
}
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);
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(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;
}
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.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);
}
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!");
}
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 **************************/
*/
* 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
* *
*************************/
* *
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
#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;
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
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);
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();
}
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();
}
}
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();
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";
}
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);
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(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;
}
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.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);
}
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!");
}
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 **************************/
* 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
Post a Comment