למד כיצד לשלוט בבהירות של LED המחובר ל-Raspberry Pi באמצעות PWM.
PWM הוא משהו שכולנו משתמשים בו כל יום, גם אם איננו יודעים זאת. זוהי טכניקה פשוטה ושימושית להפליא במגוון יישומים. הכי טוב, זה משהו שה-Raspberry Pi שלך יכול לעשות בלי להזיע. אֵיך? בואו נסתכל.
מה זה PWM?
לפי הטרמינולוגיה, "אפנון רוחב דופק" נשמע די מפואר. אבל כל מה שאנחנו באמת מדברים עליו כאן הוא כיבוי והדלקה של אות חשמלי - במהירות רבה. למה אולי נרצה לעשות את זה? פשוט כי זו דרך קלה מאוד לדמות אות אנלוגי משתנה, מבלי לפנות כובעי Raspberry Pi, תוספות, או מעגלים נוספים. עבור יישומים מסוימים, כמו חימום כיריים, הנעת מנוע או עמעום נורית LED, ממש לא ניתן להבחין בין אות PWM למתח אנלוגי "אמיתי".
מחזורי עבודה
אז יש לנו סדרה של פולסים המוזנים לתוך מטען (הדבר שאנחנו נוהגים בו). זה לבדו לא כל כך שימושי - עד שנתחיל לשנות (או לווסת) את הרוחב של הפולסים האלה. שלב ה"הפעלה" של תקופת הדלקה נתונה יכול לתפוס בין 0-100% מהמחזור הכולל. אנו קוראים לאחוז הזה ה מחזור חובה.
לדוגמה, נניח שיש לנו אות 3V PWM עם מחזור עבודה של 50%. כמות הכוח הממוצעת שעוברת דרך LED תהיה שווה ערך לאות דולק תמיד של 1.5V. העלה את מחזור העבודה, וה-LED מתחזק; לחייג אותו למטה, וה-LED מתעמעם. אנחנו יכולים ליצור אודיו באותה שיטה - וזו הסיבה שיציאת האודיו ב-Raspberry Pi שלך עשויה להפסיק לתפקד אם אתה משתמש ב-PWM לדברים אחרים.
PWM ב-Raspberry Pi
אתה יכול להשתמש בתוכנת PWM על כל פין GPIO של Raspberry Pi. אבל חומרה PWM זמין רק ב GPIO12, GPIO13, GPIO18, ו GPIO19.
מה ההבדל? ובכן, אם אתה מתכוון להשתמש בתוכנה כדי ליצור את האות, אז אתה תצרוך מחזורי CPU. עם זאת, למעבד שלך יש דברים טובים יותר לעשות מאשר לומר ל-LED לכבות ולהדליק כמה מאות פעמים בשנייה. למעשה, דעתו עשויה להיות מוסחת ולהסתבך במשימות אחרות, שעלולות להסתבך ברצינות עם תזמוני ה-PWM שלך.
כתוצאה מכך, לרוב זה רעיון טוב יותר להאציל את המשימה למעגלים מיוחדים. במקרה של Raspberry Pi, המעגל הזה חי בפנים המערכת על שבב שמכיל את המעבד. PWM של חומרה היא לרוב הרבה יותר מדויקת ונוחה, ולכן זו האפשרות המועדפת ברוב המקרים. אם אתה רוצה מושג מה קורה מתחת למכסה המנוע בשבב Broadcom BCM2711 של Raspberry Pi 4, אז אתה יכול להסתכל על התיעוד של BCM2711. פרק 8 מכסה את חומרי ה-PWM!
עמעום LED
כדי שה-LED שלנו יעבוד עם ה-Raspberry Pi שלנו, נצטרך לעשות קצת ברדבורד. זה אומר שני רכיבים: ה-LED עצמו, ונגד מגביל זרם, שנחבר איתו בסדרה. ללא הנגד, ה-LED שלך בסיכון למות בריח רע של עשן אם יותר מדי זרם עובר דרכו.
חישוב ערך הנגדים
זה לא משנה לאיזה קצה של הלד אתה מחבר את הנגד. מה שחשוב זה ערך הנגד. ה-Raspberry Pi 4 יכול לספק כ-16 מיליאמפר לכל סיכה. אז אנחנו יכולים להשתמש בחוק אוהם כדי לחשב את הערך של הנגד הדרוש.
החוק האמור קובע שההתנגדות צריכה להיות שווה למתח על פני הזרם. אנחנו יודעים את המתח שיוצא מפין ה-GPIO של Pi (3.3V), ואנחנו יודעים מה צריך להיות הזרם (16 מיליאמפר, או 0.016 אמפר). אם נחלק את הראשון בשני, נקבל 206.25. כעת, מכיוון שתיאבק למצוא נגדים בעלי ערך זה, בוא נלך על 220 אוהם במקום זאת.
חבר את האנודה של ה-LED (רגל ארוכה) ל GPIO 18 (שזה פין 12 פיזי ב-Raspberry Pi). חבר את הקתודה (רגל קצרה) לכל אחד מפיני הארקה של ה-Pi. אל תשכח את הנגד, איפשהו לאורך השביל. עכשיו אתה מוכן ללכת!
הטמעת PWM על Raspberry Pi
כדי לגרום ל-PWM החומרה לעבוד על Raspberry Pi, נשתמש ב- ספריית rpi-hardware-pwm מבית Cameron Davidson-Pilon, מותאם מ קוד מאת ג'רמי אימפסון. זה שימש ב- Pioreactor (ביוריאקטור מבוסס Pi) - אבל זה מספיק פשוט למטרות שלנו.
ראשית, בואו ערוך את ה-config.txtקובץ, נמצא ב- /boot מַדרִיך. אנחנו רק צריכים להוסיף שורה אחת: dtoverlay=pwm-2chan. אם נרצה להשתמש בפינים של GPIO שאינם 18 ו-19, נוכל להוסיף כאן כמה ארגומנטים נוספים. לעת עתה, בואו נשמור על דברים פשוטים.
הפעל מחדש את ה-Pi שלך והרץ:
lsmod | grep pwm
פקודה זו מפרטת את כל המודולים שנטענו בחלק המרכזי של מערכת ההפעלה, הנקראת הקרנל. כאן, אנו מסננים אותם כדי למצוא רק את חומרי ה-PWM, באמצעות ה grep (זו הפקודה "הדפס ביטוי רגולרי גלובלי").
אם pwm_bcm2835 מופיע בין המודולים הרשומים, אז אנחנו בכיוון הנכון. כמעט סיימנו להתכונן! כל מה שנותר הוא להתקין את הספרייה בפועל. מהטרמינל, הפעל:
sudo pip3 install rpi-hardware-pwm
אנחנו מוכנים עכשיו להתחיל.
קידוד מעגל LED PWM
הגיע הזמן ללכלך את הידיים עם קצת קידוד ב- Python. הפעל את Thonny והעתק את הקוד הבא. ואז הכה לָרוּץ.
from rpi_hardware_pwm import HardwarePWM
import time
pwm = HardwarePWM(pwm_channel=0, hz=60) # here's where we initialize the PWM
pwm.start(0) # start the PWM at zero – which means the LED is off
for i in range(101):
pwm.change_duty_cycle(i)
time.sleep(.1) # by introducing a small delay, we can make the effect visible.
pwm.stop()
אם הכל בסדר, תראה את ה-LED מתבהר בהדרגה עד ל- אני משתנה מונה מגיע ל-100. ואז זה יכבה. מה קורה פה? בואו נעבור דרכו.
אנו מייבאים את הנתח הרלוונטי של ספריית החומרה PWM (יחד עם זְמַן מודול) והכרזה על משתנה חדש. אנחנו יכולים להגדיר את pwm_channel ל-0 או 1, התואמים בהתאמה לפיני GPIO 18 ו-19 ב-Pi.
ה הרץ ערך שאנו יכולים להגדיר לכל תדר שאנו אוהבים (אם כי בסופו של דבר אנו מוגבלים על ידי מהירות השעון של ה-Pi). ב-60 הרץ, לא אמורים לראות הבהוב PWM. אבל אולי זה יהיה רעיון טוב להתחיל עם ערך נמוך מאוד (כמו 10) ובהדרגה לשנות דברים. עשה זאת, ובאמת תוכל לראות את הפולסים מתרחשים. אל תסתפק במילה שלנו!
אנחנו עובדים במחזור החובה שלנו (אני) עד מ-0 ל-100 באמצעות Python for loop. ראוי לציין שאנו יכולים להגדיר את זמן שינה טיעון עד כמה שנרצה - מכיוון שה-PWM מטופל בחומרה, הוא ירוץ מאחורי הקלעים, כמה זמן שנאמר לתוכנית לחכות.
יש עוד מה ללמוד עם PWM
מזל טוב! כתבת את תוכנית ה-PWM הראשונה שלך. אבל, כפי שקורה לעתים קרובות כל כך עם Raspberry Pi, יש הרבה שאתה יכול לעשות עם החומר הזה, במיוחד אם אתה מגדיל את Raspberry Pi שלך עם ה-PWM HAT הנכון. אז, אל תסתפקו ב-LED קטן אחד. אתה יכול להשתמש בכוח החדש הזה כדי לשלוט במנועים, לקודד הודעות וליצור צלילי סינתיסייזר. עולם של אפנון מחכה!