در این مقاله به آموزش تشخیص رنگ با استفاده از سنسور رنگ TCS230 یا TCS3200 و آردوینو پرداخته شده است.
حسگر تشخیص رنگ یک قطعهی ساده و با کاربری آسان است که با استفاده از آن می توان رنگ یک شئ را تشخیص داد و پس از تشخیص رنگ، اقدامات دیگر را در سیستم آغاز کرد. این نوع سنسور راهحلهای آسانی را برای مرتبسازی و بستهبندی در یک محیط صنعتی ارائه میدهد درحالی که هنوز سنسورهای گرانقیمت در صنایع استفاده میشوند، سنسورهای مقرون به صرفه مانند TCS3200 را میتوان برای کاربردهای DIY (خودت انجامش بده!) مورد استفاده قرار داد. بنابراین در این مقاله به این فکر کردیم که یک سنسور رنگی TCS3200 را با یک آردوینو متصل کنیم و در ادامه با جزئیات این سنسور و عملکرد آن آشنا شوید. پس بدون بحث بیشتر، بیایید مستقیماً به آن بپردازیم.
سنسور تشخیص رنگ TCS3200 میتواند رنج گستردهای از رنگها را بر اساس طول موج آن تشخیص دهد. این سنسور همانطور که پیداست در پروژههایی مانند تشخیص یکسان بودن رنگها، دستهبندی براساس رنگ، خواندن نوار تست و غیره کاربرد دارد.
سنسور تشخیص رنگ TCS3200
پیشنهاد میکنیم قبل از انجام تشخیص رنگ و راهاندازی این سنسور با استفاده از آردوینو، ابتدا با اجزای اصلی این ماژول سنسور کوچک آشنایی اولیه پیدا کنید.
همانطورکه در تصویر سنسور تشخیص رنگ TCS3200 در ذیل مشاهده میکنید، هسته اصلی این سنسور تراشه TAOS TCS3200 RGB است و روی برد آن چهار LED برای تاباندن نور به جسم قرار داده شده است.
مشخصات فنی سنسور TCS3200:
- ولتاژ تغذیه: 2.7V تا 5.5V
- ابعاد: 28.4mm x 28.4mm (1.12” x 1.12”)
- نوع ارتباط: TTL دیجیتال
- قابلیت تبدیل شدت نور به فرکانس با رزولوشن بالا
- دارای خروجی فرکانسی گسترده با قابلیت تنظیم مقیاس فرکانس
- قابلیت ارتباط مستقیم با میکروکنترلر
سنسور TCS3200 چگونه کار میکند؟
سنسور تشخیص رنگ TCS3200 دارای یک آرایه از فتودیود با چهار فیلتر مختلف است. به زبان ساده، فتودیود یک المان نیمه هادی است که شدت نور را به جریان تبدیل میکند. فیلترهای این سنسور عبارتند از:
- 16 فتودیود با فیلتر قرمز (حساس به طول موج قرمز)
- 16 فتودیود با فیلتر سبز (حساس به طول موج سبز)
- 16 فتودیود با فیلتر آبی (حساس به طول موج آبی)
- 16 فتودیود بدون فیلتر
اگر با دقت و از نزدیک به تراشه TCS3200 نگاه کنید، فیلترهای مختلف آن را به راحتی میبینید.
با انتخاب فیلتر آرایهی فتودیود، میتوانید شدت رنگهای مختلف را تشخیص دهید. این سنسور دارای یک مبدل جریان به فرکانس است که خروجی فتودیودها را به موج مربعی تبدیل میکند (فرکانس این موج مربعی متناسب با شدت رنگ جسم مقابل سنسور میباشد) و سپس این فرکانس با آردوینو خوانده و رنگ جسم موردنظر تشخیص داده میشود. این مراحل در شکل زیر نشان داده شده است.
پین اوت:
ترتیب پایههای سنسور در شکل نشان داده شده است:
توضیحات | I/O | شماره پایه |
زمین تغذیه | GND (4) | |
فعال ساز خروجی- این پایه active low است | I | OE (3) |
فرکانس خروجی | O | OUT (6) |
انتخاب مقیاس فرکانس خروجی | I | S0, S1 (1, 2) |
انتخاب فیلتر فتودیود | I | |
تغذیه سنسور | VDD (5) |
انتخاب فیلتر:
برای انتخاب رنگی که توسط فتودیود تشخیص داده میشود، باید از پایههای S2 و S3 استفاده کنید. فتودیودها به صورت موازی به یکدیگر متصل شدهاند و با Low و High کردن پایههای S2 و S3 در ترکیبهای مختلف، میتوانید فتودیودهای مختلفی را انتخاب کنید. این ترکیبهای مختلف در جدول زیر آورده شده است:
S3 | S2 | نوع فتودیود |
Low | Low | قرمز |
High | Low | آبی |
Low | High | بدون فیلتر |
High | High | سبز |
انتخاب مقیاس فرکانس خروجی:
پایههای S0 و S1 برای انتخاب مقیاس فرکانس خروجی استفاده میشوند. مقیاس فرکانس خروجی میتواند یکی از مقادیر 100%، 20% و 2% باشد. این مقیاسبندی کمک میکند که خواندن خروجی سنسور با انواع فرکانس شمارها یا میکروکنترلرها با دقت بالایی انجام شود. در جدول زیر تنظیمات پایههای S0 و S1 گفته شده است:
S1 | S0 | مقیاس فرکانس خروجی |
L | L | حالت خاموشی |
H | L | 2% |
L | H | 20% |
H | H | 100% |
برای آردوینو، مقیاس فرکانس خروجی روی 20% تنظیم میشود. بنابراین، پایه S0 برابربا High و پایه S1 باید Low باشد.
تشخیص رنگ با آردوینو و TCS3200
در این مثال به شما آموزش داده میشود تا به کمک آردوینو و سنسور رنگ TCS3200 رنگها را تشخیص دهید. این سنسور دقت خیلی بالایی ندارد اما میتواند برای تشخیص رنگ در پروژههای ساده مفید باشد.
برای انجام این پروژه به سنسور تشخیص رنگ TCS3200 یا TCS230، آردوینو UNO و سیم جامپر نیاز دارید.
شماتیک طرح راه اندازی سنسور تشخیص رنگ:
اتصال سنسور TCS3200 به آردوینو بسیار ساده است. نحوه اتصالات سیمهای این پروژه در شکل زیر نشان داده شده است.
اتصال سنسور با آردوینو به این صورت است:
- SO : پایه دیجیتال 4
- S1 : پایه دیجیتال 5
- VCC :5V
- S3 : پایه دیجیتال 6
- S2 : پایه دیجیتال 7
- OUT : پایه دیجیتال 8
کد برنامه:
برای این راهاندازی ابتدا باید دو مرحله کدنویسی در محیط برنامهنویسی آردوینو را به آسانی پشتسر بگذاریم که آنها عبارتنداز:
- خواندن و نمایش فرکانس خروجی روی سریال مانیتور. با قرار دادن جسم با رنگهای مختلف روبهروی سنسور، مقادیر مختلف فرکانس روی سریال مانیتور نمایش داده میشود.
- متمایز کردن رنگهای مختلف از یکدیگر. مقدار فرکانسی که در کد قبل به دست آمده است برای متمایز کردن رنگهای مختلف استفاده میشود و رنگهای قرمز، سبز و آبی از یکدیگر متمایز میشوند.
1. خواندن فرکانس خروجی
در این مرحله کد زیر را روی برد آردوینو خود آپلود کنید.
// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);
// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Begins serial communication
Serial.begin(9600);
}
void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);
// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redFrequency);
delay(100);
// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);
// Printing the GREEN (G) value
Serial.print(" G = ");
Serial.print(greenFrequency);
delay(100);
// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);
// Printing the BLUE (B) value
Serial.print(" B = ");
Serial.println(blueFrequency);
delay(100);
}
بعد انتقال تکه کد بالا، سریال مانیتور آردوینو را باز کنید و بادریت را روی 9600 تنظیم کنید. یک جسم آبی را در فواصل مختلف روبهروی سنسور قرار دهید. شما باید خروجی را در دو حالت مختلف ذخیره کنید: یک حالت، موقعی که جسم از سنسور دور است و حالت دیگر، زمانی که جسم به سنسور نزدیک است.
سپس مقادیر نشان داده شده روی سریال مانیتور را بررسی کنید. فرکانس آبی (B) باید در مقایسه با قرمز (R) و سبز (G) کمتر باشد. شکل زیر خروجی سنسور روی سریال مانیتور را نشان میدهد.
متوجه میشوید که با قرار دادن جسم آبی رنگ در مقابل سنسور، فرکانس آبی (B) بین دو مقدار 59 و 223 (در شکل بالا مشخص شده است) تغییر میکند.
توجه: شما نمیتوانید از دو مقدار 59 و 223 در برنامه خود استفاده کنید. شما باید این مقادیر را برای سنسور و جسم خود به دست بیاورید و کمترین و بیشنرین فرکانس برای رنگ آبی را یادداشت کنید. زیرا در ادامه به آن نیاز خواهید داشت. مراحل گفته شده را برای جسمهای قرمز و سبز رنگ نیز انجام دهید و دو حد بالایی و پایینی فرکانس خروجی را برای هر رنگ یادداشت کنید.
متمایز کردن رنگهای مختلف از یکدیگر
این برنامه مقادیر فرکانس خروجی را به یک مقدار RGB نگاشت میکند. (این مقادیر بین 0 و 255 است)
در بخش قبل زمانی که جسم آبی به سنسور نزدیک بود و سنسور بیشترین نور آبی را دریافت میکرد، مقدار فرکانس خروجی 59 و زمانی که جسم از سنسور فاصله زیادی داشت، مقدار فرکانس خروجی 223 به دست آمد.
بنابراین در RGB، فرکانس 59 با 255 و فرکانس 223 با 0 متناظر است. نگاشت با تابع map() انجام میشود. فقط کافی است در کد زیر در تابع map() پارامترهای XX را با مقادیر خودتان جایگزین کنید.
// TCS230 or TCS3200 pins wiring to Arduino
#define S0 4
#define S1 5
#define S2 6
#define S3 7
#define sensorOut 8
// Stores frequency read by the photodiodes
int redFrequency = 0;
int greenFrequency = 0;
int blueFrequency = 0;
// Stores the red. green and blue colors
int redColor = 0;
int greenColor = 0;
int blueColor = 0;
void setup() {
// Setting the outputs
pinMode(S0, OUTPUT);
pinMode(S1, OUTPUT);
pinMode(S2, OUTPUT);
pinMode(S3, OUTPUT);
// Setting the sensorOut as an input
pinMode(sensorOut, INPUT);
// Setting frequency scaling to 20%
digitalWrite(S0,HIGH);
digitalWrite(S1,LOW);
// Begins serial communication
Serial.begin(9600);
}
void loop() {
// Setting RED (R) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,LOW);
// Reading the output frequency
redFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the RED (R) frequency from 0 to 255
// You must replace with your own values. Here's an example:
// redColor = map(redFrequency, 70, 120, 255,0);
redColor = map(redFrequency, XX, XX, 255,0);
// Printing the RED (R) value
Serial.print("R = ");
Serial.print(redColor);
delay(100);
// Setting GREEN (G) filtered photodiodes to be read
digitalWrite(S2,HIGH);
digitalWrite(S3,HIGH);
// Reading the output frequency
greenFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the GREEN (G) frequency from 0 to 255
// You must replace with your own values. Here's an example:
// greenColor = map(greenFrequency, 100, 199, 255, 0);
greenColor = map(greenFrequency, XX, XX, 255, 0);
// Printing the GREEN (G) value
Serial.print(" G = ");
Serial.print(greenColor);
delay(100);
// Setting BLUE (B) filtered photodiodes to be read
digitalWrite(S2,LOW);
digitalWrite(S3,HIGH);
// Reading the output frequency
blueFrequency = pulseIn(sensorOut, LOW);
// Remaping the value of the BLUE (B) frequency from 0 to 255
// You must replace with your own values. Here's an example:
// blueColor = map(blueFrequency, 38, 84, 255, 0);
blueColor = map(blueFrequency, XX, XX, 255, 0);
// Printing the BLUE (B) value
Serial.print(" B = ");
Serial.print(blueColor);
delay(100);
// Checks the current detected color and prints
// a message in the serial monitor
if(redColor > greenColor && redColor > blueColor){
Serial.println(" - RED detected!");
}
if(greenColor > redColor && greenColor > blueColor){
Serial.println(" - GREEN detected!");
}
if(blueColor > redColor && blueColor > greenColor){
Serial.println(" - BLUE detected!");
}
}
برای متمایز کردن رنگهای مختلف سه حالت وجود دارد:
- وقتی R بیشترین مقدار را در بین مقادیر RGB دارد، جسم مقابل سنسور قرمز رنگ است.
- وقتی G بیشترین مقدار را دارد، جسم مقابل سنسور سبز رنگ است.
- وقتی B بیشترین مقدار را دارد، جسم مقابل سنسور آبی رنگ است.
حالا یک جسم دلخواه مقابل سنسور قرار دهید، رنگ تشخیص داده شده برای جسم باید در سریال مانیتور نمایش داده شود: قرمز، سبز یا آبی.
توجه: با افزایش تعداد جملات شرطی در کد خود میتوانید رنگهای دیگر که ترکیبی از این سه رنگ هستند را نیز با سنسورتان تشخیص دهید.
جمع بندی:
در این مقاله به آموزش تشخیص رنگ توسط سنسور TCS3200 و آردوینو پرداخته شد. شما میتوانید تنها با اضافه کردن یک سرو موتور به این پروژه، یک دستگاه دستهبندی بر اساس رنگ بسازید.
به نظر شما چه پروژههای دیگری با این سنسور میتوان انجام داد؟
نظرات و سوالات خودتان را در مورد این آموزش با ما در میان بگذارید.