ساخت سنسور تشخیص رنگ

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