تشخیص رنگ با Raspberry Pi و سنسور TCS3200

 

در این پروژه می خواهیم رنگها را با استفاده از ماژول حسگر رنگی TCS3200 و به همراه برد Raspberry Pi شناسایی کنیم. ما برای این کار از زبان برنامه نویسی پایتون کمک گرفتیم و برنامه به این زبان نوشته شده است. برای نشان دادن تشخیص رنگی که ما از LED RGB استفاده کرده ایم، LED RGB  می تواند رنگهای مختلفی تولید کند و به همین دلیل آن را کنار سنسور قرار دادیم..در حال حاضر ما از Raspberry Pi برای شناسایی رنگ های قرمز ، سبز و آبی برنامه ریزی کرده ایم.اما شما می توانید پس از دریافت مقادیر RGB ، آن را برای تشخیص هر رنگی برنامه ریزی کنید ، زیرا هر رنگی از اجزای RGB تشکیل شده است.

سنسور رنگ TCS3200:

TCS3200 یک سنسور رنگی است که می تواند با داشتن برنامه نویسی صحیح ، هر تعداد رنگ را تشخیص دهد. TCS3200 همانطور که در شکل نشان داده شده است ، می توان باکس های مربعی را روی حسگر دید. این باکس های مربعی آرایه هایی از ماتریس RGB است. هر یک از این باکس ها دارای سه سنسور برای سنجش شدت نور قرمز ، سبز و آبی هستند.

بنابراین ما آرایه های قرمز ، آبی و سبز را در یک لایه داریم وهنگام شناسایی رنگ ، نمی توانیم هر سه عنصر را بطور همزمان تشخیص دهیم.برای تشخیص رنگ ، هر یک از این آرایه های سنسور یکی پس از دیگری جداگانه انتخاب می شوند.ماژول را می توان برای تشخیص رنگ خاص و حذف  سایر رنگ ها برنامه ریزی کرد.

 

قطعات مورد نیاز:

برد Raspberry Pi

ماژول سنسور TCS3200

آی سی شمارنده CD4040

RGB LED

مقاومت ۱ کیلو اهم (۳ عدد)

خازن ۱۰۰۰uF

 

مدار و اتصالات:

توضیحات کار:

هر رنگ از سه رنگ قرمز ، سبز و آبی (RGB) تشکیل شده است. و اگر شدت RGB را در هر رنگی بدانیم، می توانیم آن رنگ را تشخیص دهیم.

با استفاده از سنسور رنگی  TCS3200، ما نمی توانیم به طور همزمان نور قرمز ، سبز و آبی را تشخیص دهیم بنابراین باید رنگ ها را یکی یکی بررسی کنیم. رنگی که باید توسط سنسور رنگ تشخیص داده شود توسط دو پایه S2 و S3 انتخاب می شود. با استفاده از این دو پین ، می توانیم به سنسور بگوییم که کدام شدت نور رنگ را اندازه گیری کند.

اگر نیاز به شدت رنگ قرمز داریم ، باید هر دو پایه را روی LOW تنظیم کنیم. پس از اندازه گیری نور RED ، S2 LOW  و  S3 HIGH  را برای اندازه گیری میزان نور آبی تنظیم خواهیم کرد. با تغییر متوالی  S2 و S3 می توان شدت نور قرمز ، آبی و سبز را مطابق جدول ذیل در نظر گرفت:

 

 

هنگامی که سنسور شدت نور RGB را تشخیص دهد ، مقدار آن همانطور که در شکل زیر نشان داده شده است به سیستم کنترل داخل ماژول ارسال می شود. شدت نور اندازه گیری شده در آرایه ای به مبدل جریان به فرکانس در داخل ماژول ارسال می شود. مبدل فرکانس موج مربعی تولید می کند که فرکانس آن به طور مستقیم با مقدار ارسال شده توسط آرایه متناسب است. با مقدار بالاتر از ARRAY ، مبدل جریان به فرکانس موج مربع فرکانس بالاتر را تولید می کند.

 

فرکانس سیگنال خروجی توسط ماژول سنسور رنگ را می توان در چهار سطح تنظیم کرد. این سطوح با استفاده از S0 و S1 ماژول سنسور مطابق شکل زیر انتخاب می شوند.

این ویژگی وقتی مفید است که ما این ماژول را با کلاک کم به سیستم وصل کنیم. با Raspberry Pi 100٪ انتخاب خواهیم کرد. به یاد داشته باشید
اگرچه این ماژول موج مربعی خروجی را ارائه می دهد که فرکانس آن به طور مستقیم با شدت نور همخوانی دارد، اما روش ساده ای برای محاسبه شدت نور هر رنگ توسط این ماژول وجود ندارد. با این حال می توانیم بگوییم که شدت نور برای هر رنگ در حال افزایش است یا کاهش است. همچنین می توان مقادیر قرمز ، سبز ، آبی را برای محاسبه و مقایسه رنگ نور یا رنگ از پیش تعیین شده شیء در سطح ماژول محاسبه و مقایسه کرد. بنابراین این بیشتر از ماژول سنسور رنگی است نه ماژول حسگر روشنایی.

ما نمی توانیم این موج مربعی را مستقیماً به Raspberry Pi بدهیم ، زیرا Raspberry Pi هیچ Counter داخلی ندارد. بنابراین ابتدا این خروجی را به CD4040  Counter Binary می دهیم و Raspberry Pi را برنامه ریزی می کنیم تا مقدار فرکانس را از در فواصل دوره ای۱۰۰ میلی ثانیه  بگیرد.

بنابراین PI مقادیر ۲۵۰۰/۱۰ = ۲۵۰ را برای هر رنگ قرمز ، سبز و آبی می خواند. ما همچنین Raspberry Pi را برای نمایش رنگ ها و شدت آن برنامه ریزی کرده ایم.

در اینجا مقادیر پیش فرض مقادیر RGB هستند که بدون قرار دادن هیچ شیء در مقابل سنسور گرفته شده اند. این به شرایط نور اطراف بستگی دارد و این مقادیر با توجه به محیط متفاوت می توانند تغییر کنند. در اصل ما برای مقادیر استاندارد سنسور را کالیبره می کنیم. بنابراین ابتدا برنامه را بدون قرار دادن هر شیء اجرا کنید و به خوانش ها توجه کنید. این مقادیر نزدیک به صفر نمی شوند زیرا همیشه مهم نیست که نور آن بر روی سنسور افتاده باشد. سپس آن مقادیر خوانده شده را از مقادیری که پس از قرار دادن یک شی برای آزمایش به دست می آوریم ، کم کنیم. از این طریق می توان مقادیر استاندارد را دریافت کرد.

 

 

#working
import time
import RPi.GPIO as IO

IO.setmode (IO.BCM)
IO.setwarnings(False) #do not show any warnings

x=0
IO.setup(6,IO.OUT #pins 6,5,… are set as output
IO.setup(5,IO.OUT)
IO.setup(27,IO.OUT)
IO.setup(17,IO.OUT)
IO.setup(13,IO.OUT)
IO.setup(22,IO.OUT)
IO.setup(26,IO.OUT)

IO.setup(21,IO.IN) #pins 21,20… are set as input
IO.setup(20,IO.IN)
IO.setup(16,IO.IN)
IO.setup(12,IO.IN)
IO.setup(25,IO.IN)
IO.setup(24,IO.IN)
IO.setup(23,IO.IN)
IO.setup(18,IO.IN)

while 1:
IO.output(6,0) #choose red array by putting S2 and S3 low
IO.output(5,0)
time.sleep(0.1)
IO.output(26,1) #reset counter one time
time.sleep(0.2)
IO.output(26,0)
IO.output(22,0) #enable output of module for 100msec for counter to read frequency
time.sleep(0.01)
IO.output(22,1)
if(IO.input(21)==True):
x=1
if(IO.input(20)==True):
x=x+2
if(IO.input(16)==True):
x=x+4
if(IO.input(12)==True):
x=x+8
if(IO.input(25)==True):
x=x+16
if(IO.input(24)==True):
x=x+32
if(IO.input(23)==True):
x=x+64
if(IO.input(18)==True):
x=x+128
print("Red=") #detect value counted by counter
R = x-50
print(R)
x=0

IO.output(6,0) #choose blue array
IO.output(5,1)
time.sleep(0.1)
IO.output(26,1) #reset counter one time
time.sleep(0.2)
IO.output(26,0)
IO.output(22,0) #enable output of module for 100msec for counter to read frequency
time.sleep(0.01)
IO.output(22,1)
if(IO.input(21)==True):
x=1
if(IO.input(20)==True):
x=x+2
if(IO.input(16)==True):
x=x+4
if(IO.input(12)==True):
x=x+8
if(IO.input(25)==True):
x=x+16
if(IO.input(24)==True):
x=x+32
if(IO.input(23)==True):
x=x+64
if(IO.input(18)==True):
x=x+128
print("Blue=") #detect value counted by counter
B = x-20
print(B)
x=0

IO.output(6,1) #choose green array
IO.output(5,1)
time.sleep(0.1)
IO.output(26,1) #reset counter one time
time.sleep(0.2)
IO.output(26,0)
IO.output(22,0) #enable output of module for 100msec for counter to read frequency
time.sleep(0.01)
IO.output(22,1)
if(IO.input(21)==True):
x=1
if(IO.input(20)==True):
x=x+2
if(IO.input(16)==True):
x=x+4
if(IO.input(12)==True):
x=x+8
if(IO.input(25)==True):
x=x+16
if(IO.input(24)==True):
x=x+32
if(IO.input(23)==True):
x=x+64
if(IO.input(18)==True):
x=x+128
print("Green=") #detect value counted by counter
G=x-42
print(G)
x=0
print
print
print
print
print
print

if((R>=B+10)and(R>=G+10)): #if RED color intensity is high light RED led
IO.output(17,0)
elif((G>=B+10)and(G>=R+10)): #if GREEN color intensity is high light GREEN led
IO.output(13,0)
elif((B>=R+10)and(B>=G+10)): #if BLUE color intensity is high light BLUE led
IO.output(27,0)

time.sleep(2) #after 2 sec turn off LEDs
IO.output(17,1)
IO.output(13,1)
IO.output(27,1)

 

محمد صداقتی

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *