در این مقاله با استفاده از سنسور رنگ BH1745 مقادیر رنگ های اصلی قرمز، سبز و آبی نور مورد نظر را اندازه گیری می کنیم و بر اساس آن می توانیم رنگ نور را تشخیص دهیم.
سنسور BH1745 به صورت یک آیسی با بدنه شفاف و ساخت Rohm در فروشگاه موجود است. این سنسور در ابعاد کوچک بسیار کاربردی است. این سنسور شامل همه مدارهای مورد نیاز برای اندازه گیری رنگ های اصلی و ارتباط با میکروکنترلرها و مینی کامپیوترهاست. بنابراین با تعداد کمی قطعه در کنار این سنسور می توان رنگ نور تابیده شده به سنسور را تشخیص داد.
ولتاژ تغذیه این سنسور بین 2.3 ولت الی 3.6 ولت است. برای راحتی کار می توان از ولتاژ 3.3 برای سنسور و میکروکنترلر استفاده کرد. شکل زیر مدار مورد نیاز برای راه اندازه و خواندن خروجی سنسور را نشان می دهد. از یک عدد خازن برای فیلتر کردن تغذیه سنسور استفاده شده است. با توجه به اینکه پورت ارتباطی سنسور از نوع I2C است، دو عدد مقاومت Pull-Up بر روی خطوط SDA و SCL قرار گرفته است. برای استفاده از وقفه، پایه INT نیز به میکرو متصل شده است.
در داخل سنسور 4 عدد فتودیود قرار گرفته اند که سه عدد از آن ها دارای فیلترهای رنگ های اصلی هستند و یکی از آن ها بدون فیلتر است. سنسور دارای مبدل آنالوگ به دیجیتال 16 بیتی داخلی است و اطلاعات رنگ ها را با رزولوشن 16 بیت در اختیار کاربر قرار می دهد.
ارتباط با سنسور
سنسور BH1745 دارای یک بانک رجیستر قابل خواندن نوشتن 21 عددی است. همه رجیسترها 8 بیتی هستند. اطلاعات حاصل از 4 فتودیود داخل سنسور 16 بیتی هستند و در 8 عدد از این رجسترها ذخیره شده اند. برای خواندن این اطلاعات باید آدرس رجیستر مورد نظر به سنسور ارسال کنیم. پس از آن سنسور اطلاعات مورد نظر را آماده می کند و با خواندن اطلاعات از سنسور، محتوای رجیستری که آدرس آن ارسال شده بود، خوانده خواهد شد. برای نوشتن بر روی رجیسترهای تنظیمات این سنسور نیز کافی است که آدرس و محتوای رجیستر به سنسور ارسال شود.
نوشتن اطلاعات بر روی رجیسترهای سنسور
برای این کار کافی است که آدرس سنسور، آدرس رجیستر مورد نظر و سپس اطلاعات مورد نظر به سنسور ارسال شود. رشته ی اطلاعات لازم به صورت زیر خواهد بود.
خواندن اطلاعات از رجیسترهای سنسور
با توجه به اینکه در پروتکل I2C امکان ارسال اطلاعات و خواندن اطلاعات در یک عملیات امکان پذیر نیست، برای خواندن رجیسترهای سنسور ابتدا باید Master (در اینجا میکروکنترلر) در یک عملیات نوشتن، آدرس رجیستر مورد نظر را به سنسور اعلام کند. سپس یک عملیات خواندن را شروع کند. در این عملیات، محتوای رجیستری که آدرس آن به سنسور اعلام شده بود خوانده می شود. در صورتی که عملیات خواندن بعدی اجرا شود، به طور پیش فرض عدد یک به آدرس قبلی اضافه شده و رجیستر بعدی خوانده خواهد شد. عملیات خواندن اطلاعات از رجیسترهای سنسور در شکل زیر نشان داده شده است.
استفاده از قابلیت سنسور در اضافه کردن آدرس به طور خودکار، موجب افزایش سرعت خواندن اطلاعات فتودیودهای داخل سنسور خواهد شد زیرا نیازی نیست که آدرس 16 رجیستر به طور مجزا به سنسور ارسال شود بلکه با توجه به پشت سر هم بودن رجیسترهای مربوط به اطلاعات رنگ، آدرس ابتدایی ترین رجیستر به سنسور اعلام شده و سپس 16 بار عملیات خواندن انجام می شود. در این صورت اطلاعات 16 بیتی 4 سنسور خوانده خواهد شد.
پردازش اطلاعات سنسور
حساسیت فتودیودهای سنسور به یک اندازه نیستند. این موضوع در نمودار زیر که از دیتاشیت گرفته شده به خوبی نشان داده شده است. بنابراین بعد از خواندن اطلاعات فتودیودها لازم است که این مقادیر استاندارد شوند.
یک راه ساده برای استاندارد کردن این مقادیر آن است که از روی نمودار میزان ماکزیمم حساسیت فتودیودهای رنگ آبی و قرمز و سبز استخراج شوند. این مقادیر به صورت تقریبی به صورت زیر است. بنابراین برای استاندارد کردن مقادیر می توان به صورت زیر عمل کرد:
G=1, R=0.72, B=0.56
با معکوس کردن مقادیر بالا ضرایب به صورت زیر بدست می آیند:
ضریب برای استاندارد کردن مقادیر قرمز: 1.39
ضریب برای استاندارد کردن مقادیر آبی: 1.79
ضریب برای استاندارد کردن مقادیر سبز: 1.0
بعد از استاندارد کردن مقادیر قرمز و سبز و آبی، بر اساس میزان آن ها می توان رنگ نور تابیده شده به سنسور را تشخیص داد.
مراحل برنامه نویسی برای سنسور
بر روی رجیستر با ادرس 0x42 برای اجرای یک اندازه گیری جدید بنویسید:
برای شروع یک اندازه گیری با گین (بهره) برابر 1 عدد 0x10 و برای شروع اندازه گری با گین 16 عدد 0x12 را بنویسید.
حدود یک ثانیه صبر کنید
آدرس 0x50 را برای شروع خواندن اطلاعات رنگ ها بنویسید
16 بایت اطلاعات فتودیودها را بخوانید(به صورت بایت به بایت)
مقادیر خوانده شده را در متغیرهای 16 بیتی ذخیره کنید.
مقادیر ذخیره شده را استاندارد کنید.(نیاز به متغیر اعشاری دارید)