קלט מלחצנים רבים עם Charlieplexing

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

רקע

על Charlieplexing כדרך לשליטה במספר רב של נוריות LED כבר כתבתי בהרחבה כאן, ולכן אחזור רק על התקציר: לוקחים N פינים של מיקרו-בקר (כאלה שמאפשרים מצבי LOW, HIGH ו-INPUT), ומחברים לכל קומבינציה אפשרית של שני פינים שתי נוריות LED במקביל, בכיוונים הפוכים זו לזו ועם נגדים מתאימים כמובן. כדי להדליק LED מסוים מעבירים את כל הפינים הלא-רלוונטיים למצב INPUT, ואת השניים הנותרים מגדירים כ-HIGH וכ-LOW לפי הכיוון של נורית ה-LED הרצויה. בשיטה כזו אפשר לשלוט ב-N2 – N נוריות LED.

הרבה לוחות מקשים בסיסיים, כמו באינטרקומים, מכשירי טלפון ביתיים וכדומה, בנויים עם מעין שילוב של חוטי שתי-וערב שהמיקרו-בקר מפעיל וסורק במהירות שוב ושוב (בשיטה שנקראת Multiplexing). גם את זה תיארתי פעם בהרחבה, ואם ככה בנוי לוח המקשים שיש לכם, זו כמובן גם הדרך היחידה לקרוא אותו. בשיטה זו, N פינים מספיקים ל-N2 / 4 לחצנים בלבד. לעומת זאת, אם אתם בונים את מערך הלחצנים בעצמכם ואתם יכולים להקצות לעניין כמה דיודות, תוכלו להגיע בעזרת Charlieplexing ל-N2 – N לחצנים. ואם ההבדל לא ברור לכם מהנוסחאות, הנה כמה מספרים לדוגמה:

N         N^2/4      N^2-N
-----     -----      -----
2         1          2
3         2          6
4         4          12
5         6          20      
6         9          30
10        25         90

תכל'ס

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

היחידה הבסיסית של Charlieplexing
היחידה הבסיסית של Charlieplexing

בעיקרון, אנחנו יוצרים חיבורים כאלה בין כל זוג אפשרי של הפינים בהם אנחנו משתמשים לניהול המערך. במקרה של פלט, כדי להדליק נורית LED ספציפית הופכים כאמור את כל הפינים ל-INPUT, פרט לשניים שנוגעים בנורית ה-LED הרלוונטית והופכים ל-LOW/HIGH. עבור קלט, נהפוך גם כן את כל הפינים ל-INPUT, פרט לאחד שיהיה פלט LOW – ומשום כך, הפין הקורא המתאים צריך להיות INPUT עם נגד Pull-up. למה לא לעבוד עם HIGH? כי כשנקבל HIGH בפין הקורא, יהיה קשה לדעת אם מדובר במתח "אמתי" שעובר דרך לחצן, או בטעות שמקורה במטענים חשמליים זעירים שנשארו בחוטים מקודם.

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

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

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

אהלן עידו 🙂

כחלק מפרויקט סינטיסייזר שאני התחלתי לעבוד עליו ,
אני מנסה לקרוא מקלדת מקשים בעלת 36 מקשים (5 תורים על 8 שורות)

השאלה היא איך אני עושה זאת מבחינת הקוד?
אשמח לעזרה תודה 🙂

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