ארדואינו: סודות המשיכה

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

Input without Pull-down Resistor
מתג רפאים: למה האור דולק גם כשאיש אינו לוחץ?

ניקח לדוגמה את אחד הפרויקטים הפשוטים ביותר – מתג שמדליק נורה בתיווך הארדואינו. ניקח מתג פשוט, נחבר רגל אחת שלו למקור המתח 5V שהארדואינו מספק, ואת הרגל השניה לפין דיגיטלי – לצורך העניין, פין 2. נכתוב תוכנה שמדליקה את ה-LED המובנה של פין 13 כאשר יש מתח בפין הקלט. הנה הקוד:

void setup() {
  pinMode(2, INPUT);
  pinMode(13, OUTPUT);
}

void loop() {
  if (digitalRead(2) == HIGH) digitalWrite(13, HIGH);
   else digitalWrite(13, LOW);
}

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

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

הפתרון נקרא באנגלית Pull-down resistor: נגד בערך גבוה, שמחבר את מקור המתח הנמדד ל-Ground ו"מושך" את מתח ברירת המחדל לכיוון הרצוי לנו – במקרה זה, אפס.

אפשר לראות את הנגד המושך בתמונה הבאה: זהו אותו מעגל כמו קודם, בתוספת חוט שחור מה-Ground, ונגד (10K Ohm, הערך המדויק לא קריטי) ממנו אל המתג. כשהמתג אינו לחוץ, הנגד הזה מושך את המתח בחוט שמתחבר לפין 2 כלפי מטה, לכיוון ה-Ground, וכך מתקבלת קריאה של LOW (שימו לב שהאור כבוי). לעומת זאת, כאשר לוחצים על המתג, הערך הגבוה של הנגד מונע ניקוז מיידי של הזרם ל-Ground, ופין 2 מזהה את המתח כ-HIGH.

Pull-down Resistor
אותו מעגל, עם נגד שמושך לכיוון האפס

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

האם זה אומר שצריך להכין סטוק של נגדים עם ערך גבוה? ובכן, זה אף פעם לא מזיק, אך בעקבות תגובה שקיבלתי אתמול בבלוג בנושא הפינים האנלוגיים והדיגיטליים של הארדואינו קראתי עליהם קצת יותר לעומק וגיליתי דבר מעניין: המיקרו-בקר שבלב הארדואינו מסוגל להגדיר עבור הפינים נגדי Pull-up פנימיים!

מה זה אומר? שאם אנחנו רוצים לתת לחיבור קלט צף ערך HIGH כברירת מחדל, אנחנו יכולים לעשות זאת בלי להזדקק לנגד חיצוני. כדי להדגים את העניין שיניתי את המעגל מהתמונות הקודמות כך שהמתג יחבר את פין הקלט לא למתח 5V אלא דווקא ל-Ground. במילים אחרות, כשהמתג לחוץ פין הקלט יחובר ישירות ל-Ground, וכשהמתג לא לחוץ, פין הקלט יהיה "צף". כמו כן, שיניתי את הקוד כך שהאור יגיב לקלט LOW במקום ל-HIGH, והוספתי שורה אחת קטנה וקריטית אחרי הגדרת פין הקלט:

void setup() {
  pinMode(13, OUTPUT);
  pinMode(2, INPUT);
  digitalWrite(2, HIGH); // Set up internal Pull-up Resistor
}

void loop() {
  if (digitalRead(2) == LOW) digitalWrite(13, HIGH);
   else digitalWrite(13, LOW);
}

כן, זוהי פקודת פלט מיד אחרי שהפין הוגדר כפין קלט! וזה מה שגורם למשיכה פנימית של המתח, דרך נגד בערך 20K Ohm, כלפי 5V. המעגל עבד בצורה מושלמת ללא כל נגד חיצוני, בחיווט כמוצג בתמונה זו:

Internal Pull-Up
קריאה מדויקת עם נגד פנימי שמושך כלפי מעלה

אפשר להגדיר Pull-up פנימי לכל הפינים, כולל האנלוגיים, וזה שימושי גם לעבודה עם מעגלים משולבים עם פלט מסוג Open Collector (או Open Drain) הנפוץ – אם כי לא ניכנס לזה עכשיו. לרוע המזל, לא ניתן להגדיר נגדי Pull-down פנימיים, כך שאם אתם מתעקשים להגיב דווקא לסיגנל HIGH, לא תהיה לכם ברירה אלא להשתמש בנגדים חיצוניים.

יום עצמאות שמח!

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

כרגיל, תודה. חיפשתי וחיפשתי האם ה PULLUP ו PULLDOWN המובנים בארדואינו יכולים להחליף אחד חיצוני, וכמובן שהתשובה אצלך. תודה רבה עידו.

ראיתי שנוהגים לחבר נגד pull up לקווים של SCL SDa ברכיבים שמשתמשים בתקשורת l2C , האם יש לך הסבר טוב לזה?

תודה!

בגירסאות האחרונות של הארדואינו (החל מ-1.0 נדמה לי) אפשר להשתמש ב:

pinMode(2, INPUT_PULLUP);

כדי להשיג את אותו אפקט של pullup ללא צורך בכתיבה מפורשת של HIGH.

שלום עידו ממש תודה על ההסבר! אני מתרגל מתחיל… בניתי מעגל פשוט – 3 לדים וכפתור אחד את הלדים חיברתי כל אחד את ה + שלו לפינים 3 , 4 , 5, בהתאמה וכל רגל מינוס דרך נגד 220 לאדמה . הרעיון – שהצליח בהתחלה – היה שהלדים ירוצו אחד אחרי השני בקצב של שניה ללד, וכשלוחצים על הכפתור הקצב הוא מהיר יותר כשחיברתי עם נגד (מתאים) זה עבד יופי וזה הקוד int x=0; int i=0; int j=0; void setup() { pinMode(3,OUTPUT); pinMode(4,OUTPUT); pinMode(5,OUTPUT); pinMode(2,INPUT); } void ritza(int z) { for(i=3;i<=5;i++) { digitalWrite(i,HIGH); for(j=3;j<=5;j++) if(j!=i) digitalWrite(j,LOW); delay(z); } } void… לקרוא עוד »

זה בדיוק מה שפספסתי!! תודה!!
עכשיו עובד

פוסט מרתק והסבר מצויין.
תודה רבה!

בגדול זה נראה ככה:
https://docs.google.com/open?id=0B3WNqRq_mIccV2dqRzl0WmdoYXc
בציור יש דלגלג עם שני כניסות D-המידע שנכתב וWRITE שמשמש כENABLE ויציאת NOT-Q כאשר יש כאשר WRITE מופעל היציאה הפוכה לכניסה וכאשר הוא מכובה היציאה שומרת על הרמה הלוגית שהייתה בה קודם.
כאשר אתה כותב 1 לפין, הדלגלג מוציא 0 מה שסוגר את הטרנזיסטור אם לא מחובר כלום אזי המצב הלוגי שנראה הוא 1. אם מחובר רכיב הוא יקבע את המצב. לעומת זאת כאשר נכתוב 0 לפין הטרנזיסטור יפתח ויכריח 0 בין אם מחובר או לא.

לכן זה לא ממש ל"הגדיר נגד" כי הוא כל הזמן נמצא שם.

מעניין,הגעתי לכאן מהכתבה בYNET.

השאלה מה לגביי MEMS כלומר Microelectromechanical systems,האם ניתן כתחביב לבנות כול מיני דברים קטנים תחת מיקרוסקופ שהוא לא אלקטרונים?או שראיתי יותר מידי סרטי מדע בדיוני:)

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

הי עידו, תודה. לגבי הלד – ההסבר מצויין ואפילו זכיר 🙂 לגבי הpull down, ההסבר מובן, אבל עדיין משום מה "לא עושה לי שכל". הרי אם יש "רעשים" הם ילכו הדרך הכי נוחה (לכיוון פין 2) ולא יתאמצו לעבור דרך "העפר" (הנגד) לא? ברור לי שמשהו בהגיון הבסיס כאן נעלם ממני (אולי כי השכלתי אוטודידקטית באלקטרוניקה, ובפרק הזה נרדמתי במיטה עם הספר…) אבל שוב – אם הנגד היה בין המפסק לבין החוט המקשר לפין 2 – הייתי מבין שהוא מקשה על רעשים קטנים להגיע – אבל כשהמפסק נלחץ ו"התנועה" האמיתית מגיעה, היא עוברת את המכשול הזה. בחיבור המודגם "המכשול" מגיע… לקרוא עוד »

מעניין מאוד ומאיר עיניים. תודה רבה!

לא משנה כמה פעמים ובכמה מקומות אני קורא את ההסברים על pull up ו pull down ולא משנה שכבר בניתי מעגלים שמשתמשים בזה – עדיין זה מצליח לבלבל אותי!
תודה
🙂