6 - טרמין אור

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

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

במקום לקרוא את השדה האלקטרומגנטי עם ה Arduino, אנחנו נזהה באמצעות הנגד תלוי האור (photoresistor) את כמות האור, וע”י הזזת היד מעל הנגד תלוי האור נשנה את כמות האור שהחיישן קולט (כמו שעשינו בפרויקט הרביעי - גלי אור שונים (צבעים) ונורת RGB), והשינוי במתח בפין האנלוגי יקבע איזה תדר להשמיע. אנחנו נחבר את הנגד תלוי האור ל Arduino באמצעות נגד קבוע 10KΩ (בדיוק כמו בפרויקט הרביעי). וכמו בפרויקט שעבר, אנחנו קוראים את הכניסה האנלוגית בעזרת הפונקציה ()analogRead ומקבלים ערכים הנעים בין 0 ל1023, אך הערכים המתקבלים מהנגד תלוי האור קטנים יותר ומוגבלים ע”י הנגד הקבוע המחובר לקרקע (ל-) והנגד תלוי האור (החיישן הקולט את כמות האור), ולכן נשתמש שוב בפונקציה ()map על מנת לשנות את קנה המידה של הערכים המגיעים מהפין האנלוגי.

 

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

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

את הנגד תלוי אור (photoresistor) חברו ללוח המטריצה כשאתם מחברים רגל אחת ל 5V (+) והרגל השניה ל GND (-) (לא משנה באיזה סדר, שימו לב שאין הבדל בין הרגליים). בנוסף נחבר חוט מגשר מהפין האנלוגי A0 לרגל שמחוברת לאדמה (GND, -) להלן סכמה ואיור להמחשה:

Arduino Project number 6

 

הקוד

הקוד הפעם יהיה קצר יחסית. ניצור שלושה משתני Int, הראשון בשם sensorValue כדי לשמור את הערך שנקרא עם ()analogRead מהנגד תלוי אור, השני יקרא sensorLow ונשמור בו את הערך 1023, והשלישי יקרא sensorHigh ונשמור בו את הערך 0 (כשנפעיל לראשונה את הארדואינו נקרא ונשווה את ערכי המקסימום והמינימום האמיתיים). לאחר מכן ניצור עוד משתנה מסוג int אך הוא יהיה קבוע (להזכירם const), ויקרא ledPin. נשתמש בו כמציין (indicator) לכך שהחיישן סיים לתכייל, נכניס אליו את הערך 13 כי זהו הפין שלידו יש נורה וכשהנורה דולקת נדע שהחיישן מבצע כיול, כשהיא תתכבה נדע שהחיישן סיים לבצע את הכיול.

נמשיך לפוקנציית ה ()setup: נגדיר את הכיוון של פין 13 (קלט/פלט) עם הפקודה ()pinMode, נכניס לתוכה כפרמטר את מס’ הפין (ששמרנו במשתנה ledPin) ונכוון אותה ל OUTPUT כדי להגדירה כפלט. בשורה הבאה נגדיר את הנורה בפין 13 להידלק עם הפקודה ()digitalWrite ולתוכה נכניס את מס’ הפין (שוב, שמרנו אותו במשנתה ledPin) וכדי להגיד לו להידלק נעביר פרמטר נוסף, המילה השמורה HIGH (זוכרים את ההבדל בין HIGH ל LOW? - מקבל מתח ולא מקבל מתח (בהתאמה)).

הפעם נשתמש בלולאה חדשה הנקראת ‘לולאת while’ (דומה ללולאת for מפרויקט 3) ההבדל בין לולאת for ל while הוא שב for אנו מגדירים מראש כמה פעמים נבצע את סט הפקודות שבתוכה, ובלולאת while סט הפקודות שבתוכה מתבצע כל עוד תנאי כלשהו מתקיים (מתקיים = נכון - true) (אם הוא תמיד יתקיים ניתקע בלולאה אינסופית). אז נכתוב ()while ובתוך הסוגריים נכתוב את תנאי הלולאה. התנאי שאנו רוצים הוא ‘כל עוד לא עברו 5 שניות’, וניעזר בפונקציה ()millis כדי לבדוק את הזמן הנוכחי. הפונקציה millis מחזירה כמה זמן (במילי שניות) הארדואינו פועל מהפעם האחרונה שהדלקנו אותו, ולכן התנאי שלנו יהיה כל עוד millis קטן מ 5000 נבצע את גוף הלולאה (סט הפקודות), אחרת, נדלג על גוף הלולאה.

כעת נפתח סוגריים מסולסלים כדי לכתוב את גוף הלולאה (סט הפקודות), דבר ראשון נקרא את הערך מהחיישן בפין האנלוגי A0, עם הפקודה ()analogRead ונשמור את הערך במשתנה sensorValue. לאחר מכן נשתמש בתנאי if כדי לדעת היכן להציב את הערך, אם ה sensorValue גדול מ sensorHigh אנחנו צריכים להחליף את הערך שב sensorHigh בערך שנמצא ב sensorValue, ושוב לבצע זאת עם sensorLow בתנאי if נוסף. ולבסוף לסגור את הלולאה עם סוגריים מסולסלים. בנוסף, לפני שנסגור את הסוגריים המסוסלים של פונקציית ה setup נזכור לכבות את הנורה של פין 13 (הרי קראנו כבר את הערכים במשך 5 שניות והכנסו אותם למקום הנכון שלהם, ז”א סיימנו לכייל), ונבצע זאת עם הפקודה ()digitalWrite שתקבל את מס’ הפין (השמור במשתנה ledPin ואת המילה השמורה LOW).

ולבסוף פונקציית ה ()loop: דבר ראשון נקרא שוב את הערך מהפין האנלוגי A0 ונשמור אותו במשתנה sensorValue (כדי לדעת כל הזמן מתי החיישן מקבל פחות/יותר אור). כעת ניצור משתנה בשם pitch (לא שמרנו אותו בהתחלה כי אנחנו רוצים אותו כמשתנה זמני, רק לפוקנצייה הזאת) ונשמור בתוכו את הערך של sensorValue לאחר שנמפה אותו בעזרת הפונקצייה ()map. ל ()map נעביר כפרמטר ראשון את sensorValue כמובן, כפרמטר השני והשלישי נעביר לו את הגבולות המינימליים והמקסימליים (sensorLow ו sensorHigh), ולאחר מכן את המספר 50 והמספר 4000 (המספרים האלו יגידו את טווח התדרים שהארדינו יפיק).

אחרי שקיבלנו את הערך נעביר אותו לפיזואלקטרי (piezo) עם הפונקציה ()tone כדי להשמיע צליל. לפונקציה ()tone נעביר כפרמטר ראשון את הפין אליו יש להוציא כקלט את הצליל (חיברנו את רכיב ה piezo לפין מס’ 8), איזה תדר להשמיע (שמרנו את הערך במשתנה שיצרנו למעלה בשם pitch), ולבסוף למשך כמה זמן לנגן את התו (נכניס 20 אך אתם יכולים לשחק עם הערך הנל). ולבסוף אנחנו צריכים לתת קצת זמן לתו להתנגן אז ניצור דיליי של 10 מילי שניות עם הפקודה ()delay.

 

לסיכום

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

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