در این پروژه برد آردوینو (Arduino) را به مانیتور ضربان قلب مبتنی بر مقاومت نوری photoresistor اضافه کرده ایم تا ضربان قلب را به کمک آن محاسبه و نمایش دهد. بدین ترتیب شما می توانید در یک اسیلوسکوپ تصویر طول موج ضربان قلب تان را با استفاده از آردوینو ببینید.
زمانیکه قلب ، خون را در بدن به گردش در می آورد ، نوسانات لحظه ای در فشار خون قابل تشخیص می باشد. به همین دلیل است که می توانیم نبض خود را احساس کنیم. در نواحی از بدن که پوست و گوشت بسیار نازک هستند این پالس ها به دلیل گذر نور از این نواحی بدن ، به راحتی قابل تشخیص هستند. به دلیل اینکه چشم های ما آنقدر حساس و دقیق نیستند که حتی نمی تواند نوری که از بدنمان عبور می کند را ببیند و البته نواسانات را نیز نمی بیند پس نیاز به یک ابزار برای این منظور داریم و مقاومت های نوری می توانند برای ما این کار را انجام دهند.
نحوه ی اتصال برد آردوینو به breadboard
نمودارهای زیر ، تصویر شماتیک از مدار و برد بورد استفاده شده و نحوه اتصال آردوینو به بردبورد در این پروژه را نشان می دهند :
یک مقاومت نوری، در واقع یک تقسیم کننده ولتاژ است با مقاومت 20 کیلو اهم، که به این معنیست که به همان اندازه که نور افتاده بر روی مقاومت افزایش می یابد، ولتاژ در این تقسیم کننده نیز افزایش می یابد.
اولین تقویت کننده (در شماتیک مدار بالا که “Amp1” می باشد) به عنوان یک فیلتر برای مقاومت نوری عمل می کند، که فرکانس های بالا (نویز) را از سیگنال ورودی حذف می کند. دومین آپ امپ (“Amp2”) به عنوان یک تقویت کننده ی معکوس عمل می کند و سیگنالی که از فیلتر عبور کرده را بزرگ می کند. سومین تقویت کننده (“Amp3”) به عنوان زمین مجازی عمل می کند طوریکه سیگنال را در ولتاژ 2.5 مرکزیت می دهد. این باعث می شود که تمامی آپ امپ ها بتوانند نوسان بزرگی از سیگنال را از 0v تا 5v تولید کنند. پس از اینکه سیگنال فیلتر شد و تقویت شد در نهایت به شکلی مشابه زیر تبدیل می شود:
اگر می خواهید که برنامه آردوینو ضربان قلب شما را اندازه بگیرد، باید سیگنال از یک comparator (مقایسه کننده) عبور کند (“Cmp” که در شماتیک مدار آمده است). یک مقایسه کننده یک op Amp (آپ امپ) است که به گونه ای طراحی شده که هم سیگنال های بالا و هم پایین را به خروجی می فرستد. زمانیکه ولتاژ در ورودی مثبت بزرگتر از ولتاژ در ورودی منفی باشد، خروجی مقایسه کننده بالا است و زمانیکه ولتاژ در ورودی مثبت کوچکتر از ورودی منفی باشد، خروجی مقایسه کننده پایین است. معمولا مقایسه کننده، از نظر ساختاری به عنوان یک تشخیص دهنده حد آستانه عمل می کند به طوریکه زمانیکه ولتاژ اندازه گیری شده از آن مقدار آستانه بالاتر و یا پایین تر است، سیگنال می فرستد.
از آنجاییکه یک مقایسه کننده هم ولتاژهای بالا (5v) و هم ولتاژ های پایین (0v) را به خروجی می فرستد، بسیار عالیست که آن را به یک برد آردوینو وصل کنیم. اگر به تصویر سیگنالی که از آپ امپ می آید دقت بیشتری کنیم، کاملا واضح هست که یک پالس دیگری هم قبل از اینکه ولتاژ پایین بیاید وجود دارد که نقطه عطف (dicrotic notch) نامیده می شود. به علاوه نویز زیادی در سیگنال وجود دارد. این دو واقعیت بیان می کند که ساختار اولیه مقایسه کننده قادر نیست که پالس ها را به خوبی تشخیص دهد. به جای یک پالس مربعی برای هر ضربان قلب، مقایسه کننده چند پالس را تولید می کند. و این مساله به این دلیل اتفاق می افتد که نویز باعث می شود که سیگنال از حد آستانه در نوسان بالا و پایین چندین دفعه عبور کند و بسته به جاییکه حد آستانه تنظیم شده است، احتمالا در اطراف نقطه ی عطف اتفاق می افتد. همین مساله هست که سبب می شود تا با استفاده از ماژول های آردوینو تعداد پالس (ضربان قلب) بیشتری را به نسبت روشهایی که تا بحال وجود داشته، محاسبه کند.
یک سیگنال نویزی را می توان به کمک هیسترزیس (hysteresis) مدیریت و کنترل کرد. سیگنال های نویزی بر روی کارایی مقایسه کننده تاثیر گذاشته و باید به نوعی این مساله را کنترل کرد. ما در این پروژه یک مقایسه کننده نامتقارن را برای این منظور طراحی کردیم. ایده ی کلی این است که یک حلقه بازخورد از خروجی ولتاژ را در ورودی مثبت تغییر می دهد، به این معنا که حد آستانه ای که از پایین به بالا می رود از حد آستانه ای که از بالا به پایین می رود متفاوت است. معنای این قضیه در پالس های ضربان قلب این است که مقایسه کننده را می توان بر روی نقطه ای در نوسان بالا و سپس در نقطه ای دیگر در نوسان پایین (بهتر است که بعد از نقطه عطف باشد) تنظیم کرد تا شروع به کار کند. به این ترتیب ماژول آردوینو در هر ضربان قلب یک پالس مربعی را خواهد دید که در شکل زیر نیز آمده است :
آماده سازی مقاومت نوری photoresistor
شدیدا توصیه می کنم که یک پوشش و کاور تمیز و مناسب مثلا یک سرکابل حرارتی تمیز (heat shrink) برای مقاومت نوری استفاده کنید. یا حداقل مطمئن شوید که کابل ها کاملا پوشیده هستند تا با پوست دست تان تماس پیدا نکند زیرا ولتاژ تولیدی بدن شما در محدوده ای قرار دارد که مقاومت نوری photoresistor می تواند آن را تشخیص دهد بنابراین در این هنگام سنسور photoresistor ضربان قلب شما را شناسایی می کند و در نتیجه بر نتایج کار تاثیر می گذارد و ممکن است که نتیجه ی پروژه اشتباه شود.
تنظیم کردن صفحه نمایشگر با پتانسیومتر (potentiometer)
در نمودار شماتیک مدار، برای پتانسیومتر(R7) از یک پتانسیومتر تریمر (single-turn potentiometer) استفاده کنید و آن را به گونه ای که مقدار آمپ امپ op amp ماکزیمم شود بدون اینکه سیگنال به حالت اشباع برسد، تنظیم کنید. ابتدا یک قسمت پتانسیومتر را به یک مقاومت 375 اهمی متصل کنید و سمت دیگر آن را به یک فیلتر(Amp1) وصل کنید. با این کار میزان قابل توجهی پالس ایجاد می شود که به شکل موج در مانیتور قابل مشاهده هستند. پس از اینکه پالس ها را مشاهده کردید، می توانید در صورت لزوم تغییراتی را در آن ایجاد کنید. می توانید دامنه ی پالس را با چرخاندن پتانسیومتر افزایش دهید و بدین ترتیب مقاومت سمت فیلتر کاهش می یابد. اگر دامنه خیلی بزرگ شود باعث می شود که موج بریده بریده شود یا اصطلاحاً clipping شود پس باید مقاومت فیلتر را افزایش دهیم. تصاویر زیر این مساله را به خوبی نشان می دهند:
پیشنهاد می کنم که برای مقاومت های R3 و R4 از مولتی ترن استفاده کنید تا حد آستانه را برای مقایسه کننده به طور دقیق تعیین کنید. مقاومت R5 تا زمانیکه به طور دقیق اندازه گیری شده است ، می تواند هر اندازه مقاومتی بین 10 تا 100 کیلو اُهم باشد. شما می توانید مقادیر R3 و R4 را با توجه به مقدار اندازه گیری شده ی R5 و ولتاژهای حد آستانه تعیین کنید. حد آستانه ی “Vl” و “Vh”بر اساس پالس هایی که در اُسیلوسکوپ می بینید باید تغییر کنند (این مساًله در بخش “تنظیم حد آستانه ی مقایسه کننده” توضیح داده شده است). مقاومت های R8 و R9 را می توان با یک پتانسیومتر که از پین میانی به ورودی مثبت آپ اَمپ متصل است جایگزین کرد. بدین ترتیب، زمین مجازی به آسانی بدون آنکه مجبور باشیم از مقاومت های یکسان استفاده کنیم، تنظیم خواهد شد. زمانیکه خروجی را به مقدار 2.5 ولت (virtual ground) تنظیم می کنید، می توانید برای این کار از یک ولت متر یا OpenScope استفاده کنید.
مشاهده پالس ها در صفحه نمایشگر امواج (WaveForms Live)
برای اینکه ضربان قلب خود را در صفحه ی نمایشگر ببینید باید یکسری تنظیمات را در منوی آن تغییر دهید. به صورت پیش فرض سیگنال خروجی کشیده شده (streched out) و تحلیل آن بسیار کار سختی است یا اینکه سرعت آپدیت شدن آن بسیار کند است و نیز نحوه قرارگیری دست تان بر روی مقاومت نوری photoresistor برای تولید پالس های تمیز و بدون نویز کار سختی خواهد بود.
کانال2 اُسیلوسکوپ openscope (سیم آبی رنگ) را به خروجی Amp2 وصل کنید و مطمئن شوید که سیم ground به بخش زمین breadboard متصل باشد. در صفحه نمایشگر زمان را بر روی یک ثانیه تغییر دهید و در منوی trigger کلید off را فشار دهید. برای هر دو منوی کانال 1 و 2 اُسیلوسکوپ، آفست را بر روی 2.5 ولت تنظیم کنید و در کنار samples کلید lock icon را بزنید و مقدار “1000” را بنویسید. این باعث می شود که سیگنال در یک بازه زمانی نشان داده شود که تحلیل آن ساده تر شود ولی سبب می شود که دفعات آپدیت آن بسیار بیشتر از حالت پیش فرض اتفاق بیوفتد. صفحه نمایشگر باید هر 4 ثانیه یک بار و یا بیشتر به روز شود. اگر همچنان این پروسه به کندی انجام می شود، می توانید مقادیر samples را افزایش دهید اما سبب می شود که سیگنال خروجی کوتاهتر و کوچکتر شود (مقدار “2000” در هر لحظه حدود یک ضربان قلب را ضبط می کند).
کلید Run را فشار دهید و انگشت تان را بر روی مقاومت نوری قرار دهید تا ضربان قلب خود را اندازه بگیرید. شما باید راهی پیدا کنید تا نتایج ثابتی بدست آورید. این سیستم نسبت به تغییرات در فشار وارده بر آن بسیار حساس است ، پس باید راهی پیدا کنید تا انگشتتان کاملا صاف و ثابت نگه دارید. من بهترین مکان برای گرفتن نبضم را پیدا کردم و آن بند اول انگشت اشاره ام بود. یک مقداری زمان می برد تا یاد بگیرید که بهترین مکان کجاست ولی در نهایت متوجه خواهید شد. اگر پالس های شما بسیار کوچک به نظر می آیند پتانسیومتر را همانطور که در پاراگراف اول بخش قبلی (تنظیم کردن صفحه نمایشگر ضربان قلب) توضیح دادیم تنظیم کنید.
تنظیم حد آستانه ی مقایسه کننده
هنگامیکه سیگنال در اُسیلوسکوپ قابل رؤیت هست، باید حد آستانه را به گونه ای تعیین کنید که مقایسه کننده، آردوینو را فعال و به آن سیگنال دهد. یکسری از امواج را در نظر بگیرید و ضبط را متوقف کنید تا این امواج را بر روی نمایشگر داشته باشید. در پشت صفحه، کلید Cursors را فشار دهید. در قسمت نوع(“Type”) ولتاژ (“voltage”) را انتخاب کنید و هر دو CursorChannels را بر روی “Osc 2” تنظیم کنید. دو تا خط منقطع بر روی نمایشگر نشان داده خواهد شد. اشاره گر مثلثی شکل را در سمت چپ بکشید تا بتوانید این خطوط را حرکت دهید. یکی از این خطوط را در نقطه ای نزدیک به قله و دیگری را زیر نقطه ی عطف نمودار قرار دهید. به پشت صفحه نگاه کنید و دو تا ولتاژی که در پرانتز نشان داده شده را یادداشت کنید. این مقادیر را به عنوان ولتاژ حد آستانه “Vl” و “Vh” در نظر بگیرید و در فایل اکسلی که دراین مقاله پیوست شده وارد کنید. “Vl” ولتاژ با مقدار کمتر و “Vh” ولتاژ با مقدار بیشتر است. با توجه به مقادیر حد آستانه ها و مقدار مقاومتی که برای R5 در نظر گرفته اید، مقادیر پتانسیومترهای R3 و R4 در همان فایل اکسل با توجه به فرمولی که قبلا به آن داده شده محاسبه می شوند و شما نیز همین مقادیر را برای آنها در پروژه تنظیم کنید.
بعد از اینکه مقایسه کننده را تنظیم کردید باید سیگنالی مشابه به تصویری که در بخش “آماده سازی مقاومت نوری photoresistor ” نشان دادیم ، به خروجی ارسال کند.
کد آردوینو
کدهای آردوینو از یک شمارنده فرکانس و یک متد برای محاسبه ی ضربان قلب در واحد bpm(beat per minute) یا همان تعداد ضربان قلب در یک دقیقه تشکیل شده است. این شمارنده مقدار عرضی که از پالس ورودی از مقایسه کننده می آید را محاسبه می کند و هر مقداری که کمتر از 200 میلی ثانیه و یا بیشتر از 800 میلی ثانیه باشد را قبول نمی کند و به کمک این عملکرد برنامه آردوینو می توان فرضا زمانیکه مقاومت نوری برای محاسبه معیارهای اندازه گیری به کار گرفته نشده و مقایسه کننده زیاد ، کم و یا خیلی سریع بین دو حالت ممکن سوئیچ می کند از نمایش داده غلط جلوگیری کرد. در کد آردوینو ، میانگین ضربان قلب در 15 ثانیه گذشته در نظر گرفته شده تا بدین ترتیب نویزی که در اثر حرکات تصادفی افراد در سیگنال ممکن است بوجود آید فیلتر شود.
بهبود الگوریتم آردوینو و عملکرد مقاومت نوری
در بخش نرم افزاری آردوینو ، یک راه حل بالقوه استفاده از یک الگوریتم متغیر خودکار در ماژول آردوینو خواهد بود.
این الگوریتم می تواند ضربان قلب را تشخیص دهد و نقاط قله و فرورفتگی های آن را بدست بیاورد. هرچند، این کار برای محاسبه معیارهای ضربان قلب کافی نیست. یک شمارنده ی فرکانس مناسب نیاز به وقفه دارد.
بدون وقفه، پردازشگر آردوینو ممکن است که در کنار چک کردن پین های ورودی، کار دیگری هم انجام بدهد و بدین ترتیب یک ضربان را از دست بدهد و نشمارد. از اونجاییکه وقفه ها تنها در پین های دیجیتالی وجود دارند، لذا بهترین روش برای پیاده سازی خودکار استفاده از پتانسیومتر دیجیتالی می باشد. الگوریتم آردوینو از پین های آنالوگ برای یافتن محدوده ی ضربان قلبی که در آن نمایان می شود استفاده می کند در واقع تعیین می کند که حد آستانه های مقایسه کننده چه مقداری باید باشند و توسط پتانسیومترهای دیجیتال آنها را فعال می کند سپس از سیگنال های دیجیتالی که از مقایسه کننده آمده است استفاده می کند تا شمارنده فرکانس را اجرا کند.
نقطه ضعف دیگر این پروژه، نگه داشتن سنسور نوری به طوریکه پالس ها دامنه های یکسانی داشته باشند است که کار سختی است. از آنجاییکه این مقاومت نوری برای تشخیص ضربان قلب به نور محیط وابسته است، تغییرات نور محیط در طول روز باعث می شود که نتایج متفاوتی بدست آوریم. من متوجه شدم که در روزهای ابری حد آستانه های مقایسه کننده خیلی از هم فاصله داشتند و به صورت گسترده بودند و در روزهای آفتابی و روشن، نقطه عطف بسیار برجسته بود و باعث تشخیص غلط ضربان قلب میشود. علاوه بر این، حتی تغییرات جزئی نور که به دلیل حرکت در اتاق بوجود می آمد توسط photoresistor قابل تشخیص بودند. این مساله ثابت نگه داشتن سنسور نوری را شاید بتوان به شکل دیگری مدیریت کرد.
این سیستم می تواند شامل یک LED باشد تا نور ثابت و یکنواختی را ایجاد کند. شبیه به مانیتورهای قلب که در مطب های دکتر هستند و یا مانیتورهای ضربان قلب که در گوشی های همراه دیده می شوند. من سعی کردم که یک چراغ LED قرمز رنگ را در قسمت بالای انگشت خود که در سمت دیگر آن یک مقاومت نوری وجود داشت نگه دارم. نتایج بهتری بدست آمد، پس اگر یک محیط مناسب برای این کار ایجاد کنیم احتمالا این روش گزینه مناسبی است.
قطعات مورد نیاز
Digilent OpenScope MZ
Arduino UNO & Genuino UNOTexas Instruments General Purpose Quad Op-Amp
Texas Instruments High Speed Single Comparator Multi-Turn Precision Potentiometer- 10k ohms (25 Turn)
Single Turn Potentiometer- 100k ohms
Single Turn Potentiometer- 10k ohms
Capacitor 100 µF
Capacitor 100 nF
Resistor 10k ohm
Resistor 4.75k ohm
Resistor 82k ohm
نرم افزارهای مورد نیاز
Arduino IDE
Digilent WaveForms Live