תכנות מיקרו-בקרים בשפת MicroPython · פרק 1 — הכרת הלוחות וסביבת העבודה⌂📚🏠
פרק 1

הכרת הלוחות וסביבת העבודה

Boards and Tools
2 שעות לימוד

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

בפרק הזה:
  • נבחין בין מיקרו-בקר למחשב, ונבחר לוח מתאים לכל פרויקט.
  • נבין למה השם Raspberry Pi מכסה שני דברים שונים.
  • נכין את העורך ונצרוב קושחה ל-ESP32 ול-Pico W.
  • נשתמש בשורת הפקודה האינטראקטיבית, ונבדיל בין הרצת קובץ לשמירתו בלוח.
  • נפתור תקלות נפוצות בחיבור.

1.1 מיקרו-בקר או מחשב? (Microcontroller vs Computer)

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

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

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

1.2 שלושת הלוחות בספר (The Three Boards)

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

ESP32Pico WPico 2 WPi 4 / Pi 5
סוגבקרבקרבקרמחשב
שבבESP32RP2040RP2350BCM2711 / BCM2712
מעבדשתי ליבות, עד 240 MHzשתי ליבות, עד 133 MHzשתי ליבות, עד 150 MHz4 ליבות, 1.8 / 2.4 GHz
זיכרון520 kB264 kB520 kB1–16 GB
אלחוטWiFi, BLEWiFi, BLEWiFi, BLEWiFi, BLE
שפהמיקרו-פייתוןמיקרו-פייתוןמיקרו-פייתוןפייתון על לינוקס
ממיר A/D פנימי12 סיביות12 סיביות12 סיביותאין

המספרים לקוחים מתיעוד היצרנים, וזיכרון ה-Pi תלוי בדגם. נפח האחסון ב-ESP32 משתנה לפי היחידה, ואילו ב-Pico W הוא 2 MB וב-Pico 2 W הוא 4 MB.

Raspberry Piשם אחד לשתי משפחותPico W / Pico 2 Wבקר · מיקרו-פייתוןPi 4 / Pi 5מחשב · לינוקס · פייתון
אותו שם מציין שני התקנים מסוגים שונים.
טעות נפוצה: השם Raspberry Pi מכסה שני דברים שונים. Pico W הוא בקר קטן שמריץ מיקרו-פייתון בלי מערכת הפעלה. ואילו Pi 4 ו-Pi 5 הם מחשבים שלמים שעובדים עם לינוקס ועם פייתון רגיל. לכן אותה תוכנית אינה רצה בהם: הספרייה machine אינה קיימת ב-Pi.

מתי בוחרים כל לוח?:

שאלה 1.1: בונים תחנה שקוראת חיישן טמפרטורה כל דקה ושולחת את הקריאה ב-WiFi. אילו משפחות מתאימות ואיזו מיותרת?

1.3 מהי מיקרו-פייתון? (MicroPython)

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

המחשבהעורך Thonnyהלוחהקושחההמפרש ושורת הפקודה האינטראקטיביתמערכת הקבציםboot.pymain.pylib/USB
המחשב כותב ושולח דרך USB, והלוח שומר ומריץ. אחרי השמירה הלוח עובד לבד.

1.4 הכנת המחשב (Setting Up)

לא הורץ: הצעדים בסעיף הזה ובשניים שאחריו מתבצעים במחשב שלכם ובלוח אמיתי, ואי אפשר להריץ אותם בזמן בניית הספר, ולכן לא הורצו בו. אנחנו מתארים אותם במלל ובפקודות. שמות התפריטים עשויים להשתנות מעט בין גרסאות העורך.
  1. מורידים את העורך Thonny מ-thonny.org ומתקינים אותו.
  2. מחברים את הלוח למחשב בכבל נתונים USB.
  3. פותחים את התפריט Run → Select interpreter, בוחרים מיקרו-פייתון ללוח שלנו, ואז בוחרים את היציאה.

לוחות Pico מתחברים ישירות, ובמערכות חדשות אינם צריכים דרייבר. לוחות ESP32 משתמשים לרוב בשבב ביניים בין USB ליציאה הטורית, והמפורסמים שבהם CP210x ו-CH340. אם לא מופיעה יציאה חדשה, מורידים את הדרייבר מאתר היצרן של השבב הזה.

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

1.5 צריבת קושחה (Installing the Firmware)

צורבים את הקושחה פעם אחת, ואחר כך רק בעדכון. לוקחים אותה תמיד מהמקור הרשמי micropython.org/download, ולכל לוח קובץ משלו: ESP32_GENERIC, RPI_PICO_W ו-RPI_PICO2_W.

ב-ESP32: מתוך העורך:

  1. באותו חלון של בחירת המפרש לוחצים על הקישור להתקנת מיקרו-פייתון.
  2. בוחרים יציאה, סוג לוח ואת הגרסה האחרונה, ולוחצים על התקנה.
  3. אם הלוח אינו מגיב, מכניסים אותו בעצמנו למצב טעינה: לוחצים לחיצה ארוכה על BOOT, מקישים על RESET או EN, משחררים את BOOT ומנסים שוב.

ב-Pico W וב-Pico 2 W: בהעתקת קובץ:

  1. לוחצים לחיצה ארוכה על BOOTSEL בזמן חיבור הכבל למחשב, ומשחררים כשהלוח מופיע כדיסק.
  2. שם הדיסק הוא RPI-RP2 ב-Pico W ו-RP2350 ב-Pico 2 W.
  3. מעתיקים אליו את קובץ ה-UF2 שהורדנו. הלוח מופעל מחדש והדיסק נעלם. זה תקין, ומשמעותו שהפעולה הצליחה.
טעות נפוצה: קובץ של Pico בלי W אינו מפעיל רשת ב-Pico W, וקובץ של Pico W אינו מתאים ל-Pico 2 W, כי השבבים שונים. קוראים את שם הלוח המודפס עליו לפני ההורדה.

1.6 שורת הפקודה האינטראקטיבית (The REPL)

כשהקושחה עובדת, בחלון Shell שמתחת לעורך מופיע הסימן >>>. זו שורת הפקודה האינטראקטיבית, ושמה REPL: היא קוראת שורה, מריצה אותה, מדפיסה את התוצאה וממתינה לשורה הבאה. זו הדרך המהירה ביותר לנסות פקודה אחת:

מקלידים את השורות האלה אחת אחרי השנייה. התשובה מופיעה מתחת לכל שורה; השורות האלה לא הורצו בבניית הספר.
>>> 3.3 / 2
>>> print("hello")
פקודהמה היא עושה
Ctrl-Cעוצר את התוכנית הרצה ומחזיר אותנו לשורה האינטראקטיבית.
Ctrl-Dהפעלה מחדש רכה: מוחק את המשתנים ומריץ את boot.py ואחריו את main.py.

1.7 הרצת קובץ מול שמירה בלוח (Run vs Save)

ההבדל הזה מבלבל כל מי שמתחיל. כפתור ההרצה F5 שולח את הקובץ הפתוח ללוח כדי שיריץ אותו עכשיו, בלי שיישאר בו. אם ננתק את הכבל ונחבר מחדש, התוכנית לא תחזור לעבוד. כדי שהתוכנית תישאר, שומרים אותה בלוח: בתפריט File → Save as בוחרים בלוח במקום במחשב.

הקובץ בלוחמתי הוא רץמה שמים בו
boot.pyראשון, אחרי כל הפעלה מחדשהגדרה חד-פעמית, והוא תמיד מסתיים ואינו רץ בלי סוף
main.pyאחרי boot.py, לבדותוכנית הפרויקט. אם הוא מסתיים, חוזרת השורה האינטראקטיבית
lib/כשמייבאים ממנוהספריות שלנו, ובהן הקובץ board.py

כל תוכניות הספר שמתאימות לשני הלוחות מייבאות את הקובץ board.py, ובו שמות ההדקים של כל לוח. מעתיקים את הגרסה המתאימה ללוח שלנו מחבילת ההורדה אל התיקייה lib בלוח, פעם אחת.

הערה: חבילת ההורדה, ובה הספריות והתוכניות של כל הפרקים: ESP32 · Pico W · Raspberry Pi 4/5
שימו לב: תוכנית main.py שרצה לנצח עלולה למנוע מהעורך להתחבר. הפתרון: לוחצים על כפתור העצירה בעורך, או Ctrl-C בחלון Shell, ואז מתקנים את הקובץ.

1.8 התוכנית הראשונה (First Program)

שואלים את הלוח על עצמו. הפקודה print מדפיסה טקסט, והספריות sys ו-machine נותנות לנו מידע על המערכת:

אותה תוכנית בשני הלוחות.
import sys
import machine

print("language :", sys.implementation.name)
print("platform :", sys.platform)
print("CPU MHz  :", machine.freq() // 1000000)
ESP32 · MicroPython 1.29 · simulated board
language : micropython
platform : webassembly
CPU MHz  : 240
Pico W · MicroPython 1.29 · simulated board
language : micropython
platform : webassembly
CPU MHz  : 150

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

ועכשיו אותה תוכנית ב-Pi, בלי machine כי היא אינה קיימת שם. משווים את השורה הראשונה בשני המסכים: כאן פייתון רגיל על לינוקס.

ב-Raspberry Pi 4/5: פייתון רגיל.
import sys

print("language :", sys.implementation.name)
Raspberry Pi 4/5 · Python 3 · simulated bus
language : cpython
הערה: התוכניות בספר נכתבו לגרסה 1.29 של מיקרו-פייתון. ניסינו אותן גם על לוח ESP32 אמיתי בגרסה הישנה יותר 1.21, והן עבדו אחרי תיקונים קטנים שנכנסו לספר. כרטיס הזיכרון בפרק 12 צריך את המודול vfs, שאינו קיים בגרסה ההיא. לכן מתקינים את הגרסה העדכנית. עוד לא ניסינו את התוכניות על Pico W ו-Raspberry Pi אמיתיים, ולא עם רכיבים חיצוניים, ולכן המסכים של החלקים האלה באים מן ההדמיה.

1.9 תקלות נפוצות (Troubleshooting)

מה רואיםהסיבה הרגילההפתרון
לא מופיעה יציאה חדשהכבל טעינה, או שחסר דרייברמחליפים קודם את הכבל, ואז מתקינים CP210x או CH340
העורך אינו מתחבר ללוחmain.py רץ בלי סוףכפתור העצירה או Ctrl-C, ואז מתקנים את הקובץ
הצריבה ב-ESP32 נכשלההלוח אינו במצב טעינהלוחצים על BOOT ועל RESET כמו ב-1.5
דיסק Pico אינו מופיעלא לחצנו על BOOTSEL לפני החיבורמנתקים את הכבל וחוזרים על הצעד
ImportError ב-boardהקובץ אינו בלוחמעתיקים את board.py אל lib

1.10 המעבדה החיה (The Live Lab)

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

▶ניסוי חי — התוכנית הראשונהמיקרו-פייתון האמיתית בתוך הדפדפן: בוחרים לוח, משנים את התוכנית ומתבוננים בנורית.
⚠
המעבדה אינה זמינה כעת. החומר בפרק שלם גם בלעדיה: ממשיכים לקרוא, וחוזרים לניסוי מאוחר יותר, או פותחים אותו ישירות מן הקישור שמתחת למסגרת.
https://fahed-lab.com/books/micropython/lab/mpy_lab?prog=ch1_blink
פותחים את המעבדה בדף נפרד ↗ fahed-lab.com/books/micropython/lab/mpy_lab?prog=ch1_blink

עיקרי הפרק:

פקודות הפרק:

פקודהמה היא עושה
print(...)מדפיס על המסך.
sys.implementation.nameשם המימוש של השפה.
machine.freq()תדר המעבד בהרץ.
Ctrl-C / Ctrl-Dעצירת התוכנית / הפעלה מחדש רכה.

מילון מונחים:

עבריתEnglishערבית
מיקרו-בקרMicrocontrollerالمتحكّم
לוחBoardاللوحة
קושחהFirmwareالبرنامج الثابت
צריבהFlashingالحرق
מפרשInterpreterالمفسّر
דרייברDriverبرنامج التعريف
שורת פקודה אינטראקטיביתREPLسطر الأوامر التفاعلي
התשובות הסופיות לשאלות הפרק
1.1 ESP32 או Pico W מספיקים. ה-Pi מיותר: הוא מעלה מערכת שלמה כדי לבצע משימה פשוטה.

שאלות לתרגול:

רמה ראשונה — בסיס
1.
סווגו כל לוח למיקרו-בקר או למחשב: ESP32, Pico 2 W, Pi 5.
תשובות: ESP32 ו-Pico 2 W הם מיקרו-בקרים, ו-Pi 5 הוא מחשב.
2.
שמרנו תוכנית בשם test.py בלוח. האם היא תעבוד מעצמה אחרי הפעלה מחדש?
תשובות: לא. הלוח מריץ מעצמו רק את boot.py ואת main.py.
רמה שנייה — יישום
3.
כתבו תוכנית שמדפיסה את שם הפלטפורמה ואת מנת החילוק של 3.3 ב-2 בשתי ספרות אחרי הנקודה העשרונית.
תשובות:
import sys

print("my board:", sys.platform)
print("3.3 / 2 =", "%.2f" % (3.3 / 2))
השורה השנייה מדפיסה: 3.3 / 2 = 1.65
4.
תוכנית main.py שכתבנו מסתיימת אחרי שלוש שניות. מה מופיע בחלון Shell אחרי שהיא מסתיימת?
תשובות: חוזרת השורה האינטראקטיבית, ומופיע הסימן >>>.
רמה שלישית — העמקה
5.
למה הרעיון הזה נכשל: "כותבים פרויקט ל-Pico W בספרייה machine, ואז מעבירים אותו כמות שהוא ל-Pi 5"?
תשובות: כי Pi 5 עובד עם לינוקס ופייתון רגיל ואין בו machine. צריך ספרייה אחרת, כמו gpiozero.