חיישן מרחק אולטרא-סוני HC-SR04: כל הפרטים

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

חיישני מרחק אולטרא-סוניים מדגם HC-SR04
חיישני מרחק אולטרא-סוניים מדגם HC-SR04

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

השימוש הבסיסי

למודול ארבע רגליים: שתיים לאספקת חשמל רצופה (Vcc שמקבלת 5V ו-Gnd), אחת בשם Trig (קיצור של Trigger) שבעזרתה מתחילים את המדידה, ואחת בשם המטעה Echo, שלמעשה נותנת לנו את "זמן המעוף" של הצליל, הלוך ושוב, ממנו אפשר להסיק את המרחק למכשול שהחזיר את ההד.

כדי להתחיל מדידה, עלינו לתת ל-Trig פולס מתח רצוף של 10 מיליוניות השניה לפחות (זה, בכל אופן, מה שמספרים לנו). כעבור זמן קצר מאד, אחד משני הגלילים הכסופים (הרמקול, שמסומן על חלק מהלוחות באות T – כלומר Transmitter) יפלוט צליל קצר בתדר 40KHz שהאוזן האנושית אינה מסוגלת לשמוע. אז גם נתחיל לקבל מתח גבוה ב-Echo, וזה יימשך עד שהגליל השני (המיקרופון, R – כלומר Receiver) יקלוט את ההד החוזר, או עד שיחלוף פרק זמן ארוך מוגדר מראש (בסביבות 20-30 אלפיות השניה, אך מאפיין זה לא מובטח בכל הדגמים!).

הפונקציה pulseIn בארדואינו מצוינת למדידה של משך הפולס שמגיע מפין Echo, אך התוכנית לדוגמה שמגיעה מובנית עם סביבת הפיתוח של ארדואינו (בתפריט File->Examples->06.Sensors->Ping) מותאמת לדגם אחר של חיישן מרחק, שבו הפונקציונליות של Trig ושל Echo משולבות ברגל אחת. הנה קוד שמתאים למודולים בעלי ארבע רגליים כמו בתמונה – ודאו שאתם מחברים את הרגליים לפינים הנכונים בלוח הארדואינו:

#define TRIG_PIN 7
#define ECHO_PIN 8

void setup() {
  Serial.begin(9600);
  pinMode(TRIG_PIN, OUTPUT);
  digitalWrite(TRIG_PIN, LOW);
  pinMode(ECHO_PIN, INPUT);
}

void loop() {
  
  unsigned long duration;
 
  digitalWrite(TRIG_PIN, HIGH);
  delayMicroseconds(10);
  digitalWrite(TRIG_PIN, LOW);

  duration = pulseIn(ECHO_PIN, HIGH);
  Serial.print(duration / 58.77);
  Serial.println("cm");
  
  delay(100);
  
}

להסבר על חישוב המרחק שבקוד, עיינו בסעיף "חיישן" בפוסט הזה.

החומרה

בצדו האחורי של המודול נמצאים שלושה ג'וקים, שרק על אחד מהם (השמאלי, בתמונה) מופיע כיתוב: LM324. זהו מערך של מגברי שרת (Op Amp), שצמוד למיקרופון, ותפקידו כמובן להגביר את האות החלש שנקלט לרמות ששאר המעגל יכול לעבוד איתן. אך מהם הג'וקים האחרים?

חיטוט ברשת העלה את הממצאים הבאים. הג'וק האמצעי הוא מיקרו-בקר מדגם EM78P153A (או דגם דומה) של חברת ELAN הסינית. זהו מיקרו-בקר 8-ביט צנוע מאד, מטיפוס OTP – ראשי תיבות של One Time Programmable, כלומר שאין לנו אפשרות להתעסק איתו יותר מדי. הוא זה שמנהל את הקלט והפלט, ומהירות השעון שלו נקבעת על ידי המתנד הגבישי שעל הלוח – לרוע המזל, גם הוא ללא כיתוב, והמידע ברשת מדבר על ערכים שונים של 4MHz עד 27MHz.
הג'וק הימני, שמחובר בין השאר לרמקול, הוא רכיב תקשורת תואם MAX232. זה כבר נשמע מוזר: מה קשור פרוטוקול התקשורת הקווית הזה למדידת מרחקים? ובכן, המיקרו-בקר עצמו מסוגל להניע את הממברנה של הרמקול רק בטווח מתח העבודה שלו, 0V – 5V. אלא שכדי ליצור צליל ראוי לשמו בתדר גבוה עם החומרה הזו, מסתבר שזה לא מספיק. בתקשורת RS232 קלאסית, המידע מועבר באמצעות הפרשי מתחים גדולים בין החוטים – וה-MAX232 מסוגל להפיק פולסים של פלוס ומינוס 10 וולט ומעלה! הוא עושה זאת בעזרת קבלים פנימיים*, ואלה צריכים זמן להיטען למתחים הנ"ל. לכן, נדרש זמן המתנה של כמה אלפיות שניה בין שתי פקודות Trig, אחרת התוצאות עלולות להשתבש.

* בקושי יום אחרי שכתבתי את הקטע הזה, הופיע ב-Youtube הסרטון הבא מסדרת According to Pete שמסביר לעומק את הנושא.

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

מודול חיישן מרחק HC-SR04 ללא הרמקול והמיקרופון
מודול חיישן מרחק HC-SR04 ללא הרמקול והמיקרופון

בניסיון להחליף אותם בחזרה, לעומת זאת, משהו בלוח נפגע ונהרס בוודאות (כנראה מכיוון שהשתמשתי במלחם חזק מדי). ניצלתי את ההזדמנות כדי להוציא את המתנד ולהפוך אותו למקור שעון ל-ATtiny85, שישב חסר מעש בפרויקט ישן. כך גיליתי שלושה דברים: שתדר המתנד היה 25MHz, שהטייני מסוגל לספק לפחות פונקציונליות פלט בסיסית במהירויות שעון שהן מעבר למפרט שלו, ושאותו הדבר נכון גם לגבי המיקרו-בקר שעל המודול, שאמור גם הוא לעבוד עם מתנדים של עד 20MHz בלבד…

מדידות ותזמונים

צריכת זרם: המפרטים הטכניים מדברים על סביבות של 15-20mA בזמן פעולה. בפועל, לדברי מולטימטר זול, הזרם לא עלה על 3.5mA אפילו כשביצעתי מדידות בקצב מהיר – וזה היה המספר גם בזמן מנוחה. כדי לוודא שלא מדובר בבעיה של דגימה איטית מדי במולטימטר, וכדי לבדוק את העניין מזווית אחרת, העברתי את המתח למודול דרך נגד של 1.2 אוהם – הכי קטן שהיה לי שאינו 0 – ומדדתי בסקופ את מפל המתח עליו תוך כדי פעולה. המקסימום שהצלחתי לראות, כפי שמופיע בתמונה (שמציגה את ה"מעטפת" של המדידות), הוא 40 מיליוולט אם נהיה נדיבים להפליא – ובחישוב לפי חוק אוהם (I=V/R) אנחנו מקבלים שוב 3.33mA בלבד. משמח ומפתיע, במיוחד כשמדובר במודול תוצרת המזרח הרחוק שגם עובד! מצד  שני, אני לא בטוח מה המקור והמשמעות של הירידות מתחת לאפס בסקופ, אז הכל בערבון מוגבל.

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

זמן תגובה: התחלת השידור בפועל (מתח לרמקול) היא כ-0.25 אלפיות שניה אחרי סוף האות שנכנס לפין Trig. בצילום המסך הבא מופיע, בערוץ העליון, אות של 0.5 אלפית שניה ל-Trig, ובערוץ השני גל ריבועי שנשלח מהמיקרו-בקר של המודול אל רכיב ה-RS232. אנחנו רואים 8 פסגות בתדר מדויק של 40KHz, ולאחר מכן שקט.

אות Trig ותגובת המיקרו-בקר שעל המודול
אות Trig ותגובת המיקרו-בקר שעל המודול

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

פולס Echo מרבי: במודולים שבדקתי, בהיעדר מכשול האות ב-Echo הפסיק מעצמו אחרי כ-20 אלפיות שניה, שהן שוות ערך למרחק המדידה המרבי המוצהר של 3.5 מטרים.

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

הנה פוסט מרתק (באנגלית) על שדרוג של חיישן כזה [עדכון: הדף כבר לא קיים] – ממנו גם לקחתי חלק מהמידע שמופיע למעלה.

להרשמה
הודע לי על
8 Comments
מהכי חדשה
מהכי ישנה לפי הצבעות
Inline Feedbacks
הראה את כל התגובות

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

עזרת לי מאוד תודה!
רק רוצה לדעת למה חילקת את duration ב58.77?
למה דווקא ב58.77?

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

סקירה מעולה, כן ירבו!

תודה על סבלנותך המדהימה

מרנין ביותר! עזר לי להבין טוב מאוד 10\10