Arduino، نظرة لما أسفل الكبوت
السلام عليكم ورحمة الله وبركاته،
الكثير منا يستخدم الأردوينو سواء للتعلم، أو للنمذجة السريعة، أو حتى لمشاريع كاملة.
وذلك للسهولة والبساطة التي يقدمها دون الدخول في كثير من التعقيدات المتكررة مثل اعداد الـ Drivers أو تهيئة الـ Clock أو غيرها من المهام الأساسية للمتحكمات.
لكن مثلما كثير من يقود السيارة ويستخدمها دون معرفة مكوناتها ووظائف كل منها فغالب من يستخدم الأردوينو يفتقر لفهم مكوناته التي تشكل إطاره وحدوده، وكيف قام باختصار وتسهيل الكثير من التفاصيل.
ويقال بالانجليزية Under The hood، أو ما أسفل كبوت السيارة للتحدث عن التفاصيل الداخلية، وفي هذه المقالة سنتحدث -ان شاء الله- عن بعض التفاصيل التي قد تغيب عن أذهان الكثير.
الأردوينو، نظرة عامة
تكمن قوة الأردوينو في إخفاء التفاصيل التي لاتحتاج اليها في أغلب المشاريع التعليمية او البسيطة مثل مشاريع الـ PoC او غيرها، بالأضافة الى التبني الواسع جدا للأردوينو، سواء من حيث الهواة ومشاريعهم ومشاركاتهم ومراجعهم، او من حيث الشركات المصنعة بتوفير مكتبات جاهزة ودعم لمنتجاتهم حتى تعمل ضمن اطار الأردوينو.
وذكرت كلمة اطار الأردوينو لأن الأردوينو هو في الواقع عبارة عن طبقات متعددة من التسهيل واختصار التفاصيل، وهي تفاصيل غالبا ماتحتاج ان تخوض بها في عالم الـ Embedded Systems.
فتجد ضمن هذا الاطار برامج التطوير المبسطة، والكثير من المكتبات مفتوحة المصدر والتي تطلب منك كتابة سطر او اثنين فقط لاستخدامها، وكذلك ألواح مجهزة وموحدة ومصممة لتبدأ بتعلمها والعمل بها بسرعة دون قراءة صفحات وصفحات من مرجع الشركة المصنعة، وتصل الى تبسيط طريقة تحميل البرامج الى هذه اللوحة، والتي غالبا ماتتطلب قطع متخصصة حتى ترى مشروعك الذي طورته يعمل على قطعة هاردوير أمامك.
الأردوينو، نظرة على البرمجيات (SW)
عند فتح أي مشروع أردوينو جديد، تواجهك هذه الاسطر القليلة:
void setup() {
// put your setup code here, to run once:
}
void loop() {
// put your main code here, to run repeatedly:
}
كود 1، أبسط مشروع أردوينو
وهذه الأسطر القليلة ماهي الا طريقة أردوينوية لتبسيط دالة الـ main() المعتادة والتي تجدها في أي Microcontroller.
ولو بحثنا عن دالة الـ main والتي يتم تنفيذها فعليا بعد كل Reset للأردوينو (حتى قبل دالتي setup() و loop()) لوجدنا الاسطر التالية:
/*
* \brief Main entry point of Arduino application
*/
int main( void )
{
// Initialize watchdog
watchdogSetup();
init();
initVariant();
delay(1);
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
for (;;)
{
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}
كود2، دالة الـ main والتي تعمل وراء الكواليس. (بناء على لوحة الأردوينو المختارة، وقد يختلف الكود اللذي تجده عن هذا قليلا، مأخوذ من الملف المتواجد غالبا بالمسار: C:\Program Files (x86)\Arduino\hardware\arduino\avr\cores\arduino)
وفيها نلاحظ أن الدالة تقوم بسلسلة من الاستدعاءات والعمليات لتهيئة الـ Microcontroller و الـ Peripherals بداخله مثل تهيئة مؤقت الـ watchdog، وكذلك اعداد المنافذ ثم تهيئة منفذ الـ serial حتى يكون جاهزا للاستخدام.
وبعد هذه العملية، يتم استدعاء الأكواد التي كتبها المستخدم عبر استدعاء دالتي الـ setup() والـ loop() كما كتب بالسطرين 19 و 23.
ولا يتوقف دور الأدوينو عند هذا الحد من التبسيط! لكن دعنا نتعرف أولا على مكونات برمجيات الأردوينو.
مكونات برمجيات الأردوينو
رسم 1، معمارية برمجيات الأردوينو
هناك مفهوم مهم في علم الحاسب، وهو التجريد (Abstraction)، وبيئة الأردوينو قائمة على هذا حالها حال كثير من المشاريع البرمجية.
فلو لاحظت، ستجد أن نقطة الالتقاء الرئيسية بين الأكواد التي تكتبها وبين بيئة الأردوينو البرمجية تكمن فيما تكتبه بداخل الدالتين: setup() والدالة loop()، بالاضافة الى ماتستدعيه من مكتبات الأردوينو.
ولو عدنا الى رسم 1، لوجدنا أن هناك -بالمجمل- ثلاث أنواع من البرمجيات في اطار الأردوينو، أولها وهو برنامجك الذي كتبته على الأردوينو، ثم مكتبات برمجية عمومية (لاتعتمد مباشرة على الهاردوير مثل مكتبة SD)، وفي الأخير مكتبات وبرمجيات تتعامل مع الهاردوير مباشرة سواء بإعداده او بقراءة بيانات او كتابتها به.
وغالبا ماتكون مكتبات الأردوينو مشتركة بين مختلف لوحات الأردوينو، بينما الجزء (المفصل) على لوحة أردوينو محددة فهو الـ Arduino Core مع بعض المكتبات الأخرى مثل مكتبة SPI، وهنا يأتي دور الـ Arduino IDE (التطبيق الذي تستخدمه لتطوير مشاريعك على الأردوينو) في بناء برنامجك وربطه مع الـ Arduino Core المناسب.
رسم 2، مجموعة متنوعة من ألواح الأدروينو بـ Microcontrollers ومعماريات مختلفة
وأحد أهم مميزات Arduino IDE هي وجود نظام لإدارة الألواح المدعومة مثل Arduino Uno و Arduino Mega 2560 و Arduino Due وغيرها الكثير، والذي تستطيع عن طريقه تنزيل ملفات دعم ألواح جديدة، وكذلك تستطيع تحديد اللوحة المستهدفة بهذا المشروع.
رسم 3، اختيار اللوحة المستهدفة بالمشروع
وعند تغيير اللوحة المستهدفة يقوم الـ Arduino IDE بتولي المهام التالية:
- تحديد مكتبة الـ Arduino Core وباقي المكتبات الأخرى المناسبة للمشروع، بناء على اللوحة المحددة
- تحديث قائمة الأمثلة المدعومة
- تغيير الـ Toolchain لتتناسب عملية الـ Building مع معالج اللوحة المحددة
- تغيير آلية تنزيل البرنامج للوحة
لكن، التجريد على مستوى البرمجيات -وخصوصا الطبقات الأقرب للهاردوير مثل الـ Arduino Core- يتطلب نوعا من توحيد طبقات الهاردوير، بحيث تكون هناك مساحة تشابه بين مختلف ألواح الأردوينو.
الأردوينو، نظرة على الهاردوير (HW)
جميع ألواح الأردوينو تشترك في تواجد ثلاث عناصر أساسية بكل لوحة: الـ Microcontroller، ودوائر البرمجة، ثم دوائر الطاقة.
الأجزاء الأساسية لألواح الأردوينو
الـ Microcontroller
الـ Microcontroller، أو MCU اختصارا (يختصر أيضا بـ µC أحيانا)، أو المتحكمة تعريبا، هي دماغ لوحة الأردوينو، وهي الجزء المسؤول عن تنفيذ برنامجك الذي قمت بتطويره.
وهي IC (دائرة متكاملة) يحتوي على معالج وذاكرة دائمة لحفظ برنامجك مع RAM، مع بعض الـPeripherals الأخرى مثل الـ GPIOs، والـ UART وغيرها الكثير.
لكن قد يسأل سائل، كيف (تفصيلا) ينتقل البرنامج الذي قمت بتطويره على الحاسوب الى الـ MCU؟
دوائر البرمجة
هي جواب السؤال:
كيف (تفصيلا) ينتقل البرنامج الذي قمت بتطويره على الحاسوب الى الـ MCU؟
فهي المختصة باستقبال برنامجك من الحاسوب عبر الـ USB ثم تسليمه الى الـ MCU، ولها طرق مختلفة حسب لوحة الأردوينو المستخدمة.
VCP (Virtual COM Port)
هذه هي الطريقة الأشهر في لوحات الأردوينو، ونحديدا اللوحات الأصلية مثل Uno، و Mega2560 وغيرها.
أحد أسباب انتشارها أنها الأسهل تعاملا وذات تكلفة منخفضة، لكن قدراتها تنحصر غالبا في تنزيل البرنامج فقط مع بعض مميزات التواصل الأخرى.
وتعمل عن طريق وجود برنامج محمل مسبقا على الـ MCU اسمه الـ Bootloader، وهو بدوره يقوم بتحميل برامجك من الحاسب وتشغيلها.
رسم 4، مكونات دوائر الـ VCP
Debugging Interface (JTAG/SWD)
تُستخدم هذه الطريقة في بعض الألواح المتوافقة مع الأردوينو مثل ألواح Nucleo board من شركة STMicroelectronics.
وتتميز هذه بتمكين مميزات Debugging اضافية (بشرط استخدام IDE تدعم هذه المميزات) عوضا عن ميزات تنزيل البرامج فقط مثل حالة الألواح المعتمدة على طريقة VCP.
طرق برمجة أخرى
وهناك طرق أخرى غيرها وتعتمد بشكل مباشر على الـ MCU المستخدم.
وقد يحصل أن تجد أكثر من طريقة على نفس اللوحة مثل اللذي تجده في لوحات الـ Arduino DUE.
دوائر الطاقة
يعتمد اختيار الـ Voltage الخارج من دائرة الطاقة بشكل أساسي على مكونات لوحة الأردوينو، وتحديدا الـ MCU.
فبعض الـ MCUs تعمل على فرق جهد 5V، بينما البعض الآخر على 3.3V.
أما مصدر الطاقة الداخل على لوحة الأردوينو فغالبا مايكون عن طريق منفذ الـ USB، وأحيانا تكون هناك خيارات أخرى مثل منفذ مخصص للطاقة، أو عن طريق تجاوز دائرة الطاقة بالكامل وتشغيل اللوحة من مصدر طاقة خارجي.
مقارنة بين بعض ألواح الأردوينو
اسم اللوحة | الـ MCU | دوائر البرمجة | دوائر الطاقة |
---|---|---|---|
Arduino Uno | ATmega328 | VCP ICSP | 5V |
Arduino Mega 2560 | ATmega2560 | VCP ICSP | 5V |
Arduino DUE | AT91SAM3X8E | VCP USB JTAG/SWD | 3.3V |
NUCLEO-F030R8 | STM32F030R8T6 | JTAG/SWD | 3.3V |
0 تعليق