תוכן עניינים:

מד דופק עם דיוק משופר בהרבה: 6 שלבים (עם תמונות)
מד דופק עם דיוק משופר בהרבה: 6 שלבים (עם תמונות)

וִידֵאוֹ: מד דופק עם דיוק משופר בהרבה: 6 שלבים (עם תמונות)

וִידֵאוֹ: מד דופק עם דיוק משופר בהרבה: 6 שלבים (עם תמונות)
וִידֵאוֹ: שעון חכם שעושה הכל 2024, נוֹבֶמבֶּר
Anonim
מד דופק עם דיוק משופר בהרבה
מד דופק עם דיוק משופר בהרבה
מד דופק עם דיוק משופר בהרבה
מד דופק עם דיוק משופר בהרבה

אם ביקרת לאחרונה אצל רופא, רוב הסיכויים שהסימנים החיוניים הבסיסיים שלך נבדקו על ידי אחות. משקל, גובה, לחץ דם, כמו גם קצב לב (HR) ורוויה חמצן בדם היקפי (SpO2). אולי, השניים האחרונים התקבלו מתוך בדיקת אצבע אלקטרונית זוהרת באדום שהציגה מספרים רלוונטיים על מסך זעיר תוך דקות. בדיקה זו נקראת אוקסימטר דופק ותוכל למצוא את כל המידע הבסיסי אודותיה כאן.

אפשר בקלות לקנות אוקסימטר דופק פשוט, בטוח, אבל איפה הכיף בו? החלטתי לבנות משלי, קודם כל, אבל יותר חשוב מתוך מחשבה על יישום ספציפי: אוקסימטריה לילית שבה הן HR ו- SpO2 הנתונים ייאספו באופן רציף בן לילה וירשמו על כרטיס מיקרו SD. Instructables כבר מכיל מספר פרויקטים מסוג זה, למשל, שניים בהם מעורבים Arduino כאן וכאן, ואחד שמשתמש ב- Raspberry Pi. שלי משתמש בחיישן מעט חדש יותר MAX30102 מבית MAXIM Integrated ו- Adafruit's Feather M0 Adalogger לשליטה והקלטת נתונים.

הפרויקט שלנו לפיכך אינו חדשני במיוחד מבחינת חומרה וככזה לא יהיה ראוי לכתוב את המדריך הזה, אך בתהליך יצירתו התקדמתי במכשירי תוכנה שאפשרו לי לחלץ נתונים מ- MAX30102 בעקביות הרבה יותר גבוהה והרבה פחות רעש מאשר תוכנה שנכתבה על ידי MAXIM לחיישן זה. הביצועים של אלגוריתם עיבוד האותות שלנו מוצגים בתרשים לעיל, שם שני הגרפים העליונים מכילים דופק לילה ורוויית חמצן המחושבים מאותות גולמיים בשיטה שלנו (המזוהים על ידי "RF"), בעוד ששני הגרפים התחתונים מראים את התוצאות של MAXIM המיוצרות מתוך אותם אותות בדיוק. סטיות תקן עבור HR הן 4.7 bpm ו- 18.1 bpm, ו- SpO2 0.9% ו -4.4%, עבור RF ו- MAXIM, בהתאמה.

(שני גרפי ה- RF תואמים לסף מינימלי של אוטוקורלציה של 0.25 ואין הגבלה על המתאם R / IR; ראה שלבים 4 ו -5 להסבר על מונחים אלה.)

שלב 1: חומרה

חוּמרָה
חוּמרָה
חוּמרָה
חוּמרָה
חוּמרָה
חוּמרָה
חוּמרָה
חוּמרָה
  1. חמצן דופק וחיישן דופק לוח מערכת MAX30102 מבית MAXIM Integrated, Inc.
  2. Feather M0 Adalogger מבית Adafruit, Inc.
  3. סוללת ליתיום יון מבית Adafruit, Inc.

חיבורים:

  • סיכות Adalogger SCL ו- SDA לסיכות SCL ו- SDA המתאימות על לוח MAX30102
  • Adalogger pin 10 to pin INT on board MAX30102
  • Adalogger GND ל- MAX30102 לוח GND
  • Adalogger 3V ל- MAX30102 VIN

שלב 2: אותות דיגיטליים שהוחזרו על ידי MAX30102

אותות דיגיטליים שהוחזרו על ידי MAX30102
אותות דיגיטליים שהוחזרו על ידי MAX30102
אותות דיגיטליים שהוחזרו על ידי MAX30102
אותות דיגיטליים שהוחזרו על ידי MAX30102

עקרונות פעולת החיישנים פשוטים מאוד: שני נוריות LED, אחת אדומה (660 ננומטר) ואחת אינפרא אדום (880 ננומטר, IR) מאירות אור דרך עור האדם. האור נספג חלקית ברקמות הבסיסיות, כולל דם היקפי. פוטודקטור החיישן אוסף אור מוחזר בשני אורכי הגל ומחזיר שתי עוצמות יחסיות מתאימות באמצעות פרוטוקול I2C. מאחר וספקטרום הספיגה של המוגלובין מחומצן ומחוסר חמצון שונה בשני אורכי הגל, לאור המוחזר יש מרכיב משתנה ככמות הדם העורקי הנמצא מתחת לעור פועמת בכל פעימת לב. להבין את קצב הלב ורוויית החמצן תלוי בתוכנת עיבוד האותות.

דוגמאות לאותות גולמיים (ערוץ IR בלבד) מוצגים בתמונות לעיל. אפשר להבחין ברכיב תקופתי שעוטף על בסיס בסיס משתנה המשתנה עקב מספר גורמים המוזכרים בדף ויקיפדיה. חפצים הנגרמים על ידי תנועה מעצבנים במיוחד מכיוון שהם עלולים להסוות את אות ה- HR השימושי ולגרום לתוצאות מזויפות. מכאן שאוקסימטרים מסחריים מתקדמים כוללים מדי תאוצה המסייעים לביטול פריטים אלה.

אני יכול להוסיף מד תאוצה לגירסה הבאה של האוקסימטר שלי, אבל עבור HR/SpO לילי2 הקלטה, כאשר החיישן נשאר רוב הזמן ללא תנועה, מספיק לזהות ולהשמיט אותות מעוותים.

חיישן MAX30102 עצמו מגיע באריזה זעירה על גבי משטח, אך MAXIM מציעה באדיבות לוח פריצה (לוח מערכת 6300) בתוספת תוכנת עיבוד אותות עבור Arduino ו- mbed - הכל בחבילת עיצוב הייחוס MAXREFDES117#. קניתי אותו בשמחה מתוך ציפייה להלחים כמה חוטים בין החיישן לאדלוגר ויהיה לי אוקסימטר טוב ויעיל ביום אחד. התאמתי את גרסת RD117_ARDUINO של תוכנת MAXIM להפעלה על מעבד ה- ARM Cortex M0 של Adalogger. ביסודו של דבר, כל מה שעלי לעשות היה להחליף פונקציות SofI2C לא תואמות ב- max30102.cpp בשיחות הספרייה המתאימות של Wire. הקוד התאסף בסדר ב- Arduino IDE v1.8.5 ורץ על M0 ללא שגיאות. התוצאות נטו, לעומת זאת, היו מאכזבות. בשלב המבוא כבר הראיתי שונות מאוד גבוהה של HR ו- SpO2. מטבע הדברים, אפשר לטעון שעשיתי משהו לא בסדר וגם זו הייתה המחשבה המקורית שלי. עם זאת, בסרטון ההדרכה של MAXIM אתה יכול גם לצפות בערכי HR מתנדנדים בפראות המוצגים על המסך. יתר על כן, הערות מתחת לסרטון מאשרות שאחרים שמו לב לתופעה דומה.

כדי לקצר סיפור ארוך, לאחר כמה ניסויים קבעתי שהחיישן פועל כשורה ושיטה חלופית לעיבוד אותות דיגיטליים מביאה ליציבות טובה בהרבה. שיטה חדשה זו, המסומנת על ידי "RF", מתוארת בשלבים הבאים.

שלב 3: עיבוד מוקדם של אותות

עיבוד מוקדם של האות
עיבוד מוקדם של האות
עיבוד מוקדם של האות
עיבוד מוקדם של האות
עיבוד מוקדם של האות
עיבוד מוקדם של האות
עיבוד מוקדם של האות
עיבוד מוקדם של האות

ביישום שלנו, האות הגולמי נאסף בקצב של 25 הרץ (זהה לזה של MAXIM) למשך 4 שניות מלאות (התוכנה של MAXIM אוספת ערך של שנייה אחת בלבד), וכתוצאה מכך 100 נקודות זמן דיגיטאליות לנקודת נתוני קצה. כל רצף של 100 נקודות חייב להיות מעובד מראש באופן הבא:

  1. ריכוז ממוצע (כלומר "הסרת רכיב ה- DC" למהנדסי חשמל). הנתונים הגולמיים המגיעים מהחיישן הם סדרת זמן של מספרים שלמים ב -105 טווח. אולם האות השימושי הוא רק חלק מאור המוחזר מדם עורקי המשתנה בסדר גודל של 10 בלבד2 - דמות ראשונה. לצורך עיבוד אותות משמעותי, לכן רצוי להפחית את הממוצע מכל נקודת סדרה. חלק זה אינו שונה ממה שתוכנת MAXIM כבר עושה. אולם השונה הוא ריכוז אמצעי נוסף של מדדי הזמן עצמם. במילים אחרות, במקום אינדקס נקודות סדרה במספרים מ 0 עד 99, המדדים החדשים הם כעת מספרים -49.5, -48.5, …, 49.5. זה אולי נראה מוזר בהתחלה, אך בזכות הליך זה "מרכז הכובד" של עקומת האות עולה בקנה אחד עם מקור מערכת הקואורדינטות (איור שני). עובדה זו הופכת להיות שימושית למדי בשלב הבא.
  2. הרמה בסיסית. מבט נוסף על צורות הגל המוצגות בשלב 2 ממחיש כי קו הבסיס של אותות האקסימטריה האמיתיים רחוק מלהיות שטוח אופקית, אך משתנה במורדות שונים. איור שלישי מציג אות IR ממוצע ממוצע (עקומה כחולה) וקו הבסיס שלו (קו ישר כחול). במקרה זה, שיפוע הקו הבסיסי שלילי. שיטת עיבוד האותות המתוארת מראש דורשת כי בסיס הבסיס יהיה אופקי. ניתן להשיג זאת על ידי הפחתת קו הבסיס מהאות המרוכז. הודות למיקוד המרכזי של שני הקואורדינטות Y ו- X, יירוט קו הבסיס הוא אפס ומשוואת השיפוע שלו פשוטה במיוחד, כפי שמוצג באיור הרביעי. האות ברמת הבסיס מוצג בעקומה כתומה באיור השלישי.

כך האות המעובד מוכן לשלב הבא.

שלב 4: סוס העבודה: פונקציית מתאם אוטומטי

סוס העבודה: פונקציית מתאם אוטומטי
סוס העבודה: פונקציית מתאם אוטומטי
סוס העבודה: פונקציית מתאם אוטומטי
סוס העבודה: פונקציית מתאם אוטומטי
סוס העבודה: פונקציית מתאם אוטומטי
סוס העבודה: פונקציית מתאם אוטומטי

אם נחזור לאינדקס הרגיל של 1,…, n, האיור הראשון מראה הגדרה של פונקציית המתאם האוטומטי rM - כמות שנמצאה שימושית מאוד באיתור מחזוריות האות ואיכותה. זהו פשוט תוצר סקלרי מנורמל של סדרת הזמן של האות כשהוא משתנה לפיגור מ. ביישום שלנו, עם זאת, נוח לגדל כל ערך מתאם אוטומטי ביחס לערכו בפיגור = 0, כלומר להשתמש באוטוקורלציה יחסית המוגדרת על ידי rM / r0.

העלילה של האוטוקורלציה היחסית של אות IR טיפוסי באיכות טובה מוצגת באיור השני. כצפוי, הערך שלו בפיגור = 0 הוא המקסימום הגלובלי שלו שווה ל 1. המקסימום הבא (המקומי) מתרחש בפיגור = 23 ושווה ל -0.79. קל להבין את הנוכחות של מינימום ומקסימום מקומיים בעלילה של אוטוקורלציה: ככל שהאות משתנה ימינה פסגותיו מפריעות הרסניות זו לזו בהתחלה, אך בשלב מסוים ההפרעה הופכת להיות בונה ומשיגה את המקסימום בפיגור השווה לממוצע. תקופת האות.

הביטוי האחרון הוא מכריע: על מנת לקבוע את פרק הזמן הממוצע בין הפסגות, שממנה ניתן לחשב את תדירות האות (כלומר, קצב הלב) מספיק למצוא את המקסימום המקומי הראשון של פונקציית המתאם האוטומטי! כברירת מחדל, MAX30102 מדגם קלט אנלוגי בקצב של 25 נקודות לשנייה, ולכן במיקום נתון התקופה בשניות שווה ל- m / 25. זה מוביל לדופק המתבטא בפעימות לדקה (bpm) על ידי:

HR = 60*25 / m = 1500 / m

כמובן, אין צורך לבצע חישובים יקרים של rM בכל ערכי הפיגור. האלגוריתם שלנו מנחש את הדופק הראשון של דופק = 60 bpm, המתאים ל- m = 25. פונקציית המתאם האוטומטי מוערכת בנקודה זו ובהשוואה לערך בשכנו השמאלי, m = 24. אם ערך השכנים גבוה יותר, אזי הצעדה ממשיכה שמאלה עד rm-1 <rM. לפיכך, מ 'הסופי שנקבע מוחזר לאחר הפיגור למקסימום. האיטרציה הבאה מתחילה בערך זה במקום 25 וכל התהליך חוזר על עצמו. אם השכן השמאלי הראשון נמוך יותר, אזי הצעדות השגרתיות הנ"ל מצביעות על פינה ימינה באופן דומה. רוב הזמן, פיגור במקסימום דורש רק כמה הערכות של פונקציית המתאם האוטומטי. בנוסף, פיגור מקסימלי ומינימלי מקובל (המקביל לדופק מינימלי ומקסימלי בהתאמה) משמשים כערכים מגבילים.

האמור לעיל עובד טוב מאוד עבור אותות באיכות טובה, אך העולם האמיתי רחוק מלהיות אידיאלי. חלק מהאותות יוצאים מעוותים, בעיקר בשל חפצי תנועה. אות כזה מוצג באיור השלישי. מחזוריות ירודה באה לידי ביטוי בצורה של תפקוד האוטוקורלציה שלה וכן בערך נמוך, 0.28, של המקסימום המקומי הראשון ב- m = 11. השווה אותו לערך המקסימלי של 0.79 שנקבע לאות באיכות טובה. יחד עם ערכי הגבלת פיגור, לפיכך, הערך של rM / r0 מקסימום הוא אינדיקטור טוב לאיכות האות וניתן להשתמש בדרישה שלו לחרוג מסף מסוים כדי לסנן חפצי תנועה. הגרפים "RF" המוצגים במבואות נבעו מסף כזה השווה ל- 0.25.

שלב 5: קביעת רוויית חמצן

קביעת רוויית חמצן
קביעת רוויית חמצן
קביעת רוויית חמצן
קביעת רוויית חמצן
קביעת רוויית חמצן
קביעת רוויית חמצן
קביעת רוויית חמצן
קביעת רוויית חמצן

השלב הקודם הספיק לקביעת קצב הלב. ה- SpO2 דורש יותר עבודה. ראשית, יש לקחת בחשבון את האות המוזנח עד כה בערוץ האדום (R). לאחר מכן, יחס האותות לאדום לאנפרא אדום, Z = R/IR, שניהם משתקפים מהדם העורקי, מחושב. חלק "הדם העורקי" הוא קריטי, מכיוון שרוב האור מוחזר למעשה מרקמות ומדם ורידי. כיצד לבחור חלק מהאות המתאים לדם עורקי? ובכן, זהו המרכיב הפועם המשתנה עם כל דופק. במילים של מהנדסי חשמל, זהו "חלק AC", ואילו האור המוחזר שנותר הוא "החלק DC". מכיוון שעוצמות מוחלטות של אור R ו- IR אינן מתאימות, יחס Z מחושב מתוך עוצמות יחסית, כפי שמוצג באיור הראשון. במונחים של כמויות שחושבו בפועל, אני משתמש בשורש ממוצע-ריבוע (RMS) של האות המרוכז בממוצע, ברמת הבסיס, y, לממוצע המוכר כבר של האות הגולמי, <Y>; ראה איור שני. יחס ה- Z הוא רק חצי מהעבודה. תגובת החיישן הלא לינארית דורשת כיול אמפירי בין Z לבין ה- SpO הסופי2 ערכים. לקחתי את משוואת הכיול מהקוד של MAXIM:

SpO2 = (-45.06*Z + 30.354)*Z + 94.845

זכור שמשוואה זו תקפה רק ללוח עיצוב MAX30102 שנרכש בשנת 2017! סביר ש- MAXIM עשויה לכייל מחדש את החיישנים שלה במועד מאוחר יותר.

ההליך לעיל עדיין מייצר הרבה SpO שקרי2 קריאות. הערוץ האדום סובל מממצאים רבים, ממש כמו ה- IR. סביר להניח כי שני האותות צריכים להיות בקורלציה חזקה. למעשה, אותות באיכות טובה, כמו הדוגמה באיור השלישי, אכן מתואמים היטב. מקדם המתאם של פירסון גבוה במקרה זה עד 0.99. לא תמיד זה המצב, כפי שמודגם באיור הרביעי. למרות שאות ה- IR יעבור את מסנן איכות הדופק עם r שלוM / r0 = 0.76, האות R המעוות מביא למקדם מתאם גרוע בין השניים השווה ל- 0.42 בלבד. תצפית זו מציעה את מסנן האיכות השני: בעל מקדם המתאם בין ערוצים גבוה מסף מסוים.

שתי הדמויות האחרונות מדגימות את ההשפעה נטו של סינון איכותי שכזה. ראשית, רוויית החמצן הנמדדת מתוארת עם סף איכות HR של 0.25, אך ללא ה- SpO2 לְסַנֵן. תוצאות העלילה הבאות מסינון HR ו- SPO גרועים2 תוצאות ב- 0.5 rM / r0 ו -0.8 ספי מקדם מתאם. בסך הכל, נקודות נתונים גרועות בהיקף של 12% מהסך הכל סוננו על ידי המשטר המחמיר.

בקוד שלנו מקדם המתאם, cc, מחושב על פי הנוסחה באיור החמישי, כאשר y מייצג את האות המרוכז בממוצע, ברמת הבסיס, ואילו r0 הוגדר בשלב הקודם.

שלב 6: קוד המקור

קוד המקור C לפרויקט זה, המעוצב עבור Arduino IDE, זמין מחשבון Github שלנו בקישור הבא:

github.com/aromring/MAX30102_by_RF

דף ה- Readme שלו מתאר רכיבים בודדים.

ברצוני לקחת רגע לשבח את Adafruit על ייצור מוצר כה מעולה כמו Adalogger מבוסס M0. מעבד ה- ARM Cortex M0 המהיר של 48 מגה -הרץ, עם הרבה זיכרון RAM, בהחלט עזר להפוך את הפרויקט הזה לכדאי, בעוד שקורא כרטיסי SD המחובר ישירות (בתוספת ספריית ה- SD של Adafruit) מסיר את כל כאבי החובבים הקשורים לאחסון בזמן אמת של כמויות גדולות של נתונים.

מוּמלָץ: