צמיד לאיתות על התקפי אפילפסיה

C:\Users\user\Downloads\P_20180115_153031.jpg

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

יוצרת הפרויקט: בת-ציון מצגר

תחום הפרויקט: ארדואינו

דרגת קושי: בינוני

 

תיאור הפרויקט:

פרויקט גמר להנדסאי אלקטרוניקה

צמיד אפילפסיה

נחמה בת-ציון מצגר

תשע"ח – 2018

מנחים: מר מוטי מאיר ומר גאורגי שרייבמן

תוכן עניינים – 2

תודות – 3

תקציר הפרויקט – 4

הצעת פרויקט – 5

תרשים מלבנים – 6

שרטוטים חשמליים -8

הסברי רכיבים חשמליים – 11

מיקרו-בקר (ארדואינו ננו)-11

מד תאוצה -12

משדר / מקלט בתדר רדיו – 15

ממיר לוגי – 16

תצוגת LCD –16

פרוטוקולי תקשורת

19- i2c

26 – UART

תיעוד הבניה – 28

התוכנה – 37

מדידות – 43

סיכום ומסקנות – 44

תודות

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

לאבי, שחינך אותי לאהבת ידע. לאמי, שלמדה אותי ללמוד.

למנחים, מר מוטי מאיר ומר גאורגי שרייבמן על הסבלנות ונקודת האיזון בין לעזור לבין לתת לי להתקדם לבד.

לצוות החינוכי והלימודי בסמינר "אופק" על העידוד והעזרה לאורך כל הדרך.

לכל האנשים והנשים שהקדישו מכשרונותיהם לקידום המדע והטכנולוגיה. אני כל כך גאה לחיות וליצור בעולם שעיצבתם.

תקציר הפרויקט

מבוא:

אפילפסיה (Epilepsy ) המכונה גם כפיון או "מחלת הנפילה" היא הפרעה נוירולוגית כרונית, הנגרמת מפעילות חשמלית לא תקינה בתאי העצב במוח בנוירונים ומובילה לפרכוסים ולעוויתות התקפים.

על-פי מידע שאסף מרכז המחקר והמידע של הכנסת מארבע קופות החולים, נכון לינואר-פברואר 2017 יש בישראל 81,597 מבוטחים שאובחנו כחולי אפילפסיה, נתון התואם את הערכת משרד הבריאות, לפיה שכיחות המחלה באוכלוסייה עומדת על כ-1%. בהינתן שמספר החולים באפילפסיה בישראל עומד על 81,597 אזי מדובר על בין 9 ל-10 חולים ל-1,000 נפש באוכלוסייה.

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

הצגת פרויקט:

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

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

  1. יש צורך בהשגחה צמודה שפוגעת בעצמאות של המטופל.
  2. בזמן שינה אין אפשרות להשגיח על החולה.

המטרה שלי בפרויקט היא לבנות צמיד שיזהה התקפים וישלח התרעה מידית.

בשביל זה אשתמש בארדואינו אונו וחיישן תאוצה ב-3 צירים BMI160 לזהות תנועת חזקות. במקרה שיזוהה התקף תשלח הודעה לצג.

חזון: פיתוח חיישנים שיאתרו 100% מההתקפים בהתאמה אישית.

הצעת פרויקט:

צמיד לזיהוי התקפי אפילפסיה

תיאור הפרויקט

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

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

הפרויקט יכיל את הרכיבים הבאים:

צמיד:

מיקרו-בקר (ארדואינו ננו)

משדר / מקלט בתדר רדיו

מד תאוצה

מקור אנרגיה – סוללה (li-po 3v-4.2v)

תחנה:

מיקרו בקר (ארדואינו אונו)

משדר / מקלט בתדר רדיו

תצוגת LCD

תרשים מלבנים

הסבר תרשים מלבנים

מכשיר למטופל:

מכשיר מעוצב בצורת צמיד שמתלבש על היד של חולה. הרכיב כולל:

ארדואינו ננו- בחרתי אותו בגלל גודלו הזעיר.

חיישן תאוצה- מזהה תנועות חזקות שהן המאפיין העיקרי של התקפי אפילפסיה.

משדר/מקלט בתדר רדיו- משדר את הנתונים לתחנה.

תחנה:

התחנה נמצאת על-יד המטפל, כך שהוא מקבל התראה מיידית על כל התקף אפילפטי. הרכיב כולל:

ארדואינו אונו – לעיבוד הנתונים.

משדר/מקלט בתדר רדיו – קולט את הנתונים מהצמיד.

צג LCD – מציג התרעה בזמן של התקף, כולל משך הזמן והנחיות לקריאה לעזרה ראשונה.

שרטוטים חשמליים

צמיד:

תחנה:

הסבר סרטוט חשמלי

בתחנה ה-HC11 מחובר לרגל D0 שהיא רגל עם תמיכה חומרתית לתקשורת טורית. וה-LCD מחובר ל-A5 ו-A4 שהם רגליים עם תמיכה חומרתית ל- I2C.

בצמיד ה-HC11 מחובר לרגלים D6 ו-D7 שהם הרגלים עם תמיכה חומרתית לתקשורת טורית. ה-BMI צורך מתח של 3.3v ולכן הוא מחובר לממיר לוגי . ל-tx1 ו-rx1 של הצד של 3.3v. tx2 מחובר, כרגל פסיקה.

וה-tx1 וה-1rx של הצד של ה-5v מחוברים ל-A5 ו-A4 שהם רגליים עם תמיכה חומרתית ל- I2C. tx2 מחובר לרגל 2 שמוגדרת כרגל פסיקה.

 

הסברי רכיבים

מיקרו-בקר (ארדואינו ננו)

ארדואינו אונו הוא עם אותו מיקרו בקר של ארדואינו ננו. ההבדלים הם חיצוניים – ארדואינו אונו הוא גדול יותר ויש לו חיבור USB סטנדרטי בשונה מארדואינו ננו שיש לו כניסה של מיני-USB

הכרטיס ארדואינו אונו הינו מיקרו-בקר מבוסס מעבד Atmel ATmega328 . הארדואינו אונו בעל 20 רגליים דיגיטליות של קלט/פלט. מתוכם ניתן להשתמש ב-6 כפלט PWM .לכרטיס זה יש 6 רגליים אנלוגיות ו- 1 ports serial. כמו כן לכרטיס יש את כל הנדרש לתמיכה מלאה במיקרו-בקר כלומר: כניסת USB ,מייצב מתח. מפרט הכרטיס

  • מיקרו-בקר: ATmega 328p
  • מתח הפעלה: V5
  • מתח כניסה מומלץ: 7v-12v
  • מתח כניסה אפשרי: 6v-20v
  • 20 רגליים דיגיטליות לקלט/פלט
  • 6 רגליים לקלט אנלוגי
  • זרם DC לרגל דיגיטלית של קלט/פלט: 40mA
  • זרם DC לרגל דיגיטלית של 3.3 V: 50mA
  • זיכרון פלאש KB32
  • זיכרון KB: SRAM 2
  • זיכרון KB: EPROM 1
  • מהירות שעון: 16mhz

בכרטיס קיימים מספר רגליים של מתח:

  • VIN – חיבור למתח חיצוני
  • הדק בעל V5 מהמייצב שעל הכרטיס
  • הדק בעל V3.3 מהמיצב שעל הכרטיס
  • הדק אדמה

הכרטיס תומך במספר סוגי תקשורת לדוגמא:

  • Serial – לדוגמא שימוש בהתקן Bluetooth וב- serial monitor
  • TWI – לדוגמא לחיבור חיישנים

לכרטיס יש פסיקות בפינים 2,3

מד תאוצה

מד תאוצה הוא חיישן המשמש למדידת תאוצה קוויות. כלומר, במנוחה, גם כשאינו נע ונמצא על פני השטח של כדור הארץ ימדוד תאוצה של כ-m/s²‏ 9.81 (מטר לשנייה בריבוע) בכיוון מטה, כתאוצת g בכוח הכובד.

המכשיר משמש בתחומים רבים במדע ובתעשייה. מדי תאוצה רגישים במיוחד נמצאים במערכות ניווט אינרצאליות המשמשות מערכות אמל"ח מתקדמות.

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

בפרויקט אני משתמשת בחיישן 160BMI של חברת BOSTCH המורכב משלוש מדי תאוצה ושלושה ג'רוסקופים מסוג MEMS (ראשי תיבות של: Micro Electro Mechanical System , תרגום: "מערכת מיקרו אלקטרו מכנית")

MEMS היא משפחה של טכנולוגיות, חומרים ומעגלים משולבים ברמות מיקרו וננו (NEMS), המכילות רכיבים ומערכות אלקטרוניות, מכניות, אופטיות (MOEMS) ביולוגיות, (BioMEMS) ופיזיקליות אחרות, כולם ממוזערות המאפשרות מגוון רחב מאוד של יישומים מתקדמים וחדשנים.

מאפיינים עיקריים:

  • צריכת זרם נמוכה: 925μA
  • מתח פעולה:  – 1.71V-3.6V
  • מחסנית FIFO של 1024 בייט
  • 2 הדקים עבור פסיקות חיצוניות שאפשר לתכנת לסוגים שונים של תנועה כמו יש תנועה/ אין תנועה וכו'

דיאגרמת מלבנים של החיישן:

C:\Users\user\Desktop\Untitled3.png

הסבר תרשים מלבנים:

Accel- מד תאוצה בשלושה צירים

Gyro – ג'ירוסקופ בשלושה צירים

ADC – ממיר מאנלוג לדיגיטל

Digital signal conditioning- נרמול ערכים

Select- מרבב שבוחר בין מידע גולמי למידע מנורמל

Sensor time and sensortime register- קובע קצב דגימה

Fifo engine- מחסנית – first in first out שומר את המידע עד שהמעבד יתפנה אליו

Interrupt engine- פסיקות

Step counter – מונה צעדים

Primary digital interface- ממשקי תקשורת

איך מזהים תאוצה?

שלושת ה-MEMS נותנים את זווית הסטיה.

C:\Users\user\Desktop\Untitled.png

הערכים מחושבים לפי

Accx = 1g*sin(Ɵ)*cos(Ψ)

Accy = -1g*cos(Ɵ)*sin(Ψ)

Accz = 1g*cos(Ɵ)

הערך בררת-מחדל של כח g הוא 2±

בערך ברירת מחדל של הפסיקה shok() יש 0 – שנועל את הפסיקה אחרי פעם אחת.

shok() מפעילה פסיקה של low-g/high g

הערך המינימלי נקבע לפי רגיסטר /int-lowing כפול הערך לפי הטווח של כח g לפי ערכי ברירת מחדל במקרה שלנו זה יוצא:

7.81 mg*192=1.499G

HC11

משדר/מקלט בתדר רדיו

השתמשתי בו בפרויקט כדי להעביר נתונים מהצמיד לתחנה.

הרכיב משתמש בתקשורת UART ומשדר בטווח של 433.3MHZ – 473.3MHZ , אפשר להגדיר כמה ערוצים, כל אחד ברוחב של 400Khz, ויש 100 ערוצים בסך הכל. עוצמת השידור המקסימלית 20dBm (100mW), ומרחק התקשורת הוא 1000m בחלל פתוח.

לרכיב 6 רגליים:

  • VCC- קבלת מתח
  • GND – אדמה
  • input UART – RXD
  • output UART – TXD
  • SET – רגל בקרה
  • ANT- אנטנה

ה-default mode הוא FU3 . בmode זה קצב ההעברה הוא מקסימלי, והוא כולל התאמה אוטומטית לקצב השידור בארדואינו.

קצב ברירת מחדל של השידור הוא 9.6 Kbps

ערוץ ברירת המחדל הוא 001 וקצב העבודה הוא 433.3MHz

ממיר לוגי:

סרטוט חשמלי:

לרכיב יש 3 מצבים:

1. שני צידי הקו נמצאים במצב של '1'. במקרה זה לכל צד יש את רמת המתח שלו כי ה- MOSFET לא מוליך.

2. כאשר צד 1 (הצד של ה 3.3v) נמצא ב- '0' . במקרה זה הMOSFET מוליך (הדיודה בנתק) ונקבל על הקווים של צד 2 (הצד של 5v) '0'.

3. כאשר כאשר צד 2 (הצד של ה 5v) נמצא ב '0' . במקרה זה ה-MOSFET לא מוליך. אבל הדיודה נכנסת להולכה. מפל המתח על הדיודה הוא כ- 0.7v שעדיין מוגדר כ '0'. לכן נקבל על הקווים של צד 1 '0'.משדר / מקלט רדיו

תצוגת LCD

LCD – LIQUID CRYSTAL DISPLAY – תצוגת גביש נוזלי שמורכבת מתמיסות אורגניות במצב נוזלי שמשנות את תכונותיהן האופטיות בהשפעת שדה חשמלי. ישנם כמה סוגים של תצוגות LCD :

1 .תאורה טבעית- צג אשר חייב להיות מואר מבחוץ על מנת לראות את התצוגה.

2 .תאורה מלאכותית- ה- LCD מואר ע"י נורה פנימית קבועה שמחוברת אליו.

3 .תאורה אחורית- ה- LCD מואר ע"י משטח פלורסנטי המותקן מאחוריו

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

מאפיינים:

  • צריכת זרם נמוכה ביותר (nA).
  • משקל קל.
  • אורך חיים גבוה.
  • ניתן לייצור בצורות שונות.

C:\Users\user\Desktop\Untitled4.png

תצוגת LCD שרטוט ותמונה

תיאור מפורט של רגלי ה:LCD

  • VSS – רגל אדמת המעגל
  • VDD- רגל המחוברת למתח ההזנה של 5V.
  • RS – רגל זו תפקידה לבחור באחד משני האוגרים. כאשר מספקים לרגל זו '0' האוגר ישמש כאוגר הוראות וכאשר נספק ברגל זו '1' אוגר זה ישמש כאוגר הנתונים, משמש להפרדה בין תהליך תכנות התצוגה 1=RS , ותהליך כתיבה לתצוגה
  • W/R – תפקיד רגל זו הוא לקבוע האם יכתבו או יקראו נתונים. כאשר מספקים '1' לרגל זו הנתונים המאוכסנים ב- RAM של התג"נ יקראו. כאשר מספקים '0', יכתבו נתונים ל-RAM של התג"נ.
  • E – רגל אפשור הרכיב. ב-'0' הרכיב לא יאופשר. ב-'1' הרכיב יאופשר.
  • רגליים DB0 – DB7 – זהו פס נתונים של התצוגה ברוחב של 8 סיביות. תפקיד פס הנתונים הוא העברת נתונים או פקודות אל התג"נ מהמיקרו בקר ולהיפך.

Register Instruction- אוגר הוראות אוגר זה תפקידו לאכסן הוראות הקובעות את אופן הפעולה של התג"נ הוראות אלה יכולות להיות: הזזת סמן, ניקוי התצוגה, כיבוי תצוגה, הדלקת התצוגה וכו'.

Register Data- אוגר הנתונים אוגר זה הינו אוגר זמני אשר בו מאכסנים את כל הנתונים שאותם רוצים להציג על התצוגה. כדי להציג נתון שולחים את התו של ב ASCII

C:\Users\user\Desktop\Untitled5.png

 

הרכיב PCF8574 מתאם LCD

הרכיב PCF8574 משמש כ'מרחיב פורטים' . על מנת לחסוך בהדקים , חיברנו את תצוגת ה LCD אל הארדואינו באמצעות הרכיב PCF8574 שמשמש כ'מרחיב פורטים'

C:\Users\shrai\AppData\Local\Microsoft\Windows\INetCache\Content.Word\LCD I2C.BMP
הרכיב PCF8574 הוא דו כיווני. כלומר, אפשר גם לשדר לו מידע (בגודל byte ) טורי שיופיע במפתח המקבילי (P0-P-7 ) ולהפך אפשר גם לקרוא את המידע שנמצא במפתח המקבילי (P0-P-7 ).

 

לרכיב PCF8574 יש 3 הדקי כתובת A2 , A1 , A0 . כלומר, ניתן ליצור 8 כתובות שונות.

התקשורת עם הרכיב נעשית באמצעות פרוטוקול I2C.

פרוטוקולי תקשורת

I2C

משמש לתקשורת בין הארדואינו ל-BMI160 ל-LCD

התקן נועד לאפשר תקשורת טורית בין במחשב (Master) ובין מספר Slaves .

המטרה של הפרוטוקול היא לספק "הסכם מסגרת", כלומר, הפרוטוקול מסדיר את אופן התקשורת בין שני משתמשים (Master and Slave). הפרוטוקול לא מתייחס ל- DATA אלא רק מגדיר מתי ואיך יש לשדר את ה- DATA. (סיבית אחת בכל מחזור שעון , 8 סיביות מידע בין שני אישורים).

בתקשורת i2c ישנו Master שהוא בדרך כלל המעבד, שמתקשר עם מגוון רחב של מודולים וחיישנים (Slaves) באמצעות שני קווים (זוג חוטים) בלבד.

        1. קו הנתונים SDA – Serial Data)).
        2. קו דופק השעון – SCL ( (Serial Clock.

ניתן לחבר על זוג החוטים עד 128 התקנים (Slaves) שונים ובמקביל.

חיבור של מספר רכיבי SLAVE אל MASTER

לכל רכיב/מודול/חיישן יש כתובת ייחודית משלו.

ה- Master בשלב ראשון מוציא את הכתובת הייחודית של רכיב מסוים, רכיב שמזהה שזו הכתובת שלו, 'מאשר' את זיהוי הכתובת והוא זה שיתקשר עם Master .

כל שאר הרכיבים נשארים במצב של 'נתק' מהקווים.

דופק השעון שעל קו SCL מיוצר רק ע"י ה- Master והוא זה שקובע את קצב העברת הנתונים.

בקו SDA מעבירים בצורה טורית את הכתובות ואת הנתונים שבין ה-Master וה- Slaves.

כאשר אין תקשורת, שני הקווים SDA ו- SCL נמצאים במצב של '1' קבוע, ולכן ניתן לשנות את קו המידע SDA רק כאשר קו השעון SCL נמצא בנמוך.

המידע על ה- SDA צריך להיות יציב בזמן שקו השעון SCL נמצא בגבוה.

אם יש שינוי על קו המידע SDA בזמן שקו השעון SCL גבוה אז :

-מעבר מ- HIGH ל- LOW פירושו START

-מעבר מ- LOW ל- HIGH פירושו STOP ,

.STOP במקום repeated START ,SDA ניתן לשים על קו המידע

מצב המתנה- ה- Slave יכול להוריד את ה- SCL, ל- LOW ובכך ליצור מצב של WAIT ל- Master.

Ack:

כל מילה חייבת להסתיים בביט תשיעי של Ack) .Acknowledgement)

השעון של ה- Ack מיוצר ע"י ה- Master.

בזמן Ack המשדר שם מתח-צף על ה- SDA , והמקלט שם LOW על ה- SDA.

כאשר ה- Slave לא משדר Ack על כתובתו (כי הוא לא יכול, למשל) הוא שם מתח-צף על ה- SDA בשביל לשחרר את הקו ל- Master אשר בוחר עם לחדש את ההתקשרות עם הרכיב הנוכחי אם לא. כאשר ה- Slave משדר Ack על כתובתו, אך שם-לב במהלך המשך ההתקשרות כי הוא לא יכול להמשיך לקלוט מידע. אז הוא משדר Not-Ack בביט התשיעי של המילה הבאה. אח"כ הוא שם מתח-צף על ה- SDA בשביל לשחרר את הקו ל- Master אשר בוחר עם לחדש את ההתקשרות עם הרכיב הנוכחי אם לא.

אם המשדר של ה- Master מעורב בתהליך ההתקשרות, אזי בסוף המידע ה- Master לא שולח Ack למשדר של ה- Slave בביט התשיעי של המילה הבאה. ה- Slave שם מתח-צף על ה- SDA בשביל לשחרר את הקו ל- Master אשר בוחר אם לחדש את ההתקשרות עם הרכיב הנוכחי אם לאו.

השלבים ביצירת תקשורת ע"י Master:

שלב 1:

פעולת Start – הורדת קו SDA ל '0' כאשר קו SCL עדיין נמצא במצב '1' קבוע.

הדק של התקן:

שלב 2:

ה Master משדר על קו ה SDA 7 סיביות של כתובת (סיבית הMSB נשלחת ראשונה) + סיבית שמינית המודיעה לרכיב, האם ה Master רוצה לכתוב מידע לרכיב ('0') או לקרוא מידע מהרכיב ('1').

שלב 3:

הרכיב שזו כתובתו, מגיב ב 'אישור', כלומר ב Acknowledge .

ה Acknowledge מתבטא בהורדת קו SDA ל '0' למשך דופק שעון אחד.

אם אין Acknowledge , ה Master יסיים את התקשורת בפעולת stop .

שלב 4:

בעקבות Acknowledge , המעבד כותב (או קורא) נתונים בגודל Byte (8 סיביות) לרכיב.

אחרי כל שידור בין ה Master ובין Slave יש לקבל Acknowledge.

שלב 5:

שלב סיום התקשורת – פעולת Stop מתבצעת על ידי העלאת קו SDA ל '1' כאשר קו SCL במצב '1'.

ישנם סוגים סונים של תקשורת:

  1. ה- Master הוא המשדר לאורך כל ההתקשרות והוא כותב ל- Slave .

  1. ה- Master יוזם את ההתקשרות בשביל לקרוא מה- Slave.
  2. ה- Master יוזם את ההתקשרות בשביל לקרוא ולכתוב ל- Slave. (שילוב של 1 ו-2) .

תקשורת טורית UART

משמש לתקשורת בין הארדואינו ננו ל ארדואינו אונו, הUART יכול לשדר ולקלוט מידע בו זמנית. כלומר, לעבוד ב Full-Duplex .

התקשורת היא 'אסינכרונית' (Asynchronic) כלומר שהמשדר יכול לשדר בכל עת והמקלט חייב להיות מוכן תמיד לקבלת מידע מהמשדר. זאת ללא הודעה מוקדמת וללא תלות ב 'שעון'.

פרוטוקול התקשורת (הנוהל להעברת נתונים)

כאשר ה UART משדר 'תו' , פרוטוקול התקשורת שה UART מבצע הוא כמוראה באיור הבא: serial

שלב א – ה UART משדר . START BIT =0 = התחלת שידור. הסבר: כאשר אין העברת מידע המצב בקו השידור הוא '1'. ברגע שהUART מתחיל לשדר, הוא מוריר את הקו ל '0'. הירידה מ '1' ל '0' מאפשרת למקלט להסתנכרן על התחלת השידור.

שלב ב' – ה- UART משדר את 8 סיביות המידע ( הסיבית הראשונה היא סיבית ה LSB)

שלב ג' – ה- UART משדר STOP BIT אחד או שניים. (STOP BIT = 1)

לכל סיבית מוקצה 'זמן סיבית' ( BIT TIME ) שהוא קבוע ומוסכם מראש. זמן הסיבית נקבע ע"י ה- Baud Rate (קצב העברת הסיביות בקו). כלומר, כמות הסיביות העוברות בקו בשנייה אחת. ( (Bits per second. הקצב המקובל הוא 2400, 4800 ,9600 , 14400, 19200, 38400, 57600 , 115200 ביטים \ לשניה. אולם קצב ההעברה יכול להיות גם כל קצב אחר שנבחר.

כאמור, לאדואינו UNO יש רכיב UART מובנה בתוך המיקרובקר. הדק 0 של הארדואינו משמש כקו התקשורת הטורית לקליטה – RXD . והדק 1 משמש כקו התקשורת הטורית לשידור – TXD .

לארדואינו יש חוצץ (buffer ) של 64 בתים לאחסון המידע שנקלט בתקשורת הטורית.

הפונקציה () Serial.available מחזירה את מספר התווים שנקלטו בחוצץ.

תיעוד הבניה

5 בנובמבר

קיבלתי את חיישן הbmi  ותרגלתי קריאת נתונים ועבודה עם הספריה של החיישן

void loop() {

int16_t ax, ay, az; //scaled accelerometer values

// read accelerometer measurements from device, scaled to the configured range

BMI160.getAcceleration(&ax, &ay, &az);

// display tab-separated accelerometer x/y/z values

Serial.print("a:\t");

Serial.print((float)ax/16384.0);

Serial.print("\t");

Serial.print((float)ay/16384.0);

Serial.print("\t");

Serial.print((float)az/16384.0);

Serial.println();

delay(500);

}

ה-bmi וארדואינו על המטריצה:

C:\Users\user\Downloads\P_20180115_153031.jpg

14 בנובמבר

כתבתי תוכנית שמזהה כוחות ג'י בעוצמה חזקה.

בעיה: צריך לנטרל את ההשפעה של כח הכבידה של כדור הארץ

הערה: לא הצלחתי לפתור את הבעיה הזאת

if(interrupt){

if(BMI160.getIntShockStatus())

{

if(BMI160.getXNegShockDetected()&&absgx<20)

{

num++;

}

if(BMI160.getXPosShockDetected()&&absgx<20)

{

num++;

}

if(BMI160.getYNegShockDetected()&&absgy<20)

{

num++;

}

if(BMI160.getYPosShockDetected()&&absgy<20)

{

num++;

}

if(BMI160.getZNegShockDetected()&&absgz<20)

{

num++;

}

if(BMI160.getZPosShockDetected()&&absgz<20)

{

num++;

}

}

interrupt=false;

}

20 בנובמבר

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

אתחולים של הפסיקה shock()

BMI160.attachInterrupt(shock);

BMI160.setIntShockEnabled(true);

ובלולאה זה נראה כך:

void shock() {

interrupt = true;

}

בעיה: הפונקציה מפעילה את ה- interrupt  פעם אחת ואז 'נתקעת'

27 בנובמבר

מצאתי את הבעיה מהפעם הקודמת: ל-shock   יש מנגנון שמפסיק את הפסיקות אחרי פרק זמן מסוים. ערך הברירת מחדל הוא '0' שנועל את הפסיקה אחרי פעם אחת.

פתרון: לאתחל בערך אחר.

BMI160.setInterruptLatch(BMI160InterruptLatchMode(BMI160_LATCH_MODE_10_MS));

הרכבנו את ה-LCD והצמיד

C:\Users\user\Downloads\P_20180115_153053.jpg

C:\Users\user\Downloads\P_20180115_153102.jpg

25 בדצמבר

חיברנו את המשדר/מקלט HC11 ובדקנו שהתקשורת עובדת.

C:\Users\user\AppData\Local\Microsoft\Windows\INetCache\Content.Word\p2.jpg

1 בינואר

חברנו את ה-LCD לארדואנו והוא לא עבד. המרחיב פורטים עבד, בדקתי את זה עם תוכנית לסריקת i2c, החלפתי אותו.

התוכנית:

#include <Wire.h>
void setup()
{
Wire.begin();

Serial.begin(9600);

while (!Serial);             // Leonardo: wait for serial monitor

Serial.println("\nI2C Scanner");

}

void loop()

{

byte error, address;

int nDevices;

Serial.println("Scanning...");

nDevices = 0;

for(address = 1; address < 127; address++ )

{

// The i2c_scanner uses the return value of

// the Write.endTransmisstion to see if

// a device did acknowledge to the address.

Wire.beginTransmission(address);

error = Wire.endTransmission();

if (error == 0)

{

Serial.print("I2C device found at address 0x");

if (address<16)

Serial.print("0");

Serial.print(address,HEX);

Serial.println("  !");
nDevices++;

}

else if (error==4)

{

Serial.print("Unknown error at address 0x");

if (address<16)

Serial.print("0");

Serial.println(address,HEX);

}

}

if (nDevices == 0)

Serial.println("No I2C devices found\n");

else

Serial.println("done\n");


delay(5000);  // wait 5 seconds for next scan

}

כתבתי את הקוד של התחנה, שקורא את הנתונים ומעביר לצג. השתמשתי בפונקציה milis() שהיא פשוטה לשימוש ונוחה יותר מטיימרים.

void loop()

{

if (millis() - tmpTime > 5000 ) {

delay(100);

lcd.clear();

tmpTime = millis();

while (Serial.available() > 0) {

lcd.write(Serial.read());

tmpTime = millis();

}

}

4 באפריל

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

צמיד:

if (ifEpilepsy(false)) {

counter = 0;

Serial.println("1");

}

בתחנה:

void loop()

{

while (Serial.available() > 0) {

  if ( Serial.parseInt() == 1) {

    epilepsy=true;

    if(call == false){

      lcd.clear();

      lcd.print("epilepsy");

      counter++;

      if (counter == 1)

        tmpTime = millis();

      }

   }

}

if(epilepsy){

  lcd.setCursor(0, 1);

  lcd.print((millis()-tmpTime)/1000);

}

if (millis() - tmpTime > 30 * 1000 ) {

  if(counter > 3){

     if(call==false){

       lcd.clear();

       lcd.print("Call 101");

      call = true;

  }

}

  else{

  lcd.clear();

   epilepsy=false;

  }

 }

}

10 במאי

שיניתי את הקוד כך שאם ההתקף נגמר הטיימר על השעון נגמר ויש כיתוב "epilepsy is over"

וכן הוספתי את הקוד ל-buzzer

התוכנה

התוכנה בצד של התחנה:

הסבר:

יש 2 דגלים – 'epilepsy' בודק אם התחיל התקף אפילפסיה, כלומר אם התקבלה התרעה מהצמיד

ו-"call" שבודק אם עברו שלושים שניות מתחילת ההתקף, סיטואציה התחייבת הזעקת עזרה ראשונה.

בלולאה התוכנה בודקת כל הזמן אם יש תקשורת טורית ואם כן אם מגיע '1' – מעדכן את הדגל של 'epilepsy' לאמת. אם אנחנו לא במצב של call מדפיס epilepsy על הצג ומפעיל אזעקה ומעלה את המונה. אם זו הפעם הראשונה – שומרת את השעה במשתנה עזר.

אם 'epilepsy' באחד לוגי, התוכנה מדפיסה את השניות על המסך

אחרי שלושים שניות, אם המונה שווה לשלוש ומעלה, מציבים ב-'call' אחד לוגי, מודפס על המסך "Call 101"

אם לא, מודפס "epilepsy is over"

הקוד:

#include <Wire.h>// I2C כולל את הספריה לתקשורת  

#include <LiquidCrystal_I2C.h>// כולל את הספריה של הצג

const int BUZZER = 8;//משתנה סטאטי בוזר 

// Set the LCD address to 0x27 for a 16 chars and 2 line display

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup()

{

lcd.begin();//מפעיל את הצג

lcd.backlight();//מדליק את האור האחורי

// Initialize the serial port at a speed of 9600 baud

Serial.begin(9600);

pinMode(BUZZER, OUTPUT);//קובע את רגל 8 לפלט

digitalWrite(BUZZER, LOW);//שם אפס לוגי ברגל 8

}

unsigned long tmpTime ;

int counter = 0;

boolean epilepsy = false;

boolean call = false;

void loop()

{

while (Serial.available() > 0) {//כל עוד יש קריאה ספרתית

if ( Serial.parseInt() == 1) {//אם זוהה מספר ברצף של הקלט

epilepsy=true;

if(call == false){

lcd.clear();//מנקה את הצג

lcd.print("epilepsy");//מדפיס 'אפילפסיה' על הצג

counter++;

if (counter == 1)//אם זו הפעם הראשונה, שם במשתנה עזר את השעה

tmpTime = millis();

}

}

}

if(epilepsy){

lcd.setCursor(0, 1);//מסדר את השורות בצג

lcd.print((millis()-tmpTime)/1000);//מדפיס את השניות

}

if (millis() - tmpTime > 30 * 1000 ) {//אם עברו פחות משלושים שניות

if(counter > 3){//אם היו יותר משלוש התרעות

if(call==false){

lcd.clear();//נקה את הצג

lcd.print("Call 101");

digitalWrite(BUZZER, HIGH);//הפעל את הצפצפה

call = true;

}

}

else{

lcd.clear();

lcd.print("epilepsy is over");

epilepsy=false;

}

}

}

התוכנה בצד של הצמיד:

הסבר:

בהתחלה מופעלת הפסיקה ()shock שמייצרת פסיקה עבור תנועה חזקה.

יש דגל interrupt שעולה ל-1 כל פעם שהפסיקה מופעלת. בלולאה, כל פעם ש- interrupt =1 מופעלת הפונקציה ifEpilepsy כך שתעדכן את הזמן הנוכחי ותעלה את ה- counter. אחר כך ifEpilepsy מופעלת כך שתבדוק אם עברו שש שניות. אם כן, היא מחזירה אמת והלולאה תשדר '1'. אם לא, היא מאפסת ה- counter.

#include <BMI160.h>//כולל את הספריה של המד תאוצה

#include <BMI160Gen.h>// כולל את הספריה של המד תאוצה

#include <BMI160Gen.h>

#include <Wire.h>//I2C כולל את הספריה לתקשורת 

const int bmi160_i2c_addr = 0x69;//קובע את כתובת המד תאוצה

const int bmi160_select_pin = 10;

const int bmi160_interrupt_pin = 2;//קובע את רגל שתיים לפסיקות מהמד תאוצה

int16_t tr = 0, num = 0;

unsigned long startMillis; //some global variables available anywhere in the program

unsigned long currentMillis;

const unsigned long period = 1000;

void setup() {

Serial.begin(9600); // initialize Serial communication

// initialize device

Serial.println("Initializing IMU device...");

Wire.begin();

BMI160.begin(BMI160GenClass::I2C_MODE, bmi160_i2c_addr, bmi160_interrupt_pin);

uint8_t dev_id = BMI160.getDeviceID();

Serial.print("DEVICE ID: ");

Serial.println(dev_id, HEX);

BMI160.attachInterrupt(shock); //קישור הפסיקה לפונקציה

BMI160.setIntShockEnabled(true);//הפעלת הפסיקה

BMI160.setInterruptLatch(BMI160InterruptLatchMode(BMI160_LATCH_MODE_10_MS));//הגדרת זמן הפסיקה

startMillis = millis();

Serial.println("Initializing IMU device...done.");

Serial.println(BMI160.getIntShockEnabled());

}

boolean interrupt = false;

int counter = 0;

void shock() {

interrupt = true;

}

unsigned long epilepsyLoop;

boolean ifEpilepsy(boolean firstTime) {//פונקציה בוליאנית שמקבלת משתנה בוליאני

if (firstTime)

epilepsyLoop = millis();

if (millis() - epilepsyLoop <= 6000) {//בודק אם עברו 6 שניות

if (counter > 2)

return true;

}

else

counter = 0;

return false;

}

void loop() {

if (interrupt) {

counter++;

if (counter == 1)

ifEpilepsy(true);

interrupt = false;

}

if (ifEpilepsy(false)) {

counter = 0;

Serial.println("1");

}

}

מדידות

בדקתי את המתח המסופק מהסוללה.

C:\Users\user\Desktop\p4.jpg

ואחרי המייצב מתח

C:\Users\user\Desktop\p3.jpg

המייצב מספק מתח יציב אם כי לא בדיוק את ה-3.3v שהוא אמור לספק.

סיכום ומסקנות

במהלך הפרויקט למדתי רבות וקיבלתי מיומנות וביטחון גם בקריאה והבנה של חומר תיאורטי וגם בבניה פיזית של מעגלים חשמליים.

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

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

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

הייתי רוצה של-buzzer יהיו 2 צפצופים שונים שיבדילו בין התחלה התקף לבין התקף ארוך שדורש הזעקת עזרה ראשונה.

כתיבת תגובה

האימייל לא יוצג באתר.

קבלו אימייל כשהמוצר חוזר למלאי השאירו אימייל וקבלו הודעה אוטומטית כשהמוצר חוזר למלאי.
אימייל