דלגו לתוכן המרכזי
KitLab
שיעור קודם
מאוורר מסתובב — זיהוי קצה ו-global· 40 / 41
מאוורר מסתובב — זיהוי קצה ו-global
🎬

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

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

מאוורר מסתובב — זיהוי קצה ו-global

מה בשיעור?

  • שתי מערכות בקרה במקביל
  • זיהוי קצה יורד מול בדיקת מצב
  • למה while עוצר את התוכנית
  • step = -step לתנועה הלוך ושוב
  • global — המלכודת הקלאסית בפייתון

מה נלמד כאן

  • שילוב מערכות בקרה
  • זיהוי קצה יורד
  • מאוורר מסתובב

הפרויקט המורכב בקורס

מאוורר מסתובב

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

כל מה שלמדתם נפגש כאן.


הידע שצריך

שתי מערכות במקביל

מבנה המערכת

המערכת מה עושה מה מפעיל
הנעה מסובבת את הלהב מנוע ב-PWM
סיבוב מניעה את הראש סרוו בלולאה

והאתגר: שתיהן צריכות לרוץ בו-זמנית. אם התוכנית "תיתקע" בלולאת הסרוו — היא לא תשמע לחיצות.

זיהוי קצה יורד

if buttonState == 0 and lastButtonState == 1:
    # הכפתור *הרגע* נלחץ

עד עכשיו בדקנו "האם לחוץ". כאן בודקים "האם השתנה ממשוחרר ללחוץ ברגע זה".

זה זיהוי קצה יורד, והוא עובד על ידי שמירת המצב הקודם והשוואה אליו.

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

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


ההרכבה

בלי ערכת הבנייה — דלגו לקוד.

שלבי ההרכבה:

שלב הרכבה 1

שלב הרכבה 2

שלב הרכבה 3

שלב הרכבה 4

שלב הרכבה 5

שלב הרכבה 6

שלב הרכבה 7

שלב הרכבה 8

שלב הרכבה 9

שלב הרכבה 10

שלב הרכבה 11

שלב הרכבה 12

שלב הרכבה 13

שלב הרכבה 14

שלב הרכבה 15

שלב הרכבה 16

שלב הרכבה 17

שלב הרכבה 18

שלב הרכבה 19

שלב הרכבה 20

שלב הרכבה 21

שלב הרכבה 22

שלב הרכבה 23

שלב הרכבה 24

שלב הרכבה 25

שלב הרכבה 26

שלב הרכבה 27

שלב הרכבה 28

שלב הרכבה 29

שלב הרכבה 30

שלב הרכבה 31

שלב הרכבה 32

שלב הרכבה 33

שלב הרכבה 34

שלב הרכבה 35

שלב הרכבה 36

שלב הרכבה 37

שלב הרכבה 38

שלב הרכבה 39

שלב הרכבה 40

שלב הרכבה 41

שלב הרכבה 42

שלב הרכבה 43

שלב הרכבה 44


הניסוי

המטרה: לחצן מפעיל ומחליף דרגות, הסרוו מסובב.

רשימת רכיבים

הרכיב כמות
לוח 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 עם הדרגה ומצב הסיבוב.

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

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

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