المتحكمات الدقيقة (Microcontrollers): الفرق بين Arduino و ESP32 و Raspberry Pi
أهلاً بكم أيها المبرمجون! اليوم سنتعمق في عالم المتحكمات الدقيقة والمعالجات الدقيقة، وسنكتشف الفروقات الجوهرية بين Arduino، ESP32، و Raspberry Pi.
سنتعلم متى نختار كل منصة، ونكتب أكواداً عملية لكل منها لفهم قدراتها بشكل أفضل.
1. مدخل إلى المتحكمات والمعالجات الدقيقة
قبل الغوص في التفاصيل، دعونا نفهم الفرق الأساسي بين المتحكم الدقيق (Microcontroller) والمعالج الدقيق (Microprocessor):
المتحكم الدقيق (Microcontroller): هو حاسوب صغير مكتمل على شريحة واحدة (System-on-Chip - SoC)، يضم وحدة معالجة مركزية (CPU)، ذاكرة (RAM, ROM, Flash)، ومنافذ إدخال/إخراج (GPIO) مدمجة. مصمم لتنفيذ مهام محددة ومتكررة بكفاءة عالية واستهلاك طاقة منخفض.
المعالج الدقيق (Microprocessor): هو وحدة المعالجة المركزية (CPU) فقط. يحتاج إلى مكونات خارجية مثل الذاكرة ومنافذ الإدخال/الإخراج ليعمل كنظام كامل. يتواجد غالباً في أجهزة الكمبيوتر والهواتف الذكية.
الآن، لننتقل إلى منصاتنا الثلاث.
2. Arduino: البساطة والبدء السريع
Arduino هي منصة مفتوحة المصدر تتميز بسهولة الاستخدام والبرمجة، مما يجعلها مثالية للمبتدئين وللمشاريع التي لا تتطلب قوة معالجة كبيرة أو اتصالاً بالإنترنت.
- المميزات: سهولة التعلم، بيئة تطوير متكاملة (IDE) بسيطة، مجتمع ضخم، تكلفة منخفضة، استهلاك طاقة قليل.
- الاستخدامات: مشاريع الروبوتات البسيطة، أتمتة المنزل (إضاءة، مستشعرات)، أنظمة التحكم الصناعي الأساسية، الأجهزة القابلة للارتداء.
مثال عملي: وميض مصباح LED باستخدام Arduino Uno
هذا المشروع الكلاسيكي يوضح كيفية التحكم في منفذ إخراج رقمي.
الخطوة 2.1: إعداد المنفذ
في دالة setup()، نحدد المنفذ الذي سنتعامل معه (في هذه الحالة، المنفذ الرقمي 13 المتصل بـ LED المدمج) كمنفذ إخراج.
void setup() {
pinMode(13, OUTPUT); // تحديد المنفذ 13 كمنفذ إخراج
}
الخطوة 2.2: تشغيل وإطفاء المصباح
في دالة loop()، نستخدم digitalWrite() لتشغيل وإطفاء المصباح مع تأخير زمني.
void loop() {
digitalWrite(13, HIGH); // تشغيل المصباح (جهد عالي)
delay(1000); // انتظار لمدة ثانية واحدة (1000 ميلي ثانية)
digitalWrite(13, LOW); // إطفاء المصباح (جهد منخفض)
delay(1000); // انتظار لمدة ثانية واحدة
}
3. ESP32: الاتصال بالإنترنت والقوة المعالجية
ESP32 هو متحكم دقيق قوي من إنتاج شركة Espressif Systems، يجمع بين قوة المعالجة، الاتصال اللاسلكي (Wi-Fi و Bluetooth) المدمج، واستهلاك الطاقة المنخفض. إنه الخيار الأمثل لمشاريع إنترنت الأشياء (IoT).
- المميزات: Wi-Fi و Bluetooth مدمجين، معالج ثنائي النواة، ذاكرة أكبر، دعم MicroPython، تكلفة معقولة، استهلاك طاقة منخفض.
- الاستخدامات: أجهزة IoT المتصلة بالإنترنت، أنظمة المنزل الذكي المتقدمة، مشاريع الشبكات، الخوادم المصغرة، تطبيقات الصوت والفيديو الأساسية.
مثال عملي: الاتصال بشبكة Wi-Fi باستخدام ESP32
هذا الكود يوضح كيفية توصيل ESP32 بشبكة Wi-Fi محلية.
الخطوة 3.1: تضمين مكتبة Wi-Fi وتحديد بيانات الشبكة
نبدأ بتضمين مكتبة Wi-Fi وتحديد اسم الشبكة وكلمة المرور.
#include <WiFi.h> // تضمين مكتبة Wi-Fi للتحكم في الاتصال اللاسلكي
const char* ssid = "YOUR_SSID"; // اسم شبكة Wi-Fi الخاصة بك
const char* password = "YOUR_PASSWORD"; // كلمة مرور شبكة Wi-Fi الخاصة بك
الخطوة 3.2: إعداد الاتصال
في دالة setup()، نبدأ الاتصال التسلسلي ونحاول الاتصال بشبكة Wi-Fi، مع طباعة حالة الاتصال.
void setup() {
Serial.begin(115200); // بدء الاتصال التسلسلي لمراقبة المخرجات
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // بدء الاتصال بشبكة Wi-Fi
while (WiFi.status() != WL_CONNECTED) { // الانتظار حتى يتم الاتصال بالشبكة
delay(500);
Serial.print(".");
}
Serial.println("");
Serial.println("WiFi connected");
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // طباعة عنوان IP الذي حصل عليه ESP32
}
الخطوة 3.3: دالة loop
في هذا المثال، لا نحتاج إلى تنفيذ أي شيء مستمر في loop() بعد الاتصال بالشبكة.
void loop() {
// لا يوجد كود هنا، الاتصال يتم مرة واحدة في setup()
}
4. Raspberry Pi: حاسوب مصغر متعدد الأغراض
Raspberry Pi هو في الأساس حاسوب أحادي اللوحة (Single Board Computer - SBC) وليس متحكماً دقيقاً. يعمل بنظام تشغيل كامل (مثل Linux) ويحتوي على معالج أقوى بكثير، ذاكرة وصول عشوائي (RAM) أكبر، ومنافذ متنوعة (USB, HDMI, Ethernet). إنه مثالي للمشاريع التي تتطلب قوة معالجة معقدة، واجهة مستخدم رسومية، أو تشغيل تطبيقات متعددة.
- المميزات: نظام تشغيل كامل (Linux)، معالج قوي، ذاكرة وصول عشوائي كبيرة، منافذ متعددة (USB, HDMI, Ethernet)، دعم لغات برمجة متعددة (Python, C++, Java)، واجهة رسومية.
- الاستخدامات: خوادم الويب، مراكز الوسائط المتعددة، مشاريع الرؤية الحاسوبية، التعلم الآلي، الروبوتات المعقدة، محطات الألعاب القديمة، الحوسبة الطرفية (Edge Computing).
مثال عملي: التحكم في مصباح LED باستخدام Raspberry Pi (Python)
سنستخدم مكتبة RPi.GPIO للتحكم في منفذ GPIO.
الخطوة 4.1: استيراد المكتبة وإعداد المنفذ
نستورد مكتبة RPi.GPIO ونضبط المنفذ (على سبيل المثال، GPIO 17) كمنفذ إخراج.
import RPi.GPIO as GPIO # استيراد مكتبة GPIO للتحكم في المنافذ
import time # استيراد مكتبة الوقت للتأخير
LED_PIN = 17 # تعريف رقم منفذ GPIO المتصل بالـ LED (وضع BCM)
GPIO.setmode(GPIO.BCM) # تحديد وضع ترقيم المنافذ إلى BCM (أرقام GPIO الفعلية)
GPIO.setup(LED_PIN, GPIO.OUT) # إعداد منفذ LED كمنفذ إخراج
الخطوة 4.2: تشغيل وإطفاء المصباح
نستخدم حلقة while True لتشغيل وإطفاء المصباح بشكل متكرر.
try:
while True:
GPIO.output(LED_PIN, GPIO.HIGH) # تشغيل المصباح
print("LED ON")
time.sleep(1) # انتظار لمدة ثانية واحدة
GPIO.output(LED_PIN, GPIO.LOW) # إطفاء المصباح
print("LED OFF")
time.sleep(1) # انتظار لمدة ثانية واحدة
except KeyboardInterrupt:
print("Program stopped by user")
finally:
GPIO.cleanup() # تنظيف إعدادات GPIO عند انتهاء البرنامج
5. مقارنة سريعة بين المنصات
| الميزة | Arduino (مثل Uno) | ESP32 | Raspberry Pi (مثل 4) |
|---|---|---|---|
| النوع | متحكم دقيق (Microcontroller) | متحكم دقيق (Microcontroller) | حاسوب أحادي اللوحة (SBC) |
| المعالج | 8-bit AVR | 32-bit Tensilica Xtensa (Dual-Core) | 64-bit ARM Cortex-A72 (Quad-Core) |
| الذاكرة (RAM) | 2KB SRAM | 520KB SRAM | 2GB/4GB/8GB LPDDR4 |
| الاتصال اللاسلكي | لا يوجد (يحتاج وحدات خارجية) | Wi-Fi, Bluetooth مدمج | Wi-Fi, Bluetooth مدمج |
| نظام التشغيل | لا يوجد (برنامج ثابت - Firmware) | لا يوجد (برنامج ثابت - Firmware) | Linux (Raspberry Pi OS) |
| سهولة الاستخدام | عالية جداً للمبتدئين | متوسطة إلى عالية | متوسطة (تحتاج معرفة Linux) |
| القوة المعالجية | منخفضة | متوسطة | عالية جداً |
| التكلفة | منخفضة | منخفضة إلى متوسطة | متوسطة إلى مرتفعة |
| الاستهلاك الطاقي | منخفض جداً | منخفض | متوسط إلى مرتفع |
الكود النهائي الكامل
Arduino (C++): وميض LED
// الكود الكامل لتشغيل وإطفاء مصباح LED على Arduino Uno
void setup() {
pinMode(13, OUTPUT); // تحديد المنفذ 13 (المتصل بالـ LED المدمج) كمنفذ إخراج
}
void loop() {
digitalWrite(13, HIGH); // تشغيل المصباح (إرسال جهد عالي)
delay(1000); // انتظار لمدة ثانية واحدة (1000 ميلي ثانية)
digitalWrite(13, LOW); // إطفاء المصباح (إرسال جهد منخفض)
delay(1000); // انتظار لمدة ثانية واحدة
}
ESP32 (C++): الاتصال بشبكة Wi-Fi
// الكود الكامل للاتصال بشبكة Wi-Fi باستخدام ESP32
#include <WiFi.h> // تضمين مكتبة Wi-Fi للتحكم في الاتصال اللاسلكي
const char* ssid = "YOUR_SSID"; // اسم شبكة Wi-Fi الخاصة بك (يجب تغييره)
const char* password = "YOUR_PASSWORD"; // كلمة مرور شبكة Wi-Fi الخاصة بك (يجب تغييرها)
void setup() {
Serial.begin(115200); // بدء الاتصال التسلسلي لمراقبة المخرجات على الشاشة التسلسلية
Serial.print("Connecting to ");
Serial.println(ssid);
WiFi.begin(ssid, password); // بدء عملية الاتصال بشبكة Wi-Fi باستخدام البيانات المحددة
while (WiFi.status() != WL_CONNECTED) { // حلقة انتظار حتى يتم الاتصال بالشبكة بنجاح
delay(500); // انتظار نصف ثانية
Serial.print("."); // طباعة نقطة للدلالة على محاولة الاتصال المستمرة
}
Serial.println(""); // سطر جديد بعد اكتمال الاتصال
Serial.println("WiFi connected"); // إشعار بأن الاتصال تم بنجاح
Serial.print("IP address: ");
Serial.println(WiFi.localIP()); // طباعة عنوان IP الذي حصل عليه ESP32 من الراوتر
}
void loop() {
// في هذا المثال، لا يوجد كود يتطلب التنفيذ المستمر بعد الاتصال بالشبكة
// يمكن إضافة أكواد أخرى هنا للتحكم في أجهزة IoT أو إرسال بيانات
}
Raspberry Pi (Python): وميض LED
# الكود الكامل لتشغيل وإطفاء مصباح LED على Raspberry Pi باستخدام Python
import RPi.GPIO as GPIO # استيراد مكتبة GPIO للتحكم في منافذ الإدخال/الإخراج
import time # استيراد مكتبة الوقت لإضافة تأخيرات زمنية
LED_PIN = 17 # تعريف رقم منفذ GPIO المتصل بالـ LED.
# نستخدم وضع BCM، لذا 17 يشير إلى GPIO17.
GPIO.setmode(GPIO.BCM) # تحديد وضع ترقيم المنافذ إلى BCM (أرقام GPIO الفعلية).
# البديل هو GPIO.BOARD الذي يستخدم أرقام الدبوس المادية.
GPIO.setup(LED_PIN, GPIO.OUT) # إعداد منفذ LED المحدد كمنفذ إخراج (OUTPUT)
print("Starting LED blink program. Press Ctrl+C to exit.")
try:
while True: # حلقة لا نهائية لتكرار عملية التشغيل والإطفاء
GPIO.output(LED_PIN, GPIO.HIGH) # تشغيل المصباح (إرسال جهد عالٍ)
print("LED ON")
time.sleep(1) # انتظار لمدة ثانية واحدة
GPIO.output(LED_PIN, GPIO.LOW) # إطفاء المصباح (إرسال جهد منخفض)
print("LED OFF")
time.sleep(1) # انتظار لمدة ثانية واحدة
except KeyboardInterrupt: # التقاط استثناء عند الضغط على Ctrl+C لإنهاء البرنامج
print("\nProgram stopped by user.")
finally:
GPIO.cleanup() # تنظيف إعدادات GPIO. هذا مهم لإعادة المنافذ إلى حالتها الافتراضية.
print("GPIO cleanup complete.")
النتيجة المتوقعة
Arduino: وميض LED
بعد رفع الكود إلى لوحة Arduino، ستلاحظ أن مصباح LED المدمج (عادةً على المنفذ 13) سيومض بشكل متكرر، يضيء لمدة ثانية ثم ينطفئ لمدة ثانية، وهكذا.
ESP32: الاتصال بشبكة Wi-Fi
بعد رفع الكود إلى لوحة ESP32 وفتح الشاشة التسلسلية (Serial Monitor) في Arduino IDE، ستشاهد رسائل تشير إلى محاولة الاتصال بالشبكة (نقاط متتالية)، ثم رسالة "WiFi connected" متبوعة بعنوان IP الذي حصلت عليه لوحة ESP32 من الراوتر. مثال:
Connecting to YOUR_SSID
.......
WiFi connected
IP address:
192.168.1.100
Raspberry Pi: وميض LED
عند تشغيل السكربت (python your_script_name.py) على Raspberry Pi، ستشاهد في الطرفية رسائل "LED ON" و "LED OFF" بالتناوب كل ثانية، بينما يومض مصباح LED المتصل بالمنفذ GPIO 17 (أو أي منفذ تحدده) بنفس النمط. عند الضغط على Ctrl+C، سيتوقف البرنامج وستظهر رسالة "Program stopped by user." ثم "GPIO cleanup complete.".