תופעה מרגיזה במיוחד, עם פוטנציאל גבוה לשגע חובבי ארדואינו מתחילים, היא זו של החיבורים הצפים. במילים פשוטות, אם ננסה לקרוא ערכי מתח ממקור שאינו חולק את ה-Ground עם הארדואינו עצמו, תוצאות הקריאה עלולות להיות אקראיות ו/או שונות לגמרי מהצפוי.
ניקח לדוגמה את אחד הפרויקטים הפשוטים ביותר – מתג שמדליק נורה בתיווך הארדואינו. ניקח מתג פשוט, נחבר רגל אחת שלו למקור המתח 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.
לסנסורים ולרכיבים רבים אחרים יש חיבור מובנה ל-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. המעגל עבד בצורה מושלמת ללא כל נגד חיצוני, בחיווט כמוצג בתמונה זו:
אפשר להגדיר Pull-up פנימי לכל הפינים, כולל האנלוגיים, וזה שימושי גם לעבודה עם מעגלים משולבים עם פלט מסוג Open Collector (או Open Drain) הנפוץ – אם כי לא ניכנס לזה עכשיו. לרוע המזל, לא ניתן להגדיר נגדי Pull-down פנימיים, כך שאם אתם מתעקשים להגיב דווקא לסיגנל HIGH, לא תהיה לכם ברירה אלא להשתמש בנגדים חיצוניים.
יום עצמאות שמח!
כרגיל, תודה. חיפשתי וחיפשתי האם ה PULLUP ו PULLDOWN המובנים בארדואינו יכולים להחליף אחד חיצוני, וכמובן שהתשובה אצלך. תודה רבה עידו.
וואו, עוד מעט שמונה שנים מכתיבת הפוסט הזה… כשעוד בקושי ידעתי שלארדואינו יש pull-up פנימי 😀
ראיתי שנוהגים לחבר נגד pull up לקווים של SCL SDa ברכיבים שמשתמשים בתקשורת l2C , האם יש לך הסבר טוב לזה?
לא רק הסבר טוב, יש לי הסבר מצוין 🙂 בתקשורת I2C, העברת הנתונים מתבצעת על ידי "משיכה" מתוזמנת וחזקה של קו השעון ושל קו המידע ל-GND. זה אומר שמצב ברירת המחדל שלהם צריך להיות HIGH, ולכן ה-pull-ups. משתמשים בנגדים ולא בחיבור ישיר למתח כדי שלא יעברו במערכת זרמים חזקים מדי, כמובן.
תודה!
בגירסאות האחרונות של הארדואינו (החל מ-1.0 נדמה לי) אפשר להשתמש ב:
pinMode(2, INPUT_PULLUP);
כדי להשיג את אותו אפקט של pullup ללא צורך בכתיבה מפורשת של HIGH.
נכון, ו-1.0 זה כבר די ישן 🙂
כשכתבתי את הפוסט הזה עוד לא הכרתי את הקבוע INPUT_PULLUP, אם כי כדאי לזכור שכאשר משתמשים בו, מה שקורה מאחורי הקלעים זה בדיוק מה שתיארתי (וזה חשוב אם רוצים להבין לעומק את אופן הפעולה של המיקרו-בקר עצמו).
שלום עידו ממש תודה על ההסבר! אני מתרגל מתחיל… בניתי מעגל פשוט – 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… לקרוא עוד »
תלוי איך בדיוק חיברת את הלחצן. במצב כזה, רגל אחת שלו צריכה להיות מחוברת לפין 2 ורגל נגדית ל-GND.
זה בדיוק מה שפספסתי!! תודה!!
עכשיו עובד
פוסט מרתק והסבר מצויין.
תודה רבה!
בגדול זה נראה ככה:
https://docs.google.com/open?id=0B3WNqRq_mIccV2dqRzl0WmdoYXc
בציור יש דלגלג עם שני כניסות D-המידע שנכתב וWRITE שמשמש כENABLE ויציאת NOT-Q כאשר יש כאשר WRITE מופעל היציאה הפוכה לכניסה וכאשר הוא מכובה היציאה שומרת על הרמה הלוגית שהייתה בה קודם.
כאשר אתה כותב 1 לפין, הדלגלג מוציא 0 מה שסוגר את הטרנזיסטור אם לא מחובר כלום אזי המצב הלוגי שנראה הוא 1. אם מחובר רכיב הוא יקבע את המצב. לעומת זאת כאשר נכתוב 0 לפין הטרנזיסטור יפתח ויכריח 0 בין אם מחובר או לא.
לכן זה לא ממש ל"הגדיר נגד" כי הוא כל הזמן נמצא שם.
כמובן שאנחנו לא "מגדירים" נגד יש מאין, זה רק ביטוי 🙂
אבל תודה על המידע הפנימי, תרתי משמע!
מעניין,הגעתי לכאן מהכתבה בYNET.
השאלה מה לגביי MEMS כלומר Microelectromechanical systems,האם ניתן כתחביב לבנות כול מיני דברים קטנים תחת מיקרוסקופ שהוא לא אלקטרונים?או שראיתי יותר מידי סרטי מדע בדיוני:)
נשמע לי תחביב יקר ומסובך במיוחד, ובהשוואה לבעיית הייצור של החלקים, המיקרוסקופ הוא כסף קטן. למה לא להתחיל במיניאטורות "רגילות"? חפש את היצירות של Willard Wigan, לדוגמה 😉
טוב, לא יעזור, יש משהו שמטריד אותי בכל ההסברים אצל כולם: מה זאת אומרת ״הנגד הזה מושך את המתח״? ״מושך״ איך ולמה? מה בדיוק קורה שם? הרי הנגד… מתנגד, מובן מאליו… והוא נמצא אחרי החוט שמחבר לפין 2… מה אני מפספס בהגיון פה? האם זה אותו הדבר שמבלבל אותי כשנאמר שאת הנגד למנורת לד אפשר לשים גם אחריה, לפני הgnd, ולא חובה בינה לבין ה5v?
קודם כל אזהרה: מכיוון שאני עצמי לא מומחה לתחום, התשובה שלי היא בערבון מוגבל מאד. אם נשווה לצורך העניין בין חוט חשמל ואלקטרונים לכביש מהיר ומכוניות, אז נגד הוא לא סתם חסימה של נתיבים, אלא גם דיווח תנועה. כלומר, זה לא שלפניו נוצר פקק ואחריו התנועה דלילה, אלא מראש מגיעים פחות נהגים לכביש כי הם יודעים שיש בו חסימה. לכן זה לא משנה אם הנגד הוא לפני או אחרי ה-LED: ההשפעה שלו תופסת לכל ה"כביש". המקרה של Pull Up/Down שונה, כי הבעיה בכלל מתחילה מזה שחיבור צף יכול לייצג נתק מוחלט. לכן הוא לא חלק אינטגרלי מהמעגל, ולכן אנחנו מחברים… לקרוא עוד »
הי עידו, תודה. לגבי הלד – ההסבר מצויין ואפילו זכיר 🙂 לגבי הpull down, ההסבר מובן, אבל עדיין משום מה "לא עושה לי שכל". הרי אם יש "רעשים" הם ילכו הדרך הכי נוחה (לכיוון פין 2) ולא יתאמצו לעבור דרך "העפר" (הנגד) לא? ברור לי שמשהו בהגיון הבסיס כאן נעלם ממני (אולי כי השכלתי אוטודידקטית באלקטרוניקה, ובפרק הזה נרדמתי במיטה עם הספר…) אבל שוב – אם הנגד היה בין המפסק לבין החוט המקשר לפין 2 – הייתי מבין שהוא מקשה על רעשים קטנים להגיע – אבל כשהמפסק נלחץ ו"התנועה" האמיתית מגיעה, היא עוברת את המכשול הזה. בחיבור המודגם "המכשול" מגיע… לקרוא עוד »
כן, בנקודה הזו המשל של הכביש כבר לא באמת תופס 🙂 צריך לזכור שהפין האנלוגי קורא מתחים, לא זרמים. זאת אומרת, הוא לא סופר "כמה אלקטרונים עוברים ביחידת זמן", שזה מדד אבסולוטי, אלא מודד את הפרש הפוטנציאלים שהוא יחסי. ואז השאלה היא: יחסי למה? כשאין נתק והמעגל סגור, אין בעיה. לעומת זאת, כשיש נתק ואין למה להשוות, הנגד המושך בעצם אומר "אחי, חסר לך מידע? הנה, אני 'תוכנית הגיבוי' שלך, בוא תשווה את המתח ביחס אליי". וכאן חשוב לציין שהרעשים שאנחנו קוראים בפין לא מגיעים אליו דרך החוט. הנתק לא גורם לפתיחה של החוט ל"השפעות זרות", אלא פשוט הורס לנו… לקרוא עוד »
מעניין מאוד ומאיר עיניים. תודה רבה!
לא משנה כמה פעמים ובכמה מקומות אני קורא את ההסברים על pull up ו pull down ולא משנה שכבר בניתי מעגלים שמשתמשים בזה – עדיין זה מצליח לבלבל אותי!
תודה
🙂