שְׁאֵלָה:
מדוע סקיצה שלי מדווחת על לחיצות כפתורים רבות מדי?
Peter Bloomfield
2014-02-24 03:43:23 UTC
view on stackexchange narkive permalink

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

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

הנה סקיצה למבחן בה השתמשתי, המדווחת על מספר הלחיצות ל צג סדרתי:

  int oldState = LOW; int numPresses = 0; setup void () {pinMode (5, INPUT); Serial.begin (9600);} loop void () {const int newState = digitalRead (5); אם (newState! = oldState) {if (newState == HIGH) Serial.println (++ numPresses); oldState = newState; }}  

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

האם ניתן לתקן זאת? או שיש לי סתם כפתור או סיכה פגומים או משהו כזה?

אז זה נראה כאילו המתח הולך מוזר כאשר לוחצים על הכפתור ... אכפת לך לבדוק את המתח בעזרת מטר כדי לראות מה קורה? יכול להיות שהכפתור יוצר איש קשר מוזר, ובכך יוצר קשר כאשר הוא לא אמור ...
המונה שומר על יציבות אם הוא מחובר בין + 5 וולט לקרקע (אם כי בדרך כלל אינו מציג קוצים קצרים).
מולטימטר @hichris123 מעדכן את התצוגה רק כמה פעמים בשנייה. מה שאנחנו מחפשים נמשך רק כמה מאיות שנייה לכל היותר. אתה באמת צריך אוסצילוסקופ כדי לראות את זה. ראה את התשובה שלי לתמונה.
@sachleen כן, לא היה בטוח בזה. אני צריך אוסצילוסקופ עכשיו (יש לי רק מולטימטר ועוד כמה דברים אחרים).
היי, אולי היית צריך לנסח מחדש את כותרת השאלה שלך למשהו כמו "מהן הצדקות טובות להרשות לעצמך אוסצילוסקופ?" :-)
שְׁלוֹשָׁה תשובות:
#1
+10
sachleen
2014-02-24 04:35:03 UTC
view on stackexchange narkive permalink

הקפאת קשר

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

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

הנה לחיצת כפתור שנלכדה בהיקף (תמונה מ מקסים):

enter image description here

ב- 2ms / div אנו לא רואים איתות יציב עד 6ms לאחר מגע ראשוני!

פתרונות

הוסף עיכוב

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

if (digitalRead (A3) == 0) {// עשה משהו כאן עיכוב (500 );}

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

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

התעלם מהלחצן לוחץ קרוב מדי אחד לשני

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

זה פותר את הבעיה של צורך להשתמש עיכוב () בקוד שלך.

החלף IC בין המפקח

יש דברים כמו MAX6816 שהוא IC שאתה מכניס בין המתג למיקרו-בקר. זה יוקיע את האות עבורך. במחיר של 1.62 $ @ 1k כנראה שלא תשתמשו בזה לעולם.

אחר

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

קוד הפצה - הודעה אחת שתשלוט בכולן

תודה, אני לומד וזה מעצבן אותי!
#2
+3
jlbnjmn
2014-02-24 04:05:29 UTC
view on stackexchange narkive permalink

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

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

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

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

  loop loop () {const int newState = digitalRead (5); אם (newState! = oldState) {if (newState == HIGH) Serial.println (++ numPresses); oldState = newState; עיכוב (10) // התאם את אורך העיכוב שיהיה קצר ככל האפשר מבלי להפעיל שגיאות}}  
#3
+2
jfpoilpret
2014-02-24 04:11:04 UTC
view on stackexchange narkive permalink

זהו הכפתור שלך ש מקפץ שהוא התנהגות רגילה למדי; זה לא קשור לאיכות הכפתור.

ישנן שתי דרכים "להקפיץ" כפתור: על ידי חומרה או על ידי תוכנה.

באופן אישי, אני מעדיף לפי חומרה; פשוט חפש את המעגל כפתור שיפוץ כפתור ואתה אמור למצוא דוגמאות רבות.

אם אין ברשותך הרכיבים הדרושים, תוכל להשתמש בהפצת תוכנה.

לפי תוכנה, יש לך דוגמה כאן באתר Arduino.

יש כפתורים שמקפצים הרבה יותר מאחרים, כך שזה קשור לאיכות הכפתורים.
@sachleen אני לא בטוח שהייתי אומר זאת; זה בעצם תלוי במתכת המשמשת למגעים בכפתור. אני לא חושב שאפשר למצוא כפתור שאינו מקפץ בכל המצבים. יש להקפיד על הקפצת מתגים ותנשוך אותך במיוחד אם הסקיצה שלך עוברת במהירות בין 2 שיחות "digitalRead ()".
גם הקפצה תלויה באופן הלחיצה על הכפתור (למשל איזה כוח מופעל עליו ואיך).
אף על פי שהתופעה נקראת מגע-הקפצה, "נראית" חשמלית כמו "מקפצה" (ועלולה לכלול למעשה "הקפצה" ממשית), במתג מכני, המגעים לעולם אינם מתקרבים / יוצאים זה מזה באופן מוחלט; באופן בלתי נמנע יש מידה מסוימת של החלקה, אחת על השנייה. החלקה של משטחים מחוספסים היא זו שמולידה את תופעת make-break-make ..., גם כאשר אנשי הקשר לא ממש "קופצים". (תחשוב על סלע חלק-חלק אחד שמחליק על השני). שים לב שמשמעות הדבר היא גם הפסקת קשר תכלול הפסקה-הפסק-הפסק ..., גם כן.


שאלה ותשובה זו תורגמה אוטומטית מהשפה האנגלית.התוכן המקורי זמין ב- stackexchange, ואנו מודים לו על רישיון cc by-sa 3.0 עליו הוא מופץ.
Loading...