בינה מלאכותית RB108-12 : פיתוח מעגל אלקטרוני – על ידי בינה מלאכותית
(מיקרו־בקר) הוא “מחשב קטן על שבב”: מעבד + זיכרון + חומרות תקשורת (UART/I2C/SPI), טיימרים, ADC וכו’.



מה זה פינים (Pins)
-
הפינים הם הרגליים החשמליות של השבב/מודול.
-
יש כמה סוגים עיקריים:
-
VCC / 3.3V ו-GND: הזנת מתח ואדמה.
-
GPIO: כניסה/יציאה דיגיטלית כללית (לקרוא כפתור, להדליק LED, להפעיל טרנזיסטור).
-
פונקציות מיוחדות: UART (TX/RX), I2C (SDA/SCL), SPI (MOSI/MISO/SCK/CS), PWM, ADC (אנלוגי), לפעמים DAC.
-
פיני “Boot/Strap”: קובעים מצב אתחול/צריבה בזמן הדלקה.
-
מה זה “צריבה” (Flashing) של תוכנה
-
זו כתיבה של קובץ תוכנה (Firmware) לזיכרון לא-נדיף (Flash) של המיקרו־בקר.
-
זה לא “שורף” פיזית; זו כתיבה לזיכרון פנימי/חיצוני.
-
בדרך כלל עושים את זה דרך USB-Serial (מתאם UART) או דרך USB מובנה, ולעיתים דרך JTAG.
מה זה ESP32
-
משפחה של מיקרו־בקרים של Espressif עם Wi-Fi + Bluetooth.
-
נפוץ בפרויקטים כי הוא חזק, זול, והרבה פריפריות.
-
“מודול” ESP32 (כמו WROOM) כולל גם את ה-ESP32 וגם שבב Flash חיצוני על אותו מודול.
איפה נשמרת התוכנה ב-ESP32
-
התוכנה שאתה כותב נשמרת בזיכרון Flash (בדרך כלל Flash חיצוני על המודול, לא בתוך הליבה עצמה).
-
בזמן ריצה:
-
חלק מהקוד יכול לרוץ ישירות מה-Flash (Execute-In-Place) או להיטען ל-RAM לביצועים.
-
המשתנים הזמניים נמצאים ב-RAM (נמחקים בכיבוי).
-
-
יש גם ROM פנימי קבוע במעבד עם “Boot ROM” שמתחיל את האתחול ותומך במצב צריבה.
-
נתונים שצריכים להישמר אחרי כיבוי (הגדרות) נשמרים ב-Flash (למשל NVS) או במחיצות ייעודיות.
איך הצריבה מתבצעת בפועל (בגדול)
-
בעת Reset/הדלקה, ה-Boot ROM בודק “Strap pins” (למשל GPIO0) כדי לבחור מצב.
-
אם מצב צריבה: הוא מקבל תוכנה דרך UART/USB וכותב אותה ל-Flash.
-
אם מצב רגיל: הוא טוען את ה-Bootloader מה-Flash, ואז ה-Bootloader מעלה את האפליקציה מה-Flash.
סוגי יציאות/כניסות במיקרו־בקר (MCU)
-
דיגיטלי GPIO
-
קלט דיגיטלי (Digital Input): קורא רק 0 או 1 (LOW/HIGH).
דוגמה: כפתור. -
פלט דיגיטלי (Digital Output): מוציא 0 או 1.
דוגמה: הדלקת LED או הפעלת ריליי/טרנזיסטור.
דוגמה כפתור (קלט דיגיטלי)
-
חיבור נפוץ: כפתור בין הפין ל-GND, ומפעילים Pull-Up פנימי.
-
כשהכפתור לא לחוץ: הפין “1”
-
כשהכפתור לחוץ: הפין “0”
דוגמה LED (פלט דיגיטלי)
-
LED עם נגד טורי (למשל 220–1kΩ) בין הפין ל-GND (או להפך).
-
הפין על “1” מדליק, “0” מכבה (תלוי בחיבור).
-
אנלוגי (ADC / DAC)
-
ADC (Analog to Digital Converter): קורא מתח רציף ומחזיר מספר.
דוגמה: פוטנציומטר, חיישן אור, מד מתח סוללה דרך מחלק נגדים.
למשל: 0V → 0, 3.3V → מקסימום (תלוי ברזולוציה). -
DAC (Digital to Analog Converter) אם קיים: מוציא מתח “אנלוגי” אמיתי.
(ברוב המקרים משתמשים ב-PWM במקום DAC.)
-
PWM (דיגיטלי “חצי אנלוגי”)
-
זה פלט דיגיטלי שמחליף מהר בין 0/1 ביחס זמן משתנה (Duty Cycle).
-
שימושים:
-
עמעום LED
-
שליטה במהירות מנוע DC (דרך דרייבר/טרנזיסטור)
-
יצירת אות לסרבו (בדרך כלל פולסים בקצב קבוע)
-
-
ממשקי תקשורת (לא “אנלוגי/דיגיטלי” פשוט)
-
UART: תקשורת סדרתית (TX/RX) למשל למחשב/מודול GPS.
-
I2C: שני חוטים (SDA/SCL) לחיישנים רבים.
-
SPI: מהיר יותר (MOSI/MISO/SCK/CS) למסכים, זיכרונות וכו’.
דוגמאות שימוש מעשיות
א) קריאת כפתור והדלקת LED
-
GPIO כקלט עם Pull-Up, GPIO כפלט.
-
לוגיקה: אם הכפתור לחוץ → LED נדלק.
ב) הפעלת מנוע DC
אי אפשר לחבר מנוע ישירות לפין של MCU, בגלל:
-
זרם: פין MCU מסוגל לספק מעט מאוד (עשרות mA במקרה הטוב), מנוע דורש הרבה יותר.
-
רעש וחזרה חשמלית: מנוע הוא עומס אינדוקטיבי ויוצר “קפיצות מתח” (Back-EMF) שמסכנות את המיקרו.
-
מתח: מנוע יכול להיות 6V/12V וה-MCU עובד 3.3V.
לכן צריך דרייבר למנוע (Motor Driver)
מה זה דרייבר למנוע ולמה הוא נדרש
דרייבר מנוע הוא “מתווך כוח” בין המיקרו למנוע:
-
מקבל אותות בקרה קטנים מהמיקרו (ON/OFF, כיוון, PWM)
-
מספק למנוע זרם ומתח גבוהים ממקור הכוח
-
מגן על המיקרו מפיקים ורעש (דיודות/מנגנוני הגנה)
-
מאפשר שליטה בכיוון סיבוב (H-Bridge) ומהירות (PWM)
סוגים נפוצים
-
טרנזיסטור MOSFET יחיד + דיודת Flyback: להפעלה/כיבוי ומהירות לכיוון אחד (מנוע DC).
-
H-Bridge: שליטה גם בכיוון וגם במהירות (למשל TB6612FNG, L298N, DRV8833).
-
דרייבר למנוע צעד (Stepper): כמו A4988/DRV8825.
-
בקר ESC למנועי Brushless: זה דרייבר ייעודי למנועי BLDC.
דוגמה פשוטה להפעלת מנוע DC
-
MCU מוציא PWM לפין “EN” בדרייבר.
-
MCU מוציא שני פינים “IN1/IN2” לקביעת כיוון.
-
ספק כוח של המנוע מתחבר לדרייבר, והדרייבר למנוע.
דוגמאות לפרויקטים בעזרת מיקרו בקר
חלק 1: פיתוח תוכנה למקרו בקר ואלקטרוניקה
חלק 2: הוספת מסך ודרייבר תוכנה EPS32 – OLED למיקרו בקר ESP3
חלק 3:
מה עושה הקוד :
הקוד הוא תוכנית Arduino ל-ESP32-S3 שמחליפה מצב של שני פינים כל חצי שנייה, כך שהם תמיד הפוכים אחד לשני.
מה קורה בפועל
-
הגדרות בתחילת הקוד
-
PIN1 = 1זה GPIO1 -
LED2 = 2זה GPIO2 (מחובר אליו LED לפי ההערה)
-
setup()רץ פעם אחת אחרי הדלקה/Reset
-
pinMode(PIN1, OUTPUT);מגדיר את GPIO1 כפלט -
pinMode(LED2, OUTPUT);מגדיר את GPIO2 כפלט -
digitalWrite(PIN1, LOW);מתחיל עם GPIO1 כבוי (0V) -
digitalWrite(LED2, HIGH);מתחיל עם GPIO2 דלוק (3.3V)
כלומר: בתחילת העבודה PIN1=OFF ו-LED2=ON
-
loop()רץ בלולאה אינסופית
מחזור 1:
-
PIN1נהיה HIGH (נדלק) -
LED2נהיה LOW (נכבה) -
delay(500)מחכה 500ms
מחזור 2:
-
PIN1נהיה LOW (נכבה) -
LED2נהיה HIGH (נדלק) -
delay(500)מחכה 500ms
תוצאה
-
GPIO1 נדלק/נכבה בקצב 1Hz (חצי שנייה ON, חצי שנייה OFF).
-
GPIO2 עושה בדיוק ההפך: כשה-GPIO1 ON אז ה-LED כבוי, וכשה-GPIO1 OFF אז ה-LED דלוק.
הערה חשובה
ב-ESP32-S3 לא בכל לוח מומלץ להשתמש ב-GPIO1/2 בלי לבדוק: לעיתים הם משמשים ל-UART/USB או פונקציות Boot בלוחות מסוימים. אם יש בעיה בצריבה/Serial, תבחר פינים אחרים (למשל 4,5,6,7 תלוי בלוח).
קוד :
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <Arduino.h> // Arduino core for ESP32-S3 const int PIN1 = 1; // GPIO1 output const int LED2 = 2; // GPIO2 output (LED here) void setup() { // Runs once pinMode(PIN1, OUTPUT); // Set GPIO1 as output pinMode(LED2, OUTPUT); // Set GPIO2 as output digitalWrite(PIN1, LOW); // Start: PIN1 OFF digitalWrite(LED2, HIGH); // Start: LED2 ON (opposite of PIN1) } void loop() { // Runs forever digitalWrite(PIN1, HIGH); // PIN1 ON digitalWrite(LED2, LOW); // LED2 OFF (inverse of PIN1) delay(500); // Wait 500 ms digitalWrite(PIN1, LOW); // PIN1 OFF digitalWrite(LED2, HIGH); // LED2 ON (inverse of PIN1) delay(500); // Wait 500 ms } |
diagram.json
|
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 45 46 47 48 49 50 51 52 |
{ "version": 1, "author": "יניב מאור", "editor": "wokwi", "parts": [ { "type": "wokwi-breadboard-half", "id": "bb2", "top": 140.1, "left": -150.3, "rotate": 90, "attrs": {} }, { "type": "wokwi-esp32-devkit-v1", "id": "esp", "top": 73.02, "left": -239.86, "attrs": {} }, { "type": "wokwi-led", "id": "led1", "top": 162, "left": 64.2, "rotate": 90, "attrs": { "color": "red" } }, { "type": "wokwi-resistor", "id": "r1", "top": 176.26, "left": -10.71, "attrs": { "value": "1000" } }, { "type": "wokwi-potentiometer", "id": "pot1", "top": -23.68, "left": -215.51, "attrs": {} }, { "type": "wokwi-servo", "id": "servo1", "top": -46.28, "left": -8.28, "attrs": {} } ], "connections": [ [ "esp:TX0", "$serialMonitor:RX", "", [] ], [ "esp:RX0", "$serialMonitor:TX", "", [] ], [ "esp:3V3", "bb2:bp.12", "red", [ "v0" ] ], [ "esp:GND.1", "bb2:bn.11", "black", [ "h0" ] ], [ "bb2:bn.7", "bb2:9b.i", "black", [ "h0" ] ], [ "esp:D2", "bb2:10t.b", "green", [ "h139.39", "v-171.04" ] ], [ "led1:A", "bb2:10t.a", "", [ "$bb" ] ], [ "led1:C", "bb2:9t.a", "", [ "$bb" ] ], [ "r1:1", "bb2:9b.g", "", [ "$bb" ] ], [ "r1:2", "bb2:9t.c", "", [ "$bb" ] ], [ "pot1:GND", "bb2:bn.1", "black", [ "v10.81", "h-41.92" ] ], [ "pot1:VCC", "bb2:bp.1", "red", [ "v17.27", "h-49.74" ] ], [ "pot1:SIG", "esp:D32", "green", [ "v47.06", "h-67.33", "v62.15" ] ], [ "bb2:bn.2", "servo1:GND", "black", [ "h35.95", "v-110.68" ] ], [ "bb2:bp.4", "servo1:V+", "red", [ "h43.73", "v-117.49" ] ], [ "esp:D4", "servo1:PWM", "yellow", [ "h33.8", "v-153.5", "h49.31" ] ] ], "dependencies": {} } |
תרגיל כיתה 1 : פיתוח תוכנה ואלקטרוניקה בעזרת בינה מלאכותית
נתון המערכת הבאה :
קישור לסימולטור של המעגל : https://wokwi.com/projects/452940039931262977
1.נתח בעזרת בינה מלאכותית התוכנה עושה העבר את קוד התוכנה לבינה מלכותית
2.בקש הסבר על כל שורת קוד – ומה התוכנה עושה
3.נתח דרך הבינה מלאכותית באיזה ערכים הלד נידלק ואיזה ערכים הלד נכבה
4. העתק לבינה מלאכותית את הסמכה האלקטרונית של המעגל הבאה
|
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 45 46 47 48 49 50 51 52 |
{ "version": 1, "author": "יניב מאור", "editor": "wokwi", "parts": [ { "type": "wokwi-breadboard-half", "id": "bb2", "top": 140.1, "left": -150.3, "rotate": 90, "attrs": {} }, { "type": "wokwi-esp32-devkit-v1", "id": "esp", "top": 73.02, "left": -239.86, "attrs": {} }, { "type": "wokwi-led", "id": "led1", "top": 162, "left": 64.2, "rotate": 90, "attrs": { "color": "red" } }, { "type": "wokwi-resistor", "id": "r1", "top": 176.26, "left": -10.71, "attrs": { "value": "1000" } }, { "type": "wokwi-potentiometer", "id": "pot1", "top": -23.68, "left": -215.51, "attrs": {} }, { "type": "wokwi-servo", "id": "servo1", "top": -46.28, "left": -8.28, "attrs": {} } ], "connections": [ [ "esp:TX0", "$serialMonitor:RX", "", [] ], [ "esp:RX0", "$serialMonitor:TX", "", [] ], [ "esp:3V3", "bb2:bp.12", "red", [ "v0" ] ], [ "esp:GND.1", "bb2:bn.11", "black", [ "h0" ] ], [ "bb2:bn.7", "bb2:9b.i", "black", [ "h0" ] ], [ "esp:D2", "bb2:10t.b", "green", [ "h139.39", "v-171.04" ] ], [ "led1:A", "bb2:10t.a", "", [ "$bb" ] ], [ "led1:C", "bb2:9t.a", "", [ "$bb" ] ], [ "r1:1", "bb2:9b.g", "", [ "$bb" ] ], [ "r1:2", "bb2:9t.c", "", [ "$bb" ] ], [ "pot1:GND", "bb2:bn.1", "black", [ "v10.81", "h-41.92" ] ], [ "pot1:VCC", "bb2:bp.1", "red", [ "v17.27", "h-49.74" ] ], [ "pot1:SIG", "esp:D32", "green", [ "v47.06", "h-67.33", "v62.15" ] ], [ "bb2:bn.2", "servo1:GND", "black", [ "h35.95", "v-110.68" ] ], [ "bb2:bp.4", "servo1:V+", "red", [ "h43.73", "v-117.49" ] ], [ "esp:D4", "servo1:PWM", "yellow", [ "h33.8", "v-153.5", "h49.31" ] ] ], "dependencies": {} } |
4.1 מה תפקיד הנגד שמחובר לד .
חלק ב: יצירת מעגל בעזרת בינה מלאכותית
בינה מלאכותית יצירת מערכת שלמה