7 - מכשיר מקלדת

בפרויקט הזה, נבנה, בעזרת כמה נגדים וכפתורים, מקלדת מוזיקלית קטנה. אנחנו יכולים לחבר כל כפתור לפין דיגיטלי ולקרוא אם הוא נלחץ או לא (אם הערך המתקבל הוא LOW או HIGH), אך נעשה זאת חכם יותר ע”י בניית דבר הנקרא סולם נגדים (Resistor ladder).

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

 

חיבור הרכיבים

חברו ללוח המטריצה חוטים מגשרים מעמודות ה+ וה-, אל ה 5V וה GND (בהתאמה, כפי שעשינו עד כה). חברו את הפיזואלק (piezo) ללוח המטריצה,(לא משנה איך, אין הבדל בין הרגליים) לשורה שבה נמצאת רגל אחת חברו חוט מקשר לאדמה (-), ולשורה של הרגל השנייה חברו חוט מגשר לפין הדיגיטלי מס’ 8 (על מנת לשדר לרכיב את תדר הצליל).

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

כעת נחבר לכולם נגדים. מהרגל הראשונה של המתג השני לעמודת ה+ נשים נגד 220Ω, מהרגל הראשונה של המתג השלישי לעמוד ה+ נשים נגד 10KΩ (קיצור ל kilohm), מהרגל הראשונה של המתג הרביעי לעמודת ה+ נשים נגד 1MΩ (קיצור של megohm), ולבסוף נשים נגד 10KΩ נוסף מהרגל השניה של המתג הרביעי לעמודת ה-. כל אחד מהנגדים האלו מתפקד במחלק מתח. המספרים בינהם שונים כדי שכל אחד מהם יתנגד בכמות שונה לזרם וכך (על פי הערך שנקרא מהפין האנלוגי A0) נוכל לדעת על איזה כפתור לחצנו. להלן סכמה ואיור להמחשה:

Arduino Project number 7

 

הקוד

בתוכנית הזאת נציג מבנה חדש לשמירת נתונים הנקרא מערך (קראו כאן בהרחבה). דבר ראשון שנעשה זה ליצור מבנה כזה, השומר מספרים שלמים (int), נקרא לו notes, והוא ישמור את כל התדרים שלנו (חיפוש קצר בגוגל הביא את התוצאה הזאת שפירטה את ההרצים המקבילים של התווים, ניתן לראות בתמונה שעיגלתי את המספרים ללמעלה והכנסתי את התווים C, D, E, F).

בפוקנציית ה ()setup: נפתח קישור בין הארדואינו למחשב (בגלל שאח”כ נבקש להדפיס את הערכים שנקלוט מהכפתורים למען בדיקה (ואם נצטרך לבצע debugging)).

ובפונקציית ה ()loop: נקרא את הערך שבפין A0 עם הפקודה analogRead, ונשים את הערך שנקבל במשתנה חדש (מסוג int) שנקרא לו keyVal. בגלל שהנגד שמחבר כל מתג לכוח (עמודת ה+) שונה, נקבל ערך שונה כל פעם שנלחץ על מתג שונה, כדי לראות את הערכים (דרך ה serial monitor) נדפיס אותם (את הערך שב keyVal) עם הפקודה ()Serial.println. כעת צריך למפות את הערך שב keyVal לתו שאנו רוצים להשמיע לכל מתג, נבצע זאת עם סדרה של if/else. שימו לב שלכל הנגדים יש טעויות קטנות לכן יכול להיות שהמספרים הבאים לא יתאימו לכם בדיוק, כוונו אותם בעזרת המספרים שאתם רואים מה serial monitor. בנוסף, כדי לנסות להתגבר על מרווח הטעות הקטן של כל נגד הזנתי את התנאי ב if להיות בין ערכים ולא ערך מדויק (ז”א קטן ממספר כלשהו וגדול ממספר כלשהו אחר).

נתחיל ב If הראשון אותו כיוונתי להיות בדיוק 1023 (זוכרים? הקלט שלנו מפין אנלוגי נע בין 0-1023), לכן זה צריך להיות הצליל של המתג הראשון, זה ללא הנגד, הוא רק משלים מעגל, אין נגד שמתנגד לזרם ולכן אנו מקבלים את הערך הגבוהה ביותר. אם התנאי נכון נבצע את הצליל שבתא הראשון - 0, במערך notes שיצרנו בהתחלה. את הצליל נשמיע בעזרת הפונקציה ()tone ונכוון אותו לפין 8 אליו מחובר ה piezo. ב if השני הצבנו נגד 220Ω, והערכים יהיו בין 990 ל 1010, אם הלחצן ילחץ נשמיע את התו שבתא השני, תא מס’ 1 במערך notes. ב If השלישי הצבנו נגד 10KΩ והערכים שיתקבלו יהיו בין 505 ל515, כעת נשמיע את התו הנמצא בתא מס’ 2 (התא השלישי במערך notes). ובלחצן האחרון, בו הצבנו נגד 1MΩ, הערכים שיתקבלו יהיו בין 5-10, ונשמיע את התו האחרון במערך, הנמצא בתא מס’ 3 (התא הרביעי והאחרון). בסופו של דבר נכתוב else נוסף, במידה והערך שיתקבל לא יהיה בטווחים האלו, כנראה שאנו מקבלים 0 (מכיוון שאף מתג לא משלים את המעגל), ועל כן אנו צריכים לשלוח ל piezo פקודה להפסיק לנגן את התו ששלחנו לו קודם, לכן נשתמש בפוקנציה החדשה ()noTone שתקבל כפרמטר רק את הפין אליו היא שולחת את הפקודה.

 

לסיכום

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

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

אז איך אפשר לחשב את המתח המתקבל? על פי חוק אוהם, מתח (V) = זרם (I) * התנגדות (R). כשאנו מודדים את עוצמת הזרם במעגל שאנו בונים, אנו מקבלים ערך כלשהו בטווח ה’מיליאמפר’ (אלף אמפר). אנו עובדים עם לוח הארדואינו שנותן לנו מתח של 5 וולט באופן קבוע, לכן ה V אצלנו הוא קבוע, ואנחנו נשחק עם ה I וה R. 5 (מתח) חלקי 220 אוהם (התנגדות) שווה ל 0.0227 אמפר (זרם). 5 חלקי 10,000 אוהם שווה ל (1/2000) אמפר. 5 חלקי 1,000,000 אוהם שווה ל (1/200000) אמפר.

מה זה נותן לנו? אנו יודעים שדרך פין אנלוגי אנו יכולים לקבל ערכים הנעים בין 0-1023, ז”א 1024 ערכים שונים. אם נכפיל את זה באמפר, נידע מה המס’ שצריך לרדת לנו מ1024 כתוצאה מההתנגדות של הנגד. לדוגמא: 10240.0227 שווה ל 23, ז”א שב if השני אנחנו צריכים לקבל בערך 1001. וב if השלישי אנחנו צריכים לקבל חצי, בגלל ש 1024(1/2000) שווה ל 0.512, ו 1024-512 שווה ל 512, ז”א נקבל בערך 512.

אם נרצה לבדוק את ההפך, לדוגמה יש לנו נורת led ואנחנו רוצים להתאים לה נגד, אנחנו יודעים שהארדואינו מספק 5 וולט, ונורת לד צורכת בערך 20 אמפר. לכן 5 חלקי 0.02 (1 אמפר חלקי 100 שווה ל1 מילי אמפר) שווה ל 250, אך מכיוון שיש לנו רק נגד של 220 אוהם נשים אותו ונקבל את הערך הכי קרוב לאידיאלי. אם לא נחבר נגד הנורה תישרף מכיון שהיא תקבל 40 מיליאמפר (במקום 0.02) (הרבה יותר ממה שהיא מסוגלת להתמודד איתו) (לוח הארדואינו אונו שלנו מספק 40 מיליאמפר (40mA) לכל פין יציאה/כניסה, כך כתוב ב Summary של הלוח כאן, מהיצאה של המתח של 5V).

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