أنواع برمجة المتحكمات الدقيقة: شرح الأدوات الرسومية وC/C++ وPython وبيئات التطوير المتكاملة (IDE)

يحتوي هذا المقال على روابط تسويق بالعمولة مُعلَّمة بعلامة *. بصفتي شريكًا في برنامج Amazon Associates، أربح من عمليات الشراء المؤهلة، دون أي تكلفة إضافية عليك. يساعد ذلك على إبقاء الشروحات مجانية.

ملخص سريع

نظرة عامة على طرق برمجة المتحكم الدقيق: الأدوات القائمة على الكتل (Scratch وBlockly وmBlock)، ولغة التجميع (Assembly)، وC/C++، وMicroPython/CircuitPython وJavaScript، وبيئات التطوير المتكاملة (IDE) المستخدمة لكتابة الكود ورفعه (Arduino IDE وPlatformIO وThonny وSTM32CubeIDE). يتضمن جدول مقارنة، ودليلًا للاختيار حسب الاستخدام، ومثالًا على وميض LED بلغة C++ وMicroPython وبالكتل.

المتحكم الدقيق هو ما يدير نظام منع انغلاق المكابح (ABS) في السيارة، أو منظم الحرارة (Thermostat) المثبت على الجدار، أو روبوت الهواة. كانت أول لوحة لي Arduino Uno، وكان أول مشروع نفذته بها يتحكم في محرك تيار مستمر (DC). وطريقة برمجة هذه الشريحة تحدد مدى سرعة تعلمك ومقدار التحكم الذي تحصل عليه في العتاد. لا يوجد نوع من أنواع برمجة المتحكمات الدقيقة هو الأفضل لكل مشروع، ودليل الاختيار حسب الاستخدام أدناه يساعدك على الاختيار.

ما هي برمجة المتحكمات الدقيقة؟

المتحكم الدقيق حاسوب صغير على دارة متكاملة واحدة. فهو يضم على شريحة واحدة معالجًا (CPU) وذاكرة (RAM وFlash) وطرفيات (Peripherals، وهي وحدات عتادية مدمجة مثل المؤقتات ومحولات الإشارة التناظرية إلى رقمية والواجهات التسلسلية). ومن أمثلته الشريحة ATmega328P الموجودة على لوحة Arduino Uno R3، وESP32 المستخدم في مشاريع واي فاي (Wi-Fi) وبلوتوث، وRP2040 الموجود داخل Raspberry Pi Pico. لوحة Pico هي لوحة متحكم دقيق، أما Raspberry Pi الأكبر حجمًا فهو حاسوب يعمل بنظام Linux.

برمجة المتحكم الدقيق تعني كتابة التعليمات التي ينفذها معالج الشريحة: قراءة مستشعر، أو تشغيل محرك، أو إرسال بيانات إلى جهاز آخر. وعلى عكس برامج الحاسوب المكتبي، يعمل الكود عادةً في حلقة لا نهائية دون نظام تشغيل، والمبرمج هو المسؤول عن التوقيت واستخدام الذاكرة وكل تفاصيل العتاد.

هناك أربعة أساليب رئيسية:

  • البرمجة بالكتل (الرسومية): تبني البرنامج من كتل مرئية.
  • التجميع: تكتب التعليمات الخاصة بالمعالج نفسه.
  • اللغات المُصرَّفة (C/C++): تكتب كودًا مقروءًا يحوّله المُصرِّف (Compiler) إلى تعليمات آلة قبل الرفع.
  • اللغات المُفسَّرة (MicroPython وCircuitPython وJavaScript): يُقرأ الكود ويُنفَّذ على الشريحة أثناء تشغيل البرنامج.

أما بيئة التطوير المتكاملة (IDE، اختصار Integrated Development Environment) فهي أداة منفصلة: البرنامج الذي تستخدمه لكتابة الكود وتصريفه ورفعه بأي لغة من هذه اللغات.

البرمجة بالكتل

تستبدل البرمجة بالكتل الكودَ المكتوب بكتل تسحبها وتُفلتها. تمثل كل كتلة حلقة تكرار أو شرطًا أو متغيرًا أو أمرًا للعتاد، وتربط الكتل ببعضها لبناء البرنامج. تجعل الكتل تسلسل البرنامج مرئيًا وتمنع الأخطاء النحوية (Syntax Errors). صُممت هذه الأدوات لطلاب المدارس والمعلمين ومن لم يكتبوا كودًا من قبل، فهي تعلّم حلقات التكرار والشروط والدوال والمتغيرات دون كتابة صيغة برمجية، مما يسهّل الانتقال لاحقًا إلى C/C++ أو MicroPython. ويمكن تحويل لغة واجهة Scratch والعديد من محررات الكتل الأخرى إلى لغات أخرى، وهذا يساعد المتعلمين الذين لا يجيدون قراءة الإنجليزية.

Scratch editor with drag-and-drop blocks for a simple program

أشهر أدوات البرمجة بالكتل

  • Scratch، الذي طوّره مختبر MIT Media Lab، هو بيئة قائمة على الكتل موجهة لإنشاء الرسوم المتحركة والألعاب على الحاسوب. أما S4A (Scratch for Arduino) فهي نسخة معدّلة من Scratch: ترفع إلى Arduino برنامجًا صغيرًا (برنامجًا ثابتًا أو Firmware) مرة واحدة؛ وبعد ذلك تبقى اللوحة متصلة عبر USB ويتولى الحاسوب تشغيل كتلك.
  • Blockly، الذي أنشأته Google، هو مكتبة مفتوحة المصدر تقوم عليها محررات الكتل في كثير من المنصات التعليمية. وهو يولّد كودًا حقيقيًا بلغة JavaScript أو Python أو Lua أو لغات أخرى. وتعرض كثير من المحررات المبنية على Blockly الكود المولَّد بجانب الكتل، مما يسهّل الانتقال من الكتل إلى الكود المكتوب.
  • mBlock يتيح لك بناء برنامج للوحات Arduino من الكتل ورفعه إليها مباشرة. Tinkercad Circuits تضم وضع Code Blocks الذي يشغّل البرنامج في محاكاة داخل المتصفح ويعرض كود Arduino المقابل له.

أستخدم الكتل بنفسي في جانب الهاتف من مشاريعي، فتطبيقات Android التي ترسل أوامر بلوتوث إلى روبوتات Arduino الخاصة بي مبنية في MIT App Inventor، الذي يعتمد محرر الكتل فيه على Blockly.

القيود

مع كبر البرنامج، تجعل عشرات الكتل المتداخلة مساحة العمل صعبة القراءة. كما لا تتيح الكتل وصولًا مباشرًا إلى المسجلات (Registers، وهي خلايا ذاكرة صغيرة داخل الشريحة تُشغّل بتاتُها الطرفيات وتُطفئها وتحدد وضع عملها)، ولا إلى الذاكرة، ولا إلى التوقيت الدقيق. وينتقل معظم المتعلمين إلى C/C++ أو MicroPython بعد أن يتعلموا الأساسيات.

لغة التجميع (Assembly)

ما لغة التجميع ولماذا تمنحك تحكمًا كاملًا

لغة التجميع (Assembly) لغة منخفضة المستوى تقابل بشكل شبه مباشر تعليمات الآلة التي ينفذها المعالج. فبدلًا من الآحاد والأصفار الثنائية، تكتب رموزًا مختصرة (Mnemonics) مثل MOV وADD وJMP، ثم يحوّلها المُجمِّع (Assembler) إلى كود آلة. تقابل كل تعليمة عملية واحدة للمعالج، لذا تتحكم فيما يفعله العتاد في كل دورة ساعة (نبضة واحدة من ساعة الشريحة؛ فساعة Uno R3 بتردد 16 MHz تنبض 16 مليون مرة في الثانية).

ولأنه لا توجد طبقة تجريد (Abstraction Layer، وهي كود يخفي تفاصيل العتاد خلف أوامر أبسط) بين الكود والعتاد، تتيح لك لغة التجميع أن تقرر كيف تُستخدم كل دورة من دورات المعالج وكل بايت من الذاكرة. يمكنك ضبط كل مسجل من مسجلات المعالج على حدة، وتهيئة الطرفيات بتًا بتًا، وكتابة إجراءات توقيت دقيقة حتى دورة ساعة واحدة. وهذا مهم في حلقات معالجة الإشارات المحكمة التي تحتاج إلى توقيت حتمي (Deterministic)، أي أن يستغرق الكود العدد نفسه تمامًا من دورات الساعة في كل تشغيل. كما أنه مهم في الشرائح التي لا تملك سوى بضعة كيلوبايتات من RAM.

أين لا تزال تُستخدم ولماذا هي صعبة

لا تزال لغة التجميع تُستخدم في:

  • برامج الإقلاع (Bootloaders): البرنامج الصغير الذي يعمل بعد إعادة الضبط (Reset) ويمكنه تحميل برنامج ثابت جديد.
  • إجراءات خدمة المقاطعة (ISRs) التي يجب أن تنتهي خلال عدد ثابت من الدورات. إجراء خدمة المقاطعة (ISR) دالة يقفز إليها المعالج عند وقوع حدث في العتاد.
  • كود بدء التشغيل (Startup Code): أولى التعليمات بعد إعادة الضبط، وهي تهيّئ الذاكرة قبل أن يبدأ البرنامج الرئيسي.

كما تحتوي كثير من مشاريع C للأنظمة المدمجة على بضعة أسطر من التجميع المضمَّن (Inline Assembly، أي تعليمات تجميع مكتوبة داخل كود C) للمهام الحرجة زمنيًا. كود التجميع طويل: فمهمة تستغرق سطرًا واحدًا في Python قد تحتاج إلى عشرات الأسطر بلغة التجميع. كما أن الكود خاص بالمعمارية: فالإجراء المكتوب لشريحة AVR (Arduino Uno R3) لن يعمل على شريحة ARM (STM32) دون إعادة كتابته بالكامل. ويستغرق تصحيح الأخطاء وقتًا أطول، ويصعب قراءة كود تجميع كتبه شخص آخر. ومع ذلك، فإن قراءة القليل من كود التجميع تريك ما يحوّل إليه المُصرِّف كود C الذي تكتبه.

اللغات المُصرَّفة: C وC++

تُخفي اللغات عالية المستوى المسجلات وعناوين الذاكرة خلف متغيرات بأسماء وصفية، وحلقات تكرار، ودوال، ومكتبات. يحوّل المُصرِّف الكود إلى تعليمات آلة قبل الرفع؛ أما المفسِّر (Interpreter) فيقرؤه وينفذه على الشريحة أثناء تشغيل البرنامج. وكود C وC++ أسرع كتابةً وأسهل قراءةً من كود التجميع، ويعمل على شرائح أخرى بعد إعادة تصريفه.

Program code on a screen

تهيمن C وC++ على تطوير الأنظمة المدمجة. فكود Arduino هو C++ مضافًا إليه إطار عمل Arduino (Arduino Framework)، وهو مجموعة من الدوال مثل digitalWrite() وdelay() تُخفي إعدادات المسجلات. ولهذا تُكتب معظم شروحات Arduino بلغة C++. تتيح C وصولًا منخفض المستوى إلى العتاد عبر المؤشرات (Pointers، وهي متغيرات تحمل عنوانًا في الذاكرة) والوصول المباشر إلى المسجلات، مع احتفاظها بميزات هيكلية مثل الدوال وأنواع البيانات. وتضيف C++ الأصناف (Classes، أي البيانات والدوال التي تعمل عليها مجمّعة معًا) والقوالب (Templates، أي كود يعمل مع عدة أنواع من البيانات)، وهي تساعد على تنظيم المشاريع الأكبر. وC/C++ هي اللغة الافتراضية للأنظمة المدمجة في المنتجات التجارية، لأنها سريعة التنفيذ، وتمنح تحكمًا مباشرًا في العتاد، ولها مُصرِّفات لمجموعة واسعة من الشرائح. إذا كنت قد تابعت شرحي عن التحكم في محرك السيرفو باستخدام عصا التحكم (Joystick) وشاشة OLED ، فقد كتبت بلغة C++ من قبل.

وصلتُ إلى حدود دالة loop() البسيطة (دالة Arduino التي تتكرر إلى ما لا نهاية) في ذراعي الروبوتية OmArm One. كان خادم الويب وتحديثات السيرفو يتقاسمان loop()، وعندما كنت أسحب شريط تمرير في تطبيق الويب، كان الزمن بين تحديثَين متتاليين للسيرفو يقفز بين 4 و30 ms، فتتحرك الذراع بخطوات غير منتظمة. كان الحل مهمة منفصلة تحت FreeRTOS، وهو نظام التشغيل في الوقت الحقيقي (RTOS) المرفق بإطار عمل Arduino للوحة ESP32. ونظام RTOS نظام تشغيل صغير ينتقل بين عدة مهام وفق توقيت ثابت. والآن يشغّل FreeRTOS تحديث السيرفو كل 4 ms، بأولوية أعلى من خادم الويب.

اللغات المُفسَّرة: MicroPython وCircuitPython وJavaScript

MicroPython وCircuitPython نسختان خفيفتان من Python 3 تعملان مباشرة على متحكمات دقيقة مثل ESP32 وRP2040 وشرائح SAMD من Microchip المبنية على ARM. تكتب الأوامر في واجهة REPL (Read-Eval-Print Loop) حية متصلة باللوحة وترى النتيجة فورًا، ولا تحتاج إلى تصريف أي شيء على الحاسوب. يحوّل MicroPython على اللوحة كل سطر إلى Bytecode (كود وسيط مضغوط) وينفذه فورًا، وهذا يجعل MicroPython مناسبًا جدًا للنماذج الأولية (Prototyping). لكن MicroPython يعمل أبطأ بشكل ملحوظ من C/C++ المُصرَّفة ويحتاج إلى ذاكرة RAM أكبر، وهذا مهم في الشرائح الصغيرة.

في المتحكمات الدقيقة تُستخدم JavaScript أساسًا في أجهزة إنترنت الأشياء (IoT: Internet of Things) التي تتبادل البيانات عبر الشبكة، وهي تعمل مباشرة على لوحات Espruino. أما Johnny-Five فيعمل بطريقة مختلفة: إذ يعمل داخل Node.js (برنامج يشغّل JavaScript على الحاسوب) على حاسوب شخصي أو Raspberry Pi، ويتحكم في Arduino عبر USB من خلال Firmata (برنامج ثابت يتيح للحاسوب قراءة أطراف اللوحة وتبديل حالتها). وJavaScript لغة قائمة على الأحداث (Event-driven): يستجيب الكود لأحداث مثل ضغطة زر أو وصول رسالة عبر الشبكة بدلًا من فحصها في حلقة تكرار، وهذا يناسب الأجهزة التي تقضي معظم وقتها في الانتظار. أما Lua، وهي لغة برمجة نصية صغيرة أخرى، فتعمل على البرنامج الثابت NodeMCU للوحات ESP8266 (وهي الشريحة الأقدم التي سبقت ESP32 وتدعم واي فاي فقط) ولوحات ESP32. وكلتاهما أقل انتشارًا بكثير في المتحكمات الدقيقة من C/C++ أو MicroPython، ويكون استخدامهما منطقيًا أساسًا إذا كنت تعرف اللغة مسبقًا، كأن تعرف JavaScript من تطوير الويب.

بيئات التطوير المتكاملة (IDE): الأدوات التي تكتب فيها الكود

اللغة والمُصرِّف وبيئة التطوير المتكاملة (IDE)

كثيرًا ما يخلط المبتدئون بين ثلاثة مصطلحات:

  • ‏ لغة البرمجة (C++ وPython) تحدد صيغة كتابة الكود وقواعده.
  • ‏ المُصرِّف (Compiler) أو المفسِّر (Interpreter) يحوّل ذلك الكود إلى شيء تستطيع الشريحة تشغيله.
  • ‏ بيئة التطوير المتكاملة (IDE) هي البرنامج الذي تعمل فيه، وتجمع محرر الكود والمُصرِّف أو المفسِّر وأدوات الرفع والشاشة التسلسلية (Serial Monitor، وهي نافذة تعرض النص الذي ترسله اللوحة عبر USB). وتضم كثير من بيئات التطوير أيضًا مصحِّح أخطاء (Debugger)، وهو أداة توقف البرنامج أثناء تشغيله لتتمكن من فحص المتغيرات.

يمكنك استخدام اللغة نفسها في بيئات تطوير مختلفة، وكثير من بيئات التطوير يدعم أكثر من لغة.

Arduino IDE editor with C++ code open

Arduino IDE

Arduino IDE هي بيئة التطوير الرسمية من Arduino، ويُسمى برنامج Arduino باسم Sketch. تدعم هذه البيئة لغتي C وC++، وترفع الكود بنقرة واحدة، وتتضمن شاشة تسلسلية، وتثبّت المكتبات عبر مدير المكتبات المدمج (Library Manager). وأضاف الإصدار 2.x الإكمال التلقائي ومصحِّح أخطاء. لا يعمل مصحِّح الأخطاء إلا مع اللوحات التي تدعم التصحيح عبر العتاد، مثل Arduino Zero؛ أما Uno R3 فلا تدعمه. تستخدم كثير من شروحاتي، ومنها مثلًا شرح جهاز التحكم عن بُعد بالأشعة تحت الحمراء (IR) مع LED وباب يعمل بالسيرفو، بيئة Arduino IDE. ولتنفيذ أول مشروع Arduino متكامل، اطّلع على شرحي عن روبوت تتبع الخط للمبتدئين.

PlatformIO

PlatformIO إضافة مفتوحة المصدر لـ Visual Studio Code، محرر الكود المجاني من Microsoft. تدعم مئات اللوحات (Arduino وESP32 وSTM32 وغيرها)، وتضيف اختبار الوحدات (Unit Testing، وهي برامج اختبار صغيرة تفحص كل دالة على حدة تلقائيًا) والتحليل الساكن للكود (Static Code Analysis، وهو أداة تفحص الكود بحثًا عن الأخطاء دون تشغيله). كما تثبّت المكتبات وسلسلة الأدوات (Toolchain، أي المُصرِّف وأدوات الرفع الخاصة بلوحتك) تلقائيًا. تفيد PlatformIO عندما يضم المشروع عدة ملفات مصدرية، أو يحتاج إلى إصدارات ثابتة من المكتبات (الإصدار نفسه على كل حاسوب)، أو يستهدف أكثر من لوحة، وتواصل فيها كتابة كود C/C++ نفسه.

Thonny

Thonny بيئة تطوير صغيرة للغة Python تدعم MicroPython بشكل مدمج. فهي تكتشف اللوحة الموصولة، وتفتح واجهة REPL، وترفع السكربتات، وتدير الملفات الموجودة على اللوحة. وفي مشاريع ESP32 أو Raspberry Pi Pico بلغة MicroPython، تكون عادةً أسرع طريقة للبدء.

بيئات التطوير الاحترافية

في التطوير التجاري للأنظمة المدمجة، كثيرًا ما يستخدم المهندسون بيئة التطوير الخاصة بالشركة المصنّعة للشريحة: STM32CubeIDE (لشرائح STM32)، أو MPLAB X (لشرائح Microchip PIC وdsPIC)، أو Keil MDK (لشرائح ARM Cortex-M). وتوفر هذه البيئات نقاط توقف عتادية (Hardware Breakpoints، إذ تتوقف الشريحة عند سطر كود تختاره)، وعرضًا حيًا للمتغيرات، وعرضًا لمسجلات الطرفيات، وتصحيحًا للأخطاء يراعي نظام RTOS فيعرض كل مهمة من مهامه وحالتها. أما في مشاريع الهواة، فتكفي Arduino IDE أو PlatformIO.

مقارنة بين أنواع برمجة المتحكمات الدقيقة

الأسلوبالصعوبةالتحكم في العتادسرعة التنفيذاستهلاك RAMسهولة القراءةالأنسب لـالمنصات المعتادة
البرمجة بالكتل (Scratch وBlockly وmBlock)سهل جدًامحدودحسب الأداةحسب الأداةعالية للبرامج الصغيرةالتعليم، البرامج الأولىArduino (عبر S4A وBlockly)، micro:bit
لغة التجميع (Assembly)صعب جدًاأقصى حدالأسرعالأدنىمنخفضةالإجراءات الحرجة زمنيًا، برامج الإقلاع (Bootloaders)AVR، PIC، ARM (خاص بالمعمارية)
C / C للأنظمة المدمجة (Embedded C)متوسطةمرتفعسريع جدًامنخفضةمتوسطةالبرامج الثابتة للمنتجات التجارية، مشاريع ArduinoArduino, ESP32, STM32, PIC
C++متوسط إلى صعبمرتفعسريع جدًامنخفضةمتوسطةالمشاريع الأكبر، التصميم القائم على الأصناف (Classes)Arduino, ESP32, STM32
MicroPython / CircuitPythonسهلمتوسطةأبطأ (لغة مُفسَّرة)مرتفعمرتفع جدًاالنماذج الأولية، التعليم، إنترنت الأشياء (IoT)لوحات ESP32 وRP2040 وSAMD
JavaScript (Espruino)سهل إلى متوسطمتوسطةأبطأمرتفعمرتفعإنترنت الأشياء (IoT)، الأجهزة المتصلة بالويبلوحات Espruino وESP8266

المقياس: الصعوبة من سهل جدًا إلى صعب جدًا؛ والتحكم في العتاد من محدود إلى أقصى حد؛ والسرعة من أبطأ إلى الأسرع؛ واستهلاك RAM من الأدنى إلى مرتفع.

أي أسلوب يناسب أي مشروع

  • المبتدئون من الصفر: لوحة Arduino Uno R3، وبيئة Arduino IDE، وبرنامج Blink بلغة C++ (البرنامج الأول المعتاد الذي يجعل LED يومض). وتُعد أدوات الكتل مثل Scratch أو mBlock بديلًا للأطفال وللصفوف الدراسية التي لم ترَ كودًا من قبل.
  • الروبوتات: C/C++ في Arduino IDE أو PlatformIO. يحتاج التحكم في محركات السيرفو والمحركات الأخرى إلى توقيت ثابت، ويحتاج دمج المستشعرات إلى حسابات سريعة. ودمج المستشعرات (Sensor Fusion) يعني الجمع بين قراءات عدة مستشعرات، مثل مقياس التسارع والجيروسكوب في وحدة القياس بالقصور الذاتي (IMU: Inertial Measurement Unit). وكود C/C++ المُصرَّف على المتحكم الدقيق يتعامل مع الأمرين معًا. في أذرعي الروبوتية OmArm، يتولى برنامج ثابت مكتوب بلغة C++ على ESP32 تحريك محركات السيرفو. أما على الحاسوب، فيتولى ROS 2 (Robot Operating System 2، وهو مجموعة من المكتبات والأدوات لبرمجيات الروبوتات) تخطيط الحركة، وكودي فيه مكتوب بلغتي Python وC++. ولمشروع يجمع بين محركات التيار المستمر ومحركات السيرفو والبلوتوث، اطّلع على مشروعي الذراع الروبوتية المتنقلة OmObiArm.
  • الأنظمة المدمجة ذات الأداء الحرج: توفر لغة C للأنظمة المدمجة أو C++ مع بيئة التطوير والمُصرِّف من الشركة المصنّعة للشريحة (STM32CubeIDE وMPLAB X وKeil MDK) تحكمًا دقيقًا في الذاكرة والتوقيت، وتضيف إمكانية التصحيح عبر العتاد. ولا تضف التجميع المضمَّن (Inline Assembly) إلا حيث يجب أن يكون الإجراء دقيقًا على مستوى الدورة الواحدة.
  • النماذج الأولية السريعة وإنترنت الأشياء: MicroPython على ESP32 أو Raspberry Pi Pico. تكتب كودًا مقروءًا، وتختبره في REPL، وتعدّله في ثوانٍ.

أمثلة عملية

كل مثال يجعل LED يومض، لتتمكن من مقارنة الصيغة مباشرة.

Arduino (C/C++): وميض LED

// Arduino C/C++ -- Blink the built-in LED
void setup() {
  pinMode(LED_BUILTIN, OUTPUT);  // Set LED pin as output
}

void loop() {
  digitalWrite(LED_BUILTIN, HIGH);  // Turn LED on
  delay(1000);                      // Wait one second
  digitalWrite(LED_BUILTIN, LOW);   // Turn LED off
  delay(1000);                      // Wait one second
}

LED_BUILTIN ثابت معرَّف مسبقًا يشير إلى LED المدمج في اللوحة (الطرف 13 في Uno)، والدالة delay() تأخذ القيمة بالمللي ثانية، لذا فإن delay(1000) تنتظر ثانية واحدة. تعمل setup() مرة واحدة بعد التشغيل أو إعادة الضبط، ثم تتكرر loop() إلى ما لا نهاية. ويتولى إطار عمل Arduino تهيئة العتاد نيابة عنك.

ESP32 مع MicroPython: وميض LED

# MicroPython on ESP32 -- Blink an LED on GPIO 2
from machine import Pin
from time import sleep

led = Pin(2, Pin.OUT)

while True:
    led.value(1)   # Turn LED on
    sleep(1)        # Wait one second
    led.value(0)   # Turn LED off
    sleep(1)        # Wait one second

لا يحتوي MicroPython على الزوج setup()/loop(): فالكود في أعلى الملف يعمل مرة واحدة، وحلقة while True تتكرر إلى ما لا نهاية. تتحكم الوحدة machine في أطراف GPIO (أطراف الإدخال/الإخراج للأغراض العامة). تأخذ الدالة sleep() القيمة بالثواني، بينما تأخذ delay() في Arduino القيمة بالمللي ثانية. يقود GPIO 2 مصباح LED المدمج في كثير من لوحات ESP32 DevKit؛ تحقق من مخطط أطراف لوحتك (Pinout). ويمكنك أيضًا كتابة هذه الأسطر واحدًا تلو الآخر في واجهة REPL في Thonny ومشاهدة أثر كل أمر.

البرنامج نفسه بالكتل

في محرر الكتل، يتكون برنامج الوميض من كتلة “forever” (إلى الأبد) تحتوي على أربع كتل: اضبط الطرف 13 على HIGH، انتظر 1 ثانية، اضبط الطرف 13 على LOW، انتظر 1 ثانية. تحوّل أدوات مثل mBlock هذه الكتل إلى كود C/C++ وترفعه. أما S4A فيعمل بطريقة مختلفة: إذ يشغّل الحاسوب الكتل ويرسل الأوامر إلى اللوحة الموصولة عبر USB.

الأسئلة الشائعة

هل Arduino لغة برمجة؟

لا. كود Arduino هو C++ مضافًا إليه إطار عمل Arduino، وهو مجموعة من الدوال والمكتبات للمهام الشائعة مثل قراءة الأطراف وإرسال البيانات التسلسلية. ويبني مُصرِّف C++ قياسي كل برامج Arduino (Sketches).

ما الفرق بين MicroPython وCircuitPython؟

MicroPython هو التنفيذ الأصلي للغة Python 3 على المتحكمات الدقيقة، وقد بدأه Damien George. أما CircuitPython فهو تفرّع (Fork) من MicroPython أنشأته Adafruit (أي مشروع مستقل مبني على كود MicroPython) للوحات Adafruit وللمبتدئين. واللغة تكاد تكون واحدة. وأوضح فرق بينهما أن لوحة CircuitPython تظهر كمحرك أقراص USB، وحفظ الملف code.py عليها يشغّل البرنامج فورًا. أما مع MicroPython، فتنسخ الملفات عادةً بأداة مثل Thonny.

ما المتحكم الدقيق الذي يجب أن أشتريه لأبدأ التعلم؟

Arduino Uno R3، لبساطتها ولأن معظم شروحات Arduino مكتوبة لها. وإذا أردت واي فاي وبلوتوث من البداية، فإن ESP32 بديل بسعر معقول. أما لـ MicroPython، فإن Raspberry Pi Pico خيار منخفض التكلفة.

من أين تبدأ

إذا كنت جديدًا في هذا المجال، فابدأ بلوحة Arduino Uno كما فعلت أنا. ثبّت Arduino IDE وارفع برنامج Blink؛ ويعرض دليلي أساسيات برمجة Arduino كلتا الخطوتين. وإذا فشل الرفع، فتحقق من الطرفين 0 و1: ففي Uno R3 يتشاركان الخط التسلسلي مع وصلة USB. وعندما كانت وحدة البلوتوث HC-05 الخاصة بي موصولة بهما، أظهرت Arduino IDE خطأ في الرفع. افصل أي وحدة من هذا النوع أثناء الرفع.

بعد أن يعمل Blink، أضف المشغِّلات (Actuators، وهي أجزاء تحرّك شيئًا ما، مثل المحركات ومحركات السيرفو) والتحكم اللاسلكي. يحرّك مشروعي ذراع روبوتية بست درجات حرية (6-DOF) بتحكم عبر البلوتوث ستة محركات سيرفو من تطبيق على الهاتف عبر وحدة HC-05 (تعني 6-DOF ست درجات حرية، أي ستة مفاصل يتحرك كل منها باستقلالية). بعد ذلك، جرّب MicroPython على ESP32 للنماذج الأولية السريعة، أو انتقل إلى PlatformIO عندما تكبر مشاريعك.

أضف تعليق