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

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

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

נורית נשימה — PWM ו-duty

מה בשיעור?

  • אות דיגיטלי מול אנלוגי
  • PWM ומחזור פעולה
  • duty בטווח 0-1023 — ההבדל מ-Arduino
  • range() במקום לולאת for של C
  • sleep_ms מול sleep

מה נלמד כאן

  • אות דיגיטלי מול אנלוגי
  • PWM ו-duty()
  • הבדל קריטי: הטווח הוא 0-1023, לא 0-255
  • לולאת range()

קצב

נורית נשימה: האור מתגבר ונחלש לאט, כמו נשימה.

נורית נשימה

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


הידע שצריך

1. דיגיטלי מול אנלוגי

אות דיגיטלי יש לו שני מצבים בלבד — כמו led.value(1) או value(0). אין אמצע.

אות דיגיטלי

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

אות אנלוגי

⚠️ ה-ESP32 לא יודע להוציא מתח רציף. אז איך שולטים בבהירות?

2. PWM

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

מבנה אות PWM

המונח מה זה
מחזור הזמן בין תחילת פולס לתחילת הבא
רוחב פולס כמה זמן הפין היה גבוה
מחזור פעולה היחס ביניהם

3. duty() — והמספר שחייבים לזכור

יחס מחזור הפעולה

from machine import Pin, PWM

led = PWM(Pin(5))
led.duty(512)

⚠️ הנקודה הכי חשובה בשיעור: ב-MicroPython הטווח הוא 0 עד 1023, ולא 0 עד 255.

ב-Arduino analogWrite מקבלת 0-255. כאן duty() מקבלת 0-1023 — כי היא חושפת את הרזולוציה האמיתית של ה-ESP32, 10 ביט.

אם אתם ממירים קוד מ-Arduino — זו הטעות הראשונה שתעשו.

הערך מחזור פעולה התוצאה
duty(0) 0% כבוי
duty(256) 25% חלש
duty(512) 50% חצי
duty(1023) 100% מלא

4. הבהירות והפיזיקה

אפקט הנשימה

לפי חוק אוהם (U=IR), כשההתנגדות קבועה — מתח גבוה יותר נותן זרם גדול יותר. PWM לא משנה את המתח באמת, אלא את הזמן שבו הוא מופעל. הנורית "רואה" ממוצע.

5. range() במקום for של C

for brightness in range(0, 1024):
    led.duty(brightness)
    time.sleep_ms(1)

range(0, 1024) מייצר את המספרים 0 עד 1023 — הגבול העליון לא נכלל. זו פייתון רגילה לחלוטין.

לספירה לאחור:

for brightness in range(1023, -1, -1):

שלושת הפרמטרים: מאיפה, עד איפה (לא כולל), בכמה לקפוץ.-1 כצעד = יורדים.

השוו ל-Arduino: שם היה for (int i = 0; i <= 255; i++) עם שלושה ביטויים ונקודה-פסיק. כאן שורה אחת קריאה. זה היתרון של פייתון.


הניסוי

המטרה: הנורית מתבהרת ונחלשת בהדרגה.

רשימת רכיבים

הרכיב כמות
לוח ESP32 1
לוח ניסוי 400 נקודות 1
נורית LED 1
נגד 220Ω 1

אותו חיבור כמו בשיעור הקודם.

התרשים החשמלי

התרשים החשמלי

החיבור

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


הקוד

from machine import Pin, PWM
import time

LED_PIN = 5
led = PWM(Pin(LED_PIN))        # אובייקט PWM על הפין

while True:
    # התבהרות
    for brightness in range(0, 1024):
        led.duty(brightness)
        time.sleep_ms(1)

    # היחלשות
    for brightness in range(1023, -1, -1):
        led.duty(brightness)
        time.sleep_ms(1)

שימו לב ל-sleep_ms — מילי-שניות. time.sleep(0.001) היה עושה אותו דבר, אבל sleep_ms קריא יותר ומדויק יותר.

מה אמור לקרות

הנורית נושמת


נסו בעצמכם

  • שנו ל-sleep_ms(5). מה קרה לקצב?
  • שנו את range ל-range(0, 256). הנורית מגיעה לבהירות מלאה? למה לא?
  • קפצו בצעדים של 5: range(0, 1024, 5). מה השתנה?
  • הגבילו לטווח 200-800. איך זה נראה?
  • ב-Shell: צרו led = PWM(Pin(5)) והקלידו led.duty(300). שליטה חיה בבהירות.

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

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

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