نمایشگر نوار قلب (ECG) با آردوینو و ماژول AD8232
دنیای الکترونیک وقتی با مهندسی پزشکی و سیگنالهای بدن انسان ترکیب میشه، پروژههای فوقالعاده جذابی رو خلق میکنه. تو این آموزش قراره با هم یک دستگاه مانیتورینگ نوار قلب (ECG) جذاب بسازیم که سیگنالهای الکتریکی قلبت رو بهصورت زنده روی یک نمایشگر رنگی نشون میده. این پروژه نه تنها یه تمرین عالی برای کار با سنسورهای زیستی و نمایشگرهاست، بلکه باعث میشه با نحوه عملکرد قلب از یک دیدگاه کاملا الکترونیکی بیشتر آشنا بشی.
ما تو تیم آیسیمدار این آموزش رو جوری طراحی کردیم که بدون نیاز به تجهیزات پیچیده، بتونی این دستگاه رو با کمترین امکانات بسازی. با استفاده از یه برد آردوینو، ماژول پردازش سیگنال AD8232 و یه نمایشگر TFT، سیگنالهای قلبت رو به همون شکلموجهای کلاسیک پزشکی که تو بیمارستانها دیدی درمیاریم.
توی این پروژه علاوه بر نمایش شکل موج اصلی، قابلیتهایی مثل محاسبه ضربان در دقیقه (BPM) و نمایشگرهای مختلف برای تحلیل ریتم قلب هم پیادهسازی کردیم. بریم قطعات رو آماده کنیم و قدمبهقدم این گجت خفن رو بسازیم!
قطعات موردنیاز
- برد آردوینو نانو (یا یونو / مینی پرو)
- ماژول سنسور ضربان قلب AD8232 به همراه کابل و الکترود
- نمایشگر رنگی 2.8 اینچ TFT با کنترلر ILI9341 و رابط SPI
- باتری لیتیوم یون 3.7 ولت یا 4 عدد باتری قلمی (AA)
- تعدادی مقاومت برای تقسیم ولتاژ
- برد سوراخدار (Stripboard)
- سیم و تجهیزات لحیمکاری
ایمنی حرف اول را میزند!
قبل از اینکه دست به هویه بشیم، باید یه نکته خیلی مهم رو با هم مرور کنیم. این پروژه فقط برای یادگیری، سرگرمی و آشنایی با الکترونیک طراحی شده و به هیچوجه جایگزین تجهیزات پزشکی یا توصیههای پزشک نیست.
مهمترین قانون تو ساخت این مدار اینه: وقتی الکترودها به بدنت وصل هستن، تحت هیچ شرایطی مدار رو به آردوینو یا کامپیوتری که به برق شهر متصل هست، وصل نکن! تجهیزات پزشکی استاندارد ایزولاسیون بسیار قوی برای جلوگیری از برقگرفتگی دارن که لپتاپ یا کامپیوتر شخصی تو این ویژگی رو نداره.
برای اینکه خیالمون از بابت ایمنی راحت باشه، این مدار رو فقط و فقط با باتری راهاندازی میکنیم. چه از 4 تا باتری قلمی استفاده کنی چه از یه باتری لیتیومی، ولتاژ پایین باتری هیچ خطری برای بدن ایجاد نمیکنه.
ماژول AD8232 به گونهای طراحی شده که با استفاده از مقاومتهای داخلی بزرگ، جریان عبوری از بدن رو به کمتر از چند نانوآمپر میرسونه. بنابراین تا زمانی که دستگاه به برق شهر متصل نباشه و فقط با باتری کار کنه، مدارت کاملا امنه.
اگر در بدنت دستگاه ضربانساز (Pacemaker) یا دفیبریلاتور داخلی داری، از اتصال الکترودهای این پروژه به بدنت خودداری کن. این دستگاهها حساسیت بالایی دارن و نباید ریسک کرد.
تجهیزات پزشکی تجاری باید استانداردها و تستهای خیلی سختی (مثل IEC 60601) رو بگذرونن که شامل تحمل شوکهای دفیبریلاتور، بررسی ایمنی در زمان خرابی یک قطعه و نویزپذیری (EMC) میشه. پروژهای که ما میسازیم یک مدار آموزشیه و نیازی به گذروندن این تستهای گرانقیمت نداره. پس یادت نره: مدارت رو بساز، لذت ببر، اما حتما با باتری روشنش کن تا ایمنی صددرصدی داشته باشی.
حالا بریم سراغ بخشهای فنی. سوالات مهمی که برای طراحی یک گجت مرتبط با بدن انسان پیش میاد ایناست:
- چه مقدار جریان الکتریکی مجاز است از بدن عبور کند؟
- چه نوع ایزولاسیون الکتریکی نیاز داریم؟
- اگر یک قطعه در مدار خراب شود، چه اتفاقی میافتد؟
- مدار چقدر نویز الکترومغناطیسی (EMC) تولید میکند؟
- در برابر شوکهای ناگهانی چه واکنشی دارد؟
در مورد جریان عبوری، استانداردها میگن جریان متناوب باید زیر 100 میکروآمپر و جریان مستقیم زیر 10 میکروآمپر باشه. مدار ما با داشتن مقاومتهای ورودی 10 گیگااهمی، جریانی در حد نانوآمپر داره که خیلی امنتر از حد استاندارده.
حتی اگه تراشه بسوزه یا اتصال کوتاه بشه، چون ولتاژ کاری تراشه 3.3 ولته و مقاومتهای 180 کیلواهم سر راهش هست، نهایتا جریانی حدود 18 میکروآمپر عبور میکنه که بازم با باتری هیچ خطری نداره.
برای ایزولاسیون هم، همونطور که گفتم، استفاده از باتری خیالت رو راحت میکنه. نیازی به ایزولاتورهای پیچیده 4000 ولتی که تو دستگاههای بیمارستانی هست، نداریم.
درسته که این گجت برای استفادههای بیمارستانی تاییدیه نداره، اما برای یادگیری و بررسی ضربان قلب روی مبل خونه، وقتی به باتری وصله، عالی و امن کار میکنه! توصیه میکنم حواست به اتصالات پینها باشه تا موقع لحیمکاری خطایی پیش نیاد و قطعاتت آسیب نبینن. گاهی اوقات ممکنه آردوینو نویزهای ریزی تولید کنه، ولی برای یه پروژه سرگرمی این مقدار نویز اصلا دردسرساز نیست.
فقط مطمئن شو که بدنه یا پایههای رسانای مدار، مستقیما با پوستت تماس نداشته باشن تا نویزهای الکترواستاتیک (مثل وقتی لباست الکتریسیته ساکن داره) روی نمودارت پرش ایجاد نکنن. یه جعبه پلاستیکی ساده میتونه این مشکل رو کامل حل کنه. بریم سراغ قطعه اصلی این پروژه! آمادهای؟ پیش به سوی قلب مدار. این نکات رو همیشه گوشه ذهنت داشته باش. خب، به اندازه کافی در مورد ایمنی حرف زدیم.
ماژول AD8232 منتظره که راهاندازیش کنیم. جک 3.5 میلیمتری الکترودها فقط باید به خود ماژول وصل بشه، نه هیچ جای دیگه! استفاده از پدهای چسبی استاندارد، هم بهداشتیتره و هم کیفیت سیگنال رو خیلی بهتر میکنه.
همیشه فرض کن یه قطعه ممکنه خراب بشه، طراحی با باتری، همون راهکار هوشمندانهای هست که اثر خرابیها رو خنثی میکنه. با این کار، مدار حتی در حالت خطا (Single Fault) هم امن میمونه.
بنابراین، بدون استرس میتونیم به ساخت و برنامهنویسی ادامه بدیم. احتمال اینکه برد مدار چاپی به صورت جادویی تغییر شکل بده و ولتاژ باتری رو مستقیم به بدن وصل کنه، صفره! پس خیالت بابت مدار چاپی راحت باشه. به هر حال، وقتی دستگاه رو ساختی، میتونی به دوستات نشون بدی که چقدر تو طراحی ایمن دقت کردی.
EMC یا تداخل الکترومغناطیسی تو بیمارستانها خیلی مهمه، ولی ما قرار نیست این مدار رو کنار دستگاههای حساس آیسییو روشن کنیم. آردوینو نویز مخربی روی لوازم خونگی مثل موبایل یا تلویزیون نمیذاره. پس نیازی به قفس فارادی و دردسرهای جلوگیری از نویز رادیویی نداریم. این همون مزیت پروژههای شخصیه؛ دردسرهای طراحی محصولات تجاری رو نداری.
فقط کافیه مدارت به درستی کار کنه و خروجی تمیزی بهت بده. شوک دفیبریلاتور هم که قطعا مدارمون رو دود میکنه، ولی خب قرار نیست چنین شرایطی رو تجربه کنیم! این فقط یه یادآوری بود که بدونی دستگاههای پزشکی واقعی چقدر پیچیده طراحی میشن. ماژولهای کوچیک ما دیودهای محافظتی برای شوکهای چندصد ولتی ندارن، و نیازی هم بهشون نداریم.
هدف ما اینه که با کمترین هزینه، یه ابزار باحال، آموزشی و کارآمد برای درک سیگنالهای حیاتی بسازیم. با یه باتری ساده 6 ولتی یا لیتیومی 3.7 ولتی، تمام خطرات احتمالی رو دور میزنیم و میریم سراغ قسمت جذاب و عملی کار.
راهاندازی ماژول سنسور ضربان قلب AD8232
تراشه AD8232 یه تقویتکننده ابزار دقیق فوقالعاده با نویز کمه که وظیفهش گرفتن سیگنالهای به شدت ضعیف قلب، حذف نویزها و آماده کردنشون برای پردازشه. این تراشه، کار طراحی مدار رو خیلی راحت میکنه چون تمام بخشهای فیلترینگ و تقویت سیگنال تو دل خودش جاسازی شده.
برای این پروژه بهتره ماژول آماده AD8232 رو تهیه کنی. حواست باشه مدلی رو بگیری که همراهش کابل و پدهای چسبی الکترود باشه تا برای اتصال به بدنت راحت باشی.
طبق شماتیکی که برات گذاشتم، ماژول رو به آردوینو نانو (یا یونو) وصل کن. برای تست اولیه، برد بورد بهترین گزینهست تا اتصالات رو سریع انجام بدی.
یه ویژگی خفن ماژول AD8232 اینه که میتونه قطع شدن الکترودها رو تشخیص بده. اگه هر کدوم از الکترودها از بدنت جدا بشن، پینهای LO+ یا LO- ماژول فعال (High) میشن. برای تست این قابلیت، میتونی به این دو تا پین، دو تا الایدی با مقاومت 1 کیلواهمی وصل کنی و سر دیگهشون رو به زمین (GND) بزنی.
هر وقت اتصال قطع بشه، این الایدیها روشن میشن. البته تو مدار نهایی، باید این الایدیها رو برداری و پینهای LO رو مستقیم به پایههای آردوینو وصل کنی تا نرمافزار متوجه قطعی بشه (الایدیها ممکنه باعث افت ولتاژ بشن و آردوینو نتونه سیگنال رو درست بخونه). حالا کد اولیه رو روی آردوینو آپلود کن و آردوینویی که با باتری روشن شده رو از طریق Serial Plotter خود نرمافزار آردوینو بررسی کن.
نرخ باود ریت (Baud Rate) رو روی 57600 تنظیم کن. کابلهای الکترودها معمولا این رنگبندی رو دارن:
- الکترود دست چپ (LA): سبز
- الکترود دست راست (RA): قرمز
- الکترود پای راست (RL): زرد
اگه رنگ کابلهای تو فرق میکنه، میتونی با تماس دادن سر کابلها به هم تستشون کنی:
- اگه هیچکدوم به هم نخورن: هر دو الایدی تست روشن میشن
- اتصال LA به RA: هر دو الایدی روشن میمونن
- اتصال LA به RL: الایدی مربوط به LO+ خاموش میشه
- اتصال RA به RL: الایدی مربوط به LO- خاموش میشه
پدهای چسبی که با ماژول میخری ممکنه زود چسبندگیشون رو از دست بدن. بهترین راه اینه که یه بسته پد ECG یدکی تهیه کنی که هم استاندارده و هم نویز کمتری میگیره. البته میشه الکترود دستساز هم ساخت، ولی برای داشتن یه سیگنال تمیز و بدون نویز، پدهای استاندارد بیمارستانی حرف اول رو میزنن. چسب این پدها به شکلیه که چند ساعت بدون مشکل روی پوست میمونه.
حالا بریم سراغ وصل کردن الکترودها به بدن، همونطور که تو عکس نشون داده شده عمل کن.
- الکترود LA رو سمت چپ سینه، کمی پایینتر از استخوان ترقوه بچسبون.
- الکترود RA رو سمت راست سینه، زیر استخوان ترقوه قرار بده.
- الکترود RL رو یه جای پایینتر و دورتر از قلب (مثل پایین شکم) بچسبون.
اسم الکترود RL مخفف پای راسته، ولی اصلا لازم نیست حتما به پات وصلش کنی! این الکترود نقش مرجع یا زمین رو داره. وظیفه این الکترود کاهش نویزهای محیطیه. هر جای بدن که پایینتر و دور از قلب باشه، مثل قسمت پایین سمت چپ شکم، عالی جواب میده.
سعی کن الکترودها رو روی عضلات بزرگ نچسبونی، چون حرکت عضلات، سیگنال الکتریکی تولید میکنه و روی نمودار نوار قلبت نویز میندازه. اگر دوست داری مدلهای دیگه اتصال رو ببینی، میتونی تو اینترنت عبارت 'محل اتصال الکترودهای 3 لید ECG' رو جستجو کنی.
تولید پالس مجازی برای تست مدار
برای زمانهایی که داری کد مینویسی یا مدار رو عیبیابی میکنی و دلت نمیخواد مدام الکترودها به بدنت وصل باشن، میتونیم یه پالس مجازی بسازیم. این پالس شاید خیلی شبیه یه قلب واقعی نباشه، اما فرکانس و اندازه مناسبی داره و برای تست نمایشگر کاملا جواب میده.
برای این کار، کافیه با چندتا مقاومت 100 کیلواهمی، ماژول AD8232 رو گول بزنی تا فکر کنه به بدن وصل شده! روی برد ماژول، پدهایی با نام RA، LA و RL وجود داره. میتونی موقتا با استفاده از این مقاومتها، یه سیگنال شبیهسازی شده به این پایهها بفرستی و خروجی رو روی صفحه آردوینو ببینی.
قلب انسان از نگاه یک الکترونیککار
از نظر یه مهندس الکترونیک، قلب انسان چیزی نیست جز یه تولیدکننده پالسهای الکتریکی با ولتاژ در حد چند میلیولت! یه گره عصبی تو قلب به اسم گره سینوسی-دهلیزی (SA) وجود داره که مثل یک نوسانساز (اسیلاتور) عمل میکنه و تقریبا هر ثانیه یه پالس الکتریکی میفرسته.
این پالس باعث میشه ماهیچههای دهلیز منقبض بشن و خون رو به سمت بطنها پمپاژ کنن. بعد از این انقباض، ماهیچهها استراحت میکنن. تو زمان استراحت، دهلیزها دوباره از خونی که از سمت بدن و ریهها میاد پر میشن.
یه گره دیگه به اسم گره دهلیزی-بطنی (AV) هم داریم که سیگنال رو کمی تاخیر میده (حدود 120 تا 200 میلیثانیه) و بعد اون رو به بطنها میفرسته. این گره هم مثل یه اسیلاتور بکآپ عمل میکنه که با سیگنال گره اول همگام شده.
اگه به هر دلیلی اسیلاتور اول از کار بیفته، این اسیلاتور دوم با سرعت کمتری شروع به تولید پالس میکنه تا سیستم قلب کامل از کار نیفته.
وقتی پالس به بطنها میرسه، منقبض میشن و خون رو با قدرت به کل بدن میفرستن. کل این چرخه پالس و پمپاژ، حدود نیم ثانیه زمان میبره.
چون بطن چپ وظیفه سنگین پمپاژ خون به کل بدن رو داره، بزرگترین سیگنال الکتریکی که ما روی نمودار میبینیم، مربوط به همین انقباض بطن چپه.
این سیگنالها در واقع به خاطر جابهجایی یونهای سدیم، پتاسیم و کلسیم تو سلولهای ماهیچه قلب به وجود میان. تو حالت استراحت، اختلاف غلظت یونها باعث ایجاد یه اختلاف پتانسیل 90 میلیولتی میشه. وقتی یه پالس راه میفته...
کانالهای سدیم باز میشن، یونها وارد سلول میشن و ولتاژ صفر میشه. به این حالت دیپلاریزاسیون (Depolarisation) میگن. کمی بعد، پتاسیم از سلول خارج میشه تا ولتاژ استراحت دوباره برقرار بشه که بهش میگن ریپلاریزاسیون. این همون چیزیه که به صورت موجهای مختلف روی نمایشگر نوار قلب ظاهر میشه.
این سیگنال الکتریکی سلول به سلول تو تمام ماهیچه قلب پخش میشه. سرعت این انتقال مثل اعصاب عادی خیلی سریع نیست و نسبتا آروم پیش میره.
- سرعت انتقال تو سلولهای ماهیچهای: 0.3 تا 0.4 متر بر ثانیه
- سرعت انتقال تو رشتههای پورکینژ (داخل قلب): 2 تا 3 متر بر ثانیه
- سرعت انتقال عصبی تو کل بدن: 70 تا 120 متر بر ثانیه
جالبه بدونی رشتههای پورکینژ هم میتونن تو مواقع اضطراری خودشون پالس تولید کنن و به عنوان سومین اسیلاتور بکآپ وارد عمل بشن. دستگاه نوار قلب در واقع همین پتانسیلهای الکتریکی رو ثبت میکنه. این سیگنالها از طریق بافتها به پوست قفسه سینه میرسن.
تا زمانی که این سیگنال به پوست برسه، قدرتش خیلی کم شده و به حدود 1 میلیولت میرسه. برای همینه که به یه تقویتکننده قوی مثل AD8232 نیاز داریم.
اگه الکترودها رو جاهای مختلف سینه بذاری، زاویه دیدت به قلب عوض میشه. ترکیب قرار دادن الکترودها زیر ترقوه چپ و راست، همون شکل موج معروف PQRST رو میده که بهش لید یک (Lead I) میگن.
با تغییر جای الکترودها میتونی اطلاعات متفاوتی از بخشهای مختلف قلب بگیری. تو دنیای پزشکی به این زاویههای دید مختلف، محور (Axis) میگن. وقتی پزشکها از کلمه لید (Lead) استفاده میکنن، منظورشون سیم و الکترود نیست؛ بلکه منظورشون اختلاف ولتاژ بین دو تا الکتروده!
یادت نره که مدار نوار قلب در اصل یک تقویتکننده تفاضلیه. الکترود پای راست (RL) فقط نقش اتصال زمین رو داره تا نویزها رو کم کنه. دستگاههای بیمارستانی معمولا 12 لید دارن که از ترکیب ولتاژ 6 الکترود روی سینه و دست و پاها به دست میان.
ما تو این پروژه از یه مدل سادهتر استفاده میکنیم که سه تا الکترود داره و اختلاف بین دست چپ و راست (لید I) رو به خوبی نمایش میده. برای اتصالهای حرفهایتر بیمارستانی این ترکیبها وجود داره: محل دقیق قرارگیری پدهای پزشکی معمولا اینجوریه:
- الکترود V1: فضای چهارم بیندندهای سمت راست
- الکترود V2: فضای چهارم بیندندهای سمت چپ
- الکترود V4: فضای پنجم بیندندهای روی خط عمودی نوک سینه
- الکترود V3: بین V2 و V4
- الکترود V6: تو خط زیربغل و همتراز با V4
- الکترود V5: بین V4 و V6
البته تو این پروژه ما نیازی به این همه الکترود نداریم و فقط با 3 تا پد کارمون راه میفته. محاسبات پشت پرده لیدهای پزشکی به این شکله:
- لید یک: اختلاف بین دست چپ و دست راست
- لید دو: اختلاف بین پای چپ و دست راست
- لید سه: اختلاف بین پای چپ و دست چپ
- سایر لیدهای تقویتشده (aVR, aVL, aVF) از میانگینگیری به دست میان
- لیدهای سینهای (V1 تا V6) هم با مقایسه هر الکترود با مرکز قلب محاسبه میشن
هر کدوم از این لیدها مثل یه دوربین عمل میکنن که دارن از یه زاویه خاص (3D) به فعالیت الکتریکی قلب نگاه میکنن. اگه ریتم قلب مشکل داشته باشه، شکل این موجها تو زاویههای مختلف تغییر میکنه و پزشک متوجه میشه کدوم بخش ماهیچه آسیب دیده.
به طور کلی، مشکلاتی که ممکنه تو شکل موج ببینیم به خاطر اینه که اسیلاتورهای قلب سرعتشون بهم ریخته، یا ماهیچهها به خاطر نرسیدن اکسیژن، سیگنال الکتریکی درستی تولید نمیکنن.
اتصال نمایشگر رنگی TFT به آردوینو
برای اینکه سیگنالها رو جذاب و زنده ببینیم، از یه نمایشگر 2.8 اینچی رنگی با کنترلر معروف ILI9341 و رزولوشن 320 در 240 پیکسل استفاده کردیم. خوبی این نمایشگر اینه که با پروتکل SPI کار میکنه؛ یعنی هم سرعتش مناسبه و هم پینهای کمتری از آردوینو رو درگیر میکنه.
کافیه تو بازار بگردی و یه نمایشگر SPI پیدا کنی که دقیقا شبیه عکسی که گذاشتم باشه. مدلهای بدون صفحه لمسی معمولا ارزونترن و کار ما رو هم راه میندازن.
تو این پروژه نیازی به تاچاسکرین نداریم. هدف ما اینه که دستگاه با چند تا باتری راهاندازی بشه. وقتی باتری کمکم خالی میشه، ولتاژش افت میکنه.
خبر خوب اینه که آردوینو، نمایشگر و ماژول ضربان قلب حتی با ولتاژ 3 ولت هم کار میکنن، اما قابلیت تاچ ممکنه زیر 4.5 ولت از کار بیفته. پینهای روی ماژول نمایشگر به این ترتیب هستن:
- پین VCC برای تغذیه 5 ولت
- پین GND برای اتصال به زمین
- پین CS برای انتخاب چیپ (Chip Select)
- پین RESET برای ریست کردن
- پین DC برای تفکیک دیتا و کامند
- پین MOSI برای دیتای ورودی (پروتکل SPI)
- پین SCK برای کلاک (پروتکل SPI)
- پین الایدی برای روشن کردن نور پسزمینه
- بقیه پینهایی که حرف T دارن مربوط به تاچ هستن و ما نادیدهشون میگیریم
اگه پشت نمایشگرت رو چک کنی، احتمالا یه رگولاتور 3.3 ولتی کوچیک (مدل 662 کیلواهم) میبینی که به پین VCC وصل شده. این یعنی میتونی با خیال راحت تغذیه 5 ولت آردوینو رو مستقیم به VCC نمایشگر و پین الایدی بکلایت وصل کنی.
حتما چک کن که این رگولاتور روی برد نمایشگرت باشه. اگه نبود و نمایشگرت دقیقا 3.3 ولت میخواست، نباید از پین 3.3 ولت آردوینو نانو استفاده کنی! چون این نمایشگرها حدود 50 میلیآمپر جریان میکشن که نزدیک به لبه تحمل رگولاتور نانو هست. تو این حالت بهتره یه رگولاتور خارجی تو مدارت اضافه کنی.
یه نکته خیلی مهم: پینهای منطقی و دیتای نمایشگر فقط 3.3 ولت رو تحمل میکنن! پس به هیچوجه نباید پینهای دیتای آردوینو که 5 ولت هستن رو مستقیم بهشون وصل کنی. من از مقاومت برای تقسیم ولتاژ و کاهش اون به 3.3 ولت استفاده کردم.
برای برنامهنویسی این نمایشگر، کتابخونههای زیادی مثل کتابخونه آدافروت وجود داره. اما مشکلی که هست اینه که این کتابخونهها خیلی سنگینن و حافظه آردوینو رو به سرعت پر میکنن.
مثلا فقط با کشیدن یه خط و چند تا متن ساده میبینی که 75 درصد حافظه پر شده! به همین خاطر من یه درایور اختصاصی و سبک برای این پروژه نوشتم.
مدار رو طبق شماتیک ببند و کدها رو آماده کن. برای اینکه مدیریت فایلها راحتتر باشه، من سورس کدها رو بدون نیاز به نصب تو پوشه Library آردوینو در نظر گرفتم. کافیه تمام این فایلها رو کنار هم تو یه پوشه قرار بدی:
- فایل اصلی اسкетچ یعنی ArdECG1.ino
- فایل هدر SimpleILI9341.h
- فایل کدهای کتابخونه SimpleILI9341.cpp
این کتابخونه سبک، تمام دستورات ضروری برای کشیدن خط، دایره و نوشتن متن رو داره. مزیت این کد نویسی اینه که از دستورات زبان C ساده استفاده شده و با اینکه از اسمبلی استفاده نکرده، سرعت خیلی خوبی داره و باعث اختلال تو ارتباط بقیه ماژولها روی گذرگاه SPI نمیشه. اگه به دیتاشیت ILI9341 نگاه کنی، متوجه میشی که چطور با ارسال کامند و دیتا میشه کنترلش کرد.
توابع tft_write دقیقا همین کار رو انجام میدن و پیکسلها یا تنظیمات رجیستر رو به نمایشگر میفرستن. اگر نمایشگری گرفتی که جهت تصویرش فرق داشت، میتونی وارد تابع ILI9341Begin بشی و دستورات مقداردهی اولیه رو متناسب با نیاز خودت تغییر بدی. کدها رو خیلی خوانا و تمیز نوشتم تا راحت بتونی شخصیسازیشون کنی.
راستی، تو مدار یه بخش به نام 'Fake Pulse' گذاشتم. این فقط برای دیباگ کردن و تسته. توی مدار نهایی که میخوای رو بدنت نصب کنی، اصلا نیازی به این مقاومتها نداری.
تو خطوط اول کدهای آردوینو هم یه بخش #define برای فعال یا غیرفعال کردن همین پالس مجازی وجود داره که موقع تست مدار میتونی ازش استفاده کنی.
آشنایی با حالتهای مختلف نمایش
برای اینکه بتونیم سیگنال رو تو ابعاد مختلف بررسی کنیم، یه دکمه فشاری تو مدار قرار دادیم که با زدنش، میتونی بین سه حالت مختلف نمایشگر جابهجا بشی:
- نمایشگر بزرگ (با جزئیات دقیق)
- نمایشگر کوچک (برای دیدن ریتم کلی)
- نمایشگر پوانکاره (برای بررسی تاریخچه ریتم قلب)
نمایشگر بزرگ بهت اجازه میده که یک یا دو ضربان قلب رو با بالاترین جزئیات ببینی. نمایشگر کوچک برای بررسی منظم بودن ریتم توی تعداد ضربانهای بیشتره، و صفحه پوانکاره هم برای تحلیل رفتار ضربان قلب در طول زمان طراحی شده.
توی قدمهای بعدی، دقیقا بهت میگم که تو هر کدوم از این صفحهها باید دنبال چه چیزی باشی تا بتونی ریتم قلبت رو به شکل بصری تحلیل کنی. این اطلاعات بر اساس همون گرافهای استاندارد و آموزشی پزشکی تهیه شده که واقعا بررسیشون روی بدنه خودت لذتبخش و هیجانانگیزه.
بررسی دقیق سیگنال در نمایشگر بزرگ
تو حالت نمایشگر بزرگ، میتونی زوم کنی روی یک یا نهایتا دو ضربان قلب و جزئیات دقیق شکل موج رو بررسی کنی. برای اینکه حس یه دستگاه پزشکی واقعی رو داشته باشه، پسزمینه رو به صورت یه شبکه با مربعهای قرمز رنگ طراحی کردم. این شبکهبندی دقیقا از همون مقیاس استاندارد بیمارستانی پیروی میکنه:
- محور افقی نمایانگر زمانه؛ هر مربع بزرگ معادل 200 میلیثانیهست.
- محور عمودی نشوندهنده ولتاژه؛ هر مربع بزرگ معادل 0.5 میلیولته.
البته تو دستگاههای واقعی، پزشکها میتونن سرعت حرکت نمودار و میزان تقویت سیگنال (Gain) رو تغییر بدن، اما مقیاس پیشفرضی که تو کتابها میبینی همین ابعاده.
گوشه بالا سمت چپ، عدد ضربان در دقیقه (BPM) نوشته شده. الگوریتمی که نوشتم سعی میکنه قلههای موج رو پیدا کنه و ضربان رو بشماره، اما اگه اتصالات الکترودها شل باشه یا نویز بیفته، ممکنه عدد درستی نشون نده.
کد طوری طراحی شده که همیشه قله موج رو تو یک سوم سمت چپ صفحه نگه داره تا نمودار زیاد پرش نداشته باشه و بتونی راحتتر بررسیش کنی. اگه قلبت کاملا منظم بزنه این ویژگی عالی کار میکنه، اما از اونجایی که قلب انسانها ذاتا ضربان کاملا یکنواختی نداره، ممکنه یه مقدار جابهجایی روی صفحه ببینی که طبیعیه. تو این حالت باید همون شکل موج معروف رو ببینی.
اولین برآمدگی کوچیکی که میبینی، موج P نام داره که نشوندهنده انقباض دهلیزهاست. بعد یه خط صاف کوتاه میبینی (قطعه PR) که همون زمان انتظار برای پر شدن بطنها از خونه.
اون پرش تند و تیز رو به بالا و پایین، کمپلکس QRS نام داره. این همون لحظه انفجاریه که بطنها منقبض میشن تا خون رو تو کل بدن پمپاژ کنن. بعدش باز یه توقف کوتاه داریم.
در نهایت، برآمدگی دوم یا موج T رو میبینی که نشوندهنده ریپلاریزاسیون یا لحظه استراحت بطنهاست. بعد از این استراحت، چرخه دوباره از اول شروع میشه.
یه موج کوچیک هم باید برای استراحت دهلیزها وجود داشته باشه اما چون دقیقا همزمان با انقباض شدید بطنها اتفاق میفته، زیر اون پالس بزرگ مخفی میشه و روی نمودار دیده نمیشه. با این اطلاعات پایه، میتونی متوجه بشی که تو قلبت چه خبره.
اگه دوست داشتی بیشتر در مورد این موجها بدونی، فقط کافیه عبارت 'تفسیر نوار قلب' رو جستجو کنی تا دنیای جذاب سیگنالهای زیستی برات باز بشه.
موج P بهت میگه که دهلیزها چطوری کار میکنن و آیا همگام هستن یا نه. اگه این موجها با بخش QRS هماهنگ نباشن، نشون میده که ارتباط بین اسیلاتورهای قلب نامنظم شده.
قطعه ST و شکل QRS وضعیت بطنها رو نشون میده. مثلا بالا رفتن قطعه ST تو پزشکی میتونه نشونه حمله قلبی باشه و پایین اومدنش ممکنه از نرسیدن اکسیژن به ماهیچهها خبر بده.
البته اگه قطعه ST روی نمایشگرت بالا و پایین رفت، اصلا نترس! چون تو پروژههای خونگی، این اتفاق معمولا به خاطر اتصال بد الکترودها به پوست رخ میده نه مشکلات قلبی!
مشاهده ریتم کلی در نمایشگر کوچک
تو حالت نمایشگر کوچک، صفحه زوم اوت میشه تا بتونی چند تا ضربان رو کنار هم ببینی و ریتم کلی قلبت رو بررسی کنی. ضربان قلب طبیعی آدما به سنشون بستگی داره:
- 3 تا 5 سال: 80 تا 120 ضربان در دقیقه
- 6 تا 10 سال: 70 تا 110 ضربان در دقیقه
- 11 تا 14 سال: 60 تا 105 ضربان در دقیقه
- بزرگسالان: 60 تا 100 ضربان در دقیقه
جالبه بدونی به طور متوسط، ضربان قلب خانمها حدود 4 تا از آقایون بیشتره و هرچی سن بالاتر میره، میانگین ضربان کمتر میشه. اگه ضربان تو حالت استراحت زیر 60 باشه بهش 'برادیکاردی' میگن. و اگه بالای 100 باشه، 'تاکیکاردی' نام داره.
البته این عددها مربوط به حالت استراحته و اگه در حال ورزش کردن یا هیجانزده باشی، بالا رفتنش کاملا طبیعیه. زمان بین هر ضربان (که بهش فاصله R-R میگن) هم ممکنه کمی تغییر کنه. به این تغییرات جزئی بین ضربانها، HRV (تغییرپذیری ضربان قلب) میگن.
از نظر پزشکی، داشتن HRV بالا یه نشونه مثبته؛ یعنی قلبت به قدری سالمه که میتونه خیلی سریع خودش رو با شرایط جدید وفق بده. هرچی ضربان تندتر بشه، این متغیر بودن کمتر میشه. با بالا رفتن سن یا وجود مشکلاتی مثل دیابت، مقدار HRV کاهش پیدا میکنه. بعضی وقتها ممکنه یه ضربان خیلی زودتر یا دیرتر از بقیه اتفاق بیفته که بهش ضربان نابهجا (Ectopic) میگن.
وقتی سیستم هدایت الکتریکی قلب یه کوچولو قاطی کنه، این حالت پیش میاد. معمولا سیستمهای تحلیل کامپیوتری اگه اختلاف زمانی بین دو ضربان بیشتر از 20 تا 30 درصد بشه، اون رو یه پرش در نظر میگیرن.
خیلی وقتها این پرشهای کوچیک جای نگرانی ندارن و ممکنه به خاطر مصرف زیاد کافئین، استرس روزمره یا بیخوابی باشن که تو این صفحه به راحتی قابل دیدنه.
تحلیل ضربان با نمودار پوانکاره (Poincaré)
نمودار پوانکاره (Poincaré) یه روش خیلی جذاب و متفاوت برای نگاه کردن به عملکرد قلبه. تو این حالت، زمان بین دو ضربان اول روی محور X و زمان ضربان بعدی روی محور Y رسم میشه. ما تا 500 تا از این نقاط رو تو حافظه آردوینو ذخیره میکنیم و وقتی پر شد، نقاط قدیمی با رنگ مشکی پاک میشن تا نقاط جدید کشیده بشن. محورهای این نمودار بر اساس واحد BPM (ضربان در دقیقه) درجهبندی شدن.
خیلی از محققها معتقدند که پیدا کردن نامنظمیهای قلب (مثل پرشها یا همون HRV) با این نمودار خیلی راحتتر از نگاه کردن به شکل موجهای طولانیه. با یه نگاه به پراکندگی این نقاط میتونی وضعیت کلی رو متوجه بشی. تو یه قلب سالم با ریتم طبیعی، این نقاط معمولا یه خوشه بیضیشکل یا یه نوار مورب رو تشکیل میدن که نشوندهنده عملکرد منظمه.
هر چی این خوشه یا نوار پهنتر باشه، یعنی میزان HRV بالاتره. وقتی ضربان بالا میره، این خوشه فشردهتر میشه. اگه ضربان قلب خیلی بالا باشه (تاکیکاردی)، این نقاط تو یه محدوده کوچیک سمت پایین و چپ جمع میشن.
برعکس، اگه ضربان خیلی پایین باشه، نقاط سمت بالا و راست پخش میشن. اگه قلب آریتمی (نامنظمی شدید) داشته باشه، این نقطهها حسابی پراکنده میشن و از محور مورب اصلی فاصله میگیرن.
مثلا فیبریلاسیون یا لرزش قلب، مثل یه ابر بزرگ و نامنظم از نقاط تو قسمت پایین سمت چپ دیده میشه، یا توقف ناگهانی ضربان، نقاطی رو تو بخشهای بالایی و میانی نمودار ایجاد میکنه. این حالت نمایش برای کشف رازهای ریتم قلبت بینظیره!
حذف نویزها با فیلترهای دیجیتال
وقتی مدار رو با باتری روشن میکنی و الکترودها هم کامل به پوستت چسبیدن، نویز مدار خیلی کمه. اما از اونجایی که ما داریم یه سیگنال فوقالعاده ضعیف رو تقویت میکنیم، ممکنه نویزهای محیطی (مثل برق شهر) روی نمودار تأثیر بذارن. برای حل این مشکل، من از فیلترهای دیجیتال تو کدهای آردوینو استفاده کردم. نحوه کار فیلترهای دیجیتال دنیای بزرگی داره که اینجا فقط به نتیجهش بسنده میکنیم.
چون نرخ نمونهبرداری ما نسبتا پایینه (هر 5 میلیثانیه یک بار)، آردوینو وقت کافی داره تا قبل از نمایش، محاسبات ریاضی این فیلترها رو انجام بده. ضرایب این فیلترها بهینهسازی شدن تا دقیقا نویزهای مزاحم رو سرکوب کنن.
یه نکته مهم تو فیلتر کردن اینه که نباید به شکل موج اصلی قلب آسیب بزنیم! مثلا بخشهای Q و S موج قلب، فرکانسهایی دارن که خیلی نزدیک به فرکانسهای نویز هستن. پس فیلتر ما باید انقدر هوشمند باشه که نویز رو حذف کنه اما موج اصلی رو تغییر نده. اگه فیلتر اشتباه طراحی بشه، کلا شکل سیگنال به هم میریزه.
من اول از یه فیلتر پایینگذر 40 هرتز استفاده کردم که تا حدودی نویزها رو کم کرد. اما وقتی دستم رو به وسایل برقی مثل چراغ مطالعه نزدیک میکردم، نویز خیلی شدید میشد. به همین دلیل یه فیلتر حذف باند (Notch) پنجاه هرتز به کد اضافه کردم که نویز برق شهر رو مثل آب خوردن پاک کرد! نتیجه کار فوقالعاده شد. مشخصه که دشمن اصلی سیگنالهای ضعیف حیاتی، همون نویز و هام (Hum) برق شهریه.
چون تو بعضی کشورها فرکانس برق 60 هرتزه، من فیلتر 60 هرتز رو هم تو کدها گذاشتم که در صورت نیاز فعالش کنی. البته شخصا به دستکاری زیاد دیتای خام اعتقادی ندارم.
حقیقت ماجرا همون دیتاییه که مستقیم از مبدل آنالوگ به دیجیتال (ADC) بیرون میاد. فیلترها فقط این دیتا رو خوشگلتر و صافتر میکنن تا دیدنش برامون لذتبخشتر باشه.
یه فیلتر بالاگذر 2 هرتز هم تست کردم تا شاید بتونم تغییرات ناشی از تکون خوردن ماهیچهها رو حذف کنم، اما متأسفانه شکل موجهای حساس P و T رو کلا به هم ریخت. پس بیخیالش شدم و از تو کد حذفش کردم.
توی تابع loop در سورس کدهای آردوینو، خطوط مربوط به این فیلترها رو مشخص کردم که خیلی راحت میتونی با برداشتن علامت کامنت (//)، هر کدوم رو که دوست داشتی فعال یا غیرفعال کنی.
اسمبل و سرهم کردن قطعات مدار
برای اینکه پروژه نهایی خیلی جمعوجور و تمیز دربیاد، من مقاومتهای تقسیم ولتاژ رو روی یه تیکه کوچیک برد سوراخدار (Stripboard) لحیم کردم و مستقیم به پینهای نمایشگر وصل کردم. ماژول AD8232 رو هم با یه چسب دوطرفه ضخیم، پشت نمایشگر چسبوندم. آردوینو نانو هم خیلی تمیز و مرتب با سیمهای کوتاه بین این دو تا ماژول قرار گرفت. نتیجه کار یه بسته فشرده و محکم شد که به راحتی قابل جابهجاییه.
برای قاب دستگاه هم میتونی از پرینتر سهبعدی استفاده کنی، اما من با استفاده از یه ورقه پلاستیکی (پلیاستایرن) 0.7 میلیمتری و کمی چسب، یه جعبه کلاسیک و جذاب ساختم. برای بندش هم از یه کش پهن استفاده کردم تا راحت روی دست یا وسایل سوار بشه.
یه ترفند خیلی عالی برای از بین بردن نویز اینه که داخل قاب رو با یه لایه فویل آلومینیومی آشپزخونه بپوشونی. بعد یه تیکه سیم رو لخت کن و مثل یه برس به فویل بچسبون و سر دیگهش رو به زمین (GND) مدار وصل کن. اینطوری یه شیلد محشر ساختی که جلوی نویزهای محیط رو میگیره!
تأمین انرژی و منبع تغذیه دستگاه
حالا نوبت میرسه به راهاندازی و روشن کردن دستگاه. کل این مدار در حین کار حدود 127 میلیآمپر جریان میکشه. اگه بخوایم حداقل 8 ساعت مداوم روشن بمونه، به یه باتری با ظرفیت حدود 1000 میلیآمپر ساعت نیاز داریم.
نکته خیلی جالب اینجاست که آردوینو، ماژول ضربان قلب و نمایشگر رنگی، همگی با یه ولتاژ 3.7 ولتی که مستقیم به پین 5 ولت آردوینو وصل شده باشه، به خوبی کار میکنن.
البته وقتی ولتاژ باتری کمکم افت میکنه و به 3 ولت میرسه، نور نمایشگر یه خورده کم میشه، ولی مدار همچنان کار میکنه و سیگنالها رو از دست نمیدی.
اولین ایدهای که به ذهن میرسه، استفاده از 4 تا باتری قلمی (AA) هست. این باتریها ظرفیت بالایی دارن و ولتاژ اولیهشون روی هم بیش از 6 ولته که با مرور زمان به 4.8 ولت میرسه.
اما حواست باشه! آردوینو تحمل ولتاژ 6 ولت رو روی پین 5 ولت نداره، پس اگر خواستی از باتری قلمی استفاده کنی حتما اونها رو به پین Vin آردوینو وصل کن. رگولاتور داخلی آردوینو ولتاژ رو کاهش میده و در طول عمر باتری، ولتاژ پین 5 ولت رو روی حد ایمن نگه میداره. باتریهای قلمی گزینه خوبی هستن و سریع هم تعویض میشن، اما یه مشکل بزرگ دارن و اون هم ابعاد و وزن نسبتا بالاشونه.
اگه از باتری قلمی استفاده کنیم، دستگاه ظریفمون تبدیل میشه به یه گجت که یه کولهپشتی باتری روی دوشش داره! برای همین، بهترین و تمیزترین راه حل، استفاده از یه باتری لیتیومی تکسلول 3.7 ولتیه. باتریهای لیتیومی با ظرفیت 1000 میلیآمپر ساعت (مثل مدلهایی که تو دوربینهای عکاسی قدیمی استفاده میشد) هم وزن خیلی کمی دارن و هم فضای خیلی کمی رو اشغال میکنن.
وقتی این باتری لیتیومی رو مستقیم به پین 5 ولت آردوینو وصل میکنی، مدارت تو بهترین حالت ممکن کار میکنه و طراحی خیلی سادهتر میشه. من برای شارژ راحتتر، یه جک تغذیه و ماژول شارژر لیتیومی هم به مدار اضافه کردم.
فقط یادت باشه یه کلید الاکلنگی (روشن/خاموش) دوحالته بذاری تا باتری فقط در یکی از دو حالت به مدار وصل بشه: یا روشن بودن دستگاه، یا وصل بودن به شارژر. اینطوری از روشن شدن دستگاه در حالی که تو شارژه جلوگیری میشه و ایمنی دستگاهت به شدت بالا میره.
ایدههایی برای توسعه پروژه
حالا که دستگاه نوار قلب خودت رو ساختی، میتونی به فکر ارتقا و اضافهکردن امکانات خفنتر بهش باشی. مثلا چی میشد اگه بتونی اطلاعات قلبیت رو برای یه روز کامل ذخیره کنی؟ با سرعت نمونهبرداری ما، تو یه روز حدود 17 مگابایت دیتا تولید میشه. اولین چیزی که به ذهن میرسه استفاده از ماژول کارت حافظه (SD Card) هست، اما نوشتن دیتا روی کارت حافظه زمان متغیری داره.
گاهی تو 2 میلیثانیه ذخیره میشه و گاهی ممکنه 200 میلیثانیه طول بکشه! برای حل این مشکل، میتونی از یه آردوینو دوم برای دریافت دیتا از آردوینو اول و انتقال پیوستهش به کارت حافظه استفاده کنی تا وقفهای تو خوندن ضربانها ایجاد نشه.
یا میتونی از تراشههای حافظه فلش با سرعت بالا استفاده کنی. ولی مزیت کارت SD اینه که خیلی راحت از ماژول درش میاری و به کامپیوترت وصل میکنی.
اگه دیتا رو روی سیستم بریزی، میتونی با فرمتهای استاندارد پزشکی تحلیلش کنی. اینجاست که داشتن نمودار پوانکاره برای تحلیل دیتای یک روز کامل، خودش رو نشون میده. یه ایده خفن دیگه، ترکیب این پروژه با یه پالساکسیمتر انگشتیه تا بتونی زمان رسیدن پالس (PAT) رو اندازهگیری کنی. این یعنی اختلاف زمانی بین شروع پمپاژ قلب تو نمودار ECG و لحظه رسیدن خون به نوک انگشتت رو حساب میکنی.
این روش، بعد از کالیبره شدن، یه راه کاملا غیرتهاجمی و جالب برای تخمین زدن فشار خون در طول روزه. همچنین میشه از این گجت به عنوان یه سنسور حرکت چشم (الکترواوکولوگراف) استفاده کرد! اگه الکترودها رو گوشه خارجی چشمها بچسبونی، با چپ و راست کردن چشمت یه سیگنال تغییر ولتاژ روی صفحه میبینی.
البته چون ماژول AD8232 فیلترهای داخلی برای حذف فرکانسهای زیر 5 هرتز داره، این سیگنال چشمی سریعا فیلتر میشه. ولی اگه از خود چیپ خام AD8232 بدون قطعات ماژول استفاده کنی و فیلترهاش رو دستکاری کنی، میتونی یه ردیاب چشم باحال برای پروژههای کنترلی بسازی. حتی پلک زدن هم با اتصال الکترودها به بالا و پایین چشم کاملا قابل ثبته.
من سعی کردم با این دستگاه فعالیت الکتریکی عضلات (EMG) رو هم تست کنم، اما چون سیگنال عضلات فرکانسهای بالایی دارن، فیلترهای این ماژول حذفشون میکنن.
امیدوارم از ساخت این پروژه بینظیر نهایت لذت رو برده باشی و مطالب مفیدی درباره الکترونیک پزشکی یاد گرفته باشی. هر ایدهای برای ارتقای این دستگاه داری یا اگه توی مراحل ساختش تجربهای کسب کردی، حتما تو بخش کامنتهای آیسیمدار برامون بنویس. مشتاقانه منتظر دیدن پروژههای کاملشده تو هستیم. موفق باشی!
فایلهای پیوست
تو میتونی اولین سازنده باشی!
اگه پروژه رو ساختی به اشتراک بزار و اعتبار هدیه بگیر
این آموزش با استانداردهای اختصاصی آیسیمدار بازنویسی و بهینهسازی شده و تمامی حقوق انتشار آن متعلق به این مجموعه است و در صورت کپی یا بازنشر پیگرد قانونی خواهد داشت.








































گفتگوهای کاربران
هنوز نظری ثبت نشده؛ تو شروع کن!
هنوز نظری ثبت نشده؛ تو شروع کن!