מה נלמד כאן
- שילוב מערכות בקרה
- זיהוי קצה יורד
- מאוורר מסתובב
הפרויקט המורכב בקורס

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

| המערכת | מה עושה | מה מפעיל |
|---|---|---|
| הנעה | מסובבת את הלהב | מנוע ב-PWM |
| סיבוב | מניעה את הראש | סרוו בלולאה |
והאתגר: שתיהן צריכות לרוץ בו-זמנית. אם התוכנית "תיתקע" בלולאת הסרוו — היא לא תשמע לחיצות.
זיהוי קצה יורד
if buttonState == 0 and lastButtonState == 1:
# הכפתור *הרגע* נלחץ
עד עכשיו בדקנו "האם לחוץ". כאן בודקים "האם השתנה ממשוחרר ללחוץ ברגע זה".
זה זיהוי קצה יורד, והוא עובד על ידי שמירת המצב הקודם והשוואה אליו.
למה זה עדיף על
whileשממתין לשחרור? כיwhileעוצר את כל התוכנית — והסרוו היה קופא באמצע. זיהוי קצה לא עוצר כלום.זו קפיצת מדרגה: מעבר מ"תוכנית שמחכה" ל"תוכנית שמנטרת". בפרויקטים גדולים זה ההבדל בין מערכת שמגיבה למערכת שנתקעת.
ההרכבה
בלי ערכת הבנייה — דלגו לקוד.
שלבי ההרכבה:












































הניסוי
המטרה: לחצן מפעיל ומחליף דרגות, הסרוו מסובב.
רשימת רכיבים
| הרכיב | כמות |
|---|---|
| לוח ESP32 | 1 |
| דרייבר מנועים | 1 |
| מנוע DC + מאוורר | 1 |
| סרוו | 1 |
| לחצנים | 3 |
מבנה התוכנית
from machine import Pin, PWM
from libs.servo import Servo
import time
myServo = Servo()
myServo.attach(5)
myServo.write(90)
pwmA1 = PWM(Pin(16)); pwmA2 = PWM(Pin(17))
pwmA1.freq(1000); pwmA2.freq(1000)
pwmA2.duty(0)
btn_pause = Pin(23, Pin.IN, Pin.PULL_UP) # נגד פנימי
angle = 90
step = 1
minAngle, maxAngle = 30, 150
isPaused = False
lastButtonState = 1
def servo_move():
global angle, step, isPaused, lastButtonState
buttonState = btn_pause.value()
# זיהוי קצה יורד
if buttonState == 0 and lastButtonState == 1:
time.sleep_ms(50) # ריטוט
if btn_pause.value() == 0:
isPaused = not isPaused
lastButtonState = buttonState
if not isPaused:
myServo.write(angle)
time.sleep_ms(15)
angle += step
if angle >= maxAngle or angle <= minAngle:
step = -step # היפוך כיוון
while True:
servo_move() # צעד אחד — לא חוסם
# כאן קוראים את לחצני המהירות ומעדכנים duty
שלושה רעיונות
1. servo_move() מבצעת צעד אחד ויוצאת. נקראת בכל סיבוב — ככה התוכנית אף פעם לא תקועה.
2. step = -step — בקצה הצעד מחליף סימן. שורה אחת שיוצרת תנועת הלוך ושוב אינסופית.
3. Pin.PULL_UP — נגד Pull-Up פנימי, בתוך השבב. פחות חוטים, אותה תוצאה. נשתמש בזה שוב בשיעור האחרון.
ו-
global— בפייתון, כדי לשנות משתנה חיצוני מתוך פונקציה, חייבים להצהירglobal. בלעדיו פייתון תיצור משתנה מקומי חדש והשינוי לא ישרוד. זו מלכודת קלאסית למתחילים בפייתון.
נסו בעצמכם
- שנו את
minAngleו-maxAngle. - שנו את
sleep_ms(15). מה קורה לחלקות? - החליפו את זיהוי הקצה ב-
whileשממתין לשחרור. מה קורה לסרוו? - הסירו את
global. איזו התנהגות מוזרה מקבלים? - הוסיפו תצוגת LCD עם הדרגה ומצב הסיבוב.


