الفرق بين المراجعتين لصفحة: «Arduino/Topics»
جميل-بيلوني (نقاش | مساهمات) إضافة شرح لنوع البيانات. |
جميل-بيلوني (نقاش | مساهمات) طلا ملخص تعديل |
||
(6 مراجعات متوسطة بواسطة نفس المستخدم غير معروضة) | |||
سطر 1: | سطر 1: | ||
==بنية لغة Arduino | ==بنية لغة أردوينو== | ||
== | تخضع الشيفرة في لغة أردوينو إلى بعض التعديلات البسيطة ثم تمرَّر إلى مفسِّر ++C/C. يمكن استعمال جميع البنى والتعابير القياسية في لغة C أو ++C التي يدعمها المفسِّر في أردوينو. لن تجد في شيفرة أردوينو الدالة <code>main()[[Arduino/loop|]]</code> المعتادة ولكن ستجد عوضًا عنها دالتين رئيسين هما: الدالة [[Arduino/setup|<code>setup()</code>]] والدالة [[Arduino/loop|<code>loop()</code>]] اللتان تفسران وتوصلان بالدالة الرئيسية<code>main()</code> لإنشاء البرنامج التنفيذي التكراري ([[wikipedia:Cyclic_executive|cyclic executive program]]) عبر استعمال [[wikipedia:GNU_toolchain|سلسلة أدوات GNU]]. يُستعمَل البرنامج avrdude المضمن ضمن [[Arduino/arduinoide|أردوينو IDE]] لتحويل الشيفرة التنفيذية إلى ملف نصي مرمز بالترميز الست عشري والذي يحمَّل إلى لوحة أردوينو. انظر إلى الشيفرة التالية التي تمثِّل بنية لغة أردوينو:<syntaxhighlight lang="arduino"> | ||
#define LED_PIN 13 // تسمية الرجل 13 المتصلة بضوء ليد | |||
void setup() { | |||
pinMode(LED_PIN, OUTPUT); // ضبط الرجل 13 لتصبح رجل خرج | |||
} | |||
void loop() { | |||
digitalWrite(LED_PIN, HIGH); // تشغيل ضوء الليد | |||
delay(1000); // الانتظاء لمدة ثانية واحدة | |||
digitalWrite(LED_PIN, LOW); // إطفاء ضوء الليد | |||
delay(1000); // الانتظار لمدة ثانية واحدة | |||
} | |||
</syntaxhighlight>ستستدعى الدالة [[Arduino/setup|<code>setup()</code>]] متى ما شُغلَت لوحة أروينو أو أعيد ضبطها بالضغط على الزر reset؛ تُستعمَل لتعريف المتغيرات وضبط أوضاع الأرجل وتهئية المكتبات المراد استعمالها في الشيفرة وغيرها من الأمور. أمَّا الدالة [[Arduino/loop|<code>loop()</code>]]، فتُستدعَى بعد اكتمال تنفيذ الدالة [[Arduino/setup|<code>setup()</code>]] وخروجها وتنفَّذ بشكل متكرر في البرنامج الرئيسي (<code>main()[[Arduino/loop|]]</code>). تتحكم هذه الدالة باللوحة حتى اطفائها أو إعادة ضبطها بالضغط على الزر reset. | |||
==[[Arduino/arduinoide|تثبيت أردوينو IDE ورفع الشيفرات على اللوحة]]== | |||
ستجد في هذا القسم شرحًا وافيًا حول تثبيت بيئة أردوينو التطويرة (Arduino IDE) على مختلف أنظمة التشغيل، واستعمال النسخة المحمولة منها، واستعمال تطبيق الويب. سنعرِّج أيضًا على كيفية وصل إحدى أشهر لوحات أردوينو، وهي لوحة UNO، بالحاسوب وتهيئتها لبرمجتها وتشغيل مثالٍ عليها. | |||
==البنية الأولية للشيفرة في أردوينو== | ==البنية الأولية للشيفرة في أردوينو== | ||
لابد لكل شيفرة من شيفرات أردوينو أن تحوي الدالتين التاليتين: | لابد لكل شيفرة من شيفرات أردوينو أن تحوي الدالتين التاليتين: | ||
===[[Arduino/setup|<code>setup()</code>]]=== | ===[[Arduino/setup|<code>setup()</code>]]=== | ||
تستدعى الدالة <code>setup()</code> أولًا عند البدء بتنفيذ الشيفرة ( | تستدعى الدالة <code>setup()</code> أولًا عند البدء بتنفيذ الشيفرة (تدعى sketch كما تُطلِق عليها أردوينو)، إذ تُستَعمل لتهيئة المتغيرات، وأوضاع الأرجل، وواجهات التخاطب، والبدء باستعمال المكتبات ...إلخ. انتبه إلى أنَّ الدالة <code>setup()</code> ستُنفَّذ مرةً واحدةً فقط بعد تشغيل لوحة أردوينو أو تصفيرها (reset). | ||
===[[Arduino/loop|<code>loop()</code>]]=== | ===[[Arduino/loop|<code>loop()</code>]]=== | ||
بعد إنشاء الدالة <code>[[Arduino/setup|setup()]]</code> التي تهيئ وتضبط القيم الأولية المراد استعمالها، تعمل الدالة <code>loop()</code> على «تكرار» الشيفرة المكتوبة بداخلها -كما يشير اسمها بالضبط- على التوالي متيحةً بذلك لبرنامجك بالتحكم بلوحة أردوينو والتغيُّر والاستجابة للبيئة والعناصر المرتبطة بها. | بعد إنشاء الدالة <code>[[Arduino/setup|setup()]]</code> التي تهيئ وتضبط القيم الأولية المراد استعمالها، تعمل الدالة <code>loop()</code> على «تكرار» الشيفرة المكتوبة بداخلها -كما يشير اسمها بالضبط- على التوالي متيحةً بذلك لبرنامجك بالتحكم بلوحة أردوينو والتغيُّر والاستجابة للبيئة والعناصر المرتبطة بها. | ||
سطر 55: | سطر 71: | ||
تستعمل المعاملات المركبة (Compound Operators) في كتابة الشيفرات في أردوينو بكثرة لتصفير وضبط وقلب بتات معينة في القيم الثنائية وغيرها من العمليات المهمة التي تسهِّل وتبسِّط عملية كتابة الشيفرة كثيرًا. | تستعمل المعاملات المركبة (Compound Operators) في كتابة الشيفرات في أردوينو بكثرة لتصفير وضبط وقلب بتات معينة في القيم الثنائية وغيرها من العمليات المهمة التي تسهِّل وتبسِّط عملية كتابة الشيفرة كثيرًا. | ||
==أنواع البيانات== | ==أنواع البيانات== | ||
===الكائن <code>[[Arduino/stringobject|string]]</code>=== | |||
=== الكائن <code>[[Arduino/stringobject|string]]</code> === | |||
تنشئ الدالة <code>String()</code> نسخةً من الصنف <code>String</code> الذي يوفِّر الكثير من الأدوات للتعامل مع السلاسل النصية وإجراء عمليات عليها. | تنشئ الدالة <code>String()</code> نسخةً من الصنف <code>String</code> الذي يوفِّر الكثير من الأدوات للتعامل مع السلاسل النصية وإجراء عمليات عليها. | ||
===<code>[[Arduino/array|array]]</code>=== | ===<code>[[Arduino/array|array]]</code>=== | ||
المصفوفة هي مجموعة من المتغيرات والثوابت الموضوعة في وعاء واحد والتي يمكن الوصول إليها والتعامل معها عبر رقم فهرس كلٍّ منها. | المصفوفة هي مجموعة من المتغيرات والثوابت الموضوعة في وعاء واحد والتي يمكن الوصول إليها والتعامل معها عبر رقم فهرس كلٍّ منها. | ||
===<code>[[Arduino/bool|bool]]</code>=== | ===<code>[[Arduino/bool|bool]]</code>=== | ||
يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع <code>bool</code> إحدى القيمتين المنطقيَّتين التاليتين: <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA true|true]]</code>، أو <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA false|false]]</code> عبر حجز بايتٍ واحدٍ من الذاكرة فقط. | يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع <code>bool</code> إحدى القيمتين المنطقيَّتين التاليتين: <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA true|true]]</code>، أو <code>[[Arduino/constants#.D8.A7.D9.84.D8.AB.D8.A7.D8.A8.D8.AA false|false]]</code> عبر حجز بايتٍ واحدٍ من الذاكرة فقط. | ||
===<code>[[Arduino/boolean|boolean]]</code>=== | ===<code>[[Arduino/boolean|boolean]]</code>=== | ||
النوع <code>boolean</code> هو نوع غير قياسي، وهو اسمٌ بديل للنوع <code>[[Arduino/bool|bool]]</code> المُعرَّف في أردوينو. | النوع <code>boolean</code> هو نوع غير قياسي، وهو اسمٌ بديل للنوع <code>[[Arduino/bool|bool]]</code> المُعرَّف في أردوينو. | ||
===<code>[[Arduino/byte|byte]]</code>=== | ===<code>[[Arduino/byte|byte]]</code>=== | ||
يُخزِّن النوع <code>byte</code> عددًا عديم الإشارة بحجم 8 بت. | يُخزِّن النوع <code>byte</code> عددًا عديم الإشارة بحجم 8 بت. | ||
===<code>[[Arduino/char|char]]</code>=== | ===<code>[[Arduino/char|char]]</code>=== | ||
يحجز النوع <code>char</code> بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف محدَّد. | يحجز النوع <code>char</code> بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف محدَّد. | ||
===<code>[[Arduino/double|double]]</code>=== | ===<code>[[Arduino/double|double]]</code>=== | ||
يحجز النوع <code>double</code> أربعة بايتات من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات في اللوحات Due لتخزين عدد عشري فيها. | يحجز النوع <code>double</code> أربعة بايتات من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات في اللوحات Due لتخزين عدد عشري فيها. | ||
===<code>[[Arduino/float|float]]</code>=== | ===<code>[[Arduino/float|float]]</code>=== | ||
يحجز النوع <code>float</code> أربعة بايتات من الذاكرة لتخزين عدد عشري فيها. | يحجز النوع <code>float</code> أربعة بايتات من الذاكرة لتخزين عدد عشري فيها. | ||
===<code>[[Arduino/int|int]]</code>=== | ===<code>[[Arduino/int|int]]</code>=== | ||
يحجز النوع <code>int</code> حجمًا مقداره 2 بايت من الذاكرة في لوحات أردوينو Uno (وتلك التي تعتمد على متحكمات ATMega) أو 4 بايت في لوحات أردوينو Due (وتلك التي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه. | يحجز النوع <code>int</code> حجمًا مقداره 2 بايت من الذاكرة في لوحات أردوينو Uno (وتلك التي تعتمد على متحكمات ATMega) أو 4 بايت في لوحات أردوينو Due (وتلك التي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه. | ||
===<code>[[Arduino/long|long]]</code>=== | ===<code>[[Arduino/long|long]]</code>=== | ||
تحجز النوع <code>long</code> حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد التي تتسم بأنَّها طويلة. | تحجز النوع <code>long</code> حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد التي تتسم بأنَّها طويلة. | ||
===<code>[[Arduino/short|short]]</code>=== | ===<code>[[Arduino/short|short]]</code>=== | ||
يحجز النوع <code>short</code> في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 2 بايت لتخزين عدد قصير فيه. | يحجز النوع <code>short</code> في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 2 بايت لتخزين عدد قصير فيه. | ||
===<code>[[Arduino/string|string]]</code>=== | |||
=== <code>[[Arduino/string|string]]</code> === | |||
يمثِّل النوع <code>string</code> سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا. | يمثِّل النوع <code>string</code> سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا. | ||
===<code>[[Arduino/unsignedchar|unsigned char]]</code>=== | ===<code>[[Arduino/unsignedchar|unsigned char]]</code>=== | ||
يحجز النوع <code>unsigned char</code> حجمًا من الذاكرة مقداره 1 بايت فقط. | يحجز النوع <code>unsigned char</code> حجمًا من الذاكرة مقداره 1 بايت فقط. | ||
===<code>[[Arduino/unsignedint|unsigned int]]</code>=== | ===<code>[[Arduino/unsignedint|unsigned int]]</code>=== | ||
يحجز النوع <code>unsigned int</code> حجمًا من الذاكرة مقداره 2 بايت في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega أو 4 بايت في لوحات أردوينو Due لتخزين عدد صحيح عديم الإشارة فيها. | يحجز النوع <code>unsigned int</code> حجمًا من الذاكرة مقداره 2 بايت في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega أو 4 بايت في لوحات أردوينو Due لتخزين عدد صحيح عديم الإشارة فيها. | ||
===<code>[[Arduino/unsignedlong|unsigned long]]</code>=== | ===<code>[[Arduino/unsignedlong|unsigned long]]</code>=== | ||
يحجز النوع <code>unsigned long</code> حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد عديمة الإشارة التي تتسم بأنَّها طويلة. | يحجز النوع <code>unsigned long</code> حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد عديمة الإشارة التي تتسم بأنَّها طويلة. | ||
===<code>[[Arduino/void|void]]</code>=== | ===<code>[[Arduino/void|void]]</code>=== | ||
تُستعمَل الكلمة المفتاحية <code>void</code> مع الدوال التي يُعرِّفها المبرمج في الشيفرة لتُشير إلى أنَّه لا يُتوقَّع أن تعيد هذه الدالة بعد انتهاء تنفيذها أيَّة بيانات إلى من استدعاها. | تُستعمَل الكلمة المفتاحية <code>void</code> مع الدوال التي يُعرِّفها المبرمج في الشيفرة لتُشير إلى أنَّه لا يُتوقَّع أن تعيد هذه الدالة بعد انتهاء تنفيذها أيَّة بيانات إلى من استدعاها. | ||
===<code>[[Arduino/word|word]]</code>=== | ===<code>[[Arduino/word|word]]</code>=== | ||
تُخزِّن المتغيرات التي من النوع <code>word</code> عددًا عديم الإشارة بحجم 2 بايت. | تُخزِّن المتغيرات التي من النوع <code>word</code> عددًا عديم الإشارة بحجم 2 بايت. | ||
==الدوال== | ==الدوال== | ||
===[[Arduino/digital io|دوال التحكم بأرجل الدخل والخرج الرقمية]]=== | ===[[Arduino/digital io|دوال التحكم بأرجل الدخل والخرج الرقمية]]=== | ||
تستعمَل الدوال الموجودة في هذا القسم للتعامل مع الأرجل الرقمية والتحكم بها. | |||
===[[Arduino/analog io|دوال التحكم بأرجل الدخل والخرج التشابهية]]=== | ===[[Arduino/analog io|دوال التحكم بأرجل الدخل والخرج التشابهية]]=== | ||
تستعمَل الدوال الموجودة في هذا القسم للتعامل مع أرجل الدخل والخرج التشابهي والتحكم بها وبدقة القيم المقروءة منها أو المكتوبة عليها. | |||
===[[Arduino/advanced io|دوال متقدمة للتحكم بأرجل الدخل والخرج]]=== | ===[[Arduino/advanced io|دوال متقدمة للتحكم بأرجل الدخل والخرج]]=== | ||
توفر الدوال الموجودة في هذا القسم إمكانيات أوسع ووسائل متقدمة للتحكم بأرجل الدخل والخرج في لوحة أردوينو مثل حساب طول نبضة وتوليد موجة بتردد معينة وإزاحة قيمة من رجل ووضعها في متغير وبالعكس وغيرها من الأمور. | |||
===[[Arduino/time|دوال التوقيت]]=== | ===[[Arduino/time|دوال التوقيت]]=== | ||
تتعامل الدوال الموجودة في هذا القسم مع الأزمنة و المواقيت، إذ تعمل مثلًا على خلق تأخيرات زمنية بقيمة معينة تحتاجها بعض المهام، أو تنفيذ عملية معينة عند مرور فترة زمنية محدَّدة منذ بدء تشغيل اللوحة. | |||
===[[Arduino/math|الدوال الرياضية]]=== | ===[[Arduino/math|الدوال الرياضية]]=== | ||
تتعامل الدوال الرياضية مع الأعداد بشكل عام، إذ تجري مختلف العمليات الرياضية عليها، مثل حساب قيمة مطلقة أو جذر عدد أو جيب زاوية أو توليد عدد عشوائي. | |||
===[[Arduino/characters|دوال التعامل مع المحارف]]=== | ===[[Arduino/characters|دوال التعامل مع المحارف]]=== | ||
تعمل هذه الدوال مع المحارف بشكل عام، إذ تتحقَّق من كون محرف محدَّد ينتمي إلى مجموعةٍ معيَّنة من المحارف. | |||
===[[Arduino/conversion|دوال التحويل]]=== | ===[[Arduino/conversion|دوال التحويل]]=== | ||
تعمل دوال التحويل على التحويل بين مختلف <nowiki/>[[Arduino#.D8.A3.D9.86.D9.88.D8.A7.D8.B9 .D8.A7.D9.84.D8.A8.D9.8A.D8.A7.D9.86.D8.A7.D8.AA|أنواع البيانات]] في <nowiki/>[[Arduino|أردوينو]]. | |||
===[[Arduino/bits and bytes|دوال التحكم بالبتات والبايتات]]=== | ===[[Arduino/bits and bytes|دوال التحكم بالبتات والبايتات]]=== | ||
تعمل الدوال الموجودة في هذا القسم في مستوى البتات (bits)، إذ تقرأ قيمة بت معيَّن وتكتب قيمة محدَّدة عليه وتستخرج البايت العلوي أو السفلي من البيانات وغيرها من العمليات المفيدة والمتقدمة. | |||
===[[Arduino/interrupts|دوال التحكم بالمقاطعات]]=== | ===[[Arduino/interrupts|دوال التحكم بالمقاطعات]]=== | ||
===[[Arduino/ | تتحكم الدوال الموجودة في هذا القسم بالمقاطعات في أردوينو، إذ تعمل على تفعيل مقاطعةٍ معيَّنةٍ على إحدى الأرجل أو تعطيلها أو تفعيل جميع المقاطعات أو تعطيلها. | ||
===[[Arduino/ | ===دوال التحكم بالاتصالات=== | ||
تحتوي لوحة أردوينو على العديد من برتوكولات الاتصال المستعملة في التواصل مع البيئة الخارجية المحيطة باللوحة مثل التواصل مع الحاسوب وعناصر إلكترونية أخرى. الدوال الأساسية للتحكم بعمليات الاتصال الموجودة في أردوينو هي: | |||
*[[Arduino/serial|واجهة الاتصال التسلسلية]]، و | |||
*[[Arduino/stream|نقل البيانات عبر المجاري]]. | |||
===دوال التحكم عبر المنفذ USB=== | |||
توفر لوحة أردوينو إمكانية التحكم ببعض أجزاء الحاسوب المتصل مع اللوحة عبر المنفذ USB. تتوافر مكتبتان أساسيتان يمكن باستعمالها التحكم بلوحة المفاتيح والفأرة هما: | |||
*[[Arduino/keyboard|المكتبة Keyboard]]، و | |||
*[[Arduino/mouse|المكتبة Mouse]]. | |||
==الثوابت والمتغيرات== | ==الثوابت والمتغيرات== | ||
===الثوابت=== | ===الثوابت=== | ||
====< | ====[[Arduino/integerconstants|الأعداد الصحيحة الثابتة]]==== | ||
==== | الأعداد الصحيحة الثابتة هي أعداد استعملت مباشرةً في الشيفرة مثل 123. افتراضيًّا، تعامل هذه الأعداد على أنَّها <nowiki/>[[Arduino/int|أعداد صحيحة]] (integer) ولكن يمكن تحويلها إلى أنواع أخرى من الأعداد باستعمال أحد المبدلات (modifiers) مثل <code>U</code> أو <code>L</code>. | ||
==== | ====[[Arduino/floatingpointconstants|الأعداد العشرية الثابتة]]==== | ||
الأعداد العشرية الثابتة هي أعداد استعملت مباشرةً في الشيفرة مثل 12.34. تُبدَّل الأعداد الثابتة ذات الفاصلة العشرية في وقت تصريف الشيفرة إلى القيمة المساوية والمقابلة لهذا التعبير المكتوب. | |||
====[[Arduino/constants|الثوابت]]==== | |||
الثوابت هي تعابير معرَّفة مسبقًا في لغة أردوينو. تُستعمَل لتسهيل عمل المبرمجين أثناء كتابتهم للشيفرة، بالإضافة إلى جعل الشيفرة أكثر قابلية للقراءة. تُصنَّف الثوابت في مجموعات بحسب وظيفتها. | |||
===مجال وقيود المتغير (Variable Scope & Qualifiers)=== | ===مجال وقيود المتغير (Variable Scope & Qualifiers)=== | ||
====<code>[[Arduino/const|const]]</code>==== | ====<code>[[Arduino/const|const]]</code>==== | ||
الكلمة <code>const</code> المفتاحية هي اختصار للكلمة «ثابت» (constant)، وهي مقيِّدةٌ للمتغيرات التي تٌستعمَل معها، إذ تعدِّل سلوك المتغير لتجعله في وضع «القراءة فقط» (read-only). | |||
====<code>[[Arduino/scope|scope]]</code>==== | ====<code>[[Arduino/scope|scope]]</code>==== | ||
تملك المتغيرات في لغة C، التي اشتقَّت لغة أردونيو منها، خاصيةً تدعى «مجال» (scope) تحدِّد مجال استعمال هذه المتغيرات ومن يمكنه الوصول إليها. هذا يختلف عن الإصدارات الحديثة للغاتٍ مثل BASIC التي يكون فيها المتغير عامًّا (global) دومًا. | |||
====<code>[[Arduino/static|static]]</code>==== | ====<code>[[Arduino/static|static]]</code>==== | ||
تُستعمَل الكلمة المفتاحية <code>static</code> عند إنشاء متغيرات مرئيَّة لدالةٍ واحدة فقط من أجل الحفاظ على محتواها بعد انتهاء تنفيذ تلك الدالة المستدعاة وحتى الاستدعاء التالي لها خلافًا للمتغيرات المحلية التي تُنشَأ وتدمَّر في كل مرة تُستدعَى فيها الدالة. | |||
====<code>[[Arduino/volatile|volatile]]</code>==== | ====<code>[[Arduino/volatile|volatile]]</code>==== | ||
تصنَّف الكلمة <code>volatile</code> المفتاحية ضمن «مقيدات المتغيرات» (variable qualifier)، وتُستعمَل عادةً قبل نوع المتغير عند تعريفه لتوجيه المصرِّف إلى تحميل المتغير من الذاكرة RAM وليس من سجلات التخزين للذاكرة المؤقتة (الذاكرة flash) حيث تُخزَّن جميع متغيرات البرنامج. | |||
===أدوات إضافية=== | ===أدوات إضافية=== | ||
====<code>[[Arduino/progmem|PROGMEM]]</code>==== | ====<code>[[Arduino/progmem|PROGMEM]]</code>==== | ||
تخبر الكلمة <code>PROGMEM</code> المفتاحية المصرَّف بأنَّ يضع بيانات المتغير التي استعملت معه في الذاكرة flash بدلًا من وضعها في الذاكرة SRAM حيث يجب أن تخزَّن بالحالة الطبيعية. | |||
====<code>[[Arduino/sizeof|sizeof()]]</code>==== | ====<code>[[Arduino/sizeof|sizeof()]]</code>==== | ||
تعيد الدالة <code>sizeof()</code> الحجم المحجوز من الذاكرة بالبايت لمتغير أو مصفوفة معيَّنة. | |||
[[تصنيف: Arduino]] |
المراجعة الحالية بتاريخ 08:40، 7 نوفمبر 2018
بنية لغة أردوينو
تخضع الشيفرة في لغة أردوينو إلى بعض التعديلات البسيطة ثم تمرَّر إلى مفسِّر ++C/C. يمكن استعمال جميع البنى والتعابير القياسية في لغة C أو ++C التي يدعمها المفسِّر في أردوينو. لن تجد في شيفرة أردوينو الدالة main()
المعتادة ولكن ستجد عوضًا عنها دالتين رئيسين هما: الدالة setup()
والدالة loop()
اللتان تفسران وتوصلان بالدالة الرئيسيةmain()
لإنشاء البرنامج التنفيذي التكراري (cyclic executive program) عبر استعمال سلسلة أدوات GNU. يُستعمَل البرنامج avrdude المضمن ضمن أردوينو IDE لتحويل الشيفرة التنفيذية إلى ملف نصي مرمز بالترميز الست عشري والذي يحمَّل إلى لوحة أردوينو. انظر إلى الشيفرة التالية التي تمثِّل بنية لغة أردوينو:
#define LED_PIN 13 // تسمية الرجل 13 المتصلة بضوء ليد
void setup() {
pinMode(LED_PIN, OUTPUT); // ضبط الرجل 13 لتصبح رجل خرج
}
void loop() {
digitalWrite(LED_PIN, HIGH); // تشغيل ضوء الليد
delay(1000); // الانتظاء لمدة ثانية واحدة
digitalWrite(LED_PIN, LOW); // إطفاء ضوء الليد
delay(1000); // الانتظار لمدة ثانية واحدة
}
ستستدعى الدالة setup()
متى ما شُغلَت لوحة أروينو أو أعيد ضبطها بالضغط على الزر reset؛ تُستعمَل لتعريف المتغيرات وضبط أوضاع الأرجل وتهئية المكتبات المراد استعمالها في الشيفرة وغيرها من الأمور. أمَّا الدالة loop()
، فتُستدعَى بعد اكتمال تنفيذ الدالة setup()
وخروجها وتنفَّذ بشكل متكرر في البرنامج الرئيسي (main()
). تتحكم هذه الدالة باللوحة حتى اطفائها أو إعادة ضبطها بالضغط على الزر reset.
تثبيت أردوينو IDE ورفع الشيفرات على اللوحة
ستجد في هذا القسم شرحًا وافيًا حول تثبيت بيئة أردوينو التطويرة (Arduino IDE) على مختلف أنظمة التشغيل، واستعمال النسخة المحمولة منها، واستعمال تطبيق الويب. سنعرِّج أيضًا على كيفية وصل إحدى أشهر لوحات أردوينو، وهي لوحة UNO، بالحاسوب وتهيئتها لبرمجتها وتشغيل مثالٍ عليها.
البنية الأولية للشيفرة في أردوينو
لابد لكل شيفرة من شيفرات أردوينو أن تحوي الدالتين التاليتين:
setup()
تستدعى الدالة setup()
أولًا عند البدء بتنفيذ الشيفرة (تدعى sketch كما تُطلِق عليها أردوينو)، إذ تُستَعمل لتهيئة المتغيرات، وأوضاع الأرجل، وواجهات التخاطب، والبدء باستعمال المكتبات ...إلخ. انتبه إلى أنَّ الدالة setup()
ستُنفَّذ مرةً واحدةً فقط بعد تشغيل لوحة أردوينو أو تصفيرها (reset).
loop()
بعد إنشاء الدالة setup()
التي تهيئ وتضبط القيم الأولية المراد استعمالها، تعمل الدالة loop()
على «تكرار» الشيفرة المكتوبة بداخلها -كما يشير اسمها بالضبط- على التوالي متيحةً بذلك لبرنامجك بالتحكم بلوحة أردوينو والتغيُّر والاستجابة للبيئة والعناصر المرتبطة بها.
بنى التحكم
break
تُستعمَل الكلمة break
المفتاحية للخروج من الحلقات for
، أو while
، أو do...while
التكرارية، إذ تتخطى الشيفرة التي بعدها وشروط الحلقة المحددِّة وتخرج منها. تُستعمَل أيضًا للخروج من التعبير switch...case
البرمجي.
continue
تتخطى الكلمة continue
المفتاحية الشيفرة التي تليها في حلقة التكرار (مثل الحلقات for
، أو while
، أو do...while
التكرارية) إلى عملية التحقق من التعبير الشرطي لتلك الحلقة ثم يُستأنَف عمل حلقة التكرار بشكل طبيعي.
dowhile
تعمل الحلقة do...while
التكرارية بنفس الطريقة التي تعمل بها الحلقة while
باستثناء أنه يُتحقق من الشرط في نهاية الحلقة وليس في بدايتها. هذا يعني أنَّ الحلقة ستُنفَّذ مرة واحدة على الأقل.
else
يسمح التعبير if...else
الشرطي بالتحكم بشكل أوسع بتسلسل عملية التحقق من عدة شروط معينة عند تنفيذ الشيفرة عوضًا عن التحقق من شرط وحيد عند استعمال التعبير if
. ستُنفَّذ العبارة else
(إن وجدت) إن لم يتحقق الشرط المعطى في العبارة if
( أي أعطى القيمة false
). يمكن أيضًا استعمال العبارة else
مع العبارة if
بالشكل else if
لإضافة شرط آخر للتحقق منه وبذلك يمكن إجراء عدة عمليات تحقق متتابعة في الوقت نفسه.
for
تُستعمَل الحلقة for
لتكرار كتلة برمجية معينة من الشيفرة عددًا محدَّدًا من المرات. يُستعمَل في هذه الحلقة عادةً عدادٌ لتتبع عدد مرات تكرار الشيفرة ومقاطعتها عند الوصول إلى عدد محدَّد. يمكن استعمال الحلقة for
مع أية عملية تكرارٍ، وتُستعمَل بكثرة مع المصفوفات لتنفيذ عملية معينة على عناصرها التي قد تكون بيانات عادية أو أرجل معينة.
goto
تنقل الكلمة goto
المفتاحية البرنامج إلى موضع معين ضمن الشيفرة.
if
يتحقَّق التعبير if
الشرطي من شرط معيَّن وينفِّذ الكتلة البرمجية المكتوبة ضمنه إن كان محقَّقًا (أي كانت قيمته true
).
return
تقاطع الكلمة return
المفتاحية تنفيذ أيَّ دالةٍ وتعيد قيمةً من الدالة إلى من استدعاها إن حدُّدت.
switchcase
يتحقَّق التعبير switch...case
-كما في if
- من قيمة محدَّدة بطريقة تسمح للمبرمج بتحديد عدة شيفرات تُنفَّذ إحداها بناءً على تلك القيمة المفحوصة.
while
تكرِّر الحلقة while
تنفيذ الكتلة البرمجية التي ضمنها بشكل مستمر ولا نهائي ما دامت قيمة الشرط المنطقي الموجود بين القوسين هي true
(اطلع على البينة العامة في توثيق الحلقة)؛ متى ما أصبحت قيمة الشرط المنطقي false
، تتوقف الحلقة وتخرج.
صيغ إضافية
#define
التعبير #define
هو أحد العناصر المفيدة في C، إذ يسمح بإعطاء اسمٍ لقيمةٍ ثابتةٍ قبل أن يُفسَّر البرنامج. الثوابت المعرَّفة باستعمال هذا التعبير في أردوينو لا تحتل أيَّة مساحةٍ من ذاكرة البرنامج على الشريحة (chip). سيبدِّل المفسِّر (compiler) القيمة المعرَّفة مكان المراجع التي تشير إلى هذه الثوابت أثناء عملية تصريف الشيفرة.
#include
يُستعمَل التعبير #include
لتضمين مكتبات خارجية في شيفرتك. هذا يساعد المبرمج على الوصول إلى مجموعة أكبر من مكتبات C القياسية (التي هي مجموعة من الدوال المُنشَأ مسبقًا) والمكتبات التي كُتبَت خصِّيصًا لأردوينو.
;
تُستعمَل الفاصلة المنقوطة ;
لإنهاء كل تعبير برمجي في لغة أردوينو C.
{}
القوسان المعقوصان {}
(curly braces، أو braces فقط أو curly brackets) هما جزءٌ لا يتجزأ من لغة C. يستعملان في بُنى عديدة مثل بنى التحكم وغيرها وهذا يربك أحيانًا المبتدئين أثناء تعلمهم اللغة.
//
تبدأ التعليقات السطرية بخطين مائلين متجاورين //
وتنتهي بنهاية السطر بشكل تلقائي. سيُتجاهل أي شيء يلي الرمزين //
حتى نهاية السطر أثناء تفسير الشيفرة.
/* */
تبدأ التعليقات الكتلية (block comment) أو التعليقات متعددة الأسطر (multi-line comment) بالرمز */
وتنتهي بالرمز /*
. يمكن أن يمتد هذا التعليق على عدَّة أسطر بحسب الحاجة؛ ومتى ما قرأ المفسِّر الرمز */
، سيتجاهل كل ما كُتِب بعده حتى يصل إلى الرمز /*
.
المعاملات في لغة أردوينو C
المعاملات الحسابية
تجري المعاملات الحسابية (Arithmetic Operators) العمليات الحسابية الأساسية الأربعة (الجمع والطرح والضرب والقسمة) بالإضافة إلى عمليات أخرى مثل حساب باقي القسمة وإسناد قيمٍ إلى متغيراتٍ.
معاملات الموازنة
تجري معاملات الموازنة (Comparison Operators) عمليةَ موازنةٍ -كما هو اسمها- بين قيمتين أو متغيِّرين أو متغير وقيمة معينة ثم تعيد قيمة منطقية تمثِّل حالة أحد المعاملين (أكبر أو أصغر أو يساوي ...إلخ) نسبةً للآخر.
المعاملات المنطقية
تجري المعاملات المنطقية (Boolean Operators) العمليات المنطقية (العملية AND أو العملية OR أو العملية NOT) على القيم أو التعابير المنطقية ثم تعيد القيمة المنطقية الناتجة.
معاملات وصول المؤشر
معاملات وصول المؤشر هي (Pointer Access Operators) هي المعاملات التي تُستعمَل مع المؤشرات لتوفير وصول المؤشر إلى عناوين المتغيرات في الذاكرة والإشارة إليها، وإمكانية وصول المتغيرات إلى القيم المحتواة في عناوين الذاكرة التي تشير إليها المؤشرات.
معاملات الأعداد الثنائية
تجري معاملات الأعداد الثنائية (Bitwise Operators) جميع العمليات المنطقية وعمليات الإزاحة على بتات الأعداد والقيم الثنائية ثم تعيد القيمة الناتجة.
معاملات مركَّبة
تستعمل المعاملات المركبة (Compound Operators) في كتابة الشيفرات في أردوينو بكثرة لتصفير وضبط وقلب بتات معينة في القيم الثنائية وغيرها من العمليات المهمة التي تسهِّل وتبسِّط عملية كتابة الشيفرة كثيرًا.
أنواع البيانات
الكائن string
تنشئ الدالة String()
نسخةً من الصنف String
الذي يوفِّر الكثير من الأدوات للتعامل مع السلاسل النصية وإجراء عمليات عليها.
array
المصفوفة هي مجموعة من المتغيرات والثوابت الموضوعة في وعاء واحد والتي يمكن الوصول إليها والتعامل معها عبر رقم فهرس كلٍّ منها.
bool
يخزِّن المتغير الذي يصرَّح عنه بأنَّه من النوع bool
إحدى القيمتين المنطقيَّتين التاليتين: true
، أو false
عبر حجز بايتٍ واحدٍ من الذاكرة فقط.
boolean
النوع boolean
هو نوع غير قياسي، وهو اسمٌ بديل للنوع bool
المُعرَّف في أردوينو.
byte
يُخزِّن النوع byte
عددًا عديم الإشارة بحجم 8 بت.
char
يحجز النوع char
بايتًا واحدًا من الذاكرة ويخزِّن فيه قيمة محرف محدَّد.
double
يحجز النوع double
أربعة بايتات من الذاكرة فقط في لوحات أردوينو Uno (والتي تعتمد على متحكمات ATMega) أو ثمانية بايتات في اللوحات Due لتخزين عدد عشري فيها.
float
يحجز النوع float
أربعة بايتات من الذاكرة لتخزين عدد عشري فيها.
int
يحجز النوع int
حجمًا مقداره 2 بايت من الذاكرة في لوحات أردوينو Uno (وتلك التي تعتمد على متحكمات ATMega) أو 4 بايت في لوحات أردوينو Due (وتلك التي تعتمد على متحكمات SAMD) لتخزين عدد صحيح فيه.
long
تحجز النوع long
حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد التي تتسم بأنَّها طويلة.
short
يحجز النوع short
في جميع لوحات أردوينو (التي تعتمد على المتحكمات ATMega و ARM) حجمًا من الذاكرة مقداره 2 بايت لتخزين عدد قصير فيه.
string
يمثِّل النوع string
سلسلةً نصيةً مؤلفةً من عدة محارف مرتبطة مع بعضها بعضًا. تُستعمَل مصفوفة من المحارف لتخزين هذا النوع من البيانات واستدعائها والتعامل معها لاحقًا.
unsigned char
يحجز النوع unsigned char
حجمًا من الذاكرة مقداره 1 بايت فقط.
unsigned int
يحجز النوع unsigned int
حجمًا من الذاكرة مقداره 2 بايت في لوحات أردونيو Uno واللوحات التي تعتمد على متحكمات ATMega أو 4 بايت في لوحات أردوينو Due لتخزين عدد صحيح عديم الإشارة فيها.
unsigned long
يحجز النوع unsigned long
حجمًا كبيرًا من الذاكرة مقداره 4 بايت يُستعمَل لتخزين الأعداد عديمة الإشارة التي تتسم بأنَّها طويلة.
void
تُستعمَل الكلمة المفتاحية void
مع الدوال التي يُعرِّفها المبرمج في الشيفرة لتُشير إلى أنَّه لا يُتوقَّع أن تعيد هذه الدالة بعد انتهاء تنفيذها أيَّة بيانات إلى من استدعاها.
word
تُخزِّن المتغيرات التي من النوع word
عددًا عديم الإشارة بحجم 2 بايت.
الدوال
دوال التحكم بأرجل الدخل والخرج الرقمية
تستعمَل الدوال الموجودة في هذا القسم للتعامل مع الأرجل الرقمية والتحكم بها.
دوال التحكم بأرجل الدخل والخرج التشابهية
تستعمَل الدوال الموجودة في هذا القسم للتعامل مع أرجل الدخل والخرج التشابهي والتحكم بها وبدقة القيم المقروءة منها أو المكتوبة عليها.
دوال متقدمة للتحكم بأرجل الدخل والخرج
توفر الدوال الموجودة في هذا القسم إمكانيات أوسع ووسائل متقدمة للتحكم بأرجل الدخل والخرج في لوحة أردوينو مثل حساب طول نبضة وتوليد موجة بتردد معينة وإزاحة قيمة من رجل ووضعها في متغير وبالعكس وغيرها من الأمور.
دوال التوقيت
تتعامل الدوال الموجودة في هذا القسم مع الأزمنة و المواقيت، إذ تعمل مثلًا على خلق تأخيرات زمنية بقيمة معينة تحتاجها بعض المهام، أو تنفيذ عملية معينة عند مرور فترة زمنية محدَّدة منذ بدء تشغيل اللوحة.
الدوال الرياضية
تتعامل الدوال الرياضية مع الأعداد بشكل عام، إذ تجري مختلف العمليات الرياضية عليها، مثل حساب قيمة مطلقة أو جذر عدد أو جيب زاوية أو توليد عدد عشوائي.
دوال التعامل مع المحارف
تعمل هذه الدوال مع المحارف بشكل عام، إذ تتحقَّق من كون محرف محدَّد ينتمي إلى مجموعةٍ معيَّنة من المحارف.
دوال التحويل
تعمل دوال التحويل على التحويل بين مختلف أنواع البيانات في أردوينو.
دوال التحكم بالبتات والبايتات
تعمل الدوال الموجودة في هذا القسم في مستوى البتات (bits)، إذ تقرأ قيمة بت معيَّن وتكتب قيمة محدَّدة عليه وتستخرج البايت العلوي أو السفلي من البيانات وغيرها من العمليات المفيدة والمتقدمة.
دوال التحكم بالمقاطعات
تتحكم الدوال الموجودة في هذا القسم بالمقاطعات في أردوينو، إذ تعمل على تفعيل مقاطعةٍ معيَّنةٍ على إحدى الأرجل أو تعطيلها أو تفعيل جميع المقاطعات أو تعطيلها.
دوال التحكم بالاتصالات
تحتوي لوحة أردوينو على العديد من برتوكولات الاتصال المستعملة في التواصل مع البيئة الخارجية المحيطة باللوحة مثل التواصل مع الحاسوب وعناصر إلكترونية أخرى. الدوال الأساسية للتحكم بعمليات الاتصال الموجودة في أردوينو هي:
دوال التحكم عبر المنفذ USB
توفر لوحة أردوينو إمكانية التحكم ببعض أجزاء الحاسوب المتصل مع اللوحة عبر المنفذ USB. تتوافر مكتبتان أساسيتان يمكن باستعمالها التحكم بلوحة المفاتيح والفأرة هما:
الثوابت والمتغيرات
الثوابت
الأعداد الصحيحة الثابتة
الأعداد الصحيحة الثابتة هي أعداد استعملت مباشرةً في الشيفرة مثل 123. افتراضيًّا، تعامل هذه الأعداد على أنَّها أعداد صحيحة (integer) ولكن يمكن تحويلها إلى أنواع أخرى من الأعداد باستعمال أحد المبدلات (modifiers) مثل U
أو L
.
الأعداد العشرية الثابتة
الأعداد العشرية الثابتة هي أعداد استعملت مباشرةً في الشيفرة مثل 12.34. تُبدَّل الأعداد الثابتة ذات الفاصلة العشرية في وقت تصريف الشيفرة إلى القيمة المساوية والمقابلة لهذا التعبير المكتوب.
الثوابت
الثوابت هي تعابير معرَّفة مسبقًا في لغة أردوينو. تُستعمَل لتسهيل عمل المبرمجين أثناء كتابتهم للشيفرة، بالإضافة إلى جعل الشيفرة أكثر قابلية للقراءة. تُصنَّف الثوابت في مجموعات بحسب وظيفتها.
مجال وقيود المتغير (Variable Scope & Qualifiers)
const
الكلمة const
المفتاحية هي اختصار للكلمة «ثابت» (constant)، وهي مقيِّدةٌ للمتغيرات التي تٌستعمَل معها، إذ تعدِّل سلوك المتغير لتجعله في وضع «القراءة فقط» (read-only).
scope
تملك المتغيرات في لغة C، التي اشتقَّت لغة أردونيو منها، خاصيةً تدعى «مجال» (scope) تحدِّد مجال استعمال هذه المتغيرات ومن يمكنه الوصول إليها. هذا يختلف عن الإصدارات الحديثة للغاتٍ مثل BASIC التي يكون فيها المتغير عامًّا (global) دومًا.
static
تُستعمَل الكلمة المفتاحية static
عند إنشاء متغيرات مرئيَّة لدالةٍ واحدة فقط من أجل الحفاظ على محتواها بعد انتهاء تنفيذ تلك الدالة المستدعاة وحتى الاستدعاء التالي لها خلافًا للمتغيرات المحلية التي تُنشَأ وتدمَّر في كل مرة تُستدعَى فيها الدالة.
volatile
تصنَّف الكلمة volatile
المفتاحية ضمن «مقيدات المتغيرات» (variable qualifier)، وتُستعمَل عادةً قبل نوع المتغير عند تعريفه لتوجيه المصرِّف إلى تحميل المتغير من الذاكرة RAM وليس من سجلات التخزين للذاكرة المؤقتة (الذاكرة flash) حيث تُخزَّن جميع متغيرات البرنامج.
أدوات إضافية
PROGMEM
تخبر الكلمة PROGMEM
المفتاحية المصرَّف بأنَّ يضع بيانات المتغير التي استعملت معه في الذاكرة flash بدلًا من وضعها في الذاكرة SRAM حيث يجب أن تخزَّن بالحالة الطبيعية.
sizeof()
تعيد الدالة sizeof()
الحجم المحجوز من الذاكرة بالبايت لمتغير أو مصفوفة معيَّنة.