وجود رنگ های متنوع در زندگی علاوه بر زیبایی، نشاط و القای حس خوب کاربرد دیگری هم دارند که برای مهندس ها همیشه جذابیت ویژه ای داشته ! آن هم قابلیت متمایز کردن اشیاء است..
طبق عرف همیشگی، گرانی های بازار دامان الکترونیکی ها را هم گرفته و هزینه ساخت محصولات با محاسبه ی حداکثر انصاف، به سه برابر رسیده ! که برای همین می خواهم راجع به روشی برای تشخیص رنگ از نوع ارزون، تماسی و با قابلیت اطمینان بالا صحبت کنم. شاید کسب و کار های غولی که محصولات گران قیمت تولید می کنن، سنسور رنگ ۱۰ هزار تومانی برایشان ایده آل باشد چرا که هم دردسر کمتری دارد و هم قابلیت اطمینان بالایی دارد.
راجع به نحوه کار سنسورهای آشکارساز رنگ ملموس ترین مثالی که می تونم مطرح کنم دوربین گوشی شماست ! تاحالا فکر کردین این دوربین چطوری یک عکس میگیره که کلی رنگ داخلش هست ؟ در واقع سنسور دوربین عکاسی متشکل از میلیون ها سنسور رنگ هست که بصورت آرایه ای کنار هم چیده شدند. و با ذخیره رنگ هر پیکسل باعث بوجود آمدن عکس های دیجیتالی میشود. البته تا اینجای کار من همه ی پیچیدگی های داستان (مثل لنز و ...) را بخاطر بی ربط بودن به موضوع دور زدم.
حالا این سنسورها چطور رنگ را تشخیص می دهند؟ چرا دوربین سیب قرمز را قرمز و سیب سبز را سبز نشان میدهد !؟ مسئله غم انگیزی که وجود داره اینکه اصلا یک سیب قرمز و یک سیب سبز وجود نداره ! در واقع یکی از سیب ها شدت نور قرمز را بیشتر و سیب دیگری شدت نور سبز را بیشتر بازتابش می کند ! ( علمی تر: طول موج متفاوتی را بازتابش می کنند).
اینجاست که مهندس ها سریعاً بساط سوء استفاده را پهن می کنند !! در واقع سنسور رنگ چیزی نیست جز سه عدد سنسور شدت نور (مثل سنسورهای فتورزیست LDR) + سه عدد فیلتر رنگ های اصلی (قرمز، سبز، آبی) + مبدل ADC .. پس نوری که به هر پیکسل دوربین میرسد از فیلترهای رنگی عبور کرده سپس شدت نورش توسط ADC دیجیتالی شده و ذخیره میشود. به عنوان مثال اگر نور قرمز وارد سلول دوربین شود فیلتر های سبز و آبی آن را جذب کرده و شدت نور کمتری را به سنسور می تابانند همینطور فیلتر قرمز نور قرمز را کامل از خود عبور داده و حسگر متناظرش مقدار بزرگتری از نور را دریافت می کند.
خب ! بعد از کلی ماجرا و داستان سرایی بریم که ما هم از زیبایی مسئله استفاده کنیم ! حالا از آنجایی که ما درحال ساخت سنسور تماسی هستیم و دسترسی به فیلترهای رنگی با کیفیت نداریم (که احتمالا گرون هم هستن) پس دوگان قضیه را پیاده سازی میکنیم. به اینصورت که به جای ۳ عدد فیلتر، ۳ عدد LED قرمز، سبز، آبی و همچنین بجای ۳ عدد LDR (فتوسل) از یک عدد فتوسل استفاده میکنیم.
برای اینکه نور محیط دقت سنجش را کم نکنه از یک محفظه مات پلاستیکی استفاده می کنیم.
روش کار به این صورت هست که هر کدام از رنگ های اصلی به مدت معقولی (توضیح میدم) روشن شود، به سطح رنگی مورد نظر بتابد سپس بازتابش توسط LDR اندازه گیری شود. حال درجه ای از شدت نور ها برای قرمز سبز و آبی بدست آوردیم، که این اعداد شناسنامه رنگ آن سطح برای ما محسوب میشود !
حالا منظور از مدت معقول روشن شدن ال ای دی ها چیست ؟ در واقع فتوسل های موجود در بازار یک مولفه rise time و fall time دارند که بیانگر زمان واکنش خروجی LDR به نور دریافتی هست که معمولا هر کدام حدود ۳۰ میلی ثانیه میباشد که میتوان مدت معقول را همین مقدار برای روشن شدن و خاموش شدن در نظر گرفت.(از مدت روشن شدت LED ها صرف نظر شد).
من برای تست از چه چیزایی استفاده کردم ؟
میرسیم به بخش جذاب توضیحات نرم افزاری که اول از همه یک نوع داده به اسم rgb_color_t تعریف می کنیم که در واقع تمام خواسته های ما را به زیبایی بیان می کند.
چون برای من تشخیص دوازده رنگ متمایز کافی و حتی زیاد هم بود از ADC در رزولوشن ۸ بیتی استفاده کردم و برای همین هم دیتاتایپ های uint8_t اختیار شده است. فکر میکنم ممبرهای struct نیازی به توضیح نداشته باشد، چون اسم های با مسمایی دارند.
حالا باید سنسور را روی رنگ های مختلف قرار داد و مقادیر را ثبت کنیم. می توان این کار را هم اتوماتیک توسط برنامه انجام داد که من برای راحتی فعلا اطلاعات را دستی ذخیره کردم.
حالا که مقادیر رنگ ها همراه با آیدی و اسم ۴حرفی را در ساختمان داده ی خودمان مقداردهی کردیم میریم سراغ تابعی که رنگ مجهول را با رنگ های از قبل ثبت شده مقایسه کنه و نتیجه را اعلام کنه.
آخرین تابع هم که مربوط به نمونه گیری از LDR و روشن کردن LED ها هست در شکل زیر قرار دادم.( این تابع به گونه ای نوشته شده که باعث سادگی و قابل فهم شدن منطق برنامه شود و ابدا بهینه نیست !)
امیدوارم مطلب برایتان مفید بوده باشه بزودی برنامه بهینه شده را در گیت ام آپلود میکنم و لینک اش را اینجا قرار می دهم.
اشکان انوشه
ashkan.anousheh@gmail.com