پروژه‌ی Arduino با سنسور BU27006MUC

هدف این پروژه چیست؟

هدف این پروژه، BU27006MUCZ سنسور نور محیط را با یک Arduino برای اندازه‌گیری و پایش شدت نور در محیط‌های مختلف، واسط کردن است. این سنسور، با ارائه‌ی قرائت‌های دقیق در واحد lux، آن را برای کاربردهایی مانند کنترل خودکار روشنایی، تنظیم روشنایی صفحه‌نمایش و پایش محیطی مناسب می‌سازد. کاربران می‌توانند با خواندن داده‌های شدت نور به‌صورت real-time، سیستم‌هایی طراحی کنند که در محیط‌های هوشمند، با بهره‌وری انرژی بالا و قابلیت استفاده‌ی بهتر، به شرایط نوری متغیر پاسخ می‌دهند.

در این آموزش چه چیزهایی خواهیم آموخت؟

پیاده‌سازی پروژه‌های مبتنی بر سنسور برای کنترل خودکار روشنایی و پایش محیطی، و ارتقاء مهارت در ساخت سیستم‌هایی که بر اساس شدت نور واکنش نشان می‌دهند.

اتصال BU27006 سنسور نور محیط به Arduino و برقراری ارتباط از طریق I2C.

استفاده از یک library موجود برای سازگاری BU27006 با Arduino و کسب دانش در مورد پردازش داده‌ها از طریق I2C.

اندازه‌گیری سطح نور محیط با استفاده از سنسور به واحد lux و تفسیر داده‌ها برای کاربردهای عملی.

برای شروع این پروژه به چه چیزهایی نیاز داریم؟

برای اجرای این پروژه به سخت‌افزار و نرم‌افزار نیاز داریم. عناوین این سخت‌افزارها و نرم‌افزارها در جدول زیر به شما ارائه شده است و می‌توانید با کلیک بر روی هر یک، آن را تهیه/دانلود کرده و برای شروع آماده شوید.

سخت افزارهای مورد نیازنرمافزارهای مورد نیاز
Arduino ProgrammerArduino IDE
Arduino Development Board- ( Arduino UNO )
ماژول تشخیص رنگ دیجیتال Gebra BU27006MUC

GebraMS برای راحتی شما، کتابخانه‌های ویژه‌ای را برای اکثر پروژه‌های آردوینو آماده کرده است.
شما باید کتابخانه آماده شده توسط GebraMS را دانلود کرده و آن را به Arduino IDE خود اضافه کنید.

ابتدا، همان‌طور که در تصویر زیر دیده می‌شود، ماژول Gebra BU27006MUCZ را به Arduino UNO به این صورت متصل می‌کنیم:

سورس کد

کتابخانه پروژه (Library)

جبرابیت علاوه بر طراحی ماژولار انواع حسگرها و قطعات مجتمع، برای سهولت در نصب و توسعه نرم‌افزار توسط کاربران، مجموعه‌ای از کتابخانه‌های ساختاریافته و مستقل از سخت‌افزار را به زبان C ارائه می‌دهد. در این راستا، کاربران می‌توانند کتابخانه‌ی مربوط به ماژول مورد نظر خود را در قالب فایل‌های “.h” و “.c” دانلود کنند.

با افزودن کتابخانه‌ی ارائه‌شده توسط جبرابیت به پروژه (راهنمای افزودن فایل به پروژه)، می‌توانیم به‌راحتی کد خود را توسعه دهیم. فایل‌های مربوطه را می‌توانید در انتهای پروژه یا در بخش صفحات مرتبط در سمت راست مشاهده کنید.

تمام توابع تعریف‌شده در کتابخانه با جزئیات کامل توضیح داده شده‌اند و کلیه پارامترهای ورودی و مقادیر بازگشتی هر تابع به‌صورت مختصر شرح داده شده است. از آنجا که این کتابخانه‌ها مستقل از سخت‌افزار هستند، کاربر می‌تواند آن‌ها را به‌سادگی به کامپایلر دلخواه خود اضافه کرده و با میکروکنترلر یا برد توسعه مورد نظر خود استفاده کند.

USER REGISTER MAP

نقشه رجیستر یا دستورات سنسور در این بخش تعریف شده‌اند:

C
/************************************************
 *              USER REGISTER MAP               *
 ***********************************************/
#define BU27006MUCZ_SYSTEM_CONTROL       0x40
#define BU27006MUCZ_MODE_CONTROL1        0x41
#define BU27006MUCZ_MODE_CONTROL2        0x42
#define BU27006MUCZ_MODE_CONTROL3        0x43
#define BU27006MUCZ_RED_DATA             0x50  // 2 byte
#define BU27006MUCZ_GREEN_DATA           0x52  // 2 byte
#define BU27006MUCZ_BLUE_DATA            0x54  // 2 byte
#define BU27006MUCZ_IR_DATA              0x56  // 2 byte
#define BU27006MUCZ_FLICKER_DATA         0x58  // 2 byte
#define BU27006MUCZ_FLICKER_COUNTER      0x5A
#define BU27006MUCZ_FIFO_LEVEL           0x5B
#define BU27006MUCZ_FIFO_DATA            0x5C  // 2 byte
#define BU27006MUCZ_MANUFACTURER_ID      0x92
#define BU27006MUCZ_ADDRESS              0x38
/*----------------------------------------------*
 *           USER REGISTER MAP End              *
 *----------------------------------------------*/

BU27006MUCZ _Ability Enum

این enum برای فعال‌سازی و غیرفعال‌سازی بخش‌های مختلف سنسور استفاده می‌شود:

C
 typedef enum Ability
 {
 	Disable = 0 ,
 	Enable
 }BU27006MUCZ_Ability;

BU27006MUCZ _Reset_Status Enum

با استفاده از این enum، وضعیت ریست سنسور تعیین می‌شود:

C
typedef enum
{
	FAILED = 0 ,
	DONE
}BU27006MUCZ_Reset_Status;

BU27006MUCZ_ RGB_Gain Enum

مقادیر این enum برای تنظیم تقویت‌کننده RGB سنسور استفاده می‌شوند:

C
 typedef enum RGB_Gain
 {
   RGB_GAIN_1X   = 0,
   RGB_GAIN_4X   = 1,
   RGB_GAIN_32X  = 2,
   RGB_GAIN_128X = 3,
 } BU27006MUCZ_RGB_Gain;

BU27006MUCZ_FLC_Gain Enum

مقادیر این enum برای تنظیم FLC gain سنسور استفاده می‌شوند:

C
 typedef enum FLC_Gain
  {
    FLC_GAIN_1X   = 0,
    FLC_GAIN_2X   = 1,
    FLC_GAIN_4X   = 2,
    FLC_GAIN_8X   = 3,
    FLC_GAIN_16X  = 4,
    FLC_GAIN_32X  = 5
  } BU27006MUCZ_FLC_Gain;

BU27006MUCZ_Interrupt_Channel Enum

برای تنظیم منبع وقفه در سنسور، از مقادیر این enum استفاده می‌شود:

C
 typedef enum Interrupt_Channel
 {
 	CLEAR_CHANNEL = 0 ,
 	ALS_CHANNEL
 }BU27006MUCZ_Interrupt_Channel;

BU27006MUCZ_Interrupt_Mode Enum

با استفاده از این enum، نوع وقفه سنسور انتخاب می‌شود:

C
 typedef enum Interrupt_Mode
 {
 	 INTERRUPT_DISABLE  ,
   RGB_IR_COMPELETION ,
   FLICKER_COMPELETION,
   FIFO_64_DATA_READY
 } BU27006MUCZ_Interrupt_Mode;

BU27006MUCZ_RGB_Measurement_Mode Enum

برای مشخص کردن حالت اندازه‌گیری RGB سنسور، از مقادیر این enum استفاده می‌شود:

C
 typedef enum RGB_Measurement_Mode
 {
 	_55_mS_MODE  = 1,
  _100_mS_MODE = 2
 } BU27006MUCZ_RGB_Measurement_Mode;

BU27006MUCZ_FLC_Measurement_Mode Enum

مقادیر این enum برای مشخص کردن حالت اندازه‌گیری FLC سنسور استفاده می‌شوند:

C
 typedef enum FLC_Measurement_Mode
 {
   _1_KHZ_MODE,
   _2_KHZ_MODE
 } BU27006MUCZ_FLC_Measurement_Mode;

BU27006MUCZ_Data_Status Enum

مقادیر این enum تعیین می‌کنند که داده‌های خوانده شده به‌روزرسانی شوند یا خیر:

C
 typedef enum Data_Status
 {
 	NOT_UPDATED = 0 ,
 	UPDATED
 }BU27006MUCZ_Data_Status;

BU27006MUCZ_Interrupt_Status Enum

مقادیر این Enum برای اطلاع از اینکه وقفه در سنسور انجام شده است یا خیر استفاده می‌شوند.

C
 typedef enum Interrupt_Status
 {
 	INTERRUPT_NOT_FULFILLED = 0 ,
 	INTERRUPT_FULFILLED
 }BU27006MUCZ_Interrupt_Status;

BU27006MUCZ struct

تمام خصوصیات سنسور، ضرایب کالیبراسیون و داده‌های سنسور در این «struct» تعریف شده‌اند و همه اطلاعات و تنظیماتی که روی سنسور اعمال می‌شوند در این «structure» ذخیره می‌شوند و می‌توانید تغییرات هر بخش از سنسور را در محیط «Debug Session» مشاهده کنید.

C
 typedef	struct BU27006MUCZ
  {
  	  uint8_t                       	 Register_Cache;
  	  uint8_t				             PART_ID;
  	  uint8_t							 MANUFACTURER_ID;
  	  BU27006MUCZ_Reset_Status			 RESET;
  	  BU27006MUCZ_Ability                RGB_IR;
  	  BU27006MUCZ_Ability                FLC;
  	  BU27006MUCZ_RGB_Gain               RGB_GAIN;
 	  BU27006MUCZ_RGB_Measurement_Mode   RGB_MEASUREMENT_MODE;
 	  BU27006MUCZ_FLC_Gain               FLC_GAIN;
 	  BU27006MUCZ_FLC_Measurement_Mode   FLC_MEASUREMENT_MODE;
 	  float								 ALS_RESOLUTION_TIME;
 	  BU27006MUCZ_Data_Status            RGB_DATA;
 	  BU27006MUCZ_Data_Status            FLC_DATA;
 	  BU27006MUCZ_Interrupt_Mode         INTERRUPT_MODE;
       BU27006MUCZ_Interrupt_Channel      INTERRUPT_CHANNEL;
 	  uint8_t         					 FLICKER_COUNTER;
 	  uint8_t                            FIFO_LEVEL;
 	  BU27006MUCZ_Interrupt_Status		 INTERRRUPT_STATUS;
 	  uint32_t                        	 INTERRUPT_UPPER_THRESHOLD;
 	  uint32_t                           INTERRUPT_LOWER_THRESHOLD;
 	  uint8_t 							 REGISTER_DATA[REGISTER_DATA_BUFFER_SIZE];
 	  uint16_t                           RED_DATA;
 	  uint16_t                           GREEN_DATA;
 	  uint16_t               			 BLUE_DATA;
 	  uint16_t               			 IR_DATA;
 	  uint16_t               			 FLICKER_DATA;
 	  uint16_t 							 FIFO_DATA[FIFO_DATA_BUFFER_SIZE];
         float 							 RED_LUX;
 		float 							 GREEN_LUX;
 		float 							 BLUE_LUX;
 }GebraBit_BU27006MUCZ;

Declaration of functions

در انتهای این فایل، تمام توابع مربوط به خواندن و نوشتن در رجیسترهای BU27006MUCZ، پیکربندی سنسور و دریافت داده‌ها از سنسور اعلام شده‌اند:

C
 extern void GB_BU27006MUCZ_Read_Reg_Data(uint8_t regAddr,  uint8_t *data)	;
  extern void GB_BU27006MUCZ_Burst_Read(uint8_t regAddr,  uint8_t *data, uint16_t byteQuantity);
  extern void GB_BU27006MUCZ_Read_Reg_Bits (uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t* data);
  extern void GB_BU27006MUCZ_Write_Command( uint8_t cmd);
  extern void GB_BU27006MUCZ_Write_Reg_Data(uint8_t regAddr,  uint8_t data)	;
  extern void GB_BU27006MUCZ_Burst_Write(uint8_t regAddr,  uint8_t *data, uint16_t byteQuantity)								;
  extern void GB_BU27006MUCZ_Write_Reg_Bits(uint8_t regAddr, uint8_t start_bit, uint8_t len, uint8_t data);
  /********************************************************
   *       Declare BU27006MUCZ Configuration Functions         *
  ********************************************************/
 extern void GB_BU27006MUCZ_Soft_Reset ( GebraBit_BU27006MUCZ * BU27006MUCZ )  ;
 extern void GB_BU27006MUCZ_RGB_Gain ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_RGB_Gain gain ) ;
 extern void GB_BU27006MUCZ_RGB_Measurement_Mode ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_RGB_Measurement_Mode mode )   ;
 extern void GB_BU27006MUCZ_FLC_Measurement_Mode ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_FLC_Measurement_Mode mode )   ;
 extern void GB_BU27006MUCZ_FLC_Gain ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_FLC_Gain gain ) ;
 extern void GB_BU27006MUCZ_RGB_IR ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_Ability rgb )   ;
 extern void GB_BU27006MUCZ_FLC ( GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_Ability flc );
 extern void GB_BU27006MUCZ_Interrupt(GebraBit_BU27006MUCZ * BU27006MUCZ , BU27006MUCZ_Interrupt_Mode mode)  ;
 extern void GB_BU27006MUCZ_Check_Data_Updated ( GebraBit_BU27006MUCZ * BU27006MUCZ )  ;
 extern void GB_BU27006MUCZ_Part_ID ( GebraBit_BU27006MUCZ * BU27006MUCZ  )  ;
 extern void GB_BU27006MUCZ_Manufacture_ID ( GebraBit_BU27006MUCZ * BU27006MUCZ  )  ;
 extern void GB_BU27006MUCZ_Flicker_Counter ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
 extern void GB_BU27006MUCZ_FIFO_Level ( GebraBit_BU27006MUCZ * BU27006MUCZ ) ;
 extern void GB_BU27006MUCZ_Read_FIFO_Flicker_Data ( GebraBit_BU27006MUCZ * BU27006MUCZ );
 extern void GB_BU27006MUCZ_initialize( GebraBit_BU27006MUCZ * BU27006MUCZ )  ;
 extern void GB_BU27006MUCZ_Configuration(GebraBit_BU27006MUCZ * BU27006MUCZ)  ;
 extern void GB_BU27006MUCZ_Read_RGB_IR_FLICKER(GebraBit_BU27006MUCZ * BU27006MUCZ);
 extern void GB_BU27006MUCZ_Color_Luminosity(GebraBit_BU27006MUCZ * BU27006MUCZ);
 extern void GB_BU27006MUCZ_Get_Data(GebraBit_BU27006MUCZ * BU27006MUCZ);

فایل منبع Gebra_BU27006MUCZ.c

این فایل که به زبان C نوشته شده است، تمامی توابع با جزئیات کامل به صورت کامنت شده‌اند و پارامترهای ورودی و مقادیر بازگشتی توابع به وضوح توضیح داده شده‌اند. بنابراین، فقط به همین توضیحات اکتفا می‌کنیم و کاربران را برای اطلاعات بیشتر مستقیماً به این فایل ارجاع می‌دهیم.


برنامه نمونه در Arduino

پس از اتصال ماژول به Arduino و افزودن کتابخانه به IDE، به مسیر زیر بروید:
File > Examples > Gebra_BU27006MUCZ > RGB


توضیح فایل نمونه

enum‌ها و توابع مورد نیاز ماژول Gebra BU27006MUCZ به ساختارها اضافه شده‌اند. در بخش بعدی، یک متغیر به نام BU27006MUCZ از نوع ساختار Gebra_BU27006MUCZ (که در هدر Gebra_BU27006MUCZ تعریف شده و در بخش توضیحات کتابخانه شرح داده شده است) برای پیکربندی ماژول Gebra BU27006MUCZ تعریف شده است:

C
GebraBit_BU27006MUCZ BU27006MUCZ;

در بخش بعدی کد نوشته شده، با استفاده از توابع
GB_BU27006MUCZ_initialize(&BU27006MUCZ_Module)
و
GB_BU27006MUCZ_Configuration(&BU27006MUCZ_Module)
ماژول Gebra BU27006MUCZ را تنظیم می‌کنیم و در نهایت در بخش حلقه while برنامه، داده‌ها از سنسور خوانده شده و مقادیر RED، BLUE، GREEN، IR و Flicker به‌صورت پیوسته دریافت می‌شوند:

C
void setup() {
    Wire.begin();           // Initialize the I2C bus
    Serial.begin(9600);     // Initialize serial communication for debugging

    GB_BU27006MUCZ_initialize(&BU27006MUCZ); // Initialize the BU27006MUCZ sensor
    GB_BU27006MUCZ_Configuration(&BU27006MUCZ); // Configure the BU27006MUCZ sensor
}

void loop() {
    GB_BU27006MUCZ_Get_Data(&BU27006MUCZ); // Read data from the sensor

    Serial.print("RED:   ");
    Serial.print(BU27006MUCZ.RED_LUX);
    Serial.println(" lx");

    Serial.print("GREEN: ");
    Serial.print(BU27006MUCZ.GREEN_LUX);
    Serial.println(" lx");

    Serial.print("BLUE:  ");
    Serial.print(BU27006MUCZ.BLUE_LUX);
    Serial.println(" lx");

    delay(2000); // Delay between readings
}

The Sample file code text:

C
#include "GebraBit_BU27006MUCZ.h"

GebraBit_BU27006MUCZ BU27006MUCZ;

void setup() {
    Wire.begin();           // Initialize the I2C bus
    Serial.begin(9600);     // Initialize serial communication for debugging

    GB_BU27006MUCZ_initialize(&BU27006MUCZ); // Initialize the BU27006MUCZ sensor
    GB_BU27006MUCZ_Configuration(&BU27006MUCZ); // Configure the BU27006MUCZ sensor
}

void loop() {
    GB_BU27006MUCZ_Get_Data(&BU27006MUCZ); // Read data from the sensor

    Serial.print("RED:   ");
    Serial.print(BU27006MUCZ.RED_LUX);
    Serial.println(" lx");

    Serial.print("GREEN: ");
    Serial.print(BU27006MUCZ.GREEN_LUX);
    Serial.println(" lx");

    Serial.print("BLUE:  ");
    Serial.print(BU27006MUCZ.BLUE_LUX);
    Serial.println(" lx");

    delay(2000); // Delay between readings
}

Arduino خود را به کامپیوتر وصل کنید و برد Arduino خود را انتخاب کنید.

سپس کد نمونه را تأیید (Verify) و آپلود (Upload) کنید.

بعد از آپلود کردن کد، سریال مانیتور را باز کنید و می‌توانید مقادیر سنسور را مشاهده کنید.

با نظرات خود به تیم جبرا در بهبود کیفیت کمک کنید

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

سبد خرید
پیمایش به بالا