דלגו לתוכן המרכזי
KitLab
שיעור קודם
אור נושם — עוצמה משתנה עם PWM· 5 / 41
אור נושם — עוצמה משתנה עם PWM
🎬

הסרטון בדרך אלינו

בינתיים — התמלול המלא של השיעור מחכה לכם למטה

אור נושם — עוצמה משתנה עם PWM

מה בשיעור?

  • להסביר את ההבדל בין אות דיגיטלי לאות אנלוגי
  • להבין מה זה PWM — כלומר איך מזייפים מתח באמצע בעזרת הבזקים מהירים
  • לשנות את עוצמת הנורית עם הבלוק write analog pin וערכים 0 עד 255
  • ליצור משתנה בשם lightness ולהשתמש בבלוקים set ו-change
  • להשתמש בלולאה מותנית repeat until שנעצרת כשמגיעים לערך מסוים
  • לצרוב את Breathing_light.sb3 ולראות את הנורית נושמת

מה נלמד כאן

  • מה ההבדל בין אות דיגיטלי (רק דולק או כבוי) לבין אות אנלוגי (כל דבר באמצע)
  • מה זה PWM ואיך אפשר לזייף איתו מתח באמצע
  • מה זה משתנה ואיך יוצרים אחד ב-ACECode
  • מה זה לולאה עם תנאי ומתי היא נעצרת
  • הבלוקים write analog pin, repeat until, set, change ו-wait milliseconds

למה אור שנושם יפה יותר

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

עיר לילה עם שלטי ניאון צבעוניים

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

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


אות דיגיטלי מול אות אנלוגי

בשיעור הראשון השתמשנו בבלוק הזה:

הבלוק set digital pin עם תפריט 5 ותפריט high

הוא נותן לפין רק שתי אפשרויות: high או low. אין שום דבר באמצע. אות כזה נקרא אות דיגיטלי, והוא בדיוק כמו שאלת נכון או לא נכון — יש רק שתי תשובות.

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

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

⚠️ והנה הבעיה: ה-ESP32 לא באמת יודע להוציא מתח אנלוגי. הוא יודע רק high ו-low. אז איך בכל זאת נקבל אור בחצי עוצמה? בעזרת טריק שנקרא PWM.


PWM — איך מזייפים מתח באמצע

PWM הוא קיצור של Pulse Width Modulation, ובעברית: שינוי רוחב הפעימה.

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

תרשים של אות פעימות: ציר זמן, ציר מתח, ומסומנים עליו Pulse Width ו-Pulse Period

בתרשים יש שני מושגים:

  • מחזור (Pulse Period) — הזמן של פעימה שלמה אחת, מההתחלה עד שהכול חוזר על עצמו.
  • רוחב הפעימה (Pulse Width) — כמה זמן מתוך המחזור הפין היה דולק.

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

תראו מה קורה כשמשנים את היחס:

0% — הפין תמיד כבוי. המתח הממוצע 0V. הנורית חשוכה.

תרשים מתח ישר על אפס לכל אורך הזמן

25% — רבע מהזמן דולק. הנורית מאירה חלש.

תרשים גל מרובע עם קטעים דולקים קצרים

50% — חצי מהזמן דולק. הנורית בערך בחצי עוצמה.

תרשים גל מרובע שבו הקטע הדולק והכבוי שווים באורכם

75% — שלושה רבעים מהזמן דולק. הנורית כמעט מלאה.

תרשים גל מרובע עם קטעים דולקים ארוכים והפסקות קצרות

100% — הפין תמיד דולק. הנורית בעוצמה מלאה.

תרשים מתח ישר על הערך הגבוה לכל אורך הזמן

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

הבלוק שעושה את זה

ב-ACECode הבלוק נקרא write analog pin [5] to [0], והוא נמצא במגירה Robots.

התפריט הראשון בוחר את הפין, והתיבה הלבנה מקבלת מספר בין 0 ל-255. המספר הזה הוא מחזור העבודה: 0 זה 0%, 255 זה 100%.

הבלוק write analog pin עם פין 5 והערך 0

הערך 0 — הנורית כבויה לגמרי.

הבלוק write analog pin עם פין 5 והערך 127

הערך 127 — בערך חצי עוצמה.

הבלוק write analog pin עם פין 5 והערך 255

הערך 255 — עוצמה מלאה.

💡 למה דווקא 255? כי זה המספר הגדול ביותר שאפשר לשמור בבית אחד של זיכרון. תחשבו על זה כמו סרגל עם 256 קווים, מ-0 עד 255.


משתנה — קופסה עם מספר בתוכה

עכשיו אנחנו יודעים לקבוע עוצמה. אבל אור נושם צריך שהעוצמה תשתנה כל הזמן — 0, 5, 10, 15... עד 255, ואז בחזרה למטה.

אנחנו לא נכתוב 52 בלוקים. במקום זה נשתמש במשתנה.

משתנה הוא קופסה עם שם, שאפשר לשמור בתוכה מספר. אפשר להסתכל מה יש בפנים, ואפשר להחליף את מה שבפנים מתי שרוצים. בתוכנית שלנו הקופסה תיקרא lightness (עוצמה), והיא תזכור כמה חזק הנורית מאירה עכשיו.

איך יוצרים משתנה ב-ACECode

לוחצים על המגירה Variables, ואז על Make a Variable. נפתח חלון קטן שבו כותבים את השם:

חלון ACECode שבו לוחצים Make a Variable ונפתחת תיבה לכתיבת שם המשתנה

כותבים lightness, לוחצים OK — וזהו. מהרגע הזה מופיעים במגירה בלוקים חדשים שעובדים על המשתנה:

מגירת המשתנים ב-ACECode עם הבלוקים set, change, show ו-hide, ולידה חלון התצוגה

💡 במצב Online mode אפשר לסמן את המשתנה כדי לראות על המסך את הערך שלו משתנה בזמן אמת. זה עוזר מאוד כשמשהו לא עובד וצריך להבין למה.


לולאה עם תנאי

בשיעור הקודם הכרנו את forever — לולאה שלא נגמרת לעולם. עכשיו נכיר לולאה אחרת: כזאת שנעצרת כשמשהו קורה.

הבלוק נקרא repeat until, והוא נמצא במגירה Control. הצורה שלו מעניינת: יש לו זרוע שעוטפת בלוקים בתוכה, ולמעלה יש חור בצורת משושה — שם נכנס התנאי.

הנה הלב של התוכנית:

שני בלוקי repeat until: הראשון מעלה את lightness ב-5 עד 255, השני מוריד ב-5 עד 0

תקראו את זה בקול:

  1. set [lightness] to [0] — שמים 0 בקופסה. הנורית חשוכה.
  2. repeat until [lightness = 255] — חזור שוב ושוב עד שהקופסה מגיעה ל-255. בתוך הלולאה: change [lightness] by [5] מוסיף 5 בכל סיבוב. 0, 5, 10, 15... הנורית מתחזקת.
  3. כשהקופסה הגיעה ל-255, הלולאה נעצרת ועוברים ללולאה הבאה.
  4. repeat until [lightness = 0] — חזור עד שהקופסה מגיעה ל-0. בתוכה change [lightness] by [-5] מוריד 5 בכל סיבוב. הנורית נחלשת.

עלייה, ירידה, עלייה, ירידה. זאת הנשימה.


החיבור

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

מה צריך: לוח ESP32, לוח ניסוי 400 נקודות, נורית LED אחת, ונגד 220Ω אחד.

תרשים חשמלי: פין IO5, נגד 200 אוהם, נורית LED, ואז GND

הזרם יוצא מפין IO5, עובר בנגד, ממשיך בנורית ומסיים ב-GND.

חיבור בפועל: נורית ונגד על לוח הניסוי מחוברים בחוטים ללוח ה-ESP32

⚠️ שימו לב שוב לרגל הארוכה של הנורית — היא זו שפונה אל הנגד ואל פין IO5.


הבלוקים

הנה התוכנית המלאה, כפי שהיא נראית על המסך:

התוכנית המלאה של האור הנושם ב-ACECode עם המשתנה lightness ושתי לולאות repeat until

ועכשיו בלוק־בלוק:

set [lightness] data type [integer]

הבלוק set lightness data type integer

בלוק מהמגירה Variables. הוא אומר איזה סוג מספר נשמור בקופסה. integer פירושו מספר שלם — בלי נקודה עשרונית. אם לא תשימו את הבלוק הזה, הלוח יניח בעצמו שמדובר במספר שלם.

set [lightness] to [0]

הבלוק set lightness to 0

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

הבלוק המשושה של ההשוואה

בלוק ירוק בצורת משושה עם עיגול ריק, סימן שווה, והמספר 50

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

בתוכנית שלנו נשים בצד השמאלי את המשתנה lightness, ובצד הימני את המספר 255 (או 0). ככה הלולאה יודעת מתי להיעצר.

change [lightness] by [5]

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

write analog pin [5] to [lightness]

הבלוק write analog pin עם פין 5 והערך 0

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

wait [20] milliseconds

הבלוק wait 100 milliseconds

בלוק המתנה, אבל הפעם במילישניות — אלפיות השנייה. 1000 מילישניות הן שנייה אחת.

למה כל כך קצר? כי יש 51 צעדים בכל כיוון. אם כל צעד יחכה שנייה שלמה, נשימה אחת תיקח כמעט שתי דקות. עם 20 מילישניות כל כיוון לוקח בערך שנייה — וזה בדיוק הקצב של נשימה.


מריצים

⬇ להורדת הקובץ Breathing_light.sb3 — גוררים אותו לתוך ACECode ולוחצים Upload.

עוברים ל-Upload mode, בוחרים ESP32, בוחרים את הפורט הנכון ולוחצים Upload. מחכים שהמונה יגיע ל-100%.

ההסבר המלא על צריבה נמצא בשיעור ההתקנה.

מה אמור לקרות

לוח ESP32 מחובר ללוח ניסוי עם נורית שמאירה בעוצמה בינונית

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

לא עובד?

  • אם הנורית פשוט מהבהבת חד במקום להתחזק בהדרגה — בדקו שהיא מחוברת לפין שתומך ב-PWM, ושהבלוק הוא write analog pin ולא set digital pin.
  • אם היא דולקת בעוצמה קבועה — בדקו שגררתם את המשתנה lightness לתוך התיבה של write analog pin, ולא השארתם שם מספר.
  • אם שום דבר לא קורה — בדקו את הכיוון של הנורית ואת הצריבה.

מה קרה כאן

הלוח רץ בלולאה אינסופית, ובתוכה שתי לולאות מותנות:

  1. הקופסה lightness מתחילה ב-0.
  2. לולאת עלייה: מוסיפים 5 לקופסה, שולחים את הערך החדש לנורית, מחכים 20 מילישניות. חוזרים — עד שהקופסה מגיעה ל-255.
  3. לולאת ירידה: מורידים 5 מהקופסה, שולחים לנורית, מחכים. חוזרים — עד שהקופסה מגיעה ל-0.
  4. הבלוק forever מחזיר אותנו להתחלה.

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

שניהם ילוו אתכם בכל שאר הקורס.


תרגילים

  1. נשימה איטית. שנו את שני בלוקי wait [20] milliseconds ל-50. הנשימה תהיה איטית ורגועה יותר. נסו גם 5 — מה קורה?
  2. קפיצות גדולות. שנו את change [lightness] by [5] ל-25 (ואת השני למינוס 25). הנורית תקפוץ בין עוצמות במקום לזרום. למה זה קורה?
  3. חצי נשימה. שנו את המספר בבלוק ההשוואה של הלולאה הראשונה מ-255 ל-100. הנורית תעלה רק עד עוצמה בינונית ותרד. שימו לב: מה צריך לשנות כדי שהלולאה השנייה עדיין תעבוד?
  4. אתגר: שתי נוריות מתחלפות. הוסיפו נורית שנייה על פין אחר עם נגד 220Ω, והוסיפו בלוק write analog pin נוסף שמקבל את 255 פחות lightness. כשאחת מתחזקת — השנייה נחלשת.

🧰 הרכיבים לשיעור הזה

רוצים את חומרי הקורס והעדכונים?

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