پروژه مانیتور ضربان قلب Arduino با max30003- جبرابیت

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

    هدف از انجام این پروژه، آشنایی کامل با نحوه‌ی عملکرد و راه‌اندازی ماژول GebraBit MAX30003 به عنوان سنسور ECG (نوار قلب) و اندازه‌گیری سیگنال‌های بیوپتانسیل با استفاده از برد Arduino UNO است.

    در این پروژه یاد می‌گیریم که چگونه سیگنال‌های بسیار ضعیف الکتریکی تولیدشده توسط فعالیت الکتریکی قلب انسان را توسط چیپ MAX30003 تقویت، فیلتر و دیجیتال‌سازی کرده و از طریق رابط SPI به آردوینو ارسال کنیم.

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

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

    آشنایی با مفهوم سیگنال ECG و نحوه‌ی ثبت آن توسط سنسور بیوپتانسیل.
    · یادگیری نحوه‌ی ارتباط SPI بین سنسور و Arduino UNO.
    · آشنایی با رجیسترهای کنترلی MAX30003 شامل تنظیمات فیلترها، نرخ نمونه‌برداری، و بایاس.
    · نحوه‌ی خواندن داده‌ی خام از رجیستر FIFO و نمایش در سریال مانیتور.
    · راه‌اندازی کتابخانه‌های مورد نیاز در Arduino IDE.
    · تحلیل اولیه داده‌ها و مشاهده شکل موج ECG در Serial Plotter.
    · آشنایی با خطاهای اتصال، تنظیم مجدد (Reset) و بررسی وضعیت سنسور.

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

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

    سخت‌افزارهای مورد نیازنرم‌افزارهای مورد نیاز
    Arduino UNO (یا Nano / Mega)Arduino IDE
    ماژول بیوپتانسیل GebraBit MAX30003کتابخانه‌ی MAX30003 برای Arduino
    سیم‌های جامپر (M–F)درایور USB CH340
    کابل USB برای اتصال آردوینو
    بردبورد (در صورت نیاز)

    ماژول GebraBit MAX30003 از رابط SPI استفاده می‌کند. اتصالات پایه‌ها به شکل زیر است:

    پین آردوینوپین ماژول MAX30003 توضیح
    13SCK کلاک SPI
    12MISO داده از سنسور به آردوینو
    11MOSI داده از آردوینو به سنسور
    7CS انتخاب چیپ (Chip Select)
    5VVCC تغذیه
    GNDGND زمین مشترک
    INTBD2 (قابل تغییر) پایه وقفه برای اعلان داده آماده

            توجه کنید که برای راه اندازی این ماژول احتیاج به Logic Level Converter دارید و در صورت اتصال مستقیم ماژول به آردوینو امکان آسیب به سنسور خواهد شد.

    پس از اتصال آردوینو به ماژول توسط Logic Level Converter، کتابخانه MAX30003را دانلود و به نرم افزار آردوینو اضافه و برنامه پیوست را اجرا کنید.

     نحوه اتصال لیدها به بدن  

    برای اتصال دستگاه به بدن از یک کابل ECG سه لید با جک هدفون نری استفاده میشود .

    در کابل‌های ECG سه لید، لیدها‌ به سه رنگ قرمز ، سبز و زرد هستند که لید قرمز به دست راست، لید زرد به دست چپ شخص وصل میشود.

    لیدها را همانند شکل متصل کنید، سپس کابلECG  را با احتیاط و به آرامی داخل سوکت مربوطه‏ی ماژول مورد نظر قرار داده و توجه داشته باشید که کاملا چفت شده باشد.

    تغذیه را متصل کنید سیگنال خروجی را در پلاتر آردوینو مشاهده می کنید.

    نکته: حتما بین پوست و چست لید از پماد لوبریکانت استفاده شود و همچنین از محکم بودن چست لید بر روی پوست اطمینان حاصل کنید.

    سورس کد     

    برای اجرای این پروژه به protocentral_Max30003.h و protocentral_Max30003.cpp احتیاج داریم.

    protocentral_Max30003.h:

    تعریف دستورات پایه برای خواندن و نوشتن

    #define WREG 0x00
    #define RREG 0x01

    این دو دستور تعیین می‌کنند که عملیات SPI روی رجیسترها به‌صورت نوشتن (Write Register) یا خواندن (Read Register) انجام شود.

    تعریف آدرس رجیسترهای داخلی MAX30003

    این بخش شامل تمامی رجیسترهای مهم چیپ است که برای راه‌اندازی ECG، مدیریت وقفه، تنظیم فیلترها، ریست و خواندن داده‌های FIFO استفاده می‌شوند.

    #define   NO_OP           0x00
    #define   STATUS          0x01
    #define   EN_INT          0x02
    #define   EN_INT2         0x03
    #define   MNGR_INT        0x04
    #define   MNGR_DYN        0x05
    #define   SW_RST          0x08
    #define   SYNCH           0x09
    #define   FIFO_RST        0x0A
    #define   INFO            0x0F
    #define   CNFG_GEN        0x10
    #define   CNFG_CAL        0x12
    #define   CNFG_EMUX       0x14
    #define   CNFG_ECG        0x15
    #define   CNFG_RTOR1      0x1D
    #define   CNFG_RTOR2      0x1E
    #define   ECG_FIFO_BURST  0x20
    #define   ECG_FIFO        0x21
    #define   RTOR            0x25
    #define   NO_OP           0x7F

    توضیح کاربردی برخی از رجیسترهای مهم:

    • STATUS (0x01):
      وضعیت کلی چیپ را گزارش می‌دهد (آمادگی، خطا، رویدادها).
    • EN_INT / EN_INT2 (0x02–0x03):
      فعال‌سازی انواع وقفه‌ها (FIFO، RTOR، Lead-Off و …).
    • SW_RST (0x08):
      اجرای ریست نرم‌افزاری چیپ.
    • FIFO_RST (0x0A):
      پاک‌کردن FIFO برای شروع خواندن داده جدید.
    • CNFG_GEN (0x10):
      تنظیمات عمومی شامل فعال‌سازی ECG و مدیریت توان.
    • CNFG_EMUX (0x14):
      انتخاب ورودی‌های بیوپتانسیل (کانال‌ها و مسیر سیگنال).
    • CNFG_ECG (0x15):
      پیکربندی بخش ECG شامل فیلترها، نرخ نمونه‌برداری و gain.
    • ECG_FIFO (0x21):
      رجیستری که داده‌ی خام ECG از آن خوانده می‌شود.
    • RTOR (0x25):
      خروجی ماژول R-to-R برای تشخیص ضربان قلب (BPM).

    آدرس رجیسترها

     #define BH1790_PARTID              (0x10U)  // R
    #define BH1790_RESET               (0x40U)  // W
    #define BH1790_MEAS_CTRL1          (0x41U)  // R/W
    #define BH1790_MEAS_CTRL2          (0x42U)  // R/W
    #define BH1790_MEAS_START          (0x43U)  // R/W
    #define BH1790_DATAOUT_LEDOFF_LSBS (0x54U)  // R
    #define BH1790_DATAOUT_LEDOFF_MSBS (0x55U)  // R
    #define BH1790_DATAOUT_LEDON_LSBS  (0x56U)  // R
    #define BH1790_DATAOUT_LEDON_MSBS  (0x57U)  // R
    #define BH1790_MANUFACTURERID      (0x92U)  // R

    تعریف پایه‌های سخت‌افزاری پروژه

     #define MAX30003_CS_PIN   7
    #define CLK_PIN          13
    #define RTOR_INTR_MASK     0x04

    توضیح:

    • MAX30003_CS_PIN (پین 4):
      پایه Chip Select برای برقراری ارتباط SPI بین آردوینو و MAX30003.
    • CLK_PIN (پین 29):
      تعیین پین کلاک داخلی/زمان‌بندی (در برخی پلتفرم‌ها برای عملیات Sync به کار می‌رود).
      در برد Arduino UNO استفاده نمی‌شود، اما در نسخه‌های توسعه‌ای وجود دارد.
    • RTOR_INTR_MASK (0x04):
      ماسک وقفه RTOR برای تشخیص ضربان قلب (R-Peak Detection).
      با استفاده از این ماسک می‌توان تشخیص داد که آیا وقفه مربوط به R-to-R فعال شده يا خير.

    تعریف نوع داده‌ی نرخ نمونه‌برداری (Sampling Rate Enumeration)

    این قسمت از کد یک enum تعریف می‌کند که نرخ‌های مختلف نمونه‌برداری (Sampling Rate) برای سنسور MAX30003 را مشخص می‌کند.
    از آنجا که MAX30003 قابلیت ارائه داده با نرخ‌های متفاوت را دارد، استفاده از enum باعث خوانایی بیشتر کد و جلوگیری از اشتباه در مقداردهی رجیسترها می‌شود.

     typedef enum
    {
      SAMPLINGRATE_128 = 128, 
      SAMPLINGRATE_256 = 256, 
      SAMPLINGRATE_512 = 512
    }sampRate;

    typedef enum { … } sampRate;
    یک نوع داده جدید به نام sampRate تعریف می‌کند که شامل مقادیر از پیش تعیین‌شده برای نرخ نمونه‌برداری ECG است.

    SAMPLINGRATE_128 = 128
    مقدار نرخ نمونه‌برداری ۱۲۸ نمونه در ثانیه
    مناسب برای نمایش ساده‌ی ECG و کاهش حجم داده.

    SAMPLINGRATE_256 = 256
    مقدار نرخ نمونه‌برداری ۲۵۶ نمونه در ثانیه
    استاندارد رایج برای ضبط ECG با دقت متوسط.

    SAMPLINGRATE_512 = 512
    مقدار نرخ نمونه‌برداری ۵۱۲ نمونه در ثانیه
    کیفیت بالاتر — برای تحلیل دقیق‌تر R-Peak و فیلترهای حساس.

    protocentral_Max30003.cpp:

    تابع max30003RegWrite – نوشتن مقدار در رجیسترهای MAX30003 از طریق SPI

    این تابع یک رجیستر داخلی از چیپ MAX30003 را از طریق رابط SPI مقداردهی می‌کند. آدرس رجیستر و داده‌ی ۲۴ بیتی به آن داده می‌شود و تابع با ساختن بایت فرمان و ارسال سه بایت داده، مقدار رجیستر مورد نظر را تنظیم می‌کند.

    • ورودی‌ها:
      • WRITE_ADDRESS : آدرس رجیستر مقصد
      • data : مقدار ۲۴ بیتی که باید در رجیستر نوشته شود
    • خروجی:
      • void (مقداری برنمی‌گرداند)
     / void MAX30003::max30003RegWrite (unsigned char WRITE_ADDRESS, unsigned long data)
    {
        // now combine the register address and the command into one byte:
        byte dataToSend = (WRITE_ADDRESS<<1) | WREG;
    
         // take the chip select low to select the device:
        digitalWrite(MAX30003_CS_PIN, LOW);
    
        delay(2);
        SPI.transfer(dataToSend);
        SPI.transfer(data>>16);
        SPI.transfer(data>>8);
        SPI.transfer(data);
        delay(2);
    
        // take the chip select high to de-select:
        digitalWrite(MAX30003_CS_PIN, HIGH);
    }

    تابع max30003SwReset – ریست نرم‌افزاری چیپ MAX30003

    این تابع با نوشتن مقدار مناسب در رجیستر SW_RST، یک ریست نرم‌افزاری روی چیپ MAX30003 اعمال می‌کند. بعد از فراخوانی این تابع، چیپ به حالت اولیه کارخانه برمی‌گردد و برای ادامه کار باید دوباره تنظیم شود.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • void
     void MAX30003::max30003SwReset(void)
    {
        max30003RegWrite(SW_RST,0x000000);
        delay(100);
    }

    تابع max30003Synch – همگام‌سازی داخلی (Synchronization)

    این تابع با نوشتن مقدار صفر در رجیستر SYNCH، روند داخلی اندازه‌گیری و FIFO را همگام‌سازی می‌کند. معمولاً پس از تنظیم رجیسترها یا قبل از شروع خواندن داده، این تابع فراخوانی می‌شود.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • void
     void MAX30003::max30003Synch(void)
    {
        max30003RegWrite(SYNCH,0x000000);
    }

    تابع max30003RegRead – خواندن داده از رجیسترهای MAX30003

    این تابع یک رجیستر مشخص از چیپ MAX30003 را از طریق SPI می‌خواند و سه بایت داده‌ی دریافتی را در بافر کاربر ذخیره می‌کند. از این تابع برای خواندن رجیسترهای پیکربندی و وضعیت استفاده می‌شود.

    • ورودی‌ها:
      • Reg_address : آدرس رجیستر موردنظر برای خواندن
      • buff : اشاره‌گر به آرایه‌ی ۳ بایتی برای ذخیره‌ی داده‌ی خوانده‌شده
    • خروجی:
      • void (داده‌ها در بافر ورودی قرار می‌گیرند)
     void MAX30003::max30003RegRead(uint8_t Reg_address, uint8_t * buff)
    {
        uint8_t spiTxBuff;
    
        digitalWrite(MAX30003_CS_PIN, LOW);
    
        spiTxBuff = (Reg_address<<1 ) | RREG;
        SPI.transfer(spiTxBuff); //Send register location
    
        for ( int i = 0; i < 3; i++)
        {
           buff[i] = SPI.transfer(0xff);
        }
    
        digitalWrite(MAX30003_CS_PIN, HIGH);
    }

    تابع max30003ReadInfo – خواندن اطلاعات شناسنامه‌ای چیپ (INFO Register)

    این تابع رجیستر INFO را از چیپ MAX30003 می‌خواند و براساس بیت‌های بالایی آن بررسی می‌کند که آیا چیپ به‌درستی شناخته شده و آماده‌ی کار است یا خیر. در صورت صحیح بودن مقدار، پیام موفقیت در Serial چاپ می‌شود.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • bool :
        • true → چیپ به‌درستی شناسایی شده و آماده است
        • false → خطا در خواندن اطلاعات یا مقدار نامعتبر
     bool MAX30003::max30003ReadInfo(void)
    {
        uint8_t spiTxBuff;
        uint8_t readBuff[4] ;
    
        digitalWrite(MAX30003_CS_PIN, LOW);
    
        spiTxBuff = (INFO << 1 ) | RREG;
        SPI.transfer(spiTxBuff); //Send register location
    
        for ( int i = 0; i < 3; i++)
        {
           readBuff[i] = SPI.transfer(0xff);
        }
    
        digitalWrite(MAX30003_CS_PIN, HIGH);
    
        if((readBuff[0]&0xf0) == 0x50 ){
    
          Serial.println("max30003 is ready");
          Serial.print("Rev ID:  ");
          Serial.println((readBuff[0]&0xf0));
    
          return true;
        }else{
    
          Serial.println("max30003 read info error\n");
          return false;
        }
    
        return false;
    }

    تابع max30003ReadData – خواندن چند نمونه ECG از FIFO به‌صورت Burst

    این تابع با استفاده از فرمان ECG_FIFO_BURST تعداد مشخصی نمونه‌ی ECG را به‌صورت پشت‌سرهم از FIFO چیپ می‌خواند و در بافر کاربر ذخیره می‌کند. هر نمونه ۳ بایت است.

    • ورودی‌ها:
      • num_samples : تعداد نمونه‌های موردنظر برای خواندن
      • readBuffer : بافر ذخیره‌سازی (باید حداقل num_samples*3 بایت باشد)
    • خروجی:
      • void
     void MAX30003::max30003ReadData(int num_samples, uint8_t * readBuffer)
    {
        uint8_t spiTxBuff;
        digitalWrite(MAX30003_CS_PIN, LOW);
    
        spiTxBuff = (ECG_FIFO_BURST<<1 ) | RREG;
        SPI.transfer(spiTxBuff); //Send register location
    
        for ( int i = 0; i < num_samples*3; ++i)
        {
          readBuffer[i] = SPI.transfer(0x00);
        }
    
        digitalWrite(MAX30003_CS_PIN, HIGH);
    }

    تابع max30003Begin – راه‌اندازی اولیه MAX30003 در حالت ECG

    این تابع تمام مراحل اولیه‌سازی چیپ MAX30003 برای کار در حالت اندازه‌گیری سیگنال ECG را انجام می‌دهد. شامل ریست نرم‌افزاری، تنظیم رجیسترهای عمومی، کالیبراسیون، انتخاب ورودی‌ها، تنظیم ECG، تنظیم RTOR و در پایان همگام‌سازی می‌باشد.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • void
    • کاربرد:
      • یک بار در ابتدای برنامه، برای شروع کار در حالت ثبت سیگنال ECG.
    void MAX30003::max30003Begin()
    {
        max30003SwReset();
        delay(100);
        max30003RegWrite(CNFG_GEN, 0x081007);
        delay(100);
        max30003RegWrite(CNFG_CAL, 0x720000);  // 0x700000
        delay(100);
        max30003RegWrite(CNFG_EMUX,0x0B0000);
        delay(100);
        max30003RegWrite(CNFG_ECG, 0x805000);  // d23 - d22 : 10 for 250sps , 00:500 sps
        delay(100);
    
        max30003RegWrite(CNFG_RTOR1,0x3fc600);
        max30003Synch();
        delay(100);
    }

    تابع max30003BeginRtorMode – راه‌اندازی MAX30003 در حالت RTOR (محاسبه HR/RR)

    این تابع چیپ را برای کار در حالت RTOR (محاسبه فاصله‌ی R–R و ضربان قلب) پیکربندی می‌کند. علاوه بر تنظیمات عمومی و ECG، رجیستر وقفه‌ها نیز (EN_INT) برای فعال‌سازی وقفه‌ی RTOR تنظیم می‌شود.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • void
    • کاربرد:
      • زمانی که هدف، گرفتن مستقیم HR و RR از چیپ است، نه فقط داده‌ی خام ECG.
     void MAX30003::max30003BeginRtorMode()
    {
        max30003SwReset();
        delay(100);
        max30003RegWrite(CNFG_GEN, 0x080004);
        delay(100);
        max30003RegWrite(CNFG_CAL, 0x720000);  // 0x700000
        delay(100);
        max30003RegWrite(CNFG_EMUX,0x0B0000);
        delay(100);
        max30003RegWrite(CNFG_ECG, 0x805000);  // d23 - d22 : 10 for 250sps , 00:500 sps
        delay(100);
        max30003RegWrite(CNFG_RTOR1,0x3fc600);
        delay(100);
        max30003RegWrite(EN_INT, 0x000401);
        delay(100);
        max30003Synch();
        delay(100);
    }

    تابع getEcgSamples – خواندن یک نمونه ECG و تبدیل به مقدار عددی

    این تابع یک نمونه‌ی ECG را از رجیستر ECG_FIFO می‌خواند، سه بایت دریافتی را به یک مقدار ۲۲ بیتی تبدیل می‌کند و آن را در متغیر عضو ecgdata ذخیره می‌نماید. این مقدار آماده برای پردازش، رسم یا فیلتر کردن است.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • void
    • نتیجه:
      • مقدار سیگنال ECG در متغیر ecgdata ذخیره می‌شود.
     void  MAX30003::getEcgSamples(void)
    {
        uint8_t regReadBuff[4];
        max30003RegRead(ECG_FIFO, regReadBuff);
    
        unsigned long data0 = (unsigned long) (regReadBuff[0]);
        data0 = data0 <<24;
        unsigned long data1 = (unsigned long) (regReadBuff[1]);
        data1 = data1 <<16;
        unsigned long data2 = (unsigned long) (regReadBuff[2]);
        data2 = data2 >>6;
        data2 = data2 & 0x03;
    
        unsigned long data = (unsigned long) (data0 | data1 | data2);
        ecgdata = (signed long) (data);
    }

    تابع getHRandRR – محاسبه ضربان قلب (HR) و فاصله R–R

    این تابع رجیستر RTOR را از چیپ خوانده، مقدار خام آن را به فاصله‌ی R–R (بر حسب میلی‌ثانیه) تبدیل می‌کند و سپس از روی همان مقدار HR (Heart Rate) را بر حسب ضربان در دقیقه (BPM) محاسبه کرده و در متغیرهای heartRate و RRinterval ذخیره می‌کند.

    • ورودی‌ها:
      • ندارد
    • خروجی:
      • void
    • نتیجه:
      • heartRate : عدد صحیح ضربان قلب بر حسب BPM
      • RRinterval : فاصله بین دو موج R متوالی بر حسب میلی‌ثانیه (تقریباً)
    <
    void MAX30003::getHRandRR(void)
    {
        uint8_t regReadBuff[4];
        max30003RegRead(RTOR, regReadBuff);
    
        unsigned long RTOR_msb = (unsigned long) (regReadBuff[0]);
        unsigned char RTOR_lsb = (unsigned char) (regReadBuff[1]);
        unsigned long rtor = (RTOR_msb<<8 | RTOR_lsb);
        rtor = ((rtor >>2) & 0x3fff) ;
    
        float hr =  60 /((float)rtor*0.0078125);
        heartRate = (unsigned int)hr;
    
        unsigned int RR = (unsigned int)rtor* (7.8125) ;  //8ms
        RRinterval = RR;
    }
    

     برنامه نمونه در آردوینو     

     بعد از اتصال ماژول به آردوینو و اضافه کردن کتابخانه سنسور به نرم افزار آردوینو به مسیر زیر بروید و کد نمونه را باز کنید.
     File > Examples > Example2-ECG-stream-Arduino-Plotter                            

    شرح فایل نمونه

    این کد در واقع برنامه‌ی اصلی آردوینو برای خواندن ضربان قلب از سنسور MAX3003 است. گام‌به‌گام (بلوک‌به‌بلوک) توضیحش می دهیم:

    تعریف آبجکت کلاس MAX30003

    MAX30003 max30003;

     

    در این خط، یک شیء (آبجکت) از کلاس MAX30003 ساخته می‌شود. این شیء با نام max30003 در تمام برنامه استفاده می‌شود تا از طریق آن بتوانیم به توابعی مثل max30003Begin(), getEcgSamples(), max30003ReadInfo() و… دسترسی داشته باشیم.
    این شیء در واقع رابط برنامه‌ی ما با چیپ سخت‌افزاری MAX30003 است.

    راه‌اندازی اولیه پورت سریال و پایه‌ی CS

     void setup()
    {
        Serial.begin(57600); //Serial begin
    
        pinMode(MAX30003_CS_PIN,OUTPUT);
        digitalWrite(MAX30003_CS_PIN,HIGH); //disable device

    در ابتدای تابع setup()، ارتباط سریال با سرعت ۵۷۶۰۰ بیت بر ثانیه راه‌اندازی می‌شود تا بتوانیم پیام‌ها و داده‌های ECG را در Serial Monitor مشاهده کنیم.
    سپس پایه‌ی MAX30003_CS_PIN (چیپ‌سلکت) به‌عنوان خروجی تنظیم می‌شود و با مقدار HIGH غیرفعال می‌گردد. در پروتکل SPI، وقتی CS روی HIGH باشد، دستگاه در حالت غیرفعال بوده و وقتی LOW شود ارتباط فعال می‌شود.

    تنظیمات اولیه رابط SPI

        SPI.begin();
        SPI.setBitOrder(MSBFIRST);
        SPI.setDataMode(SPI_MODE0);

    در این بخش، رابط SPI آردوینو فعال و برای کار با چیپ MAX30003 پیکربندی می‌شود:

    • SPI.begin() → فعال‌سازی ماژول SPI
    • setBitOrder(MSBFIRST) → ارسال بیت مهم‌تر (Most Significant Bit) در ابتدا
    • SPI_MODE0 → مد کاری SPI روی Mode 0 تنظیم می‌شود (پولاریتی و فاز کلاک مطابق دیتاشیت MAX30003)

    این تنظیمات باید با الزامات پروتکل چیپ MAX30003 مطابقت داشته باشند تا تبادل داده صحیح انجام شود.

    خواندن اطلاعات شناسنامه‌ای چیپ و چک کردن اتصال

     bool ret = max30003.max30003ReadInfo();
        if(ret){
          Serial.println("Max30003 read ID Success");
        }else{
    
          while(!ret){
            //stay here untill the issue is fixed.
            ret = max30003.max30003ReadInfo();
            Serial.println("Failed to read ID, please make sure all the pins are connected");
            delay(10000);
          }
        }

    در این بلوک، با استفاده از تابع max30003ReadInfo() بررسی می‌شود که آیا چیپ MAX30003 به‌درستی روی برد شناسایی شده است یا خیر.

    • اگر ret == true باشد، یعنی شناسه‌ی چیپ (ID) صحیح خوانده شده و سخت‌افزار درست متصل است؛ یک پیام موفقیت در Serial چاپ می‌شود.
    • اگر ret == false باشد، برنامه وارد یک حلقه‌ی while می‌شود و مدام تلاش می‌کند ID را دوباره بخواند.
      در هر تلاش ناموفق، پیغامی مبنی بر خطای اتصال پایه‌ها چاپ شده و ۱۰ ثانیه تأخیر داده می‌شود.

    این کار باعث می‌شود تا زمانی که مشکل سیم‌کشی/اتصال رفع نشده، برنامه جلو نرود و کاربر متوجه ایراد سخت‌افزاری شود.

    راه‌اندازی اولیه چیپ MAX30003 در حالت ECG

     Serial.println("Initialising the chip ...");
        max30003.max30003Begin();   // initialize MAX30003
    }

    در این بخش پیام “Initialising the chip …” روی سریال چاپ می‌شود تا کاربر بداند مرحله‌ی راه‌اندازی چیپ شروع شده است.
    سپس تابع max30003Begin() فراخوانی می‌شود که در آن:

    • ریست نرم‌افزاری انجام می‌شود
    • رجیسترهای پیکربندی (CNFG_GEN, CNFG_CAL, CNFG_EMUX, CNFG_ECG, CNFG_RTOR1) مقداردهی می‌شوند
    • عملیات همگام‌سازی (Synch) اجرا می‌شود

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

    حلقه‌ی اصلی برنامه (loop) – خواندن نمونه ECG و ارسال روی سریال

    void loop()
    {
        max30003.getEcgSamples();   //It reads the ecg sample and stores it to max30003.ecgdata .
    
        Serial.println(max30003.ecgdata);
        delay(8);
    }

    تابع loop() به‌طور مداوم اجرا می‌شود و هسته‌ی اصلی عملکرد برنامه است.

    • در هر تکرار، ابتدا تابع getEcgSamples() فراخوانی می‌شود.
      این تابع یک نمونه‌ی جدید از داده‌ی ECG را از رجیستر FIFO چیپ می‌خواند و در متغیر عضوی max30003.ecgdata ذخیره می‌کند.
    • سپس مقدار max30003.ecgdata توسط Serial.println روی پورت سریال ارسال می‌شود.
      با باز کردن Serial Plotter می‌توان شکل موج ECG را به‌صورت نموداری مشاهده کرد.
    • delay(8) باعث می‌شود بین هر دو نمونه حدود ۸ میلی‌ثانیه فاصله باشد؛ این یعنی تقریباً حدود ۱۲۵ نمونه در ثانیه (نزدیک به ۱۲۸ sps)، که با نرخ تنظیم‌شده‌ی سنسور هم‌خوانی دارد.

    اجرای کد     

    آردوینو خود را به کامپیوتر متصل کنید و مدل و پورت آردوینو خود را انتخاب کنید. سپس نمونه کد را ابتدا Verify و سپس Upload کنید . بعد از Upload کردن کد Serial Plotter را باز کرده و می توانید خروجی های سنسور را مشاهده کنید .

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

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

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