<?xml version="1.0"?>
<rss version="2.0"><channel><title>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x648;&#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x645;&#x62F;&#x645;&#x62C;&#x629;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/?d=2</link><description>&#x627;&#x644;&#x628;&#x631;&#x645;&#x62C;&#x629;: &#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x648;&#x627;&#x644;&#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x645;&#x62F;&#x645;&#x62C;&#x629;</description><language>ar</language><item><title>&#x628;&#x646;&#x627;&#x621; &#x645;&#x633;&#x637;&#x631;&#x629; &#x625;&#x644;&#x643;&#x62A;&#x631;&#x648;&#x646;&#x64A;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D9%85%D8%B3%D8%B7%D8%B1%D8%A9-%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2575/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_05/Arduino.png.cebf14b88b0d588000753a0e79ed9da8.png" /></p>
<p>
	سنتعلم في هذا المقال كيفية بناء مشروع جديد من سلسلة <a href="" rel="">دليل أردوينو</a> والذي من خلاله سنتعرف على عناصر ومكونات إلكترونية جديدة وكيفية ربطها وتوصيلها مع لوحة الأردوينو أونو Arduino Uno لتنفيذ مشروع مفيد وظيفته قياس المسافة بين الحساس والحاجز الذي أمامه، ومن ثم عرضها على الشاشة بصيغة مناسبة، والذي يمكن استخدامه كمسطرة إلكترونية أو إضافته إلى أفكار عديدة، مثل استخدامه في أنظمة السيارات لمساعدة السائق على ركنها، أو تطبيقات الأبواب الذكية لفتحها وإغلاقها آليًا، أو قياس مستوى السوائل، وتطبيقات أخرى.
</p>

<h2 id="arduino">
	العناصر المستخدمة لمشروع بناء مسطرة إلكترونية باستخدام الأردوينو Arduino
</h2>

<p>
	سنستخدم مجموعة من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		حساس الأمواج فوق الصوتية UltraSonic Sensor
	</li>
	<li>
		شاشة الكريستال السائلة Liquid Crystal Display
	</li>
	<li>
		مقاومة متغيرة Potentiometer
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<p>
	سنتعرف في البداية على العناصر الإلكترونية الجديدة المستخدمة في هذا المشروع، وهي حساس الأمواج فوق الصوتية UltraSonic Sensor وشاشة الكريستال السائلة Liquid Crystal Display، وسنتعلم طريقة ربط كل منها على حدة مع الأردوينو Arduino، ومن ثم سنربط جميع العناصر مع بعضها لتنفيذ فكرة مشروعنا.
</p>

<h2 id="liquidcrystaldisplay">
	شاشة الكريستال السائلة Liquid Crystal Display
</h2>

<p>
	تعرفنا في المشاريع السابقة مثل <a href="" rel="">مشروع تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino</a> على أدوات وعناصر إلكترونية استخدمناها لعرض البيانات مثل نافذة الاتصال التسلسلية Serial Monitor المدمجة مع بيئة الأردوينو المتكاملة Arduino IDE والتي تُعَد أداةً مفيدةً لعرض البيانات المرسلة من <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino%D8%9F-r1800/" rel="">لوحة الأردوينو Arduino</a> على شاشة الحاسوب والتواصل معه، ولكن في بعض المشاريع يتطلب الأمر أن يكون الجهاز الذي نريد تصميمه متنقلًا ومنفصلًا عن الحاسوب، وقد نحتاج لعرض البيانات وقيم الحساسات للمستخدم دون اتصال الأردوينو Arduino مع الحاسوب.
</p>

<p>
	في هذه الحالة، يأتي دور شاشات العرض مثل شاشة العرض ذات السبع أجزاء Seven Segment Display التي استخدمناها في <a href="" rel="">مشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino</a> ولكن تبقى هذه الشاشة محدودة لعرض الأرقام وبعض الأحرف فقط، ورغم بساطتها إلا أننا سنحتاج العديد من التوصيلات عند استخدام عدة خانات.
</p>

<p>
	سنستخدم في هذا المشروع نوع جديد من الشاشات وهو شاشات الكريستال السائلة Liquid Crystal Displays والتي تعرف اختصارًا LCD، وتُعَد هذه الشاشة مثاليةً لعرض الرسائل والنصوص والقيم الرقمية للحساسات أو حتى الرموز الخاصة وإضافة بعض المؤثرات البصرية.
</p>

<p style="text-align: center;">
	<img alt="شاشة الكريستال السائلة .jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172317" data-ratio="66.63" data-unique="ker7l6x15" style="width: 640px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2025_05/69208508_.jpg.ebc61966f42029e4d2de464a3d8751dd.jpg">
</p>

<h3 id="lcd">
	أنواع شاشة الكريستال السائلة LCD
</h3>

<p>
	تتوفر هذه الشاشة بعدة أبعاد مثل 1×8 و 1×16 و 2×16 و 4×20 وتتميز بأن جميعها لها نفس طريقة التوصيل مع لوحة الأردوينو Arduino، ولكن الحجم الأكثر انتشارًا واستخدامًا هو 2×16 حيث يمثل الرقم 16 عدد الأعمدة في الشاشة ويمثل الرقم 2 عدد الأسطر الموجودة في الشاشة، ويحتوي كل عمود على 5×8 بكسل ويمثل محرف واحد يمكن عرض حرف أو رقم أو رمز فيه، بالتالي أصبح لدينا 32 محرفًا في شاشة الكريستال السائلة LCD ذات الحجم 2×16، كما يوجد عدة ألوان لها مثل اللون الأبيض للنص مع خلفية زرقاء أو اللون الأسود للنص مع خلفية خضراء.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172320" href="https://academy.hsoub.com/uploads/monthly_2025_05/1109549711_.jpg.a828e393786c6136bf9ddc734235af8d.jpg" rel=""><img alt="أنواع شاشة الكريستال السائلة.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172320" data-ratio="58.00" data-unique="kw3yrpfnr" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.63d0649ef52331c67ee9fd14aa45232a.jpg"></a>
</p>

<h3 id="lcd-1">
	أقطاب شاشة الكريستال السائلة LCD
</h3>

<ul>
	<li>
		<strong>قطب Vss</strong>: قطب التغذية السالب للشاشة والدائرة الرقمية التي بداخلها، ويوصل مع قطب الأرضي GND
	</li>
	<li>
		<strong>قطب Vdd</strong>: قطب التغذية الموجب للشاشة والدائرة الرقمية التي بداخلها، ويوصل مع مصدر تغذية 5 فولت
	</li>
	<li>
		<strong>قطب Vo</strong>: قطب التحكم بشدة تباين شاشة LCD، ويوصل مع قطب الخرج للمقاومة المتغيرة Potentiometer؛ أما الأقطاب الأخرى للمقاومة المتغيرة توصل مع قطب التغذية 5 فولت وقطب الأرضي GND، وبتغيير محور المقاومة المتغيرة سيؤدي لتغيير قيمة الجهد على القطب Vo، وبالتالي ستتغير شدة التباين في الشاشة
	</li>
	<li>
		<strong>قطب Rs</strong>: قطب تحديد نوع البيانات المرسلة للشاشة، إذا كانت حالة القطب 0 منطقي ستكون البيانات المرسلة للشاشة عبارة عن أوامر مثل مسح النصوص المعروضة على الشاشة أو تحديد مكان المؤشر في الشاشة؛ أما إذا كانت حالة القطب 1 منطقي، فستكون البيانات عبارة عن نصوص ستعرض على الشاشة
	</li>
	<li>
		<strong>قطب RW</strong>: قطب تحديد نمط العمل للشاشة
	</li>
</ul>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إذا كانت حالة القطب 0 منطقية، فإن الشاشة ستعمل في نمط الكتابة أي أننا سنرسل بيانات للشاشة؛ أما إذا كانت حالة القطب 1 منطقي، فستعمل في نمط القراءة أو بمعنى آخر سنستقبل بيانات من الشاشة، ولكن النمط الأكثر استخدامًا هو نمط الكتابة على الشاشة لذلك سنوصل هذا القطب مع القطب الأرضي GND دائمًا
	</p>
</blockquote>

<ul>
	<li>
		<strong>قطب E</strong>: قطب تفعيل الكتابة في مسجلات الشاشة، فعند إرسال البيانات للشاشة يجب أن تتغير حالة هذا القطب من 1 منطقي إلى 0 منطقي لاستقبال البيانات
	</li>
	<li>
		<strong>أقطاب D0-D7</strong>: أقطاب نقل البيانات والأوامر إلى الشاشة ويمكن استخدام 4 أقطاب فقط أو 8 أقطاب، والنمط الأكثر استخدامًا عادةً هو 4 أقطاب فقط وذلك لتقليل التوصيلات
	</li>
	<li>
		<strong>قطب A</strong>: قطب التغذية الموجب الخاص بإضاءة خلفية الشاشة ويوصل مع القطب 5 فولت
	</li>
	<li>
		<strong>قطب C</strong>: قطب التغذية السالب الخاص بإضاءة خلفية الشاشة ويوصل مع القطب الأرضي GND
	</li>
</ul>

<p style="text-align: center;">
	<img alt="أقطاب شاشة الكريستال السائلة.png" class="ipsImage ipsImage_thumbnailed" data-fileid="172326" data-ratio="45.83" data-unique="kzq162cm7" style="width: 640px; height: auto;" width="755" src="https://academy.hsoub.com/uploads/monthly_2025_05/1376172454_.png.6323c62a3c0773f0107aead3bd8ac934.png">
</p>

<p>
	سننفذ تطبيقًا بسيطًا لتجربة شاشة الكريستال السائلة LCD مع لوحة الأردوينو Arduino من خلال عرض العبارة <strong>Hasoub Academy</strong> في السطر الأول، والعبارة <strong>!LCD Example</strong> في السطر الثاني على الشاشة، ومع إضافة بعض الحركة على الشاشة.
</p>

<h3 id="lcdarduino">
	مخطط توصيل شاشة الكريستال السائلة LCD مع الأردوينو Arduino
</h3>

<p>
	لربط شاشة الكريستال السائلة LCD سنتبع الخطوات التالية:
</p>

<ul>
	<li>
		نضع الشاشة في لوحة توصيل التجارب BreadBoard عرضيًا
	</li>
	<li>
		نصل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
	</li>
	<li>
		نصل قطب الشاشة ذو الرمز Vs مع المسرى السالب والقطب ذو الرمز Vdd مع المسرى الموجب للوحة التجارب BreadBoard، والتي تمثل أقطاب التغذية للدائرة الإلكترونية والرقمية للشاشة
	</li>
	<li>
		نصل قطب الشاشة ذو الرمز Vo مع قطب الخرج الخاص بالمقاومة المتغيرة الموجود في المنتصف، ونوصل باقي الأقطاب المتغيرة مع المسرى السالب والمسرى الموجب للوحة التجارب BreadBoard
	</li>
	<li>
		نصل قطب الشاشة ذي الرمز Rs مع القطب ذو الرقم 12 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		نصل قطب الشاشة ذي الرمز RW مع المسرى السالب للوحة التجارب BreadBoard أو يمكن وصله مع قطب الشاشة ذو الرمز Vs لترتيب التوصيل أكثر
	</li>
	<li>
		نصل قطب الشاشة ذو الرمز E مع القطب ذو الرقم 11 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		نصل أقطاب الشاشة الخاصة بالبيانات من D4-D7 على الترتيب مع الأقطاب ذات الأرقام من 7-4 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		نصل قطب الشاشة ذو الرمز A مع المسرى الموجب والقطب ذو الرمز K مع المسرى السالب للوحة التجارب BreadBoard، والتي تمثل أقطاب التغذية لإضاءة خلفية الشاشة وفي حال عدم توصيلها ستعمل الشاشة ولكن بدون إضاءة
	</li>
</ul>

<p>
	توضح الصورة التالية مخطط توصيل شاشة LCD مع لوحة الأردوينو أونو Arduino Uno:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172318" href="https://academy.hsoub.com/uploads/monthly_2025_05/1119202415_.jpg.0f485261b62ca63cbbc478b9c21677ac.jpg" rel=""><img alt="مخطط توصيل الشاشة" class="ipsImage ipsImage_thumbnailed" data-fileid="172318" data-unique="ibpvppp7a" style="width: 640px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.1f4f89f00785d7f5b3f1fe8913a91626.jpg"> </a>
</p>

<h3 id="lcdarduino-1">
	الكود البرمجي الخاص بشاشة الكريستال السائلة LCD مع لوحة الأردوينو Arduino
</h3>

<p>
	لكتابة الكود البرمجي الخاص بشاشة LCD سنعتمد على المكتبة البرمجية <a href="" rel=""><strong>LiquidCrystal</strong></a> المدمجة مع بيئة الأردوينو واستخدام التعليمات البرمجية الخاصة بها بشكل مباشر، فقط كل ما نحتاجه هو تضمين المكتبة في بداية الكود بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_7" style=""><span class="com">#include</span><span class="pln">  </span><span class="str">&lt;LiquidCrystal.h&gt;</span></pre>

<p>
	في الخطوة التالية سننشئ متغيرًا خاصًا بالمكتبة البرمجية للشاشة من نوع <code>LiquidCrystal</code> ونستطيع اختيار الاسم الذي نريده مثل <code>lcd</code>، ومن خلال هذا المتغير نستطيع تحديد طريقة نقل البيانات بنمط نصف بايت عبر استخدام 4 أقطاب فقط، أو بايت كامل باستخدام 8 أقطاب.
</p>

<p>
	غالبًا ما نستخدم نمط نصف بايت لتقليل التوصيلات، وسيأخذ هذا المتغير 6 وسطاء إجبارية وتمثل أرقام أقطاب الشاشة التي وصلناها مع لوحة الأردوينو بالترتيب التالي Rs ،E ،D4 ،D5 ،D6 ،D7 في حال استخدام نمط نصف بايت فقط، أما في حال استخدام نمط بايت كامل سيأخذ 10 وسطاء بالترتيب التالي Rs ،E ،D0 ،D1 ،D2 ،D3 ،D4 ،D5 ،D6 ،D7.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_9" style=""><span class="typ">LiquidCrystal</span><span class="pln">  lcd</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">);</span></pre>

<p>
	سنهيئ شاشة LCD في الدالة الرئيسية <a href="https://wiki.hsoub.com/Arduino/setup" rel="external"><code>()setup</code></a> من خلال الدالة <code>()lcd.begin</code>، والتي تأخذ وسيطين إجباريين هما عدد الأعمدة وعدد الأسطر الموجودة في الشاشة، بالإضافة إلى وسيط ثالث اختياري يمثل عدد البكسلات الموجودة في كل عمود والقيمة الإفتراضية له هي 8×5 بكسل.
</p>

<p>
	نريد أن نطبع في بداية التشغيل رسالة ترحيبية <strong>Hello World</strong> لمرة واحدة فقط ولمدة ثانية واحدة، ومن ثم نمسح المحتوى الموجود على الشاشة، لذلك سننفذ هذا الأمر في الدالة الرئيسية، وللطباعة على الشاشة سنستخدم الدالة <code>()lcd.print</code> والتي تأخذ وسيطين: إجباري: وهو البيانات التي نريد طباعتها ويمكن أن تكون من نوع <code>int</code> أو <code>long</code> أو <code>char</code> أو <code>byte</code> أو <code>string</code> اختياري: ويمثل صيغة البيانات <code>Bin</code> أو <code>Dec</code> أو <code>Oct</code> أو <code>Hex</code>.
</p>

<p>
	وسنستخدم الدالة المدمجة <a href="" rel=""><code>()delay</code></a> لعمل تأخير الزمني كما تعلمنا في المشاريع السابقة.
</p>

<p>
	أما لمسح النص المعروض على الشاشة سنستخدم الدالة <code>()lcd.clear</code> والتي لا تأخذ أي وسيط:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_11" style=""><span class="kwd">void</span><span class="pln">  setup</span><span class="pun">()</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	سنستخدم في الدالة التكرارية <a href="https://wiki.hsoub.com/Arduino/loop" rel="external"><code>()loop</code></a> الدالة <code>()lcd.setCursor</code> لتحريك مؤشر الكتابة للمكان الذي نريد، وتأخذ هذه الدالة وسيطين هما رقم العمود ورقم السطر، ونلاحظ أن عبارة "Hasoub Academy" مكونة من 16 محرف، بالتالي سنحرك مؤشر الكتابة إلى العمود الثاني ذي رقم 1 لأن الترقيم يبدأ من 0، والسطر الأول ذو الرقم 0 لتصبح العبارة في منتصف السطر الأول.
</p>

<p>
	وبعد طباعة العبارة الأولى في السطر الأول، سنحرك مؤشر الكتابة إلى السطر الثاني ذو الرقم 1 بنفس الطريقة السابقة، وكذلك الأمر مع العمود الثالث ذي الرقم 2، لكي تكون محاذاة العبارة !LCD Example في منتصف الشاشة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_13" style=""><span class="kwd">void</span><span class="pln">  loop</span><span class="pun">()</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln">  </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Hasoub Academy"</span><span class="pun">);</span><span class="pln">

lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln">  </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"LCD Example!"</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكن إجراء بعض التعديلات في الدالة التكرارية السابقة لإضافة بعض المؤثرات الحركية على النص خلال عرضه على الشاشة، مثل تحريكه إلى اليمين أو اليسار بستمرار، وذلك من خلال الدالة <code>()lcd.scrollDisplayLeft</code> لتحريك النص من اليمين إلى اليسار بمقدار محرف واحد، والدالة <code>()lcd.scrollDisplayRight</code> لتحريك النص من اليسار إلى اليمين بمقدار محرف واحد في كل مرة، وبالتالي يصبح الكود بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_15" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Hasoub Academy"</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"LCD Example!"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> positionCounter </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> positionCounter </span><span class="pun">&lt;</span><span class="lit">16</span><span class="pun">;</span><span class="pln"> positionCounter </span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    lcd</span><span class="pun">.</span><span class="pln">scrollDisplayLeft </span><span class="pun">();</span><span class="pln">
    </span><span class="com">// lcd.scrollDisplayRight();</span><span class="pln">
    delay </span><span class="pun">(</span><span class="lit">150</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<img alt="نتيجة ربط الشاشة مع الأردوينو.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="172310" data-ratio="42.50" data-unique="vxk1c31ii" width="640" src="https://academy.hsoub.com/uploads/monthly_2025_05/872076003_.gif.3dd62d20d5dc80f64ecd21e6c7e6286f.gif">
</p>

<p>
	يمكن الاطلاع أكثر على التوثيق الرسمي الخاص بمكتبة <a href="https://docs.arduino.cc/libraries/liquidcrystal/" rel="external nofollow"><code>LiquidCrystal</code></a> لمزيد من المعلومات عنها، وماهي التوابع الأخرى الخاصة بها من خلال الموقع الرسمي لمنصة أردوينو Arduino من <a href="" rel="">الرابط التالي.</a>
</p>

<h2 id="ultrasonicsensor">
	حساس الأمواج فوق الصوتية UltraSonic Sensor
</h2>

<p>
	هو عبارة عن جهاز استشعار يتكون من مرسل Transmitter ومستقبل Receiver وبعض العناصر الإلكترونية والرقمية الأخرى. يُستخدم هذا الحساس لقياس المسافة بينه وبين الحاجز الذي أمامه ضمن المجال من 2 سم إلى 400 سم وبدقة 0.3 سم أو ما يعادل من 0.8 بوصة إلى 157 بوصة وبدقة 0.1 بوصة، ويُعَد هذا الحساس سهل الاستخدام ورخيص الثمن مقارنةً مع المجال والدقة التي يقدمها والتي تُعَد مناسبةً لكثير من المشاريع الإلكترونية.
</p>

<p style="text-align: center;">
	<img alt="حساس الأمواج فوق الصوتية.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172327" data-ratio="58.86" data-unique="c38qdhgue" style="width: 640px; height: auto;" width="790" src="https://academy.hsoub.com/uploads/monthly_2025_05/89105701_.jpg.31fbd21a507feaf874debaa2ad73e10c.jpg">
</p>

<h3 id="ultrasonicsensor-1">
	مبدأ عمل حساس الأمواج فوق الصوتية UltraSonic Sensor
</h3>

<p>
	يعتمد في عمله أساسًا على الأمواج فوق الصوتية، فعند إعطاء أمر الإرسال على قطب <code>Trig</code>، سترسل موجة فوق صوتية مكونة من ثماني نبضات عن طريق المرسل بتردد 40KHZ تنتقل عبر الهواء، وفي حال وجود جسم أو حاجز أمامها ستصطدم به وتنعكس إلى الحساس.
</p>

<p>
	ونتيجة استقبال الموجة، ستتولد نبضة موجبة على قطب <code>Echo</code> تمثل الزمن الذي استغرقته الموجة من لحظة إرسالها حتى عودتها وتتراوح بين 150 مايكرو ثانية و 25 مللي ثانية، ومن خلال قانون السرعة نستطيع حساب المسافة من خلال الزمن الذي أصبح لدينا. وكما نعلم، قيمة سرعة الصوت معروفة وهي 340m/s عند درجة حرارة 20 درجة مئوية وتختلف قليلًا عند تغير درجة الحرارة والرطوبة والضغط الجوي، وبالتالي يمكن حساب المسافة من خلال العلاقة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_17" style=""><span class="pln"> </span><span class="typ">Distance</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Speed</span><span class="pln"> x </span><span class="typ">Time</span><span class="pln"> </span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172325" href="https://academy.hsoub.com/uploads/monthly_2025_05/1543638736_.jpg.e43a9771299bfce211f0096414d00e90.jpg" rel=""><img alt="مبدأ عمل الحساس.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172325" data-ratio="50.56" data-unique="9jtx8epsi" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.b49cf3f07dc080f41967ff9ce29b4453.jpg"></a>
</p>

<h3 id="ultrasonicsensor-2">
	أقطاب حساس الأمواج فوق الصوتية UltraSonic Sensor
</h3>

<ul>
	<li>
		<strong>قطب Vcc</strong>: قطب التغذية الموجب ويوصل مع القطب 5v في لوحة الأردوينو Arduino
	</li>
	<li>
		<strong>قطب Trig</strong>: عبارة عن قطب خرج وهو القطب المسؤول عن إرسال موجة فوق صوتية من خلال إعطائه إشارة <code>HIGH</code> لمدة 10µs
	</li>
	<li>
		<strong>قطب Echo</strong>: عبارة عن قطب دخل وهو القطب المسؤول عن إستقبال الموجة، حيث تتغير حالته إلى قيمة <code>HIGH</code> عند نهاية إرسال الموجة ويعود إلى حالة <code>LOW</code> عند استقبال الموجة
	</li>
	<li>
		<strong>قطب GND</strong>: قطب التغذية السالب ويوصل مع القطب GND في لوحة الأردوينو أونو Arduino
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172328" href="https://academy.hsoub.com/uploads/monthly_2025_05/1015307467_.jpg.83e50ae6a49b89162a29e63c51ccf2ea.jpg" rel=""><img alt="أقطاب الحساس.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172328" data-ratio="56.44" data-unique="5h8te48rb" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.c8da223220365120d77cadc3346a9e74.jpg"></a>
</p>

<h3 id="ultrasonicsensor-3">
	مواصفات حساس الأمواج فوق الصوتية UltraSonic Sensor
</h3>

<p>
	لا بد من توفر المواصفات الآتية في حساس الأمواج فوق الصوتية UltraSonic Sensor:
</p>

<ul>
	<li>
		<strong>جهد التغذية</strong>: 5 فولت
	</li>
	<li>
		<strong>تيار العمل</strong>: 15 مللي أمبير
	</li>
	<li>
		<strong>زاوية القياس الفعالة</strong>: 15 درجة
	</li>
	<li>
		<strong>مجال القياس</strong>: من 2 سم إلى 400 سم
	</li>
	<li>
		<strong>دقة القياس</strong>: 0.3 سم
	</li>
	<li>
		<strong>الأبعاد</strong>: 45 مم × 20 مم × 15 مم
	</li>
</ul>

<p>
	سننفذ تطبيق بسيط باستخدام لوحة أردوينو Arduino وحساس الأمواج فوق الصوتية UltraSonic Sensor وسنتعلم كيفية أخذ القراءات من الحساس وتحويل هذه القيمة إلى المسافة وكيفية كتابة الكود البرمجي والتوصيل المناسب.
</p>

<h3 id="ultrasonicsensorarduino">
	مخطط توصيل حساس الأمواج فوق الصوتية UltraSonic Sensor مع لوحة الأردوينو Arduino
</h3>

<p>
	سنتبع الخطوات التالية لتوصيل الحساس مع لوحة الأردوينو:
</p>

<ul>
	<li>
		نصل القطب الأول Vcc في الحساس مع القطب 5v في لوحة الأردوينو أونو
	</li>
	<li>
		نصل القطب الثاني Trig في الحساس مع القطب ذو الرقم 9 في لوحة الأردوينو أونو
	</li>
	<li>
		نصل القطب الثالث Echo في الحساس مع القطب ذو الرقم 8 في لوحة الأردوينو أونو
	</li>
	<li>
		نصل القطب الرابع GND في الحساس مع القطب GND في لوحة الأردوينو أونو
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172329" href="https://academy.hsoub.com/uploads/monthly_2025_05/1372667570_.jpg.8398181f58e560da9cc3dacd1079e8ab.jpg" rel=""><img alt="توصيل الحساس مع أردوينو.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172329" data-ratio="30.33" data-unique="nbxqf42f2" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.f239f63ece02f06d6658e9a9c012fea3.jpg"></a>
</p>

<h3 id="ultrasonicsensorarduino-1">
	الكود البرمجي الخاص بحساس لأمواج فوق الصوتية UltraSonic Sensor مع لوحة الأردوينو Arduino
</h3>

<p>
	من الممكن استخدام مكتبات برمجية جاهزة نستطيع تحميلها من الإنترنت أو من بيئة الأردوينو البرمجية، ولكننا لن نستخدم هذه المكتبات حاليًا، لأن الكود الخاص بالحساس بسيط وسهل جدًا.
</p>

<p>
	في البداية نحتاج لتعريف أرقام الأقطاب الموصولة مع الحساس <code>Trig</code> و<code>Echo</code> من خلال الماكرو <code>define#</code>، بالإضافة إلى متغيرين من نوع عدد صحيح <code>int</code>هما:
</p>

<ol>
	<li>
		<code>duration</code> سنخزن فيه قيمة الزمن التي سنحصل عليها من الحساس
	</li>
	<li>
		<code>distance</code> سنخزن فيه قيمة المسافة
	</li>
</ol>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_19" style=""><span class="com">#define</span><span class="pln"> trigPin </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> echoPin </span><span class="lit">8</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> duration </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> distance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></pre>

<p>
	سنضبط القطب <code>trigPin</code> في الدالة الرئيسية <a href="https://wiki.hsoub.com/Arduino/setup" rel="external"><code>()setup</code></a> كقطب خرج <code>OUTPUT</code>، والقطب <code>echoPin</code> كقطب دخل <code>INPUT</code> من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external"><code>()pinMode</code></a> والتي تأخذ وسيطين هما رقم القطب ونوع القطب، إما خرج <code>OUTPUT</code> أو دخل <code>INPUT</code>.
</p>

<p>
	كما سنفعل واجهة الاتصال التسلسلية Serial Communication من خلال الدالة المدمجة <a href="" rel=""><code>()Serial.begin</code></a> التي تأخذ وسيطين على النحو الآتي:
</p>

<ol>
	<li>
		<strong>إجباري</strong>: سرعة نقل البيانات Baud rate بمعدل بت في الثانية وسنختار القيمة <code>9600</code>
	</li>
	<li>
		<strong>اختياري</strong>: وهو خاص بضبط الإعدادات config الأخرى لواجهة الاتصال ويمكن تركه فارغًا حيث يأخذ الضبط الافتراضي <code>SERIAL_8N1</code> في هذه الحالة
	</li>
</ol>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_21" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">trigPin</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">echoPin</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	أما في الدالة التكرارية <a href="https://wiki.hsoub.com/Arduino/loop" rel="external"><code>()loop</code></a>، سنغير حالة القطب <code>trigPin</code> إلى القيمة <code>HIGH</code> لبدء عملية الإرسال من خلال الدالة المدمجة <a href="" rel=""><code>()digitalWrite</code></a> التي تأخذ وسيطين هما رقم القطب وحالة أو قيمة القطب، وذلك بإعطاءه قيمة 1 منطقي أو <code>HIGH</code> للتشغيل و 0 منطقي أو <code>LOW</code> للإطفاء ولمدة 10µs من خلال الدالة المدمجة <a href="" rel=""><code>()delayMicroseconds</code></a> التي تأخذ وسيطًا واحدًا هو قيمة التأخير بالمايكرو ثانية، ومن ثم سنعيد حالة القطب <code>trigPin</code> إلى القيمة <code>LOW</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_23" style=""><span class="kwd">void</span><span class="pln">  loop</span><span class="pun">()</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
digitalWrite</span><span class="pun">(</span><span class="pln">trigPin</span><span class="pun">,</span><span class="pln">  HIGH</span><span class="pun">);</span><span class="pln">
delayMicroseconds</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
digitalWrite</span><span class="pun">(</span><span class="pln">trigPin</span><span class="pun">,</span><span class="pln">  LOW</span><span class="pun">);</span></pre>

<p>
	بعد انتهاء إرسال الموجة، سنقيس الزمن الذي يكون فيه القطب <code>echoPin</code> في حالة <code>HIGH</code> وتخزينه في المتغير <code>duration</code>، وذلك من خلال استخدام الدالة المدمجة <a href="" rel=""><code>()pulseIn</code></a> التي تأخذ ثلاثة وسطاء على النحو الآتي:
</p>

<ol>
	<li>
		<strong>الوسيط <code>pin</code></strong>: يمثل رقم القطب المراد حساب طول النبضة المولَّدة عليه
	</li>
	<li>
		<strong>الوسيط <code>value</code></strong>: يمثل نوع النبضة المراد قراءتها لحساب طولها وتكون إمَّا <code>HIGH</code> أو <code>LOW</code>
	</li>
	<li>
		<strong>الوسيط <code>timeout</code></strong>: يحدِّد المهلة الزمنية بالميكروثانية التي ستنتظر الدالة خلالها بدء النبضة، وتعيد هذه الدالة عدد يمثل طول النبضة المولدة على الرجل <code>pin</code> بالميكروثانية، أو تعيد القيمة 0 إن لم تبدأ أيَّة نبضة عند الحافة <code>value</code> قبل انتهاء المهلة <code>timeout</code> الزمنية.
	</li>
</ol>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_25" style=""><span class="pln">duration </span><span class="pun">=</span><span class="pln">  pulseIn</span><span class="pun">(</span><span class="pln">echoPin</span><span class="pun">,</span><span class="pln">  HIGH</span><span class="pun">);</span></pre>

<p>
	لحساب المسافة سنستخدم العلاقة الرياضية التي ذكرناها سابقًا وهي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_27" style=""><span class="pln"> </span><span class="typ">Distance</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Speed</span><span class="pln"> x </span><span class="typ">Time</span><span class="pln"> </span></pre>

<p>
	والتي تمثل قانون المسافة ولكن نحتاج لتحويل قيمة السرعة من 340m/s إلى 0.034cm/µs لكي تتناسب مع قيمة الزمن المقاس والحصول على المسافة بواحدة cm؛ بالإضافة لتقسيم الزمن على 2 لأنه يمثل زمن ذهاب وعودة الموجة، فتصبح العلاقة برمجيًا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_29" style=""><span class="pln">distance </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0.034</span><span class="pln"> </span><span class="pun">*</span><span class="pln">  </span><span class="pun">(</span><span class="pln">duration   </span><span class="pun">/</span><span class="pln">  </span><span class="lit">2</span><span class="pun">);</span></pre>

<p>
	الخطوة الأخيرة هي طباعة قيمة المسافة على نافذة الاتصال التسلسلية، وذلك باستخدام الدالة المدمجة <a href="" rel=""><code>()Serial.print</code></a> والدالة <a href="" rel=""><code>()Serial.println</code></a> التي سنمرر لها البيانات المراد طباعتها، وإضافة بعض التأخير الزمني لنستطيع قراءة القيم على نافذة Serial Monitor.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_31" style=""><span class="typ">Serial</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"distance  = "</span><span class="pun">);</span><span class="pln">
</span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">);</span><span class="pln">
delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="172319" href="https://academy.hsoub.com/uploads/monthly_2025_05/1703479901_.gif.25f27efd8abdbc854e4a9ea4cdd949f7.gif" rel=""><img alt="تطبيق قراءة الحساس" class="ipsImage ipsImage_thumbnailed" data-fileid="172319" data-unique="tsm9xfksk" src="https://academy.hsoub.com/uploads/monthly_2025_05/1703479901_.gif.25f27efd8abdbc854e4a9ea4cdd949f7.gif"> </a>
</p>

<h2 id="arduino-1">
	مخطط توصيل مشروع بناء مسطرة إلكترونية باستخدام الأردوينو Arduino
</h2>

<p>
	توضح الصورة التالية التوصيل النهائي للمشروع، حيث أن خطوات التوصيل هي نفسها التي اتَّبعناها في تطبيق الشاشة والحساس معًا:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172322" href="https://academy.hsoub.com/uploads/monthly_2025_05/998046730_.jpg.56076e0125f7e650c5f152306948bd4f.jpg" rel=""><img alt="مخطط توصيل المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="172322" data-unique="at1bf1w1v" style="width: 640px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.7c829139fb0da1e77e55a453a14541e8.jpg"> </a>
</p>

<h2 id="arduino-2">
	الكود البرمجي لمشروع بناء مسطرة إلكترونية باستخدام الأردوينو Arduino
</h2>

<p>
	سندمج الكود الخاص بشاشة LCD مع كود حساس الأمواج فوق الصوتية UltraSonic Sensor وعرض قيمة المسافة على الشاشة بدلًا من عرضها على نافذة الاتصال التسلسلية Serial Monitor فيكون الكود النهائي بالشكل التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7743_33" style=""><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;LiquidCrystal.h&gt;</span><span class="pln">
</span><span class="typ">LiquidCrystal</span><span class="pln"> lcd</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">);</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> trigPin </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> echoPin </span><span class="lit">8</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> duration</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> distance</span><span class="pun">;</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">16</span><span class="pun">,</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">trigPin</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">echoPin</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">

  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Hello World"</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">clear</span><span class="pun">();</span><span class="pln">

  digitalWrite</span><span class="pun">(</span><span class="pln">trigPin</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  delayMicroseconds</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="pln">trigPin</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  duration </span><span class="pun">=</span><span class="pln"> pulseIn</span><span class="pun">(</span><span class="pln">echoPin</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  distance </span><span class="pun">=</span><span class="pln"> duration </span><span class="pun">*</span><span class="pln"> </span><span class="pun">(</span><span class="lit">0.0343</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">2</span><span class="pun">);</span><span class="pln">

  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Digital Ruler"</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">setCursor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"Distance = "</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="pln">distance</span><span class="pun">);</span><span class="pln">
  lcd</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"cm"</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-3">
	محاكاة لمشروع بناء مسطرة إلكترونية باستخدام الأردوينو Arduino
</h2>

<p>
	سنتبع نفس الخطوات التي تعلمناها في مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/" rel="">التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a> للوصول الى الصفحة الخاصة بمحاكاة مشروعك على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي </a><a href="https://wokwi.com/" rel="external nofollow">Wokw</a><a href="https://wokwi.com/" rel="external nofollow">i</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172311" href="https://academy.hsoub.com/uploads/monthly_2025_05/516491238_.JPG.4a2c7b7fb6b442becedffbd811da6bd3.JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="172311" data-unique="3fyhpnbro" style="width: 640px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.JPG.6fb18ee15dbbf8e9ddddc02cc03352a2.JPG"> </a>
</p>

<p>
	سنضيف الآن العناصر الإلكترونية اللازمة للمشروع وهي: BreadBoard و LCD 16x2 و Potentiometer
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172313" href="https://academy.hsoub.com/uploads/monthly_2025_05/1519470585_.JPG.4e8a2f2bd6707f6aa663475eb0a8bb8b.JPG" rel=""><img alt="إضافة العناصر في موقع وكوي.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="172313" data-ratio="50.78" data-unique="g7plyafzp" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.JPG.136d95b7985518f61528c17d2605c580.JPG"></a>
</p>

<p>
	بعد ذلك سنرتب العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا. وعند الانتهاء من كل ما سبق، سنكتب الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة.
</p>

<p>
	سنلاحظ أنه عند بداية تشغيل المشروع ستطبع العبارة <strong>Hello World</strong> على الشاشة في السطر الأول لمدة ثانية واحدة، بعد ذلك ستطبع العبارة <strong>Digital Ruler</strong> على الشاشة في السطر الأول دائمًا، وفي السطر الثاني سيطبع في بدايته <strong>= Distance</strong> ومن ثم قيمة المسافة وبجانبها الواحدة وهي سم cm.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172330" href="https://academy.hsoub.com/uploads/monthly_2025_05/12.jpg.6ba2721e357a02500c4b855f690bee61.jpg" rel=""><img alt="لخطوة 1 و2 في المشروع.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172330" data-ratio="42.67" data-unique="1gooyrsdd" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/12.thumb.jpg.923416b1b72cb2e104c61acabd5fec39.jpg"></a>
</p>

<p>
	نستطيع محاكاة تغيير المسافة من خلال النقر على الحساس أثناء تشغيل المشروع، فتظهر لنا نافذة في الأعلى تحتوي على شريط نستطيع تحريكه لتغيير قيمة المسافة كما يلي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172331" href="https://academy.hsoub.com/uploads/monthly_2025_05/349672_.jpg.89bd2447c9b61f8a7bd4a73f7204e975.jpg" rel=""><img alt="طريقة تغير المسافة في المحاكاة.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172331" data-ratio="37.44" data-unique="h1fqbeu02" style="width: 640px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.026ad90c798ebf4a4f24fcf58bf0420d.jpg"></a>
</p>

<p>
	وعند تحريك الشريط المسؤول عن قيمة المسافة، سيحصل تحديث للقيمة المعروضة على الشاشة كل نصف ثانية باستمرار.
</p>

<p style="text-align: center;">
	<img alt="النتيجة النهائية لمحاكاة المشروع.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="172324" data-ratio="47.50" data-unique="kucgm05ul" width="640" src="https://academy.hsoub.com/uploads/monthly_2025_05/949492748_.gif.5b0b8810c523251a5e3d2bf10ab38698.gif">
</p>

<h2 id="">
	الخاتمة
</h2>

<p>
	بهذا نكون قد تعلمنا في هذا المقال كيفية إنشاء مسطرة إلكترونية باستخدام أردو ينو، كما وضحنا كيفية قياس المسافة من خلال حساس الأمواج فوق الصوتية Ultrasonic Sensor ولوحة الأردوينو Arduino، وتعرفنا على عنصر إلكتروني جديد وهو شاشة الكريستال السائلة LCD وأنواعها وكيفية عرض النصوص عليها وإضافة مؤثرات حركية، وفي النهاية استعرضنا خطوات محاكاة للمشروع من خلال منصة وكوي Wokwi.
</p>

<h2 id="-1">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D9%8A%D8%A7%D8%B3-%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%B2%D9%88%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2574/" rel=""> نظام قياس عدد الزوار باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="" rel=""> التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="" rel="">إضاءة زينة بأنماط مختلفة باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="" rel=""> التحكم بعدد الليدات المضاءة وشدة إضاءتها باستخدام أردوينو Arduino</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2575</guid><pubDate>Wed, 02 Jul 2025 16:04:01 +0000</pubDate></item><item><title>&#x646;&#x638;&#x627;&#x645; &#x642;&#x64A;&#x627;&#x633; &#x639;&#x62F;&#x62F; &#x627;&#x644;&#x632;&#x648;&#x627;&#x631; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%A7%D9%85-%D9%82%D9%8A%D8%A7%D8%B3-%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D8%B2%D9%88%D8%A7%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2574/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_05/Arduino.png.ac98f7be10ba5288d9800970d90bf671.png" /></p>
<p>
	سنوظف في هذا المقال ما تعلمناه سابقًا في بناء مشروع جديد من سلسلتنا التعليمية <a href="" rel="">دليل أردوينو</a> وهو عبارة عن نظام لقياس عداد الزوار باستخدام لوحة الأردوينو أونو Arduino Uno، حيث يمكن استخدامه في العديد من الأماكن، لنفترض أننا بحاجة لمعرفة عدد الأشخاص ضمن متجر أو مكتب مثلًا، بحيث إذا كان أكبر من العدد المسموح به، فيجب أن ينتظر الشخص حتى خروج أحد الأشخاص من المكان حتى يدخل هو. 
</p>

<p>
	ولبناء هذا المشروع، سنستخدم عنصرًا جديدًا يتمثل في حساس الأشعة تحت الحمراء Infrared Sensor الذي سنتعرف عليه في هذا المقال.
</p>

<h2 id="arduino">
	فكرة مشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino
</h2>

<p>
	سنبني نظامًا لقياس عدد الزوار ضمن متجر يتسع لتسعة أشخاص على الأكثر، وذلك من خلال حساسين من حساسات الأشعة تحت الحمراء Infrared Sensors وشاشة العرض ذات السبع أجزاء Seven Segment Display، حيث يوضع الحساس الأول عند باب الدخول وعند مرور أي جسم أمام هذا الحساس ستزداد قيمة العداد بمقدار واحد، والحساس الثاني يوضع عند باب الخروج وعند مرور أي جسم من أمام هذا الحساس ستنقص قيمة العداد بمقدار واحد، وتعرض قيمة عدد الأشخاص الموجودين داخل المتجر على الشاشة وتحدث باستمرار، والمخطط الآتي يوضح آلية العمل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172300" href="https://academy.hsoub.com/uploads/monthly_2025_05/954997583_.jpg.1f4a960a1223bfe7707760f404ed5bfd.jpg" rel=""><img alt="المخطط التدفقي للمشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="172300" data-unique="scnycnavf" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.667d49106bd3b672bcb97dedcd5cf230.jpg"> </a>
</p>

<h2 id="arduino-1">
	العناصر المستخدمة لمشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino
</h2>

<p>
	سنستخدم مجموعةً من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		حساس الأشعة تحت الحمراء Infrared Sensor عدد 2
	</li>
	<li>
		مقاومة بقيمة 220 أوم عدد 7
	</li>
	<li>
		شاشة العرض ذات السبع أجزاء Seven Segment Display من نوع CC
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<p>
	تعرفنا في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%84%D8%B9%D8%A8%D8%A9-%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2567/" rel="">المقال السابق</a> على شاشة العرض ذات السبع أجزاء Seven Segment Display وأهميتها في بناء مشاريع إلكترونية تفاعلية وبنينا لعبة بسيطة لتخمين الأرقام، وسنتعرف في هذا المقال على عنصر جديد ومهم وهو حساس الأشعة تحت الحمراء Infrared Sensor.
</p>

<h2 id="infraredsensor">
	حساس الأشعة تحت الحمراء Infrared Sensor
</h2>

<p>
	يعرف اختصارًا IR Sensor وهو عبارة عن جهاز إلكتروني يتكون من مجموعة من العناصر الإلكترونية المتصلة مع بعضها في دارة إلكترونية، ومن أهم هذه العناصر هي المرسل IR Emitter والمستقبل IR Receiver اللذان يعملان بالاعتماد على الأشعة تحت الحمراء.
</p>

<ul>
	<li>
		<strong>المرسل IR Emitter</strong>: عبارة عن عنصر إلكتروني يشبه الليد من حيث الشكل، ولكن يختلف في الوظيفة، حيث عند تغذيته بالجهد الكهربائي المناسب، يرسل أشعة تحت الحمراء غير المرئية للعين البشرية
	</li>
	<li>
		<strong>المستقبل IR Receiver</strong>: عبارة عن عنصر إلكتروني يشبه المرسل من حيث الشكل ولكن يعاكسه في الوظيفة ويستخدم في استقبال واكتشاف الأشعة تحت الحمراء ويحولها إلى إشارة كهربائية
	</li>
	<li>
		<strong>مضخم عملياتي Op-Amp</strong>: عبارة عن عنصر إلكتروني وظيفته تضخيم الإشارة الكهربائية الموجود على أطراف لمستقبل IR Receiver وتحويلها من إشارة تشابهية إلى إشارة رقمية LOW و HIGH
	</li>
	<li>
		<strong>مقاومة متغيرة</strong>: تكون على شكل يشبه البرغي، وظيفتها معايرة مجال المسافة التي يعمل عندها الحساس
	</li>
	<li>
		<strong>عناصر إلكترونية أخرى</strong>: مثل الليدات والمقاومات والمكثفات الإلكترونية
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172302" href="https://academy.hsoub.com/uploads/monthly_2025_05/1166312412_.jpg.57b833413ef93f56321eaff512035765.jpg" rel=""><img alt="بنية الحساس" class="ipsImage ipsImage_thumbnailed" data-fileid="172302" data-unique="liciyddaz" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.67f5580e1dd4d110d9ad47e9a235fa73.jpg"> </a>
</p>

<h3 id="infraredsensor-1">
	آلية عمل حساس الأشعة تحت الحمراء Infrared Sensor
</h3>

<p>
	يعمل هذا الحساس بطريقة بسيطة جدًا، وذلك بالاعتماد على انعكاس الضوء حيث يرسل الليد المرسل IR Emitter إشارةً تتكون من أشعة تحت الحمراء Infrared، وفي حال وجود أي حاجز أو جسم أمام الحساس تنعكس هذه الإشارة وتعود ليستشعرها الليد المستقبل IR Receiver ويحولها إلى إشارة كهربائية، ومن ثم تدخل هذه الإشارة لدارة تحويل رقمية لتعالج وتصبح مناسبة للتعامل معها مع <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">لوحة الأردوينو</a> أو أي متحكم آخر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172305" href="https://academy.hsoub.com/uploads/monthly_2025_05/1439567127_.jpg.9f26ffa29821aec673b30ac32c17a543.jpg" rel=""><img alt="آلية عمل الحساس .jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172305" data-ratio="66.67" data-unique="2k0tr4pk3" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.0b50cb9267feed493f188087bc9badb9.jpg"></a>
</p>

<h3 id="infraredsensor-2">
	أقطاب حساس الأشعة تحت الحمراء Infrared Sensor
</h3>

<p>
	يحتوي حساس الأشعة تحت الحمراء IR Sensor على ثلاثة أقطاب وهي:
</p>

<ul>
	<li>
		<strong>القطب الأول من اليمين</strong>: هو قطب التغذية الموجب رمزه VCC ويوصل مع القطب 5v في لوحة الأردوينو
	</li>
	<li>
		<strong>القطب الثاني</strong>: هو قطب التغذية السالب رمزه GND ويوصل مع القطب الأرضي في لوحة الأردوينو
	</li>
	<li>
		<strong>القطب الثالث</strong>: هو قطب خرج الحساس رمزه OUT ويعطي إشارة LOW في حال وجود جسم أمامه وإشارة HIGH في حال عدم وجود جسم ويوصل هذا القطب مع أي قطب رقمي في لوحة الأردوينو
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172303" href="https://academy.hsoub.com/uploads/monthly_2025_05/1727810784_.jpg.4c1c11dd3e8f3a315c4dc6c174e2d37a.jpg" rel=""><img alt="أقطاب الحساس.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172303" data-ratio="56.44" data-unique="keoywlqnx" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.53e22d4b672aff9fd6c4eb57c43d2bed.jpg"></a>
</p>

<h3 id="">
	مواصفات حساس الأشعة تحت الحمراء
</h3>

<ul>
	<li>
		<strong>جهد العمل</strong>: 3.3 الى 5 فولت
	</li>
	<li>
		<strong>تيار العمل</strong>: 20 مللي أمبير
	</li>
	<li>
		<strong>مجال الاستشعار</strong>: 2 الى 10 سم
	</li>
	<li>
		<strong>زاوية الاستشعار</strong>: 35 درجة
	</li>
	<li>
		<strong>حالة الخرج</strong>: LOW في حالة الانعكاس و HIGH في حالة عدم الانعكاس
	</li>
</ul>

<h3 id="infraredsensorarduino">
	ربط حساس الأشعة تحت الحمراء Infrared Sensor مع الأردوينو Arduino
</h3>

<p>
	سنبني تطبيقًا بسيطًا لفهم آلية استخدام الحساس مع لوحة الأردوينو أونو Arduino Uno، حيث وظيفة هذا التطبيق هو اكتشاف العوائق الموجودة أمام الحساس وتشغيل ليد في حال وجود أي جسم أمامه، ولتنفيذ التطبيق علينا اتباع الخطوات الآتية:
</p>

<ul>
	<li>
		وصل قطب التغذية الموجب للحساس Vcc مع القطب 5v في لوحة الأردوينو أونو
	</li>
	<li>
		وصل قطب التغذية السالب للحساس GND مع القطب GND في لوحة الأردوينو أونو
	</li>
	<li>
		وصل قطب خرج الحساس مع القطب رقم 3 في لوحة الأردوينو أونو
	</li>
	<li>
		لا نحتاج لتوصيل ليد خارجي لأننا سنستخدم الليد الموجود في لوحة الأردوينو أونو ويكون موصول داخليًا مع القطب رقم 13
	</li>
</ul>

<p>
	الصورة الآتية توضح طريقة التوصيل:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172309" href="https://academy.hsoub.com/uploads/monthly_2025_05/1416819398_.jpg.242244a569d123975aba08a306757084.jpg" rel=""><img alt="توصيل الحساس مع الأردوينو .jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="172309" data-ratio="75.57" data-unique="oehv67ldy" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.d389e21c7852dd96564b71b43098d1fa.jpg"></a>
</p>

<p>
	الخطوة التالية هي كتابة الكود البرمجي للتطبيق. 
</p>

<p>
	سنضبط القطب رقم 13 الخاص بالليد في الدالة الرئيسية <a href="https://wiki.hsoub.com/Arduino/setup" rel="external"><code>()setup </code></a>كقطب خرج <code>OUTPUT</code>، والقطب رقم 3 الخاص بالحساس كقطب دخل <code>INPUT</code>، وذلك من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external"><code>()pinMode</code></a> التي تأخذ وسيطين هما رقم القطب ونوع القطب وتكون إما خرج <code>OUTPUT</code> أو دخل <code>INPUT</code>.
</p>

<p>
	أما في الدالة التكرارية <code>()loop</code>، فسنقرأ حالة للقطب الموصول معه خرج الحساس من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/digital_io/digitalread" rel="external"><code>()digitalRead</code></a> التي تأخذ وسيطًا واحدًا وهو رقم القطب، وتعيد القيمة الفيزيائية الموجودة على القطب، ومن ثم سنتحقق من هذه القيمة من خلال العبارة الشرطية <code>()if</code> في حال كانت القيمة <code>LOW</code> أي بحالة وجود جسم أمام الحساس، حيث سنشغل الليد LED الموصول على القطب رقم 13 من خلال الدالة المدمجة <a href="" rel=""><code>()digitalWrite</code></a> التي تأخذ وسيطين هما رقم القطب وقيمة القطب، وذلك بإعطائه قيمة 1 منطقي أو <code>HIGH</code> للتشغيل و 0 منطقي أو <code>LOW</code> للإطفاء؛ أما في حال كانت القيمة <code>HIGH</code> بمعنى أن حالة عدم وجود حاجز أمام الحساس، فسنطفئ الليد LED.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_19" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">(){</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">(){</span><span class="pln">
  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="lit">3</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> LOW</span><span class="pun">){</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد توصيل العناصر وكتابة الكود البرمجي في بيئة Arduino IDE، نصل كابل البرمجة مع لوحة أردوينو أونو والحاسب ومن ثم نذهب إلى بيئة البرمجية للأردوينو Arduino IDE لاختيار نوع لوحة الأردوينو ورقم المنفذ الموصل معه على الحاسب، وذلك من خلال القائمة العلوية <code>Tools</code> ومن ثم <code>Boards</code> لاختيار نوع اللوحة و<code>Port</code> لاختيار رقم المنفذ، بعد ذلك نضغط على أيقونة <code>Upload</code> لرفع الكود البرمجي على لوحة الأردوينو.
</p>

<p>
	بعد رفع الكود البرمجي على لوحة الأردوينو أونو بنجاح، لا بد لنا من تمرير يدنا أمام الحساس بمسافة قريبة منه، وتكون أقل من 10 سم، وعندها نلاحظ إضاءة الليد LED الموجود في لوحة الأردوينو أونو Arduino Uno.
</p>

<h2 id="arduino-2">
	مخطط التوصيل لمشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino
</h2>

<p>
	سنتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino لتنفيذ فكرة المشروع:
</p>

<ul>
	<li>
		وصل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
	</li>
	<li>
		تثبيت شاشة العرض ذات السبع أجزاء Seven Segment Display على لوحة توصيل التجارب BreadBoard ثم صل أقطاب الشاشة مع المقاومات الإلكترونية ولوحة الأردوينو Arduino بالترتيب التالي:
		<ul>
			<li>
				وصل الرِّجل ذات الرمز A من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 2 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل ذات الرمز B من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 3 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل ذات الرمز C من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 4 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل ذات الرمز D من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 5 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل ذات الرمز E من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 6 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل ذات الرمز F من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 7 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل ذات الرمز G من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 8 في لوحة الأردوينو
			</li>
			<li>
				وصل الرِّجل المشتركة CO من الشاشة مع القطب السالب GND في لوحة الأردوينو
			</li>
			<li>
				وصل قطب التغذية الموجب Vcc لحساس الأشعة تحت الحمراء IR Sensor الأول والثاني مع المسرى الموجب للوحة التجارب BreadBoard
			</li>
			<li>
				وصل قطب التغذية السالب GND لحساس الأشعة تحت الحمراء IR Sensor الأول والثاني مع المسرى السالب للوحة التجارب BreadBoard
			</li>
			<li>
				وصل قطب الخرج OUT لحساس الأشعة تحت الحمراء IR Sensor الأول مع القطب رقم 9، والثاني مع القطب رقم 10 في لوحة الأردوينو أونو Arduino UNO
			</li>
		</ul>
	</li>
</ul>

<p>
	توضح الصورة الآتية مخطط التوصيل لمشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172301" href="https://academy.hsoub.com/uploads/monthly_2025_05/1001972410_.JPG.f2edb2d43909969d768d605a09422b33.JPG" rel=""><img alt="مخطط توصيل المشروع العاشر" class="ipsImage ipsImage_thumbnailed" data-fileid="172301" data-unique="c3vgzmcnt" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.JPG.397a85dec653564593f0133a8a576747.JPG"> </a>
</p>

<h2 id="arduino-3">
	الكود البرمجي لمشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino
</h2>

<p>
	في بداية الكود البرمجي سنعرف عدة متغيرات خاصة بأقطاب العناصر الإلكترونية الموصولة مع لوحة الأردوينو أونو Arduino Uno، فكما رأينا في مخطط التوصيل، سنوصل أقطاب خرج الحساسات مع الأقطاب 9 و 10 في لوحة الأردوينو أونو Arduino Uno وسنخزنها في متغيرات من نوع <code>int</code>؛ أما بالنسبة لأقطاب شاشة العرض ذات السبع أجزاء Seven Segment فستوصل على الترتيب مع الأقطاب 2 وحتى 8 وستخزَّن هذه الأقطاب داخل مصفوفة أحادية بحجم 7 عناصر من نوع <code>int</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_17" style=""><span class="typ">int</span><span class="pln"> </span><span class="typ">Inc_Sensor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Dec_Sensor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> displayPins </span><span class="pun">[</span><span class="lit">7</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">};</span></pre>

<p>
	سنحتاج أيضًا لتعريف خمسة متغيرات أخرى، أولهم هو <code>Number_Of_Visitors</code> من نوع <code>int</code> وقيمة ابتدائية تساوي الصفر، وهو خاص بتخزين قيمة عدد الزوار لأن نوع القيم هنا ستكون من نوع عدد صحيح وضمن المجال من 0 وحتى 9؛ أما المتغيرات الأربعة الأخرى، فهي خاصة بقراءة وتخزين قيمة الحساسات الحالية والقيم السابقة لها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_15" style=""><span class="typ">int</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Las_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Las_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></pre>

<p>
	كما تعلمنا في <a href="" rel="">المقال السابق</a> نستطيع عرض الأرقم على شاشة العرض ذات السبع أجزاء من خلال إعطاء أوامر التشغيل والإطفاء بشكل منفصل لكل ليد من ليدات الشاشة، ولكن هذه الطريقة ستستهلك أسطر برمجية كثيرة، فعند كل رقم نريد إظهاره على الشاشة، سنحتاج إلى 7 أسطر، بالتالي استهلاك كبير لذاكرة البرنامج Flash Memory في الأردوينو Arduino، ولذلك سنبني دالةً خاصةً تستقبل وسيطًا واحدًا وهو الرقم الذي نريد عرضه على الشاشة، وتعرض هذه الدالة الرقم بطريقة ديناميكية بسيطة وسهلة.
</p>

<p>
	سنعرف داخل هذه الدالة مصفوفةً من نوع بايت <code>byte</code> بحجم 10 عناصر لأنه لدينا عشرة أرقام من الرقم 0 إلى الرقم 9؛ وبداخل هذه المصفوفة سنكتب القيم الخاصة بتشغيل وإطفاء ليدات الشاشة بالنظام الثنائي binary system بنفس قيم الجدول السابق، وبعد ذلك سنستخدم <a href="https://wiki.hsoub.com/Arduino/for" rel="external">حلقة تكرارية ()for</a> للمرور على جميع عناصر المصفوفة <code>[]displayPins</code> التي تخزن أرقام أقطاب الشاشة وإعطاء أمر التشغيل أو الإطفاء المقابل للقطب من خلال المصفوفة <code>[]numbers</code> باستخدام الدالة المدمجة <code>()digitalWrite</code>.
</p>

<p>
	وللوصول الصحيح للقيمة المقابلة لكل قطب من الشاشة نستخدم الدالة المدمجة <a href="" rel=""><code>()bitRead</code></a> التي تأخذ وسيطين: الأول هو الرقم الذي نريد قراءة بت واحد منه، أما الثاني هو رقم البت حيث يبدأ من الرقم 0 للبت الأول من اليمين، وتعيد هذه الدالة قيمة هذا البت 1 أو 0.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_21" style=""><span class="kwd">void</span><span class="pln"> displayNumber</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> num</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> byte numbers</span><span class="pun">[</span><span class="lit">10</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="lit">0B0111111</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 0</span><span class="pln">
    </span><span class="lit">0B0000110</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 1</span><span class="pln">
    </span><span class="lit">0B1011011</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 2</span><span class="pln">
    </span><span class="lit">0B1001111</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 3</span><span class="pln">
    </span><span class="lit">0B1100110</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 4</span><span class="pln">
    </span><span class="lit">0B1101101</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 5</span><span class="pln">
    </span><span class="lit">0B1111101</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 6</span><span class="pln">
    </span><span class="lit">0B0000111</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 7</span><span class="pln">
    </span><span class="lit">0B1111111</span><span class="pun">,</span><span class="pln"> </span><span class="com">// 8</span><span class="pln">
    </span><span class="lit">0B1101111</span><span class="pln">  </span><span class="com">// 9</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">

  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">displayPins</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> bitRead</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">[</span><span class="pln">num</span><span class="pun">],</span><span class="pln"> i</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنضبط الأقطاب الخاصة بحساسات الأشعة تحت الحمراء IR Sensors في الدالة الرئيسية <code>()setup </code>كأقطاب دخل <code>INPUT</code>، والأقطاب الخاصة بالشاشة كأقطاب خرج <code>OUTPUT</code>، وذلك من خلال الدالة المدمجة <code>()pinMode</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_23" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Inc_Sensor</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Dec_Sensor</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    pinMode</span><span class="pun">(</span><span class="pln">displayPins</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	من الممكن استخدام الطريقة التالية في آلية العمل داخل الدالة التكرارية <code>()loop</code>:
</p>

<ol>
	<li>
		قراءة قيمة الحساس الأول المسؤول عن استشعار زيادة عدد الزوار
	</li>
	<li>
		قراءة قيمة الحساس الثاني المسؤول عن استشعار نقصان عدد الزوار
	</li>
	<li>
		في حالة اكتشاف جسم أمام الحساس الأول، ستزيد قيمة المتغير الخاص بعدد الزوار بمقدار واحد
	</li>
	<li>
		في حالة اكتشاف جسم أمام الحساس الثاني، ستنقص قيمة المتغير الخاص بعدد الزوار بمقدار واحد
	</li>
	<li>
		عرض قيمة المتغير الخاص بعدد الزوار على شاشة العرض ذات السبع أجزاء Seven Segment Display
	</li>
</ol>

<p>
	ولكن هناك مشكلة تقنية مع الطريقة السابقة، وهي أنه في حال وقوف الجسم أمام الحساس سواءً الأول أو الثاني، فستزداد أو تنقص قيمة المتغير الخاص بعدد الزوار أكثر من مرة، ولذلك سنتبع طريقةً تعلمناها في مشروع <a href="" rel="">التحكم بالليد LED باستخدام مفتاح الضغط اللحظي Push Button والأردوينو Arduino</a>، وهي التحقق من القيمة الحالية والسابقة لكل حساس، فإذا كانت القيمة الحالية للحساس الأول <code>LOW</code> بمعنى حالة وجود جسم أمام الحساس، وكانت الحالة السابقة له <code>HIGH</code> أي حالة عدم وجود جسم أمام الحساس، فعندها سنزيد قيمة المتغير الخاص بعدد الزوار بمقدار واحد؛ أما في حال كانت القيمة الحالية للحساس الأول <code>LOW</code> وهي حالة وجود جسم أمام الحساس وكانت الحالة السابقة له أيضًا <code>LOW</code> أي حالة وجود جسم أمام الحساس، فعندها سيكون الجسم ما يزال موجود أمام الحساس، وفي هذه الحالة لن نزيد قيمة المتغير الخاص بعدد الزوار، والأمر نفسه بالنسبة للحساس الثاني.
</p>

<p>
	في بداية الدالة التكرارية <code>()loop</code> سنقرأ القيمة الحالية لكل من الحساس الأول والثاني من خلال الدالة المدمجة <code>()digitalRead</code> وسنخزنها في المتغيرات الخاصة بها <code>Cur_Dec_Val</code> <code>Cur_Inc_Val</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_25" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="typ">Inc_Sensor</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="typ">Dec_Sensor</span><span class="pun">);</span></pre>

<p>
	سنتحقق بعد ذلك من القيمة الحالية والسابقة لحساس الأشعة تحت الحمراء IR Sensor الأول المسؤول عن زيادة قيمة المتغير الخاص بعدد الزوار وذلك من خلال <a href="https://wiki.hsoub.com/Arduino/if" rel="external">العبارة الشرطية ()if</a>، ففي حال كانت القيمة الحالية هي <code>LOW</code> أي حالة وجود جسم أمام الحساس الآن والقيمة السابقة هي <code>HIGH</code> أي عدم وجود جسم أمام الحساس سابقًا؛ فعندها ستزداد قيمة المتغير الخاص بعدد الزوار بمقدار واحد وفي حال أصبحت قيمة هذا المتغير أكبر من 9 لن تزداد قيمته.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_27" style=""><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="typ">Cur_Inc_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Las_Inc_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> HIGH</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Number_Of_Visitors</span><span class="pun">++;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">9</span><span class="pun">)</span><span class="pln">  </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	سنتحقق أيضًا من القيمة الحالية والسابقة لحساس الأشعة تحت الحمراء IR Sensor الثاني المسؤول عن نقصان قيمة المتغير الخاص بعدد الزوار من خلال العبارة الشرطية <code>()if</code> في حال كانت القيمة الحالية هي <code>LOW</code> والقيمة السابقة هي <code>HIGH</code>، فعندها ستنقص قيمة المتغير الخاص بعدد الزوار بمقدار واحد؛ وفي حال أصبحت قيمة هذا المتغير أصغر من 0، فلن تنقص قيمته.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_29" style=""><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="typ">Cur_Dec_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Las_Dec_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> HIGH</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Number_Of_Visitors</span><span class="pun">--;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	سنحدّث القيمة السابقة لكل من الحساس الأول والثاني للقيمة الحالة ومن ثم سنعرض قيمة عدد الزوار على شاشة العرض ذات السبع أجزاء من خلال استدعاء الدالة الخاصة <code>()displayNumber</code> التي كتبناها سابقًا وسنمرر المتغير <code>Number_Of_Visitors</code> كوسيط لها، مع إضافة تأخير زمني صغير في النهاية بمقدار 50 مللي ثانية من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/time/delay" rel="external">()delay</a></code> التي تأخذ وسيطًا واحدًا وهو قيمة التأخير بالمللي ثانية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_31" style=""><span class="typ">Las_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Cur_Inc_Val</span><span class="pun">;</span><span class="pln">
</span><span class="typ">Las_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Cur_Dec_Val</span><span class="pun">;</span><span class="pln">
displayNumber</span><span class="pun">(</span><span class="typ">Number_Of_Visitors</span><span class="pun">);</span><span class="pln">
delay</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-4">
	الكود البرمجي النهائي لمشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino
</h2>

<p>
	بعد كتابة جميع أجزاء الكود السابقة في ملف واحد نحصل على الكود النهائي التالي للمشروع:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2389_34" style=""><span class="typ">int</span><span class="pln"> </span><span class="typ">Inc_Sensor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Dec_Sensor</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> displayPins </span><span class="pun">[</span><span class="lit">7</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">2</span><span class="pun">,</span><span class="pln"> </span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">};</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Las_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Las_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> displayNumber</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> num</span><span class="pun">)</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln">  byte numbers</span><span class="pun">[</span><span class="lit">10</span><span class="pun">]</span><span class="pln">  </span><span class="pun">=</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
    </span><span class="lit">0B0111111</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 0</span><span class="pln">
    </span><span class="lit">0B0000110</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 1</span><span class="pln">
    </span><span class="lit">0B1011011</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 2</span><span class="pln">
    </span><span class="lit">0B1001111</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 3</span><span class="pln">
    </span><span class="lit">0B1100110</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 4</span><span class="pln">
    </span><span class="lit">0B1101101</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 5</span><span class="pln">
    </span><span class="lit">0B1111101</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 6</span><span class="pln">
    </span><span class="lit">0B0000111</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 7</span><span class="pln">
    </span><span class="lit">0B1111111</span><span class="pun">,</span><span class="pln">  </span><span class="com">// 8</span><span class="pln">
    </span><span class="lit">0B1101111</span><span class="pln">   </span><span class="com">// 9</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">

  </span><span class="kwd">for</span><span class="pln">  </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln">  </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln">  </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">displayPins</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln">  bitRead</span><span class="pun">(</span><span class="pln">numbers</span><span class="pun">[</span><span class="pln">num</span><span class="pun">],</span><span class="pln"> i</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Inc_Sensor</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Dec_Sensor</span><span class="pun">,</span><span class="pln"> INPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    pinMode</span><span class="pun">(</span><span class="pln">displayPins</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="typ">Inc_Sensor</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Cur_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="typ">Dec_Sensor</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="typ">Cur_Inc_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Las_Inc_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> HIGH</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Number_Of_Visitors</span><span class="pun">++;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">9</span><span class="pun">)</span><span class="pln">  </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="typ">Cur_Dec_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Las_Dec_Val</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> HIGH</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Number_Of_Visitors</span><span class="pun">--;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="typ">Number_Of_Visitors</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="typ">Las_Inc_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Cur_Inc_Val</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">Las_Dec_Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Cur_Dec_Val</span><span class="pun">;</span><span class="pln">
  displayNumber</span><span class="pun">(</span><span class="typ">Number_Of_Visitors</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">50</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-5">
	محاكاة لمشروع نظام قياس عدد الزوار باستخدام الأردوينو Arduino
</h2>

<p>
	تعرفنا في المشاريع السابقة على منصة وكوي Wokwi التي تتيح لنا إمكانية محاكاة لوحة الأردوينو ومجموعة متنوعة من العناصر الإلكترونية؛ ولكن على الرغم من هذا التنوع إلا أنها لا تحتوي على جميع العناصر الموجودة في الواقع، فضمن هذه العناصر، حساس الأشعة تحت الحمراء الذي لم يتم إضافته في المنصة حتى الآن، ولكن نستطيع عمل محاكاة لفكرة المشروع مع تعديل بسيط يكمن في استبدال حساس الأشعة تحت الحمراء IR Sensor بمفتاح الضغط اللحظي Push Button، فكلاهما يستخدمان كعنصر دخل رقمي مع الأردوينو، والإختلاف بينهما أن الحساس هو عنصر إلكتروني يعمل تلقائيًا عند وجود جسم أمامه بينما المفتاح هو عنصر ميكانيكي يحتاج للضغط عليه لكي يعمل.
</p>

<p>
	سنتبع نفس الخطوات التي تعلمناها في مقالٍ <a href="" rel="">التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a> للوصول الى الصفحة الخاصة بمحاكاة مشروعك على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172297" href="https://academy.hsoub.com/uploads/monthly_2025_05/1308803875_.JPG.d5f3ecd5b46329375a5d7d4bd3703b6d.JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="172297" data-unique="x9npt4vb3" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.JPG.02315cd11b3d7f438e5b665025e80098.JPG"> </a>
</p>

<p>
	سنضيف الآن العناصر الإلكترونية اللازمة للمشروع، والمتمثللة في كل من Seven Segment و Push Button و Resistors و BreadBoard.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172298" href="https://academy.hsoub.com/uploads/monthly_2025_05/2029077775_.JPG.184050a8a327e9e991d08187342b5487.JPG" rel=""><img alt="إضافة العناصر في موقع وكوي.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="172298" data-ratio="63.00" data-unique="xhi953s66" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.JPG.8b61f4c875aac1e4ee19ef1bcbe0121a.JPG"></a>
</p>

<p>
	غيّر قيم مقاومات الشاشة إلى 220 أوم من خلال الضغط عليها فتظهر لك نافذة في الأعلى تمكنك من تغير القيمة والواحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172296" href="https://academy.hsoub.com/uploads/monthly_2025_05/674042344_.JPG.787a32e06fa8ab5c733a85d2a7ce9a8c.JPG" rel=""><img alt="تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="172296" data-unique="hwn8abm5i" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.JPG.cbea768b47f096266b4236cddf424770.JPG"> </a>
</p>

<p>
	بالطريقة نفسها يمكننا تغيير نوع الشاشة إلى Anode أو Cathode، كما يمكننا تغيير لونها أيضًا من خلال الضغط عليها، حيث ستظهر لنا نافذة بالأعلى نستطيع من خلالها تحديد النوع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="172306" href="https://academy.hsoub.com/uploads/monthly_2025_05/1853133687_.JPG.a60f3c8b11074dc8b90942ddca8ac575.JPG" rel=""><img alt="تغير نوع الشاشة ولونها" class="ipsImage ipsImage_thumbnailed" data-fileid="172306" data-unique="2fo5iac97" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/1853133687_.JPG.a60f3c8b11074dc8b90942ddca8ac575.JPG"> </a>
</p>

<p>
	بعد ذلك نرتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الآتي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="172299" href="https://academy.hsoub.com/uploads/monthly_2025_05/1274990664_.jpg.a5a9a8f30768e42a8a493c0c90b48cc2.jpg" rel=""><img alt="مخطط محاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="172299" data-unique="hrkwah5t6" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_05/.thumb.jpg.dc0b40bbda25b63ad0e5ee7e4101b611.jpg"> </a>
</p>

<p>
	نكتب الكود البرمجي في الجزء الخاص به ثم شغل المحاكاة، ونلاحظ الحالات الآتية:
</p>

<ol>
	<li>
		عند بداية التشغيل، ستُعرض القيمة الإبتدائية لمتغير الخاص بعدد الزوار وهي 0 على شاشة العرض ذات السبع أجزاء ومن ثم بانتظار مرور جسم أمام حساس الأشعة تحت الحمراء الأول الخاص بباب الدخول
	</li>
	<li>
		ستزداد قيمة المتغير الخاص بعدد الزوار بمقدار واحد وتتحدث القيمة المعروضة على الشاشة عند مرور جسم أمام حساس الأشعة تحت الحمراء الأول، ويجب هنا الضغط على مفتاح الضغط اللحظي الأول في المحاكاة
	</li>
	<li>
		ستنقص قيمة المتغير الخاص بعدد الزوار بمقدار واحد وتتحدث القيمة المعروضة على الشاشة عند مرور جسم أمام حساس الأشعة تحت الحمراء الثاني عند الضغط على مفتاح الضغط اللحظي الثاني في المحاكاة
	</li>
	<li>
		في حال وقوف الجسم إمام الحساس الأول أو الثاني، لن تتغير قيمة المتغير الخاص بعدد الزوار إلا مرة واحدة.
	</li>
</ol>

<h2 id="-1">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا المقال خطوات تصميم وتنفيذ مشروع نظام لقياس عدد الزوار باستخدام حساس الأشعة تحت الحمراء IR Sensor الذي تعرفنا على بنيته وآلية عمله وكيفية استخدامه مع الأردوينو Arduino، بالإضافة إلى كيفية توصيل العناصر مع بعضها وكتابة الكود الخاص ببرمجة الأردوينو باستخدام <a href="https://academy.hsoub.com/programming/workflow/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9-ide-r1513/" rel="">بيئة التطوير المتكاملة IDE</a> الخاصة به لتنفيذ المشروع، وعمل محاكاة لآلية عمل المشروع من خلال منصة وكوي Wokwi.
</p>

<p>
	نشجعكم لتجربة بناء هذا المشروع والتطوير عليه للحصول على تجربة عملية مفيدة وممتعة.
</p>

<h2 id="-2">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%84%D8%B9%D8%A8%D8%A9-%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2567/" rel="">لعبة تخمين الأرقام باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D8%A5%D8%B4%D8%A7%D8%B1%D8%A9-%D9%85%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2414/" rel="">بناء إشارة مرور باستخدام الأردوينو Arduino</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2574</guid><pubDate>Mon, 02 Jun 2025 16:02:01 +0000</pubDate></item><item><title>&#x644;&#x639;&#x628;&#x629; &#x62A;&#x62E;&#x645;&#x64A;&#x646; &#x627;&#x644;&#x623;&#x631;&#x642;&#x627;&#x645; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%84%D8%B9%D8%A8%D8%A9-%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%A7%D9%84%D8%A3%D8%B1%D9%82%D8%A7%D9%85-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2567/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2025_05/-----Arduino.png.9204c1354c1aed441ddc3a3bd148d5ed.png" /></p>
<p>
	سنتعلم في هذا المقال كيفية بناء لعبة تفاعلية ممتعة من خلال عدة خطوات بسيطة. تطلب هذه اللعبة من المستخدم تخمين الرقم المولد عشوائيًا باستخدام لوحة الأردوينو Arduino، ومجموعة مختلفة من العناصر الإلكترونية التي سبق وأن تعاملنا معها في المشاريع السابقة من سلسلتنا <a href="https://academy.hsoub.com/tags/%d8%af%d9%84%d9%8a%d9%84%20%d8%a3%d8%b1%d8%af%d9%88%d9%8a%d9%86%d9%88/" rel="">دليل أردوينو</a>، كما سنتعرف في هذا المشروع على عنصر إلكتروني جديد وهو شاشة العرض ذات السبع أجزاء Seven Segment Display.
</p>

<h2 id="arduino-1">
	فكرة مشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino
</h2>

<p>
	تبدأ اللعبة بعرض الرقم 0 على شاشة العرض ذات الأجزاء السبع Seven Segment Display، ومن ثمة تنتظر حتى يُضغط مفتاح الضغط اللحظي Push Button الأول الخاص بتوليد الرقم العشوائي وعرضه سريعًا على الشاشة كجزء مساعد للمستخدم ليستطيع تخمين الرقم. وفي حال استمرار الضغط على المفتاح الأول، سيتغير الرقم كل 200 مللي ثانية.
</p>

<p>
	بعد توليد الرقم العشوائي وتخمينه من قبل المستخدم، سيتمكن من إدخاله إلى اللعبة عبر مفتاح الضغط اللحظي Push Button الثاني من خلال الضغط المستمر عليه، فتبدأ الأرقام بالتزايد بدءًا من الرقم 0 وحتى الرقم 9، ويجب على اللاعب إزالة الضغط عن المفتاح عند الرقم الصحيح، مع إمكانية ضبط سرعة تغير الأرقام من خلال مقاومة متغيرة Potentiometer لتحديد مستوى صعوبة اللعبة.
</p>

<p>
	في حال كان تخمين الرقم صحيحًا فإنه سيعرض الرقم الصحيح على شكل وميض مرتين بتأخير زمني لمدة نصف ثانية على الشاشة، ومن ثم ستعود اللعبة إلى البداية؛ أما إذا كان الرقم المخمن خاطئ فإن الرقم 0 سيعرض على شكل وميض مرتين بتأخير زمني لمدة نصف ثانية على الشاشة، ثم ستعود اللعبة إلى البداية لمحاولة تخمين الرقم مرةً أخرى أو لتوليد رقم عشوائي جديد. يوضح المخطط الحالي فكرة المشروع وطريقة تصميمه:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171575" href="https://academy.hsoub.com/uploads/monthly_2025_04/001.JPG.2b354e75ff871e46946daa1f9820bc1e.JPG" rel=""><img alt="001 فكرة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="171575" data-unique="kvtdkfnhi" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/001.thumb.JPG.f6a249ec4509bd91879a4de5826a02d3.JPG"> </a>
</p>

<h2 id="arduino-2">
	العناصر المستخدمة لمشروع التحكم بألوان الإضاءة باستخدام الأردوينو Arduino
</h2>

<p>
	سنستخدم مجموعةً من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		مفتاح الضغط اللحظي Push Button عدد 2
	</li>
	<li>
		مقاومة إلكترونية بقيمة 220 أوم عدد 7
	</li>
	<li>
		مقاومة متغيرة Potentiometer بقيمة 10 كيلو أوم
	</li>
	<li>
		شاشة العرض ذات السبع أجزاء Seven Segment Display من نوع CC
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<h2 id="sevensegmentdisplay">
	شاشة العرض ذات السبع أجزاء Seven Segment Display
</h2>

<p>
	تستخدم شاشة العرض ذات الأجزاء السبع Seven Segment Display كثيرًا وفي عدة أجهزة وأدوات لعرض القيم الرقمية، مثل الساعات الرقمية الكبيرة وأجهزة عد النقود والميزان الإلكتروني.
</p>

<p>
	تتميز هذه الشاشات ببساطة استخدامها وانخفاض ثمنها وسهولة قراءة القيم في جميع ظروف الإضاءة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171590" href="https://academy.hsoub.com/uploads/monthly_2025_04/946697737_.JPG.9aceae666556655f06861df6fb1c179f.JPG" rel=""><img alt="شاشة العرض ذات السبع أجزاء" class="ipsImage ipsImage_thumbnailed" data-fileid="171590" data-unique="8lz5bfdhe" style="width: 200px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/.thumb.JPG.fa4dfd51aa16a17e175937cf08da3940.JPG"> </a>
</p>

<p>
	تتكون شاشة العرض ذات السبع أجزاء Seven Segment Display من ثمانية ليدات LEDs، سبعة منها مخصصة لعرض الأرقام وتكون متوضعة ومرتبة على شكل رقم 8، بحيث يكون كل ليد على شكل خط صغير ويشكل جزءًا من الرقم، ولذلك سميت بشاشة العرض ذات السبع أجزاء Seven Segment، ومن خلال تشغيل الليدات المناسبة، يمكن استخدام هذه الشاشة لعرض الأرقام من 0 حتى 9 بالإضافة إلى بعض الأحرف الأبجدية مثل F ،E ،D ،C ،B ،A؛ أما اللِّيد الثامن فيكون على شكل نقطة ويستخدم في حالة عرض الأرقام العشرية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="171576" href="https://academy.hsoub.com/uploads/monthly_2025_04/002.jpg.1cb88b109bf5448a7a928292ba23723e.jpg" rel=""><img alt="002عرض الأرقام" class="ipsImage ipsImage_thumbnailed" data-fileid="171576" data-unique="6vr549tx3" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/002.thumb.jpg.fad1aff95a0538535ed163d4729faf2c.jpg"> </a>
</p>

<h2 id="sevensegmentdisplay-1">
	أنواع شاشة العرض ذات السبع أجزاء Seven Segment Display
</h2>

<p>
	هناك نوعان من شاشة العرض ذات السبع أجزاء Seven Segment Display من حيث البنية:
</p>

<h3 id="commonanode">
	الشاشات ذات المصاعد المشتركة Common Anode
</h3>

<p>
	يُعرف هذا النوع من الشاشات اختصارًا بالرمز CA، حيث توصل أقطاب المصاعد لجميع الليدات وهي القطب الموجب لكل ليد ببعضها في هذا النوع، ونتحكم في هذا النوع من الشاشات من خلال توصيل القطب المشترك مع قطب التغذية الموجب Vcc؛ أما القطب الأخر لليدات وهو القطب السالب لكل ليد تكون مرمزة أبجديًا DP ،F ،G ،D ،E ،C ،B ،A، وتوصل مع أقطاب الأردوينو ونعطيها إشارة LOW لتشغيلها أو HIGH لإطفائها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171577" href="https://academy.hsoub.com/uploads/monthly_2025_04/003.JPG.2326eb17ac6a4e61bb28722b38316850.JPG" rel=""><img alt="003 ذات المصاعد المشتركة" class="ipsImage ipsImage_thumbnailed" data-fileid="171577" data-unique="s2g355jou" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/003.thumb.JPG.42cfe60a202f66deab70a0430ddcc6b3.JPG"> </a>
</p>

<h3 id="commoncathode">
	ذات المهابط المشتركة Common Cathode
</h3>

<p>
	تعرف اختصارًا بالرمز CC، حيث توصل أقطاب المهابط السالبة لجميع الليدات ببعضها في هذا النوع، ونتحكم في هذا النوع من الشاشات من خلال توصيل القطب المشترك مع قطب التغذية السالب Gnd؛ أما القطب الأخر لليدات وهو القطب الموجب لكل ليد، فتكون مرمزة أبجديًا على النحو DP ،F ،G ،D ،E ،C ،B ،A وتوصل مع أقطاب الأردوينو وإعطائها إشارة HIGH لتشغيلها أو LOW لإطفائها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171578" href="https://academy.hsoub.com/uploads/monthly_2025_04/004.JPG.4c108358126f11927e2cb83bb3deb7c8.JPG" rel=""><img alt="004 ذات المهابط المشتركة" class="ipsImage ipsImage_thumbnailed" data-fileid="171578" data-unique="6kau5473l" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/004.thumb.JPG.5aa9327cf232c04579056912e3db10bc.JPG"> </a>
</p>

<p>
	كما تتوفر عدة أنواع أخرى من شاشة العرض ذات السبع أجزاء Seven Segment Display من حيث ألوان الليدات وهي الأحمر والأخضر والأزرق، ويختلف حجم الشاشة أيضًا حسب الاستهلاك الأكبر، وحسب عدد الخانات التي سنستخدمها في مشاريع مستقبلية.
</p>

<h3 id="sevensegmentdisplay-2">
	كيفية استخدام شاشة العرض ذات السبع أجزاء Seven Segment Display
</h3>

<p>
	نستطيع عرض الأرقام من خلال تشغيل بعض الليدات وإطفاء الأخرى على حسب الرقم المراد عرضه على الشاشة، فلعرض الرقم 0 مثلًا، سنحتاج لتشغيل جميع الليدات عدا اللِّيد ذي الرمز G؛ أما لعرض الرقم 1 فنحتاج لتشغيل اللِّيد B وC فقط، وهكذا بنفس الطريقة نستطيع عرض أي رقم من 0 وحتى 9 من خلال تغيير الليدات المضاءة فقط، والجدول الآتي يوضح الليدات التي يجب أن تضيء مع كل رقم:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171579" href="https://academy.hsoub.com/uploads/monthly_2025_04/005.JPG.69cacf798e5fe60307b17f1acf89b4c5.JPG" rel=""><img alt="005 جدول عرض الأرقام" class="ipsImage ipsImage_thumbnailed" data-fileid="171579" data-unique="70coxgu1l" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/005.thumb.JPG.e3934049556c6a94cb9f21b82defd282.JPG"> </a>
</p>

<h3 id="sevensegmentdisplay-3">
	تطبيق بسيط على شاشة العرض ذات السبع أجزاء Seven Segment Display
</h3>

<p>
	سنبني تطبيقًا بسيطًا لعرض بعض الأرقام من خلال لوحة الأردوينو Arduino وشاشة العرض ذات السبع أجزاء Seven Segment Display. ولتنفيذ هذا التطبيق سنتبع الخطوات التالية لتوصيل الشاشة مع لوحة الأردوينو:
</p>

<ul>
	<li>
		نصل الرِّجل ذات الرمز A من الشاشة مع الرِّجل الأولى للمقاومة، ووصل الرِّجل الثانية للمقاومة مع القطب رقم 2 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل ذات الرمز B من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 3 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل ذات الرمز C من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 4 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل ذات الرمز D من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 5 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل ذات الرمز E من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 6 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل ذات الرمز F من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 7 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل ذات الرمز G من الشاشة مع الرِّجل الأولى للمقاومة، ونصل الرِّجل الثانية للمقاومة مع القطب رقم 8 في لوحة الأردوينو Arduino
	</li>
	<li>
		نصل الرِّجل المشتركة CO من الشاشة مع القطب السالب GND في لوحة الأردوينو Arduino
	</li>
</ul>

<p>
	توضح الصورة التالية مخطط التوصيل وأقطاب شاشة العرض ذات السبع أجزاء:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171580" href="https://academy.hsoub.com/uploads/monthly_2025_04/006.JPG.be58cd39b3fc5c7ac927ec70190990ad.JPG" rel=""><img alt="006 مخطط أقطاب الشاشة" class="ipsImage ipsImage_thumbnailed" data-fileid="171580" data-unique="ppnw82zhp" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/006.thumb.JPG.bf6071b025ec2ac690d35b21d372d498.JPG"> </a>
</p>

<p>
	الخطوة التالية هي كتابة الكود البرمجي للتطبيق. سنتعرف في البداية على مجموعة من الماكرو باستخدام تعليمات <code>define#</code> من أجل ربط أقطاب الشاشة مع لوحة الأردوينو، وداخل الدالة الرئيسية <code>()setup</code> سنضبط هذه الأقطاب كأقطاب خرج <code>OUTPUT</code> من خلال الدالة المدمجة <a href="" rel=""><code>()pinMode</code></a> التي تأخذ وسيطين: الأول رقم القطب والثاني نوع القطب إما بخرج <code>OUTPUT</code> أو دخل <code>INPUT</code>؛ أما في الدالة التكرارية <code>()loop</code> فسنشغل بعض الليدات للحصول على الرقم المطلوب، وقد اخترنا الرقم 1، لتشغيل اللِّيد B واللِّيد C، ويمكن تعديل تشغيل وإطفاء الليدات حسب الجدول السابق للحصول على الرقم الذي تريده؛ كما يمكن أن نتحكم بتشغيل وإطفاء الأقطاب الرقمية من خلال الدالة المدمجة <a href="" rel=""><code>()digitalWrite</code></a> التي تأخذ وسيطين هما رقم القطب، وحالة أو قيمة القطب من خلال إعطاءه قيمة 1 منطقي أو <code>HIGH</code> للتشغيل و 0 منطقي أو <code>LOW</code> للإطفاء.
</p>

<pre class="ipsCode">#define a 2
#define b 3
#define c 4
#define d 5
#define e 6
#define f 7
#define g 8

void  setup()  {
pinMode(a,  OUTPUT);
pinMode(b,  OUTPUT);
pinMode(c,  OUTPUT);
pinMode(d,  OUTPUT);
pinMode(e,  OUTPUT);
pinMode(f,  OUTPUT);
pinMode(g,  OUTPUT);
}

void  loop()  {
digitalWrite(a,  LOW);
digitalWrite(b,  HIGH);
digitalWrite(c,  HIGH);
digitalWrite(d,  LOW);
digitalWrite(e,  LOW);
digitalWrite(f,  LOW);
digitalWrite(g,  LOW);
}
</pre>

<p>
	<strong>ملاحظة</strong>: الكود السابق خاص بالشاشة من نوع مهابط مشتركة CC، لذا في حال كانت الشاشة من نوع المصاعد المشتركة CA، فيكفي أن نعكس أوامر التشغيل والإيقاف فقط، بحيث تصبح بالشكل التالي:
</p>

<pre class="ipsCode">digitalWrite(a,  HIGH);
digitalWrite(b,  LOW);
digitalWrite(c,  LOW);
digitalWrite(d,  HIGH);
digitalWrite(e,  HIGH);
digitalWrite(f,  HIGH);
digitalWrite(g,  HIGH);
</pre>

<p>
	ولمعرفة نوع الشاشة التي لدينا يمكن استخدام جهاز القياس المتعدد Multimeter في وضع فحص الليد
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171581" href="https://academy.hsoub.com/uploads/monthly_2025_04/007.JPG.649023427089ba313385c9d3cf7dc541.JPG" rel=""><img alt="007 وضع فحص الليد" class="ipsImage ipsImage_thumbnailed" data-fileid="171581" data-unique="k6d72re1i" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/007.thumb.JPG.33196b3050702d717bf60fce62dc46db.JPG"> </a>
</p>

<p>
	ونجرب وصل القطب المشترك CO للشاشة الموجود في المنتصف مع الطرف الموجب الأحمر للمقياس، وإحدى الأقطاب الأخرى للشاشة نوصلها مع الطرف الأسود السالب للمقياس. وهنا في حال إضاءة جزء من الشاشة تكون من نوع مصاعد مشتركة Common Anode أو CA.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171582" href="https://academy.hsoub.com/uploads/monthly_2025_04/008.JPG.0cfc64f20d8b190f1cf498b6122837c3.JPG" rel=""><img alt="008 نوع مصاعد مشتركة" class="ipsImage ipsImage_thumbnailed" data-fileid="171582" data-unique="p50nn5din" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/008.thumb.JPG.29727f4ae95ddca93b40860ddc25039a.JPG"> </a>
</p>

<p>
	بعد ذلك، سنوصل القطب المشترك الموجود بالمنتصف CO للشاشة مع الطرف الأسود السالب للمقياس، وإحدى الأقطاب الأخرى للشاشة نوصلها مع الطرف الأحمر الموجب للمقياس، وهنا في حال إضاءة جزء من الشاشة، ستكون من نوع مهابط مشتركة Common cathode أو CC.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171583" href="https://academy.hsoub.com/uploads/monthly_2025_04/009.JPG.d842c6d3725c32de65ea24c7f34d589c.JPG" rel=""><img alt="009 نوع مهابط مشتركة" class="ipsImage ipsImage_thumbnailed" data-fileid="171583" data-unique="icy3llknt" src="https://academy.hsoub.com/uploads/monthly_2025_04/009.thumb.JPG.4240209381186a5a386e877113fec5d5.JPG"> </a>
</p>

<h2 id="arduino-3">
	مخطط التوصيل لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino
</h2>

<p>
	سنتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino لتنفيذ فكرة المشروع
</p>

<ul>
	<li>
		نصل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نثبت شاشة العرض ذات السبع أجزاء Seven Segment Display على لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نصل أقطاب الشاشة مع المقاومات الإلكترونية ولوحة الأردوينو Arduino بنفس الخطوات التي نفذناها في التطبيق السابق
	</li>
	<li>
		نصل رجل التغذية الأولى Vcc للمقاومة المتغيرة Potentiometer مع المسرى الموجب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نصل رجل التغذية الأخرى Gnd للمقاومة المتغيرة Potentiometer مع المسرى السالب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نصل رجل إشارة الخرج التشابهي Sig للمقاومة المتغيرة Potentiometer مع القطب A5 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		وصل الطرف الأول لجميع مفاتيح الضغط اللحظية Push Buttons مع المسرى السالب للوحة التجارب BreadBoard
	</li>
	<li>
		وصل الطرف الثاني للمفتاح الأول مع القطب رقم 9، والطرف الثاني للمفتاح الثاني مع القطب رقم 10 في لوحة الأردوينو أونو Arduino Uno
	</li>
</ul>

<p>
	وبهذا سنُفعّل مقاومة الرفع الداخلية للمتحكم الموجود في لوحة الأردوينو Arduino برمجيًا؛ لذلك لا داعي لتوصيل مقاومات رفع Pull-Up أو مقاومات خفض Pull-Down مع مفاتيح الضغط اللحظية Push Buttons.
</p>

<p>
	توضح الصورة التالية مخطط التوصيل لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171584" href="https://academy.hsoub.com/uploads/monthly_2025_04/010.JPG.e8d7190b5e76602aefd9b4fcb583e09a.JPG" rel=""><img alt="010 مخطط توصيل المشروع التاسع" class="ipsImage ipsImage_thumbnailed" data-fileid="171584" data-unique="21148wcdw" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/010.thumb.JPG.74728f71d97215068c0958317fb076fe.JPG"> </a>
</p>

<h2 id="arduino-4">
	الكود البرمجي لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino
</h2>

<p>
	سنعرف اثنين من الماكرو في بداية الكود خاصة بأرقام الأقطاب الرقمية لمفاتيح الضغط اللحظية Push Button ورقم القطب التشابهي الخاص بالمقاومة المتغيرة Potentiometer.
</p>

<pre class="ipsCode">#define guessButtonPin 9
#define SetButtonPin 10
#define POT A5
</pre>

<p>
	شرحنا سابقًا كيفية استخدام الماكرو في مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%B9%D8%AF%D8%AF-%D9%85%D8%B1%D8%A7%D8%AA-%D9%88%D9%85%D9%8A%D8%B6-%D8%A7%D9%84%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2420/" rel="">تخمين عدد مرات وميض اللِّيد باستخدام الأردوينو Arduino</a>، كما يمكن الاطلاع أكثر على مفهوم الماكرو وأنواعه من خلال مقال <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%85%D8%A7%D9%83%D8%B1%D9%88-macro-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprocessor-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1750/" rel="">الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C</a>؛ أما بالنسبة لأرقام الأقطاب الرقمية الخاصة بشاشة العرض ذات السبع أجزاء، فسنعرفها ضمن مصفوفة أحادية من نوع أعداد صحيحة <code>int</code> وبداخلها أرقام أقطاب الشاشة بالترتيب.
</p>

<pre class="ipsCode">const  int displayPins[7]  =  {2,  3,  4,  5,  6,  7,  8};
</pre>

<p>
	سنحتاج أيضًا لتعريف ثلاثة متغيرات صحيحة <code>EstimatedNumber</code> لتخزين الرقم المخمن، و<code>numberToGuess</code> لتخزين الرقم المراد تخمينه، و<code>speed</code> لتخزين مستوى السرعة عند إدخال الرقم المخمن.
</p>

<pre class="ipsCode">int EstimatedNumber =  0;
int numberToGuess =  1;
int speed = 0;
</pre>

<p>
	كما رأينا في التطبيق السابق فقد عرضنا الرقم على الشاشة من خلال إعطاء أمر التشغيل والإطفاء منفصلًآ لكل ليد من ليدات الشاشة، ولكن هذه الطريقة تستهلك أسطرًا برمجيةً كثيرة، فعند كل رقم نريد إظهاره على الشاشة سنحتاج إلى 7 أسطر برمجية، بالتالي استهلاك كبير لذاكرة البرنامج Flash Memory في الأردوينو Arduino، ولذلك سنبني دالةً خاصةً تستقبل وسيطًا واحدًا، وهو الرقم الذي نريد عرضه على الشاشة، مع عرض هذا الرقم بطريقة ديناميكية وسهلة.
</p>

<p>
	سنعرف داخل هذه الدالة مصفوفة من نوع بايت <code>byte</code> بحجم 10 عناصر لأنه لدينا عشرة أرقام من الرقم 0 إلى الرقم 9، وبداخل هذه المصفوفة سنكتب القيم الخاصة بتشغيل وإطفاء ليدات الشاشة بالنظام الثنائي Binary System بنفس قيم الجدول السابق، وبعد ذلك سنستخدم حلقةً تكراريةً <code>()for</code> للمرور على جميع عناصر المصفوفة <code>[]displayPins</code> التي تخزن أرقام أقطاب الشاشة وإعطاء أمر التشغيل أو الإطفاء المقابل للقطب من خلال المصفوفة <code>[]numbers</code> باستخدام الدالة المدمجة <code>()digitalWrite</code>.
</p>

<p>
	وللوصول الصحيح للقيمة المقابلة لكل قطب من الشاشة سنستخدم الدالة المدمجة <a href="" rel=""><code>()bitRead</code></a> التي تأخذ وسيطين هما الرقم الذي نريد قراءة بت واحد منه، ورقم البت حيث يبدأ من الرقم 0 للبت الأول من اليمين؛ وتعيد هذه الدالة قيمة هذا البت 1 أو 0.
</p>

<pre class="ipsCode">void displayNumber(int num) {
  const byte numbers[10] = {
    0B0111111, // 0
    0B0000110, // 1
    0B1011011, // 2
    0B1001111, // 3
    0B1100110, // 4
    0B1101101, // 5
    0B1111101, // 6
    0B0000111, // 7
    0B1111111, // 8
    0B1101111  // 9
  };

  for (int i = 0; i &lt; 7; i++) {
    digitalWrite(displayPins[i], bitRead(numbers[num], i));
  }
}
</pre>

<p>
	سنحتاج أيضًا إلى دالة خاصة أخرى <code>()displayOFF</code> وظيفتها إطفاء الشاشة وعدم عرض أي رقم، وذلك من خلال حلقة تكرارية <code>()for</code> للمرور على جميع عناصر المصفوفة <code>[]displayPins</code> التي تخزن أرقام أقطاب الشاشة، وإطفائها من خلال الدالة المدمجة <code>()digitalWrite</code> .
</p>

<pre class="ipsCode">void displayOFF() {
  for (int i = 0; i &lt; 7; i++) {
    digitalWrite(displayPins[i], LOW);
  }
}
</pre>

<p>
	في الدالة الرئيسية <code>()setup</code> سنضبط الأقطاب الخاصة بالمفاتيح اللحظية Push Button كأقطاب دخل مع تفعيل مقاومة الرفع الداخلية <code>INPUT_PULLUP</code>، والأقطاب الخاصة بالشاشة كأقطاب خرج <code>OUTPUT</code>، وذلك من خلال الدالة المدمجة <code>()pinMode</code>، بعدها سنعرض الرقم 0 على الشاشة من خلال استدعاء الدالة الخاصة <code>()displayNumber</code> وتمرير الرقم 0 كوسيط لها.
</p>

<pre class="ipsCode">void setup() {
  pinMode(guessButtonPin, INPUT_PULLUP);
  pinMode(SetButtonPin, INPUT_PULLUP);
  for (int i = 0; i &lt; 7; i++) {
    pinMode(displayPins[i], OUTPUT);
  }
  displayNumber(0);
}
</pre>

<p>
	في بداية الدالة التكرارية <code>()loop</code> سنقرأ قيمة المقاومة المتغيرة Potentiometer عبر الدالة المدمجة <a href="" rel=""><code>()analogRead</code></a> التي تأخذ وسيطًا واحدًا <code>Pin</code> وهو رقم القطب الموصول عليه العنصر التشابهي، من A0 إلى A5 في لوحة الأردوينو أونو Arduino Uno. تعيد هذه الدالة قيمةً عدديةً صحيحةً ضمن المجال من 0 إلى 1023، وتمثل القيمة الرقمية المقابلة لقيمة الجهد الموصول على القطب المحدد <code>Pin</code>، وسنخزن هذه القيمة في المتغير <code>speed</code> ثم نغير مجال القيم من 0-1023 إلى المجال 100-500، من خلال الدالة المدمجة <a href="" rel=""><code>()map</code></a> التي تأخذ خمسة وسطاء كالآتي:
</p>

<ol>
	<li>
		قيمة المتغير الذي نريد تحويله
	</li>
	<li>
		الوسيط الثاني لمجال القيم القديم الذي نريد التحويل منه
	</li>
	<li>
		الوسيط الثالث لمجال القيم القديم الذي نريد التحويل منه 4.الوسيط الرابع لمجال القيم الجديد الذي نريد التحويل إليه
	</li>
	<li>
		الوسيط الخامس لمجال القيم القديم الذي نريد التحويل منه
	</li>
</ol>

<pre class="ipsCode">void loop() {
  speed= analogRead(POT);
  speed = map(speed, 0, 1024, 100, 500);
</pre>

<p>
	بعد ذلك سنتحقق من حالة المفتاح اللحظي الأول المسؤول عن توليد رقم عشوائي لتخمينه من خلال العبارة الشرطية <code>()if</code>، وفي حال كان هذا المفتاح مضغوطًا فسنولد رقمًا عشوائيًا باستخدام الدالة المدمجة <a href="" rel=""><code>()random</code></a> التي تأخذ وسيطين هما:
</p>

<ol>
	<li>
		الوسيط الأقل قيمة، وتكون ضمن المجال
	</li>
	<li>
		الوسيط الأكبر قيمة وتكون خارج المجال
	</li>
</ol>

<p>
	تعيد هذه الدالة قيمة عشوائية سنخزنها في المتغير <code>numberToGuess</code>، وسنعرض هذا الرقم على الشاشة بسرعة، وفي حال استمرار الضغط على المفتاح أكثر من 200 مللي ثانية سيولّد رقمًا عشوائيًا جديدًا.
</p>

<pre class="ipsCode">  if (digitalRead(SetButtonPin) == LOW) {
    numberToGuess = random(0, 10);
    displayNumber(numberToGuess);
    delay(500);
  }
</pre>

<p>
	الآن أصبح الرقم المراد تخمينه مخزنًا في المتغير <code>numberToGuess</code> ضمن ذاكرة الأردوينو، وبانتظار الضغط على المفتاح اللحظي الثاني لإدخال الرقم المخمن؛ بالتالي سنتحقق برمجيًا من حالة المفتاح الثاني المسؤول عن إدخال الرقم المخمن من خلال العبارة الشرطية <code>()if</code>؛ وفي حال كان مضغوطًا، سنزيد قيمة المتغير <code>EstimatedNumber</code> بمقدار 1؛ أما في حال أصبح أكبر من الرقم 9، فسنعيد قيمته إلى الصفر، ومن ثم نعرض الرقم على الشاشة ونضع تأخير زمني بمقدار قيمة المتغير <code>speed</code> من خلال من خلال الدالة <a href="" rel=""><code>()delay</code></a>.
</p>

<pre class="ipsCode">  if (digitalRead(guessButtonPin) == LOW) {
    EstimatedNumber++;
    if (EstimatedNumber  &gt; 9) EstimatedNumber = 0;
    displayNumber(EstimatedNumber);
    delay(speed);
    displayNumber(0);
  }
</pre>

<p>
	الخطوة الأخيرة هي التأكد من قيمة الرقم المخمن إذا كانت مطابقة للرقم المراد تخمينه؛ فعند إزالة الضغط عن المفتاح الثاني والتأكد أن للرقم المخمن قيمة لا تساوي الصفر، سنقارن قيمة الرقم المخمن مع قيمة الرقم المراد تخمينه. وهنا في حال كانت مطابقة، سنعيد قيمة الرقم المخمن إلى الصفر ثم نعرض الرقم الصحيح على الشاشة لمدة نصف ثانية واحدة، ثم نطفئ الشاشة لمدة نصف ثانية ونكرر هذه العملية مرةً أخرى ثم نعود إلى بداية اللعبة من خلال عرض الرقم 0 على الشاشة.
</p>

<p>
	لكن في حال كانت القيمة غير مطابقة، فسنعيد قيمة الرقم المخمن إلى الصفر أيضًا ونعرض الرقم 0 لمدة نصف ثانية واحدة، ثم نطفئ الشاشة لمدة نصف ثانية ونكرر هذه العملية مرةً أخرى ثم نعود إلى بداية اللعبة من خلال عرض الرقم 0، ويكون ثابتًا على الشاشة.
</p>

<pre class="ipsCode">  else if ((digitalRead(guessButtonPin) == HIGH) &amp;&amp; (EstimatedNumber != 0)) {
    if (EstimatedNumber == numberToGuess) {
     EstimatedNumber = 0;
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    } 
    else {
     EstimatedNumber = 0;
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    }
  }
</pre>

<h2 id="arduino-5">
	الكود البرمجي النهائي لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino
</h2>

<p>
	سنعرض الآن الكود البرمجي النهائي للعبة تخمين الأرقام التي عملنا عليها:
</p>

<pre class="ipsCode">#define guessButtonPin 9
#define SetButtonPin 10
#define POT A5

const int displayPins[7]  =  {2,  3,  4,  5,  6,  7,  8};

int EstimatedNumber = 0;
int numberToGuess = 1; 
int speed = 0;


void displayNumber(int num) {
  const byte numbers[10] = {
    0B0111111, // 0
    0B0000110, // 1
    0B1011011, // 2
    0B1001111, // 3
    0B1100110, // 4
    0B1101101, // 5
    0B1111101, // 6
    0B0000111, // 7
    0B1111111, // 8
    0B1101111  // 9
  };

  for (int i = 0; i &lt; 7; i++) {
    digitalWrite(displayPins[i], bitRead(numbers[num], i));
  }
}

void displayOFF() {
  for (int i = 0; i &lt; 7; i++) {
    digitalWrite(displayPins[i], LOW);
  }
}

void setup() {
  pinMode(guessButtonPin, INPUT_PULLUP);
  pinMode(SetButtonPin, INPUT_PULLUP);
  for (int i = 0; i &lt; 7; i++) {
    pinMode(displayPins[i], OUTPUT);
  }
  displayNumber(0);
}

void loop() {
  speed= analogRead(A5);
  speed = map(speed, 0, 1024, 100, 500);

  if (digitalRead(SetButtonPin) == LOW) {
    numberToGuess = random(0, 10);
    displayNumber(numberToGuess);
    delay(200);
    displayNumber(0);
  }


  if (digitalRead(guessButtonPin) == LOW) {
    EstimatedNumber++;
    if (EstimatedNumber  &gt; 9) EstimatedNumber = 0;
    displayNumber(EstimatedNumber);
    delay((speed));
    displayNumber(0);
  }

  else if ((digitalRead(guessButtonPin) == HIGH) &amp;&amp; (EstimatedNumber != 0)) {
    if (EstimatedNumber == numberToGuess) {
     EstimatedNumber = 0;
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(numberToGuess);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    } 
    else {
     EstimatedNumber = 0;
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
      delay(500);
      displayOFF();
      delay(500);
      displayNumber(0);
    }
  }
}
</pre>

<h2 id="arduino-6">
	محاكاة لمشروع لعبة تخمين الأرقام باستخدام الأردوينو Arduino
</h2>

<p>
	سنتبع نفس الخطوات التي تعلمناها في مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/" rel="">التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a> للوصول للصفحة الخاصة بمحاكاة المشروع على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171585" href="https://academy.hsoub.com/uploads/monthly_2025_04/011.JPG.c1fa004558f7b8305976222c925dad69.JPG" rel=""><img alt="011 الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="171585" data-unique="5zldlu3no" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/011.thumb.JPG.600e0c6795ce8103e55a38b6b5d60af5.JPG"> </a>
</p>

<p>
	بعد ذلك سنضيف العناصر الإلكترونية اللازمة للمشروع وهي كل من Seven Segment و Potentiometer و Push Button و Resistors و BreadBoard.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171586" href="https://academy.hsoub.com/uploads/monthly_2025_04/012.JPG.1623d2646ed26afe1bdf85e1a577ab55.JPG" rel=""><img alt="012 إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="171586" data-unique="l4wzq3qqz" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/012.thumb.JPG.21ad61ac85331f1399a54d9eeb7b2ad4.JPG"> </a>
</p>

<p>
	سنغيّر قيم مقاومات الشاشة إلى 220 أوم من خلال الضغط عليها، وستظهر لنا نافذة في الأعلى تمكننا من تغيير القيمة والواحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171587" href="https://academy.hsoub.com/uploads/monthly_2025_04/013.JPG.f34ed315ead8c6ec3a9660340f539983.JPG" rel=""><img alt="013 تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="171587" data-unique="9uitzqt1q" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/013.thumb.JPG.8f798b25d561832026320bf2c17d184e.JPG"> </a>
</p>

<p>
	بالطريقة نفسها يمكننا تغير نوع الشاشة ولونها من خلال الضغط عليها، لتظهر لنا نافذة بالأعلى نستطيع من خلالها تحديد النوع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171588" href="https://academy.hsoub.com/uploads/monthly_2025_04/014.JPG.f9dc106d49b01bc9f4b443d7f65438c9.JPG" rel=""><img alt="014 تغير نوع الشاشة ولونها" class="ipsImage ipsImage_thumbnailed" data-fileid="171588" data-unique="2fbc6z2gj" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/014.JPG.f9dc106d49b01bc9f4b443d7f65438c9.JPG"> </a>
</p>

<p>
	سنرتب الآن العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
</p>

<p>
	بعد الانتهاء من كل شيء لا بد من التأكد من كتابة الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة ونلاحظ الآتي:
</p>

<ol>
	<li>
		عند بداية اللعبة سيعرض الرقم 0 على الشاشة. وهنا علينا انتظار ضغط اللعبة على المفتاح اللحظي الأول Push Button الأول لتوليد رقم عشوائي لتخمينه
	</li>
	<li>
		عند استمرار الضغط على المفتاح الأول لمدة تزيد عن 200 مللي ثانية سيتولد رقم عشوائي جديد مع عرض هذا الرقم على الشاشة بسرعة
	</li>
	<li>
		بعد توليد رقم عشوائي وتخمينه، سنضغط على المفتاح اللحظي Push Button الثاني باستمرار لإدخال الرقم المخمن إلى اللعبة، وسيبدأ من الرقم 0 ويزداد كل فترة زمنية تحدد من خلال المقاومة المتغيرة، وعند الوصول للرقم الذي نريده، سنتوقف عن الضغط عن المفتاح
	</li>
	<li>
		في حال كان الرقم المخمن صحيح سيعرض على الشاشة على شكل وميض مرتين كل ثانية وإذا كان خاطئ سيعرض الرقم 0 على الشاشة على شكل وميض مرتين كل ثانية
	</li>
	<li>
		في النهاية ستعود اللعبة إلى البداية ويعرض الرقم 0 على الشاشة إلى أن يضغط المفتاح الأول لتوليد رقم عشوائي جديد أو أن يضغط المفتاح الثاني لتخمين الرقم السابق مرةً أخرى.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="171589" href="https://academy.hsoub.com/uploads/monthly_2025_04/015.JPG.deabaa69b5bff41d1f939cf3f0729454.JPG" rel=""><img alt="015 النتيجة النهائية للمشروع التاسع" class="ipsImage ipsImage_thumbnailed" data-fileid="171589" data-unique="4kzslh638" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2025_04/015.thumb.JPG.c5a816d17cd01381691157200413c92e.JPG"> </a>
</p>

<h2 id="">
	الخاتمة
</h2>

<p>
	بهذا نكون قد قدمنا شرحًا مفصلًا حول كيفية بناء لعبة تفاعلية باستخدام لوحة الأردوينو من خلال عدة خطوات بسيطة وتعرفنا على شاشة العرض ذات السبع أجزاء Seven Segment وأنواعها وكيفية استخدامها وربطها مع الأردوينو، بالإضافة إلى مجموعة من النصائح والمهارات لتحسين جودة وكفاءة مشروعنا.
</p>

<h2 id="-1">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D8%A2%D9%84%D8%A9-%D8%A8%D9%8A%D8%A7%D9%86%D9%88-%D8%A8%D8%B3%D9%8A%D8%B7%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2479/" rel="">بناء آلة بيانو بسيطة باستخدام الأردوينو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%B2%D9%8A%D9%86%D8%A9-%D8%A8%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2463/" rel="">إضاءة زينة بأنماط مختلفة باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%81%D8%AA%D8%A7%D8%AD-%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%84%D8%AD%D8%B8%D9%8A-push-button-%D9%81%D9%8A-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2433/" rel="">التحكم باللِّيد LED باستخدام مفتاح الضغط اللحظي Push Button والأردوينو Arduino</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2567</guid><pubDate>Sat, 03 May 2025 16:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x622;&#x644;&#x629; &#x628;&#x64A;&#x627;&#x646;&#x648; &#x628;&#x633;&#x64A;&#x637;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D8%A2%D9%84%D8%A9-%D8%A8%D9%8A%D8%A7%D9%86%D9%88-%D8%A8%D8%B3%D9%8A%D8%B7%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2479/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/Arduino.png.24299c9f0bd37c6f9034eb0e806b0f25.png" /></p>
<p>
	نوضح في هذا المقال كيفية إصدار الأصوات والنغمات من خلال لوحة الأردوينو Arduino وعنصر الجرس الإلكترونية Buzzer ومجموعة من مفاتيح الضغط اللحظية Push Button لبناء مشروع لآلة البيانو الموسيقية.
</p>

<h2 id="">
	فكرة مشروع بناء آلة البيانو الموسيقية
</h2>

<p>
	سنصمم بيانو صغير يحتوي على سبعة مفاتيح لحظية Push Buttons، يسبب كل مفتاح إصدار صوت بتردد Frequency مختلف عند الضغط عليه من خلال الجرس الإلكتروني Buzzer وهو العنصر المسؤول عن إصدار الصوت، حيث أن هذه الترددات السبعة التي اخترناها هي الترددات الأساسية في السلم الموسيقي دو، ري، مي، فا، صول، لا، سي وسنخزن هذه الترددات في الذاكرة الخاصة بلوحة الأردوينو، مما يتيح لنا إمكانية تغيير أصوات البيانو برمجيًا عن طريق تعديل هذه الترددات.
</p>

<h2 id="-1">
	العناصر المستخدمة لمشروع بناء آلة البيانو الموسيقية باستخدام أردوينو
</h2>

<p>
	سنستخدم في مشروعنا مجموعة من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		مفتاح الضغط اللحظي Push Button عدد 7
	</li>
	<li>
		جرس إلكتروني Buzzer غير فعال Passive
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<p>
	وقد تعاملنا مع معظم هذه العناصر في المشاريع التي طورناها في المقالات السابقة من سلسلتنا <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88/" rel="">دليل أردوينو</a> وسنتعامل في هذا المشروع مع عنصر إلكتروني جديد لم يسبق لنا استخدامه وهو الجرس الإلكتروني Buzzer.
</p>

<h2 id="buzzer">
	الجرس الإلكتروني Buzzer
</h2>

<p>
	هو عبارة عن عنصر إلكتروني يستخدم لتوليد الأصوات والنغمات من خلال تحويل الطاقة الكهربائية إلى صوت مسموع، ويتكون من غشاء يشبه الطبل يصنع عادة من مواد مرنة قابلة للاهتزاز كالبلاستيك أو المعدن،عندما يمر التيار الكهربائي عبر الجرس، يُسبب ذلك تشوه الغشاء. وعندما يتوقف التيار الكهربائي، يعود الغشاء إلى شكله الطبيعي، ومع تكرار مرور التيار وإيقافه بسرعة سيؤدي ذلك إلى اهتزاز هذا الغشاء مما سيؤدي بدوره لتوليد الصوت، ويستخدم الجرس الإلكتروني Buzzer في العديد من التطبيقات مثل أجهزة الإنذار والألعاب والهواتف وغيرها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/1609013843_.jpg.72fb515b72d38b5dce285da9ff52681d.jpg" data-fileid="164531" data-fileext="jpg" rel=""><img alt="الجرس الإلكتروني" class="ipsImage ipsImage_thumbnailed" data-fileid="164531" data-ratio="65.00" data-unique="ezb8a2xia" style="width: 300px; height: auto;" width="300" src="https://academy.hsoub.com/uploads/monthly_2024_12/1609013843_.jpg.72fb515b72d38b5dce285da9ff52681d.jpg"> </a>
</p>

<p>
	هناك نوعان من الأجراس الإلكترونية Buzzers الأول هو النوع الفعّال Active، والذي يحتوي على دائرة كهربائية داخلية مدمجة تمكنه من العمل عند تغذيته مباشرة من مصدر جهد مستمر ثابت DC. أما النوع الثاني فهو النوع غير الفعّال Passive، والذي يختلف عن النوع الأول بأنه لا يحتوي على دائرة داخلية لتوليد الصوت، وبالتالي يحتاج إلى مصدر تغذية يعمل بتردد معين لتوليد الأصوات.
</p>

<h2 id="-2">
	تحديد نوع الجرس الإلكتروني
</h2>

<p>
	يمكن تحديد نوع الجرس الإلكتروني بسهولة من خلال تجربة توصيله بمصدر تغذية مستمر بجهد 5V. فإذا أصدر الجرس صوتًا عند توصيله، فإن الجرس يكون من النوع الفعّال Active، ويُستخدم هذا النوع عادة في التطبيقات التي تتضمن دوائر إلكترونية بسيطة دون وجود وحدة تحكم، إذ يُستخدم الجرس لإصدار تنبيهات بسيطة من خلال تشغيله وإيقافه مباشرة. أما إذا لم يصدر الجرس أي صوت عند توصيله، فسيكون من النوع غير الفعّال Passive، ويُستخدم هذا النوع في الدوائر الإلكترونية الأكثر تعقيدًا والتي تحتوي على وحدة تحكم، حيث يُمكن التحكم بالصوت بشكل أكبر وتوليد نغمات وأصوات مخصصة.
</p>

<p>
	توضح الصورة التالية الفرق بين الجرس الإلكتروني الفعّال Activ وغير الفعّال Passive.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/733833747_.jpg.4a7e1d020a68a62ba663742b0036eb5b.jpg" data-fileid="164534" data-fileext="jpg" rel=""><img alt="أنواع الجرس الإلكتروني" class="ipsImage ipsImage_thumbnailed" data-fileid="164534" data-unique="g734qbpbq" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.287cd073fa7e560f5c102e4bc802e7a9.jpg"> </a>
</p>

<p>
	يعد الجرس الإلكتروني عنصرًا رقميًّا ويمكننا توصيله مع أحد الأقطاب الرقمية والتحكم في تشغيله من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external"><code>()digitalWrite</code></a>، ومن الممكن أيضًا توصيله مع أقطاب تقنية تعديل عرض النبضة PWM للحصول على نغمات وأصوات مختلفة، كما تتيح بيئة تطوير أردوينو Arduino IDE دوال مدمجة أخرى خاصة بالتعامل مع الجرس الإلكتروني Buzzer بسهولة وسنتعرف عليها في الفقرات التالية.
</p>

<h2 id="buzzer-1">
	الدوال البرمجية الخاصة بالجرس الإلكتروني Buzzer
</h2>

<p>
	يمكننا إنشاء الأصوات والتحكم في نغمات الجرس الإلكتروني، من خلال الدوال التالية:
</p>

<h3 id="tone">
	دالة إصدار صوت الجرس<code>tone</code>
</h3>

<p>
	تستخدم الدالة <a href="" rel=""><code>()tone</code></a> لتوليد إشارة مربعة لتشغيل الجرس بتردد محدد وبدورة عمل Duty Cycle تساوي 50%، ونمرر لهذه الدالة ثلاثة وسطاء عند وهي:
</p>

<ol>
	<li>
		رقم القطب الموصول عليه الجرس الإلكتروني Buzzer، ويمكن استخدام أي قطب من الأقطاب الرقمية في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		التردد الخاص بالإشارة المربعة، وبتغير قيمة هذا الوسيط سنحصل على نغمات وأصوات مختلفة، ويجب أن لا يقل تردد الإشارة عن 31 هرتز
	</li>
	<li>
		الوسيط الثالث اختياري ويمكن عدم كتابته، وهو مدة تشغيل الجرس بالمللي ثانية، وفي حال عدم وضعه سيستمر الجرس بالعمل
	</li>
</ol>

<h3 id="notone">
	دالة إيقاف صوت الجرس <code>noTone</code>
</h3>

<p>
	تستخدم الدالة <a href="" rel=""><code>()noTone</code></a> لإيقاف توليد الإشارة المربعة المولدة من الدالة <code>()tone</code> أي أنها توقف الجرس عن العمل، وتأخذ وسيطًا واحدًا وهو رقم القطب الموصول عليه الجرس الإلكتروني Buzzer
</p>

<h2 id="-3">
	مخطط توصيل مشروع آلة البيانو الموسيقية باستخدام أردوينو
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/143140897_.JPG.9f10601f9ef7644cf80b3c71684d9558.JPG" data-fileid="164537" data-fileext="JPG" rel=""><img alt="مخطط توصيل المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="164537" data-unique="bymz47amg" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.baaeac75bd25f66b5ae652e015d79976.JPG"> </a>
</p>

<p>
	لتنفيذ فكرة المشروع، اتبع الخطوات الآتية لتوصيل العناصر والأسلاك مع لوحة الأردوينو Arduino
</p>

<ul>
	<li>
		صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
	</li>
	<li>
		صل الرجل الأقصر التي تمثل القطب السالب الخاصة بالجرس الإلكتروني Buzzer مع المسرى السالب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		صل الرجل الأطول التي تمثل القطب الموجب الخاصة بالجرس الإلكتروني Buzzer مع القطب رقم 12 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		صل الطرف الأول لجميع مفاتيح الضغط اللحظية Push Buttons مع المسرى السالب للوحة التجارب BreadBoard، ثم صل الطرف الثاني للمفاتيح Push Buttons على الترتيب مع الأقطاب في لوحة الأردوينو أونو Arduino Uno من القطب رقم 10 وحتى القطب رقم 4
	</li>
	<li>
		سنفعّل مقاومة الرفع الداخلية للمتحكم الموجود في لوحة الأردوينو Arduino برمجيًا لذلك لا داعي لتوصيل مقاومات رفع Pull-Up أو مقاومات خفض Pull-Down مع مفاتيح الضغط اللحظية Push Buttons
	</li>
</ul>

<h2 id="-4">
	الكود البرمجي لمشروع بناء آلة البيانو الموسيقية بأردوينو
</h2>

<p>
	في البداية سنعرف مجموعة من الماكرو خاصة بالترددات التي تمثل النغمات الرئيسية في السلم الموسيقي دو، ري، مي، فا، صول، لا، سي ويمكننا اختيار أي نغمات نريدها بوضع تردد النغمة فقط.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_9" style=""><span class="com">#define</span><span class="pln"> C_4 </span><span class="lit">261</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> D_4 </span><span class="lit">293</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> E_4 </span><span class="lit">329</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> F_4 </span><span class="lit">349</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> G_4 </span><span class="lit">392</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> A_4 </span><span class="lit">440</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> B_4 </span><span class="lit">493</span></pre>

<p>
	نحتاج لتعريف مجموعة أخرى من الماكرو خاصة بأقطاب المفاتيح التي ستوصل مع لوحة الأردوينو بالإضافة إلى القطب الذي سيوصل الجرس الإلكتروني Buzzer مع لوحة الأردوينو
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_11" style=""><span class="com">#define</span><span class="pln"> C </span><span class="lit">10</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> D </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> E </span><span class="lit">8</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> F </span><span class="lit">7</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> G </span><span class="lit">6</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> A </span><span class="lit">5</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> B </span><span class="lit">4</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Buzz</span><span class="pln"> </span><span class="lit">12</span></pre>

<p>
	شرحنا كيفية استخدام الماكرو في مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%B9%D8%AF%D8%AF-%D9%85%D8%B1%D8%A7%D8%AA-%D9%88%D9%85%D9%8A%D8%B6-%D8%A7%D9%84%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2420/" rel="">تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino</a> كما يمكنك الاطلاع أكثر على مفهوم الماكرو وأنواعه من خلال مقال <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%85%D8%A7%D9%83%D8%B1%D9%88-macro-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprocessor-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1750/" rel="">الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C</a>.
</p>

<p>
	سنضبط في الدالة الرئيسية <code><a href="https://wiki.hsoub.com/Arduino/setup" rel="external">()setup</a></code> نوع الأقطاب المستخدمة، حيث أن القطب الخاص بالجرس الإلكتروني Buzzer يُضبط كقطب خرج <code>OUTPUT</code> والاقطاب الخاصة بالمفاتيح اللحظية Push Buttons تُضبط كأقطاب دخل مع تفعيل مقاومة الرفع الداخلية <code>INPUT_PULLUP</code>، حيث أن الدالة المدمجة المسؤولة عن ضبط نوع القطب هي <a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external"><code>()pinMode</code></a> والتي تأخذ وسيطين الأول رقم القطب والثاني نوع القطب إما خرج <code>OUTPUT</code> أو دخل <code>INPUT</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_14" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">C</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">D</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">E</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">F</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">G</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">A</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">B</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وسنستخدم في الدالة التكرارية <code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> عدة حلقات تكرارية <code>()While</code> كل حلقة خاصة بكل مفتاح وسيكون الشرط بداخل كل حلقة هو أن يكون المفتاح مضغوط <code>LOW</code> حيث نقرأ حالة المفتاح من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/digital_io/digitalread" rel="external"><code>()digitalRead</code></a> التي تأخذ وسيطًا واحدًا وهو رقم القطب وتعيد القيمة الفيزيائية الموجودة على القطب، فعند الضغط على المفتاح الأول الموصول على القطب رقم 10 مثلًا سيتحقق الشرط الخاص بالحلقة التكرارية الأولى ويعمل الجرس الإلكتروني Buzzer وفق التردد الأول 261 هرتز ونستخدم الدالة المدمجة <code>()tone</code> لتشغيل الجرس الإلكتروني Buzzer كما شرحنا سابقًا.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_17" style=""><span class="kwd">void</span><span class="pln">  loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">C</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> C_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">D</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> D_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">E</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> E_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">F</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> F_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">G</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> G_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">A</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> A_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">B</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> B_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	عند تجربة الكود السابق نلاحظ أنه يعمل بشكل جيد ولكن مع وجود مشكلة صغيرة فعند إزالة الضغط عن المفتاح سيستمر الجرس الإلكتروني Buzzer بإصدار الصوت بنفس التردد السابق حتى الضغط على مفتاح آخر ليصدر الجرس الإلكتروني Buzzer صوت آخر بتردد مختلف، لذا نحتاج لحل هذه المشكلة بحيث يتوقف الجرس عن إصدار الصوت بشكل تام عند إزالة الضغط عن أي مفتاح. ونستطيع حل هذه المشكلة بسهولة من خلال إيقاف تشغيل الجرس الإلكتروني Buzzer في نهاية الكود من خلال استدعاء الدالة <code>()noTone</code> التي شرحناها سابقًا
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_19" style=""><span class="pln"> noTone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">);</span></pre>

<p>
	بهذه الطريقة يكون الكود البرمجي جاهزًا لتجربته. كما يمكننا التعديل على الكود فمثلًا يمكن استخدام العبارات الشرطية <code>if</code> و<code> else if</code> بدلًا من الحلقة التكرارية <code>While</code> وتعديل ما يلزم، أو إضافة ميزات أخرى مثل إضافة الليد متعدد الألوان RGB LED ليضيء بلون مختلف عند كل صوت مختلف فمثلًا عند الضغط على المفتاح الأول سيضيء الليد متعدد الألوان RGB LED باللون الأحمر وستصبح الحلقة التكرارية الأولى بالشكل الآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_21" style=""><span class="pln">  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">C</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> C_4</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Pin</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Green_Pin</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Blue_Pin</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	ولكن علينا الانتباه لتعديل مخطط التوصيل بحيث أن أقطاب الليد متعدد الألوان RGB LED يجب أن توصل مع أقطاب لوحة الأردوينو التي تدعم تقنية تعديل عرض النبضة PWM والتي نجد بجانبها الرمز <code>~</code> وأرقام هذه الأقطاب هي 3، 5، 6، 9، 10، 11
</p>

<h2 id="-5">
	الكود البرمجي النهائي لمشروع آلة بيانو باستخدام الأردوينو
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_7147_23" style=""><span class="com">#define</span><span class="pln"> C_4 </span><span class="lit">261</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> D_4 </span><span class="lit">293</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> E_4 </span><span class="lit">329</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> F_4 </span><span class="lit">349</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> G_4 </span><span class="lit">392</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> A_4 </span><span class="lit">440</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> B_4 </span><span class="lit">493</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> C </span><span class="lit">10</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> D </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> E </span><span class="lit">8</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> F </span><span class="lit">7</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> G </span><span class="lit">6</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> A </span><span class="lit">5</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> B </span><span class="lit">4</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Buzz</span><span class="pln"> </span><span class="lit">12</span><span class="pln">
</span><span class="kwd">void</span><span class="pln">  setup</span><span class="pun">(){</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">C</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">D</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">E</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">F</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">G</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">A</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">B</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">void</span><span class="pln">  loop</span><span class="pun">(){</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">C</span><span class="pun">)</span><span class="pln"> </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> C_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">D</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> D_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
 </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">E</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> E_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">F</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> F_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">G</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> G_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">A</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> A_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">B</span><span class="pun">)</span><span class="pln">  </span><span class="pun">==</span><span class="pln">  LOW</span><span class="pun">){</span><span class="pln">
    tone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">,</span><span class="pln"> B_4</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  noTone</span><span class="pun">(</span><span class="typ">Buzz</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-1">
	محاكاة مشروع آلة البيانو باستخدام الأردوينو
</h2>

<p>
	سنتبع نفس الخطوات التي تعلمناها في مقالٍ <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/" rel="">التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a> للوصول الى الصفحة الخاصة بمحاكاة مشروعنا على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/1632128791_.JPG.9b48701ac0c57406503558436912f7f8.JPG" data-fileid="164532" data-fileext="JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="164532" data-unique="xluxg9e5i" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.b4ecf3d68ceba0e716088abb68d55cce.JPG"> </a>
</p>

<p>
	نضيف العناصر الإلكترونية اللازمة للمشروع وهي لوحة التجارب BreadBoard والجرس الإلكتروني Buzzer والمفتاح اللحظي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/1820506230_.JPG.d438cb4594485db9769be7e0aae33266.JPG" data-fileid="164530" data-fileext="JPG" rel=""><img alt="إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="164530" data-unique="giq5iuufh" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.5d6eb87b366dcd3d21d3aca120a2517c.JPG"> </a>
</p>

<p>
	نغيّر ألوان المفاتيح للتميز بينها من خلال الضغط عليها فتظهر لنا نافذة في الأعلى نستطيع من خلالها اختيار اللون.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/557772267_.JPG.e8046a7f97832b38d8dc9072be6d29e2.JPG" data-fileid="164535" data-fileext="JPG" rel=""><img alt="تغير لون المفتاح" class="ipsImage ipsImage_thumbnailed" data-fileid="164535" data-unique="4465b8v9r" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.5a75447f38befb94eeab0b1ffde3dbed.JPG"> </a>
</p>

<p>
	نرتب العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
</p>

<p>
	نكتب الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة، ونلاحظ الحالات الآتية:
</p>

<ol>
	<li>
		نضغط على المفتاح الأول الموصول على القطب رقم 10 في لوحة الأردوينو أونو Arduino Uno، سنلاحظ أن الجرس الإلكتروني Buzzer يصر صوت بنفس التردد الأول، وعند إزالة الضغط عن المفتاح سيتوقف الجرس عن العمل وذلك بسبب الدالة <code>()noTone</code>.
	</li>
	<li>
		نجرب الضغط على المفاتيح الأخرى ونلاحظ أن كل مفتاح يسبب إصدار صوت مختلف عن الآخر
	</li>
	<li>
		في حال الضغط على المفاتيح بشكل تسلسلي بالترتيب سنلاحظ أن الأصوات أو النغمات متناسقة لأننا استخدمنا الترددات الأساسية في السلم الموسيقي، ويمكن تجربة ترددات مختلفة حتى نحصل على النتيجة التي نريدها
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_12/4175042_.JPG.1d06014eed8a4994cab99031c801a6e8.JPG" data-fileid="164533" data-fileext="JPG" rel=""><img alt="النتيجة النهائية لمحاكاة المشروع الثامن" class="ipsImage ipsImage_thumbnailed" data-fileid="164533" data-unique="a9jgle6tw" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.1beec5917b2d9bf6a74a58e4d7c25f16.JPG"> </a>
</p>

<h2 id="-6">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا المقال كيفية إصدار أصوات من خلال الأردوينو Arduino، وتعرفنا على عنصر إلكتروني جديد وهو الجرس الإلكتروني Buzzer وآلية عمله وأنواعه، وقمنا ببناء مشروع جديد من هذه السلسلة وهو بناء آلة البيانو الموسيقية باستخدام الأردوينو Arduino، وختمنا المقال بعرض خطوات محاكاة للمشروع من خلال منصة وكوي Wokwi.
</p>

<h2 id="-7">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D8%A7%D9%84%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2474/" rel="">التحكم بألوان الإضاءة باستخدام أردوينو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%B2%D9%8A%D9%86%D8%A9-%D8%A8%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2463/" rel="">إضاءة زينة بأنماط مختلفة باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D8%A7%D9%84%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2474/" rel="">التحكم بألوان الإضاءة باستخدام الأردوينو Arduino</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2479</guid><pubDate>Wed, 25 Dec 2024 15:04:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x623;&#x644;&#x648;&#x627;&#x646; &#x627;&#x644;&#x625;&#x636;&#x627;&#x621;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A3%D9%84%D9%88%D8%A7%D9%86-%D8%A7%D9%84%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2474/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/Arduino_.png.f54886f2a169b4fe33f66184960334b0.png" /></p>
<p>
	سنتعلم في هذا المقال كيفية بناء مشروع أردوينو للتحكم بألوان الإضاءة، ونتعرف على أفكار جديدة تساعدنا على تطوير مهاراتنا الإلكترونية والبرمجية، حيث سنستخدم عناصر بسيطة مثل ليد إضاءة متعدد الألوان من نوع RGB LED، وثلاثة مقاومات متغيرة Potentiometers، ومفتاح ضغط لحظي Push Button، ونربطها جميعًا مع لوحة الأردوينو.
</p>

<h2 id="arduino-1">
	فكرة مشروع التحكم بألوان الإضاءة باستخدام الأردوينو Arduino
</h2>

<p>
	يهدف مشروعنا إلى التحكم في شدة ألوان الإضاءة من خلال مصابيح LED RGB باستخدام لوحة الأردوينو، وهو يعمل وفق ثلاثة أنماط رئيسية:
</p>

<ul>
	<li>
		<strong>النمط الأول</strong>: نضيء الليد بشكل تلقائي وبعدة ألوان مختلفة، ونغير اللون كل فترة زمنية تحدد من خلال مقاومة متغيرة Potentiometer حيث يمكننا تدوير القرص الخاص بها لزيادة أو تقليل الزمن مع الانتباه لأن الزمن لن يتجاوز مجال محدد برمجيًا.
	</li>
	<li>
		<strong>النمط الثاني</strong>: نولد ألوانًا عشوائية بالضغط على مفتاح الضغط اللحظي Push Button، فعند كل ضغطة على المفتاح تتغير شدة إضاءة اللون الأحمر والأخضر والأزرق عشوائيًا ضمن مجال قيم من 0 إلى 255.
	</li>
	<li>
		<strong>النمط الثالث</strong>: نحدد شدة إضاءة كل لون من الألوان الأساسية الخاصة بهذا الليد كالأحمر أو الأخضر أو الأزرق من خلال ثلاثة مقاومات متغيرة، وعند تدوير القرص الخاص بكل مقاومة تتغير شدة إضاءة اللون الخاص بهذه المقاومة للحصول على اللون الذي نريده.
	</li>
</ul>

<h2 id="arduino-2">
	العناصر المستخدمة لمشروع التحكم بألوان الإضاءة
</h2>

<p>
	سنستخدم في مشروعنا مجموعة من العناصر الإلكترونية والأدوات وهي كالتالي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		مقياس متعدد Multimeter
	</li>
	<li>
		ليد متعدد الألوان RGB LED من نوع CC عدد 1
	</li>
	<li>
		مفتاح الضغط اللحظي Push Button عدد 1
	</li>
	<li>
		مقاومة بقيمة 220 أوم عدد 3
	</li>
	<li>
		مقاومة متغيرة Potentiometer بقيمة 10 كيلو أوم عدد 3
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<p>
	وقد تعرفنا على معظم هذه العناصر في <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88/" rel="">المقالات السابقة من السلسلة</a>، ولكن هناك عنصر جديد لم نتعامل معه بعد، وهو الليد متعدد الألوان RGB LED وسنعرفكم عليه في الفقرات التالية.
</p>

<h2 id="rgbled">
	ما هو الليد متعدد الألوان RGB LED
</h2>

<p>
	هو عبارة عن ثلاثة ليدات بالألوان الأساسية الأحمر والأخضر والأزرق مدمجة داخليًا في ليد واحد، نستطيع من خلاله الحصول على أي لون نريده عن طريق دمج هذه الألوان الأساسية. فللحصول على اللون الأزرق باستخدام الليد متعدد الألوان يمكننا تشغيل الليد الأزرق بأقصى شدة إضاءة وإطفاء الليدين الأحمر والأخضر، وللحصول على اللون الأبيض يمكننا تشغيل جميع الليدات بأقصى شدة إضاءة ممكنة، وهكذا نستطيع الحصول على أي لون نريده من خلال تحديد شدة إضاءة كل ليد، وبما أن الليدات تكون قريبة من بعضها بشكل كبير فإن عين الإنسان لن تلاحظ الألوان بشكل منفصل عن بعضها نسبيًا وإنما سترى نتيجة دمج إضاءة الليدات الثلاثة مع بعضها. وكنا قد شرحنا في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D9%84%D9%8A%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B6%D8%A7%D8%A1%D8%A9-%D9%88%D8%B4%D8%AF%D8%A9-%D8%A5%D8%B6%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2465/" rel="">المقال السابق</a> كيفية التحكم بشدة إضاءة الليد وآلية الحصول على جهد متغير من مصدر جهد ثابت من خلال تقنية تعديل عرض النبضة PWM.
</p>

<p>
	توضح الصورة الآتية طريقة دمج الألوان الرئيسية مع بعضها وكيفية الحصول على ألوان أخرى:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164337" href="https://academy.hsoub.com/uploads/monthly_2024_12/1659046385_.JPG.a92f664cac5899465c9ebdbe0e2206f2.JPG" rel=""><img alt="دمج الألوان" class="ipsImage ipsImage_thumbnailed" data-fileid="164337" data-ratio="78.00" data-unique="cosdd6xx2" style="width: 300px; height: auto;" width="300" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.164ab161bf805f9ec63d53e66b6f96ba.JPG"> </a>
</p>

<h2 id="rgbled-1">
	أنواع الليد متعدد اللون RGB LED
</h2>

<p>
	هناك نوعان من الليدات متعددة الألوان RGB LEDs من حيث البنية وهما:
</p>

<h3 id="commonanodes">
	1. ليد متعددة الألوان بمصاعد مشتركة Common Anodes
</h3>

<p>
	في الليد متعددة الألوان ذي المصاعد المشتركة Common Anodes أو ما يعرف اختصارًا بالرمز CA، توصل أقطاب المصاعد لجميع الليدات -أي القطب الموجب لكل ليد- مع بعضها البعض، ونتحكم في زيادة شدة إضاءة كل لون من خلال خفض قيمة الجهد الخاص بكل ليد من خلال المتحكم، أما القطب المشترك فينبغي علينا توصيله مع القطب الموجب 5v.
</p>

<h3 id="commoncathodes">
	2. ليد متعددة الألوان بمهابط مشتركة Common Cathodes
</h3>

<p>
	في الليد متعددة الألوان ذي المهابط المشتركة Common Cathodes أو ما يعرف اختصارًا بالرمز CC، نوصل أقطاب المهابط لجميع الليدات -أي القطب السالب لكل ليد- ببعضها، ونتحكم في زيادة شدة إضاءة كل لون من خلال رفع قيمة الجهد الخاص بكل ليد من خلال المتحكم، أما القطب المشترك فعلينا توصيله مع القطب السالب GND.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164334" href="https://academy.hsoub.com/uploads/monthly_2024_12/414961451_.JPG.6b6c116af06feabbd5e90850e2c8d058.JPG" rel=""><img alt="أنواع الليدات" class="ipsImage ipsImage_thumbnailed" data-fileid="164334" data-unique="d6b0pxq5h" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.2bd46944e392415c8c4b750d3b219a21.JPG"> </a>
</p>

<h2 id="">
	أقطاب الليد متعدد الألوان
</h2>

<p>
	سواء كان الليد الذي لديك من نوع CA أو CC ستجد أن له أربعة أقطاب وهي:
</p>

<ul>
	<li>
		قطب لليد الأحمر Red LED
	</li>
	<li>
		قطب لليد الأخضر Green LED
	</li>
	<li>
		قطب لليد الأزرق Blue LED
	</li>
	<li>
		قطب مشترك Common
	</li>
</ul>

<p>
	توضح الصورة الآتية أقطاب الليد في حال كان من نوع CA أو CC
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164331" href="https://academy.hsoub.com/uploads/monthly_2024_12/1151138396_.JPG.786dbeb0bfbb5db548dfc2f03885aca7.JPG" rel=""><img alt="أقطاب الليد" class="ipsImage ipsImage_thumbnailed" data-fileid="164331" data-ratio="55.67" data-unique="wel7piiku" style="width: 300px; height: auto;" width="300" src="https://academy.hsoub.com/uploads/monthly_2024_12/1151138396_.JPG.786dbeb0bfbb5db548dfc2f03885aca7.JPG"> </a>
</p>

<p>
	كما نلاحظ من الصورة السابقة فالقطب المشترك Common يملك الرجل الأطول دائمًا، ويمكن معرفة نوع الليد الذي لديك باستخدام جهاز القياس المتعدد Multimeter وذلك في وضع فحص الليد وتجريب ما يلي:
</p>

<ul>
	<li>
		نوصل القطب المشترك لليد أي أطول رجل مع الطرف الأحمر الموجب للمقياس، ونوصل إحدى الأقطاب الأخرى لليد مع الطرف الأسود السالب للمقياس، في حال إضاءة الليد يكون من نوع مصعد مشترك Common Anode أو CA
	</li>
	<li>
		نوصل القطب المشترك لليد وهي أطول رجل مع الطرف الأسود السالب للمقياس، ونوصل إحدى الأقطاب الأخرى لليد مع الطرف الأحمر الموجب للمقياس، في حال إضاءة الليد يكون من نوع مهبط مشترك Common cathode أو CC
	</li>
</ul>

<h2 id="-1">
	مخطط توصيل مشروع التحكم بألوان الإضاءة
</h2>

<p>
	بعد أن تعرفنا بالتفصيل على الليد متعدد الألوان المستخدم في مشروعنا الحالي، دعنا نوضح الخطوات المطلوبة لتوصيل العناصر والأسلاك مع لوحة الأردوينو Arduino وتحقيق فكرة المشروع كما في الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164338" href="https://academy.hsoub.com/uploads/monthly_2024_12/1748991078_.JPG.25c97c4389c1e192dc7c795c35ae94e6.JPG" rel=""><img alt="مخطط توصيل المشروع السابع" class="ipsImage ipsImage_thumbnailed" data-fileid="164338" data-ratio="37.00" data-unique="64z0aabgc" style="width: 500px; height: 185px;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.6f8a6ce91a3280dffdfb9f61393c795f.JPG"></a>
</p>

<ul>
	<li>
		نصل أقطاب التغذية في لوحة الأردوينو أونو مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
	</li>
	<li>
		نصل الرجل الأطول التي تمثل القطب المشترك لليد المتعدد الألوان RGB LED مع المسرى السالب في لوحة توصيل التجارب BreadBoard، حيث أن الليد الذي لدينا من نوع CC
	</li>
	<li>
		نصل الأرجل الخاصة بكل لون الأحمر والأخضر والأزرق من الليد مع الرجل الأولى للمقاومات ذات القيمة 220 أوم الخاصة بكل لون، ونوصل الرجل الأخرى للمقاومات مع الأقطاب 11 و 10 و 9 على الترتيب في لوحة الأردوينو أونو
	</li>
	<li>
		نصل رجل التغذية الأولى Vcc لجميع المقاومات المتغيرة مع بعضها البعض، ومن ثم نوصل رجل التغذية الموجب Vcc لإحدى المقاومات المتغيرة مع المسرى الموجب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نصل رجل التغذية الأخرى Gnd لجميع المقاومات المتغيرة مع بعضها البعض، ومن ثم نوصل رجل التغذية السالبة GND لإحدى المقاومات المتغيرة مع المسرى السالب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نصل رجل إشارة الخرج التشابهي Analog Output والتي تسمى Sig للمقاومة المتغيرة الأولى مع القطب A0 في لوحة الأردوينو أونو
	</li>
	<li>
		نصل رجل إشارة الخرج التشابهي Sig للمقاومة المتغيرة الثانية مع القطب A1 في لوحة الأردوينو أونو
	</li>
	<li>
		نصل رجل إشارة الخرج التشابهي Sig للمقاومة المتغيرة الثالثة مع القطب A2 في لوحة الأردوينو أونو
	</li>
	<li>
		نصل الطرف الأول لمفتاح الضغط اللحظي Push Button مع المسرى السالب للوحة التجارب، ثم نوصل الطرف الثاني للمفتاح Push Button مع القطب رقم 3 في لوحة الأردوينو أونو
	</li>
	<li>
		سنفعّل مقاومة الرفع الداخلية على القطب رقم 3 للمتحكم الموجود في لوحة الأردوينو برمجيًا، لذا لا داعي لتوصيل مقاومة رفع Pull-Up أو مقاومة خفض Pull-Down مع مفتاح الضغط اللحظي Push Button
	</li>
</ul>

<h2 id="arduino-3">
	الكود البرمجي لمشروع التحكم بألوان الإضاءة في أردوينو
</h2>

<p>
	سنعرف مجموعة من الماكرو في بداية <a href="https://wiki.hsoub.com/Arduino/arduinoide" rel="external">الكود البرمجي</a> لتحديد أرقام الأقطاب الرقمية لمفتاح الضغط اللحظي Push Button والليد متعدد الألوان RGB LED وأرقام الأقطاب التشابهية للمقاومات المتغيرة الثلاثة، وقد شرحنا كيفية استخدام الماكرو في مقال سابق في هذه السلسلة يمكنك الرجوع إليه من خلال مقال <a href="" rel="">تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino</a> كما يمكنك الاطلاع أكثر على مفهوم الماكرو وأنواعه من خلال مقال <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%85%D8%A7%D9%83%D8%B1%D9%88-macro-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprocessor-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1750/" rel="">الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C</a>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_10" style=""><span class="com">#define</span><span class="pln"> RED_LED </span><span class="lit">11</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> GREEN_LED </span><span class="lit">10</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> BLUE_LED </span><span class="lit">9</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> RED_Pot A0
</span><span class="com">#define</span><span class="pln"> GREEN_Pot A1
</span><span class="com">#define</span><span class="pln"> BLUE_Pot A2

</span><span class="com">#define</span><span class="pln"> BUTTON </span><span class="lit">3</span></pre>

<p>
	سنعرف بعد ذلك متغير <code>Mode</code> من نوع عدد صحيح <code>int</code> بقيمة ابتدائية تساوي 1، وظيفة هذا المتغير تحديد نمط عمل المشروع، حيث أن لدينا ثلاثة أنماط كما ذكرنا سابقًا، بالتالي ستكون قيمته إما 1 أو 2 أو 3.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_12" style=""><span class="typ">int</span><span class="pln"> MODE </span><span class="pun">=</span><span class="pln">  </span><span class="lit">1</span><span class="pun">;</span></pre>

<p>
	سنضبط نوع الأقطاب في الدالة الرئيسية <code><a href="https://wiki.hsoub.com/Arduino/setup" rel="external">()setup</a></code> من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a></code> التي تأخذ وسيطين الأول رقم القطب والثاني نوع القطب إما خرج <code>OUTPUT</code> أو دخل <code>INPUT</code>، حيث أن الأقطاب الخاصة بالليد متعدد الألوان هي أقطاب خرج <code>OUTPUT</code>، وسيُضبَط القطب الخاص بالمفتاح كقطب دخل مع تفعيل مقاومة الرفع الداخلية <code>INPUT_PULLUP</code>، أما أقطاب المقاومات المتغيرة ستكون أقطاب دخل <code>INPUT</code> ومن الممكن عدم ضبط نوع أقطاب المقاومات لأن الحالة الافتراضية لجميع الأقطاب في بيئة الأردوينو هي أقطاب دخل <code>INPUT</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_17" style=""><span class="kwd">void</span><span class="pln">  setup</span><span class="pun">()</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
pinMode</span><span class="pun">(</span><span class="pln">RED_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
pinMode</span><span class="pun">(</span><span class="pln">GREEN_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
pinMode</span><span class="pun">(</span><span class="pln">BLUE_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
pinMode</span><span class="pun">(</span><span class="pln">BUTTON</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعدها سنعرف دالة باسم <code>()setColor</code> هدفها عدم تكرار كتابة التعليمات البرمجية الخاصة بتشغيل الليد ثلاث مرات فهناك ثلاثة أقطاب لليد، وإنما سنستخدم هذه الدالة من خلال سطر برمجي واحد، وتأخذ هذه الدالة ثلاثة وسطاء هي قيم شدة إضاءة الألوان الثلاث الأحمر والأخضر والأزرق على الترتيب، سنستدعي داخل هذه الدالة الدالة المدمجة <a href="" rel=""><code>()analogWrite</code></a> لتوليد إشارة PWM لكل لون، والتي تأخذ بدورها وسيطين الأول رقم القطب <code>Pin</code> والثاني دورة العمل <code>Duty Cycle</code> وتكون ضمن المجال من 0 وحتى 255.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_19" style=""><span class="kwd">void</span><span class="pln"> setColor</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> red</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> green</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> blue</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">RED_LED</span><span class="pun">,</span><span class="pln"> red</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">GREEN_LED</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">BLUE_LED</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	كما سنُعرّف دالة جديدة باسم <code>()GET_MODE</code>، مسؤولة عن تحديد نمط عمل الجهاز بناءً على مدة الضغط على المفتاح اللحظي. سنعرّف داخل هذه الدالة، متغيرًا باسم Time من نوع عدد صحيح int بقيمة ابتدائية تساوي صفر.
</p>

<p>
	بعدها سنفحص من خلال الحلقة التكرارية ()while حالة المفتاح فالحلقة تستمر في العمل طالما زمن الضغط أقل من 1 ثانية. فإذا كانت قيمة Time تساوي صفر أي أن المفتاح مضغوط، سنزيد قيمة المتغير Time بمقدار 10. بعد ذلك، سنضيف تأخير زمني قدره 10 مللي ثانية باستخدام الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/time/delay" rel="external">()delay</a>.
</p>

<p>
	إذا استمر الضغط على المفتاح لمدة 1000 مللي ثانية أي عندما تصل قيمة المتغير Time إلى 1000، سيومض الليد باللون الأحمر عدة مرات كمؤشر للمستخدم لتغيير النمط. بعد ذلك سنزيد قيمة متغير النمط Mode بمقدار 1. إذا أصبحت قيمة المتغير Mode أكبر من 3، سنعيد قيمته إلى 1. وأخيرًا، نخرج من الحلقة التكرارية while.
</p>

<p>
	أما إذا كانت قيمة المتغير Time أقل من 1000، فسنستمر في التكرار داخل الحلقة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_22" style=""><span class="kwd">void</span><span class="pln"> GET_MODE</span><span class="pun">(){</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Time</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">while</span><span class="pun">(!</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">BUTTON</span><span class="pun">)){</span><span class="pln">
    </span><span class="typ">Time</span><span class="pun">+=</span><span class="lit">10</span><span class="pun">;</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Time</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">){</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">   
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">  
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">  
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln"> 
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">

      MODE</span><span class="pun">++;</span><span class="pln">
      </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> MODE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنستدعي في بداية الدالة التكرارية <code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> الدالة <code>()GET_MODE</code> لتحديث قيمة المتغير الخاص بالنمط <code>MODE</code>، ومن ثم نتحقق من قيمة هذا المتغير باستخدام العبارة الشرطية <code>()if</code> على النحو التالي:
</p>

<ul>
	<li>
		<strong>في حال قيمة <code>MODE </code>تساوي 1</strong><span>: </span>يعمل المشروع وفق النمط الأول، وفيه نعرّف متغير <code>Delay_Speed</code> من نوع صحيح <code>int</code> لتخزين التأخير الزمني بين إضاءة كل لون والآخر، ونحصل على قيمة التأخير الزمني من خلال قراءة قيمة المقاومة المتغيرة الأولى الموصولة على القطب <code>A0</code> من خلال الدالة <a href="" rel=""><code>()analogRead</code></a> التي تأخذ وسيطًا واحدًا <code>Pin</code> وهو رقم القطب الموصول عليه العنصر التشابهي، وتعيد قيمة عددية صحيحة ضمن المجال من 0 إلى 1023 تمثل القيمة الرقمية المقابلة لقيمة الجهد الموصول على القطب المحدد <code>Pin</code>. بعدها نحول المجال من 0-1023 إلى 100-1500 مللي ثانية من خلال الدالة <a href="" rel=""><code>()map</code></a>، وبعد ذلك سنشغّل الليد باستدعاء الدالة <code>()setColor</code> بعدة ألوان مختلفة.
	</li>
	<li>
		<strong>في حال قيمة <code>MODE </code>تساوي </strong> <strong>2</strong>: يعمل المشروع وفق النمط الثاني، سنتحقق في هذا النمط من حالة المفتاح في حال كان مضغوط سنولد ثلاثة قيم عشوائية ضمن المجال 0-255 باستخدام الدالة <a href="" rel=""><code>()random</code></a> التي تأخذ وسيطين الأول أصغر قيمة للرقم، والثاني هو أكبر قيمة للرقم، وتعيد رقم عشوائي من نوع <code>long</code> خاص بقيم الألوان الثلاث الأحمر والأخضر والأزرق، ومن ثم سنشغل الليد باستدعاء الدالة <code>()setColor</code> مع تمرير القيم السابقة له، وهكذا يضيء الليد بشكل عشوائي في كل مرة يُضغط المفتاح.
	</li>
	<li>
		<strong>في حال قيمة <code>MODE </code>تساوي 3</strong>:  يعمل المشروع وفق النمط الثالث، وفي هذا النمط سنعرف ثلاثة متغيرات خاصة بتخزين قيم قراءات المقاومات المتغيرة الثلاث، وسنعمل على تحويل الدقة من 10 بت وهي دقة المبدل التناظري إلى رقمي ADC، إلى 8 بت وهي دقة تعديل عرض النبضة PWM. وذلك عن طريق إزاحة القيم بمقدار 2 بت نحو اليمين. ومن ثم تشغيل الليد باستدعاء الدالة الخاصة <code>()setColor</code> وتمرير المتغيرات الثلاثة التي تحتوي على قيم كل لون.
	</li>
</ul>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_25" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  GET_MODE</span><span class="pun">();</span><span class="pln">

  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">){</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Delay_Speed</span><span class="pln"> </span><span class="pun">=</span><span class="pln">  </span><span class="typ">map</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">RED_Pot</span><span class="pun">),</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1500</span><span class="pun">);</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">   </span><span class="com">// Red</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Yellow</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">   </span><span class="com">// Green</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Cyan</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">   </span><span class="com">//Blue </span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Magenta</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">){</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">BUTTON</span><span class="pun">)){</span><span class="pln">
      </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Red</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">int</span><span class="pln"> green </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">int</span><span class="pln"> blue </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="typ">Red</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">   
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">==</span><span class="pln"> </span><span class="lit">3</span><span class="pun">){</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> RED_POT_VAL </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">RED_Pot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> GREEN_POT_VAL </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">GREEN_Pot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> BLUE_POT_VAL </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">BLUE_Pot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="pln">RED_POT_VAL</span><span class="pun">,</span><span class="pln"> GREEN_POT_VAL</span><span class="pun">,</span><span class="pln"> BLUE_POT_VAL</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-4">
	الكود البرمجي النهائي للمشروع
</h2>

<p>
	فيما يلي الكود الكامل لمشروع التحكم بألوان الإضاءة باستخدام الأردوينو Arduino:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6379_27" style=""><span class="com">#define</span><span class="pln"> RED_LED </span><span class="lit">11</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> GREEN_LED </span><span class="lit">10</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> BLUE_LED </span><span class="lit">9</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> RED_Pot A0 
</span><span class="com">#define</span><span class="pln"> GREEN_Pot A1 
</span><span class="com">#define</span><span class="pln"> BLUE_Pot A2

</span><span class="com">#define</span><span class="pln"> BUTTON </span><span class="lit">3</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> MODE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">GREEN_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BLUE_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BUTTON</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  GET_MODE</span><span class="pun">();</span><span class="pln">

  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">){</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Delay_Speed</span><span class="pln"> </span><span class="pun">=</span><span class="pln">  </span><span class="typ">map</span><span class="pun">(</span><span class="pln">analogRead</span><span class="pun">(</span><span class="pln">RED_Pot</span><span class="pun">),</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1500</span><span class="pun">);</span><span class="pln">

    setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">   </span><span class="com">// Red</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">

    setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Yellow</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">

    setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">   </span><span class="com">// Green</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">

    setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">// Cyan</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">

    setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">   </span><span class="com">//Blue </span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">

    setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln"> </span><span class="com">//Magenta</span><span class="pln">
    delay</span><span class="pun">(</span><span class="typ">Delay_Speed</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">){</span><span class="pln">
     </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">BUTTON</span><span class="pun">)){</span><span class="pln">
      </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Red</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">int</span><span class="pln"> green </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">int</span><span class="pln"> blue </span><span class="pun">=</span><span class="pln"> random</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="typ">Red</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">   
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">==</span><span class="pln"> </span><span class="lit">3</span><span class="pun">){</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> RED_POT_VAL </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">RED_Pot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> GREEN_POT_VAL </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">GREEN_Pot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    </span><span class="typ">int</span><span class="pln"> BLUE_POT_VAL </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">BLUE_Pot</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&gt;&gt;</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span><span class="pln">
    setColor</span><span class="pun">(</span><span class="pln">RED_POT_VAL</span><span class="pun">,</span><span class="pln"> GREEN_POT_VAL</span><span class="pun">,</span><span class="pln"> BLUE_POT_VAL</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setColor</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> red</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> green</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> blue</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">RED_LED</span><span class="pun">,</span><span class="pln"> red</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">GREEN_LED</span><span class="pun">,</span><span class="pln"> green</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="pln">BLUE_LED</span><span class="pun">,</span><span class="pln"> blue</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">


</span><span class="kwd">void</span><span class="pln"> GET_MODE</span><span class="pun">(){</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Time</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">while</span><span class="pun">(!</span><span class="pln">digitalRead</span><span class="pun">(</span><span class="pln">BUTTON</span><span class="pun">)){</span><span class="pln">
    </span><span class="typ">Time</span><span class="pun">+=</span><span class="lit">10</span><span class="pun">;</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">10</span><span class="pun">);</span><span class="pln">
    </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Time</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1000</span><span class="pun">){</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">   
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">  
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">255</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">  
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
      setColor</span><span class="pun">(</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln"> 
      delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">

      MODE</span><span class="pun">++;</span><span class="pln">
      </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">MODE </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">3</span><span class="pun">)</span><span class="pln"> MODE </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-2">
	محاكاة مشروع التحكم بألوان الإضاءة بالأردوينو
</h2>

<p>
	سنتبع نفس الخطوات التي تعلمناها في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D9%84%D9%8A%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B6%D8%A7%D8%A1%D8%A9-%D9%88%D8%B4%D8%AF%D8%A9-%D8%A5%D8%B6%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2465/" rel="">مقال التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a> للوصول الى الصفحة الخاصة بمحاكاة مشروعنا على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164332" href="https://academy.hsoub.com/uploads/monthly_2024_12/765848144_.JPG.731a5144630d1a58e2468d566084a51b.JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="164332" data-unique="e4i7ns407" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.3ef08787bfc5171a53a4b80d550690c8.JPG"> </a>
</p>

<p>
	نضيف العناصر الإلكترونية اللازمة للمشروع وهي المقاومة المتغيرة Potentiometer، والليد متعدد الألوان RGB LED، ولوحة التجارب BreadBoard، وزر الضغط Push Button، والمقاومات Resistors.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164340" href="https://academy.hsoub.com/uploads/monthly_2024_12/262746027_.JPG.a635d73122f6adf00459264c1e976304.JPG" rel=""><img alt="إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="164340" data-unique="0kbul0q9o" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.2db5d97966424a9fad15bd84ac9fd346.JPG"> </a>
</p>

<p>
	نغيّر قيم مقاومات الليد إلى 220 أوم من خلال الضغط عليها فتظهر لنا نافذة في الأعلى تمكننا من تغير القيمة والواحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164336" href="https://academy.hsoub.com/uploads/monthly_2024_12/215690924_.JPG.f07b98c403e8f04d3f50497887456a47.JPG" rel=""><img alt="تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="164336" data-unique="hl20bhuoz" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.13355aa9f475ae804fa599af612c4da0.JPG"> </a>
</p>

<p>
	يمكن بالطريقة نفسها تغيير نوع الليد Anode أو Cathode من خلال الضغط عليه فتظهر نافذة بالأعلى نستطيع من خلالها تحديد النوع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164335" href="https://academy.hsoub.com/uploads/monthly_2024_12/2103379182_.JPG.de5cb8347a50be14b1495953d5dc5bf7.JPG" rel=""><img alt="تغير نوع الليد" class="ipsImage ipsImage_thumbnailed" data-fileid="164335" data-unique="1ji3cl4qc" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/2103379182_.JPG.de5cb8347a50be14b1495953d5dc5bf7.JPG"> </a>
</p>

<p>
	نرتب العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
</p>

<p>
	نكتب الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة، ونلاحظ الحالات الآتية:
</p>

<ol>
	<li>
		في البداية سيضيء الليد بعدة ألوان مختلفة بشكل متكرر كل فترة معينة، ندور القرص الخاص بالمقاومة المتغيرة الأولى الموصولة على القطب <code>A0</code> نحو اليمين سنلاحظ عندها أن فترة الإنتقال من لون إلى آخر أصبحت أبطأ، وفي حال تدوير القرص نحو اليسار سنلاحظ أن فترة الانتقال من لون لآخر أصبحت أسرع
	</li>
	<li>
		نضغط على المفتاح بشكل مستمر لمدة 1 ثانية ولاحظ أن الليد يومض باللون الأحمر عدة مرات وهذا يدل على الانتقال من النمط الأول إلى النمط الثاني، سيضئ عندها الليد بلون عشوائي، وعند الضغط اللحظي في كل مرة على المفتاح سيتغير اللون بشكل عشوائي
	</li>
	<li>
		نضغط على المفتاح بشكل مستمر مرة أخرة حتى يومض الليد باللون الأحمر عدة مرات للانتقال من النمط الثاني إلى النمط الثالث، ثم ندور أقراص المقاومات المتغيرات الثلاث نحو أقصى اليسار لإطفاء الليد، ومن ثم ندور القرص الخاص بالمقاومة المتغيرة الأولى نحو اليمين سيضيء الليد عندها باللون الأحمر، وبتدوير القرص الخاص بالمقاومة المتغيرة الثانية نحو اليمين أيضًا بشكل تدريجي سيُدمج اللون الأخضر مع اللون الأحمر بحسب دوران القرص، وبنفس الطريقة نستطيع تدوير القرص الخاص بالمقاومة المتغيرة الثالثة لإضافة اللون الأزرق والحصول على أي لون نريده
	</li>
	<li>
		عند الضغط على المفتاح بشكل مستمر مرة أخرى سيعود الجهاز إلى النمط الأول
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="164333" href="https://academy.hsoub.com/uploads/monthly_2024_12/823624837_.JPG.93528c07a7abbb11f955dd571f826be6.JPG" rel=""><img alt="النتيجة النهائية لمحاكاة المشروع السابع" class="ipsImage ipsImage_thumbnailed" data-fileid="164333" data-unique="v2w274khr" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.be3d49da0b8c13249d3bf5ef7f286e82.JPG"> </a>
</p>

<h2 id="-3">
	الخلاصة
</h2>

<p>
	وصلنا لنهاية مقالنا الذي شرحنا فيه خطوات بناء مشروع للتحكم بألوان الإضاءة باستخدام أردوينو Arduino، واستعرضنا كيفية توصيل العناصر المطلوبة، بما في ذلك لوحة الأردوينو والليد والمقاومات والمفتاح اللحظي،وكتبنا الكود البرمجي اللازم لتحقيق منطق المشروع، وأخيرًا نفذنا مشروعنا من خلال محاكاته على منصة وكوي Wokwi وجربنا الحالات المختلفة لاختباره.
</p>

<h2 id="-4">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<span ipsnoautolink="true">المقال السابق: </span><a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D9%84%D9%8A%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B6%D8%A7%D8%A1%D8%A9-%D9%88%D8%B4%D8%AF%D8%A9-%D8%A5%D8%B6%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2465/" rel="">التحكم بعدد الليدات المضاءة وشدة إضاءتها باستخدام أردوينو </a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%81%D8%AA%D8%A7%D8%AD-%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%84%D8%AD%D8%B8%D9%8A-push-button-%D9%81%D9%8A-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2433/" rel="">التحكم بالليد LED باستخدام مفتاح الضغط اللحظي Push Button والأردوينو Arduino</a><span style="display: none;"> </span>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Arduino/analog_io" rel="external">دوال التحكم بأرجل الدخل والخرج التشابهي في أردوينو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%B2%D9%8A%D9%86%D8%A9-%D8%A8%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2463/" rel="">إضاءة زينة بأنماط مختلفة باستخدام الأردوينو Arduino</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2474</guid><pubDate>Wed, 18 Dec 2024 15:08:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x639;&#x62F;&#x62F; &#x627;&#x644;&#x644;&#x64A;&#x62F;&#x627;&#x62A; &#x627;&#x644;&#x645;&#x636;&#x627;&#x621;&#x629; &#x648;&#x634;&#x62F;&#x629; &#x625;&#x636;&#x627;&#x621;&#x62A;&#x647;&#x627; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D9%84%D9%8A%D8%AF%D8%A7%D8%AA-%D8%A7%D9%84%D9%85%D8%B6%D8%A7%D8%A1%D8%A9-%D9%88%D8%B4%D8%AF%D8%A9-%D8%A5%D8%B6%D8%A7%D8%A1%D8%AA%D9%87%D8%A7-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2465/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/Arduino.png.a604583be3b2e0bfc56f76606124c440.png" /></p>
<p>
	سنشرح في هذا المقال كيفية بناء نظام بسيط يسمح للمستخدم بالتحكم بعدد الليدات المضاءة وشدة إضاءتها، وسنتعلم ما هي العناصر الأساسية اللازمة لتنفيذ المشروع، وكيفية توصيلها وبرمجتها خطوة بخطوة، كما سنستعرض بعض المفاهيم المهمة في مجال الإلكترونيات وبرمجة المتحكمات والأنظمة المدمجة مثل المقاومة المتغيرة Potentiometer، والمبدل التشابهي الرقمي ADC، وتقنية تعديل عرض النبضة PWM.
</p>

<h2 id="">
	فكرة مشروع التحكم بعدد الليدات المضاءة وشدة إضاءتها
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163978" href="https://academy.hsoub.com/uploads/monthly_2024_12/1189552831_.jpg.2ab95a4d12b1545f973db255657bce83.jpg" rel=""><img alt="فكرة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="163978" data-unique="v1os6w9t2" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.d543b94bb1834fdf0dae2b6f98207aba.jpg"> </a>
</p>

<p>
	يحتوي المشروع على أربعة ليدات LEDs يتحكم المستخدم بها من خلال عنصر المقاومة المتغيرة Potentiometer، وسنحتاج هنا لمقاومتين الأولى خاصة بتحديد عدد الليدات المضاءة بحيث يستطيع المستخدم تدوير قرص هذه المقاومة لزيادة أو إنقاص عدد الليدات المضاءة، والثانية خاصة بتحديد شدة إضاءة هذه الليدات ويستطيع المستخدم تدوير قرص هذه المقاومة لزيادة أو إنقاص شدة إضاءة الليدات. مثلًا، إذا كان قرص المقاومة الأولى نحو المنتصف وقرص المقاومة الثانية نحو النهاية في هذه الحالة سيضيء اثنان من الليدات فقط وبشدة إضاءة كاملة 100%، وفي حال كان قرص المقاومة الأولى نحو النهاية وقرص المقاومة الثانية نحو المنتصف عندها ستضيء جميع الليدات بنصف شدة الإضاءة 50%، أما إذا كان قرص المقاومة الأولى أو المقاومة الثانية نحو البداية ستنطفئ جميع الليدات أيًا كان موضع قرص المقاومة الأخرى.
</p>

<h2 id="-1">
	العناصر المستخدمة للمشروع
</h2>

<p>
	سنستخدم مجموعة من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		ليد أحمر Red LED عدد 4
	</li>
	<li>
		مقاومة 220 أوم عدد 4
	</li>
	<li>
		مقاومة متغيرة Potentiometer بقيمة 10 كيلو أوم عدد 2
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<h2 id="potentiometer">
	ما هي المقاومة المتغيرة Potentiometer
</h2>

<p>
	هي إحدى أنواع المقاومات الإلكترونية، وتستخدم كعنصر دخل مع الأردوينو والمتحكمات للحصول على إشارة تشابهية، إذ يمكن تغيير قيمتها بشكل يدوي ضمن مجال من القيم عند تدوير القرص الإسطواني الخاص بها نحو اليمين أو اليسار، وتحتوي على ثلاثة أرجل وهي:
</p>

<ul>
	<li>
		رجل التغذية الموجب Vcc
	</li>
	<li>
		رجل الخرج التشابهي Sig
	</li>
	<li>
		رجل التغذية السالب Gnd
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163967" href="https://academy.hsoub.com/uploads/monthly_2024_12/821231494_.jpg.de59972742aee77b1eeb028057ad73d8.jpg" rel=""><img alt="أقطاب المقاومة المتغيرة" class="ipsImage ipsImage_thumbnailed" data-fileid="163967" data-unique="8bc8qw00w" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.e474cd685d6b0600aeccd78fcdb86259.jpg"> </a>
</p>

<p>
	تعمل المقاومة المتغيرة بنفس مبدأ عمل مقسّم الجهد فيمكن تخيل المقاومة المتغيرة على أنها مقاومتان متصلتان ببعضهما على التسلسل، حيث أن الرجل الأولى للمقاومة الأولى هي رجل التغذية الموجب Vcc، والرجل الثانية للمقاومة الثانية هي رجل التغذية السالب Gnd، أما النقطة المشتركة بين الرجل الثانية للمقاومة الأولى والرجل الأولى للمقاومة الثانية هي رجل الخرج التشابهي Sig كما هو موضح في الصورة الآتية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163980" href="https://academy.hsoub.com/uploads/monthly_2024_12/723132273_.jpg.75b02a98cb6c7fe7ea24ed146598a8e0.jpg" rel=""><img alt="مقسم الجهد" class="ipsImage ipsImage_thumbnailed" data-fileid="163980" data-unique="gm7dpxaoo" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.4aca3ae135d520e1d1eb8ed896e77158.jpg"> </a>
</p>

<p>
	وعند تدوير القرص الخاص بالمقاومة المتغيرة Potentiometer فإن نسبة المقاومة الأولى ستزيد أو تنقص بالنسبة للمقاومة الثانية بحسب جهة تدوير القرص، بالتالي ستتغير قيمة جهد الخرج ضمن مجال لا يتجاوز جهد التغذية، فعندما تكون المقاومة المتغيرة في المنتصف أي قيمة المقاومة الأولى مماثلة مع قيمة المقاومة الثانية فإن قيمة جهد الخرج سيكون مساويًا لنصف قيمة جهد التغذية.
</p>

<h2 id="analogtodigitalconverter">
	المبدل التشابهي الرقمي Analog to Digital Converter
</h2>

<p>
	هو أحد أهم الأجزاء الموجودة في لوحة الأردوينو ويعرف اختصارًا ADC، يسمح بتحويل الإشارات التشابهية إلى إشارات رقمية يستطيع الأردوينو قراءتها والتعامل معها، ويستخدم في العديد من التطبيقات مثل قياس درجة الحرارة وقياس شدة الإضاءة وقياس التيار والجهد الكهربائي وغيرها من الإشارات التشابهية.
</p>

<p>
	تحتوي لوحة أردوينو أونو على 6 أقطاب تشابهية من A0 وحتى A5 كما شرحنا في مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>، ويمكن استخدام هذه الأقطاب لقراءة الإشارات التشابهية ضمن المجال من 0 إلى 5 فولت وتجدر الإشارة لأن قيمة الإشارة التشابهية لا يجب أن تتجاوز هذا المجال وإلا ستؤدي إلى حدوث خلل في المتحكم، ويعد المبدل التشابهي الرقمي الموجود في لوحة الأردوينو أونو Arduino Uno بدقة 10 بت، مما يعني أنه يمكن تحويل قيمة الجهد التي تقع بين 0 و 5 فولت إلى قيمة عددية صحيحة مقابلة لها تقع بين 0 و 1023 وبالتالي تكون دقة عمليات قراءة القيم التشابهية هي 1024/ 5 أو 0.0049 فولط بكل وحدة رقمية.
</p>

<h2 id="potentiometerarduino">
	توصيل المقاومة المتغيرة Potentiometer مع الأردوينو Arduino
</h2>

<p>
	سنوضح في هذا الجزء طريقة ربط المقاومة المتغيرة مع الأردوينو من خلال مثال بسيط يقرأ القيم التشابهية من خرج المقاومة المتغيرة من خلال القطب رقم A0 في لوحة الأردوينو أونو Arduino Uno ومن ثم عرضها على نافذة الاتصال التسلسلية Serial Monitor ونافذة Serial Plotter.
</p>

<p>
	لإجراء التوصيل الخاص بهذا المثال في البداية سنصل أرجل التغذية Vcc, Gnd للمقاومة المتغيرة مع القطب 5v والقطب GND في لوحة الأردوينو، وليس هناك فرق في حال أجرينا التوصيل بشكل معاكس لأن المقاومة ليس لها قطبية فستختلف جهة التدوير فقط، ومن ثم سنصل رجل الخرج التشابهي Sig للمقاومة المتغيرة مع القطب A0 في لوحة الأردوينو أونو Arduino Uno.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163977" href="https://academy.hsoub.com/uploads/monthly_2024_12/1028706091_.jpg.1a40f6add9f0c5c8bc0fcf7d1c00dad1.jpg" rel=""><img alt="توصيل المقاومة المتغيرة" class="ipsImage ipsImage_thumbnailed" data-fileid="163977" data-unique="nmeehqdct" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.4defaf485909f009e1249623f58f70e8.jpg"> </a>
</p>

<p>
	لكتابة الكود البرمجي، سنفعّل واجهة الاتصال التسلسلية Serial Communication داخل الدالة الرئيسية <code><a href="https://wiki.hsoub.com/Arduino/setup" rel="external">()setup</a></code> باستدعاء التابع <a href="https://wiki.hsoub.com/Arduino/serial/begin" rel="external"><code>Serial.begin()‎</code></a> الذي يأخذ وسيطين الأول أساسي وهو سرعة نقل البيانات <code>Baud rate</code> بمعدل بت في الثانية وسنختار هنا القيمة <code>9600</code>، والثاني اختياري وهو خاص بضبط الإعدادات <code>config</code> الأخرى لواجهة الاتصال ويمكن تركه فارغًا حيث يأخذ الضبط الافتراضي <code>SERIAL_8N1</code> في هذه الحالة.
</p>

<p>
	أما في الدالة التكرارية <code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> فسنعرف متغير صحيح من نوع <code>int</code> تخزن فيه قيمة قراءة المبدل التشابهي الرقمي ADC من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/analog_io/analogread" rel="external"><code>analogRead()‎‎</code></a> التي تأخذ وسيطًا واحدًا <code>Pin</code> وهو رقم القطب الموصول عليه العنصر التشابهي وقيمته من A0 إلى A5 في لوحة الأردوينو أونو Arduino Uno وتعيد قيمة عددية صحيحة ضمن المجال 0 إلى 1023 وتمثل القيمة الرقمية المقابلة لقيمة الجهد الموصول على القطب المحدد <code>Pin</code>، ومن ثم سنطبع هذه القيمة على نافذة الاتصال التسلسلي باستدعاء الدالة <a href="" rel=""><code>()Serial.println</code></a>، وفي النهاية سنستخدم الدالة <a href="" rel=""><code>()delay</code></a> لعمل تأخير زمني حيث نمرر لها الزمن المطلوب بواحدة ميللي ثانية ms.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_14" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Val</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="pln">A0</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="typ">Val</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد توصيل لوحة الأردوينو مع الحاسوب ورفع الكود البرمجي، سنذهب إلى قائمة أدوات Tools ومن ثم نختار أداة Serial Plotter لإظهار القيم على شكل منحني بياني أو Serial Monitor لعرضها على شكل قيم رقمية، والآن جرب تدوير القرص الخاص بالمقاومة المتغيرة نحو اليمين أو اليسار ستلاحظ أن القراءات ستتغير ولكنها لن تتجاوز المجال 0 إلى 1023.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163971" href="https://academy.hsoub.com/uploads/monthly_2024_12/1666032218_.jpg.002062f26aca39472d301f9f9fef999c.jpg" rel=""><img alt="القراءات على شكل قيم" class="ipsImage ipsImage_thumbnailed" data-fileid="163971" data-unique="ie6oof95h" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.30663ce1569434dd6a3d49af576f8848.jpg"> </a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163972" href="https://academy.hsoub.com/uploads/monthly_2024_12/637382461_.jpg.97acd792b81c4de9995e5711de5afdf9.jpg" rel=""><img alt="القراءات على شكل منحني" class="ipsImage ipsImage_thumbnailed" data-fileid="163972" data-unique="ntzvt8s50" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.7d797616b0ece92251c1c87c1b9651d5.jpg"> </a>
</p>

<h2 id="pulsewidthmodulation">
	تقنية تعديل عرض النبضة
</h2>

<p>
	تعرف تقنية عرض النبضة Pulse Width Modulation أو ما بيعرف اختصارًا PWM، بأنها تقنية تستخدم للحصول على جهد بقيمة متغيرة من مصدر جهد رقمي ذي قيمة ثابتة، حيث تتولد إشارة مربعة يكون فيها عرض النبضة متغيرًا وتردد الإشارة الناتجة ثابت، وتستخدم هذه التقنية في تطبيقات عديدة أشهرها التحكم بسرعة محرك والتحكم بشدة الإضاءة.
</p>

<p>
	كي تتمكن من فهم تقنية PWM جيدًا نحتاج أولًا لمعرفة مفهومين مهمين: الأول هو التردد Frequency، والثاني هو دورة العمل Duty Cycle.
</p>

<h3 id="frequency">
	التردد Frequency
</h3>

<p>
	هو عبارة عن عدد مرات تكرار الإشارة في الثانية الواحدة، مثلا عندما نقول أنه لدينا إشارة بتردد 5 هرتز هذا يعني أن الإشارة تتكرر 5 مرات خلال ثانية واحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163969" href="https://academy.hsoub.com/uploads/monthly_2024_12/1047806583_.jpg.b775912d8e948b8d5cb00b4600e9d962.jpg" rel=""><img alt="التردد" class="ipsImage ipsImage_thumbnailed" data-fileid="163969" data-unique="n7r8632d9" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.5f67338c511a7ac8fd831ec991b52241.jpg"> </a>
</p>

<h3 id="dutycycle">
	دورة العمل Duty Cycle
</h3>

<p>
	أي إشارة رقمية تتكون من فترة تشغيل HIGH وفترة إيقاف LOW، وتعرف فترة التشغيل بالنسبة للإشارة الكلية بدورة العمل Duty Cycle، وتحسب من العلاقة التالية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_19" style=""><span class="typ">Duty</span><span class="pln"> </span><span class="typ">Cycle</span><span class="pln"> </span><span class="pun">[%]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Ton</span><span class="pun">/(</span><span class="typ">Ton</span><span class="pun">+</span><span class="typ">Toff</span><span class="pun">))</span><span class="pln"> </span><span class="pun">×</span><span class="pln"> </span><span class="lit">100</span></pre>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163981" href="https://academy.hsoub.com/uploads/monthly_2024_12/2107349987_.jpg.ca5b9887e92065c2f01fb463bd0cb4af.jpg" rel=""><img alt="نسبة التشغيل" class="ipsImage ipsImage_thumbnailed" data-fileid="163981" data-unique="cfqcjmznn" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.8b49e285b295093afe9c0d49ead71b05.jpg"> </a>
</p>

<p>
	ومن خلال تكرار حدوث فترة التشغيل HIGH وفترة الإيقاف LOW بتردد مناسب وبنسبة تشغيل Duty Cycle محددة سنحصل على قيمة جهد متغير تحدد قيمته من خلال دورة العمل Duty Cycle ويحسب من العلاقة الآتية:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_22" style=""><span class="typ">Vout</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="typ">Vmax</span><span class="pln"> </span><span class="pun">×</span><span class="pln"> </span><span class="typ">Duty</span><span class="pln"> </span><span class="typ">Cycle</span><span class="pln"> </span><span class="pun">[%]</span></pre>

<p>
	مثال: إذا أردنا الحصول على جهد متغير بقيمة 2 فولت من مصدر جهد ثابت يعطي 5 فولت عند فترة التشغيل HIGH و 0 فولت عند فترة الإيقاف LOW، نستطيع استخدام تقنية تعديل عرض النبضة PWM بنسبة تشغيل 40% من الزمن للحصول على قيمة الجهد المطلوبة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_24" style=""><span class="typ">Vout</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">5v</span><span class="pln"> </span><span class="pun">×</span><span class="pln"> </span><span class="lit">40</span><span class="pun">%</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2v</span></pre>

<p>
	تحتوي لوحة أردوينو أونو Arduino Uno على 6 أقطاب يمكنها توليد إشارة PWM بدقة 8 بت، أي أنها تستطيع تقسيم دورة العمل Duty Cycle إلى 256 قيمة من 0 والتي تكافئ نسبة تشغيل 0% وحتى 255 التي تكافئ نسبة تشغيل 100%، وأرقام هذه الأقطاب هي 3، 5، 6، 9، 10، 11، ويمكن معرفة هذه الأقطاب أيضًا من خلال وجود الرمز <code>~</code> بجانب كل قطب منها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163968" href="https://academy.hsoub.com/uploads/monthly_2024_12/148436467_.jpg.beeb046b226260963584d5b1fcce1eff.jpg" rel=""><img alt="أقطاب تعديل عرض النبضة" class="ipsImage ipsImage_thumbnailed" data-fileid="163968" data-unique="wq3a18v1v" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/148436467_.jpg.beeb046b226260963584d5b1fcce1eff.jpg"> </a>
</p>

<h3 id="ledarduino">
	التحكم بشدة إضاءة ليد LED باستخدام الأردوينو Arduino
</h3>

<p>
	سنوضح طريقة التحكم بشدة إضاءة ليد LED مع لوحة الأردوينو أونو Arduino Uno من خلال مثال بسيط يعطي قيم مختلفة من دورة العمل Duty Cycle بدءًا من 0% التي ينطفئ الليد عندها وحتى 100% التي يضيء الليد عندها بشكل كامل.
</p>

<p>
	لإجراء التوصيل الخاص بهذا المثال في البداية صل الرجل الأطول لليد التي تمثل الطرف الموجب مع القطب رقم 11 في لوحة الأردوينو أونو Arduino Uno، ومن ثم صل الرجل الثانية لليد التي تمثل الطرف السالب مع القطب السالب في لوحة الأردوينو أونو Arduino Uno .
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="163976" href="https://academy.hsoub.com/uploads/monthly_2024_12/1424496575_.jpg.30fa578fbad7330e7a315888a886c696.jpg" rel=""><img alt="توصيل الليد" class="ipsImage ipsImage_thumbnailed" data-fileid="163976" data-unique="7gwgr0i80" style="width: 400px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.jpg.87836fa3118578baa233399d45e398ac.jpg"> </a>
</p>

<p>
	في الدالة الرئيسية <code>()setup</code> سنضبط القطب رقم 11 على أنه قطب خرج OUTPUT من خلال الدالة <a href="" rel=""><code>()pinMode</code></a> التي تأخذ وسيطين الأول رقم القطب والثاني نوع القطب خرج OUTPUT أو دخل INPUT. أما في الدالة التكرارية <code>()loop</code> فسنستخدم الدالة <a href="" rel=""><code>()analogWrite</code></a> لتوليد إشارة PWM، والتي تأخذ وسيطين الأول رقم القطب <code>Pin</code> والثاني دورة العمل <code>Duty Cycle</code> وتكون ضمن المجال من 0 وحتى 255 كما ذكرنا سابقًا، مع إضافة تأخير زمني بين كل نسبة تشغيل والأخرى.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_29" style=""><span class="kwd">void</span><span class="pln"> setup </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
pinMode</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">100</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">200</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  analogWrite</span><span class="pun">(</span><span class="lit">11</span><span class="pun">,</span><span class="pln"> </span><span class="lit">255</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بعد توصيل لوحة الأردوينو مع الحاسوب ورفع الكود البرمجي نلاحظ تغيرات إضاءة الليد، ستزداد شدة الإضاءة كل نصف ثانية حتى تصل إلى الشدة العظمى ومن ثم ستعيد من الصفر.
</p>

<h2 id="-2">
	مخطط توصيل مشروع التحكم بشدة وعدد الإضاءة
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163979" href="https://academy.hsoub.com/uploads/monthly_2024_12/1448740133_.JPG.4cc274f08db48bbbbe9c056346d30a31.JPG" rel=""><img alt="مخطط توصيل المشروع السادس" class="ipsImage ipsImage_thumbnailed" data-fileid="163979" data-unique="if2kt6o6o" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.213d9593a7518be3705bc6a6feb2323e.JPG"> </a>
</p>

<p>
	لنتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino وتنفيذ فكرة مشروعنا:
</p>

<ul>
	<li>
		نصل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة أردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في اللوحة مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
	</li>
	<li>
		نصل الرجل القصيرة التي تمثل الطرف السالب لجميع الليدات مع المسرى السالب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		نصل الرجل الأطول التي تمثل الطرف الموجب لكل ليد من الليدات مع الرجل الأولى للمقاومة ذات القيمة 220 أوم الخاصة بكل ليد، والرجل الأخرى للمقاومة سنوصلها مع الأقطاب 5 و 6 و 9 و 10 على الترتيب في لوحة أردوينو أونو
	</li>
	<li>
		نصل أرجل التغذية Vccو Gnd للمقاومة المتغيرة الأولى والثانية مع المسرى الموجب والسالب في لوحة توصيل التجارب، وليس هناك فرق في حال تم التوصيل بشكل معاكس فالمقاومة ليس لها قطبية
	</li>
	<li>
		نصل رجل الخرج التشابهي Sig للمقاومة المتغيرة الأولى مع القطب A0 في لوحة الأردوينو أونو
	</li>
	<li>
		نصل رجل الخرج التشابهي Sig للمقاومة المتغيرة الثانية مع القطب A1 في لوحة الأردوينو أونو
	</li>
</ul>

<h2 id="arduino-1">
	الكود البرمجي لمشروع التحكم بشدة وعدد الإضاءة باستخدام الأردوينو Arduino
</h2>

<p>
	سنعرّف في بداية الكود مجموعة من الماكرو خاصة بأرقام الأقطاب الرقمية لليدات وأرقام الأقطاب التشابهية للمقاومات المتغيرة الأولى والثانية، وقد شرحنا كيفية استخدام الماكرو في مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%B9%D8%AF%D8%AF-%D9%85%D8%B1%D8%A7%D8%AA-%D9%88%D9%85%D9%8A%D8%B6-%D8%A7%D9%84%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2420/" rel="">تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino</a> كما يمكنك الاطلاع أكثر على مفهوم الماكرو وأنواعه من خلال مقال <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%85%D8%A7%D9%83%D8%B1%D9%88-macro-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprocessor-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1750/" rel="">الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C</a>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_33" style=""><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_One</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_Two</span><span class="pln"> </span><span class="lit">6</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_Three</span><span class="pln"> </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_Four</span><span class="pln"> </span><span class="lit">10</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Sig_One</span><span class="pln"> A0
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Sig_Two</span><span class="pln"> A1</span></pre>

<p>
	سنضبط هذه الأقطاب في الدالة الرئيسية <code>()setup</code> من خلال الدالة<code><a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a></code>، فجميع الأقطاب الخاصة بالليدات هي أقطاب خرج OUTPUT، أما أقطاب المقاومات المتغيرة ستكون أقطاب دخل INPUT، ومن الممكن عدم ضبطها نوع أقطاب المقاومات لأن الحالة الإفتراضية لجميع الأقطاب في بيئة الأردوينو هي أقطاب دخل INPUT.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_35" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وفي الدالة التكرارية <code>()loop</code> سنعرف متغيرين من نوع عدد صحيح <code>int</code>، الأول <code>Number_Of_LEDs</code> خاص بتخزين قيمة إشارة المقاومة المتغيرة الأولى المسؤولة عن تحديد عدد الليدات التي ستضيء، والثاني <code>Brightness</code> خاص بتخزين قيمة إشارة المقاومة الثانية المسؤولة عن تحديد شدة إضاءة الليدات، وتُقرأ القيمة التشابهية للمقاومات من خلال الدالة المدمجة <code>()analogRead</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_37" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="typ">Sig_One</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="typ">Sig_Two</span><span class="pun">);</span></pre>

<p>
	بما أن المبدل التشابهي بدقة 10 بت بالتالي سيكون مجال القيم من 0 إلى 1023 ولكن هنا لدينا فقط أربعة ليدات لذلك نريد تحويل المجال 0 إلى 1023 إلى المجال 0 إلى 4 وذلك من خلال العلاقة <code>1023/(Value1*4)</code>، كذلك الأمر بالنسبة لشدة الإضاءة نريد تحويل المجال 0 إلى 1023 إلى المجال 0 إلى 255، بما أن دقة PWM الموجودة في لوحة الأردوينو أونو هي 8 بت فقط سنستخدم العلاقة <code>(1023/(255*Value2)</code> للتحويل إلى المجال المطلوب
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_39" style=""><span class="pln">  </span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">Brightness</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Brightness</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">255</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">;</span></pre>

<p>
	سنستخدم بعد ذلك العبارة الشرطية <code><a href="https://wiki.hsoub.com/Arduino/if" rel="external">()if</a></code> للتحقق من قيمة المتغير <code>Number_Of_LEDs</code> ووفقًا لقيمته سنحدد عدد الليدات التي ستضيء، أما لتحديد شدة إضاءة الليدات سنستخدم الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/analog_io/analogwrite" rel="external">()analogWrite</a></code> للتحكم بتشغيل وإطفاء الليدات بدلًا من الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external">()digitalWrite</a></code> التي استخدمناها في المشاريع السابقة لأننا نريد أن تكون إضاءة الليدات بشدة محددة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_41" style=""><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">3</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">4</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-2">
	الكود البرمجي النهائي لمشروع التحكم بشدة وعدد الإضاءة بالأردوينو
</h2>

<p>
	فيما يلي الكود البرمجي النهائي لتنفيذ مشروعنا:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2174_43" style=""><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_One</span><span class="pln"> </span><span class="lit">5</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_Two</span><span class="pln"> </span><span class="lit">6</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_Three</span><span class="pln"> </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Red_Led_Four</span><span class="pln"> </span><span class="lit">10</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Sig_One</span><span class="pln"> A0
</span><span class="com">#define</span><span class="pln"> </span><span class="typ">Sig_Two</span><span class="pln"> A1


</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">
</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="typ">Sig_One</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> analogRead</span><span class="pun">(</span><span class="typ">Sig_Two</span><span class="pun">);</span><span class="pln">

  </span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">Brightness</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Brightness</span><span class="pln"> </span><span class="pun">*</span><span class="pln"> </span><span class="lit">255</span><span class="pun">)</span><span class="pln"> </span><span class="pun">/</span><span class="pln"> </span><span class="lit">1023</span><span class="pun">;</span><span class="pln">

  </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">2</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">3</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">else</span><span class="pln"> </span><span class="kwd">if</span><span class="pun">(</span><span class="typ">Number_Of_LEDs</span><span class="pln"> </span><span class="pun">==</span><span class="pln"> </span><span class="lit">4</span><span class="pun">){</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_One</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Two</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Three</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
    analogWrite</span><span class="pun">(</span><span class="typ">Red_Led_Four</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Brightness</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="arduino-3">
	محاكاة مشروع التحكم بشدة وعدد الإضاءة باستخدام الأردوينو
</h2>

<p>
	سنتبع نفس الخطوات التي تعلمناها في <a href="" rel="">مقال التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a> للوصول الى الصفحة الخاصة بمحاكاة المشروع على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163970" href="https://academy.hsoub.com/uploads/monthly_2024_12/1350441052_.JPG.027d8ab062bfa25e5eb2a85190010b5f.JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="163970" data-unique="jp7fxjcp4" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.fdf09aa4fd8181359d017bfcbb740247.JPG"> </a>
</p>

<p>
	نضيف العناصر الإلكترونية اللازمة للمشروع وهي المقاومة المتغيرة Potentiometer و والليدات LEDs والمقاومات Resistors ولوحة التجارب  BreadBoard.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163966" href="https://academy.hsoub.com/uploads/monthly_2024_12/857229322_.JPG.211ef0f4ff80b9bfd0e60c1ebede10de.JPG" rel=""><img alt="إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="163966" data-unique="54gak17rk" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.9d82ef278dcafe569fb62859b6851b2e.JPG"> </a>
</p>

<p>
	نغيّر قيمة مقاومة الليدات إلى 220 أوم من خلال الضغط عليها فتظهر لنا نافذة في الأعلى تمكننا من تغير القيمة والواحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163975" href="https://academy.hsoub.com/uploads/monthly_2024_12/1284873746_.JPG.92f80216d900fd74b5d70295fb79be62.JPG" rel=""><img alt="تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="163975" data-unique="r3mk2e82v" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/1284873746_.JPG.92f80216d900fd74b5d70295fb79be62.JPG"> </a>
</p>

<p>
	بالطريقة نفسها يمكننا تغير ألوان الليدات من خلال الضغط عليها فتظهر نافذة بالأعلى نستطيع من خلالها اختيار اللون.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163974" href="https://academy.hsoub.com/uploads/monthly_2024_12/611099533_.JPG.1e247af99e489abfd0fd7da7dbfe2939.JPG" rel=""><img alt="تغير لون الليد" class="ipsImage ipsImage_thumbnailed" data-fileid="163974" data-unique="6yzejhn4x" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/611099533_.JPG.1e247af99e489abfd0fd7da7dbfe2939.JPG"> </a>
</p>

<p>
	نرتب العناصر على لوحة التجارب بالشكل الذي نراه مناسبًا، ثم نصل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
</p>

<p>
	لنكتب الكود البرمجي في الجزء الخاص به ثم نشغل المحاكاة، ونلاحظ الحالات الآتية:
</p>

<ol>
	<li>
		<p>
			ندور القرص الخاص بالمقاومة المتغيرة الأولى والثانية نحو أقصى اليسار، ونلاحظ أن جميع ستكون الليدات منطفئة في هذه الحالة
		</p>
	</li>
	<li>
		<p>
			ندور القرص الخاص بالمقاومة الأولى نحو اليمين بشكل تدريجي إلى أن يصل إلى أقصى اليمين، ونلاحظ أن جميع الليدات لا تزال منطفئة وذلك لأن قيمة المقاومة المتغيرة الثانية المسؤولة عن شدة إضاءة الليدات هي صفر
		</p>
	</li>
	<li>
		<p>
			عند تدوير القرص الخاص بالمقاومة المتغير الثانية نحو اليمين بشكل تدريجي، ستبدأ الليدات بالإضاءة بشدة متزايدة إلى أن يصل القرص إلى النهاية عندها ستضيء الليدات بالشدة الكاملة
		</p>
	</li>
	<li>
		<p>
			الآن بعد إضاءة الليدات بالشدة الكاملة، ندور القرص الخاص بالمقاومة المتغيرة الأولى نحو اليسار بشكل تدريجي ونلاحظ أن عدد الليدات المضاءة سيتناقص بشكل تدريجي إلى أن يصل القرص إلى البداية عندها ستنطفئ جميع الليدات
		</p>
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163973" href="https://academy.hsoub.com/uploads/monthly_2024_12/1122621670_.JPG.6189bad728f752fa268ed20f58d9d0fc.JPG" rel=""><img alt="النتيجة النهائية لمحاكاة المشروع السادس" class="ipsImage ipsImage_thumbnailed" data-fileid="163973" data-unique="dfegzmxiv" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.7dc9a41c6d4e4d5dd67909d42bb68b71.JPG"> </a>
</p>

<h2 id="-3">
	الخاتمة
</h2>

<p>
	بهذا نكون قد وصلنا لنهاية مقالنا الذي تعلمنا فيه كيفية التحكم بعدد الليدات المضاءة وشدة إضاءتها باستخدام الأردوينو Arduino، وتعرفنا على مجموعة من المصطلحات والمعلومات المهمة في مجال الإلكترونيات والأنظمة المدمجة، نشجعكم لتجربة بناء هذا المشروع والتطوير عليه للحصول على تجربة عملية مفيدة وممتعة.
</p>

<h2 id="-4">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="" rel=""> التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="" rel="">إضاءة زينة بأنماط مختلفة باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="" rel="">أساسيات في عالم الإلكترونيات: التيار والجهد والعناصر الساكنة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">برمجة الروبوت: الدليل الشامل</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2465</guid><pubDate>Thu, 12 Dec 2024 15:08:00 +0000</pubDate></item><item><title>&#x625;&#x636;&#x627;&#x621;&#x629; &#x632;&#x64A;&#x646;&#x629; &#x628;&#x623;&#x646;&#x645;&#x627;&#x637; &#x645;&#x62E;&#x62A;&#x644;&#x641;&#x629; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D8%B6%D8%A7%D8%A1%D8%A9-%D8%B2%D9%8A%D9%86%D8%A9-%D8%A8%D8%A3%D9%86%D9%85%D8%A7%D8%B7-%D9%85%D8%AE%D8%AA%D9%84%D9%81%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2463/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_12/Arduino_.png.9020acc9f1e6ee389919128187bd74e2.png" /></p>
<p>
	سنتعلم في مقال اليوم طريقة تنفيذ أنماط إضاءة مختلفة باستخدام الأردوينو، حيث يمكن استخدامها كإضاءة للزينة في بعض الأماكن مثل السيارات أو قاعات الاحتفال أو استخدامها كإشارة تنبيه لوقوع حالات الطوارئ في بعض الأماكن العامة.
</p>

<h2 id="arduino-1">
	فكرة مشروع إضاءة زينة بأنماط مختلفة بأردوينو
</h2>

<p>
	سنتحكم في آلية عمل مجموعة من الليدات LEDs كي تضيء وفق تسلسل محدد بعدة أنماط مختلفة يمكن التنقل بينها، وذلك من خلال ثمانية لِيدات باللون الأحمر إضافة لليد واحد باللون الأصفر كما سنستخدم مفتاح الضغط اللحظي Push Button في مشروعنا للتنقل بين أنماط الإضاءة عند الضغط عليه بشكل مستمر حتى إضاءة الليد الأصفر، عندها يمكن إزالة الضغط عن المفتاح حيث تستمر إضاءة الليد الأصفر لثلاث ثوان، ومن ثم تنتقل إضاءة الليدات للنمط التالي حيث سننفذ خمسة أنماط بأفكار مختلفة وسنشرح هذه الأنماط لاحقاً في فقرة الكود البرمجي.
</p>

<h2 id="arduino-2">
	العناصر المستخدمة لمشروع إضاءة زينة
</h2>

<p>
	سنستخدم مجموعة من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		ليد اصفر Yellow LED عدد 1
	</li>
	<li>
		ليد أحمر Red LED عدد 8
	</li>
	<li>
		مفتاح من نوع Push Button عدد 1
	</li>
	<li>
		مقاومة بقيمة 220 أوم عدد 9
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<h2 id="">
	مخطط توصيل المشروع
</h2>

<p>
	لتنفيذ فكرة المشروع، اتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino:
</p>

<ul>
	<li>
		صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل.
	</li>
	<li>
		قم بتوصيل الأرجل القصيرة، التي تمثل الأطراف السالبة لجميع الليدات، معًا في نقطة مشتركة، ثم اربط الرجل القصيرة لإحدى الليدات بالمسرى السالب GND على لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		صل الرجل الأطول التي تمثل الطرف الموجب لكل ليد من الليدات الحمراء مع الرجل الأولى للمقاومة ذات القيمة 220 أوم الخاصة بكل ليد، وصل الرجل الأخرى للمقاومة مع أقطاب لوحة الأردوينو أونو Arduino Uno بالترتيب بدءًا من القطب رقم 3 لمقاومة الليد الأول وحتى القطب رقم 9 لمقاومة الليد الثامن
	</li>
	<li>
		صل الرجل القصيرة التي تمثل الطرف السالب لليد الأصفر مع المسرى السالب في لوحة توصيل التجارب BreadBoard أو مع إحدى الأرجل القصيرة لليدات الأخرى
	</li>
	<li>
		صل الرجل الأطول التي تمثل الطرف الموجب لليد الأصفر مع الرجل الأولى للمقاومة ذات القيمة 220 أوم الخاصة بالليد الأصفر، ثم الرجل الأخرى للمقاومة مع القطب رقم 12 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		صل الطرف الأول لمفتاح الضغط اللحظي Push Button مع المسرى السالب للوحة التجارب ثم صل الطرف الثاني للمفتاح مع القطب رقم 2 في لوحة الأردوينو أونو Arduino Uno.
	</li>
	<li>
		سنفعّل مقاومة الرفع الداخلية للقطب رقم 2 في المتحكم الموجود في لوحة الأردوينو Arduino برمجيًا لذلك لا داعي لتوصيل مقاومة رفع Pull-Up أو مقاومة خفض Pull-Down مع مفتاح الضغط اللحظي Push Button.
	</li>
</ul>

<p>
	توضح الصورة الآتية مخطط توصيل المشروع
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163647" href="https://academy.hsoub.com/uploads/monthly_2024_12/475604113_.JPG.e519721cc5c87d4c4eee8b1b6d2f5416.JPG" rel=""><img alt="مخطط توصيل المشروع الخامس" class="ipsImage ipsImage_thumbnailed" data-fileid="163647" data-unique="a3pfb9cou" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.30d0cca40919976e1cf3547415971407.JPG"> </a>
</p>

<h2 id="arduino-3">
	الكود البرمجي لمشروع إضاءة زينة بأنماط مختلفة
</h2>

<p>
	كما رأينا في فقرة مخطط التوصيل، سيوصَّل المفتاح اللحظي مع القطب رقم 2، ويوصَّل الليد الأصفر مع القطب رقم 12، أما الليدات ذات اللون الأحمر فستوصَّل مع الأقطاب من رقم 3 وحتى القطب رقم 10 بالترتيب مع لوحة الأردوينو أونو Arduino Uno .
</p>

<p>
	لذا سنعرف في بداية الكود عدد من الماكرو من نوع <code>define#</code> والتي ستخصص لأرقام الأقطاب لكل من الليد الأصفر والليدات ذات اللون الأحمر والمفتاح، وشرحنا كيفية استخدام الماكرو في مقال سابق في هذه السلسلة يمكنك الرجوع إليه من خلال <a href="" rel="">تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino</a> كما يمكنك الاطلاع أكثر على الماكرو وأنواعه من خلال مقال <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%85%D8%A7%D9%83%D8%B1%D9%88-macro-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprocessor-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1750/" rel="">الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C</a>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_7" style=""><span class="com">#define</span><span class="pln"> BTN_PIN </span><span class="lit">2</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> YELLOW_LED </span><span class="lit">12</span><span class="pln">

</span><span class="com">#define</span><span class="pln"> RED_LED_ONE </span><span class="lit">3</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_TWO </span><span class="lit">4</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_THREE </span><span class="lit">5</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_FOUR </span><span class="lit">6</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_FIVE </span><span class="lit">7</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_SIX </span><span class="lit">8</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_SEVEN </span><span class="lit">9</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> RED_LED_EIGHT </span><span class="lit">10</span></pre>

<p>
	سنحتاج أيضًا لتعريف متغير من نوع <code>int</code> خاص بتخزين رقم النمط الذي سيحدد طريقة عمل الليدات وكما ذكرنا سابقًا أنه لدينا خمسة أنماط مختلفة
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_9" style=""><span class="typ">int</span><span class="pln"> </span><span class="typ">LEDs_Style</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></pre>

<p>
	سنضبط الأقطاب المستخدمة في المشروع في الدالة الرئيسية <code><a href="https://wiki.hsoub.com/Arduino/setup" rel="external">()setup</a></code> من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a></code> التي تأخذ وسيطين الأول رقم القطب الذي خُزّن في الماكرو، والثاني نوع القطب إما خرج <code>OUTPUT</code> وإما دخل <code>INPUT</code> وإما دخل مع مقاومة رفع خارجية <code>INPUT_PULLUP</code>، حيث أن قطب المفتاح <code>BTN_PIN</code> سيكون قطب دخل مع تفعيل مقاومة رفع داخلية <code>INPUT_PULLUP</code> أما قطب الليد الأصفر <code>YELLOW_LED</code> وأقطاب الليدات الحمراء <code>RED_LED_x</code> ستكون أقطاب خرج <code>OUTPUT</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_11" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BTN_PIN</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_ONE</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_TWO</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_THREE</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_FOUR</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_FIVE</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_SIX</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_SEVEN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">RED_LED_EIGHT</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	نلاحظ أن التعامل مع الليدات الحمراء بهذه الطريقة أي إعطاء الأمر الخاص بكل ليد بشكل منفصل صعب ويتطلب الكثير من الأكواد البرمجية؛ لذلك سنستبدل جميع الماكرو الخاصة بأقطاب هذه الليدات بمصفوفة أحادية <code>[]LEDs_PINs</code> نخزن فيها أرقام الأقطاب بالترتيب، وستكون المصفوفة من نوع <code>const int</code> فأرقام الأقطاب أعداد صحيحة وثابتة لن يتم التعديل عليها أثناء تنفيذ الكود وهي تحتوي ثمانية عناصر بعدد الليدات الحمراء، وسنستخدم الحلقة التكرارية <code>()for</code> للمرور على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> وإعطائها الأمر الخاص لكل عنصر من المصفوفة لكل قطب.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_15" style=""><span class="kwd">const</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="lit">8</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">};</span></pre>

<p>
	سنستخدم في هذه الحالة حلقة تكرارية <code>()for</code> تبدأ من الرقم 0 لأن رقم العنصر الأول في المصفوفة دائمًا صفر وتنتهي عند الرقم 7 لأن رقم العنصر الأخير في المصفوفة يساوي دائمًا عدد عناصر المصفوفة مطروحًا منه واحد، تمر هذه الحلقة التكرارية على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> وتضبطها كأقطاب خرج من خلال الدالة المدمجة <a href="" rel=""><code>()pinMode</code></a> وسيمرر الوسيط الأول الخاص برقم القطب بدلالة اسم المصفوفة مع رقم العنصر، أما الوسيط الثاني سيكون <code>OUTPUT</code> لأننا نريد ضبطها كأقطاب خرج، ليصبح محتوى الدالة الرئيسية <code>()setup</code> بالشكل الآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_17" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BTN_PIN</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    pinMode</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

</span><span class="pun">}</span></pre>

<p>
	سنكتب الكود الخاص بكل نمط في دالة خاصة به ومن ثم سننتقل إلى الكود الخاص بالدالة التكرارية <code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> ومعرفة كيفية استدعاء هذه الدوال الخاصة والتنقل بين الأنماط من خلال المفتاح <code>BTN_PIN</code>.
</p>

<h3 id="reset_pins">
	تحقيق دالة إطفاء الليد
</h3>

<p>
	سنكتب دالة خاصة في البداية باسم <code>()RESET_PINs</code> لتطفئ جميع الليدات عند استدعائها، فعند الانتقال من نمط إلى آخر نريد أن تكون الحالة الافتراضية لجميع الليدات مطفئة لذا سنستدعي هذه الدالة بداية كل نمط، نكتب بداخل الدالة حلقة تكرارية <code>()for</code> تمر على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> وتعطي أمر الإطفاء لكل عنصر فيها من خلال الدالة المدمجة <a href="" rel=""><code>()digitalWrite</code></a> التي تأخذ وسيطين: الأول رقم القطب ويحدد من خلال رقم عنصر المصفوفة المماثل لقيمة المتغير الخاص بالحلقة التكرارية <code>i</code>، والثاني حالة القطب وهي 1 منطقي أو <code>HIGH</code> للتشغيل، أو 0 منطقي أو <code>LOW</code> للإطفاء وبما أننا نريد إطفاء جميع الليدات سنعطيها القيمة <code>LOW</code> على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_20" style=""><span class="kwd">void</span><span class="pln"> RESET_PINs</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-1">
	تحقيق أنماط الإضاءة
</h2>

<h3 id="-2">
	النمط الأول <code>RIGHT_TO_LEFT</code>
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163640" href="https://academy.hsoub.com/uploads/monthly_2024_12/596047493_.JPG.ad93f28c7ad7f2645a3ce72b5255f1a9.JPG" rel=""><img alt="النمط الأول" class="ipsImage ipsImage_thumbnailed" data-fileid="163640" data-unique="gr7dkvju0" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.653156ab40849fd4389b475fd3809da5.JPG"> </a>
</p>

<p>
	سنحقق النمط الأول بالدالة <code>()RIGHT_TO_LEFT</code> لإضاءة جميع الليدات بشكل متتالي من اليمين إلى اليسار مع الحفاظ على إضاءة الليدات السابقة. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة <code>()RESET_PINs</code> التي عرفناها في الفقرة السابقة. ثم تبدأ إضاءة الليد الأول الموصول مع القطب رقم 3، ومن ثم الانتظار 250 مللي ثانية، ثم إضاءة الليد الثاني الموصول مع القطب رقم 4، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الثامن الموصول مع القطب رقم 10.
</p>

<p>
	سنستخدم الحلقة التكرارية <code>()for</code> للمرور على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> بدءًا من العنصر الأول <code>i=0</code> حتى الأخير<code>i=7</code>، وإعطاء أمر التشغيل لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية <code>i</code> من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external">()digitalWrite</a></code>، أما لتحقيق التأخير الزمني بين إضاءة الليدات سنستخدم الدالة المدمجة <a href="" rel=""><code>()delay</code></a> وإعطاءها القيمة <code>250</code> مللي ثانية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_23" style=""><span class="kwd">void</span><span class="pln"> RIGHT_TO_LEFT</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-3">
	النمط الثاني <code>LEFT_TO_RIGTHT</code>
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163642" href="https://academy.hsoub.com/uploads/monthly_2024_12/693828715_.JPG.a2e2d556ca5f0acee5151f5687d0a2ef.JPG" rel=""><img alt="النمط الثاني" class="ipsImage ipsImage_thumbnailed" data-fileid="163642" data-unique="tmskcuh77" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.8c0b009ecd31548c45d4f1093da319c2.JPG"> </a>
</p>

<p>
	سنحقق النمط الثاني بالدالة <code>()LEFT_TO_RIGTHT</code> لإضاءة جميع الليدات بشكل متتالي من اليسار إلى اليمين مع الحفاظ على إضاءة الليدات السابقة. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة <code>()RESET_PINs</code>، ثم يضيء الليد الثامن الموصول مع القطب رقم 10، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة الليد السابق أي الليد السابع الموصول مع القطب رقم 9، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الأول الموصول مع القطب رقم
</p>

<p>
	يشبه الكود البرمجي لهذا النمط النمط السابق مع اختلاف بسيط وهو أن الحلقة التكرارية <code>()for</code> تمر على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> بدءًا من العنصر الأخير <code>j=7</code> وحتى العنصر الأول <code>j=0</code>، وإعطاء أمر التشغيل لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية من خلال الدالة المدمجة <code>()digitalWrite</code>، أما لتحقيق التأخير الزمني نستخدم الدالة المدمجة <code>()delay</code> كما في النمط السابق.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_25" style=""><span class="kwd">void</span><span class="pln"> LEFT_TO_RIGTHT</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">--)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-4">
	النمط الثالث <code>GO_AND_BACK</code>
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163641" href="https://academy.hsoub.com/uploads/monthly_2024_12/2051282918_.JPG.b4083dc64949105064f87711225ca3ae.JPG" rel=""><img alt="النمط الثالث" class="ipsImage ipsImage_thumbnailed" data-fileid="163641" data-unique="0b78g53mv" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.510df7f40ec8e5ef635d4085e585d100.JPG"> </a>
</p>

<p>
	سنحقق النمط الثالث بالدالة <code>()GO_AND_BACK</code> لإضاءة جميع الليدات بشكل متتالي من اليمين إلى اليسار ومن ثم إطفاء الليدات بشكل متتالي من اليسار إلى اليمين. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة <code>()RESET_PINs</code> ، ثم يضيء الليد الأول الموصول مع القطب رقم 3، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة الليد الذي يليه وهو الليد الثاني الموصول مع القطب رقم 4، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الثامن الموصول مع القطب رقم 10.
</p>

<p>
	بعد الانتهاء من تشغيل جميع الليدات ينطفئ الليد الثامن الموصول مع القطب رقم 10، ومن ثم الانتظار لمدة 250 مللي ثانية ، ثم إطفاء الليد السابق وأي الليد السابع الموصول مع القطب رقم 9، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تنطفئ الليدات بالتتالي بالطريقة نفسها حتى الوصول إلى الليد الأول الموصول مع القطب رقم 3. سنستخدم الحلقة التكرارية <code>()for</code> للمرور على جميع عناصر المصفوفة <code>[]LEDs_PINs</code>، وإعطاء أمر التشغيل لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية من خلال الدالة<code> ()digitalWrite</code>. وسنستخدم الحلقة التكرارية الثانية <code>()for</code> للمرور على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> بدءًا من العنصر الأخير <code>j=7</code> وحتى العنصر الأول <code>j=0</code>، وإعطاء أمر الإطفاء لعنصر المصفوفة المماثل لقيمة المتغير الخاص بهذه الحلقة التكرارية من خلال الدالة المدمجة <code>()digitalWrite</code>، وسنستخدم الدالة المدمجة <code>()delay</code> لتحقيق التأخير الزمني بين إضاءة الليدات وإعطاءها القيمة <code>250</code> مللي ثانية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_27" style=""><span class="kwd">void</span><span class="pln"> GO_AND_BACK</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">--)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="-5">
	النمط الرابع <code>LED_BY_LED</code>
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163644" href="https://academy.hsoub.com/uploads/monthly_2024_12/1360326634_.JPG.56f73608aa95a8a70dfcc4b356121e2b.JPG" rel=""><img alt="النمط الرابع" class="ipsImage ipsImage_thumbnailed" data-fileid="163644" data-unique="9prj1gvi6" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.a3615124041ed8aedb0a0997cd8ee1cf.JPG"> </a>
</p>

<p>
	سنحقق النمط الرابع بالدالة <code>()LED_BY_LED</code> لإضاءة الليدات بشكل متتالي من اليمين إلى اليسار بدون الحفاظ على إضاءة الليدات السابقة. يشبه النمط الأول في تسلسل الإضاءة ولكن مع اختلاف بسيط أن الليدات السابقة ستنطفئ عند إضاءة الليد التالي، حيث يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة <code>()RESET_PINs</code> التي كتبناها سابقًا ضمن الكود البرمجي، ثم يضيء الليد الأول الموصول مع القطب رقم 3 وإطفاء جميع الليدات الأخرى، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة الليد الثاني الموصول مع القطب رقم 4 وإطفاء جميع الليدات الأخرى، والانتظار بعدها لمدة 250 مللي ثانية وهكذا تضيء الليدات بالتتالي بشكل مستقل عن الليدات الأخرى وبالطريقة نفسها حتى الوصول إلى الليد الثامن الموصول مع القطب رقم 10.
</p>

<p>
	نلاحظ من الصورة السابقة أن لدينا ثمانية مراحل في كل مرحلة سيضىء الليد المطابق لرقم المرحلة فمثلًا عند المرحلة الخامسة <code>i=4</code> سيضيء الليد الخامس <code>j=4</code> لذلك يمكننا استخدام حلقتين تكراريتين <code>()for</code> متداخلتين، الأولى للمرور على جميع المراحل بدءًا من <code>i=0</code> وحتى <code>i=7</code>، أما الحلقة الثانية فهي للمرور على جميع عناصر المصفوفة <code>[]LEDs_PINs</code> بدءًا من العنصر الأول <code>j=0</code> وحتى العنصر الثامن <code>j=7</code>، ومن خلال استخدام الشرط <code>i==j</code> سنتحقق من تطابق رقم الحالة مع رقم الليد فإذا تحقق الشرط يعطى أمر التشغيل لعنصر المصفوفة، وإذا لم يتحقق يعطى أمر الإطفاء.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_29" style=""><span class="kwd">void</span><span class="pln"> LED_BY_LED</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> j</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h3 id="custommode">
	النمط الخامس CUSTOM MODE
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163643" href="https://academy.hsoub.com/uploads/monthly_2024_12/1630481572_.JPG.6f617526a8cfff86cb46174b19cbf68d.JPG" rel=""><img alt="النمط الخامس" class="ipsImage ipsImage_thumbnailed" data-fileid="163643" data-unique="6qp1brzop" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.f00da80361cf4e7d979b1b34a8b197c4.JPG"> </a>
</p>

<p>
	سنحقق النمط الخامس بالدالة <code>CUSTOM_MODE</code> لتشغيل الليدات وإطفاءها وفق تسلسل خاص على شكل ستارة إلكترونية. يبدأ هذا النمط بإطفاء جميع الليدات من خلال استدعاء الدالة <code>()RESET_PINs</code> التي كتبناها سابقًا ضمن الكود البرمجي، ومن ثم ستعمل الليدات وفق تسلسل خاص مشابه لفكرة الإضاءة على شكل ستارة إلكترونية، تبدأ بإضاءة ليد واحد من كل جهة ليد من اليمين وليد آخر من اليسار، ومن ثم الانتظار لمدة 250 مللي ثانية، ثم إضاءة ليد آخر من كل جهة، وهكذا إلى أن تضاء جميع الليدات، بعدها نعمل بشكل معاكس من خلال إطفاء الليدين من المنتصف، ومن ثم الانتظار لمدة 250 مللي ثانية وهكذا إلى أن تنطفئ جميع الليدات.
</p>

<p>
	نحدد طريقة إضاءة الليدات في هذا النمط من خلال تعريف مصفوفة ثنائية <code>[][]Custom_Mode</code> من نوع <code>const int</code> تحتوي على شكل الإضاءة في كل مرحلة، وذلك من خلال تحديد الليدات المضاءة والليدات المطفئة، نضع <code>1</code> منطقي مكان الليد الذي سيضيء و <code>0</code> منطقي مكان الليد الذي سينطفئ، وكما نعرف أن المصفوفة الثنائية تحتوي على أسطر وأعمدة، ولتحديد حجم المصفوفة يجب أن يكون عدد الأسطر بعدد المراحل التي ستضيء وتنطفئ فيها الليدات وفي حالتنا هذه لدينا ثمانية مراحل بالتالي ثمانية أسطر كما هو موضح بالشكل السابق، أما عدد أعمدة المصفوفة فيجب أن يكون بعدد الليدات التي لدينا وفي حالتنا هذه لدينا ثمانية ليدات بالتالي ثمانية أعمدة.
</p>

<p>
	سنستخدم حلقتين تكراريتين <code>()for</code> الأولى للمرور على جميع أسطر المصفوفة والثانية للمرور على جميع أعمدتها وسنستخدمها أيضًا للوصول إلى أرقام الليدات المخزنة ضمن المصفوفة <code>[]LEDs_PINs</code>، نعطي أمر التشغيل أو الإيقاف الخاص بكل ليد من خلال المصفوفة <code>[][]Custom_Mode</code> باستخدام الدالة <code>()digitalWrite</code>، ونحقق التأخير الزمني بين إضاءة الليدات باستخدام الدالة <code>()delay</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_31" style=""><span class="kwd">void</span><span class="pln"> CUSTOM_MODE</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> customMode</span><span class="pun">[</span><span class="lit">8</span><span class="pun">][</span><span class="lit">8</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">},</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> customMode</span><span class="pun">[</span><span class="pln">i</span><span class="pun">][</span><span class="pln">j</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	بهذا نكون انتهينا من تحقيق كافة أنماط الإضاءة التي سننجرزها في مشروعنا وحان دور برمجة عملية الانتقال فيما بينها.
</p>

<h2 id="-6">
	التبديل بين الأنماط باستخدام المفتاح التكراري
</h2>

<p>
	سنبدل بين الأنماط ضمن الدالة التكرارية <code>()loop</code> والتي سنعرف بداخلها متغير <code>BTN_STAT</code> من نوع <code>int</code> يخزن فيه حالة المفتاح الموصول على القطب <code>BTN_PIN</code>، ونقرأ حالته بالدالة <a href="" rel=""><code>()digitalRead</code></a> التي تأخذ وسيطًا واحدًا وهو رقم القطب وتعيد القيمة الفيزيائية الموجودة على القطب، وبما أن المفتاح موصول مع مقاومة رفع داخلية ستكون قيمة القطب <code>LOW</code> أو 0 منطقي في حالة الضغط على المفتاح و<code>HIGH</code> أو 1 منطقي عند إزالة الضغط عن المفتاح.
</p>

<p>
	وبعد ذلك سنتحقق من حالة المفتاح في حال كان مضغوط سنزيد قيمة <code>LEDs_Style</code>، ونستخدم عبارة شرطية لفحص قيمة النمط <code>LEDs_Style</code> في حال أصبحت أكبر من عدد الأنماط 4 سنرجع إلى النمط الأول، ونعطي أمر لتشغيل الليد الأصفر الذي يشير إلى أن المفتاح ضُغِط وعلينا الانتقال للنمط التالي والانتظار ثلاث ثواني وإعطاء أمر آخر لإطفاء الليد الأصفر.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_33" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">(){</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> BTN_STAT </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">BTN_PIN</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BTN_STAT </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">LEDs_Style</span><span class="pun">++;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LEDs_Style</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="typ">LEDs_Style</span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">3000</span><span class="pun">);</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	بعد تحديد قيمة النمط، تُستخدم العبارة الشرطية <code>()Switch</code> لاستدعاء الدالة المطابقة لقيمة المتغير <code>LEDs_Style</code> وتنفيذ النمط المرتبط لكل حالة من 0 إلى 4 من خلال الدالة الخاصة به مع إنهاء التنفيذ بـ <code>break</code> لتجنب فحص باقي الحالات.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_35" style=""><span class="pln"> </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="pln">COUNTER</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
      RIGHT_TO_LEFT</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
      LEFT_TO_RIGTHT</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
      GO_AND_BACK</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">3</span><span class="pun">:</span><span class="pln">
      LED_BY_LED</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">4</span><span class="pln">    </span><span class="pun">:</span><span class="pln">
      CUSTOM_MODE</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-7">
	الكود البرمجي النهائي لمشروع إضاءة زينة بأنماط مختلفة باستخدام أردوينو
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2846_37" style=""><span class="com">#define</span><span class="pln"> BTN_PIN </span><span class="lit">2</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> YELLOW_LED </span><span class="lit">12</span><span class="pln">

</span><span class="kwd">const</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="lit">8</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">{</span><span class="lit">3</span><span class="pun">,</span><span class="pln"> </span><span class="lit">4</span><span class="pun">,</span><span class="pln"> </span><span class="lit">5</span><span class="pun">,</span><span class="pln"> </span><span class="lit">6</span><span class="pun">,</span><span class="pln"> </span><span class="lit">7</span><span class="pun">,</span><span class="pln"> </span><span class="lit">8</span><span class="pun">,</span><span class="pln"> </span><span class="lit">9</span><span class="pun">,</span><span class="pln"> </span><span class="lit">10</span><span class="pun">};</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">LEDs_Style</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> RESET_PINs</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> RIGHT_TO_LEFT</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> LEFT_TO_RIGTHT</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">--)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> GO_AND_BACK</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&gt;=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">--)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> LED_BY_LED</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">i </span><span class="pun">==</span><span class="pln"> j</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
        digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
      </span><span class="pun">}</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> CUSTOM_MODE</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  RESET_PINs</span><span class="pun">();</span><span class="pln">
  </span><span class="kwd">const</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> customMode</span><span class="pun">[</span><span class="lit">8</span><span class="pun">][</span><span class="lit">8</span><span class="pun">]</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">1</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">1</span><span class="pun">},</span><span class="pln">
    </span><span class="pun">{</span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">,</span><span class="pln"> </span><span class="lit">0</span><span class="pun">},</span><span class="pln">
  </span><span class="pun">};</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> j </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> j </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> j</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      digitalWrite</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">j</span><span class="pun">],</span><span class="pln"> customMode</span><span class="pun">[</span><span class="pln">i</span><span class="pun">][</span><span class="pln">j</span><span class="pun">]);</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">250</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">BTN_PIN</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">7</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    pinMode</span><span class="pun">(</span><span class="typ">LEDs_PINs</span><span class="pun">[</span><span class="pln">i</span><span class="pun">],</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> BTN_STAT </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">BTN_PIN</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">BTN_STAT </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">LEDs_Style</span><span class="pun">++;</span><span class="pln">
    </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LEDs_Style</span><span class="pln"> </span><span class="pun">&gt;</span><span class="pln"> </span><span class="lit">4</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
      </span><span class="typ">LEDs_Style</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">3000</span><span class="pun">);</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">YELLOW_LED</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">switch</span><span class="pln"> </span><span class="pun">(</span><span class="typ">LEDs_Style</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">0</span><span class="pun">:</span><span class="pln">
      RIGHT_TO_LEFT</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">1</span><span class="pun">:</span><span class="pln">
      LEFT_TO_RIGTHT</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">2</span><span class="pun">:</span><span class="pln">
      GO_AND_BACK</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">3</span><span class="pun">:</span><span class="pln">
      LED_BY_LED</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">case</span><span class="pln"> </span><span class="lit">4</span><span class="pun">:</span><span class="pln">
      CUSTOM_MODE</span><span class="pun">();</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
    </span><span class="kwd">default</span><span class="pun">:</span><span class="pln">
      </span><span class="kwd">break</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-8">
	محاكاة مشروع إضاءة زينة بأنماط مختلفة
</h2>

<p>
	سنحاكي المشروع على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a> وفق الخطوات التي شرحنا في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/" rel="">مقال التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163638" href="https://academy.hsoub.com/uploads/monthly_2024_12/379939219_.JPG.774e8cde181eb4d422771172f728c583.JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="163638" data-unique="33cumijhj" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.44421ee63e8221ebe1a2ec5a63ce9435.JPG"> </a>
</p>

<p>
	أضف العناصر الإلكترونية اللازمة للمشروع المفتاح اللحظي Push Button والليدات LEDs والمقاومات Resistors ولوحة التجارب BreadBoard.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163637" href="https://academy.hsoub.com/uploads/monthly_2024_12/116830570_.JPG.83c6fd5b1f2b528e14b28e8c60a4a975.JPG" rel=""><img alt="إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="163637" data-unique="2akt37hxi" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.f9cba16d292cf7729e6c69432b342bb0.JPG"> </a>
</p>

<p>
	غيّر قيمة مقاومة الليدات إلى 220 أوم من خلال النقر فوقها، حيث تظهر لك نافذة في الأعلى تمكنك من تغير القيمة والواحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163646" href="https://academy.hsoub.com/uploads/monthly_2024_12/1948712452_.JPG.a5a68a08ebd0e17c58c595665466762d.JPG" rel=""><img alt="تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="163646" data-unique="4st837rr8" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/1948712452_.JPG.a5a68a08ebd0e17c58c595665466762d.JPG"> </a>
</p>

<p>
	بالطريقة نفسها يمكنك تغير ألوان الليدات والمفتاح من خلال النقر فوقها واختيار اللون من اللوحة الظاهرة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163645" href="https://academy.hsoub.com/uploads/monthly_2024_12/2119118116_.JPG.0064bf18457ef2f3d07a71c289eb78bf.JPG" rel=""><img alt="تغير لون الليد والمفتاح" class="ipsImage ipsImage_thumbnailed" data-fileid="163645" data-unique="org5n863b" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/2119118116_.JPG.0064bf18457ef2f3d07a71c289eb78bf.JPG"> </a>
</p>

<p>
	رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
</p>

<p>
	اكتب الكود البرمجي في الجزء الخاص به ثم شغل المحاكاة، ولاحظ الحالات الآتية:
</p>

<ol>
	<li>
		في البداية ستضيء جميع الليدات بشكل متتالي من اليمين إلى اليسار مع الحفاظ على إضاءة الليدات السابقة أي أنها ستعمل وفق النمط الأول.
	</li>
	<li>
		اضغط على المفتاح اللحظي بشكل مستمر حتى إضاءة الليد الأصفر، عندها ستستمر إضاءة هذا الليد لمدة ثلاث ثواني ومن ثم ستضيء جميع الليدات بشكل متتالي من اليسار إلى اليمين مع الحفاظ على إضاءة الليدات السابقة أي أنها ستعمل وفق النمط الثاني.
	</li>
	<li>
		بالضغط على المفتاح مرة ثانية بشكل مستمر حتى إضاءة الليد الأصفر، عندها ستستمر إضاءة هذا الليد أيضًا لمدة ثلاث ثواني ومن ثم ستضيء جميع الليدات بشكل متتالي من اليمين إلى اليسار ثم ستنطفئ جميع الليدات بشكل متتالي من اليسار إلى اليمين، أي أنها ستعمل وفق النمط الثالث.
	</li>
	<li>
		بالضغط على المفتاح مرة ثالثة بشكل مستمر حتى إضاءة الليد الأصفر، ستستمر إضاءة هذا الليد أيضًا لمدة ثلاث ثواني ومن ثم إضاءة الليدات بشكل متتالي من اليمين إلى اليسار بدون الحفاظ على إضاءة الليدات السابقة، أي أنها ستعمل وفق النمط الرابع.
	</li>
	<li>
		أخيرًا، بالضغط على المفتاح مرة رابعة بشكل مستمر حتى إضاءة الليد الأصفر، عندها ستستمر إضاءة هذا الليد لمدة ثلاث ثواني ومن ثم تشغيل الليدات وإطفاءها وفق تسلسل خاص على شكل ستارة إلكترونية، أي أنها ستعمل وفق النمط الخامس.
	</li>
	<li>
		في حال تكرار الضغط على المفتاح مرة أخرى بعد ذلك سيعود إلى النمط الأول.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="163639" href="https://academy.hsoub.com/uploads/monthly_2024_12/193835889_.JPG.5cdf6833ab9671a21addecba9cca50b3.JPG" rel=""><img alt="النتيجة النهائية لمحاكاة المشروع الخامس" class="ipsImage ipsImage_thumbnailed" data-fileid="163639" data-unique="1o506aeps" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_12/.thumb.JPG.b973ea1196747046ff4599e13aea051b.JPG"> </a>
</p>

<h2 id="-9">
	الخاتمة
</h2>

<p>
	في ختام هذا المقال نكون قد تعلمنا كيفية بناء مجموعة أنماط مختلفة من الإضاءات باستخدام الأردوينو Arduino، واكتسبنا العديد من المهارات البرمجية والإلكترونية، نشجعكم لتجربة بناء هذا المشروع وتطوير وإضافة أنماط جديدة عليها.
</p>

<h2 id="-10">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%81%D8%AA%D8%A7%D8%AD-%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%84%D8%AD%D8%B8%D9%8A-push-button-%D9%81%D9%8A-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2433/" rel="">التحكم بالليد LED باستخدام مفتاح الضغط اللحظي Push Button في أردوينو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/" rel="">التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%81%D8%AA%D8%A7%D8%AD-%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%84%D8%AD%D8%B8%D9%8A-push-button-%D9%88%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2433/" rel="">التحكم بالليد LED باستخدام مفتاح الضغط اللحظي Push Button والأردوينو Arduino</a>
	</li>
	<li>
		<a href="" rel="">أساسيات في عالم الإلكترونيات: التيار والجهد والعناصر الساكنة</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2463</guid><pubDate>Fri, 06 Dec 2024 15:01:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x627;&#x644;&#x644;&#x64A;&#x62F; LED &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x645;&#x641;&#x62A;&#x627;&#x62D; &#x627;&#x644;&#x636;&#x63A;&#x637; &#x627;&#x644;&#x644;&#x62D;&#x638;&#x64A; Push Button &#x641;&#x64A; &#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%A7%D9%84%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%85%D9%81%D8%AA%D8%A7%D8%AD-%D8%A7%D9%84%D8%B6%D8%BA%D8%B7-%D8%A7%D9%84%D9%84%D8%AD%D8%B8%D9%8A-push-button-%D9%81%D9%8A-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2433/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_10/130557006_.png.5be7070086675f4b5456610c262ed10a.png" /></p>
<p>
	يعرفك هذا المقال كيفية بناء مشروع إلكتروني باستخدام لوحة الأردوينو Arduino للتحكم بتشغيل وإطفاء ليد LED من خلال استخدام اثنين من مفاتيح الضغط اللحظية Push Button الذي تعرفنا عليها في <a href="" rel="">المقال السابق</a> من سلسلتنا التعليمية لبناء المشاريع الإلكترونية باستخدام لوحات الأردوينو Arduino Board.
</p>

<h2 id="ledpushbuttonarduino-1">
	فكرة مشروع التحكم بالليد باستخدام مفتاح الضغط اللحظي والأردوينو
</h2>

<p>
	سنبني في هذا المشروع دائرة كهربائية بسيطة تستخدم مفتاحين من نوع Push Button للتحكم في تشغيل وإطفاء ليد بشكل دائم، فعند الضغط على المفتاح الأول (ونرمز له بالرمز S1) يضيء الليد، أما عند الضغط على المفتاح الثاني (ونرمز له بالرمز S2) فإن الليد سينطفئ، وفي حال الضغط على المفتاح الأول S1 والمفتاح الثاني S2 معًا وفي الوقت نفسه سينطفئ الليد أيضًا، وعند عدم الضغط على أي من المفتاحين S1 و S2 سيحافظ الليد على حالته السابقة سواء كان مضيء أو منطفئ، فنحصل بهذه الطريقة على تحكم دائم بالليد من خلال مفاتيح ضغط لحظية Push Button حتى عند إزالة الضغط عنها. يوضح لك الجدول الآتي جميع الحالات الممكنة للمفاتيح S1 و S2 ونتيجة تأثيرها على الليد LED
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="160242" href="https://academy.hsoub.com/uploads/monthly_2024_10/__.jpg.88c2e303ca6b747e85e6b17d8c0e0148.jpg" rel=""><img alt="حالات الممكنة للمفاتيح" class="ipsImage ipsImage_thumbnailed" data-fileid="160242" data-unique="38rhsab4l" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/__.thumb.jpg.2739ba3d24bb61a3dcf6e9801da348fb.jpg"> </a>
</p>

<p>
	سنتعلم من هذا المشروع كيفية تطوير مهارات التفكير والتحليل البرمجية حيث سنستطيع من خلال الكود البرمجي استخدام مفتاح الضغط اللحظي Push Button الذي يعطي إشارة للأردوينو فقط عندما يكون مضغوط كمفتاح دائم Switch من خلال بعض المهارات البرمجية. يمكن توظيف فكرة هذا المشروع في المشاريع المستقبلية للتحكم في بدء وإيقاف عمل الكود البرمجي من خلال هذه المفاتيح، فالمفتاح الأول S1 سيستخدم لبدء عمل الكود أما المفتاح الثاني S2 سيستخدم لإيقاف عمل الكود.
</p>

<h2 id="ledpushbuttonarduino-2">
	العناصر المستخدمة للتحكم بالليد LED باستخدام مفتاح الضغط اللحظي Push Button والأردوينو Arduino
</h2>

<p>
	سنستخدم مجموعة من العناصر الإلكترونية والأدوات وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno.
	</li>
	<li>
		كابل البرمجة USB Cable.
	</li>
	<li>
		لوحة توصيل التجارب Breadboard.
	</li>
	<li>
		ليد LED.
	</li>
	<li>
		مفتاحين من نوع Push Button.
	</li>
	<li>
		مقاومة بقيمة 220 أوم.
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male.
	</li>
</ul>

<h2 id="ledpushbuttonarduino-3">
	مخطط التوصيل لمشروع التحكم بالليد باستخدام مفتاح الضغط اللحظي والأردوينو
</h2>

<p>
	اتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino لتنفيذ فكرة المشروع:
</p>

<ul>
	<li>
		صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل.
	</li>
	<li>
		صل الرجل الأقصر (التي تمثل الطرف السالب) لليد مع الرجل الأولى للمقاومة ذات القيمة 220 أوم، ثم الرجل الأخرى للمقاومة ذات القيمة 220 أوم مع المسرى السالب في لوحة توصيل التجارب BreadBoard.
	</li>
	<li>
		صل الرِّجل الأطول (التي تمثل الطرف الموجب) لليد مع القطب رقم 8 في لوحة الأردوينو أونو Arduino Uno.
	</li>
	<li>
		ثبت المفتاحين الأول S1 والثاني S2 بشكل جيد في منتصف لوحة توصيل التجارب BreadBoard بحيث يكون نصف المفتاح في الجزء الأيمن للوحة التجارب BreadBoard والنصف الثاني للمفتاح في الجزء الأيسر للوحة التجارب BreadBoard.
	</li>
	<li style="text-align: center;">
		يوجد في مفتاح الضغط اللحظي Push Button أربعة أرجل أو أطراف كما ذكرنا سابقًا، كل اثنين منها متصلة ببعضها داخليًا ويمكن اعتبارها رجلًا واحدة، ولتجنب الخطأ أو التشتت في التوصيل سنعتمد أن نأخذ الأرجل القُطريَّة (الأرجل المختلفة للمفتاح) دائمًا.<br>
		<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="160259" href="https://academy.hsoub.com/uploads/monthly_2024_10/1546708372_.jpg.fff405d441304693c0693e523d2e19f6.jpg" rel=""><img alt="أقطاب مفتاح الضغط اللحظي.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="160259" data-ratio="42.50" data-unique="72yinsibc" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.jpg.186be2ab276996ffe5826e628351e4c9.jpg"></a>
	</li>
	<li>
		صل الطرف الأول للمفتاح الأول S1 مع المسرى السالب للوحة التجارب BreadBoard، ثم صل الطرف الثاني للمفتاح الأول S1 مع القطب رقم 7 في لوحة الأردوينو أونو Arduino Uno.
	</li>
	<li>
		صل الطرف الأول للمفتاح الثاني S2 مع المسرى السالب للوحة التجارب BreadBoard، ثم صل الطرف الثاني للمفتاح الثاني S2 مع القطب رقم 6 في لوحة الأردوينو أونو Arduino Uno.
	</li>
	<li>
		سنفعل مقاومة الرفع الداخلية للمتحكم الموجود في لوحة الأردوينو Arduino برمجيًا؛ لذلك لا داعي لتوصيل مقاومات رفع Pull-Up أو مقاومات خفض Pull-Down مع مفاتيح الضغط اللحظية Push Button.
	</li>
</ul>

<p>
	توضح الصورة الآتية مخطط التوصيل لمشروع التحكم بالليد باستخدام مفتاح الضغط اللحظي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="160243" href="https://academy.hsoub.com/uploads/monthly_2024_10/128717677_.JPG.4eccecee013e01800586eb3d723d6f10.JPG" rel=""><img alt="مخطط توصيل المشروع الرابع" class="ipsImage ipsImage_thumbnailed" data-fileid="160243" data-unique="z6l1gsqt9" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.JPG.8858a7dd2835c91cb697981075decc6e.JPG"> </a>
</p>

<h2 id="ledpushbuttonarduino-4">
	الكود البرمجي لمشروع التحكم بالليد LED
</h2>

<p>
	سنربط الأقطاب التي سنستخدمها في المشروع مع أسماء خاصة من خلال الماكرو <code>define#</code> في بداية الكود، وذلك لسهولة التعديل عليها عند الحاجة، فكما هو موضح في مخطط التوصيل سيوصل الليد مع القطب رقم 8، المفتاح الأول S1 مع القطب رقم 7، والمفتاح الثاني S2 مع القطب رقم 6 في لوحة الأردوينو أونو Arduino UNO.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_6" style=""><span class="com">#define</span><span class="pln"> ledpin </span><span class="lit">8</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> button1pin </span><span class="lit">7</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> button2pin </span><span class="lit">6</span></pre>

<p>
	استخدمنا الماكرو لربط أرقام الأقطاب بأسماء معبرة عنها فبدلًا من استخدام رقم القطب في الكود سنستخدم اسم الماكرو الخاص به، وعند الحاجة لتعديل رقم هذا القطب يمكننا ببساطة تعديله في مكان تعريف الماكرو فقط بدلًا من تعديله في جميع أماكن استخدامه في الكود، إضافة إلى أن الماكرو لا يأخذ حجم من ذاكرة البيانات SRAM الخاصة بالأردوينو Arduino على عكس المتغيرات.
</p>

<p>
	سنضبط الأقطاب المستخدمة في المشروع في الدالة الرئيسية <code><a href="https://wiki.hsoub.com/Arduino/setup" rel="external">()setup</a></code>، وذلك من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a></code> التي تأخذ وسيطين: الأول رقم القطب (الذي خُزن في المتغير) والثاني نوع القطب (إما خرج وإما دخل)، حيث أن قطب الليد <code>ledpin</code> سيكون خرج <code>OUTPUT</code> وأقطاب المفاتيح <code>button1pin</code> و<code>button2pin</code> ستكون أقطاب دخل مع تفعيل مقاومة رفع داخلية <code>INPUT_PULLUP</code>
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_12" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">button1pin</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">button2pin</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنعرف في بداية الدالة التكرارية <code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> متغيرين: الأول <code>button1stat</code> خاص بتخزين قيمة القطب الموصول مع المفتاح الأول S1، والثاني<code>button2stat</code> خاص بتخزين قيمة القطب الموصول مع المفتاح الثاني S2، وذلك بعد قراءتها من خلال الدالة المدمجة <code>()digitalRead</code> التي تأخذ وسيطًا واحدًا وهو رقم القطب وتعيد القيمة الفيزيائية الموجودة على القطب، وبما أن المفتاح موصول مع مقاومة رفع داخلية ستكون قيمة القطب <code>LOW</code> أو 0 منطقي في حالة الضغط على المفتاح و<code>HIGH</code> أو 1 منطقي عند إزالة الضغط عن المفتاح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_15" style=""><span class="pln">  </span><span class="typ">int</span><span class="pln"> button1stat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button1pin</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> button2stat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button2pin</span><span class="pun">);</span></pre>

<p>
	بعد الحصول على حالة المفاتيح (الأول S1 والثاني S2) هل هي مضغوطة أم لا (تحوي القيمة 0 في حالة الضغط والقيمة 1 في حالة عدم الضغط)، سنستخدم العبارات الشرطية <code>if</code> و<code>else if</code> لفحص حالة المفاتيح والتحكم بتشغيل وإطفاء الليد بالطريقة المناسبة (حسب الجدول الموضح مسبقًا)، ويتم تشغيل وإطفاء الليد برمجيًا من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external">()digitalWrite</a></code> التي تأخذ وسيطين: الأول رقم القطب (الذي خُزن في المتغير) والثاني حالة أو قيمة القطب (إما 1 منطقي <code>HIGH</code> للتشغيل وإما 0 منطقي <code>LOW</code> للإطفاء).
</p>

<ol>
	<li>
		 تحقق هل المفتاح الأول S1 مضغوط؟ وهل المفتاح الثاني S2 غير مضغوط؟ في حال تحقق الشرطين معًا (استخدمنا المعامل المنطقي <code>AND</code> الذي يرمز له <code>&amp;&amp;</code> لضرورة تحقق الشرطين معًا)، إذًا شغّل الليد في هذه الحالة.

		<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_18" style=""><span class="pln">  </span><span class="kwd">if</span><span class="pln">  </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>
	</li>
	<li>
		إن لم يتحقق الشرط السابق، تحقق من الشرط الآتي: هل المفتاح الأول S1 غير مضغوط؟ وهل المفتاح الثاني S2 مضغوط؟ في حال تحقق الشرطين معًا، إذًا أطفئ الليد في هذه الحالة.
		<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_20" style=""><span class="pln"> </span><span class="kwd">else</span><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>
	</li>
	<li>
		إن لم يتحقق أي من الشروط السابقة، تحقق من الشرط الآتي: هل المفتاح الأول S1 مضغوط؟ والمفتاح الثاني S2 مضغوط أيضًا؟ في حال تحقق الشرطين معًا، إذًا أطفئ الليد في هذه الحالة.
		<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_22" style=""><span class="pln">  </span><span class="kwd">else</span><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>
	</li>
	<li>
		إن لم يتحقق أي من الشروط السابقة، تحقق من الشرط الآتي: هل المفتاح الأول S1 غير مضغوط؟ والمفتاح الثاني S2 غير مضغوط؟ في حال تحقق الشرطين معًا، حافظ على حالة الليد وذلك من خلال إعطاء قيمة لليد في الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external">()digitalWrite</a></code> تساوي القيمة المقروءة على قطب الليد من الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalread" rel="external">()digitalRead</a></code> التي تأخذ رقم القطب وتعيد قيمته الفيزيائية.
	</li>
</ol>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_24" style=""><span class="pln">  </span><span class="kwd">else</span><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span></pre>

<h2 id="ledpushbuttonarduino-5">
	الكود البرمجي النهائي لمشروع التحكم بالليد LED باستخدام مفتاح الضغط اللحظي والأردوينو
</h2>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_4928_26" style=""><span class="com">#define</span><span class="pln"> ledpin </span><span class="lit">8</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> button1pin </span><span class="lit">7</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> button2pin </span><span class="lit">6</span><span class="pln">

</span><span class="kwd">void</span><span class="pln">  setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">button1pin</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">button2pin</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln">  loop</span><span class="pun">()</span><span class="pln">  </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> button1stat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button1pin</span><span class="pun">);</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> button2stat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button2pin</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">if</span><span class="pln">  </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
  </span><span class="kwd">else</span><span class="pln">  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">((</span><span class="pln">button1stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">)</span><span class="pln"> </span><span class="pun">&amp;&amp;</span><span class="pln"> </span><span class="pun">(</span><span class="pln">button2stat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">1</span><span class="pun">))</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">,</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">ledpin</span><span class="pun">));</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="">
	محاكاة مشروع التحكم بالليد باستخدام مفتاح الضغط اللحظي
</h2>

<ul>
	<li>
		اتبع الخطوات التي تعلمناها في مقالٍ سابق للوصول الى الصفحة الخاصة بمحاكاة مشروعك على موقع <a href="https://wokwi.com/" rel="external nofollow">وكوي Wokwi</a> .تستطيع الرجوع إليها من خلال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/" rel="">مقال التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a>
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="160238" href="https://academy.hsoub.com/uploads/monthly_2024_10/1141491522_.JPG.37be82ee842afdf2cd20d72e2d8dd6ed.JPG" rel=""><img alt="الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="160238" data-unique="l362ljs4j" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.JPG.2a1b7feb6b590202ebebf445d3f25bb5.JPG"> </a>
</p>

<ul>
	<li>
		أضف العناصر الإلكترونية اللازمة للمشروع (مفاتيح Push Button، والليدات LEDs، والمقاومات Resistors، ولوحة التجارب BreadBoard).
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="160236" href="https://academy.hsoub.com/uploads/monthly_2024_10/995182108_.JPG.818ac88bfb0b244259ab45f2aff5d21d.JPG" rel=""><img alt="إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="160236" data-unique="llnpjjatt" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.JPG.85e32b7f0d2da20b5fe9abefcdf0fc92.JPG"> </a>
</p>

<ul>
	<li>
		غيّر قيمة مقاومة الليد إلى 220 أوم من خلال الضغط عليها فتظهر لك نافذة في الأعلى تمكنك من تغير القيمة والواحدة.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="160241" href="https://academy.hsoub.com/uploads/monthly_2024_10/52861184_.JPG.c904ee037bbc4cea9450a2bebfbbd9c4.JPG" rel=""><img alt="تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="160241" data-unique="4gy4nwnt0" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.JPG.797d88d5e075430a5652af960e43e2da.JPG"> </a>
</p>

<ul>
	<li>
		بالطريقة نفسها يمكنك تغير ألوان الليد والمفاتيح S1 و S2 من خلال الضغط عليها فتظهر لك نافذة بالأعلى تستطيع من خلالها اختيار اللون.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="160240" href="https://academy.hsoub.com/uploads/monthly_2024_10/1719974928_.JPG.7f6641eecbeab973a39a9842b2656598.JPG" rel=""><img alt="تغير لون الليد والمفتاح" class="ipsImage ipsImage_thumbnailed" data-fileid="160240" data-unique="znd2c3uz8" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.JPG.a8c2f13a402aa6e21b77d83563874623.JPG"> </a>
</p>

<ul>
	<li>
		<p>
			رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
		</p>
	</li>
	<li>
		<p>
			اكتب الكود البرمجي في الجزء الخاص به ثم شغل المحاكاة، ولاحظ الحالات الآتية:
		</p>
	</li>
</ul>

<ol style="margin-right: 40px;">
	<li>
		 اضغط على المفتاح الأول S1 ستجد الليد يضيء (الحالة الأولى).
	</li>
	<li>
		أزل الضغط عنه ستجد ان الليد ما زال مضيئًا (الحالة الرابعة).
	</li>
	<li>
		الآن اضغط على المفتاح الثاني S2 ستجد أن الليد انطفئ (الحالة الثانية).
	</li>
	<li>
		أزل الضغط عنه ستجد أن الليد ما زال منطفئ (الحالة الرابعة).
	</li>
	<li>
		جرب إعادة الضغط على المفتاح الأول S1 لكي يضيء الليد ثم اضغط على المفتاحين معًا في وقت واحد سينطفئ الليد في هذه الحالة (الحالة الثالثة).
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="160239" href="https://academy.hsoub.com/uploads/monthly_2024_10/1992936449_.JPG.f272bff333cd917ce32ac0784b751f07.JPG" rel=""><img alt="النتيجة النهائية لمحاكاة المشروع الرابع" class="ipsImage ipsImage_thumbnailed" data-fileid="160239" data-unique="2prove13q" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.JPG.61c46eabdad648f3790d17ca29fb2792.JPG"> </a>
</p>

<h2 id="-1">
	الخلاصة
</h2>

<p>
	تعلمنا في مقال اليوم خطوات تصميم وتنفيذ مشروع للتحكم بتشغيل وإطفاء ليد LED من خلال مفتاحين من نوع Push Button وهو المشروع الرابع في سلسلة دليل أردوينو التي تشرح بناء مجموعة من المشاريع الإلكترونية باستخدام الأردوينو Arduino، واستعرضنا أهم خطوات تنفيذ المشروع وتوصيل العناصر والأدوات والتعامل معها وكيفية كتابة الكود الخاص ببرمجة الأردوينو باستخدام بيئة التطوير المتكاملة (IDE) الخاصة به وعمل محاكاة للمشروع من خلال منصة وكوي Wokwi.
</p>

<h2 id="-2">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%B9%D8%AF%D8%AF-%D9%85%D8%B1%D8%A7%D8%AA-%D9%88%D9%85%D9%8A%D8%B6-%D8%A7%D9%84%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2420/" rel="">تخمين عدد مرات وميض الليد باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="https://wiki.hsoub.com/Arduino/arduinoide" rel="external">تثبيت أردوينو IDE ورفع الشيفرات على لوحة أردوينو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D8%A5%D8%B4%D8%A7%D8%B1%D8%A9-%D9%85%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2414/" rel="">بناء إشارة مرور باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D9%82%D9%84%D8%A8-%D9%86%D8%A7%D8%A8%D8%B6-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1862/" rel="">صنع قلب نابض باستخدام لوحة راسبيري باي بيكو</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2433</guid><pubDate>Mon, 21 Oct 2024 15:01:00 +0000</pubDate></item><item><title>&#x62A;&#x62E;&#x645;&#x64A;&#x646; &#x639;&#x62F;&#x62F; &#x645;&#x631;&#x627;&#x62A; &#x648;&#x645;&#x64A;&#x636; &#x627;&#x644;&#x644;&#x64A;&#x62F; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AE%D9%85%D9%8A%D9%86-%D8%B9%D8%AF%D8%AF-%D9%85%D8%B1%D8%A7%D8%AA-%D9%88%D9%85%D9%8A%D8%B6-%D8%A7%D9%84%D9%84%D9%8A%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2420/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_10/Arduino.png.23fa62c467153b2c8692492195a77cbc.png" /></p>
<p>
	نشرح في هذا المقال كيفية بناء مشروع إلكتروني تفاعلي من خلال تصميم وتنفيذ لعبة بسيطة لتخمين عدد مرات وميض ليد باستخدام لوحة أردوينو أونو Arduino Uno ونوضح خطوات تنفيذ المشروع وأهم عناصره وطريقة محاكاته.
</p>

<h2 id="">
	فكرة مشروع تخمين عدد مرات وميض الليد
</h2>

<p>
	سنبني مشروعًا يحسب عدد مرات تشغيل وإطفاء ليد بفترات زمنية عشوائية ضمن مجال محدد عند الضغط على مفتاح الضغط اللحظي Push Button (سنشرحه لاحقًا في هذا المقال) بشكل مستمر، ويجب على المستخدم حساب أو تخمين هذا الرقم، في النهاية بعد إزالة الضغط عن المفتاح سيتوقف الليد عن الومض ويطبع عدد مرات تشغيل وإطفاء الليد على نافذة الاتصال التسلسلي Serial monitor.
</p>

<p>
	سنتبع تسلسل الخطوات الآتية في آلية عمل المشروع:
</p>

<ol>
	<li>
		فحص حالة المفتاح (مضغوط أم لا) وإذا كان مضغوطًا تنفذ الخطوات من 2 إلى 5 وإلا تكرر الخطوة 1
	</li>
	<li>
		يضيء الليد لفترة زمنية عشوائية ضمن مجال محدد
	</li>
	<li>
		ينطفئ الليد لفترة زمنية عشوائية ضمن مجال محدد
	</li>
	<li>
		تزداد قيمة العداد بمقدار 1
	</li>
	<li>
		فحص حالة المفتاح (مضغوط أم لا) وإذا كان مضغوطًا تكرر الخطوات من 2 إلى 5 وإلا ينتقل إلى 6
	</li>
	<li>
		فحص قيمة العداد إذا كانت أكبر من 0 (ومض الليد مرة واحدة على الأقل) وإذا كان الشرط محققًا تنفيذ الخطوة 7 و 8 وإلا الرجوع إلى الخطوة 1
	</li>
	<li>
		 طباعة قيمة العداد
	</li>
	<li>
		تصفير قيمة العداد
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159125" href="https://academy.hsoub.com/uploads/monthly_2024_10/001____.jpg.JPG.a14a6ad8dd7f003f088ed96107538e6f.JPG" rel=""><img alt="001_مخطط_تسلسل_عمل_المشروع.jpg.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="159125" data-ratio="56.26" data-unique="zc1lmczgn" style="width: 503px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_10/001____.jpg.thumb.JPG.5ed0553156fa65f0be98a6912d7baba2.JPG"></a>
</p>

<h2 id="-1">
	العناصر المستخدمة لمشروع تخمين عدد مرات وميض الليد
</h2>

<p>
	العناصر التي سنستخدمها لعمل هذا المشروع هي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno
	</li>
	<li>
		كابل البرمجة USB Cable
	</li>
	<li>
		لوحة توصيل التجارب Breadboard
	</li>
	<li>
		ليد LED
	</li>
	<li>
		مفتاح الضغط اللحظي Push Button
	</li>
	<li>
		مقاومة بقيمة 220 أوم
	</li>
	<li>
		مقاومة بقيمة 10 كيلو أوم
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male
	</li>
</ul>

<h2 id="pushbutton">
	ما هو مفتاح الضغط اللحظي Push Button
</h2>

<p>
	عبارة عن مفتاح ميكانيكي لحظي عند الضغط عليه تتصل أطرافه معًا مما يؤدي إلى إغلاق الدائرة الكهربائية المتصلة به، وعند إزالة الضغط يعود إلى حالته الأولى، يمكن أن يستخدم كعنصر للتحكم بالتشغيل والإيقاف بإعطاء إشارة رقمية Digital إلى الأردوينو Arduino من خلال توصيل أحد أطرافه مع 5v أو GND والطرف الآخر مع إحدى أقطاب الأردوينو الرقمية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="159140" href="https://academy.hsoub.com/uploads/monthly_2024_10/329497298_.jpg.a9d86b1977070f0204681e0bca5f33fb.jpg" rel=""><img alt="مفتاح الضغط اللحظي" class="ipsImage ipsImage_thumbnailed" data-fileid="159140" data-unique="aehm1y26s" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.jpg.6e45937759932b5ae9229fb38e398886.jpg"> </a>
</p>

<p>
	مثلًا وصَّلنا الطرف الأول للمفتاح مع 5v والطرف الثاني مع القطب رقم 2 للأردوينو Arduino وضغطنا على المفتاح في هذه الحالة عند قراءة قيمة القطب ستكون <code>HIGH</code> أو 1 منطقي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159126" href="https://academy.hsoub.com/uploads/monthly_2024_10/002_.JPG.3faf8fe141015f0d859e86a69bd3c8c5.JPG" rel=""><img alt="002 توصيل المفتاح مع التغذية" class="ipsImage ipsImage_thumbnailed" data-fileid="159126" data-unique="1o4txooo7" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/002_.thumb.JPG.2e984a71ac31cb717aba426e7b5c130b.JPG"> </a>
</p>

<p>
	أو إذا كان الطرف الأول للمفتاح وصل مع GND بدلًا من 5v والطرف الثاني مع القطب رقم 2 للأردوينو Arduino فإنه عند الضغط على المفتاح ستكون قيمة القطب <code>LOW</code> أو 0 منطقي.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159127" href="https://academy.hsoub.com/uploads/monthly_2024_10/003_.JPG.23ef6f02fff6ec15fb0c4fc4f71c73e4.JPG" rel=""><img alt="003 توصيل المفتاح مع الأرضي" class="ipsImage ipsImage_thumbnailed" data-fileid="159127" data-unique="hb8m0amwl" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/003_.thumb.JPG.85bc373e1dfd90963221c899e75f8785.JPG"> </a>
</p>

<p>
	ولكن نلاحظ أنه في حال عدم الضغط على المفتاح فإنه يعطي قيم خاطئة أو عشوائية وذلك لأنه عند عدم الضغط على المفتاح لا يوجد أي إشارة على قطب الأردوينو (1 منطقي <code>HIGH</code> أو 0 منطقي <code>LOW</code>) وتسمى هذه الحالة بالحالة العائمة أو حالة مقاومة عالية (High-Z or High impedance).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159128" href="https://academy.hsoub.com/uploads/monthly_2024_10/004_.JPG.43b4d5be2bb0f0896102a4806cacf858.JPG" rel=""><img alt="004 مشكلة عدم الضغط على المفتاح" class="ipsImage ipsImage_thumbnailed" data-fileid="159128" data-unique="86tx0lyo1" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/004_.thumb.JPG.4808d7781ae8adeab08535fb946befec.JPG"> </a>
</p>

<p>
	نحل هذه المشكلة من خلال إضافة مقاومة رفع Pull-Up Resistor من خلال توصيل مقاومة بين قطب الأردوينو و5v (تكون القيمة الافتراضية للقطب في حال عدم الضغط على المفتاح هي <code>HIGH</code> أو 1 منطقي أما عند الضغط على المفتاح فتكون قيمته <code>LOW</code> أو 0 منطقي) أو إضافة مقاومة خفض Pull-Down Resistor من خلال توصيل مقاومة بين قطب الأردوينو والأرضي GND (تكون القيمة الافتراضية للقطب في حال عدم الضغط على المفتاح هي <code>LOW</code> أو 0 منطقي أما عند الضغط على المفتاح فستكون قيمته <code>HIGH</code> أو 1 منطقي).
</p>

<p>
	توضح الصورة الآتية حالة قطب الدخل في لوحة الأردوينو أونو Arduino Uno في حال استخدام مقاومة رفع مع مفتاح الضغط اللحظي Push Button أو بدونها.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159148" href="https://academy.hsoub.com/uploads/monthly_2024_10/005_.JPG.e34c2d99fa13bb7a9169eef5542fe453.JPG" rel=""><img alt="005_قيمة القطب مع مقاومة رفع وبدون.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="159148" data-ratio="40.17" data-unique="o6ges16zx" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_10/005_.thumb.JPG.7b8d142d169d1aaa0bdcae77bb412494.JPG"></a>
</p>

<p>
	وتوضح الصورة الآتية طريقة توصيل مقاومة الرفع والخفض مع مفتاح الضغط اللحظي Push Button في لوحة الأردوينوأونو Arduino UNO
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159149" href="https://academy.hsoub.com/uploads/monthly_2024_10/006_.JPG.fb38fbbd6a4276cdb263e909e39138cd.JPG" rel=""><img alt="006_مقاومة الرفع والخفض مع الأردوينو.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="159149" data-ratio="48.17" data-unique="8ktjcr6j7" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_10/006_.thumb.JPG.462e871cbf93d299ab2e193c840ac023.JPG"></a>
</p>

<h2 id="-2">
	مخطط التوصيل لمشروع تخمين عدد مرات وميض الليد
</h2>

<p>
	اتبع الخطوات الآتية في عملية توصيل العناصر والأسلاك مع لوحة الأردوينو Arduino لتنفيذ فكرة المشروع:
</p>

<ul>
	<li>
		صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل
	</li>
	<li>
		صل الرِّجل الأطول التي تمثل الطرف الموجب لليد مع الرجل الأولى للمقاومة ذات القيمة 220 أوم، ثم صل الرجل الأخرى للمقاومة ذات القيمة 220 أوم مع القطب رقم 13 في لوحة الأردوينو أونو Arduino Uno
	</li>
	<li>
		صل الرجل الأقصر التي تمثل الطرف السالب لليد مع المسرى السالب في لوحة توصيل التجارب BreadBoard
	</li>
	<li>
		يوجد في مفتاح الضغط اللحظي Push Button أربعة أرجل أو أطراف كما ذكرنا سابقًا، كل اثنين منها متصلة ببعضها داخليًا ويمكن اعتبارها رجلًا واحدة، ولتجنب الخطأ أو التشتت في التوصيل سنعتمد أن نأخذ الأرجل القطرية أي الأرجل المختلفة للمفتاح دائمًا
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="159144" href="https://academy.hsoub.com/uploads/monthly_2024_10/2130258129_.jpg.4793d2eac5e0078dbcb7e501ab3953a2.jpg" rel=""><img alt="أقطاب مفتاح الضغط اللحظي.jpg" class="ipsImage ipsImage_thumbnailed" data-fileid="159144" data-ratio="44.56" data-unique="o03ck442v" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_10/.thumb.jpg.ce3eb155d12cab13e26d8a4a91f801cf.jpg"></a>
</p>

<ul>
	<li>
		ثبت المفتاح بشكل جيد في منتصف لوحة توصيل التجارب BreadBoard، بحيث يكون نصف المفتاح في الجزء الأيمن للوحة التجارب BreadBoard والنصف الثاني للمفتاح في الجزء الأيسر للوحة التجارب BreadBoard
	</li>
	<li>
		صل الطرف الأول للمفتاح مع المسرى السالب للوحة التجارب BreadBoard، والطرف الثاني للمفتاح مع القطب رقم 2 في لوحة أردوينو أونو
	</li>
	<li>
		صل الطرف الأول للمقاومة ذات القيمة 10 كيلو أوم مع الطرف الثاني للمفتاح المتصل مع القطب رقم 2 في لوحة الأردوينو أونو
	</li>
	<li>
		صل الطرف الثاني للمقاومة ذات القيمة 10 كيلو أوم مع المسرى الموجب للوحة توصيل التجارب BreadBoard
	</li>
</ul>

<p>
	توضح الصورة الآتية مخطط التوصيل لمشروع تخمين عدد مرات وميض الليد:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159143" href="https://academy.hsoub.com/uploads/monthly_2024_10/007_.JPG.51643b200c54847e32493220e3f313d0.JPG" rel=""><img alt="007_مخطط توصيل المشروع الثالث.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="159143" data-ratio="52.44" data-unique="93a25uv53" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_10/007_.thumb.JPG.5bfc3d1cf20baed611b62ab3c3434aa7.JPG"></a><a class="ipsAttachLink ipsAttachLink_image" href="https://academy.hsoub.com/uploads/monthly_2024_10/007_.JPG.f234eeb1e14756a4908259c6c5548b84.JPG" rel=""> </a>
</p>

<h2 id="-3">
	الكود البرمجي لمشروع تخمين عدد مرات وميض الليد
</h2>

<p>
	نحتاج في البداية لتعريف متغيرات خاصة بأرقام أقطاب بالليد LED والمفتاح Push Button؛ فكما شرحنا في مخطط التوصيل سيوصل المفتاح مع القطب رقم 2 والليد مع القطب رقم 13، وبما أن هذه الأرقام صحيحة نخزنها في متغيرات من نوع <code>int</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_8" style=""><span class="typ">int</span><span class="pln"> led </span><span class="pun">=</span><span class="pln"> </span><span class="lit">13</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> button </span><span class="pun">=</span><span class="pln"> </span><span class="lit">2</span><span class="pun">;</span></pre>

<p>
	شرحنا في فكرة المشروع أن الليد سيضيء وينطفئ لمدة زمنية عشوائية ولكن هذه المدة ضمن مجال محدد لذلك نخزن مجال القيم العشوائية الخاصة بالتأخير الزمني في متغيرات من نوع <code>int</code> وسنختار أقل مدة هي 100 مللي ثانية وأكثر مدة هي 500 مللي ثانية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_10" style=""><span class="typ">int</span><span class="pln"> minDelay </span><span class="pun">=</span><span class="pln"> </span><span class="lit">100</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> maxDelay </span><span class="pun">=</span><span class="pln"> </span><span class="lit">500</span><span class="pun">;</span></pre>

<p>
	أخيرًا نحتاج إلى تعريف متغير من نوع <code>int</code> لتخزين قيمة العداد بقيمة ابتدائية 0.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_12" style=""><span class="typ">int</span><span class="pln"> count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span></pre>

<p>
	سنفعّل واجهة الاتصال التسلسلية Serial Communication داخل الدالة الرئيسية <code><a href="https://wiki.hsoub.com/Arduino/setup" rel="external">()setup</a></code> في البداية من أجل عرض قيمة العداد على نافذة الاتصال التسلسلي Serial Monitor الموجودة في بيئة الأردوينو البرمجية Arduino IDE وذلك من خلال التابع <code><a href="https://wiki.hsoub.com/Arduino/serial/begin" rel="external">()Serial.begin</a></code> الذي تأخذ وسيطين: الأول أساسي وهو سرعة نقل البيانات Baud rate بمعدل بت في الثانية وسنختار <code>9600</code>، والثاني اختياري خاص بضبط الإعدادات config الأخرى لواجهة الاتصال ويمكن تركه فارغًا حيث يأخذ الضبط الافتراضي في هذه الحالة. سنضبط بعدها القطب الخاص بالليد كقطب خرج <code>OUTPUT</code> والقطب الخاص بالمفتاح كقطب دخل <code>INPUT</code> من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a></code> التي تأخذ وسيطين: الأول رقم القطب (الذي خُزن في المتغير) والثاني نوع القطب (إما خرج وإما دخل)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_17" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">button</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	سنعرف في الدالة التكرارية <code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> في البداية متغيرًا خاصًا بتخزين قيمة القطب الموصول مع المفتاح بعد قراءتها من خلال الدالة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalread" rel="external">()digitalRead</a></code> التي تأخذ وسيطًا واحدًا وهو رقم القطب وتعيد القيمة الفيزيائية الموجودة على القطب، وبما أن المفتاح موصول مع مقاومة رفع خارجية ستكون قيمة القطب <code>LOW</code> أو 0 منطقي في حالة الضغط على المفتاح و<code>HIGH</code> أو 1 منطقي عند إزالة الضغط عن المفتاح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_21" style=""><span class="pln">  </span><span class="typ">int</span><span class="pln"> buttonStat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button</span><span class="pun">);</span></pre>

<p>
	سيومض الليد وتزداد قيمة العداد باستمرار ولكن بشرط استمرار الضغط على المفتاح؛ لذلك سنستخدم الحلقة التكرارية <code>()while</code> والشرط الذي سنضعه هو أن تكون قيمة المتغير <code>buttonStat</code> هي 0.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_23" style=""><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">buttonStat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="pun">}</span></pre>

<p>
	سيضيء الليد وينطفئ داخل هذه الحلقة بتأخير زمني عشوائي ويتم التحكم بقيمة القطب من خلال الدالة<a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external"> ()digitalWrite</a> التي تأخذ وسيطين: الأول رقم القطب (الذي خُزن في المتغير) والثاني حالة أو قيمة القطب (إما 1 منطقي <code>HIGH</code> للتشغيل وإما 0 منطقي <code>LOW</code> للإطفاء). لتحقيق التأخير الزمني نستخدم الدالة <code><a href="https://wiki.hsoub.com/Arduino/time/delay" rel="external">()delay</a></code> التي تحقق انتظار أو تأخير زمني في مكان كتابتها في الكود ويُكتب الزمن داخلها بواحدة المللي ثانية "ms" وللحصول على قيمة عشوائية نستخدم الدالة <code><a href="https://wiki.hsoub.com/Arduino/math/random" rel="external">()random</a></code> التي يمكن أن تأخذ وسيطين الأول أقل قيمة والثاني أكبر قيمة وتعيد قيمة عشوائية ضمن هذا المجال.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_28" style=""><span class="pln">    digitalWrite</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">random</span><span class="pun">(</span><span class="pln">minDelay</span><span class="pun">,</span><span class="pln"> maxDelay</span><span class="pun">));</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">random</span><span class="pun">(</span><span class="pln">minDelay</span><span class="pun">,</span><span class="pln"> maxDelay</span><span class="pun">));</span></pre>

<p>
	اكتملت مرة واحدة من تشغيل وإطفاء الليد في هذه الحالة لذلك سنزيد قيمة العداد <code>count</code> بمقدار 1، ومن ثَم سنحتاج إلى قراءة حالة المفتاح مرة أخرى كي لا تصبح الحلقة التكرارية غير منتهية فإذا تمت إزالة الضغط عن المفتاح سيخرج البرنامج من هذه الحلقة ويكمل تنفيذ باقي البرنامج.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_30" style=""><span class="pln">    count</span><span class="pun">++;</span><span class="pln">
    buttonStat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button</span><span class="pun">);</span></pre>

<p>
	ليصبح الكود الخاص بالحلقة التكرارية <code>()while</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_32" style=""><span class="pln"> </span><span class="kwd">while</span><span class="pln"> </span><span class="pun">(</span><span class="pln">buttonStat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">random</span><span class="pun">(</span><span class="pln">minDelay</span><span class="pun">,</span><span class="pln"> maxDelay</span><span class="pun">));</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">random</span><span class="pun">(</span><span class="pln">minDelay</span><span class="pun">,</span><span class="pln"> maxDelay</span><span class="pun">));</span><span class="pln">
    count</span><span class="pun">++;</span><span class="pln">
    buttonStat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span></pre>

<p>
	سنطبع قيمة العداد <code>count</code> على نافذة الاتصال التسلسلي إن تحقق الشرط أن العداد <code>count</code> لا يساوي الصفر (المفتاح ضغط والليد اشتغل وانطفأ مرة واحدة على الأقل) وسبب استخدام هذا الشرط هو تجنب طباعة رقم 0 باستمرار في حالة عدم الضغط على المفتاح.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_34" style=""><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">count </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
 </span><span class="pun">}</span></pre>

<p>
	بعد التأكد من أن قيمة العداد ليست صفرًا سنطبع العبارة ":Number of blinking" من خلال الدالة المدمجة <code>()Serial.print</code> ونضع البيانات التي نريد طباعتها داخل الأقواس وبما أننا نريد طباعة نص نكتبه ضمن علامتي تنصيص " " وبجانبه نريد طباعة عدد مرات الوميض ثم النزول إلى سطر جديد؛ لذلك سنستخدم التابع<code> <a href="https://wiki.hsoub.com/Arduino/serial/println" rel="external">()Serial.println</a></code> الذي يطبع البيانات ثم ينتقل إلى سطر جديد.
</p>

<p>
	وفي النهاية نصفر قيمة العداد كي يبدأ العد من الصفر إذا ضُغط على المفتاح مرة أخرى.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_36" style=""><span class="pln"> </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">count </span><span class="pun">!=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"number of blinking: "</span><span class="pun">);</span><span class="pln">
    </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">count</span><span class="pun">);</span><span class="pln">
    count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span></pre>

<h2 id="-4">
	تحسين الكود البرمجي للمشروع
</h2>

<p>
	من أكثر المشكلات التي تواجه المطورين في المشاريع الضخمة هي استهلاك <a href="https://academy.hsoub.com/apps/operating-systems/%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D9%88%D8%A3%D9%86%D9%88%D8%A7%D8%B9%D9%87%D8%A7-r880/" rel="">ذاكرة</a> البرنامج بشكل مفرط ولعل أهم أسباب هذه المشكلة هو العدد الكبير للمتغيرات الموجودة في الكود، ونلاحظ أن لدينا في هذا المشروع المتغيرات الآتية: <code>led</code> و<code>button</code> و<code>minDelay</code> و<code>maxDelay</code> التي لم نعدل على القيمة المخزنة فيها مطلقًا خلال الكود على عكس المتغيرات الأخرى <code>count</code> <code>buttonStat</code> التي تتغير قيمها.
</p>

<p>
	لهذا نستطيع الاستغناء عن المتغيرات التي لا نحتاج للتعديل عليها مثل <code>led</code> و<code>button</code> و <code>minDelay</code> و<code>maxDelay</code> من أجل تقليل استهلاك ذاكرة البرنامج، واستبدال هذه المتغيرات بالماكرو Macro وهو عبارة عن طريقة لتعريف مجموعة من التعليمات البرمجية التي يمكن استخدامها مرارًا وتكرارًا في البرنامج دون استهلاك ذاكرة البرنامج، ويعرف الماكرو باستخدام الموجهات Directives وتبدأ بالكلمة المفتاحية <code>define#</code> ثم اسم الماكرو وبعدها القيمة الخاصة به مثال لاستبدال المتغيرات السابقة:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_41" style=""><span class="com">#define</span><span class="pln"> led </span><span class="lit">13</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> button </span><span class="lit">2</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> minDelay </span><span class="lit">100</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> maxDelay </span><span class="lit">500</span></pre>

<p>
	لاحظ الفرق بين حجم استهلاك ذاكرة البرنامج في كلا الحالتين الأولى هي عند استخدام المتغيرات والثانية هي عند استبدالها بالماكرو
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159132" href="https://academy.hsoub.com/uploads/monthly_2024_10/009_.JPG.fae6848726f02881132583601eb637fe.JPG" rel=""><img alt="009 استهلاك الذاكرة في حالة المتغيرات" class="ipsImage ipsImage_thumbnailed" data-fileid="159132" data-unique="mdy53b8lq" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/009_.thumb.JPG.27c25d3093facec729d2ce2e706a8377.JPG"> </a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159133" href="https://academy.hsoub.com/uploads/monthly_2024_10/010_.JPG.34fa3b908d60363a2b621bccc8430e8d.JPG" rel=""><img alt="010 استهلاك الذاكرة في حالة الماكرو" class="ipsImage ipsImage_thumbnailed" data-fileid="159133" data-unique="t76732vrq" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/010_.thumb.JPG.c90766fe96b1ab2e0c4bc7330f9e616b.JPG"> </a>
</p>

<p>
	ويمكن أن يكون الماكرو بسيطًا كاستبدال نص معين أو أرقام ويمكن أن يكون معقدًا أكثر مثل ماكرو الدالة، للاطلاع أكثر على الماكرو وأنواعه من خلال مقال <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%85%D8%A7%D9%83%D8%B1%D9%88-macro-%D9%88%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC-%D8%A7%D9%84%D9%85%D8%B3%D8%A8%D9%82-preprocessor-%D9%81%D9%8A-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1750/" rel="">الماكرو Macro والمعالج المسبق Preprocessor في لغة سي C</a>.
</p>

<p>
	رأينا سابقًا مشكلة الحالة العائمة floating الخاصة بالمداخل الرقمية Digital Input عندما لا يكون هناك قيمة محددة عليها واستطعنا حل هذه المشكلة من خلال التعرف على مفهوم مقاومة الرفع والخفض واستخدمنا مقاومة رفع خارجية في مشروعنا مع مفتاح الضغط اللحظي Push Button. تدعم بعض المتحكمات ومن بينها لوحات الأردوينو وجود مقاومة رفع داخلية نستطيع تفعيلها برمجيًا أثناء ضبط نوع القطب من خلال الدالة المدمجة <a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a> التي نمرر لها رقم القطب ونوعه كما ذكرنا سابقًا وقد تعرفنا على حالتين لنوع القطب إما أن يكون خرج <code>OUTPUT</code> وإما دخل <code>INPUT</code> ولكن هناك حالة ثالثة وهي دخل مع تفعيل مقاومة رفع داخلية <code>INPUT_PULLUP</code> وبهذه الحالة نستطيع الإستغناء عن مقاومة الرفع الخارجية والتقليل من التوصيلات والعناصر التي قد تسبب تعقيدًا في تنفيذ المشروع للبعض بحل برمجي بسيط
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_44" style=""><span class="pln">  pinMode</span><span class="pun">(</span><span class="pln">button</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span></pre>

<p>
	يصبح الكود البرمجي النهائي للمشروع:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5747_46" style=""><span class="com">#define</span><span class="pln"> led </span><span class="lit">13</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> button </span><span class="lit">2</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> minDelay </span><span class="lit">100</span><span class="pln">
</span><span class="com">#define</span><span class="pln"> maxDelay </span><span class="lit">500</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">begin</span><span class="pun">(</span><span class="lit">9600</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">button</span><span class="pun">,</span><span class="pln"> INPUT_PULLUP</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> buttonStat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">while</span><span class="pun">(</span><span class="pln">buttonStat </span><span class="pun">==</span><span class="pln"> </span><span class="lit">0</span><span class="pun">){</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">random</span><span class="pun">(</span><span class="pln">minDelay</span><span class="pun">,</span><span class="pln"> maxDelay</span><span class="pun">));</span><span class="pln">
    digitalWrite</span><span class="pun">(</span><span class="pln">led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="pln">random</span><span class="pun">(</span><span class="pln">minDelay</span><span class="pun">,</span><span class="pln"> maxDelay</span><span class="pun">));</span><span class="pln">
    count</span><span class="pun">++;</span><span class="pln">
    buttonStat </span><span class="pun">=</span><span class="pln"> digitalRead</span><span class="pun">(</span><span class="pln">button</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">if</span><span class="pun">(</span><span class="pln">count </span><span class="pun">!=</span><span class="lit">0</span><span class="pun">){</span><span class="pln">
    </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">print</span><span class="pun">(</span><span class="str">"number of blinking: "</span><span class="pun">);</span><span class="pln">
    </span><span class="typ">Serial</span><span class="pun">.</span><span class="pln">println</span><span class="pun">(</span><span class="pln">count</span><span class="pun">);</span><span class="pln">
    count </span><span class="pun">=</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-5">
	محاكاة لمشروع تخمين عدد مرات وميض الليد
</h2>

<p>
	اتبع الخطوات التي تعلمناها في المقال السابق للوصول الى الصفحة الخاصة بمحاكاة مشروعك على موقع وكوي <a href="https://wokwi.com/" rel="external nofollow">Wokwi</a> .تستطيع الرجوع إليها من خلال <a href="" rel="">مقال التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159134" href="https://academy.hsoub.com/uploads/monthly_2024_10/011_.JPG.faf82137fbae83245d67c325de61b64a.JPG" rel=""><img alt="011 الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="159134" data-unique="com8dkp67" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/011_.thumb.JPG.61ea27a9c8f42ab0bccd9ce95b98d63f.JPG"> </a>
</p>

<p>
	أضف العناصر الإلكترونية اللازمة للمشروع وهي Push Button LEDs و Resistors و BreadBoard.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159135" href="https://academy.hsoub.com/uploads/monthly_2024_10/012_.JPG.06586ee1d974e71505938fc877c87be7.JPG" rel=""><img alt="012 إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="159135" data-unique="bl7eb8h0g" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/012_.thumb.JPG.38bf2de42ddeec71f40114464cba6a22.JPG"> </a>
</p>

<p>
	غير قيمة مقاومة الليد إلى 220 أوم ومقاومة المفتاح إلى 10 كيلو أوم (في حال استخدام مقاومة خارجية) من خلال الضغط عليها فتظهر لك نافذة في الأعلى تمكنك من تغير القيمة والواحدة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159136" href="https://academy.hsoub.com/uploads/monthly_2024_10/013_.JPG.3bc0ec146766b3ec531424bf7c60b12e.JPG" rel=""><img alt="013 تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="159136" data-unique="lc9wnx5ki" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/013_.thumb.JPG.d6bc304280b1fff0e961c46c4eb973a8.JPG"> </a>
</p>

<p>
	بالطريقة نفسها يمكنك تغير ألوان الليد والمفتاح من خلال الضغط عليها فتظهر لك نافذة بالأعلى تستطيع من خلالها اختيار اللون.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159137" href="https://academy.hsoub.com/uploads/monthly_2024_10/014_.JPG.b978b776da51147ef3818dfa9699ea3c.JPG" rel=""><img alt="014 تغير لون الليد والمفتاح" class="ipsImage ipsImage_thumbnailed" data-fileid="159137" data-unique="5qrf99nwp" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/014_.thumb.JPG.f0a2b8b35238c6894fe6318fdb32994d.JPG"> </a>
</p>

<p>
	رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
</p>

<p>
	أخيرًا اكتب الكود البرمجي في الجزء الخاص به، ثم شغل المحاكاة، اضغط على المفتاح سيبدأ الليد بالوميض حاول أن تركز في عدد مرات تشغيل وإطفاء الليد انتظر قليلًا ثم أزل الضغط عن المفتاح سيظهر لك عدد مرات وميض الليد في الاسفل، هل استطعت تخمينها بشكل صحيح؟
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="159138" href="https://academy.hsoub.com/uploads/monthly_2024_10/015_.JPG.d60cef8d91deb80070db8ea85630f464.JPG" rel=""><img alt="015 النتيجة النهائية لمحاكاة المشروع الثالث" class="ipsImage ipsImage_thumbnailed" data-fileid="159138" data-unique="c893s8ika" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_10/015_.thumb.JPG.9e5b6c99eb7e1eedaaf9168a2bab6d0b.JPG"> </a>
</p>

<h2 id="-6">
	الخلاصة
</h2>

<p>
	شرحنا في هذا المشروع طريقة بناء مشروع لقياس وتخمين عدد مرات وميض الليد عند الضغط عليه باستخدام لوحة الأردوينو، واستعرضنا كيفية بناء المشروع وتوصيل العناصر والأدوات، بما في ذلك الأردوينو والليد والمقاومات والمفتاح، وتعلمنا كيفية كتابة الكود الخاص ببرمجة الأردوينو باستخدام بيئة التطوير المتكاملة IDE الخاصة به وعمل محاكاة للمشروع من خلال منصة وكوي Wokwi وكيفية حل مشكلات المشروع وتحسينه للأفضل.
</p>

<h2 id="-7">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D8%A5%D8%B4%D8%A7%D8%B1%D8%A9-%D9%85%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2414/" rel="">بناء إشارة مرور باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%AF%D8%A7%D8%A9-%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1621/" rel="">أداة التهيئة في راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r2078/" rel="">تجميع راسبيري باي والتحضير لاستخدامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AC%D9%88%D9%84%D8%A9-%D9%81%D9%8A-%D9%86%D8%B8%D8%A7%D9%85-%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r2079/" rel="">جولة في نظام تشغيل راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2420</guid><pubDate>Fri, 04 Oct 2024 15:00:00 +0000</pubDate></item><item><title>&#x628;&#x646;&#x627;&#x621; &#x625;&#x634;&#x627;&#x631;&#x629; &#x645;&#x631;&#x648;&#x631; &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x627;&#x644;&#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; Arduino</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D9%86%D8%A7%D8%A1-%D8%A5%D8%B4%D8%A7%D8%B1%D8%A9-%D9%85%D8%B1%D9%88%D8%B1-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2414/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_09/Arduino.png.b8581a10fd025d639ff1248f5db1507b.png" /></p>
<p>
	بعد أن أنشأنا أول مشروع بسيط لنا باستخدام لوحة أردوينو في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2413/" rel="">المقال السابق</a>، سنوظف ما تعلمناه حول التعامل مع الأقطاب الرقمية Digital Pins وكتابة التعليمات البرمجية لضبط نوع القطب وإعطاء أوامر التشغيل والإيقاف إليه وتوصيل العناصر على لوحة التجارب BreadBoard وربطها مع أقطاب لوحة أردوينو ونطور مشروعنا الثاني وهو مشروع يحاكي إشارة المرور.
</p>

<h2 id="">
	فكرة المشروع
</h2>

<p style="text-align: center;">
	<img alt="توضيح آلية عمل المشروع.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="157775" data-ratio="47.50" data-unique="lk7xsi4lm" style="width: 500px; height: auto;" width="640" src="https://academy.hsoub.com/uploads/monthly_2024_09/742502873_.gif.c6f9455d034a6e4a05e462e594c4ff81.gif">
</p>

<p>
	الهدف من هذا المشروع هو التحكم بإشارة مرور بسيطة مثل التي نراها في الطرقات والتي تحتوي على ثلاثة ليدات، أحمر وبرتقالي وأخضر، إذ تكون خطوات التشغيل بالشكل الآتي:
</p>

<ol>
	<li>
		يضيء الليد الأخضر في البداية وتنطفئ باقي الليدات لمدة زمنية محددة (5 ثوان).
	</li>
	<li>
		ينطفئ الليد الأخضر ويضيء الليد البرتقالي بشكل ومضات مرات عدة بفترات قصيرة (0.5 ثانية).
	</li>
	<li>
		يضيء الليد الأحمر وتنطفئ باقي الليدات لمدة زمنية محددة (5 ثوان).
	</li>
	<li>
		تتكرر عملية تشغيل وإطفاء الليد البرتقالي مرات عدة ( الخطوة نفسها رقم 2).
	</li>
	<li>
		إعادة تكرار الخطوات باستمرار بدءًا من الخطوة رقم 1.
	</li>
</ol>

<h2 id="-1">
	العناصر المستخدمة
</h2>

<p>
	العناصر التي سنستخدمها لعمل هذا المشروع هي كالتالي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno.
	</li>
	<li>
		كابل البرمجة USB Cable.
	</li>
	<li>
		لوحة توصيل التجارب Breadboard.
	</li>
	<li>
		ليد أحمر RED LED.
	</li>
	<li>
		ليد أخضر GREEN LED.
	</li>
	<li>
		ليد برتقالي ORANGE LED.
	</li>
	<li>
		ثلاث مقاومات بقيمة 220 أوم.
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع Male to Male.
	</li>
</ul>

<h2 id="circuitdiagram">
	مخطط توصيل مشروع إشارة مرور باستخدام أردوينو
</h2>

<p>
	لتنفيذ فكرة المشروع، اتبع الخطوات الآتية لتوصيل العناصر والأسلاك مع لوحة الأردوينو Arduino :
</p>

<ul>
	<li>
		صل أقطاب التغذية في لوحة الأردوينو أونو Arduino Uno مع لوحة توصيل التجارب BreadBoard، إذ يوصل القطب 5v في لوحة الأردوينو مع المسرى الموجب للوحة التجارب، والقطب GND في لوحة الأردوينو مع المسرى السالب للوحة التجارب من خلال أسلاك التوصيل.
	</li>
	<li>
		صل الرِّجل الأطول (التي تمثل الطرف الموجب) لليد الأخضر مع الرجل الأولى للمقاومة، ثم الرجل الأخرى للمقاومة مع القطب رقم 9 في لوحة الأردوينو أونو Arduino Uno.
	</li>
	<li>
		صل الرِّجل الأقصر (التي تمثل الطرف السالب) لليد الأخضر مع المسرى السالب في لوحة توصيل التجارب BreadBoard.
	</li>
	<li>
		كرر الخطوتين السابقتين بالطريقة ذاتها لليد البرتقالي والليد الأحمر ولكن مع تغيير أرقام الأقطاب في لوحة الأردوينو أونو Arduino Uno إلى القطب رقم 10 لمقاومة الليد البرتقالي والقطب رقم 11 لمقاومة الليد الأحمر.
	</li>
	<li>
		لترتيب التوصيل بصورة أفضل يمكنك توصيل الرِّجل الأقصر (التي تمثل الطرف السالب) لليد الأول مع الرِّجل الأقصر من الليدات الأخرى، ثم توصيل إحداها بالمسرى السالب في لوحة توصيل التجارب BreadBoard لأنها تشترك جميعًا بالنقطة ذاتها وفي النهاية النتيجة واحدة.<br>
		توضح الصورة الآتية مخطط التوصيل:
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157769" href="https://academy.hsoub.com/uploads/monthly_2024_09/001_.JPG.c24ad7207f6d14d50429c3a7cd8fe3cb.JPG" rel=""><img alt="001 مخطط توصيل المشروع الثاني" class="ipsImage ipsImage_thumbnailed" data-fileid="157769" data-unique="tdhs7dnfe" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/001_.thumb.JPG.b6f23f5f477d2bf0b4b648d8bfb3f6cf.JPG"> </a>
</p>

<h2 id="-2">
	الكود البرمجي لمشروع إشارة المرور
</h2>

<p>
	في البداية نحتاج لتعريف ثلاثة متغيرات من نوع عدد صحيح <code>int</code> تحتوي على رقم القطب الموصول مع كل ليد في لوحة Arduino Uno حيث  سنوصلها مع الأقطاب 9 لليد الأخضر و 10 لليد البرتقالي و 11 لليد الأحمر كما وضحنا ذلك في جزء مخطط التوصيل، وبما أننا نريد استخدام هذه المتغيرات في أي جزء من الكود سنعرفها في البداية كمتغيرات عامة خارج الدالتين الرئيسية والتكرارية كما يلي.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_7" style=""><span class="typ">int</span><span class="pln"> </span><span class="typ">Green_Led</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Orange_Led</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Red_Led</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span></pre>

<p>
	الآن، سنضبط داخل الدالة الرئيسية الأقطاب الخاصة بالليدات التي خُزّنت أرقامها ضمن متغيرات كأقطاب خرج من خلال الدالة المدمجة <code><a href="https://www.arduino.cc/reference/en/language/functions/digital-io/pinmode/" rel="external nofollow">()pinMode</a></code> التي تأخذ معاملين الأول رقم القطب (الذي خُزن في المتغير) والثاني نوع القطب (إما خرج وإما دخل) وفي حالتنا هذه الأقطاب جميعها خرج <code>OUTPUT</code>.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_9" style=""><span class="kwd">void</span><span class="pln">  setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	وبما أننا نحتاج لتشغيل المشروع باستمرار لذلك سنكتب التعليمات البرمجية الخاصة بأوامر التحكم بالتشغيل والإطفاء الخاصة بالليدات في الدالة التكرارية <code>()void loop </code>التي تنفذ الكود البرمجي الموجود داخلها بشكل متكرر.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_11" style=""><span class="kwd">void</span><span class="pln">  loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ذكرنا سابقًا أننا سنشغل القطب الخاص بالليد الأخضر في البداية ونطفئ الأقطاب الخاصة بالليدات الأخرى (الأحمر والبرتقالي) بتأخير زمني 5000 مللي ثانية أي بمقدار 5 ثوان، وللتحكم بإشارة خرج أقطاب الليدات برمجيًا سنستخدم الدالة المدمجة <code><a href="https://www.arduino.cc/reference/en/language/functions/digital-io/digitalwrite/" rel="external nofollow">()digitalWrite</a></code> التي تأخذ معاملين أيضًا: الأول رقم القطب (الذي خُزن في المتغير) والثاني حالة أو قيمة القطب (إما 1 منطقي <code>HIGH</code> وإما 0 منطقي <code>LOW</code>) وفي حالتنا هذه سيأخذ القطب الخاص بالليد الأخضر القيمة <code>HIGH</code> لأننا نريد تشغيله وستأخذ الأقطاب الخاصة بالليدات الأخرى (الأحمر والبرتقالي) القيمة <code>LOW</code>، ولتحقيق التأخير الزمني نستخدم الدالة المدمجة <code><a href="https://www.arduino.cc/reference/en/language/functions/time/delay/" rel="external nofollow">()delay</a></code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_13" style=""><span class="pln">   digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">5000</span><span class="pun">);</span></pre>

<p>
	سنشغل الليد البرتقالي ثم نطفئه بشكل متكرر مرات عدة وبتأخير زمني قصير (0.5 ثانية بعد كل عملية تشغيل أو إطفاء) ليحاكي النموذج الحقيقي لإشارة المرور، ولتنفيذ ذلك برمجيًا نستدعي الدالة <code>()digitalWrite</code> حيث سيأخذ القطب الخاص بالليد البرتقالي القيمة <code>HIGH</code> وستأخذ الأقطاب الخاصة بالليدات الأخرى (الأحمر والأخضر) القيمة <code>LOW</code> لأننا نريد تشغيل الليد البرتقالي بالبداية، وبالطريقة نفسها نستخدم الدالة <code>()digitalWrite</code> مع تغيير قيمة القطب الخاص بالليد البرتقالي إلى القيمة <code>LOW</code> لأننا نريد إطفاءه. ونستدعي دالة التأخير الزمني<code>()delay</code>  بين كل عملية تشغيل وإطفاء أو العكس بمقدار نصف ثانية أو 500 مللي ثانية، بهذه الطريقة نحقق وميض الليد البرتقالي مرة واحدة، وبتكرار الكود مرات عدة نحصل على الوظيفة المطلوبة.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_15" style=""><span class="pln">  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span></pre>

<p>
	سيضيءالقطب الخاص بالليد الأحمر في النهاية وتنطفئ الأقطاب الخاصة بالليدات الأخرى (الأخضر والبرتقالي) بتأخير زمني 5000 مللي ثانية أي بمقدار 5 ثوان، لذا نستدعي الدالة<code>()digitalWrite</code> حيث سيأخذ القطب الخاص بالليد الأحمر القيمة <code>HIGH</code> لأننا نريد تشغيله وستأخذ الأقطاب الخاصة بالليدات الأخرى (الأخضر والبرتقالي) القيمة <code>LOW</code>، ونستدعي الدالة المدمجة <code>()delay</code> بقيمة 5000 لتحقيق تأخير الزمني بمقدار 5 ثوان.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_17" style=""><span class="pln">  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">5000</span><span class="pun">);</span></pre>

<h2 id="-3">
	تحسين الكود البرمجي لمشروع إشارة مرور
</h2>

<p>
	كما تلاحظ فإننا نكرر التعليمات البرمجية الخاصة بالتحكم بتشغيل وإطفاء الليد البرتقالي ثلاث مرات في الكود السابق، وفي كل مرة نعيد كتابة التعليمات البرمجية الخاصة بذلك، ويمكن اختصار الكود خلال كتابة التعليمات مرة واحدة فقط داخل حلقة تكرارية for بمتغير i تبدأ قيمته من 1 وتزداد بمقدار 1 في كل مرة حتى تصبح مساوية لـ 3 (تكرار تنفيذ ما بداخل الحلقة ثلاث مرات) ويصبح الكود الخاص بهذا الجزء:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_19" style=""><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	لاحظ أننا في كل مرة نتحكم بالأقطاب الثلاثة بالترتيب نفسه <code>Red_Led</code> ثم <code>Orange_Led</code> ثم <code>Green_Led</code>، يمكننا القيام بذلك بتعليمة برمجية واحد فقط بدلًا من أن نكتب ثلاث تعليمات برمجية خاصة بالتحكم بتشغيل وإطفاء هذه الليدات في كل مرة من خلال كتابة دالة باسم <code>()ROG_LED</code> (أو أي اسم مناسب تريده) تأخذ ثلاثة معاملات، يمثل كل معامل حالة قطب من أقطاب الليدات الثلاثة وتكون بالترتيب الآتي: معامل حالة قطب الليد الأحمر <code>Red_Stat</code>، ومعامل حالة قطب الليد البرتقالي <code>Orange_Stat</code>، ومعامل حالة قطب الليد الأخضر <code>Green_stat</code> وبداخل هذه الدالة سنكتب التعليمات البرمجية التي تتحكم بتشغيل وإطفاء هذه الليدات مرة واحدة فقط وبقيمة الوسيط الخاص بكل ليد ذاتها.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_21" style=""><span class="kwd">void</span><span class="pln"> ROG_LED</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Red_Stat</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Orange_Stat</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Green_stat</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Red_Stat</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Orange_Stat</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Green_stat</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يصبح الكود النهائي للمشروع كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_2949_23" style=""><span class="typ">int</span><span class="pln"> </span><span class="typ">Red_Led</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">11</span><span class="pun">;</span><span class="pln">  
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Orange_Led</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">  
</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Green_Led</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="lit">9</span><span class="pun">;</span><span class="pln">  

</span><span class="kwd">void</span><span class="pln"> ROG_LED</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> </span><span class="typ">Red_Stat</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Orange_Stat</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> </span><span class="typ">Green_stat</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Red_Stat</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Orange_Stat</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> </span><span class="typ">Green_stat</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Red_Led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Orange_Led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="typ">Green_Led</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="com">// Green Light</span><span class="pln">
  ROG_LED</span><span class="pun">(</span><span class="pln">LOW</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">5000</span><span class="pun">);</span><span class="pln">

  </span><span class="com">// Orange Light</span><span class="pln">
  </span><span class="kwd">for</span><span class="pln"> </span><span class="pun">(</span><span class="typ">int</span><span class="pln"> i </span><span class="pun">=</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln"> i </span><span class="pun">&lt;=</span><span class="pln"> </span><span class="lit">3</span><span class="pun">;</span><span class="pln"> i</span><span class="pun">++)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
    ROG_LED</span><span class="pun">(</span><span class="pln">LOW</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
    ROG_LED</span><span class="pun">(</span><span class="pln">LOW</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
    delay</span><span class="pun">(</span><span class="lit">500</span><span class="pun">);</span><span class="pln">
  </span><span class="pun">}</span><span class="pln">

  </span><span class="com">// Red Light</span><span class="pln">
  ROG_LED</span><span class="pun">(</span><span class="pln">HIGH</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">5000</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="-4">
	محاكاة المشروع:
</h2>

<p>
	سننفذ المحاكاة باستخدام منصة <a href="https://wokwi.com/" rel="external nofollow">ووكوي Wokwi</a> باتباع الخطوات التي شرحناها في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2413/" rel="">المقال السابق</a> للوصول الى الصفحة الخاصة بمحاكاة المشروع كما توضح الصورة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157770" href="https://academy.hsoub.com/uploads/monthly_2024_09/002_.JPG.219454969ca66445334dd3ff4f88eae1.JPG" rel=""><img alt="002 الصفحة الخاصة بمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="157770" data-unique="37tcq192m" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/002_.thumb.JPG.f1fdc98257cbba6685fa57c485766ca1.JPG"> </a>
</p>

<ul>
	<li>
		بعدها أضف العناصر الإلكترونية اللازمة للمشروع مثل لوحة التجارب BreadBoard، والليدات LEDs، والمقاومات Resistors.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157771" href="https://academy.hsoub.com/uploads/monthly_2024_09/003_.JPG.b5a788e9a8831de8d00e5babf9614b67.JPG" rel=""><img alt="003 إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="157771" data-unique="c2bu9k7pb" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/003_.thumb.JPG.8847158e17b63128f2287893a3fb6937.JPG"> </a>
</p>

<ul>
	<li>
		غيّر قيمة المقاومات إلى 220 أوم من خلال الضغط عليها فتظهر لك نافذة تمكنك من تغير القيمة والواحدة.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157772" href="https://academy.hsoub.com/uploads/monthly_2024_09/004_.JPG.ba6f77ddc170687220516fa09c07e908.JPG" rel=""><img alt="004 تغيير قيمة المقاومة" class="ipsImage ipsImage_thumbnailed" data-fileid="157772" data-unique="ai19xwklb" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/004_.thumb.JPG.7848971fce70fd5f5a33a8012ad546bb.JPG"> </a>
</p>

<ul>
	<li>
		يمكنك الطريقة نفسها تغير ألوان الليدات من خلال الضغط عليها فتظهر لك نافذة تستطيع من خلالها اختيار لون الليد.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157773" href="https://academy.hsoub.com/uploads/monthly_2024_09/005_.JPG.50aa878e993608562e6aa42f1541e690.JPG" rel=""><img alt="005 تغير لون الليد" class="ipsImage ipsImage_thumbnailed" data-fileid="157773" data-unique="xx11tfex5" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/005_.thumb.JPG.009d99d37f4499e7875882e26333effc.JPG"> </a>
</p>

<ul>
	<li>
		رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
	</li>
	<li>
		اكتب الكود البرمجي في الجزء الخاص به، ثم شغل المحاكاة، ستجد أن الليدات تعمل بالترتيب الذي ذكرناه في وصف المشروع.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157774" href="https://academy.hsoub.com/uploads/monthly_2024_09/006_.JPG.929bcc45ad7960d0b18a0430da5940e5.JPG" rel=""><img alt="006 النتيجة النهائية لمحاكاة المشروع الثاني" class="ipsImage ipsImage_thumbnailed" data-fileid="157774" data-unique="onv5dftdn" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/006_.thumb.JPG.eb22c0450ec53ae51cf5c298d92beef6.JPG"> </a>
</p>

<h2 id="-5">
	الخلاصة
</h2>

<p>
	تعلمنا في هذا المقال بناء المشروع الثاني في سلسلة <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88/" rel="">دليل أدوينو</a> وهو إشارة مرور بسيطة بعدة خطوات سهلة بدءًا من فهم فكرة المشروع ووصولًا إلى كتابة الكود البرمجي الخاص به، مع تعلم كيفية التفكير في تحسين وتطوير الكود، وسنستكمل في المقالات القادمة بناء المزيد من المشاريع الإلكترونية المفيدة ونتعلم من خلالها أفكارًا جديدة.
</p>

<h2 id="-6">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%B4%D8%B1%D9%88%D8%B9-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino-r2413/" rel="">مشروع التحكم بتشغيل وإطفاء ليد LED باستخدام الأردوينو Arduino</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%84%D8%B9%D8%A8%D8%A9-%D8%A7%D9%84%D8%B3%D9%84%D9%83-%D9%88%D8%A7%D9%84%D8%AD%D9%84%D9%82%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1495/" rel="">تصميم لعبة السلك والحلقة باستخدام برنامج سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%85%D8%B5%D8%A8%D8%A7%D8%AD-%D9%84%D9%8A%D8%AF-%D8%AB%D9%84%D8%A7%D8%AB%D9%8A-%D8%A7%D9%84%D8%A3%D8%A8%D8%B9%D8%A7%D8%AF-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1504/" rel="">تنفيذ مصباح ليد ثلاثي الأبعاد باستخدام سكراتش ولوحة راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B5%D9%86%D8%B9-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1505/" rel="">صنع آلة موسيقية باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2414</guid><pubDate>Fri, 27 Sep 2024 15:06:01 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x628;&#x62A;&#x634;&#x63A;&#x64A;&#x644; &#x648;&#x625;&#x637;&#x641;&#x627;&#x621; &#x644;&#x64A;&#x62F; LED &#x628;&#x627;&#x633;&#x62A;&#x62E;&#x62F;&#x627;&#x645; &#x644;&#x648;&#x62D;&#x629; &#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D8%A8%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%A5%D8%B7%D9%81%D8%A7%D8%A1-%D9%84%D9%8A%D8%AF-led-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-r2413/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_09/path139.png.7e2fe886fbb06d31e49de8a7bfc92b7c.png" /></p>
<p>
	بعد أن تعلمنا في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">المقال السابق</a> مجموعة من المعلومات والمفاهيم الأساسية حول لوحات أردوينو وأنواعها ومكوناتها وبيئة برمجتها، سنتعلم في هذا المقال كيفية بناء أول مشروع باستخدام هذه اللوحة، وهو التحكم بتشغيل وإطفاء ليد LED. يعد هذا المشروع من المشاريع الأساسية والمهمة للمبتدئين في عالم الأردوينو، فمن خلاله تتعلم كيفية التعامل مع لوحة الأردوينو، وتوصيل العناصر البسيطة وربطها مع اللوحة، بالإضافة إلى فهم البنية البرمجية الأساسية لأي مشروع، وكيفية استخدام التعليمات البرمجية الأساسية.
</p>

<h2 id="">
	فكرة المشروع
</h2>

<p>
	تعتمد فكرة المشروع على توصيل ليد LED على إحدى الأقطاب الرقمية Digital Pins في لوحة أردوينو أونو Arduino Uno، والتحكم في طريقة عمله، يُضبط القطب كقطب خرج <code>OUTPUT</code>، ثم يُشغل الليد لمدة ثانية واحدة وبعدها يوقف لمدة ثانية أخرى وتتكرر هذه العملية باستمرار. يمكن ربط هذه الفكرة بمثال بسيط لا بد أنك رأيته سابقًا في مكان ما، فهو يستخدم في الساعات الرقمية، إذ يوجد فيها شريحتان من الليدات تفصل بين أرقام الثواني والدقائق والساعات، وتومض بشكل متكرر كل ثانية.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="gif" data-fileid="157766" href="https://academy.hsoub.com/uploads/monthly_2024_09/773802242_.gif.b0996169612fd8f60fd39776fecda0be.gif" rel=""><img alt="صورة توضيحية عن الساعات الرقمية" class="ipsImage ipsImage_thumbnailed" data-fileid="157766" data-unique="xuz3gkwww" src="https://academy.hsoub.com/uploads/monthly_2024_09/773802242_.gif.b0996169612fd8f60fd39776fecda0be.gif"> </a>
</p>

<h2 id="-1">
	العناصر المستخدمة
</h2>

<p>
	سنحتاج مجموعة من العناصر الضرورية لعمل هذا المشروع، وهي:
</p>

<ul>
	<li>
		لوحة أردوينو أونو Arduino Uno.
	</li>
	<li>
		كابل البرمجة USB Cable.
	</li>
	<li>
		لوحة توصيل التجارب Breadboard.
	</li>
	<li>
		ليد LED.
	</li>
	<li>
		مقاومة بقيمة 220 أوم.
	</li>
	<li>
		مجموعة أسلاك توصيل من نوع male to male.
	</li>
</ul>

<h2 id="breadboard">
	ما هي لوحة التجارب Breadboard
</h2>

<p>
	لوحة التجاري هي لوحة مسطحة مصنوعة من البلاستيك، تحتوي على ثقوب متصلة ببعضها البعض بشكل أفقي أو رأسي بواسطة مسارات معدنية من الداخل. تُستخدم في توصيل العناصر الإلكترونية والأسلاك ببعضها البعض وبناء المشاريع والتجارب الإلكترونية دون الحاجة إلى عملية اللحام، مما يجعلها قابلة لإعادة الاستخدام ومن السهل تغيير مكوناتها.
</p>

<p>
	تتصل الثقوب متصلة ببعضها بشكل رأسي في المسارات الجانبية على الأطراف وتوصل عليها أقطاب التغذية غالبًا، لذلك يوجد مساران في كل طرف: الأول للقطب الموجب والآخر للقطب السالب. أما باقي الثقوب فتكون متصلة ببعضها بشكل أفقي وتُستخدم لإدخال العناصر الإلكترونية وتوصيلها ببعضها البعض، كما يوجد فراغ في المنتصف يقسم اللوحة إلى قسمين متناظرين ويسمح بتركيب الدوائر المتكاملة integrated circuit.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="jpg" data-fileid="157765" href="https://academy.hsoub.com/uploads/monthly_2024_09/breadboard.jpg.7471d096047a931f1bc9e08ac68d2494.jpg" rel=""><img alt="صورة توضيحية لمسارات لوحة توصيل التجارب breadboard" class="ipsImage ipsImage_thumbnailed" data-fileid="157765" data-unique="s2spf0932" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/breadboard.thumb.jpg.a8edac3c962ae9fa333b1d33cfaa9e04.jpg"> </a>
</p>

<h2 id="circuitdiagram">
	مخطط توصيل المشروع Circuit Diagram
</h2>

<p>
	سنوضح طريقة توصيل المشروع من خلال مجموعة من النصائح والخطوات البسيطة التي ستساعدك بإنجاز مشروعك بطريقة سهلة، اتبع الخطوات الآتية لتوصيل المشروع:
</p>

<ul>
	<li>
		صل أقطاب التغذية دائمًا بلوحة التجارب أولًا، فسوف تساعدك هذه الخطوة كثيرًا في أي مشروع، ويمكنك الحصول على التغذية من أقطاب الطاقة Power Pins في لوحة الأردوينو التي تحدثنا عنها في <a href="" rel="">المقال السابق</a>، صل القطب 5v مع المسرى الموجب للوحة التجارب والقطب GND مع المسرى السالب للوحة التجارب من خلال الأسلاك.
	</li>
	<li>
		صل الرِّجل الأطول للِّيد (التي تمثل الطرف الموجب) مع القطب رقم 13 في لوحة الأردوينو أونو Arduino Uno.
	</li>
	<li>
		صل الرِّجل الثانية للِّيد (التي تمثل الطرف السالب) مع الرجل الأولى للمقاومة (لا توجد قطبية للمقاومة، لذلك لا يوجد فرق إذا عكسنا بين الرجل الأولى والرجل الثانية).
	</li>
	<li>
		صل الرِّجل الأخرى للمقاومة مع المسرى السالب في لوحة التجارب. توضح الصورة التالية مخطط التوصيل:<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157759" href="https://academy.hsoub.com/uploads/monthly_2024_09/001_.JPG.c7bd81eb29735c35557b306aa53a4fb1.JPG" rel=""> </a>
	</li>
</ul>

<p style="text-align: center;">
	<img alt="001_مخطط توصيل المشروع الأول.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157810" data-ratio="53.20" data-unique="cdkakmfvc" style="width: 500px; height: auto;" width="856" src="https://academy.hsoub.com/uploads/monthly_2024_09/001_.JPG.61151a0e2a1510270f4d68cda9052db7.JPG">
</p>

<h2 id="led">
	الكود البرمجي للتحكم بتشغيل وإطفاء ليد LED
</h2>

<p>
	يجب أن يحتوي أي كود بلغة الأردوينو على دالتين، الأولى<code>()void setup</code> ينفذ ما بداخلها مرة واحدة فقط عند بداية التشغيل وسنسميها الدالة الرئيسية لسهولة الشرح، وبعدها ينتقل لتنفيذ ما بداخل الدالة الثانية <code>()void loop</code> بشكل متكرر، وسنسميها الدالة التكرارية.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8613_13" style=""><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	تُضبط الأقطاب والطرفيات الخاصة بلوحة الأردوينو في الدالة الرئيسية، ففي مثالنا هذا سنضبط القطب رقم 13 على أنه قطب خرج <code>OUTPUT</code> من خلال الدالة المدمجة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/pinmode" rel="external">()pinMode</a></code> التي تأخذ معاملين: الأول يمثل رقم القطب والثاني نوع القطب (خرج أو دخل) فتصبح الدالة الرئيسية بالشكل الآتي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8613_11" style=""><span class="kwd">void</span><span class="pln"> setup </span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ملاحظة: توفر نواة أردوينو Arduino core مجموعة من الدوال المدمجة التي تتميز بأنها سهلة الفهم والاستخدام مما يجعل عملية البرمجة وتطوير المشاريع الإلكترونية أبسط وأكثر كفاءة وفعالية في الكثير من الأوقات كما أنها توفر الوقت والجهد على المبرمجين بتجنب إعادة كتابة الأكواد الشائعة والمستخدمة بكثرة من خلال استخدام هذه الدوال المبنية مسبقًا، مما يساعدهم على التركيز للإبداع والابتكار. يمكنك الاستزادة أكثر والإطلاع على جميع التوابع المدمجة التي توفرها نواة أردوينو من خلال زيارة <a href="https://wiki.hsoub.com/Arduino" rel="external">توثيق أردوينو على موسوعة حسوب</a>، أو الاطلاع على <a href="https://www.arduino.cc/reference/en/" rel="external nofollow">المرجع الرسمي Arduino Reference</a>.<span style="display: none;"> </span>
</p>

<p>
	وبما أننا نريد تشغيل وإطفاء الليد بشكل متكرر ومستمر لذلك سنكتب أمر التشغيل والإطفاء في الدالة<code><a href="https://wiki.hsoub.com/Arduino/loop" rel="external">()loop</a></code> ونتحكم بالتشغيل والإطفاء من خلال الدالة <code><a href="https://wiki.hsoub.com/Arduino/digital_io/digitalwrite" rel="external">()digitalWrite</a></code> التي تأخذ أيضًا معاملين: يمثل المعامل الأول رقم القطب، ويمثل الثاني حالة القطب (إما قيمة 1 منطقي HIGH، أو قيمة 0 منطقي LOW)
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8613_15" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	ولكن عند تجربة هذا الكود نجد أن الليد لا يومض بل يعمل بشكل مستمر، والسبب في ذلك أننا نشغل الليد ثم نطفئه بشكل مباشر وسريع بالتالي لا نلاحظ عملية الومض، في هذه الحالة علينا استخدام الدالة <a href="https://wiki.hsoub.com/Arduino/time/delay" rel="external">()delay</a> التي تضيف فترة انتظار أو تأخير زمني في موضع كتابتها في الكود ويمرر الزمن المطلوب لها بواحدة المللي ثانية ms. وبتعديل الكود السابق تصبح الدالة التكرارية على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8613_17" style=""><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="lit">13</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2 id="led-1">
	تحسين الكود البرمجي للتحكم بتشغيل وإطفاء ليد LED
</h2>

<p>
	عند تجربة الكود السابق نجد أنه يعمل بشكل جيد كما هو مطلوب بالضبط، ولكن يمكن تحسينه أكثر، على فرض أنك تتحكم بحالة القطب من HIGH إلى LOW أو العكس عدة مرات خلال مشروعك، وتريد تغير رقم القطب لسبب ما كترتيب التوصيل ضمن الدارة أو استخدام هذا القطب في وظيفة أخرى خاصة به، ستحتاج في هذه الحالة لتعديل رقم القطب في كل تعليمة تغير فيها حالة القطب من HIGH إلى LOW أو العكس ضمن الكود.
</p>

<p>
	لهذا السبب، يجب تعريف متغير ثابت (بما أننا لن نعدل قيمة هذا المتغير أثناء تنفيذ الكود)، يحتوي هذا المتغير على رقم القطب وإذا اضطررنا لتغير رقم القطب فنغير قيمته في الكود مرة واحدة فقط ونُعرِّف المتغير في بداية الكود خارج التوابع ليكون متغيرًا عامًا global variable ونتمكن من استخدامه في أي مكان ضمن الكود.
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8613_19" style=""><span class="kwd">const</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> LED_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">13</span><span class="pun">;</span></pre>

<p>
	يصبح الكود النهائي للمشروع على النحو التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_8613_21" style=""><span class="typ">int</span><span class="pln"> LED_PIN </span><span class="pun">=</span><span class="pln"> </span><span class="lit">13</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> setup</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  pinMode</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> OUTPUT</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">void</span><span class="pln"> loop</span><span class="pun">()</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> HIGH</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
  digitalWrite</span><span class="pun">(</span><span class="pln">LED_PIN</span><span class="pun">,</span><span class="pln"> LOW</span><span class="pun">);</span><span class="pln">
  delay</span><span class="pun">(</span><span class="lit">1000</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span></pre>

<h2>
	محاكاة المشروع
</h2>

<p>
	تعد ميزة المحاكاة مفيدة ومهمة في كثير من الأحيان لإجراء بعض التجارب أو المشاريع إضافة إلى أنها توفر الوقت والجهد. وتقدم منصة <a href="https://wokwi.com/" rel="external nofollow">ووكوي Wokwi</a> إمكانية محاكاة العديد من اللوحات الإلكترونية مثل لوحات الأردوينو Arduino ولوحات إي إس بي اثنان وثلاثين ESP32 ولوحات إس تي إم اثنان وثلاثين STM32 بالإضافة إلى العديد من الحساسات والعناصر والقطع الإلكترونية، يمكنك الاطلاع أكثر على القسم الخاص بتوثيق الموقع للمزيد من المعلومات حول المميزات والخدمات التي يقدمها، اتبع الخطوات الآتية لإنشاء ومحاكاة مشروعك من خلال هذه المنصة:
</p>

<ol start="1">
	<li>
		بعد الدخول إلى موقع <a href="https://wokwi.com" rel="external nofollow">ووكوي Wokwi</a> ستظهر لك في الواجهة الرئيسية اللوحات المختلفة التي تستطيع عمل محاكاة لها من خلال الموقع.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157760" href="https://academy.hsoub.com/uploads/monthly_2024_09/002_.JPG.9a874799f3d9ada7d0822aea7d1a0d39.JPG" rel=""><img alt="002 الصفحة الرئيسية لموقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="157760" data-unique="dtck8i703" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/002_.thumb.JPG.73c78177f5ff4cb44f7fabc6c913f20e.JPG"> </a>
</p>

<ol start="2">
	<li>
		اضغط على خيار Arduino، وانتظر انتهاء تحميل الصفحة ثم انزل قليلًا واختر لوحة أردوينو أونو Arduino Uno.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157761" href="https://academy.hsoub.com/uploads/monthly_2024_09/003_.JPG.409d7dcb890f71cff3b2c31b9b01ea52.JPG" rel=""><img alt="003 اختيار لوحة أردوينو أونو في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="157761" data-unique="hgy4ok7ve" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/003_.thumb.JPG.7f11e52ba4531d99cf3f0089fcb495fc.JPG"> </a>
</p>

<ol start="3">
	<li>
		ستظهر الصفحة الخاصة بمحاكاة مشروعك كما في الصورة التالية، الجزء الأيسر في الصورة خاص بكتابة الكود البرمجي، والجزء الأيمن خاص بإضافة العناصر الإلكترونية وتوصيل الدائرة الكهربائية.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157762" href="https://academy.hsoub.com/uploads/monthly_2024_09/004_.JPG.e1776a16e3f5bc8a84dd54ac4e3d0409.JPG" rel=""><img alt="004 صفحة محاكاة المشروع في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="157762" data-unique="u8wel8hl4" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/004_.thumb.JPG.146ebb268b60bdac521b432790b128ec.JPG"> </a>
</p>

<ol start="4">
	<li>
		أضف العناصر الإلكترونية اللازمة للمشروع مثل لوحة توصيل التجارب BreadBoard، والليد LED، والمقاومة Resistor (ستلاحظ عند إضافة عنصر المقاومة ظهور نافذة تتيح لك تغير قيمتها، غيرها إلى 220 أوم).
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157763" href="https://academy.hsoub.com/uploads/monthly_2024_09/005_.JPG.699f6a4653076820979a5fc1b6a544f1.JPG" rel=""><img alt="005 إضافة العناصر في موقع وكوي" class="ipsImage ipsImage_thumbnailed" data-fileid="157763" data-unique="vympg3r3q" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/005_.thumb.JPG.bdd445e1f079e070e4cd3ee8d43d53b2.JPG"> </a>
</p>

<ol start="5">
	<li>
		رتب العناصر على لوحة التجارب بالشكل الذي تراه مناسبًا، ثم صل العناصر بعضها ببعض حسب مخطط التوصيل الذي عرضناه سابقًا.
	</li>
	<li>
		أخيرًا اكتب الكود البرمجي في الجزء الخاص به، ثم شغل المحاكاة ستجد الليد يومض كل ثانية.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157764" href="https://academy.hsoub.com/uploads/monthly_2024_09/006_.JPG.6536b0b06662dd4d0a700f25ba78c3d5.JPG" rel=""><img alt="006 النتيجة النهائية لمحاكاة المشروع" class="ipsImage ipsImage_thumbnailed" data-fileid="157764" data-unique="m1z7ik44b" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/006_.thumb.JPG.184dfa146c710f9aa17a38731dcdf320.JPG"> </a>
</p>

<p>
	تهانينا بهذا تكون قد أنجزت مشروعك الأول في أردوينو، ويمكنك بالطبع إجراء بعض التجارب والتعديلات على مشروعك مثل تغير زمن التأخير، أو تغير رقم القطب الخاص بالليد، أو إضافة أكثر من ليد LED.
</p>

<h2 id="-2">
	الخاتمة
</h2>

<p>
	تعلمنا في هذا المقال بناء أول مشروع إلكتروني من خلال لوحة أردوينو بعدة خطوات بسيطة وتعرفنا على العديد من الخطوتات والنصائح المفيدة التي تساعد على محاكاة مشروعك وتنفيذه بطريقة صحيحة، وسنستكمل في المقالات القادمة رحلتنا هذه في عالم الأردوينو من خلال بناء المزيد من المشاريع الإلكترونية الممتعة الأكثر تقدمًا.
</p>

<h2 id="-3">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/" rel="">التعرف على أساسيات الأردوينو وتجهيز بيئة العمل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8A%D8%A7%D8%B1-%D9%88%D8%A7%D9%84%D8%AC%D9%87%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D9%83%D9%86%D8%A9-r2294/" rel="">أساسيات في عالم الإلكترونيات: التيار والجهد والعناصر الساكنة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B4%D9%83%D9%8A%D9%84-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D8%A6%D8%B1-%D8%A7%EF%BB%B9%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D9%81%D8%B9%D8%A7%D9%84%D8%A9-r2299/" rel="">أساسيات في عالم الإلكترونيات: تشكيل الدوائر اﻹلكترونية والعناصر الفعالة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D8%A6%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9-integrated-circuits-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%AD%D9%83%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%BA%D8%B1%D9%8A%D8%A9-micro-processor-r2307/" rel="">مدخل إلى الدوائر المتكاملة Integrated Circuits والمتحكمات الصغرية Micro-processor</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/c/%D8%A8%D9%86%D9%8A%D8%A9-%D8%A8%D8%B1%D9%86%D8%A7%D9%85%D8%AC-%D9%84%D8%BA%D8%A9-%D8%B3%D9%8A-c-r1607/" rel="">بنية برنامج لغة سي C</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2413</guid><pubDate>Fri, 20 Sep 2024 15:00:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x62A;&#x639;&#x631;&#x641; &#x639;&#x644;&#x649; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x644;&#x648;&#x62D;&#x629; &#x623;&#x631;&#x62F;&#x648;&#x64A;&#x646;&#x648; &#x648;&#x62A;&#x62C;&#x647;&#x64A;&#x632; &#x628;&#x64A;&#x626;&#x629; &#x627;&#x644;&#x639;&#x645;&#x644;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-%D9%88%D8%AA%D8%AC%D9%87%D9%8A%D8%B2-%D8%A8%D9%8A%D8%A6%D8%A9-%D8%A7%D9%84%D8%B9%D9%85%D9%84-r2412/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_09/262444159_.png.72778a734c324441ece21fb78151951a.png" /></p>
<p>
	هل سمعت بمصطلح أردوينو Arduino من قبل، وراودك الاهتمام بهذا المصطلح؟ سنشرح في هذا المقال عن لوحات أردوينو من خلال نظرة موسعة عنها وما هي الاختلافات بين أنواعها ومكوناتها الأساسية، بالإضافة إلى شرح كيفية تجهيز بيئة العمل للبدء برحلة ممتعة في عالم الأردوينو والمتحكمات وبناء المشاريع الإلكترونية من خلاله.
</p>

<p>
	هذا المقال هو جزء من سلسلة مقالات تعليمية حول الأردوينو وكيفية بناء المشاريع الإلكترونية من خلالها ويمكنك الوصول لكامل مقالات هذه السلسلة المنشورة تحت وسم <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88/" rel="">دليل أردوينو</a>.
</p>

<h2 id="arduino">
	ما هي لوحة أردوينو Arduino
</h2>

<p>
	هي لوحة إلكترونية تطويرية مفتوحة المصدر، طُورت لمساعدة المبتكرين والهواة في تعلم تصميم وتنفيذ المشاريع الإلكترونية بطريقة سهلة وبدون تعقيد. يمكن للمستخدم برمجة هذه اللوحة لتنفذ وظيفة إلكترونية معينة كالتحكم بتشغيل أو إطفاء ليد LED وشدة إضاءته، أو قراءة قيم من حساسات مختلفة سواء أكانت رقمية Digital أو تشابهية Analog، أو حتى التحكم بشكل كامل بروبوت يقوم بعدة وظائف معًا، إضافة إلى العديد من المشاريع الأخرى. وتُبرمَج هذه اللوحة من خلال بيئة تطوير متكاملة Arduino IDE تستخدم بشكل أساسي لكتابة الأكواد والتعليمات البرمجية من خلالها ورفع الكود إلى اللوحة الإلكترونية وتنفيذه.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157789" href="https://academy.hsoub.com/uploads/monthly_2024_09/001_.JPG.0919cf6438b857780fb04955e3b800dd.JPG" rel=""><img alt="001_ما هو الأردوينو.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157789" data-ratio="63.80" data-unique="f78n4b66z" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/001_.thumb.JPG.75f98dfef7987de9df8a7ec6f05a53c1.JPG"></a>
</p>

<h2 id="microcontroller">
	ما هو المتحكم المصغر Microcontroller
</h2>

<p>
	يعد المتحكم المصغر (أو المتحكم الصغري) من أهم المكونات الموجودة في لوحة الأردوينو، ويمكن تعريفه باختصار على أنه حاسوب مصغر يحوي العناصر الأساسية التي يحتويها الحاسوب مثل المعالج والذواكر وطرفيات الإدخال والإخراج موجودة جميعها في شريحة واحدة ولكن بحجم وإمكانيات محدودة  جداً مقارنة مع الحواسيب الشخصية، ويمكنك التعرف أكثر عن المتحكمات الصغرية والدوائر المتكاملة من خلال مقال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D8%A6%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9-integrated-circuits-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%AD%D9%83%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%BA%D8%B1%D9%8A%D8%A9-micro-processor-r2307/" rel="">مدخل إلى الدوائر المتكاملة والمتحكمات الصغرية</a>
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157790" href="https://academy.hsoub.com/uploads/monthly_2024_09/002_.JPG.d818380a700d538c8ea958516b3e7ad2.JPG" rel=""><img alt="002_بنية المتحكمات.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157790" data-ratio="54.60" data-unique="z0q4u6bi8" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/002_.thumb.JPG.0ddd4431d6520556d7942e4bfd2f0dc1.JPG"></a>
</p>

<h2 id="-1">
	مميزات أردوينو
</h2>

<p>
	من أهم المميزات التي قد تجعلك ترغب في استخدام الأردوينو في مشاريعك الإلكترونية هي أن منصة الأردوينو تملك مجتمع دعم كبير، وسوف تجد العديد من المشاريع والمصادر والمكتبات والأشخاص لمساعدتك وتبادل الأفكار والحلول حول المشاكل التي قد تواجهها خلال تنفيذ مشروعك، بالإضافة إلى العديد من المميزات الأخرى ومنها:
</p>

<ul>
	<li>
		<strong>سهولة الاستخدام</strong>: تستطيع البدء باستخدام لوحة الأردوينو وبرمجتها من خلال برنامج Arduino IDE بدقائق وببضعة خطوات بسيطة ولذلك تعد مناسبة جداً للمبتدئين والهواة.
	</li>
	<li>
		<strong>انخفاض التكلفة</strong>: تعتبر لوحات الأردوينو والعناصر والمجموعات التعليمية الخاصة بها غير مكلفة نسبيًا مقارنة مع المتحكمات الأخرى، بالإضافة الى أن البيئة البرمجية الخاصة ببرمجتها مجانية بشكل كامل.
	</li>
	<li>
		<strong>العمل على جميع الأنظمة</strong>: يمكنك تشغيل برنامج Arduino IDE على جميع أنظمة التشغيل مثل نظام ويندوز Windows أو لينكس Linux  أو ماك أو إس Mac OS،
	</li>
	<li>
		<strong>مفتوحة المصدر</strong>: يمكنك الوصول إلى الأكواد المصدرية للأردوينو لمعرفة المزيد عن لغة البرمجة التي تعتمد عليها أو تعديلها والتطوير عليها، وكذلك الأمر بالنسبة لمخططات الدوائر الإلكترونية circuit diagram إذ يمكنك الاستفادة منها أو عمل لوحة أردوينو خاصة بك.
	</li>
	<li>
		<strong>المكتبات</strong>: يوجد العديد من المكتبات الموجودة في البيئة البرمجية Arduino IDE، بالإضافة الى العديد من المكتبات التي طورها أشخاص من جميع أنحاء العالم حيث يمكنك الاستفادة من هذه المكتبات عن طريق استخدام التوابع الموجودة فيها مباشرة، مما يوفر الوقت والجهد اللازمين لإعادة كتابة هذه التوابع من البداية.
	</li>
</ul>

<h2 id="-2">
	أنواع لوحات أردوينو والفروقات بينها
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157791" href="https://academy.hsoub.com/uploads/monthly_2024_09/003_.JPG.53e3e926d9ea0cda930bbc25bc866332.JPG" rel=""><img alt="003_أنواع لوحات الأردوينو.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157791" data-ratio="48.00" data-unique="tgpbjwl2j" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/003_.thumb.JPG.732392dc77941de2eef62217add4fefa.JPG"></a>
</p>

<p>
	تختلف لوحات الأردوينو عن بعضها بعدة عوامل تشمل بشكل أساسي شكل اللوحة وحجمها، وجهد العمل 5v أو 3.3v، وشريحة البرمجة الخاصة بنقل الكود من الحاسوب إلى المتحكم، ونوع المتحكم الرئيسي الذي يؤثر على مواصفات اللوحة مثل سرعة المعالج وعدد أقطاب الرقمية والتشابهية وبروتوكولات التواصل مع الطرفيات والمتحكمات الأخرى، ولتوضيح الفروقات بين لوحات الأردوينو سنصنف أشهر لوحات الأردوينو واستعراض مواصفات كل منها.
</p>

<h3 id="arduinouno">
	لوحة أردوينو أونو Arduino Uno
</h3>

<p>
	أشهر لوحات الأردوينو وأكثرها انتشاراً وتعد الخيار الأفضل لإجراء التجارب والنماذج الأولية للمشاريع وذلك بسبب ثمنها المنخفض وسهولة استخدامها، ومن أهم مواصفاتها:
</p>

<ul>
	<li>
		نوع المتحكم: Atmega328
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 22
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 6
	</li>
	<li>
		عدد الأقطاب التشابهية: 6
	</li>
	<li>
		سرعة المعالج: 16MHz
	</li>
	<li>
		جهد العمل: 5V
	</li>
	<li>
		حجم ذاكرة البرنامج Flash: تأتي بحجم 32KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 2KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 1KB
	</li>
</ul>

<h3 id="arduinonano">
	لوحة أردوينو نانو Arduino Nano
</h3>

<p>
	تشبه لوحة Arduino Uno من حيث المواصفات ولكن بحجم صغير وشكل مناسب للتركيب على لوحة التجارب BreadBoard وتعد أيضًا من الخيارات المفضلة للمطورين بسبب صغر حجمها وسعرها المنخفض، ومن أهم مواصفاتها:
</p>

<ul>
	<li>
		نوع المتحكم: ATmega328
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 22
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 6
	</li>
	<li>
		عدد الأقطاب التشابهية: 8
	</li>
	<li>
		سرعة المعالج: 16MHz
	</li>
	<li>
		جهد العمل: 5V
	</li>
	<li>
		حجم ذاكرة البرنامج Flash: تأتي بحجم 32KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 2KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 1KB
	</li>
</ul>

<h3 id="arduinopromini">
	لوحة أردوينو برو ميني Arduino Pro Mini
</h3>

<p>
	نسخة مصغرة من لوحة Arduino Nano ومشابهة لها في بعض المميزات، ولكن تختلف بعدم وجود شريحة برمجة مدمجة مع اللوحة وتحتاج أداة منفصلة لبرمجتها تسمى USB-TTL وتوصل بها من خلال طرفية الاتصال التسلسلي UART وهي مناسبة للمشاريع التي تكون فيها المساحة محدودة وصغيرة ومن أهم مواصفاتها:
</p>

<ul>
	<li>
		نوع المتحكم: atmega328
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 14
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 6
	</li>
	<li>
		عدد الأقطاب التشابهية: 6
	</li>
	<li>
		سرعة المعالج: 8MHz/16MHz
	</li>
	<li>
		جهد العمل: 3.3V/5V
	</li>
	<li>
		حجم ذاكرة البرنامج flash: تأتي بحجم 32KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 2KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 1KB
	</li>
</ul>

<h3 id="arduinoleonardo">
	لوحة أردوينو ليوناردو Arduino Leonardo
</h3>

<p>
	يختلف عن الأنواع السابقة بنوع المتحكم الموجود فيه ويحوي بروتوكول اتصال USB مدمج والذي يلغي الحاجة إلى وجود شريحة برمجة خاصة ويمكن استخدامه في تطبيقات الأجهزة التي تستخدم كمنفذ HID أو منفذ COM ومن أهم مواصفاته:
</p>

<ul>
	<li>
		نوع المتحكم: ATmega32U4
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 22
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 7
	</li>
	<li>
		عدد الأقطاب التشابهية: 12
	</li>
	<li>
		سرعة المعالج: 16MHz
	</li>
	<li>
		جهد العمل: 5V
	</li>
	<li>
		حجم ذاكرة البرنامج Flash: تأتي بحجم 32KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 2.5KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 1KB
	</li>
</ul>

<h3 id="arduinomicro">
	لوحة أردوينو مايكرو Arduino Micro
</h3>

<p>
	تشبه لوحة Arduino Nano من حيث الشكل والحجم بالضبط ولكن من حيث المميزات والمواصفات فهي مماثلة للوحة Arduino Leonardo فهي تحوي المتحكم نفسه والإمكانيات نفسها ومن أهم مواصفاته:
</p>

<ul>
	<li>
		نوع المتحكم: ATmega32U4
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 20
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 7
	</li>
	<li>
		عدد الأقطاب التشابهية: 12
	</li>
	<li>
		سرعة المعالج: 16MHz
	</li>
	<li>
		جهد العمل: 5V
	</li>
	<li>
		حجم ذاكرة البرنامج flash: تأتي بحجم 32KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 2.5KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 1KB
	</li>
</ul>

<h3 id="arduinomega">
	لوحة أردوينو ميغا Arduino mega
</h3>

<p>
	يعد الأكبر من جميع اللوحات التي تحدثنا عنها ويستخدم في التطبيقات والمشاريع الكبيرة التي تتطلب عدداً كبيراً من الأقطاب وتحتاج حجم ذاكرة أكبر من الأنواع السابقة ومن أهم مواصفاته:
</p>

<ul>
	<li>
		نوع المتحكم: ATMEGA2560
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 54
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 15
	</li>
	<li>
		عدد الأقطاب التشابهية: 16
	</li>
	<li>
		سرعة المعالج: 16MHz
	</li>
	<li>
		جهد العمل: 5V
	</li>
	<li>
		حجم ذاكرة البرنامج Flash: تأتي بحجم 256KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 8KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 4KB
	</li>
</ul>

<h3 id="arduinolilypad">
	لوحة أردوينو ليلي باد Arduino LilyPad
</h3>

<p>
	صُمم هذا النوع من اللوحات بشكل خاص للمشاريع التي يمكن ربطها مع الملابس والأجهزة القابلة للإرتداء إذ يمكن خياطته بشكل مناسب وسهل مع القماش بسبب تصميمه الخاص والثقوب الموجودة فيه والتي تستخدم أيضا كأقطاب ومن أهم مواصفاته:
</p>

<ul>
	<li>
		نوع المتحكم: Atmega328/Atmega168
	</li>
	<li>
		عدد أقطاب الدخل والخرج: 14
	</li>
	<li>
		عدد أقطاب إشارة PWM: تحتوي 6
	</li>
	<li>
		عدد الأقطاب التشابهية: 6
	</li>
	<li>
		سرعة المعالج: 8MHz
	</li>
	<li>
		جهد العمل: 2.7V-5.5V
	</li>
	<li>
		حجم ذاكرة البرنامج Flash: تأتي بحجم 16KB
	</li>
	<li>
		حجم ذاكرة البيانات SRAM: تأتي بحجم 1KB
	</li>
	<li>
		حجم ذاكرة القراءة القابلة للبرمجة EEPROM: تأتي بحجم 512B
	</li>
</ul>

<h2 id="-3">
	كيف تختار اللوحة المناسبة لك
</h2>

<p>
	تعتبر اللوحات السابقة من أشهر أنواع لوحات الأردوينو والأكثر انتشاراً واستخداماً. والآن بعد أن استعرضنا هذه الأنواع ومواصفاتها قد يأتي سؤال لذهنك: كيف أختار اللوحة المناسبة من بين كل هذه الأنواع العديدة؟ يعتمد اختيارك لنوع لوحة الأردوينو المناسبة على هدفك الرئيسي منها، فإذا كنت تبحث عن لوحة للتعلم فيجب أن تختار لوحة سهلة الاستخدام ومناسبة لعمل التجارب الإلكترونية وشائعة الاستخدام؛ لسهولة البحث عن المشاكل وإيجاد الحلول التقنية مثل لوحة أردوينو أونو التي سوف نعتمد عليها في هذه السلسلة التعليمية.
</p>

<p>
	أما إذا كنت تريد اختيار اللوحة المناسبة من أجل عمل مشروع إلكتروني فهناك عدة عوامل مثل: الميزانية المخصصة للمشروع، وعدد الأقطاب التي تحتاجها، وحجم الكود البرمجي، واستهلاك الذواكر، ودعم المكتبات البرمجية للوحة في حال استخدمت مكتبات في مشروعك، وكما يعد الحجم والشكل من العوامل المهمة في اختيار اللوحة المناسبة وضمان نجاح مشروعك والقدرة على تطويره بسلاسة.
</p>

<h2 id="arduinoraspberrypi">
	الفرق بين أردوينو Arduino وراسبيري باي Raspberry Pi
</h2>

<p>
	إذا كنت قد بدأت حديثًا في عالم برمجة المتحكمات والأنظمة الرقمية، فقد تتساءل ما الاختلاف بين لوحة أردوينو Arduino ولوحة راسبيري باي Raspberry Pi، في الواقع كلاهما لوحتان رائعتان لإنجاز مشاريع إلكترونية مبتكرة وإبداعية، ولكن هناك بعض الاختلافات بينهما، دعنا نتعرف عليها.
</p>

<ul>
	<li>
		<strong><a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino%D8%9F-r1800/" rel="">أردوينو Arduino</a></strong>: كما وضحنا سابقًا هي لوحة مبنية بالاعتماد على متحكمات مصغرة microcontrollers، والمتحكم هو حاسوب صغير مناسب لتشغيل برنامج واحد في كل مرة، وهو ملائم للمهام البسيطة مثل قياس درجة الحرارة أو تشغيل مجموعة من الليدات LED.
	</li>
	<li>
		<strong><a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">راسبيري باي Raspberry Pi</a></strong>: هي عبارة عن حاسوب مبني بالاعتماد على معالج مصغر microprocessor يمكنه تشغيل عدة برامج معقدة في الوقت نفسه مثل أنظمة التشغيل.
	</li>
</ul>

<p>
	وقد تتساءل ماذا أختار بينهما؟ والجواب هو أن الخيار المناسب لك على نوع المشاريع التي تريد القيام بها فلوحة أردوينو مناسبة للمشاريع الإلكترونية الصغيرة والتعامل مع بيانات صغيرة نسبياً، أما لوحة راسبيري باي فمثالية للاستخدام مع المشاريع الكبيرة وتنفيذ عمليات الحوسبة المعقدة.
</p>

<h2 id="arduinouno-1">
	المكونات الأساسية للوحة أردوينو أونو Arduino Uno
</h2>

<p>
	بعد اختيار لوحة أردوينو أونو لشرح <a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88/" rel="">هذه السلسلة</a>، سنتعرف في هذا الجزء أكثر على أجزاء هذه اللوحة ومكوناتها حتى نستطيع التعامل معها بسهولة ونتجنب حدوث أخطاء ومشكلات أثناء عمل المشاريع.
</p>

<h3 id="usbprogrammingport">
	منفذ البرمجة USB Programming Port
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157792" href="https://academy.hsoub.com/uploads/monthly_2024_09/004_.JPG.73c0ec39a9584a8511a4f289a1ea7303.JPG" rel=""><img alt="004_منفذ البرمجة.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157792" data-ratio="55.80" data-unique="44jk1lm8y" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/004_.thumb.JPG.4acb3dde5b9d17977db36feaf4dafbb6.JPG"></a>
</p>

<p>
	نستطيع من خلال هذا المنفذ وصل لوحة أردوينو مع حاسوبك لنقل البيانات ورفع الكود البرمجي على اللوحة من خلال كابل البرمجة USB Cable، حيث يمكنك  وصلها مع الحاسوب من خلال كابل من نوع USB A - USB B كما يمكنك تغذية لوحة أردوينو بالطاقة من خلال هذا المنفذ، وللعلم يمكن توصيل اللوحة مع أي مصدر تغذية من نوع DC وبجهد 5v (مثل شاحن الموبايل أو وحدة التغذية Power Bank) لأنه الجهد المناسب لعمل هذه اللوحة.
</p>

<h3 id="powerconactor">
	مأخذ التغذية Power Connector
</h3>

<p style="text-align: center;">
	<img alt="005_مأخذ التغذية.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157793" data-ratio="62.80" data-unique="ev990hr8m" style="width: 500px; height: auto;" width="833" src="https://academy.hsoub.com/uploads/monthly_2024_09/005_.JPG.9bc6970e8634efa4d3e3193d0f191cfe.JPG">
</p>

<p>
	يستخدم هذا المأخذ لتغذية لوحة أردوينو أونو بالطاقة الكهربائية بجهد يتراوح بين 7V و 12V، وعادة ما تُستخدم بطارية 9V أو مكيّف Adapter من 220V تيار متردد AC إلى 12V أو 9V تيار مستمر DC.
</p>

<h3 id="voltageregulator">
	منظم الجهد Voltage Regulator
</h3>

<p style="text-align: center;">
	<img alt="006_منظم الجهد.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157794" data-ratio="62.20" data-unique="hnu5b8any" style="width: 500px; height: auto;" width="837" src="https://academy.hsoub.com/uploads/monthly_2024_09/006_.JPG.854e1aa798595eeb4fe0aff4bbfd4da3.JPG">
</p>

<p>
	تتمثل وظيفة منظم الجهد في التحكم بالجهد المزود إلى لوحة أردوينو من خلال تنظيمه وتثبيت قيمته كي يتناسب مع الجهد المطلوب للوحة والعناصر الإلكترونية الأخرى المتصلة بها.
</p>

<h3 id="crystaloscillator">
	الهزازة الكريستالية Crystal Oscillator
</h3>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157795" href="https://academy.hsoub.com/uploads/monthly_2024_09/007_.JPG.8332747357d3a643daa621aae3b57acb.JPG" rel=""><img alt="007_الهزازة الكريستالية.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157795" data-ratio="59.60" data-unique="b2ek3o76z" style="width: 500px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/007_.thumb.JPG.2b9104e706d16b7eaa7674cd4a6e0872.JPG"></a>
</p>

<p>
	الهزازة الكريستالية هي عنصر إلكتروني أساسي في لوحة أردوينو، حيث تستخدم لتوليد نبضات كهربائية بتردد محدد بدقة، هذه النبضات ضرورية لمعرفة كيفية حساب الوقت أثناء قيام اللوحة بتنفيذ التعليمات البرمجية وضمان تنفيذها بدقة.
</p>

<h3 id="reset">
	زر إعادة التشغيل Reset
</h3>

<p style="text-align: center;">
	<img alt="008_قطب إعادة التشغيل.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157796" data-ratio="68.60" data-unique="y6m49umcc" style="width: 500px; height: auto;" width="817" src="https://academy.hsoub.com/uploads/monthly_2024_09/008_.JPG.97eaf45e63666e21523dc49c95d93a66.JPG">
</p>

<p>
	يستخدم هذا الزر لمقاطعة عمل المتحكم وإعادة تشغيله من البداية، ويتم ذلك من خلال طريقتين: إما بالضغط مباشرة على الزر الموجود في اللوحة، أو من خلال سلك بين قطب Reset وقطب الأرضي GND كما هو موضح بالصورة أعلاه.
</p>

<h3 id="powerpins">
	أقطاب الطاقة Power Pins
</h3>

<p style="text-align: center;">
	<img alt="009_أقطاب الطاقة.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157797" data-ratio="63.00" data-unique="7x0131ij6" style="width: 500px; height: auto;" width="856" src="https://academy.hsoub.com/uploads/monthly_2024_09/009_.JPG.b4d0c5c534841dfa631655d4a6664470.JPG">
</p>

<p>
	تستخدم هذه الأقطاب لتغذية العناصر والوحدات الإضافية التي ستوصل مع لوحة الأردوينو مثلا الحساسات Sensors والليدات LEDs ووحدات العرض Display وغيرها من العناصر الأخرى وهي كالتالي:
</p>

<ul>
	<li>
		3.3v قطب تغذية للعناصر بقيمة 3.3v.
	</li>
	<li>
		5v قطب تغذية للعناصر بقيمة 5v.
	</li>
	<li>
		GND الأرضي ويعتبر القطب السالب ويستخدم لإكمال مسار الدارة الإلكترونية.
	</li>
	<li>
		Vin قطب دخل يمكن من خلاله تغذية الأردوينو من مصدر خارجي.
	</li>
</ul>

<h3 id="analogpins">
	الأقطاب التشابهية Analog Pins
</h3>

<p style="text-align: center;">
	<img alt="010_الأقطاب التشابهية.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157798" data-ratio="66.20" data-unique="lf27eadm5" style="width: 500px; height: auto;" width="812" src="https://academy.hsoub.com/uploads/monthly_2024_09/010_.JPG.6ba054864e397179fc2367fdb7bf9573.JPG">
</p>

<p>
	تحتوي لوحة أردوينو أونو على ستة أقطاب تشابهية مرقمة من A0 إلى A5 حيث أن حرف A هنا هو اختصار لكلمة Analog والني تعني تشابهي أو تماثلي، تقرأ هذه الأقطاب الإشارات التشابهية من الحساسات المختلفة مثل حساس الحرارة وحساس الرطوبة وتحولها إلى قراءة رقمية يمكن أن تُقرأ بدورها عن طريق المعالج المصغر microprocessor.
</p>

<h3 id="microcontroller-1">
	المتحكم المصغر Microcontroller
</h3>

<p style="text-align: center;">
	<img alt="011_المتحكم الرئيسي.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157799" data-ratio="69.80" data-unique="oce26wj37" style="width: 500px; height: auto;" width="777" src="https://academy.hsoub.com/uploads/monthly_2024_09/011_.JPG.1497df855edf8690e74d6f37b3492411.JPG">
</p>

<p>
	يعد المتحكم المصغر المتحكم الرئيسي للوحة، فهو بمثابة عقل الدارة ويتكون من شريحة إلكترونية صغيرة تحتوي على وحدة المعالجة المركزية <a href="https://academy.hsoub.com/apps/operating-systems/%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-r879/" rel="">CPU</a>، وذاكرة، ومجموعة من الدوائر الكهربائية المخصصة لإدخال البيانات ومعالجتها وإخراجها، وتحتوي كل لوحة أردوينو متحكمًا خاصًا بها يختلف من نوع لوحة إلى آخر.
</p>

<h3 id="-4">
	ليد مؤشر التشغيل
</h3>

<p style="text-align: center;">
	<img alt="012_ليد مؤشر التشغيل.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157800" data-ratio="69.00" data-unique="ritg9re16" style="width: 500px; height: auto;" width="798" src="https://academy.hsoub.com/uploads/monthly_2024_09/012_.JPG.bcd00b7bc09ecd2613d612fa190bfa43.JPG">
</p>

<p>
	وظيفة هذا الليد هي مراقبة حالة تشغيل اللوحة، ففي حالة تغذية اللوحة بمصدر طاقة كهربائية سيعمل الليد مباشرة ويضيء باللون الأخضر بشكل مستمر، وفي حالة عدم تغذية اللوحة لن يعمل.
</p>

<h3 id="uart">
	ليدات بروتوكول الاتصال UART
</h3>

<p style="text-align: center;">
	<img alt="013_ليدات بروتوكل الاتصال.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157801" data-ratio="67.60" data-unique="7nu39nezr" style="width: 500px; height: auto;" width="788" src="https://academy.hsoub.com/uploads/monthly_2024_09/013_.JPG.6815bd850d52fb7f0f1c50f5b628c1a4.JPG">
</p>

<p>
	تفيد في مراقبة حالة نقل البيانات، إذ تجد في لوحة الأردوينو هذه الكتابة "TX" و"RX" في مكانين مختلفين: الأول في الأقطاب 0 و1 المسؤولة عن الاتصال التسلسلي لإرسال واستقبال البيانات، والثاني في ليدات تحديد حالة إرسال البيانات واستقبالها، ففي حالة إرسال الأردوينو للبيانات سيضيء الليد الخاص بـ TX، وفي حالة استقبال البيانات يضيء الليد الخاص بـ RX.
</p>

<h3 id="digitalpins">
	الأقطاب الرقمية Digital Pins
</h3>

<p style="text-align: center;">
	<img alt="014_الأقطاب الرقمية.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157802" data-ratio="74.20" data-unique="z6p10u073" style="width: 500px; height: auto;" width="758" src="https://academy.hsoub.com/uploads/monthly_2024_09/014_.JPG.b9168e52924ad65d43301a476b678118.JPG">
</p>

<p>
	تحتوي لوحة أردوينو أونو على 14 قطب رقمي يمكنك استخدامها كمداخل لتلقي البيانات أو مخارج لإرسال البيانات بشكل رقمي، حيث تعطي خرجين محددين إما 0 منطقي (يعادل 0 فولت)، وإما 1 منطقي (يعادل 5 فولت) كما يمكن استخدام الأقطاب التشابهية كأقطاب رقمية.
</p>

<h3 id="aref">
	قطب الجهد المرجعي AREF
</h3>

<p style="text-align: center;">
	<img alt="015_قطب الجهد المرجعي.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157803" data-ratio="69.00" data-unique="ukq2y8jb1" style="width: 500px; height: auto;" width="780" src="https://academy.hsoub.com/uploads/monthly_2024_09/015_.JPG.a4cf933568a9808518195b75a1860168.JPG">
</p>

<p>
	هو قطب لتحديد قيمة الجهد المرجعي المستخدم كمعيار أو موجه أجل تحويل الإشارة التشابهية Analog إلى رقمية Digital، ويكون ضمن مجال تغذية اللوحة ففي حال لوحتنا ستكون قيمة المجال من 0 إلى 5 فولت.
</p>

<h2>
	لغة برمجة الأردوينو Arduino
</h2>

<p>
	تعتمد لغة برمجة الأردوينو بشكل أساسي على لغتي <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-c-%D9%88%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D8%B9%D9%84%D9%85%D9%87%D8%A7-r2268/" rel="">C</a> و <a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/" rel="">++C</a>، إضافة إلى احتوائها على مجموعة كبيرة من المكتبات والدوال المبنية مسبقًا، ما يجعلها سهلة الاستخدام للمبتدئين وغير المبرمجين. تُبرمج المتحكمات الموجودة في لوحات الأردوينو باستخدام هذه اللغة للتفاعل مع الحساسات والمحركات والأجهزة والعناصر الأخرى المتصلة باللوحة. وتُستخدم بشكل واسع في مشاريع الروبوتات والأنظمة الذكية و<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1514/" rel="">إنترنت الأشياء</a>. يمكنك التعرف بشكل أكبر على بنية لغة برمجة الأردوينو والدوال والتعليمات البرمجية المتوفرة فيها من خلال المرجع الرسمي على موقع الأردوينو <a href="https://www.arduino.cc/reference/en/" rel="external nofollow">Arduino Reference</a>.
</p>

<h2 id="software">
	تجهيز بيئة العمل البرمجية
</h2>

<p>
	بعد أن تعرفنا على الأردوينو وما هي أنواع لوحات الأردوينو والأجزاء الرئيسية من لوحة أردوينو أونو Arduino UNO التي سوف نستخدمها في هذه السلسلة كما ذكرنا، علينا الآن تعلم كيفية إعداد بيئة العمل البرمجية.
</p>

<p>
	ففي هذا القسم، سنتعلم بخطوات سهلة، كيفية تثبيت البيئة البرمجية Arduino IDE على جهاز الحاسوب، وتجهيز اللوحة لاستقبال الكود البرمجي عبر كابل USB.
</p>

<h3 id="arduinoide18">
	تثبيت برنامج Arduino IDE 1.8
</h3>

<p>
	عملية تثبيت بسيطة جداً، كل ما عليك هو الذهاب إلى <a href="https://www.arduino.cc/en/software/" rel="external nofollow">صفحة التحميل الخاصة بأردوينو</a> لتظهر لك إصدارات مختلفة من برنامج Arduino IDE، حدد نسخة متوافقة مع <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">نوع نظام التشغيل</a> الخاص بك (Windows أو Mac-OS أو Linux) وبعد اكتمال تنزيل الملف فك ضغطه في المكان الذي تريده، وثبّت البرنامج مثل أي برنامج عادي والصور التالية توضح عملية التثبيت على نظام التشغيل ويندوز.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157752" href="https://academy.hsoub.com/uploads/monthly_2024_09/016_.JPG.44a5a9ca8a47f84741c231677e2dc678.JPG" rel=""><img alt="016 خطوات تثبيت البرنامج" class="ipsImage ipsImage_thumbnailed" data-fileid="157752" data-unique="4p1dyngvm" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_09/016_.thumb.JPG.d30097738faaa058122bc61156b50b02.JPG"> </a>
</p>

<p>
	بعد الانتهاء من التثبيتب ابحث في شريط البحث -الموجود بجانب قائمة ابدأ  أسفل الشاشة- عن Arduino للعثور على البرنامج وتشغيله، كما ستجد أيقونة البرنامج على سطح المكتب لفتحه بسهولة، بعد فتح البرنامج ستظهر لك الواجهة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157804" href="https://academy.hsoub.com/uploads/monthly_2024_09/017_.JPG.741ee5328e4964909d9288abc082b276.JPG" rel=""><img alt="017_شرح واجهة الرنامج.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157804" data-ratio="58.57" data-unique="5zlwcptgg" style="width: 700px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/017_.thumb.JPG.faa3e64ad612dd71230cf4ac5c203719.JPG"></a>
</p>

<ul>
	<li>
		المكان <strong>A</strong> يستخدم لتصليح الكود وفحصه من وجود الأخطاء.
	</li>
	<li>
		المكان <strong>B</strong> يستخدم لرفع الكود على لوحة الأردوينو.
	</li>
	<li>
		المكان<strong> C</strong> يستخدم لإنشاء مشروع جديد فارغ.
	</li>
	<li>
		المكان <strong>D</strong> يستخدم لفتح ملف محفوظ أو مثال جاهز.
	</li>
	<li>
		المكان <strong>E</strong> يستخدم لحفظ الملف.
	</li>
	<li>
		المكان <strong>F</strong> يستخدم لفتح نافذة العرض التسلسلي Serial Monitor.
	</li>
	<li>
		تمثل المنطقة رقم <strong>1</strong> المكان المخصص لكتابة الكود البرمجي والأوامر والتعليمات البرمجية.
	</li>
	<li>
		تمثل المنطقة رقم <strong>2</strong> المكان الذي يعرض معلومات عن استهلاك الذاكرة ورسائل الأخطاء.
	</li>
</ul>

<h2 id="-6">
	ربط لوحة أردوينو مع البرنامج
</h2>

<p>
	في البداية عليك توصيل لوحتك مع الحاسوب من خلال كابل USB ثم فتح البرنامج Arduino IDE وبمجرد تشغيل البرنامج، سيكون أمامك خياران:
</p>

<ol>
	<li>
		إنشاء مشروع جديد فارغ من خلال الضغط على قائمة File في الأعلى، ثم New.
	</li>
	<li>
		فتح مثال جاهز من الأمثلة من خلال الضغط على قائمة File في الأعلى ثم الخيار Example ثم اختيار المثال الذي تريده.
	</li>
</ol>

<p>
	حاليًا سنستخدم المثال Blink الموجود في قسم Basics وهو عبارة عن مشروع بسيط يضيء ليد مدة زمنية معينة ويطفئه مدة زمنية معينة مع تكرار العملية بشكل مستمر.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157805" href="https://academy.hsoub.com/uploads/monthly_2024_09/018_.JPG.a5729b8951ee9e74bdbda77f2167a636.JPG" rel=""><img alt="018_فتح مثال في الأردوينو.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157805" data-ratio="50.67" data-unique="4qq6mvt51" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/018_.thumb.JPG.f338cf1d423a36368beec33b6cbf3b4b.JPG"></a>
</p>

<p>
	نحتاج الآن لتحديد نوع لوحة الأردوينو المستخدمة لتنفيذ المثال ورقم المنفذ الموصول عليه في الحاسوب:
</p>

<ol>
	<li>
		لتحديد نوع اللوحة من خلال الذهاب إلى قائمة Tools ومن ثم الخيار Board واختيار Arduino Uno.
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157806" href="https://academy.hsoub.com/uploads/monthly_2024_09/019_.JPG.3a65c33d986c476f0489efe96ad057d6.JPG" rel=""><img alt="019_تحديد نوع اللوحة.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157806" data-ratio="56.67" data-unique="6mmr8gwuv" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/019_.thumb.JPG.a403a7fd0be5f2251e3e8ae88337d494.JPG"></a>
</p>

<ol start="2">
	<li>
		لتحديد رقم المنفذ من خلال الذهاب إلى قائمة Tools ومن ثَم الخيار Port واختيار المنفذ الخاص به (يمكنك معرفة رقم المنفذ الخاص بالأردوينو من خلال إزالة توصيله مع الحاسوب فستلاحظ أن هناك خيار اختفى فيكون هو المنفذ الصحيح).
	</li>
</ol>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="JPG" data-fileid="157807" href="https://academy.hsoub.com/uploads/monthly_2024_09/020_.JPG.3cc963e3574c42bba035c2acc9f556c7.JPG" rel=""><img alt="020_تحديد رقم المنفذ.JPG" class="ipsImage ipsImage_thumbnailed" data-fileid="157807" data-ratio="54.50" data-unique="8tbp9mf04" style="width: 600px; height: auto;" width="900" src="https://academy.hsoub.com/uploads/monthly_2024_09/020_.thumb.JPG.d94e72a0134b59be178981d59a2690af.JPG"></a>
</p>

<p>
	أخيراً يمكنك الضغط على اختصار رفع الكود في البرنامج، إذا نفذت الخطوات السابقة بشكل صحيح، انتظر بضع ثوان، وسترى مصابيح RX وTX تومض على اللوحة. في حالة نجاح التحميل، ستظهر رسالة "تم التحميل" أو "Done Uploading" في شريط الحالة وبعدها يبدأ الليد الموصول على القطب 13 في اللوحة بالوميض لفترة زمنية. وهكذا تكون قد تكون نفذت أول مشروع لك على الأردوينو بخطوات سهلة وبسيطة.
</p>

<h2 id="-7">
	الخلاصة
</h2>

<p>
	تعرفنا في هذا المقال على العديد من المفاهيم المهمة في عالم الأردوينو والمتحكمات، واخترنا اللوحة المناسبة لتعلم التعامل مع لوحات أردوينو وهي لوحة Arduino Uno، واستعرضنا أهم مكونات وأجزاء هذه اللوحة وجهزنا بيئة العمل البرمجية، وتعرفنا على طريقة رفع الكود البرمجي إلى لوحة الأردوينو الخاصة بنا وطريقة تنفيذه، سوف نستكمل رحلتنا في المقال القادم وننفذ أول مشروع عملي يتحكم بتشغيل وإطفاء ليد ونشرح خطوات بناءه بالتفصيل.
</p>

<h2 id="-8">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8A%D8%A7%D8%B1-%D9%88%D8%A7%D9%84%D8%AC%D9%87%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D9%83%D9%86%D8%A9-r2294//" rel="">أساسيات في عالم الإلكترونيات: التيار والجهد والعناصر الساكنة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%81%D8%B6%D9%84-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA%D8%A7%D8%AA-r2285/" rel="">أفضل لغات برمجة الروبوتات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D8%AC%D9%87%D8%A7%D8%B2-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi-r1356/" rel="">تعرف على جهاز راسبيري باي Raspberry Pi</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%d8%aa%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%b0%d9%83%d8%a7%d8%a1-%d8%a7%d9%84%d8%a7%d8%b5%d8%b7%d9%86%d8%a7%d8%b9%d9%8a/" rel="">تعلم الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2412</guid><pubDate>Thu, 05 Sep 2024 15:00:00 +0000</pubDate></item><item><title>&#x645;&#x62F;&#x62E;&#x644; &#x625;&#x644;&#x649; &#x627;&#x644;&#x62F;&#x648;&#x627;&#x626;&#x631; &#x627;&#x644;&#x645;&#x62A;&#x643;&#x627;&#x645;&#x644;&#x629; Integrated Circuits &#x648;&#x627;&#x644;&#x645;&#x62A;&#x62D;&#x643;&#x645;&#x627;&#x62A; &#x627;&#x644;&#x635;&#x63A;&#x631;&#x64A;&#x629; Micro-processor</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D8%A6%D8%B1-%D8%A7%D9%84%D9%85%D8%AA%D9%83%D8%A7%D9%85%D9%84%D8%A9-integrated-circuits-%D9%88%D8%A7%D9%84%D9%85%D8%AA%D8%AD%D9%83%D9%85%D8%A7%D8%AA-%D8%A7%D9%84%D8%B5%D8%BA%D8%B1%D9%8A%D8%A9-micro-processor-r2307/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/1307638790_.png.f097fcb57a9a14b57e589d00aeffd5f9.png" /></p>
<p>
	تحدثنا في <a href="https://academy.hsoub.com/tags/%D8%A7%D9%84%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA%20%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">المقالات السابقة</a> عن اﻷسس والمفاهيم التي يجب استيعابها لتكوين الدوائر اﻹلكترونية والتعامل معها وإجراء بعض القياسات الكهربائية فيها. كما تعرّفنا على عناصر إلكترونية سميناها فعّالة لأنها تزوّد الدوائر بالطاقة أو تستهلك الطاقة لأداء عملها مثل البطاريات والترانزيستورات وأخرى سميناها ساكنة لأنها تبدد الطاقة أو تمررها فقط. ورأينا أن تنفيذ أية دائرة إلكترونية لها وظيفة محددة يمر بمرحلتين أساسيتين:
</p>

<ul>
	<li>
		<strong>اﻷولى</strong>: فهم الوظيفة المطلوبة وتصوّر طريقة تنفيذها.
	</li>
	<li>
		<strong>الثانية</strong>: اختيار العناصر اﻹلكترونية المناسبة وربطها بالطريقة الصحيحة ﻹنجاز الوظيفة.
	</li>
</ul>

<p>
	وقد يخطر لك السؤال التالي: "ماذا لو أردت أن أكرر هذه الوظيفة في عدة أماكن مختلفة من الدائرة؟" كأن احتاج عدة مؤقتات زمنية لمراقبة أشياء مختلفة، هل سأكرر الدائرة الكهربائية نفسها مرات عدة ثم أضيفها إلى الدائرة اﻷساسية أم ماذا؟
</p>

<p>
	الجواب على هذا السؤال هو نعم وليس بالضرورة! نعم أي لا بد في الدائرة اﻹلكترونية من تكرار العناصر التي تؤدي وظيفة ما إن أردت استنساخ هذه الوظيفة أكثر من مرة، وليس بالضرورة لوجود شيء أبسط يحوّل هذه العناصر جميعها إلى عنصر واحد ضمن إطار فيزيائي واحد ندعوه دائرة متكاملة Integrated circuit.
</p>

<h2 id="">
	ما تحتاجه لإكمال التمارين العملية في هذا المقال
</h2>

<p>
	إليك قائمة بالعناصر الإلكترونية والتجهيزات اللازمة لإكمال التطبيقات العملية:
</p>

<ul>
	<li>
		بطارية جهدها 5 فولط.
	</li>
	<li>
		مقاومات قيمها 1.2، 2.2، 10، 22 كيلو أوم.
	</li>
	<li>
		الدائرة المتكاملة NE555 (واحدة تكفي).
	</li>
	<li>
		الدائرة المتكاملة المنظمة للجهد 7805 (واحدة تكفي).
	</li>
	<li>
		المتحكم الصغري PIC16F84A (اختياري لمجرّد التعرف على شكله وتوزع أرجله وقراءة أرقامها).
	</li>
	<li>
		مؤشرات ضوئية (ليد) تعمل عند جهد 5 فولط أو أقل (ثلاثة تكفي).
	</li>
	<li>
		مكثفات سعتها 47 ميكرو فاراد وأخرى 1 ميكرو فاراد جهدها 16 فولط.
	</li>
	<li>
		مكثفات عدسية 20 نانو فاراد (اختيارية إن أردت توصيل دائرة المتحكم الصغري).
	</li>
	<li>
		هزاز كريستالي تردده 2 ميجا هرتز (اختياري لتوصيل دائرة المعالج الصغري).
	</li>
	<li>
		ديودات من طراز 1N4007 (يكفي اثنان).
	</li>
	<li>
		ترانزستورات قطبية من الطراز 2N2222.
	</li>
	<li>
		لوحة اختبار مثقبة (إن أردت فاﻷمر اختياري).
	</li>
	<li>
		مقياس كهربائي متعدد الوظائف AV multi-meter.
	</li>
</ul>

<h2 id="-1">
	الدائرة المتكاملة
</h2>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		نحتاج في التطبيقين العمليين لهذا القسم: مصدر تغذية 6 -8 فولط، الدائرة المتكاملة 7805، الدائرة المتكاملة 555، مقاومات 10 كيلو أوم، مقاومات 2.2 كيلو أوم، مقاومات 20 كيلو أوم، مكثفة 47 ميكروفاراد، مكثفة 1 ميكروفاراد، مؤشرات ضوئية، ترانزيستور قطبي 2N2222، ديود 1N4007، مقياس متعدد الوظائف.
	</p>
</blockquote>

<p>
	الدائرة المتكاملة Integrated circuits هي دائرة إلكترونية مخصصة ﻷداء وظيفة واحدة أو عدة وظائف، وتتكون ضمنًا من مجموعة من العناصر اﻷساسية مثل الترانزستورات والمكثفات والمقاومات التي تقوم بالعمل المطلوب. توضع هذه العناصر ضمن غلاف مغلق لا يظهر منه إلى العالم الخارج سوى أرجل معدنية تربط الدائرة المتكاملة بالعالم الخارجي. وقد يخطر في بالنا السؤال التالي: إن كانت الدائرة المتكاملة مكوّنة من نفس العناصر الأساسية التي نستخدمها فما فائدتها إذًا؟ إليك الجواب:
</p>

<ul>
	<li>
		<strong>حجم أصغر بكثير</strong>: تخيل أن الدائرة ستتكون من 12 ترانزيستور و10 مقاومات و3 مكثفات، ما الحجم الذي تشغله هذه العناصر مهما كان تصنيعها جيدًا وطريقة توصيلها احترافية؟ بالتأكيد ستشغل حجمًا لا بأس به. لكن إن صُنّعت ضمن دائرة متكاملة فقد لا تتجاوز أبعادها عدة ملليمترات في كل اتجاه.
	</li>
	<li>
		<strong>موثوقية أكبر بكثير</strong>: لربما قد لا حظت عند محاولتك تجريب التمارين التطبيقية التي طرحناها في المقالين السابقين صعوبة التوصيلات في بعض اﻷحيان أو هفوات صغيرة تُفقدك أعصابك قبل معرفة المشكلة، فما بالك بالدوائر التي يجب أن تؤدي وظيفتها بكل دقة؟ تضمن طريقة التصنيع المتبعة في الدوائر المتكاملة توصيلات غاية في الدقة وترتيبًا مثاليًا للعناصر إضافة إلى اﻷحجام الصغيرة جدًا لهذه العناصر.
	</li>
	<li>
		<strong>التعامل مع أرجل الدائرة دون الحاجة لأية تفاصيل تصميمية</strong>: لا حاجة لأن تعرف العناصر التي تتكون منها الدائرة اﻹلكترونية وكيف رُتبت، فما تتعامل معه فقط هي اﻷرجل التي يحدد صانعو الدائرة وظيفة كل منها وكيفية وصلها.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148503" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_ic_chip.png.0b5c6680e62c4345f7f25b86fb45fc76.png" rel=""><img alt="01 ic chip" class="ipsImage ipsImage_thumbnailed" data-fileid="148503" data-unique="6j1vbjlzu" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_ic_chip.png.0b5c6680e62c4345f7f25b86fb45fc76.png"> </a>
</p>

<p>
	ولا تخلو فكرة الدوائر المتكاملة من عيوب تتعلق بعدم القدرة على تصنيع دوائر متكاملة تتعامل مع استطاعات كهربائية كبيرة، وقدرتها المحدودة على التخلص من الحرارة الناتجة عن تشغيلها لصغر حجمها، و حساسيتها العالية للضجيج -وهي إشارات غير مرغوبة تصل إليها عن طريق التغذية أو اﻷجهزة المحيطة-.
</p>

<h3 id="-2">
	أنواع الدوائر اﻹلكترونية المتكاملة
</h3>

<p>
	للدوائر اﻹلكترونية أنواع مختلف وتصنف عادة ضمن ثلاثة فئات واسعة:
</p>

<ol>
	<li>
		<strong>دوائر متكاملة تماثلية</strong>: وتتعامل مع قيم تماثلية تطبيق على أرجل الدخل وتعطي قيمًا تماثلية على أرجل الخرج نذكر منها دوائر منظمات الجهد الكهربائي ودارات قياس درجات الحرارة.
	</li>
	<li>
		<strong>دوائر متكاملة رقمية</strong>: وتتعامل مع قيم رقمية في دخلها وخرجها، نذكر منها المعالجات المصغّرة Microprocessor في الحواسب. تُبنى هذه الدوائر باستخدام ترانزستورات قطبية فتعرف عندها بعائلة TTL وباستخدام ترانزستورات حقلية MOSFET فتعرف باسم CMOS.
	</li>
	<li>
		<strong>دوائر رقمية تشابهية</strong>: تتعامل مع قيم رقمية في مداخلها وتعطي قيمًا تماثلية على المخارج أو العكس أو كلاهما (تتعامل مع الرقمي والتماثلي في الدخل والخرج)، نذكر منها الدوائر التي تحول درجات الحرارة مثلًا إلى أرقام وكذلك دوائر المتحكمات الصغرية micro-controller التي سنتحدث عنها في الفقرات القادمة.
	</li>
</ol>

<h3 id="-3">
	تغليف الدوائر المتكاملة
</h3>

<p>
	عندما تُصنع الدوائر المتكاملة تظهر أرجلها إلى العالم الخارجي من حواف غلاف بلاستيكي أسود اللون عادة، وتُكتب عليه معلومات عن الشركة الصانعة وتاريخ الصنع ورقم الدائرة المميز ولواحق تتعلق بطريقة التغليف ومجالات العمل وغيرها وتختلف طريقة الترميز من شركة لأخرى لكن رقم الدائرة يبقى كما هو.
</p>

<h4 id="-4">
	أشكال أغلفة الدوائر المتكاملة
</h4>

<p>
	تكون الأغلفة مستطيلة أو مربعة، وتخرج منها اﻷرجل وفق ترتيب محدد وتباعد محدد، وتصنف إلى:
</p>

<ul>
	<li>
		<strong>أغلفة من النوع DIP</strong>: وتكون مستطيلة تخرج اﻷرجل الطرفين بشكل متناظر.
	</li>
	<li>
		<strong>أغلفة من النوع SOP</strong>: وتكون مستطيلة أو مربعة، تخرج اﻷرجل من طرفيها وتكون صغيرة على شكل حرف L ومتقاربة من بعضها.
	</li>
	<li>
		<strong>أغلفة من النوع QFT</strong>: وتكون مربعة وصغيرة الحجم ومسطحة، تخرج اﻷرجل على شكل حرف L من جميع أطرافها.
	</li>
	<li>
		<strong>أغلفة من النوع BGA</strong>: وتكون مربعة الشكل وليس لها أرجل، بل يكون الخرج والدخل على شكل نقاط نافرة أسفل الدائرة وموزعة على صفوف في كل اﻷطراف.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148504" href="https://academy.hsoub.com/uploads/monthly_2024_04/02_ic_packaging.png.0e9cffe7f5293f0ac9ae63d15c57aa5c.png" rel=""><img alt="02 ic packaging" class="ipsImage ipsImage_thumbnailed" data-fileid="148504" data-unique="7mxvqzs3j" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/02_ic_packaging.png.0e9cffe7f5293f0ac9ae63d15c57aa5c.png"> </a>
</p>

<h4 id="-5">
	ترقيم أرجل الدوائر المتكاملة
</h4>

<p>
	لكل رجل من أرجل الدائرة المتكاملة عمل محدد كأرجل تغذية وأرجل تأريض وأرجل دخل وخرج. ولكل رجل أيضًا رقم محدد، ويبدأ الترقيم بالرقم 1 وهي الرجل التي يقع إلى يسار حفرة الدائرية موجودة على سطح الغلاف يليه للأسفل الرقم 2 ثم تتزايد أرقام اﻷرجل بعكس جهة دوران عقارب الساعة.
</p>

<h4 id="7805">
	تطبيق عملي: تنظيم الجهد باستخدام الدائرة المتكاملة 7805
</h4>

<p>
	نحتاج في كثير من التطبيقات إلى مصدر جهد ثابت لا يتغيّر ودون ضجيج كي يستقر عمل الدائرة اﻹلكترونية. لهذا نستخدم نوع خاص من الدوائر التكاملية التي تُدعى بمنظمات الجهد ومنها الدائرة 7805. تعطي هذه الدائرة في خرجها جهدًا موجبًا مستقرًا قدره 5 فولط وتقدم تيارًا أعظميًا شدته 1.5 أمبير على أن يكون جهد مصدر التغذية الذي نريد تنظيمه أعلى من جهد الخرج بحدود 2 إلى 3 فولط.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148505" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_7805_regulator.png.1645f00173fd0e9ff629abe2a3b708cd.png" rel=""><img alt="03 7805 regulator" class="ipsImage ipsImage_thumbnailed" data-fileid="148505" data-unique="hcfcofeax" style="width: 200px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_7805_regulator.png.1645f00173fd0e9ff629abe2a3b708cd.png"> </a>
</p>

<p>
	للدائرة 7805 ثلاثة أرجل مع خلفية معدنية لربطها مع جسم معدني أو مبدد حراري إذا كان التيار المستجر عبرها عاليًا لتخفيض الحرارة الناتجة عن عملها. فإذا أمسكتها بحيث تكون في مواجهتك تكون الرجل اليسارية هي رجل جهد الدخل الذي تريد تنظيمه والوسطى رجل التأريض واليمينة رجل الخرج التي تعطينا 5 فولط.
</p>

<p>
	شكّل الدائرة البسيطة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148506" href="https://academy.hsoub.com/uploads/monthly_2024_04/04_reg7805_chip.png.49fbb15231aa963c493ba466c1da2be4.png" rel=""><img alt="04 reg7805 chip" class="ipsImage ipsImage_thumbnailed" data-fileid="148506" data-unique="z9hk779bd" style="width: 600px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/04_reg7805_chip.png.49fbb15231aa963c493ba466c1da2be4.png"> </a>
</p>

<ul>
	<li>
		صل رجل الدخل إلى المسرى الموجب للوحة المثقبة ثم صل معه القطب الموجب لمكثفة 1 ميكروفاراد ومهبط الديود.
	</li>
	<li>
		صل الرجل اﻷخرى للمكثفة مع المسرى السالب ومصعد الديود مع رجل الخرج.
	</li>
	<li>
		صل الرجل الوسطى مع المسرى السالب.
	</li>
	<li>
		صل رجل الخرج مع الرجل الطويلة للمؤشر الضوئي وصل رجله اﻷخرى مع رجل مقاومة 2.2 كيلو أوم والرجل اﻷخرى للمقاومة مع المسرى السالب.
	</li>
	<li>
		صل قطبي البطارية 8 فولط إلى المسريين الموجب والسالب للوحة المثقبة.
	</li>
	<li>
		استخدم مقياس اﻵفو لتحديد الجهد بين المسرى السالب و رجل الخرج للدائرة 7805 ماذا تجد؟
	</li>
</ul>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		هنالك دوائر أخرى من العائلة 78xx تعطي جهود 06، 09، 12 فولط مثل 7812
	</p>
</blockquote>

<h3 id="-6">
	الدوائر المتكاملة القابلة للبرمجة
</h3>

<p>
	تُعرّف عملية البرمجة في اﻹلكترونيات عمومًا بأنها طريقة تحديد وظيفة العنصر اﻹلكتروني والطريقة التي يتواصل فيها مع الدائرة المحيطة به. وكما ذكرنا قبل قليل أن الدوائر اﻹلكترونية المتكاملة قد تشتمل على عدة وظائف وعندها تكون برمجة هذه الدائرة هو تحديد الوظيفة التي نريدها أن تؤديها من بين وظائف عدة.
</p>

<p>
	وللبرمجة في عالم اﻹلكترونيات تصنيفان أساسيان:
</p>

<ol>
	<li>
		<p>
			<strong>برمجة فيزيائية</strong>: نحدد فيها وظيفة الدائرة اﻹلكترونية بتغيير طريقة توصيلها مع الدائرة المحيطة، أي تفرض على الدائرة المتكاملة وظيفة معينة وفقًا لطريقة توصيل أرجلها مع عناصر إلكترونية أخرى محددة. وأغلب الدارات المتكاملة التماثلية متعددة الوظائف تبرمج بهذا الشكل.
		</p>
	</li>
	<li>
		<p>
			<strong>برمجة بالشيفرة</strong>: وفيها تُكتب برمجيات رقمية خاصة خارج هذه الدائرة ثم تنقل إليها، وقد تكون هذه البرمجيات دائمة أي تحمََّل مرة واحدة ولا يمكن تعديلها لاحقًا مثل الدائرة التكاملية التي تُحمّل برمجيات إقلاع الحاسب BIOS، ومن الممكن أيضًا تغيير هذه البرامج وتعديلها في أي وقت كما في الدوائر المتكاملة التي تُدعى المتحكمات الصغرية.
		</p>
	</li>
</ol>

<p>
	تُدعى البرمجيات التي تُحمّل إلى الدوائر المتكاملة "برمجيات قيادة Firmeware" وتكتب باستخدام لغات برمجة منخفضة المستوى عادة، ويمكن استخدام لغات برمجة عالية المستوى مثل C++,C, بايثون.
</p>

<h4 id="555">
	تطبيق عملي: البرمجة الفيزيائية للدائرة المتكاملة 555
</h4>

<p>
	تُصنف الدائرة 555 ضمن فئة المؤقتات أو الهزازات التي يتأرجح دخلها بين قيمة عليا (قيمة وصل) هي قيمة جهد تغذية الدائرة وقيم دنيا (قيمة فصل) هي 1.2 فولط وفقًا لطريقتي برمجة فيزيائية:
</p>

<ul>
	<li>
		<strong>اﻷولى</strong> تُدعى الوضع الوحيد الاستقرار وفيه تعمل الدائرة كمؤقت إذ تُبرمج كي يكون الخرج موصولًا لفترة زمنية محددة.
	</li>
	<li>
		<strong>الثانية</strong>: تُدعى الوضع غير المستقر وفيه يُبرمج الخرج كي يتبدل بين الفصل والوصل خلال أزمة محددة لكل حالة.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148507" href="https://academy.hsoub.com/uploads/monthly_2024_04/05_ne555_chip.png.011ef1636832fcc16f95e4eae2ed1dba.png" rel=""><img alt="05 ne555 chip" class="ipsImage ipsImage_thumbnailed" data-fileid="148507" data-unique="twjf42su9" style="width: 499px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/05_ne555_chip.png.011ef1636832fcc16f95e4eae2ed1dba.png"> </a>
</p>

<p>
	تتكون الدائرة 555 من ثمانية أرجل، لا حاجة حاليًا لشرح وظيفة كل رجل، وما سنستعرضه هي طريقة برمجة الدائرة كي تعطي الوظيفتين السابقتين. لهذا استخدم العناصر التي أشرنا إليها سابقًا لتشكيل الدائرة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148508" href="https://academy.hsoub.com/uploads/monthly_2024_04/06_ne555_circuit.png.6ba9183d23a0f842f953681303fa4f7d.png" rel=""><img alt="06 ne555 circuit" class="ipsImage ipsImage_thumbnailed" data-fileid="148508" data-unique="kb2qwh3dt" style="width: 500px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/06_ne555_circuit.png.6ba9183d23a0f842f953681303fa4f7d.png"> </a>
</p>

<p>
	برمجة الوظيفة الأولى:
</p>

<ul>
	<li>
		ضع الدائرة 555 لتكون أرجلها ضمن نصفين مختلفين للوحة المثقبة ثم صل الرجل رقم 1 (اﻷرضي) بالمسرى السالب والرجلين 8 (تغذية) والرجل 4 بالمسرى الموجب.
	</li>
	<li>
		صل الرجل رقم 7 بمقاومة R1 قيمتها 22 كيلو أوم ورجلها الثانية بالمسرى الموجب.
	</li>
	<li>
		صل الرجل رقم 2 بالرجل 6 بسلك ثم صلهما بالرجل الموجبة لمكثفة C1 قيمتها 47 ميكروفاراد وصل رجلها السالبة بالمسرى السالب.
	</li>
	<li>
		صل بمقاومة R2 قيمتها 22 كيلو أوم نقطة التقاء المقاومة 22 كيلو أوم والرجل 7 مع نقطة التقاء الرجل 6 والمكثفة.
	</li>
	<li>
		صل الرجل 5 إلى مكثفة 1 ميكروفاراد وصل رجلها السالبة باﻷرضي (بإمكانك تجاهل هذه الحركة حاليًا).
	</li>
	<li>
		صل أخيرًا رجل الخرج رقم 3 من خلال مقاومة 10 كيلو أوم بقاعدة الترانزستور وانتبه إلى أن يكون بعيدًا عن ثقوب الدائرة 555 ثم صل باعثه إلى المسرى السالب من خلال مقاومة 2.2 كيلو أوم وصل مؤشر ضوئي بين مجمّعه والمسرى الموجب.
	</li>
	<li>
		صل بطارية 8 فولط إلى المسريين الموجب والسالب للوحة المثقبة، وراقب ما يحدث.
	</li>
</ul>

<p>
	ستلاحظ كيف يضيء وينطفئ المصباح بشكل منتظم وباستمرار طالما أن الدائرة موصولة بالتغذية الكهربائية وتُبرمج فترتي اﻹضاءة والتوقف من خلال تحديد قيم المقاومتين R1 و R2 وسعة المكثفة C1 وفق المعادلتين البسيطتين التاليتين:
</p>

<pre class="ipsCode">t(off) = 0.0069xC1xR2 ..............(زمن الفصل بالثانية)
t(on)= 0.0069xC1x(R1+R2)..........(زمن التوصيل بالثانية)
</pre>

<p>
	برمجة الوظيفة الثانية:
</p>

<ul>
	<li>
		اتبع نفس الخطوات السابقة لكن لا تصل الرجل 2 بالرجل 6 بل اجعل السلك موصولًا بالرجل 2 وحرًا من الطرف اﻵخر.
	</li>
	<li>
		ضع السلك الموصول بالرجل 2 (رجل القدح) بالمسرى السالب للحظة ثم اخرجه وسترى أن الضوء يضيئ مدة زمنية محددة ثم ينطفئ، وتبرمج هذه المدة من خلال تحديد قيمة المقاومة R1 والمكثفة C1 وفق المعادلة التالية:
	</li>
</ul>

<pre class="ipsCode">t= 0.001xR1xC1.......(زمن الوصل بالثانية)
</pre>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		يتطلب العمل مع الدوائر المتكاملة معرفة بورقة المواصفات الخاصة لكل منها، والتي تدلك على طرق التوصيل والبرمجة وقيم التغذية المخصصة لكل منها.
	</p>
</blockquote>

<p style="text-align: center;">
	<img alt="07_ne555.gif" class="ipsImage ipsImage_thumbnailed" data-fileid="148517" data-ratio="56.20" data-unique="z9nilml2j" style="width: 500px; height: auto;" width="800" src="https://academy.hsoub.com/uploads/monthly_2024_04/07_ne555.gif.ae3e33469b89b749520c2c5adbbb73a2.gif">
</p>

<h2 id="-7">
	المتحكمات الصغرية والدوائر المتكاملة المبرمجة بالشيفرة
</h2>

<p>
	المتحكمات الصغرية هي دائرة عالية التكامل متعددة الوظائف من النوع الرقمي أو الرقمي-التشابهي المختلط. وهي دوائر قابلة للبرمجة بالشيفرة وبالتالي لابد أن تكون المتحكمات قادرةً على قراءة الشيفرة وتنفيذها.
</p>

<p>
	تُعد هذه الدائرة بمثابة حاسوب حقيقي لكنه مصغّر ومحدود اﻹمكانية وينقصه فقط لوحة مفاتيح وشاشة عرض (وفي الواقع يمكن وصل شاشات ولوحات مفاتيح خاصة إليه وبرمجته ليتواصل معهما).
</p>

<p>
	يمكن للمتحكمات الصغرية التعامل مع القيم التماثلية التي تأتيه من الوسط الخارجي، مثل قراءة درجات الحرارة عبر وصله بحساسات مناسبة، كما يمكنه التحكم بأجهزة تماثلية مثل التحكم بمحركات التيار المستمر. ولهذا نجد أن المتحكمات الصغرية هي غالبًا الدماغ الذي يقود الروبوتات.
</p>

<p>
	وإضافة إلى القيم التماثلية فهو قادر على فهم اﻹشارات الرقمية والمنطقية وقادر على التخاطب الرقمي مع الوسط الخارجي.
</p>

<h3 id="-8">
	البنية العامة للمتحكم الصغري
</h3>

<p>
	يتكون المتحكم الصغري أيًا يكن نوعه أو الشركة المصنعة له من مكوّنات بنيوية أساسية هي:
</p>

<ul>
	<li>
		وحدة معالجة مركزية CPU وهي المسؤولة عن تنفيذ العمليات الرياضية والحسابية.
	</li>
	<li>
		وحدة إدارة الذاكرة (الكتابة والقراءة منها) بشقيها ذاكرة الوصول العشوائي RAM التي تُستخدم أثناء تنفيذ الشيفرة وذاكرة القراءة فقط ROM التي تخزن شيفرة البرنامج.
	</li>
	<li>
		وحدة إدارة الدخل والخرج.
	</li>
	<li>
		منافذ دخل وخرج.
	</li>
	<li>
		دوائر توقيت.
	</li>
	<li>
		ساعة داخلية.
	</li>
	<li>
		مبدلات رقمية تماثلية والعكس لتحويل كل منهما إلى اﻷخرى حسب الحاجة.
	</li>
	<li>
		وحدة وحدات قادر على الاتصال مع التجهيزات الخارجية وفق معايير مشتركة بين هذه العناصر (بروتوكولات نقل).
	</li>
</ul>

<p>
	لن نهتم في الواقع إلى هذه التفاصيل كثيرًا في بداية مشوارنا لكن لا بد من الانتباه لها عند شراء معالج صغري، إذ نهتم عادة بالنقاط التالية وبما يلائم مشروعنا:
</p>

<ul>
	<li>
		حجم ذاكرته.
	</li>
	<li>
		السرعة التي يعمل عندها.
	</li>
	<li>
		عدد بوابات الدخل والخرج وعدد اﻷرجل في كل منها.
	</li>
	<li>
		عدد اﻷرجل التي تقبل دخلًا تماثليًا.
	</li>
	<li>
		عدد المؤقتات ودقتها.
	</li>
	<li>
		عدد العدادات فيه ودقتها.
	</li>
	<li>
		عدد وحدات الاتصال مع تجهيزات الوسط الخارجي وأنواعها (نقل تسلسلي، تفرعي،…).
	</li>
	<li>
		دعم الاتصال مع مع تجهيزات أخرى باستخدام واجهات مثل USB وغيرها.
	</li>
</ul>

<p>
	يمكن للمتحكم الصغري أن يستخدم ساعته الداخلية لمزامنة قراءة الشيفرة وتنفيذها أو ساعة خارجية يؤمنها موّلد نبض خارجي وله أنواع كثيرة أشهرها الهزازات الكريستالية Crystal Oscillators التي تعمل عند ترددات مختلفة بما يلائم السرعة القصوى المطلوبة من المتحكم المستخدم.
</p>

<h3 id="-9">
	الهيكلية الخارجية للمتحكم
</h3>

<p>
	يغلّف المتحكم الصغري بأحد طرق تغليف الدوائر التكاملية التي ذكرناها سابقًا ولا يخرج منه إلى الوسط الخارجي سوى اﻷرجل. تُرقم أرجل المتحكم الصغري كما تُرقم أرجل أي دائرة متكاملة أي من الرقم 1 للرجل التي تقع على يسار الحفرة المرجعية على السطح وتتزايد اﻷرقام بعكس دوران عقارب الساعة.
</p>

<h3 id="-10">
	البوابات ووظائف اﻷرجل
</h3>

<p>
	تقسم اﻷرجل كما ذكرنا إلى:
</p>

<ul>
	<li>
		<p>
			أرجل مخصصة لها وظيفة واحدة كأرجل التغذية والتصفير وأرجل الاتصال مع الساعة الخارجية.
		</p>
	</li>
	<li>
		<p>
			أرجل عامة للدخل والخرج
		</p>
	</li>
	<li>
		<p>
			أرجل عامة للدخل والخرج مع وظائف خاصة.
		</p>

		<p>
			تشكل كل مجموعة من اﻷرجل العامة مايُسمى بوابة Port وتضم كل بوابة ما بين 3 إلى 16 رجل وعادة ما تُصنع أرجل البوابة الواحدة وفق آلية محددة تجعلها متوافقة مع بعضها. ويمكن برمجة كل رجل لتكون دخل أو خرج بغض النظر عن بقية أرجل البوابة، لكن عندما تريد استخدام البوابة ككل فلابد أن تكون كل أرجل هذه البوابة دخل أو كلها خرج.
		</p>
	</li>
</ul>

<p>
	يمكن لبعض اﻷرجل وليس جميعها أن تستقبل قيمًا تماثلية لأنها مبنية ومصممة لهذا الغرض لكن كل اﻷرجل قادرة على فهم القيم الرقمية أو المنطقية.
</p>

<p>
	أما الأرجل ذات الوظائف الخاصة، فإنها تؤدي هذه الوظائف عندما نحدد ذلك عن طريق البرنامج. وعندها تؤدي فقط هذه الوظيفة الخاصة ولا يمكن أن تستخدم للدخل أو الخرج العام. ومن هذه الوظائف نجد العدادات وتبادل البيانات مع تجهيزات أخرى. ومن الوظائف الخاصة أيضًا اﻷرجل التي تتصل بجهاز البرمجة وتنقل البرنامج الذي كتبناه من الحاسوب إلى المتحكم.
</p>

<h3 id="pic16f84a">
	تطبيق عملي: تعرّف على المتحكم PIC16f84A
</h3>

<p>
	وهو متحكم صغري من إنتاج Microchip يعمل عند جهد 2 إلى 5.5 فولط وسرعة بين 32 كيلو هرتز و20 ميغا هرتز يمكن تحديدها من خلال الساعة الخارجية المتصلة به (هزاز النبضات). لهذا المتحكم بعض الميزات منها:
</p>

<ul>
	<li>
		بوابتين A و B تضم البوابة اﻷولى خمسة أرجل مرمّزة من A0 وحتى A4، بينما تضم الثانية ثمان أرجل مرمّزة من B0 وحتى B7.
	</li>
	<li>
		دارة مؤقت/ عداد (حسب برمجتها) مرمّزة بالاسم TMR0 متصلة بالرجل RA4، إذا لهذه الرجل وظيفة عامة (دخل أو خرج) ووظيفة خاصة (عد النبضات الواردة إلى هذه الرجل) ويمكن ضبط الوظيفة المطلوبة برمجيًا.
	</li>
	<li>
		لا يمكنه التعامل مع اﻹشارات التماثلية مباشرة أي لا يحتوي على أرجل مهيأة للتعامل مع القيم التماثلية ويحتاج إلى عنصر خارجي يُدعى محوّل تماثلي رقمي.
	</li>
	<li>
		يدعم الاتصال التسلسلي مع الحاسب وبعض التجهيزات اﻷخرى.
	</li>
	<li>
		ذاكرة برنامج مقدارها 2048 بايت وذاكرة عشوائية للعمل مقدارها 64 بايت.
	</li>
	<li>
		يبرمج باستخدام لغة خاصة به كما يبرمج باستخدام لغة C.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148509" href="https://academy.hsoub.com/uploads/monthly_2024_04/08_pic_16f84A.png.cd27f6d93d5b1ecff657d3df5225bf37.png" rel=""><img alt="08 pic 16f84a" class="ipsImage ipsImage_thumbnailed" data-fileid="148509" data-unique="7arugxk8p" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_04/08_pic_16f84A.png.cd27f6d93d5b1ecff657d3df5225bf37.png"> </a>
</p>

<p>
	<strong>لتوصيل المتحكم إلى دائرة إلكترونية اتبع الخطوات التالية</strong>:
</p>

<ul>
	<li>
		صل الرجل رقم 14 إلى منبع تغذية موجب بين 3 إلى 5 فولط، يمكنك بالطبع استخدام منظم الجهد 7805 الذي تحدثنا عنه في تطبيق عملي سابق، لأنه من الضروري تنظيم الجهد الواصل إلى المتحكم وإزالة أية آثار للضجيج.
	</li>
	<li>
		صل الرجل رقم 5 باﻷرضي (المسرى السالب).
	</li>
	<li>
		صل مهتز كريستالي تردده 2 ميغا هرتز مثلًا بين الرجلين 15 و 16 ثم صل كل رجل للمهتز بالمسرى السالب من خلال مكثف عدسي 20 نانو فاراد. هذا المهتز هو من سيحدد سرعة عمل المتحكم ويضبط توقيت العمل.
	</li>
	<li>
		صل الرجل رقم 4 بالمسرى الموجب.
	</li>
</ul>

<p>
	في هذه اللحظة سيدخل المتحكم في مرحلة اﻹقلاع وصولًا إلى مرحلة تنفيذ البرنامج الذي حمّلناه مسبقًا إلى ذاكرته.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148512" href="https://academy.hsoub.com/uploads/monthly_2024_04/09_pic_16f84_circuit.png.ae81b2e727a5af7d65b29773ba8b52c7.png" rel=""><img alt="09 pic 16f84 circuit" class="ipsImage ipsImage_thumbnailed" data-fileid="148512" data-ratio="67.60" data-unique="uz6yo7psq" style="width: 500px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_04/09_pic_16f84_circuit.png.ae81b2e727a5af7d65b29773ba8b52c7.png"> </a>
</p>

<h4 id="-11">
	كتابة برنامج للمتحكم وتحميله
</h4>

<p>
	لا بد قبل كل شيء من تعلّم لغة برمجة، وخاصة C أو ++C أو بايثون حتى تستطيع التفكير بطريقة برمجية إضافة إلى فهم صياغة الشيفرة. وعليك أن تعرف أن تعاملك في المتحكمات سيكون مع اﻷرجل أو مع وحدات الاتصال.
</p>

<ul>
	<li>
		عندما تحدد أحد اﻷرجل على أنه رجل خرج، سيمر تيار له نفس جهد التغذية وشدة أقصاها 25 ميلي أمبير إلى العنصر الذي تريده وذلك في حال أعطيته القيمة المنطقية <code>1</code>.
	</li>
	<li>
		إن حددت أحد الأرجل على أنها رجل دخل، سيترقب المعالج بشكل مستمر وصول تيار جهده يماثل جهد التغذية إلى هذه الرجل ثم ينفّذ عملًا معينًا إذا حدث ذلك.
	</li>
	<li>
		إن أردت من رجل ذات وظيفة خاصة أن تنفّذ هذه الوظيفة، عليك أن تحدد ذلك في البرنامج.
	</li>
	<li>
		توضع الشيفرة كلها ضمن كتلة يعيد المتحكم تنفيذها باستمرار وينتقل من تعليمة إلى التي تليها بشكل متسلسل.
	</li>
</ul>

<p>
	لنحاول أن نكتب برنامجًا بسيطًا للمتحكم PIC16F84A ينتظر ورود إشارة على الرجل RA0 ثم يجعل الأضواء الموصولة مع اﻷرجل RA1, RA2, RA3 تعمل بالتناوب لمرة واحد على أن يكون هناك فاصل زمني بين كل منها مقداره 2 ثانية ثم تنطفئ.
</p>

<p>
	إليك البرنامج:
</p>

<pre class="ipsCode">#include &lt;16F877A.h&gt; // لاستخدام الميزات الخاصة بالمتحكم المطلوب
#use delay(clock=2000000) // اختيار سرعة المعالج بالهرتز ويماثل تردد الهزاز الكريستالي
void main() {
    /* نضع في هذه الكتلة تعليمات برنامج المتحكم الذي يكررهابشكل مستمر
                                                طالما أنه في حالة عمل  
   */
   if(input_state(pin_a0)){
      /*ستُنفَّذ التعليمات التالية RA0 إذا وصل تيار جهد 5 فولط إلى الرجل */
       output_high(pin_a1);//ٌ لتمرر تيارًا إلى المؤشر الضوئي RA1 تفعيل الرجل 
       delay_ms(2000);// الانتظار مدة 2000 ميلي ثانية أي ثانيتين
       output_high(pin_a2);// لتمرر تيارًا إلى المؤشر الضوئي RA2 تفعيل الرجل 
       delay_ms(2000);// الانتظار مدة 2000 ميلي ثانية أي ثانيتين
       output_high(pin_a3);// لتمرر تيارًا إلى المؤشر الضوئي RA3 تفعيل الرجل 
       delay_ms(2000);// الانتظار مدة 2000 ميلي ثانية أي ثانيتين
       output_low(pin_a1);//وإطفاء المؤشر الضوئي RA1 قطع التيار عن الرجل 
       output_low(pin_a2);//وإطفاء المؤشر الضوئي RA2 قطع التيار عن الرجل 
       output_low(pin_a3);//وإطفاء المؤشر الضوئي RA3 قطع التيار عن الرجل 
   }; 
}
</pre>

<p>
	يُكتب هذا البرنامج ضمن أي محرر نصي ثم يُستخدم برنامج حاسوبي لتحويله إلى شكل يفهمه المتحكم وهو الترميز المنطقي بالأصفار <code>0</code> والواحدات <code>1</code> وتكون النتيجة ملف له الامتداد <code>hex.</code>.
</p>

<p>
	نحتاج بعد ذلك إلى تجهيزة خاصة تُدعى مبرمجة مهمتها نقل الملف السابق من الحاسوب إلى المتحكم، وستجد أنواعًا مختلفة من المبرمجات يخصص كل منها لعائلة أو أكثر من المتحكمات ويأتي مع كل مبرمجة التوصيلات الخاصة مع الحاسوب وبرنامج نقل ملف الشيفرة ودليل الاستعمال. وهذا الموضوع بالطبع خارج نطاق هذا المقال ويتطلب مزيدًا من الشرح والتوضيح.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		توجد لوحات إلكترونية مخصصة للتدريب على برمجة واستخدام المتحكمات الصغرية وتأتي مع تجهيزات وعناصر إلكترونية متنوعة مرّكبة وجاهزة للاستخدام وتكون قادرة على الاتصال مع الحاسوب عبر منفذ USB لبرمجة المعالج المركّب عليها، لكنها مخصصة لنوع محدد من المتحكمات أو لعدة متحكمات فقط من هذا النوع.
	</p>
</blockquote>

<h2 id="-12">
	الخلاصة
</h2>

<p>
	هكذا نكون قد انتهينا من سلسلة هذه المقالات التي تحدّثت عن علم اﻹلكترونيات و<a href="https://academy.hsoub.com/tags/%D8%A7%D9%84%D8%AF%D8%A7%D8%B1%D8%A7%D8%AA%20%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9/" rel="">الدارات الإلكترونية</a> انطلاقًا من المفاهيم اﻷساسية وصولًا إلى المتحكمات القابلة للبرمجة والتي تُعد نواةً للتحكم بالروبوتات والحواسب المصغرة وأجهزة التحكم الصناعي وغيرها الكثير. فإن رأيت أنك مهتم بما قرأت شاركنا رأيك في نقاش الصفحة ودعنا نساعدك في توضيح ما يُشكل عليك فهمه وتوجيهك نحو خطوات قادمة.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B4%D9%83%D9%8A%D9%84-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D8%A6%D8%B1-%D8%A7%EF%BB%B9%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D9%81%D8%B9%D8%A7%D9%84%D8%A9-r2299/" rel="">أساسيات في عالم الإلكترونيات: تشكيل الدوائر اﻹلكترونية والعناصر الفعالة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">برمجة الروبوت: الدليل الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r2078/" rel="">تجميع راسبيري باي والتحضير لاستخدامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AD%D8%B3%D9%8A%D8%A9-%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1934/" rel="">تصميم وتنفيذ لعبة حسية تفاعلية باستخدام لوحة راسبيري باي بيكو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1910/" rel="">تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2307</guid><pubDate>Tue, 23 Apr 2024 12:08:01 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x641;&#x64A; &#x639;&#x627;&#x644;&#x645; &#x627;&#x644;&#x625;&#x644;&#x643;&#x62A;&#x631;&#x648;&#x646;&#x64A;&#x627;&#x62A;: &#x62A;&#x634;&#x643;&#x64A;&#x644; &#x627;&#x644;&#x62F;&#x648;&#x627;&#x626;&#x631; &#x627;&#xFEF9;&#x644;&#x643;&#x62A;&#x631;&#x648;&#x646;&#x64A;&#x629; &#x648;&#x627;&#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x627;&#x644;&#x641;&#x639;&#x627;&#x644;&#x629;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%AA%D8%B4%D9%83%D9%8A%D9%84-%D8%A7%D9%84%D8%AF%D9%88%D8%A7%D8%A6%D8%B1-%D8%A7%EF%BB%B9%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A9-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D9%81%D8%B9%D8%A7%D9%84%D8%A9-r2299/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/1160747408_.png.ac136d2714fbc4cf39f84a8d02a78af1.png" /></p>
<p>
	تعرفنا في <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8A%D8%A7%D8%B1-%D9%88%D8%A7%D9%84%D8%AC%D9%87%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D9%83%D9%86%D8%A9-r2294/" rel="">المقال السابق</a> على بعض اﻷساسيات في علم اﻹلكترونيات مثل الجهد الكهربائي وشدة التيار وتعلمنا استخدام بعض العناصر اﻹلكترونة الساكنة passive component في تكوين بعض الدوائر البسيطة وقياس قيم الجهد والتيار باستخدام المقياس الكهربائي متعدد الوظائف (اﻵفو).
</p>

<p>
	نتابع في هذا المقال استعراض مفاهيم أخرى أساسية في تكوين الدوائر الإلكترونية ونلقي الضوء على بعض العناصر اﻹلكترونية التي تُدعى بالعناصر الفعّالة Active Components.
</p>

<h2 id="-1">
	ما تحتاجه لإكمال التمارين العملية في هذا المقال
</h2>

<p>
	إليك قائمة بالعناصر الإلكترونية والتجهيزات اللازمة لإكمال التطبيقات العملية:
</p>

<ul>
	<li>
		بطارية جهدها 5 فولط.
	</li>
	<li>
		مقاومات قيمها 1.2، 2.2، 6.8، 10، 22 كيلو أوم
	</li>
	<li>
		مؤشرات ضوئية (ليد) تعمل عند جهد 5 فولط أو أقل (ثلاثة ويفضل من ألوان مختلفة).
	</li>
	<li>
		مكثفة سعتها 470 ميكرو فاراد وأخرى 330 ميكرو فاراد جهدها 16 فولط.
	</li>
	<li>
		ديودات من طراز 1N4007 (يكفي اثنان).
	</li>
	<li>
		ترانزستورات قطبية من الطراز 2N2222.
	</li>
	<li>
		ترانزيستور ذات أثر حقلي من النوع MOSFET وطراز 2N2905A (ثلاثة تكفي).
	</li>
	<li>
		لوحة اختبار مثقبة (إن أردت فاﻷمر اختياري)
	</li>
	<li>
		مقياس كهربائي متعدد الوظائف AV multi-meter.
	</li>
</ul>

<h2 id="-2">
	ترتيب العناصر اﻹلكترونية في الدوائر
</h2>

<p>
	نشرح في هذا القسم طريقة توصيل العناصر اﻹلكترونية والهيكلية اﻷساسية للدوائر بشكل مبسط دون الخوض في التفاصيل لأنها تتطلب معارف رياضية متقدمة.
</p>

<h3 id="-3">
	الوصل على التسلسل والوصل على التفرّع
</h3>

<p>
	وهما طريقتان لوصل العناصر في الدائرة اﻹلكترونية سنشرحهما بشكل مبسط:
</p>

<h4 id="-4">
	الوصل على التسلسل
</h4>

<p>
	عندما نصل طرفي عنصرين معًا، ونترك طرفيهما اﻵخرين كي توصلا مع بقية عناصر الدائرة ندعو هذا الوصل وصلًا تسلسليًا. وقد نصل عنصرين أو أكثر وفق هذه الطريقة فيتكون فرع في الدائرة الكهربائية يمر في عناصره تيار ذو شدة محددة ويهبط الجهد عند طرفي كل عنصر ليكون الجهد الكلي بين طرفي هذه العناصر المتسلسلة هو مجموع هبوطات الجهود.
</p>

<h4 id="-5">
	الوصل على التفرع أو التوازي
</h4>

<p>
	إذ وصلت رجلي عنصر أو طرفي عنصر مع بعضهما ثم وصلت كذلك الطرفين اﻵخرين مع بعضهما فإن هذا الوصل هو وصل على التفرع. وقد نصل عنصرين أو أكثر بهذه الطريقة فتتكون عدة فروع في الدائرة عددها هو عدد هذه العناصر الموصولة على التفرع. يكون هبوط الجهد متماثلًا في الفروع إذ وصل طرفاها إلى منيع التغذية الكهربائي بينما سيتوزع التيار على هذه الفروع حسب طبيعة كل فرع.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148075" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_parallal_series.png.4c3914d5550f2f9a2bd6d57a4b120754.png" rel=""><img alt="01 parallal series" class="ipsImage ipsImage_thumbnailed" data-fileid="148075" data-unique="a8oklgr35" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_parallal_series.png.4c3914d5550f2f9a2bd6d57a4b120754.png"> </a>
</p>

<p style="text-align: center;">
	وصل العناصر على التفرع إلى اليمين وعلى التسلسل إلى اليسار
</p>

<h3 id="-6">
	هيكلية الدائرة اﻹلكترونية
</h3>

<p>
	تتكون الدائرة اﻹلكترونية بأبسط أشكالها من مصدر تغذية كهربائي وعنصر إلكتروني أو أكثر بحيث يخرج التيار الكهربائي من مصدر التغذية ويعود إليه. وعند ترتيب العناصر في الدائرة سواء على التسلسل أو التفرع أو بطريقة مختلطة نميّز فيها الأقسام التالية:
</p>

<ol>
	<li>
		<strong>العقدة</strong>: وهي نقطة التقاء ثلاثة فروع أو أكثر ولها قاعدة مهمة جدًا بخصوص التيارات المارة فيها وتنص أن مجموع شدات التيارات الداخلة إلى عقدة تساوي مجموع شدات التيارات الخارجة منها. أي إذا دخل على عقدة تيار شدته 3 أمبير وتفرّع إلى فرعين سيكون مجموع الشدتين في الفرعين الناتجين هو أيضًا 3 أمبير.
	</li>
	<li>
		<strong>الفرع</strong>: هو جزء من الدائرة مكون من عنصر واحد أو عدة عناصر موصولة على التسلسل.
	</li>
	<li>
		<strong>الحلقة</strong>: وهي دائرة فرعية محددة بعقدتين أو أكثر.
	</li>
</ol>

<h3 id="-7">
	وصل بعض العناصر على التسلسل والتفرع
</h3>

<p>
	لكل عنصر إلكتروني وظيفة محددة وبالتالي طريقة ربط محددة في الدارة، وهكذا تبدأ الفروع والحلقات والعقد بالظهور لهيكلة الدائرة وتزداد صعوبة الحسابات الكهربائية. لكننا سنبقي اﻷمور في مقالنا بسيطة قدر اﻹمكان مبتعدين عن أية حسابات رياضية صعبة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148076" href="https://academy.hsoub.com/uploads/monthly_2024_04/02_components_junction.png.4650b126ff4578444a048a993c278da2.png" rel=""><img alt="02 components junction" class="ipsImage ipsImage_thumbnailed" data-fileid="148076" data-unique="h2ozm9npt" src="https://academy.hsoub.com/uploads/monthly_2024_04/02_components_junction.png.4650b126ff4578444a048a993c278da2.png"> </a>
</p>

<p style="text-align: center;">
	وصل العناصر الإلكترونية على التسلسل والتفرع
</p>

<h4 id="-8">
	وصل منابع التغذية
</h4>

<p>
	توصل منابع التغذية الكهربائية على التسلسل والتفرع لزيادة الجهد الكلي في الدائرة أو زيادة شدة التيار الذي يمكن للعناصر استجراره منها.
</p>

<p>
	عند وصل منبعي تغذية أو أكثر على التسلسل بوصل القطب الموجب للأولى مع السالب للثاني حصلنا على مصدر تغذية جهده الكلي يساوي مجموع جهدي المنبعين. فلو وصلنا بطاريتين جهد كل منهما 1.5 فولط على التسلسل سنحصل على مصدر تغذية جهده 3 فولط.
</p>

<p>
	وعند وصل منبعي تغذية على التفرع بوصل القطبين الموجبين معًا والسالبين معًا بحيث تكون اﻷقطاب المشتركة هي من تغذي الدائرة الكهربائية، سيتمكن مصدر التغذية الجديد من استجرار تيار أكبر لعناصر الدائرة، أو على اﻷقل تغذية الدائرة لفترة أطول.
</p>

<h4 id="-9">
	وصل المقاومات
</h4>

<p>
	اتبع القواعد البسيطة التالية:
</p>

<ul>
	<li>
		وصل مقاومات على التسلسل يعطي مقاومة جديدة قيمتها مجموع قيم المقاومات السابقة. فلو كان لديك مقاومات قيمها 2 كيلو أوم فقط وتحتاج إلى مقاومة 6 كيلو أوم، صل عندها ثلاثًا منها على التسلسل.
	</li>
	<li>
		وصل مقاومتين لهما القيمة ذاتها على التفرع يعطي مقاومة قيمته نصف قيمة إحداهما ووصل ثلاثة لها القيمة ذاتها سيعطي مقاومة لها ثُلث قيمة إحداها وهكذا. فلو كان لديك مقاومات قيمها 3 كيلو أوم وتحتاج إلى مقاومة قيمتها 1 كيلو أوم صل ثلاثة منها على التفرع.
	</li>
</ul>

<h4 id="-10">
	وصل المكثفات
</h4>

<p>
	اتبع القواعد البسيطة التالية:
</p>

<ul>
	<li>
		وصل مكثفتين لهما القيمة ذاتها على التسلسل يعطي مكثفة سعتها نصف سعة إحداهما ووصل ثلاثة لها السعة ذاتها سيعطي مكثفة لها ثُلث سعة إحداها وهكذا. فلو كان لديك مكثفات قيمها 10 ميكروفاراد وتحتاج إلى مكثفة سعتها 5 ميكروفاراد صل اثنتين منها على التسلسل.
	</li>
	<li>
		وصل مكثفات على التفرع يعطي مكثفة جديدة سعتها مجموع سعات تلك المكثفات. فلو كان لديك مكثفات سعاتها 1 ميكروفاراد فقط وتحتاج إلى مكثفة سعتها 4 فاراد ، صل عندها أربعةً منها على التفرع.
	</li>
</ul>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		انتبه عند وصل المكثفات المستقطبة على التفرغ فالرجل الموجبة مع الموجبة والسالبة مع السالبة وإلا ستصلها على التسلسل أو لن تستفيد من عملية التوصيل اطلاقًا.
	</p>
</blockquote>

<h4 id="-11">
	وصل الديودات
</h4>

<p>
	اتبع القواعد البسيطة التالية:
</p>

<ul>
	<li>
		توصل الديودات على التسلسل (مهبط&gt;مصعد&gt;مهبط&gt;مصعد) لأسباب عديدة منها ضمان الحماية عند تيارات أعلى ومنها تخفيض الجهد أكثر بين طرفي الوصلة إذ يخفض كل ديود الجهد بحدود 0.6 فولط (وفق مادة تصنيعه).
	</li>
	<li>
		توصل الديودات على التفرع عندما لا تريد أن يؤثر توصيله على شدة التيار الذي يصل العنصر اﻹلكتروني التالي.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148077" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_nodes_law.png.3794414e232d6f55c0f175efd80bf953.png" rel=""><img alt="03 nodes law" class="ipsImage ipsImage_thumbnailed" data-fileid="148077" data-unique="q8f9xoiy3" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_nodes_law.png.3794414e232d6f55c0f175efd80bf953.png"> </a>
</p>

<p style="text-align: center;">
	تتوزع شدات التيار في الفروع الخارجة من عقدة كلًا حسب مقاومته
</p>

<h3 id="-12">
	المرجع المشترك (اﻷرضي)
</h3>

<p>
	هذا المصطلح شائع كثيرًا ومربك كثيرًا، لهذا سنشرح اﻷمر بالبساطة الممكنة دون أية تعريفات مدرسية. تعمل الدوائر اﻹلكترونية بين نقطتين لهما جهد مختلف وتتحرك الشحنات من الجهد اﻷعلى إلى اﻷدنى. لكن عندما تضم الدوائر عددًا كبيرًا من العناصر وقد تضم أيضًا عدة مصادر تغذية نحتاج إلى نقطة مرجعية لنقيس الجهد عند أية نقطة من الدائرة بالنسبة لها تُدعى هذه النقطة بالمرجع المشترك أو اﻷرضي وقد تكون نقطة من الدائرة أو خارجها ونعتبر أن قيمة جهدها هو الصفر .
</p>

<p>
	لا تكترث كثيرًا اﻵن لهذا الموضوع، ففي معظم دوائرك التي ستغذيها من مصدر تغذية محدد اعتبر أن اﻷرضي هو القطب السالب لمصدر التغذية وأرح نفسك، وإن رأيت في أحد المراجع رمز المرجع المشترك وأردت تطبيق الدائرة الموجودة، صل اﻷرضي بالقطب السالب.
</p>

<h2 id="-13">
	نظرة ثانية إلى العناصر اﻹلكترونية: عناصر إلكترونية فعّالة
</h2>

<p>
	العناصر الفعّالة Active Components هي عناصر تقدم الطاقة الكهربائية للدائرة أو تستهلك جزءًا من الطاقة لتؤدي وظيفتها أو تعمل على تضخيم اﻹشارات الكهربائية. من اﻷمثلة عنها مصادر التغذية التي تحدثنا عنها في مقالنا السابق وسنتحدث اليوم عن أحد أهم العناصر الفعالة وهو الترانزيستور Transistor.
</p>

<h3 id="-14">
	الترانزيستوارت
</h3>

<p>
	الترانزيستور هو عنصر إلكتروني فعال يُستخدم كمفاتيح إلكترونية يمكن التحكم بها كهربائيًا أو كمضخمات لزيادة قوة اﻹشارة الكهربائية. تُستخدم هذه العناصر بكثرة في الدوائر اﻹلكترونية وهي اﻷساس في تصنيع الكثير الكثير من الدوائر المتكاملة Integrated circuits واختصارًا IC.
</p>

<h4 id="-15">
	آلية عمل الترانزستور
</h4>

<p>
	إن الفكرة اﻷساسية خلف تصنيع الترانزستور هو استخدام تيار كهربائي صغير جدًا أو جهد كهربائي صغير جدًا كي نفتح الطريق أما التيار الكهربائي اﻷساسي للمرور ضمن العنصر المطلوب أو إيقافه. و الترانزيستورات أنواع مختلفة وفقًا لطبيعة تصنيعه وتجميع أحزاءه، ونميّز النوعين الرئيسيين التاليين:
</p>

<ul>
	<li>
		<p>
			<strong>الترانزستورات القطبية</strong>: وتستخدم تيارًا صغيرًا للتحكم بمرور تيار كهربائي أكبر (التيار الرئيسي) يغذي العنصر المطلوب. يتكون هذا الترانزيستور من غلاف يخرج منه ثلاثة أرجل يُدعى أحدها مجمّع Collector والثاني قاعدة Base والثالث باعث Emitter. تغلق هذه الترانزيستورات بشكل طبيعي الطريق أما التيار الرئيسي لكن بمجرد مرور تيار صغير بين القاعدة والباعث تفتح الطريق أمام التيار الرئيسي ويتناسب عندها شدة التيار الرئيسي المار في العنصر الذي نريد التحكم به طردًا مع شدة التيار المار بين الباعث والقاعدة. ولهذه الترانزيستورات نموذجان، اﻷول هو الترانزيستور NPN ويفتح إن كان جهد القاعدة أكبر من جهد الباعث واﻵخر هو الترانزيستور PNP ويفتح إن كان جهد القاعدة أقل من جهد الباعث.
		</p>
	</li>
	<li>
		<p>
			<strong>الترانزستورات ذات اﻷثر الحقلي</strong>: لا حاجة في هذه الترانزيستورات إلى مرور تيار كهربائي بين أحد الرجلين حتى تعمل بل تحتاج إلى تطبيق جهد بسيط. تتكون هذه الترانزيستورات من ثلاثة أرجل أيضًا هي المصرف Drain ورمزه D واﻵخر بوابة Gate ورمزه G والثالث منبع Source ورمزه S. لهذه الترانزيستورات أنواع وتقنيات تصنيع مختلفة أكثرها فعند تطبيق جهد بسيط على البوابة يمر يفتح الترانزيستور للتيار الرئيسي الطريق كي يمر من المصرف إلى المنبع أو يغلق الطريق أمامه. وهذه هي الميزة الرئيسية الترانزستورات الحقلية عن القطبية فهي قد تكون في الوضع الطبيعي مغلقة أو مفتوحة وعند تطبيق جهد على البوابة تُفتح أو تُغلق الطريق امام التيار الرئيسي. لهذا السبب نجد تصنيفات أخرى له ومن الضروري الانتباه إليها لأن لكل منها فائدته في الدائرة وسنوضحها في الجدول التالي:
		</p>

		<table>
			<thead>
				<tr>
					<th style="text-align:right;">
						الترانزيستور من النوع المعزِّز Enhancing
					</th>
					<th style="text-align:right;">
						الترانزيستور من النوع المبدد Depletion
					</th>
				</tr>
			</thead>
			<tbody>
				<tr>
					<td style="text-align:right;">
						<strong>معزز بقناة N</strong>: يكون مغلق بشكل طبيعي لكن عند تطبيق جهد موجب صغير على البوابة يفتح
					</td>
					<td style="text-align:right;">
						<strong>مبدد بقناة N</strong>: يكون مفتوحًا بشكل طبيعي لكن عند تطبيق جهد سالب صغير على البوابة يُغلق
					</td>
				</tr>
				<tr>
					<td style="text-align:right;">
						<strong>معزِّز بقناة P</strong>: يكون مغلق بشكل طبيعي لكن عند تطبيق جهد سالب صغير على البوابة يفتح
					</td>
					<td style="text-align:right;">
						<strong>مبدد بقناة P</strong>: يكون مفتوحًا بشكل طبيعي لكن عند تطبيق جهد موجب صغير على البوابة يُغلق
					</td>
				</tr>
				<tr>
					<td style="text-align:right;">
						 
					</td>
					<td style="text-align:right;">
						 
					</td>
				</tr>
			</tbody>
		</table>
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148078" href="https://academy.hsoub.com/uploads/monthly_2024_04/04_transistors.png.da7848a75a0bfda62a4486f8dac3150d.png" rel=""><img alt="04 transistors" class="ipsImage ipsImage_thumbnailed" data-fileid="148078" data-unique="pfnd02jg0" src="https://academy.hsoub.com/uploads/monthly_2024_04/04_transistors.png.da7848a75a0bfda62a4486f8dac3150d.png"> </a>
</p>

<p style="text-align: center;">
	إلى اليمين ترانزيستور قطبي وإلى اليسار ترانزستور حقلي MOSFET
</p>

<h3 id="-16">
	استخدامات الترانزيستور
</h3>

<p>
	للترانزستورات تطبيقات عملية كثيرة لكننا سنهتم فقط بعملها كمفاتيح إلكترونية، ولهذا الغرض فإن أكثر التوصيلات شيوعًا تكون على الشكل التالي:
</p>

<p>
	يوصل العنصر اﻹلكتروني (سواء مؤشر ضوئي أو غيره) والذي نريد التحكم بمرور التيار ضمنه بين الطرف الموجب لمصدر التغذية والمجمّع أو المصرف بينما يتصل الباعث أو المنبع مع الطرف السالب لمصدر التغذية أو المرجع المشترك (الأرضي). لكن ولأن الترانزيستور وظيفة أخرى لا نحتاجها هنا وهي وظيفة التضخيم، فمن اﻷفضل وصل مقاومة بين الباعث أو المنيع والمرجع المشترك كي نحدد شدة التيار التي يحتاجها العنصر اﻹلكتروني الذي نتحكم به.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		تأتي الترانزيستورات ضم غلاف بلاستيكي أو معدني، بينما تجد بعضها اﻷخر مزوّدة بجسم معدني واسع يُدعى مبدد حراري، وتجده مع ترانزستورات استطاعية تمرر تيارات عالية.
	</p>
</blockquote>

<p>
	أما عن كيفية تطبيق الجهد على البوابة أو تمرير تيار التحكم (التيار الصغير) بين القاعدة و الباعث فهذا أمر يعود لك وفقًا لطبيعة الدائرة التي تصممها.
</p>

<h3 id="-17">
	تطبيق عملي: دارة تغذية مؤقتة لحفظ معلومات الدائرة في الذواكر
</h3>

<p>
	ستجد مع تمرسك في تصميم الدوائر اﻹلكترونية أنك تحتاج إلى عناصر إلكترونية خاصة تُدعى الذواكر وتُستخدم لحفظ حالة الدائرة اﻹلكترونية عند إطفاء الدائرة أو عند حدوث خلل في التغذية الرئيسية كأن تحفظ قيمة عداد معين أو تخزّن توقيتًا مهمًا وغيرها. ومن غير المجدي الكتابة إلى الذاكرة في كل لحظة لأنها سترهق الذاكرة وتقصر عمرها الافتراضي الذي يقدر بعدد محدد من عمليات القراءة والكتابة. لهذا تزوّد الدوائر المماثلة بنظام تغذية ثانوي (بطارية ليثيوم دائرية عادةً) يعمل فقط ولفترة قصيرة جدًا عند انقطاع التغذية الرئيسية وذلك لتخزين حالة الدائرة.
</p>

<p>
	سنحاول في هذا التمرين تنفيذ مشروع لتحقيق الهدف ذاته. وفيه نحاكي مصدر تغذية رئيسي وآخر ثانوي عن طريق تشكيل مسريين موجبين ومسريين سالبين يمثلان مصدري تغذية منفصلين ثم نستخدم مكثفة تشحن من مصدر التغذية الرئيسي وعند انقطاع التغذية الرئيسية تفرّغ شحنتها مما يؤدي إلى مرور تيار في قاعدة ترانزستور ثنائي القطبية لفترة صغيرة حتى ينتهي تفريغها وخلال فترة التفريغ يمرر الترانزيستور التيار من مصدر التغذية الثانوي إلى مؤشر ضوئي يحاكي الذواكر ليضيء مستغلًا طاقة المنبع الثانوي كما تستغله عناصر الذاكرة لتخزين حالة الدائرة.
</p>

<p>
	نحتاج في هذا التطبيق إلى:
</p>

<ul>
	<li>
		مكثفة مستقطبة سعتها 330 ميكروفاراد جهدها 16 فولط.
	</li>
	<li>
		ترانزيستور قطبي من لطراز 2N2222.
	</li>
	<li>
		ديود من طراز 1N4007.
	</li>
	<li>
		مؤشران ضوئيان أخضر وأحمر جهد تشغيلهما لا يزيد عن 5 فولط.
	</li>
	<li>
		مقاومتين 2 كيلو أوم وأخرى قيمتها 10 كيلو أوم.
	</li>
	<li>
		منبع تغذية جهده 5 فولط.
	</li>
	<li>
		لوحة اختبار مثقبة.
	</li>
</ul>

<p>
	استخدم العناصر السابقة لتشكيل الدائرة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148079" href="https://academy.hsoub.com/uploads/monthly_2024_04/05_backup_memory_power_source.png.c967737bb9469840232340c994a37634.png" rel=""><img alt="05 backup memory power source" class="ipsImage ipsImage_thumbnailed" data-fileid="148079" data-unique="71e7r46jh" src="https://academy.hsoub.com/uploads/monthly_2024_04/05_backup_memory_power_source.thumb.png.02debce6d104b474318a4f9bd0c36b1f.png"> </a>
</p>

<p style="text-align: center;">
	دائرة إلكترونية على لوحة مثقبة تضم مكثف وديود وترانستور وبطارية ومقاومات ومؤشرات ضوئية
</p>

<ul>
	<li>
		صل رجل المقاومة 10 كيلو أوم إلى المسرى الموجب اليميني (الذي يمثل مصدر التغذية الرئيسي) والرجل اﻷخرى إلى الرجل اﻷطول للمؤشر الضوئي اﻷخضر ثم صل رجل المؤشر اﻷخرى إلى المسرى السالب.
	</li>
	<li>
		صل الرجل السالبة للمكثفة مع المسرى السالب ثم صل الرجل الموجبة مع مقاومة 2 كيلو أوم ثم صل الرجل اﻷخرى للمقاومة مع قاعدة الترانزيستور حتى تفرّغ المكثفة شحنتها عبر قاعدة الترانزيستور وتسمح له بتمرير التيار من مصدر التغذية الثانوي.
	</li>
	<li>
		صل مهبط الديود مع قاعدة الترانزيستور أيضًا ومصعده مع المسرى الموجب اليميني. إن الغاية من ذلك منع تيار شحن المكثفة من المرور عبر قاعدة الترانزيستور وفتح الترانزيستور فهذا يؤدي إلى تشغيل مصدر الطاقة الثانوي دون مبرر. في هذه الحالة يطبق الديود جهدًا موجبًا على القاعدة يعادل تمامًا جهد شحن المكثف فلن يمر تيار في القاعدة عندها ولن يفتح الترانزيستور.
	</li>
	<li>
		صل باعث الترانزيستور مع رجل مقاومة 2 كيلو أوم وصل الرجل اﻷخرى مع المسرى السالب ونستخدم هذه المقاومة لتحديد شدة التيار التي ستمر بالمؤشر الضوئي اﻷحمر الذي يحاكي الذواكر.
	</li>
	<li>
		صل أخيرًا الرجل الأطول للمؤشر الضوئي اﻷحمر مع المسرى الموجب اليساري (الذي يمثل التغذية الثانوية) والرجل اﻷخرى مع مجمع الترانزيستور، إذ يمر في هذا الفرع التيار الثانوي.
	</li>
	<li>
		صل القطب الموجب للبطارية بسلك مع المسرى الموجب اليميني وبسلك آخر مع المسرى الموجب اليساري ثم صل القطب السالب مع المسرى السالب المشترك (يمثل هنا مرجع مشترك).
	</li>
</ul>

<p>
	ستلاحظ أن المؤشر اﻷخضر سيضيء وفي نفس الوقت تُشحن المكثفة، ولن يضيء المؤشر اﻷحمر لأن الترانزستور الذي يتحكم بتيار التغذية الثانوي مغلق.
</p>

<p>
	اسحب السلك الذي يصل قطب البطارية الموجب مع المسرى اليميني محاكيًا انقطاع التغذية الرئيسية، عندها سبطفىء المؤشر اﻷخضر ويعمل المؤشر اﻷحمر لفترة حوالي 10 -20 ثانية ثم ينطفئ محاكيًا استخدام التيار الثانوي لفترة معينة كافية للذواكر بإنجاز عملها. هل يمكنك تفسير ما يحدث؟
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		كيف يمكن التمييز بين أرجل الترانزستور القطبي؟ حقيقة اﻷمر لا تستطيع غالبًا وعليك التجريب لكن في معظم اﻷحيان تكون الوسطى هي القاعدة. لكن باستخدام مقياس اﻵفو يمكنك ذلك. إذ يحتوي بعضها على الوظيفة Hef ومجموعة من الثقوب تسمى E,C,B هي القاعدة والمجمِّع والباعث. حرك مفتاح الوظيفة نحو Hef ، ثم اغرس هذه اﻷرجل في ثلاث ثقوب مختلفة التسميات فإن أعطى المقياس قراءة بالمئات تكون الرجل في الثقب B هي بالفعل قاعدة وهكذا، وإن لم يعطي قراءة بدّل بين اﻷرجل لتحصل على قراءة، وقد لا تحصل على شيء إن كان الترانزستور معطوبًا.
	</p>
</blockquote>

<h2 id="-18">
	مدخل إلى الدوائر الإلكترونية التماثلية والرقمية
</h2>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		نحتاج في التطبيقات العملية لهذه الفقرة إلى: مصدر تغذية 5 فولط، مقاومتين 10 كيلو أوم، ثلاث مقاومات 2 كيلو أوم، مقاومة 1 كيلو أوم، مقاومتين أكبر من 20 كيلو أوم، ترانزيستورين قطبين 2N2222، ثلاث ترانزستورات حقلية MOSFET من الطراز 2N2905A .
	</p>
</blockquote>

<p>
	يُعد مفهومي المقدار التماثلي والرقمي أمرًا مهمًا في فهم التطبيقات المتقدمة لعلم اﻹلكترونيات، وقد لا تحتاج إلى التعمق في هذه المفاهيم حاليًا لكن من المفيد إلقاء نظرة عليهما.
</p>

<h3 id="-19">
	المقادير التماثلية
</h3>

<p>
	نقول عن مقدار أنه تماثلي Analogue إذا تغيّرت قيمته تدريجيًا مع الوقت زيادة أو نقصانًا كزيادة شدة اﻹضاءة أو انخفاضها وتغير قيمة المقاومة تدريجيًا من قيمة إلى أخرى وارتفاع حرارة جهاز أو انخفاضها وهكذا. وتتميز هذه المقادير بأن تغيرها تدريجي بين القيمة العليا والدنيا.
</p>

<p>
	تُدعى الدوائر اﻹلكترونية التي تعطي خرجًا تماثليًا بالدوائر التماثلية، مثل الدوائر التي تتحكم بشدة اﻹضاءة أو شدة الصوت أو الحرارة.
</p>

<h4 id="-20">
	تطبيق عملي: إضاءة متفاوتة
</h4>

<p>
	سنستفيد في هذا التطبيق من ترانزستورات حقلية نتحكم فيها بالتيار الذي يستجره المؤشر الضوئي بتغيير الجهد الموجب المطبق على بوابة كل منها. لهذا شكل الدائرة البسيطة التالية من ثلاث مقاومات 2 كيلو وواحدة 1 كيلو وثلاث ترانزستورات حقلية كالتي أرنا إليها في بداية الفقرة:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148080" href="https://academy.hsoub.com/uploads/monthly_2024_04/06_dimmed_lights.png.9922b9a850f42059848a9c45cdd8c5fa.png" rel=""><img alt="06 dimmed lights" class="ipsImage ipsImage_thumbnailed" data-fileid="148080" data-unique="muje24334" src="https://academy.hsoub.com/uploads/monthly_2024_04/06_dimmed_lights.thumb.png.aa06e70bd12fe2648b125e1d46cdae60.png"> </a>
</p>

<p style="text-align: center;">
	دائرة إلكترونية على لوحة مثقية تضم ترانزستورات ومقاومات ومؤشرات ضوئية وبطارية
</p>

<ul>
	<li>
		لا تصل بوابة الترانزستور اﻷول (الرجل في المنتصف وحولها نقطة عادة) مع أي شيء وصل منبعه بمقاومة 2 كيلو أوم ومنها إلى المسرى السالب. صل الرجل اﻷطول للمؤشر الضوئي اﻷول مع المسرى الموجب واﻷخرى مع مصرف الترانزيستور. ضع هذه الدارة إلى يمين اللوحة المثقبة.
	</li>
	<li>
		صل بوابة الترانزستور الثاني مع مقاومة 1 كيلو أوم ثم صلها مع منبع التغذية الموجب. صل بعد ذلك منبعه ومصرفه بنفس طريقة الوصل السابقة. ضع هذه الدارة في الوسط.
	</li>
	<li>
		صل بوابة الترانزستور الثالث مع المسرى الموجب مباشرة، ثم صل منبعه ومصرفه كما في الحالتين السابقتين تمامًا.
	</li>
	<li>
		صل قطبي البطارية إلى المساري المناسبة، وراقب ما يحدث؟ هل تستطيع تحديد نوع الترانزستور الحقلي؟
	</li>
</ul>

<h3 id="-21">
	المقادير الرقمية
</h3>

<p>
	نقول عن مقدار أنه رقمي Digital إذا أخذ إحدى قيمتين فقط عليا ودنيا ولا يكون الانتقال بينهما تدريجيًا بل لحظيًا مثل تشغيل وإطفاء مؤشر ضوئي. تُستخدم القيمة الرقمية للتحقق من حالة شيء ما إن كان موصولًا أو مفصولًا. وتُبنى النظم المنطقية على أساس المقادير المنطقية فلو كانت قيمة الجهد عند نقطة ما 5 فولط مثلًا كانت القيمة المنطقية الموافقة هي 1 وإن كانت أقل من 1 فولط تكون القيمة المنطقية الموافقة 0 وهكذا.
</p>

<h4 id="and">
	تطبيق عملي: بوابة AND منطقية باستخدام الترانزيستورات القطبية
</h4>

<p>
	بوابة AND (معناها وَ بالعربية) هي عنصر إلكتروني يوصل التيار إلى خرجه إذا طبق على جميع مداخلها إشارة (تيار كهربائي طبعًا) أي حتى يعمل مثلًا المؤشر الضوئي الموصول إلى خرجها لا بد من تطبيق جهد ثابت على كل مداخلها.
</p>

<p>
	لتصميم بوابة AND ترانزيستورية ذات مدخلين ومخرج وتعمل كعنصر رقمي، شكّل الدائرة اﻹلكرتونية التالية من ترانزستورين قطبيين ومقاومتين أكبر من 20 كيلو أوم (كي لا نستهلك تيارًا كبيرًا) ومؤشر ضوئي:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148081" href="https://academy.hsoub.com/uploads/monthly_2024_04/07_and_gate.png.f4520cc209444210afbfb544274457fb.png" rel=""><img alt="07 and gate" class="ipsImage ipsImage_thumbnailed" data-fileid="148081" data-unique="ng8rzg42f" src="https://academy.hsoub.com/uploads/monthly_2024_04/07_and_gate.thumb.png.602855e7b4076ee4268321fcd03129d1.png"> </a>
</p>

<p style="text-align: center;">
	دائرة إلكترونية على لوحة مثقبة تضم ترانزيستورات ومقاومات ومؤشر ضوئي وبطارية
</p>

<ul>
	<li>
		صل مجمع الترانزستور الأول مع المسرى الموجب وصل باعثه مع مجمع الثاني ثم صل باعث الثاني مع الرجل اﻷطول للمؤشر الضوئي ورجله اﻷقصر مع مقاومة 2 كيلو أوم ومنها إلى المسرى السالب. يكون عندها باعث الترانزيستور الثاني هي مخرج البوابة أو رجل الخرج لها.
	</li>
	<li>
		صل قاعدة كل منهما بمقاومة أكبر من 20 كيلو أوم ثم صلهما إلى المسرى الموجب. تمثل القاعدتين مداخل البوابة أو أرجل الدخل.
	</li>
	<li>
		صل البطارية إلى اللوحة، ماذا سيحدث؟
	</li>
</ul>

<p>
	سيعمل الضوء لأن كلا المدخلين متصلان بجهد محدد. افصل اﻵن أي مقاومة منهما أو كلاهما عن المسرى الموجب و ينطفئ المؤشر. ما يحدث أن وصل قاعدة الترانزيستور اﻷول إلى جهد موجب سيمرر التيار من باعثه إلى مجمع الثاني وإن وصلت قاعدة الترانزيستور الثاني أيضًا إلى جهد موجب سيمرر التيار بدوره إلى المؤشر. وسيؤدي فصل أي من القاعدتين إلى عدم مرور التيار إلى المؤشر الضوئي.
</p>

<p>
	تهانينا لقد صممت اﻵن ابسط دائرة متكاملة لها ثلاثة أرجل مدخلين ومخرج، هل يمكنك إضافة بوابة دخل إضافية؟
</p>

<h2 id="-22">
	الخلاصة
</h2>

<p>
	أكملنا في هذا المقال ما بدأناه في المقال السابق من حيث التوسع قليلًا في شرح مفاهيم جديدة في الدوائر اﻹلكترونية والتعرف على الترانزيستورات وهي عناصر فعّالة شديدة الأهمية من خلال عدة تطبيقات عملية مفيدة تمهد لنا الطريق لمفهوم الدارات المتكاملة التي سنناقشها في مقال لاحق.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8A%D8%A7%D8%B1-%D9%88%D8%A7%D9%84%D8%AC%D9%87%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D9%83%D9%86%D8%A9-r2294/" rel="">أساسيات في عالم الإلكترونيات: التيار والجهد والعناصر الساكنة</a>
	</li>
	<li>
		<p>
			<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1967/" rel="">طريقة عمل الرابط الديناميكي مع المكتبات في معمارية الحاسوب</a>
		</p>
	</li>
	<li>
		<p>
			<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino%D8%9F-r1800/" rel="">ما هي لوحة أردوينو Arduino؟</a>
		</p>
	</li>
	<li>
		<p>
			<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1910/" rel="">تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو</a>
		</p>
	</li>
</ul>

<p>
	 
</p>
]]></description><guid isPermaLink="false">2299</guid><pubDate>Mon, 15 Apr 2024 12:00:01 +0000</pubDate></item><item><title>&#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x641;&#x64A; &#x639;&#x627;&#x644;&#x645; &#x627;&#x644;&#x625;&#x644;&#x643;&#x62A;&#x631;&#x648;&#x646;&#x64A;&#x627;&#x62A;: &#x627;&#x644;&#x62A;&#x64A;&#x627;&#x631; &#x648;&#x627;&#x644;&#x62C;&#x647;&#x62F; &#x648;&#x627;&#x644;&#x639;&#x646;&#x627;&#x635;&#x631; &#x627;&#x644;&#x633;&#x627;&#x643;&#x646;&#x629;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D9%81%D9%8A-%D8%B9%D8%A7%D9%84%D9%85-%D8%A7%D9%84%D8%A5%D9%84%D9%83%D8%AA%D8%B1%D9%88%D9%86%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D9%8A%D8%A7%D8%B1-%D9%88%D8%A7%D9%84%D8%AC%D9%87%D8%AF-%D9%88%D8%A7%D9%84%D8%B9%D9%86%D8%A7%D8%B5%D8%B1-%D8%A7%D9%84%D8%B3%D8%A7%D9%83%D9%86%D8%A9-r2294/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_04/788151463_.png.2c5821fdda917545070be7fd5ae23943.png" /></p>
<p>
	لربما قادك الفضول يومًا ما إلى فك مقبض لعبة بلاي ستيشن لغاية ما أو حاولت فك جهاز التحكم عن بعد لشاشة العرض في المنزل لتجد الخلل فيه بعد أن جرّبت طريقة "اﻹصلاح بالضرب المتكرر"ولم تفلح! في كلتا الحالتين ستجد لوحة خضراء اللون غالبًا تنتظم عليها قطع مختلفة اﻷحجام واﻷشكال وتنتظم وفق ترتيب محدد تصل بينها خطوط ناعمة محفورة ضمن جسم اللوحة. إنها الدائرة اﻹلكترونية التي تعطي للجهاز وظيفته. وتحتاج معظم التجهيزات الكهربائية واﻹلكترونية إلى هذه الدوائر اﻹلكترونية لتنظيم تغذيتها بالطاقة الكهربائية والربط بين أجزائها المختلفة ونقل اﻹشارات فيما بينها لأداء الوظيفة المطلوبة.
</p>

<p>
	إن الغاية اﻷساسية من الدوائر اﻹلكترونية هو التحكم بجريان التيار الكهربائي ﻹنجاز عمل مفيد أو إرسال نبضات كهربائية (تُدعى إشارات) أو استقبالها. ويُعد علم اﻹلكترونيات أساسًا للكثير من العلوم اﻷخرى مثل الاتصالات وعلوم الحاسب إضافة إلى دوره المحوري في تطوير مختلف أنظمة التحليل والقياس والمراقبة.
</p>

<p>
	سيكون علم اﻹلكترونيات محور مقالنا الذي نحاول فيه توضيح الكثير من المفاهيم اﻷساسية من خلال أمثلة تطبيقية بسيطة مبتعدين قدر اﻹمكان عن التفاصيل المربكة والحسابات الرياضية.
</p>

<h2 id="-1">
	ما تحتاجه لإكمال التمارين العملية في هذا المقال
</h2>

<p>
	إليك قائمة بالعناصر الإلكترونية والتجهيزات اللازمة لإكمال التطبيقات العملية:
</p>

<ul>
	<li>
		بطارية جهدها 5 فولط.
	</li>
	<li>
		مقاومات قيمها 1.2، 2.2، 6.8، 10 كيلو أوم
	</li>
	<li>
		مؤشرات ضوئية (ليد) تعمل عند جهد 5 فولط أو أقل (ثلاثة ويفضل من ألوان مختلفة).
	</li>
	<li>
		لوحة اختبار مثقبة (إن أردت فاﻷمر اختياري)
	</li>
	<li>
		مقياس كهربائي متعدد الوظائف AV multi-meter.
	</li>
	<li>
		مكثفة سعتها 470 ميكرو فاراد.
	</li>
	<li>
		ديودات من طراز 1N4007 (يكفي اثنان).
	</li>
</ul>

<h2 id="-2">
	مفاهيم أساسية في اﻹلكترونيات
</h2>

<p>
	نغطي في هذه الفقرة بعض أساسيات الكهرباء الضرورية لفهم عمل مختلف العناصر اﻹلكترونية واختيار المناسب منها لدوائرك.
</p>

<h3 id="-3">
	الشحنات الكهربائية: حركتها وطاقتها
</h3>

<p>
	تحمل الطاقة الكهربائية جسيمات دقيقة دُعيت سابقًا بالشحنات charges قبل أن تُكتشف طبيعتها الفعلية وهي اﻹلكترونات (ومن هنا جاءت التسمية علم اﻹلكترونيات). تستمد الشحنات الكهربائية طاقتها من عنصر في الدائرة اﻹلكترونية يُدعى الموّلد أو المنبع الذي يدفع هذه الشحنات إلى الحركة وينقل الطاقة الكهربائية إلى بقية عناصر الدائرة لتؤدي عملًا مفيدًا يستهلك جزءًا من الطاقة ويعود الجزء الباقي إليه فتكتمل الدائرة. تخيّل الأمر كما لو أن الشحنة الكهربائية هي سيارة مخصصة لنقل وجبات غذائية من المطبخ إلى نقاط العمل المختلفة في معمل ما. حيث تستهلك كل نقطة عمل كمية من الوجبات اللازمة للعمال فيها وتعود السيارات إلى المطبخ مع ما تبقى من وجبات.
</p>

<p>
	ولربما سمعت أن هنالك شحنات سالبة وأخرى موجبة، ولأن الموضوع معقد إلى حد ما، دعونا نتفق على أن الشحنة التي تحمل كامل طاقتها موجبة لأنها تساهم في تنفيذ اﻷعمال والشحنة التي استهلكت طاقتها وعادت إلى منبع الطاقة سالبة لأنه تستهلك طاقة المنبع.
</p>

<p>
	وهكذا تكون وظيفة المنبع تزويد الشحنات بالطاقة ثم تحريكها لنقل هذا الطاقة إلى النقاط المختلفة من الدائرة.
</p>

<h3 id="-4">
	مصادر التغذية الكهربائية المستخدمة في الدوائر اﻹلكترونية
</h3>

<p>
	يُستخدم في الدوائر اﻹلكترونية نوعان من التيار الكهربائي اﻷول يُدعى تيارًا مستمرًا Direct Current ويرمز له اختصارًا DC واﻵخر هو التيار المتناوب Alternating Current ويرمز له اختصارًا بالرمز AC. يختلف كل من النوعين عن اﻵخر بطريقة توليدهما وانتقالهما في الدوائر لكننا سنتعامل غالبًا مع التيار المستمر في الدوائر اﻹلكترونية، وإن كان ولابد من استخدام المتناوب، ستجد في الدائرة اﻹلكترونية دائرة فرعية لتحويله إلى تيار مستمر أو تزوّد التجهيزة بمحوّل كهربائي خارجي يحوّل التيار المتناوب إلى مستمر ولربما عرفته سابقًا باسم "شاحن charger" عندما تصل الهاتف المحمول به لتشحنه! فالشاحن في الواقع هو محوّل كهربائي لتحويل التيار المنزلي المتناوب إلى مستمر.
</p>

<p>
	نحصل على التيار المستمر لتغذية دوائرنا الكهربائية من مصدرين أساسيين:
</p>

<ul>
	<li>
		البطاريات: ولها أنواع وأشكال مختلفة وتتراوح جهودها بين 1.5 فولط و 24 فولط (سنتحدث عن الجهد لاحقًا). ومنها ما هو قابل لإعادة الشحن بعد استهلاك طاقتها مثل بطاريات الهواتف المحمولة ومنها ما يستخدم لمرة واحدة مثل بعض بطاريات الألعاب لكن البطاريات القابلة للشحن بدأت تحل محلها تدريجيًا.
	</li>
</ul>

<p>
	للبطارية قطبان اﻷول موجب وتجد بجواره الرمز (+) أو يكون أحمر اللون، واﻵخر سالب وتجد بجواره الرمز (-) أو يكون أسود اللون.
</p>

<ul>
	<li>
		المحولات: ويستخدمها المحترفون أو الهواة المتمرسون إذ تتصل بتيار المنزل المتناوب وتحوّله إلى تيار مستمر قابل للضبط على القيم المطلوبة وتتميز هذه المحولات باستقرار عملها. وللمحولات مدخلين لتوصيلها مع التيار المتناوب، وتجد بجوارهما رموزًا مثل (~) أو (L) أو (N)، أو قد يأتي مع كابل لوصله مباشرة بمأخذ التيار المتناوب. وله أيضًا مخرجين للتيار المستمر أو أكثر أحدهما موجب واﻵخر سالب.
	</li>
</ul>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148016" href="https://academy.hsoub.com/uploads/monthly_2024_04/01_battary.png.a57b8b6d4d5f63cb31a15f8baf368be4.png" rel=""><img alt="01 battary" class="ipsImage ipsImage_thumbnailed" data-fileid="148016" data-unique="zi62okdia" src="https://academy.hsoub.com/uploads/monthly_2024_04/01_battary.png.a57b8b6d4d5f63cb31a15f8baf368be4.png"> </a>
</p>

<p>
	<strong>تنبيه</strong>: يُرجى الحذر عند استخدام مصادر الطاقة الكهربائية وخاصة عند استخدام المحولات والبطاريات ذات الجهود المرتفعة. ويمنع اﻷطفال من التعامل معها إلا بوجود اﻷهل أو مدرّب مختص.
</p>

<h3 id="-5">
	الجهد الكهربائي وشدة التيار
</h3>

<p>
	<strong>الجهد الكهربائي</strong> ببساطة هو الفرق بين طاقة الشحنات قبل دخولها إلى العنصر اﻹلكتروني وبعد خروجها ويحدد مصدر التغذية أعلى قيمة لطاقة الشحنات ويُقاس بواحدة الفولط volt ويرمز لها اختصارًا v.
</p>

<p>
	وتحتاج العناصر إلى مقدار معين من الطاقة حتى تعمل وإذا زاد مقدار هذه الطاقة أكثر من الحدود المسموحة ستُخرّب العنصر. لهذا تجد في ورقة مواصفات أية عنصر مجال الجهد الكهربائي الذي يعمل عنده. فالمؤشرات الضوئية تعمل عادة عند جهد يتراوح بين 3.5 إلى 5 فولط، وقد تجد أنواعًا تعمل عند جهد أعلى أو أقل لهذا نستخدم ما يناسب الجهد الأعظمي في الدائرة وهو جهد مصدر التغذية. فلو استخدمت بطارية توّلد طاقة مقدارها 5 فولط سيكون هذا الجهد هو أعلى جهد يمكن قياسه في الدائرة وبالتالي عليك استخدام عناصر إلكترونية قيمة جهودها أقل أو تساوي 5 فولط.
</p>

<p>
	أما <strong>شدة التيار الكهربائي</strong> فتمثل كمية الشحنات التي تمر في العنصر الكهربائي وكلما احتاج العنصر إلى كمية أكثر من الشحنات المحمّلة بالطاقة زادت شدة التيار التي يستجرها من مصدر التغذية والعكس صحيح. تقدر شدة التيار الكهربائي الذي يستجره العنصر بواحد اﻷمبير Amper ويرمز له اختصارًا A.
</p>

<p>
	يختلف استجرار العناصر للتيار الكهربائي وفقًا لطبيعة عملها فالمؤشر الضوئي مثلًا قد يحتاج إلى 100 ميلي أمبير (أي عُشر الأمبير). ويحاول مصدر التغذية عمومًا تزويدك بشدة التيار التي تحتاجها لكن إلى حد معّين يتعلق بطريقة تصميمه وقد تُذكر شدة التيار العظمى التي يقدمها المنبع أحيانًا وقد لا تذكر، لكن بشكل عام إن كان جهد تشغيل العنصر أقل من جهد مصدر التغذية، سيتدبر مصدر التغذية شدة التيار التي يحتاجها العنصر.
</p>

<h3 id="avmutitmeter">
	تطبيق عملي: استخدام مقياس اﻵفو متعدد الوظائف AV mutit-meter
</h3>

<p>
	يستخدم المقياس الكهربائي متعدد الوظائف لقياس الجهد الكهربائي بين طرفي العناصر اﻹلكترونية لمعرفة استهلاكها من الطاقة، كما يستخدم لقياس شدة التيار الكهربائي في أحد فروع الدائرة إضافة إلى العديد من القياسات اﻷخرى التي نتكلم عنها تباعًا. من أكثر المقاييس شيوعًا في وقتنا الراهن نجد المقاييس اﻹلكترونية التي تقيس قيمة الجهد أو شدة التيار وتعرضه رقميًا على شاشة الجهاز.
</p>

<p>
	يتكون المقياس بأبسط أشكاله من كابلين في نهاية كل منهما مسبر على شكل إبرة ومفتاح قابل للدوران ننقله إلى مجال القياس ونوع القيمة التي نقيسها. فإن أردت أن تقيس جهد التيار المستمر الذي نتوقعه بين 0 إلى 10 فولط، نحرّك المفتاح ليصل إلى مجال قياس الجهد المستمر (قد يكون له لون معين وتجد إلى جواره الرمز ⎓) ثم نحدد مجال القياس من 0-10 ونشغل المقياس. ونضع بعد ذلك نهايتي المسبرين على طرفي العنصر ونقرأ القيمة الظاهرة.
</p>

<p>
	جرّب أن تشكل الدائرة البسيطة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148019" href="https://academy.hsoub.com/uploads/monthly_2024_04/02_simple_circuit.png.f4eaf7a0c16a9d6a7c99d706d751fa94.png" rel=""><img alt="02 simple circuit" class="ipsImage ipsImage_thumbnailed" data-fileid="148019" data-unique="73a8d24n4" src="https://academy.hsoub.com/uploads/monthly_2024_04/02_simple_circuit.thumb.png.669d3238cc5659e1d6d9def0542cbc37.png"> </a>
</p>

<p style="text-align: center;">
	دائرة إلكترونية على لوحة اختبار مثقبة تضم مقاومة وبطارية ومؤشر ضوئي
</p>

<p>
	نحتاج إلى بطارية جهدها 5 فولط وعنصر مقاومة بقيمة 5 أوم ومؤشر ضوئي يعمل عند جهد 5 فولط ومقياس آفو، أسلاك نحاسية مغلّفة ﻹجراء التوصيلات قطرها 0.5 ميلي متر ولوحة اختبار مثقبة.
</p>

<p>
	صل القطب الموجب للبطارية بسلك ثم اغرس نهايته اﻷخر في إحد المجاري الأفقية للوحة المثقبة وافعل اﻷمر ذاته مع القطب السالب و<strong>انتبه إلى عدم توصيلهما إلى نفس المجرى</strong>. صل بعد ذلك أحد أرجل عنصر المقاومة إلى المجرى الموجب والرجل اﻷخرى إلى أحد المجاري العمودية ثم صل الرجل الأطول للمؤشر الضوئي إلى نفس مجرى المقاومة وجله اﻷقصر إلى مجرى عمودي جديد ثم صل المجرى الجديد بسلك إلى المجرى السالب. سترى عندها أن المؤشر أصدر ضوءًا.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		إن لم ترد استعمال لوحة مثقبة: صل القطب الموجب للبطارية برجل المقاومة &gt; الرجل الثانية للمقاومة مع الرجل اﻷطول للمؤشر الضوئي &gt; الرجل اﻷقصر للمؤشر الضوئي مع القطب السالب. وبإمكانك الاستعانة بأسلاك إن لم تكن اﻷرجل طويلة بما يكفي
	</p>
</blockquote>

<h4 id="-6">
	قياس الجهد بين طرفي المؤشر الضوئي
</h4>

<p>
	صل الكبل اﻷسود إن لم يكن موصولًا إلى المقياس بالمأخذ اﻷسود وستجد إلى جواره عادة الكلمة "COM"، ثم صل الكابل الأحمر بالمأخذ اﻷحمر وقد تجد إلى جواره الرمز (V). حرّك مفتاح الوظائف حتى يصل إلى مجال قياس الجهد المستمر وهو المجال المعلّم بالرمز (⎓). اختر المجال 10 أو 20 فولط (أي أنك تريد القياس في المجال بين 0 و 10 فولط أو 0 إلى 20 فولط وفقًا لنوع المقياس الذي تستخدمه). اضغط زر تشغيل المقياس.
</p>

<p>
	تظهر عادة على الشاشة القيمة 0.00 ويكون المقياس جاهزًا للعمل. ولقياس الجهد بين طرفي المؤشر ضع مسبري المقياس على رجلي المؤشر مباشرة أو ضمن المجريين الخاصيين بهما في اللوحة المثقبة واقرأ نتيجة المقياس بواحدة الفولط.
</p>

<h4 id="-7">
	قياس شدة التيار الذي يمر في الدائرة
</h4>

<p>
	بدل مأخذ الكابل اﻷحمر إلى مأخذ قياس شدة التيار وتجد إلى جواره الرمز (A) أو (mA) وقد تجد مأخذين أحدهما أحمر اللون واﻵخر أسود، اختر المأخذ إن وجد. حرك مفتاح الوظائف إلى حتى يصل مجال قياس شدة التيار المستمر وهو المجال المعلّم بالرمز ثم اختر المجال (10 mA). اضغط زر تشغيل المقياس
</p>

<p>
	لقياس شدة التيار نستخدم أسلوبًا مختلفًا عن قياس الجهد ندعوه الوصل على التسلسل، لهذا عليك فصل رجل اﻷقصر للمؤشر الضوئي عن المجرى السالب ثم وصله بالمسبر اﻷحمر الموجب للمقياس ثم وصل المسبر الأسود السالب للمقياس مع القطب السالب، أي نوصل المقياس وكأنه جزء من تسلسل الدائرة. اقرأ النتيجة اﻵن بواحدة الميلي أمبير
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148020" href="https://academy.hsoub.com/uploads/monthly_2024_04/03_multi_meter_volt_amper.png.e1ddcc97ca3160864ac192a692bf02a7.png" rel=""><img alt="03 multi meter volt amper" class="ipsImage ipsImage_thumbnailed" data-fileid="148020" data-unique="0iw9b57en" src="https://academy.hsoub.com/uploads/monthly_2024_04/03_multi_meter_volt_amper.png.e1ddcc97ca3160864ac192a692bf02a7.png"> </a>
</p>

<p style="text-align: center;">
	مقياس متعدد الوظائف يقيس إلى اليمين الجهد وإلى اليسار شدة التيار
</p>

<h2 id="-8">
	نظرة أولى إلى العناصر اﻹلكترونية اﻷساسية: العناصر الساكنة
</h2>

<p>
	العناصر الساكنة Passive components هي عناصر مهمتها الفعلية استغلال التيار الكهربائي بتحويله إلى ضوء أو حرارة أو تبديده بكل بساطة أو إيقاف جريانه. فيما يلي شرحًا مبسطًا لبعض العناصر اﻹلكترونية الساكنة شيوعًا ومبررات استخدامها
</p>

<h3 id="-9">
	المقاومات
</h3>

<p>
	المقاومة resistor هو عنصر تعيق تدفق الشحنات الكهربائية مسببة انخفاضًا في شدة التيار الكهربائي الذي يصلها. وللمقاومات انواع كثيرة تتعلق بطريقة تصنيعها، وتقاس قيمتها بوحدة اﻷوم Ohm.
</p>

<p>
	للمقاومة رجلان تواصلانها مع الدائرة، ولا فرق أين ستل كل رجل وأكثرها شيوعًا في عالم الهواة هي المقاومات السيراميكية التي تظهر على شكل قطعة منفوخة الطرفين وعليها خطوط ملونة تدلك وفق ترتيبها على قيمة هذه المقاومة. لكن إن لم ترد تعلّم قراءة هذه الخطوط حاليًا فاستعن بمقياس آفو.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148022" href="https://academy.hsoub.com/uploads/monthly_2024_04/04_resistor.png.17fd2a355897f04dc6c763e2d310f0e4.png" rel=""><img alt="04 resistor" class="ipsImage ipsImage_thumbnailed" data-fileid="148022" data-unique="rxv39kipw" src="https://academy.hsoub.com/uploads/monthly_2024_04/04_resistor.png.17fd2a355897f04dc6c763e2d310f0e4.png"> </a>
</p>

<p style="text-align: center;">
	مقاومة سيراميكية في الأعلى ورمزها في المخططات الإلكترونية في الأسفل
</p>

<h4 id="-10">
	استخدامات عنصر المقاومة
</h4>

<p>
	إن الاستخدام اﻷساسي للمقاومة هو تحديد شدة التيار الذي تريده أن يمر في فرع من فروع الدائرة. فلو عدنا إلى تطبيقنا العملي السابق الذي وصلنا فيه الدائرة التي التي تنير المؤشر الضوئي نلاحظ أننا استخدمنا مقاومة قياسها 5 كيلو أوم وذلك لجعل التيار الذي يمر في الدائرة (باعتبارها فرع واحد أو حلقة واحدة) هي 100 ميلي أمبير كي يتناسب مع التيار الذي يحتاجه المؤشر الضوئي لأن أية الشدة الزائدة للتيار ستؤدي إلى تخريب هذا العنصر.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		هناك نوع خاص من المقاومات تُدعى مقاومات متغيرة أي تتغير قيمتها إما بتدوير مفتاح موصول بها أو عند تعرضها لعوامل خارجية مثل اﻹضاءة إذ تزيد المقاومة عند تعرضها للضوء وتُعرف بالمقاومات الضوئية.
	</p>
</blockquote>

<h4 id="-11">
	تطبيق عملي: مقاومات مختلفة وإضاءة مختلفة
</h4>

<p>
	استخدم نفس منيع التيار الكهربائي الذي استخدمناه في المثال السابق ونفس اللوحة المثقبة (إن قررت استخدام واحدة) ثم ركب الدائرة البسيطة التالية المكونة من ثلاث مقاومات مختلفة وثلاث مؤشرات ضوئية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148024" href="https://academy.hsoub.com/uploads/monthly_2024_04/05_many_resistors.png.c6c5c2bb3f72e673de34ee5bb8c0ac93.png" rel=""><img alt="05 many resistors" class="ipsImage ipsImage_thumbnailed" data-fileid="148024" data-unique="bi4buxn9g" src="https://academy.hsoub.com/uploads/monthly_2024_04/05_many_resistors.png.c6c5c2bb3f72e673de34ee5bb8c0ac93.png"> </a>
</p>

<p style="text-align: center;">
	مخطط دائرة إلكترونية لتشغيل مؤشرات ضوئية بمستويات إضاءة مختلفة
</p>

<p>
	صل أولًا أحد أرجل المقاومة 1 كيلو أوم بالمسرى الموجب للوحة المثقبة ثم الرجل اﻷخرى بالرجل الطويلة للمؤشر الضوئي اﻷول والرجل اﻷقصر له بالمسرى السالب. كرر نفس الخطوات مع المقاومة 6.8 والمؤشر الضوئي الثاني ثم المقاومة 10 كيلو أوم والمؤشر الثالث. صل بعد ذلك القطب الموجب للبطارية مع المسرى الموجب والقطب السالب مع المسرى السالب. راقب ما يحدث وسجل النتائج في مذكرتك.
</p>

<p>
	<strong>تمرين إضافي</strong>: جرّب أن تستخدم مقياس اﻵفو لقياس هبوط الجهد وشدة التيار عند كل مقاومة بنفس أسلوب القياس الذي تعلمناه سابقًا. هل يمكنك ربط قيمة الجهد وشدة التيار وقيمة المقاومة مع بعضها البعض؟
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ستجد خلال القياسات السابقة أن قيمة الجهد V (مقدرًا بالميلي فولط) هي: <code>V = R.I</code> حيث R هي قيمة المقاومة (مقدرة باﻷوم) وI شدة التيار (مقدرة بالميلي أمبير).
	</p>
</blockquote>

<h3 id="-12">
	المكثفات
</h3>

<p>
	المكثفات Capacitors هي عناصر إلكترونية مهتمها التخزين المؤقت للشحنات الكهربائية. للمكثفات أشكال وأنواع عديدة ولكل منها استخداماته الخاصة، لكن أكثر ما قد تصادفه كهاوٍ ستجد المكثفات الكهرليتية اﻷسطوانية الشكل والمكثف السيراميكي عدسي الشكل (على شكل حبة العدس).
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148025" href="https://academy.hsoub.com/uploads/monthly_2024_04/06_capacitor.png.fec348a7fe185495e619dda347c6eaf2.png" rel=""><img alt="06 capacitor" class="ipsImage ipsImage_thumbnailed" data-fileid="148025" data-unique="df84lnoyw" src="https://academy.hsoub.com/uploads/monthly_2024_04/06_capacitor.png.fec348a7fe185495e619dda347c6eaf2.png"> </a>
</p>

<p style="text-align: center;">
	مكثفتان سيراميكية عدسية إلى اليمين وكهرليتية مستقطبة إلى اليسار في الأعلى ورمز المكثفة في المخططات الإلكترونية في الأسفل
</p>

<p>
	للمكثفة سعة معينة لتخزين الشحنات الكهربائية وتقاس هذه السعة بوحدة الفاراد Farad ولأنها واحد كبيرة سترى أن الوحدات اﻷكثر استخدامًا هي الميكروفاراد (وهو جزء من مليون من الفاراد) والنانو فاراد (وهو جزء من بليون من الفاراد). تكتب قيمة السعة على جسم المكثفة اﻷسطوانية مباشرة وتعطى على شكل رموز على على العدسية.إضافة إلى ذلك لا بد من الانتباه إلى جهد الشن للمكثف ويكتب على غلافها مباشرة ولا يجب أبدًا وصلها إلى جهد أعلى من الجهد الاسمي المحدد لها.
</p>

<p>
	تتميز المكثفات الكهرليتية بأنها مستقطبة أي يجب وصل الرجل ذات القطبية الموجبة مع المسرى الموجب والرجل ذات القطبية السالبة مع المسرى السالب. نميّز الرجل السالب للمكثفة بوجود خط أبيض عريض طولي على جانب جسم المكثفة وبداخله إشارة (-).
</p>

<p>
	عند وصل رجلي المكثفة إلى مصدر تغذية كهربائي تبدأ بتجميع الشحنات خلال فترة زمنية محدد تتعلق بسعة المكثفة وجهد مصدر التغذية، لهذا يرتفع الجهد بين طرفيها وصولًا إلى جهد الشحن (جهد مصدر التغذية). تحتفظ المكثفة بشحنتها طالما لا تتصل بعناصر إلكترونية تستنزف شحنتها، لكن عند ربطها مع مقاومة مثلًا أو مؤشر ضوئي ونظرًا لكونها تمثل منبع تغذية ضعيف جدًا تستهلك تلك العناصر طاقتها (الشحنة المختزنة فيها) تدريجيًا ونقول أن المكثفة عندها في مرحلة تفريغ الشحنة.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		<strong>تنبيه</strong>: تخزن المكثفة شحنة كهربائية وتفرغها إذ وصل بين رجليها وقد ينتج عنها تيارات كهربائية مؤذية وخاصة إن كان جهد الشحن مرتفعًا وسعة المكثفة كبيرة، فلا تحاول لمس طرفي المكثفات الكبيرة الحجم بيديك.
	</p>
</blockquote>

<h4 id="-13">
	أين تستخدم المكثفات؟
</h4>

<p>
	تمنع المكثفات مرور التيار الكهربائي في دوائر التيار المستمر أو في فرع منها وذلك عندما تصل إلى كامل شحنتها. لكنها في المقابل لا تمنع مرور التيار المتناوب لطبيعتها الخاصة. لذلك ستجد أن استخدامها بالنسبة لك كهاوٍ أو مبتدئ ينحصر في عدة أعمال فقط:
</p>

<ul>
	<li>
		تزويد المفاتيح اﻹلكترونية (مثل الترانزستورات التي نتكلم عنها لاحقًا) بتارات أو جهود صغيرة خلال فترة وجيزة ومحسوبة كي تعمل هذه المفاتيح خلال هذه الفترة الصغيرة. لهذا اﻷمر عدد كبير جدًا من التطبيقات العملية.
	</li>
	<li>
		تنعيم التيار المستمر الناتج عن محوّلات تحويل التيار المتناوب إلى تيار مستمر.
	</li>
	<li>
		ترشيح الضجيج الناتج عن مصادر التغذية وخاصة المحوّلات، فالضجيج يشبه في طبيعته التيار المتناوب لهذا نستخدم المكثفة في تمريرها خارج الدائرة.
	</li>
</ul>

<h4 id="-14">
	تطبيق عملي: مراقبة تفريغ المكثفة
</h4>

<p>
	استخدم المكثفة والمقاومتين والمؤشر الضوئي لتشكل الدائرة البسيطة التالية، واستخدم أسلاك التوصيل إن أردت:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148026" href="https://academy.hsoub.com/uploads/monthly_2024_04/07_cap_charge_discharge.png.fa78807a1b3001b650f570556a895fa3.png" rel=""><img alt="07 cap charge discharge" class="ipsImage ipsImage_thumbnailed" data-fileid="148026" data-unique="nqm4yi3q4" src="https://academy.hsoub.com/uploads/monthly_2024_04/07_cap_charge_discharge.png.fa78807a1b3001b650f570556a895fa3.png"> </a>
</p>

<p style="text-align: center;">
	لوحة اختبار مثقبة المسرى السالب في الخط الأفقي الأول والموجب في الثاني مع مكثفة ومقاومة ومؤشر ضوئي وبطارية
</p>

<ul>
	<li>
		صل الرجل الأولى للمقاومة 2 كيلو أوم مع المسرى الموجب للوحة المثقبة ثم صل الرجل الثانية مع الرجل اﻷطول للمؤشر الضوئي.
	</li>
	<li>
		صل الرجل الثانية للمؤشر الضوئي.
	</li>
	<li>
		صل الرجل الأولى للمقاومة 10 كيلو أوم إلى الرجل الموجبة للمكثفة والرجل الثانية للمقاومة إلى المسرى الموجب.
	</li>
	<li>
		صل الرجل السالبة للمكثفة مع المسرى السالب.
	</li>
	<li>
		صل بعد ذلك القطب الموجب للبطارية بسلك مع المسرى الموجب والقطب السالب للبطارية مع المسرى السالب وراقب كيف يضيء الموشر مباشرة.
	</li>
	<li>
		اسحب السلك القادم من البطارية من المسرى الموجب، ماذا تلاحظ؟
	</li>
</ul>

<p>
	عند تزويد الدائرة بالتغذية الكهربائية يضيء المؤشر الضوئي وتبدأ المكثفة بالشحن حتى تمتلئ، وبمجرد فصل القطب الموجب للتغذية عن الدائرة تفرّغ المكثفة شحنتها في الدائرة، لهذا لا ينطفئ المؤشر مباشرة بل ببطئ حتى تنفذ شحنة المكثفة.
</p>

<h3 id="-15">
	ثنائي المساري (الديود)
</h3>

<p>
	ثنائي المسار اﻹلكتروني أو الديود diode وهو الاسم اﻷكثر شيوعًا هو عنصر إلكتروني ذو طبيعة خاصة يمرر التيار الكهربائي باتجاه واحد فقط ومن النقطة ذات الجهد اﻷعلى إلى النقطة ذات الجهد اﻷقل ولا يمرر التيار بشكل معاكس.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148027" href="https://academy.hsoub.com/uploads/monthly_2024_04/08_diode.png.1727dcec94ed6dc4663959c5a966fadb.png" rel=""><img alt="08 diode" class="ipsImage ipsImage_thumbnailed" data-fileid="148027" data-unique="2466toot3" src="https://academy.hsoub.com/uploads/monthly_2024_04/08_diode.png.1727dcec94ed6dc4663959c5a966fadb.png"> </a>
</p>

<p style="text-align: center;">
	صورة واقعية لديود في الأعلى وتمثيله في المخططات الإلكترونية في الأسفل
</p>

<p>
	ومن الميزات المهمة التي ينبغي الانتباه إليها عند استخدام الديود هو الجهد اﻷعظمي الذي يمكن تطبيقه بين طرفية فلا يجب أن تتجاوز قيمة الجعد القيمة العظمى المسموحة فقد يتعرض للاحتراق أو الانفجار.
</p>

<p>
	تُدعى رجل الديود التي توصل إلى النقطة اﻷكثر إيجابية بالمصعد Anode والرجل التي توصل إلى النقطة اﻷقل سلبية مهبطًا cathode، وبإمكانك تمييز المهبط من الخط اﻷبيض المجاور له على جسم الديود. ويشبه الدود في شكله شكل المقاومة لكنه أسود اللون دون انتفاخات في طرفيه.
</p>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		يُكتب على جسم الديود عادة أحرف وأرقام تبدأ (وفق الترميز اﻷميركي) بالرمز 1N مثل 1N4004
	</p>
</blockquote>

<h4 id="-16">
	أين يُستخدم الديود
</h4>

<p>
	للديود وظيفة واحدة هو منع التيار الكهربائي من المرور في أحد فروع الدائرة، ولهذه الوظيفة تطبيقات عملية كثيرة مثل:
</p>

<ul>
	<li>
		الحماية من عكس القطبية أي وصل القطب الموجب لمنبع التغذية بالخطأ إلى المسرى السالب للدائرة.
	</li>
	<li>
		تخفيض الجهد في أحد فروع الدائرة فكل ديود يخفض الجهد بحدود 0.6 فولط تقريبًا.
	</li>
	<li>
		تطبيقات خاصة بالتيار المتناوب وهي خارج إطار هذا المقال.
	</li>
</ul>

<blockquote class="ipsQuote" data-ipsquote="">
	<div class="ipsQuote_citation">
		اقتباس
	</div>

	<p data-gramm="false">
		ثنائي مساري زينر أو ديود زينر وهو ديود يمنع مرور التيار الكهربائي عند عكس القطبية لكنه ينهار عندما يزيد فرق الجهد المطبق بين قطبيه عن قيمة محددة خاصة بكل زينر ويمرر التيار الكهربائي. كما أن المؤشر الضوئي هو نوع خاص من الديودات يصدر الضوء.
	</p>
</blockquote>

<h4 id="-17">
	تطبيق عملي: منع مرور التيار الكهربائي
</h4>

<p>
	استخدم المقاومتين والديودين والمؤشرين الضوئيين لتنفيذ الدائرة البسيطة التالية:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="148028" href="https://academy.hsoub.com/uploads/monthly_2024_04/09_diode_circuit.png.170cdee551a9459bec35e8a489129d37.png" rel=""><img alt="09 diode circuit" class="ipsImage ipsImage_thumbnailed" data-fileid="148028" data-unique="srx72ilry" src="https://academy.hsoub.com/uploads/monthly_2024_04/09_diode_circuit.png.170cdee551a9459bec35e8a489129d37.png"> </a>
</p>

<p style="text-align: center;">
	لوحة اختبار مثقبة تضم ديود ومؤشر ضوئي ومقاومة وبطارية
</p>

<ul>
	<li>
		صل مصعد الديود مع المسرى الموجب والمهبط مع طرف المقاومة، ثم صل طرفها اﻵخر مع الرجل اﻷطول للمؤشر الضوئي والرجل اﻷقصر مع المسرى السالب.
	</li>
	<li>
		صل مهبط الديود مع المسرى الموجب والمصعد من طرف المقاومة، ثم صل طرفها اﻵخر مع الرجل اﻷطول للمؤشر الضوئي والرجل اﻷقصر مع المسرى السالب.
	</li>
</ul>

<p>
	صل البطارية إلى مساري الدائرة، ولاحظ كيف يضيء أحد المؤشرين ولا يضيء اﻵخر، هل يمكنك تفسير ذلك؟
</p>

<h2 id="-18">
	الخلاصة
</h2>

<p>
	تعرفنا في هذا المقال على بعض أساسيات علم الكهرباء وألقينا نظرة علمية وعملية على بعض العناصر اﻷساسية الهامة في تكوين الدوائر اﻹلكترونية. سنتابع في الجزء الثاني من هذا المقال التعرف على أمور هامة في تكوين الدوائر اﻹكترونية ونتعرف على مزيد من العناصر المهمة.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D9%82%D9%8A%D8%A7%D8%AF%D8%A9-%D8%A7%EF%BB%B5%D9%84%D8%A7%D8%AA-r2276/" rel="">دليلك الشامل إلى تعلم أساسيات التحكم وقيادة اﻵلات</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">برمجة الروبوت: الدليل الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r2078/" rel="">تجميع راسبيري باي والتحضير لاستخدامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AD%D8%B3%D9%8A%D8%A9-%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1934/" rel="">تصميم وتنفيذ لعبة حسية تفاعلية باستخدام لوحة راسبيري باي بيكو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1910/" rel="">تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2294</guid><pubDate>Sun, 07 Apr 2024 12:07:00 +0000</pubDate></item><item><title>&#x623;&#x641;&#x636;&#x644; &#x644;&#x63A;&#x627;&#x62A; &#x628;&#x631;&#x645;&#x62C;&#x629; &#x627;&#x644;&#x631;&#x648;&#x628;&#x648;&#x62A;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%81%D8%B6%D9%84-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA%D8%A7%D8%AA-r2285/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/---.png.db6f52b98dc2a84f87b1c8b9ac33ad4a.png" /></p>
<p>
	يعد انتشار الذكاء الاصطناعي والروبوتات أمراً مثيراً للفضول لمعظم الأشخاص حول العالم، فهو يعدهم بمستقبلٍ أفضل وأسهل للبشرية، فهو أحد سبل الراحة والرفاهية إضافةً إلى كونه يسهّل عمل العديد من الأشخاص في قطّاع التكنولوجيا.
</p>

<p>
	ولتستطيع صناعة وهندسة الروبوتات عليك أن تتقن اللغة التي تتحدثها وتتواصل مع العالم الخارجي من خلالها، وهنا يأتي دور لغات برمجة الروبوتات، التي تمنح الروبوتات القدرة والذكاء لإنجاز المهام بشكلٍ مشابهٍ للأسلوب البشريّ.
</p>

<p>
	سنتحدّث عن كيفيّة برمجة الروبوتات وأشهر اللغات المستخدمة في هذا المجال كما سنخبرك بالمسار الصحيح الذي يجب أن تسلكه لتكون مبرمج روبوتاتٍ ناجحاً وتشارك في بناء هذا المستقبل الواعد.
</p>

<h2 id="-1">
	ما هي برمجة الروبوتات
</h2>

<p>
	تعرّف برمجة الروبوتات بأنها التعليمات المحددة المدخلة إلى نظام التحكّم الخاص بالروبوت لتنفيذ مهام معيّنة. وتحدّد هذه التعليمات الطريقة التي يعمل بها الروبوت والمهام التي يقدر على تنفيذها. وتتمّ هذه العملية بأسلوبين:
</p>

<ul>
	<li>
		برمجة الروبوتات بشكل مباشر: وذلك من خلال تحريك ذراع الروبوت، على سبيل المثال عبر سلسلة من الوضعيات التي تُسجَّل وتُحفظ في أنظمة التحكم الخاصة بالروبوت.
	</li>
	<li>
		برمجة الروبوتات بشكل منفصل: وهي عندما يقوم المبرمج بكتابة تعليمات دقيقة ومفصّلة على الحاسوب للتحكم بحركات الروبوت ومن ثمّ يحمل هذه التعليمات على الروبوت.
	</li>
</ul>

<p>
	ولبرمجة الروبوت، نستخدم العديد من اللغات البرمجية، وجميعها فعّالة وقادرة على أداء المهمة إلا أن أفضل لغات برمجة الروبوتات هي C أو C++‎ و Python و Java وغيرها من اللغات التي سنتعرف عليها بعد قليل، وتختلف اللغات المستخدمة باختلاف الشركات المصنعة التي غالباً ما تعتمد على برامجها الخاصة لبرمجة الروبوتات، ما يعني أنّ قدرتك على العمل مع روبوت من تصنيع شركة تجارية معينة لا يعني بالضرورة قدرتك على العمل مع روبوت مصنّع من قبل شركةٍ أخرى.
</p>

<h2 id="-2">
	لغات برمجة الروبوتات
</h2>

<p>
	تنقسم اللغات التي سنناقشها هنا ما بين مستوى مبتدأ ومستوى متقدّم، ويعتمد قرارك على الاعتماد على إحدى اللغات بناءً على مستواك البرمجي والتقني عمومًا. ما يعني أنّك ستبدأ رحلتك في مجال برمجة الروبوتات من مرحلةٍ متقدّمة إن كنت مهندس برمجيات قبل ذلك. وسواء كنت متخصصًا أو مبتدئًا من المهم أن تتعلم اللغة التي ستوصلك إلى حيث تريد أن تكون في مجال الروبوتات وتضع حياتك المهنية على المسار الصحيح.
</p>

<h3 id="-3">
	المستوى المبتدئ
</h3>

<p>
	بدايةً؛ لا تركّز على الجانب النظري فقط وتبدأ بقراءة كتاب نظري في محاولةٍ لتعلم الخوارزميات المتقدمة المستخدمة في هذا المجال، وإلّا ستشعر بالملل وتفقد شغفك بعد عدة أيام.
</p>

<p>
	بدلًا من ذلك اقرن المعلومات النظري بالتنفيذ العملي، وذلك بالعمل على المشاريع المتعلّقة ببرمجة الروبوتات وبهذه الطريقة يكون لديك هدف واضح ويصبح مسار التعلم الخاص بك ببساطة هو كل ما تحتاج إلى معرفته لتحقيق هدفك. لذا، أثناء قيامك بمشاريع رائعة، ستكتسب المعرفة كمنتج ثانوي! وفي هذه الأثناء ستتعلم لغة البرمجة الأنسب بحسب المشروع الذي تعمل عليه.
</p>

<p>
	لكن لنبسّط الأمر قليلًا؛ سنحدّثك عن أفضل لغات برمجة الروبوتات للمبتدئين التي تتميّز بخصائص تعطيها الأفضلية على لغات البرمجة الأخرى مثلسهولة الاستخدام، وعتمادها على كتل شيفرات برمجية جاهزة مسبقًا بدلاً من كتابتها من الصفر، واستخدامها لواجهات متناسبة مع خبرات المبتدئين من مجالات البرمجة.
</p>

<p>
	من أفضل لغات برمجة الروبوتات للمبتدئين نذكر:
</p>

<ul>
	<li>
		لغة سكراتش Scratch
	</li>
	<li>
		لغة بلوكلي Blockly
	</li>
	<li>
		لغة ليغو مايند ستورمز LEGO Mindstorms لنوضح أبرز مميزات كل لغة من هذه اللغات.
	</li>
</ul>

<h4 id="scratch">
	سكراتش Scratch
</h4>

<p>
	لغة سكراتش Scratch هي لغة برمجة تعتمد على سحب وإفلات كتل الشيفرات البرمجية بشكل أساسيّ، وهي مجانية تماماً ولا تتطلب ترخيصًا للاستخدام، فقد صممت لخلق بيئة عملٍ برمجية للطلاب المهتمين بمجال برمجة الروبوتات، ولسهولة الاستخدام، يمكن كتابة التعليمات البرمجية للغة سكراتش باستخدام <a href="https://scratch.mit.edu/projects/editor/" rel="external nofollow">محررها غير المتصل بالإنترنت</a> أو تنزيلها على جهازك. حيث أنّ كل ما تحتاجه هو جهاز كمبيوتر ومتصفح ويب حديث.
</p>

<p>
	ما يميّز لغة سكراتش هو مجتمعها الموجّه للمبتدئين، لذا ستجد عشرات الدروس التعليمية والأمثلة على مختلف الجوانب والمزايا من سكراتش. يمكنك الاطّلاع على إمكانيات اللغة عن طريق تجربة <a href="https://scratch.mit.edu/explore/projects/all" rel="external nofollow">مشاريع عملية</a> نفّذها أعضاء من المجتمع والتعلّم منها عن طريق مراجعة الشيفرة الخاصة بالبرنامج، كما يمكنك البدء بتعلّم مزايا سكراتش عن طريق الأدلة التعليمية.
</p>

<h4 id="blockly">
	بلوكلي Blockly
</h4>

<p>
	هي لغة برمجة مرئية طوّرتها Google. وهي مشابهة في عملها للغة Scratch حيث تسمح للمستخدمين بإنشاء برامج عن طريق سحب وإفلات كتل الشيفرات، وبالتالي تكون البرمجة أسهل على المبتدئين. كما تتميز Blockly بأنها مناسبة بشكل خاص للروبوتات، حيث تمكن المطورين من إنشاء برامج معقدة دون الحاجة إلى كتابة الشيفرات البرمجية من الصفر. وهذا يجعلها خيارًا مثاليًا للمبتدئين، أو أولئك الذين قد لا يمتلكون خبرة واسعة في البرمجة. ورغم أنها لغة للمبتدئين إلا أنها قادرة على برمجة الروبوتات بدءًا من الروبوتات التعليمية البسيطة إلى الروبوتات الصناعية المتقدمة. كما تتيح للمبرمجين العمل بشكل تعاوني، حيث يمكن مشاركة الشيفرات وتحريرها داخل المنصة.
</p>

<h4 id="legomindstorms">
	ليغو مايند ستورمز LEGO Mindstorms
</h4>

<p>
	هي لغة برمجة بصرية مصممة خصيصًا لبرمجة الروبوتات باستخدام مجموعة ليغو مايندستورمز. وكما اللغات السابقة، تعتمد على واجهة سحب وإفلات لكتل الشيفرات البرمجية، مما يسهل على المبتدئين استخدامها، حتى لو لم يكن لديهم أي خبرة سابقة في البرمجة.
</p>

<p>
	أحد الفوائد الرئيسية لهذه اللغة أنها سهلة التعلم والاستخدام. حيث تسمح واجهة السحب والإفلات للمستخدمين بتحديد وترتيب الأوامر والوظائف المختلفة بسهولة، دون القلق بشأن بنية الجملة المعقدة أو المفاهيم البرمجية.
</p>

<p>
	بالتالي يمكن للمستخدمين إنشاء مجموعة واسعة من البرامج والمشاريع باستخدام هذه اللغة، بدءًا من المهام البسيطة مثل تحريك الروبوت للأمام أو الخلف، إلى سلوكيات أكثر تعقيدًا مثل تجنب العقبات أو متابعة الخط.
</p>

<p>
	وتعد هذه اللغة من أفضل لغات برمجة الروبوتات للمبتدئين حيث تجعل واجهتها سهلة الاستخدام وقابلية التكيف والتفاعلية منها أداة رائعة للتعلم والتجربة، في حين تسمح قدراتها القوية للمستخدمين بإنشاء برامج معقدة ومتطورة كما يكتسبون المزيد من الخبرة والمعرفة.
</p>

<h3 id="-4">
	المستوى المتقدّم
</h3>

<p>
	لا يمكنك أن تعتمد على لغات مثل LEGO Mindstorms أو Blockly لباقي مسيرتك المهنية كمبرمج روبوتات، فعليًا هذه اللغات لا تزيد عن كونها شيئًا سهلًا للبدء به، وبعد فهمك لطبيعة عمل الروبوتات وكيفية برمجتها لابدّ من البدء بتعلّم لغات برمجة الروبوتات الفعلية التي تقدم ميزاتٍ أكثر تخصصًا وتعليماتٍ إضافية لم تكن قادرًا على إعطائها للروبوت عند استخدامك للغات البرمجة المخصصة للمبتدئين.
</p>

<p>
	هناك عدّة لغات معتمدة لمبرمجي الروبوتات لإنشاء أنظمة روبوتية معقدة ومتطورة. تشمل بعض أشهر هذه اللغات:
</p>

<ul>
	<li>
		بايثون Python
	</li>
	<li>
		سي C
	</li>
	<li>
		ماتلاب Matlab
	</li>
	<li>
		سي بلس بلس C++‎
	</li>
	<li>
		جافا Java
	</li>
	<li>
		ليسب LISP
	</li>
</ul>

<p>
	لنناقش كلّ لغةٍ على حدًى ونتحدث عن أهم استخداماتها في المجال.
</p>

<h4 id="-5">
	لغة بايثون
</h4>

<p>
	وهي إحدى أسهل لغات البرمجة وأكثرها شعبيةً بين المستخدمين، ذلك لكونها تمتلك مجموعة قويّة من المكتبات التي تسهّل تنفيذ الوظائف والتعليمات الأساسية. كما أنّ هناك حاجة إلى عدد أقل من أسطر الشيفرات البرمجية مع Python أيضًا، ما يجعلها أسرع في الاستخدام والتعلم من C و C++‎ و Java.
</p>

<p>
	تعمل لغة Python على تقليل وقت البرمجة من خلال إلغاء الحاجة إلى تحديد أنواع المتغيرات، والسماح بكتابة الشيفرة البرمجية داخل البرنامج النصي ذاته. ونظرًا لاستخدامها الواسع وشعبيتها، تمتلك بايثون أيضًا مجتمعًا كبيرًا من المبرمجين، والذي يمكن أن يكون مصدرًا ممتازًا للمبتدئين للاستفادة منه أثناء مرحلة التعلم.
</p>

<p>
	يمكنك البدء بتعلم لغة بايثون من خلال <a href="https://academy.hsoub.com/store/9-%D8%AF%D9%88%D8%B1%D8%A9-%D8%AA%D8%B7%D9%88%D9%8A%D8%B1-%D8%A7%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D8%BA%D8%A9-python/" rel="">دورة تطوير التطبيقات باستخدام لغة بايثون</a> المقدّمة من أكاديمية حسوب.
</p>

<h4 id="c">
	لغة سي C (باستخدام آردوينو)
</h4>

<p>
	آردوينو Arduino هي إحدى المنصات الشائعة لبرمجة الروبوتات باستخدام لغة C، فهو متحكّم مفتوح المصدر يعتمد على أجهزة وبرامج سهلة الاستخدام. صمم ليكون متاحًا للمبتدئين مع التركيز على إمكانياته بحيث يمكن لمستخدميه المتقدمين بناء مشاريع معقدة.
</p>

<p>
	باستخدام لغة C مع آردوينو، يمكن للمبرمجين الاستفادة الكاملة من قدرات المتحكم الصغير Microcontroller وتنفيذ خوارزميات وأنظمة تحكم مخصصة، كما تسمح لغة سي للمبرمجين بكتابة شيفرات فعالة ومحسّنة لتطبيقات الروبوتات ، مثل التحكم في المحركات والحساسات وغيرها.
</p>

<p>
	بالإضافة إلى ذلك، يوفر أردوينو مجموعة واسعة من المكتبات والأدوات التي تبسط عملية التطوير، وهذا يجعلها منصة مثالية للهواة والطلاب والمحترفين على حدٍّ سواء. بشكل عام، لغة C هي أداة قوية لبرمجة الروبوتات، واستخدامها مع أردوينو يجعلها متاحة لجمهور أوسع وبالتالي الاستفادة منها بشكل أكبر.
</p>

<h4 id="matlab">
	لغة ماتلاب MATLAB
</h4>

<p>
	تعد ماتلاب من أفضل لغات برمجة الروبوتات على الإطلاق فهي قادرة على تحليل البيانات وتشغيل المحاكاة ، وتطوير وتنفيذ أنظمة التحكم في الروبوتات بواسطة واجهات مصممة خصيصًا لأجل هذه المهمّة. عند استخدامها مع مجموعة أدوات Robotics Toolbox for MATLAB، التي تتضمن وظائف للحركة والديناميات وتوليد المسارات، كما يمكن للمطورين إنشاء أنظمة لمحاكاة ذراع الروبوت.
</p>

<p>
	تدمج هذه اللغة بين البيئة سهلة الاستخدام والكفاءة العالية وتحقيق أكبر قدرٍ ممكن من الاستفادة حيث عندما يتمّ تحليل المعلومات وبناء أنظمة التحكم. كما تساعد على التخلص من الأخطاء التي تظهر عند التنفيذ وذلك عبر السماح للمبرمجين بتحديد المشكلات أثناء مرحلة النمذجة الأولية بدلًا من اكتشافها لاحقًا بعد إنتاج الروبوت وتصنيعه مما سيكبّدك كلفةً أكبر وعملًا أكثر.
</p>

<h4 id="c-1">
	لغة سي بلس بلس ++C
</h4>

<p>
	تقف لغتا C و C++‎ إلى جانب بعضهما البعض لتشكّلا اللغتين الأساسيتين في عالم برمجة الروبوتات فهي توفّر مجموعةً كبيرة ومتنوعة من الأدوات والمكتبات والوظائف المفيدة في مجال الروبوتات. حيث يستخدمها معظم مهندسي الروبوتات الذين يعملون على برمجة الروبوتات بكفاءة وضمان أداءٍ عالٍ واستثمارها بالشكل الأمثل.
</p>

<p>
	واحدة من أعظم مزايا ++C كونها اللغة التي تتحكم في واجهة برمجة التطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><a href="https://academy.hsoub.com/programming/general/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%A7%D9%84%D9%88%D8%A7%D8%AC%D9%87%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-api-r1314/" rel=""><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></a></abbr> لنظام التشغيل مباشرة. وهذا يعني أنها لا تحتاج إلى أي وسيط. بالتالي، يمكن للمبرمجين استخدام المكتبات السريعة الخاصة بالمنصة الأساسية.
</p>

<h4 id="-6">
	لغة البرمجة جافا
</h4>

<p>
	تحظى<a href="https://academy.hsoub.com/programming/java/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-%D8%AC%D8%A7%D9%81%D8%A7-java-r2275/" rel=""> لغة جافا</a> بشعبية بين المبرمجين العاملين في مجال الذكاء الاصطناعي وبرمجة الروبوتات دونًا عن غيرها من لغات البرمجة حيث يمكن إنشاء شبكات عصبية من خلالها. ومع ذلك، لا تعدّ جافا الخيار الأول لبرمجة الروبوتات بسبب تكاليف تشغيل مكتبات جافا العالية وبطء سرعة المعالجة وقواعد بناء الجمل المعقدة.
</p>

<p>
	بالإضافة إلى تقديمها لبعض المزايا الفريدة في الروبوتات، مثل إدخال كشف الكلام وكشف اللغة في روبوتك باستخدام واجهة (Java Speech <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr>) (JSAPI)، كما يمكنك استدعاء ردود الفعل البصرية من الروبوت باستخدام واجهة Computer Vision <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> of Java. بالإضافة إلى ذلك ، تحتوي جافا على مجموعة واسعة من واجهات برمجة التطبيقات <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> للذكاء الاصطناعي المصممة خصيصًا لاستخدامها في برمجة الروبوتات.
</p>

<p>
	ميزة أخرى لجافا هي آلة جافا الافتراضية Java Virtual Machine التي تسمح للمبرمجين بتقليل وقت البرمجة الإجمالي عن طريق السماح لهم باستخدام الشيفرة البرمجية ذاتها على أجهزة مختلفة.
</p>

<h4 id="lisp">
	ليسب LISP
</h4>

<p>
	هي إحدى أقدم لغات البرمجة المستخدمة لبرمجة الروبوتات وتستخدم لإنشاء تطبيقات الذكاء الاصطناعي حيث يتم كتابة نظام ROS - الإطار المفتوح المصدر المستخدم لتطوير تطبيقات الروبوت - بهذه اللغة. وتتميّز بإدارة التخزين التلقائي، والكتابة الديناميكية، وهياكل البيانات الشجرية، والتكرار، ووظائف الترتيب المرتفعة، والترجمة ذاتية الاستضافة وغيرها الكثير.
</p>

<p>
	طورت لغة LISP في الأصل للتدوين الرياضي التطبيقي في برامج الحاسوب. ومع ذلك، ستجد أن العديد من الأقسام الهامة لنظام ROS مكتوبة بلغة LISP. ولهذا السبب أصبحت أيضًا لغة حاسمة في مجال الذكاء الاصطناعي. وكلّ هذه الميزات تضع لغة LISP في مقدمة قائمة أفضل لغات برمجة الروبوتات.
</p>

<h2 id="-7">
	برامج محاكاة الروبوتات
</h2>

<p>
	عالم برمجة الروبوتات يشكل المستقبل الواعد للمجال البرمجي، إلا أنه يأتي مع سلبيته الأبرز ألا وهي ارتفاع أسعار الروبوتات بشكلٍ يمنع المبرمجين من القدرة على القيام بالتجارب واكتساب الخبرات، ومن هذا المنطلق تمّ العمل على برامح محاكاة الروبوتات التي تُعرف بكونها برامج طوّرت لتخطيط مسار حركة الروبوت دون الاتصال بالإنترنت حيث تمثّل هذه البرامج حركة الذراع بدقة.
</p>

<p>
	يتضمن هيكل الروبوت العديد من المكونات بالإضافة إلى الذراع، وبالتالي يجب أن تكوّن فهمًا كاملًا لكيفية عمل الهيكل وتفاعله مع محيطه، مما يساعدك في تحديد فرص التحسين، وضمان تضمين كل عنصر مهم في الهيكل.
</p>

<p>
	يمكن فهم عمل الخلية بشكلٍ شامل باستخدام برنامج محاكاة مصنّع مع نموذج كامل للخلية، إذ يمكن برمجة الروبوت بشكل افتراضي. بحيث تتكامل حركات الروبوت مع المستشعرات وغيرها من المحفزات.
</p>

<h3 id="-8">
	أهمية برامج محاكاة الروبوتات
</h3>

<p>
	تطورت عملية محاكاة الروبوتات بشكل طرديّ مع مرور الوقت لمواكبة القدرات المتزايدة للروبوتات الصناعية، بالإضافة إلى زيادة الطلب على الروبوتات المتقدمة من هذا النوع بما يتناسب مع زيادة تعقيد المنتج وتنوعه والتخصص لتلبية طلبات العملاء. وعند التفكير بالأمر، فإن السبب الرئيسي لاستخدام برامج محاكاة الروبوتات هو قدرتك على تصور العملية، على سبيل المثال، قد يكون أهم ما تحتاجه هو عرض كيفية عمل نظام الروبوت لفريقك. تسمح المحاكاة لزملائك في العمل والإدارة بتصور العملية. ويساعد على رؤية كيفية عمل الروبوت. إضافة إلى الكلفة المادية الأخفض مقارنةً مع أجزاء الروبوتات والقدرة على حل المشاكل والأخطاء قبل الوصول إلى مرحلة الإنتاج النهائية.
</p>

<h3 id="-9">
	برامج محاكاة الروبوتات
</h3>

<p>
	تستمر برامج محاكاة الروبوتات في التطور كل عام، ما يضيف قيمةً ونجاحًا أكبر إلى مجال برمجة الروبوتات وخاصةً مع إطلاق محاكيات روبوتية مجانية مفتوحة المصدر بدأت في منافسة أداء البرامج التجارية. وتدعم معظم برامج محاكاة الروبوتات أيضًا مجموعة واسعة من لغات البرمجة مثل <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-c-%D9%88%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D8%B9%D9%84%D9%85%D9%87%D8%A7-r2268/" rel="">C</a> و C++‎ وJava وMATLAB و LabVIEW و Python وأهمّها:
</p>

<h4 id="webots">
	تطبيق Webots
</h4>

<p>
	Webots هو تطبيق متعدد المنصات ومفتوح المصدر يستخدم لمحاكاة الروبوتات. يوفر بيئة تطويرية كاملة لنمذجة وبرمجة ومحاكاة الروبوتات ويدعم مجموعة واسعة من المحاكيات بما في ذلك الروبوتات ذات العجلتين والأذرع الصناعية وروبوتات المشي والروبوتات النمطية والسيارات والطائرات بدون طيار والمركبات تحت الماء ذاتية الدفع والروبوتات المسارية ومركبات الفضاء وما إلى ذلك. ويمكن برمجة الروبوتات باستخدام هذا المحاكي بلغات C و C++‎ وبايثون <a href="https://academy.hsoub.com/python/" rel="">Python</a> و Java و MATLAB باستخدام واجهة برمجة تطبيقات بسيطة تغطي جميع الاحتياجات الأساسية للروبوتات.
</p>

<h4 id="gazebo">
	محاكي Gazebo
</h4>

<p>
	محاكي Gazebo هو منصة مفتوحة المصدر ومجانية يمكن استخدامها لتصميم وتطوير واختبار ومحاكاة أي نوع من الروبوتات وهو مدعوم من قبل أنظمة تشغيل Linux و Windows و Mac، يأتي محاكي Gazebo أيضًا مع بعض نماذج الروبوتات مثل PR2 و DX و Irobot Create و TurtleBot، لتبدأ بسرعة حتى لو لم يكن لديك نماذج روبوت خاصة بك. كما يدعم Gazebo مجموعة واسعة من الحساسات، ويمكنك محاكاة الضوضاء وفشل الحساسات لمحاكاة المشاكل الحقيقية في العالم.
</p>

<h4 id="vrepcoppeliasim">
	محاكي V-REP أو CoppeliaSim
</h4>

<p>
	يتوفر هذا المحاكي مجاناً لأغراض تعليمية، أو من الممكن أن تختار الإصدار الاحترافي إذا كنت تخطط لاستخدامه لمشاريع تجارية. يمكن تشغيل V-REP على أنظمة Windows و Linux و macOS، كما يدعم ستّ لغات برمجةٍ مختلفة.
</p>

<p>
	يمكنه التعامل بدقة مع تفاعلات الأجسام مثل التصادمات ونقاط الاتصال والتقاط. كما يدعم V-REP فيزياء الجسيمات لمحاكاة الهواء والماء بدقة، حتى تتمكن من نمذجة محركات الطائرات والمروحيات بدقة.
</p>

<h4 id="nvidiaisaac">
	محاكي NVIDIA ISAAC
</h4>

<p>
	هذا هو محاكي روبوتات قابل للتوسعة، إذ يمكّن المطورين والباحثين من تصميم واختبار وتدريب الروبوتات القائمة على الذكاء الاصطناعي. يُشغَّل بواسطة Omniverse لتوفير بيئات افتراضية قابلة للتوسعة ومفصلة ودقيقة فيزيائياً. كما يدعم مجموعة متنوعة من التطبيقات بما في ذلك التلاعب والتنقل وإنشاء بيانات اصطناعية لتدريب البيانات.
</p>

<p>
	يدعم NVIDIA ISAAC وحدات البرامج التي يطلقون عليها GEMs. تتيح هذه الوحدات لك إضافة ميزات بسرعة إلى روبوتاتك مثل أنظمة التعرف المرئي للشبكات العصبية المدربة مسبقًا.
</p>

<h4 id="virtualrealitysimulator">
	محاكي Virtual Reality Simulator
</h4>

<p>
	محاكي العوالم الافتراضيّة يوفّر تجربة غنيّة للمستخدمين، فهو يهدف في المقام الأول إلى استخدامه كمنصة تعليمية لتعليم الشباب أساسيات الروبوتات. كما تدعم عوالم الروبوت الافتراضية برمجة روبوتات LEGO Mindstorms باستخدام NXT-G أو LabVIEW. يمكنك أيضًا إنشاء نماذج روبوت مخصصة أو مستويات في المحاكي باستخدام نظام التمديد المدمج.
</p>

<h2 id="-10">
	مسار تعلّم مبرمج الروبوتات
</h2>

<p>
	هندسة الروبوتات هي مجال ينمو يوماً بعد يوم يتضمن مزيجًا من تحليل البيانات والهندسة وعلوم الحاسوب. يستخدم الأشخاص العاملون في هذه المجالات البرامج والأجهزة الميكانيكية لتصميم وبناء واختبار الروبوتات وعملياتها المرتبطة بالآلات. ومع ذلك، فإن كل وظيفة في هندسة الروبوتات فريدة من نوعها، وغالبًا ما تعتمد الجوانب العملية للوظيفة في هذا المجال على خلفية الشخص. على سبيل المثال، يميل مهندسو الروبوتات الذين لديهم خلفية في البرمجة إلى التركيز أكثر على الجانب البرمجي، بينما يميل أولئك الذين لديهم خلفية في الهندسة الميكانيكية إلى العناصر الفيزيائية للروبوت.
</p>

<p>
	ما يعني أنّ المسار إلى هذا المجال يشمل عمومًا أربع خطوات رئيسية:
</p>

<ul>
	<li>
		الحصول على التعليم.
	</li>
	<li>
		كسب الخبرة.
	</li>
	<li>
		الانضمام إلى المشاريع ذات الصّلة.
	</li>
	<li>
		تقديم طلبات العمل.
	</li>
</ul>

<h3 id="-11">
	أولًا: دراسة هندسة الروبوتات
</h3>

<p>
	هندسة الروبوتات هي مجالٌ جديد نوعاً ما، لذلك لا يوجد سوى عدد قليل من البرامج الرسمية المصممة لإعداد المتعلمين للحصول على وظيفة في هذا المجال. ومع ذلك، هناك العديد من المسارات البديلة المتاحة لك في هذا المجال - حتى تتمكن من اختيار المسار الذي يناسبك. والخطوة الأولى نحو مهنة في الروبوتات هي دراسة اختصاص الرياضيات أو الهندسة أو علوم الحاسوب.
</p>

<p>
	مع العلم أنّ؛ <a href="https://academy.hsoub.com/store/7-%D8%AF%D9%88%D8%B1%D8%A9-%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">دراسة علوم الحاسوب</a> تساعد على إعدادك لجوانب البرمجة في العمل، بينما ستساعد دراسة هندسة الميكانيك على إعدادك لبناء عتاد الروبوت وضبط تحركاته.
</p>

<h3 id="-12">
	ثانيًا: اكتساب المهارات المطلوبة
</h3>

<p>
	بمجرد أن تدرس المجال أو الموضوع الذي تختاره، من المهم تطوير مهاراتك الشخصية، أو التدرب من خلال مشاريع شخصية في وقت فراغك، أو الحصول على تدريب في شركة روبوتية.
</p>

<p>
	وبعد الانتهاء من برنامج التدريب الخاص بك، قم بإجراء استبيان للمهارات التي اكتسبتها وقارنها بالمهارات المطلوبة لمهندس الروبوتات. تذكر أنه يجب عليك أن تكون ملمًا بالبرمجة والإحصاء والرياضيات والهندسة والأتمتة.
</p>

<p>
	وبحسب نقاط الصعف لديك يمكنك أن تعرف المجال الذي يجب أن تقوّي نفسك فيه وتسجل دوراتٍ دراسيّة إضافية.
</p>

<h3 id="-13">
	ثالثًا: الانضمام إلى تجمّع مهني يتعلق بالمجال
</h3>

<p>
	الانضمام إلى المشاريع والجماعات المهنيّة لا يقدّم لك عملاً وحسب، بل يضيف خبرةً ويجعل منك مهندساً أفضل وأكثر مهارة.
</p>

<p>
	تأسست جمعية تقدُّم الذكاء الاصطناعي (AAAI) في عام 1979، وهي جمعية غير ربحية تركز على الذكاء الاصطناعي، ملتزمة بـ "تعزيز الفهم العلمي للآليات التي تكمن وراء الفكر والسلوك الذكي وتجسدها في الآلات"، وكذلك جمعية الروبوتات والأتمتة IEEE، والانضمام إلى إحدى هذه الجمعيات من خلال حضور ورش العمل والمؤتمرات القيمة، يؤدي إلى إتاحة فرصة الوصول إلى آلاف من مهندسي الروبوتات للتعلم منهم وإضافتهم إلى شبكة اتصالاتك المهنية.
</p>

<h3 id="-14">
	رابعًا: التقدم للوظائف
</h3>

<p>
	تعتبر الروبوتات مجالًا تنافسيًا، ما يعني أنه عند التقدم للوظائف، يجب أن تكون مفكرًا واستراتيجيًا.
</p>

<p>
	ما هي الوظائف التي تهتمّ بها؟ وما هي المؤهلات التي لديك؟ وعند بناء سيرتك الذاتية، تأكد من التركيز على جميع الخبرات والدروس ذات الصلة بالروبوتات، سواء كان ذلك تخصص رياضيات في الجامعة أو روبوت قمت ببنائه كمشروعٍ خاص بك.
</p>

<p>
	وحضّر نفسك لمقابلات العمل المحتملة، مثلاً استعرض بعضًا من أهم الأسئلة التي تطرح في مقابلات الروبوتات على LinkedIn؛ ستساعدك هذه الأسئلة على ممارسة الحديث عن بعض الموضوعات الأكثر أهمية التي قد يغطيها المقابل، ليكون لديك فهمٌ واضح عن هذه الوظيفة، وما يجعلك مؤهلاً جيدًا لها.
</p>

<h2 id="-15">
	الخاتمة
</h2>

<p>
	تلعب لغات البرمجة دوراً عظيمًا وحاسمًا في مجال تطوير وبرمجة الروبوتات، لذلك من المهم أن تختار اللغة الأنسب للمجال الذي تريد التخصص به، مع ضمان دعم محاكي الروبوتات الذي ستستخدمه لهذه اللغة.
</p>

<p>
	يمكن للمبرمجين المبتدئين في مجال الروبوتات البدء بتعلم لغات البرمجة البسيطة مثل سكراتش أو بلوكلي وثمّ الانتقال إلى لغات أكثر تخصصاً مثل Python و C++‎ و Java، ثم التحول إلى إتقان لغات خاصة بالروبوتات مثل ROS. كما يمكن للانضمام إلى الجمعيات المهنية و<a href="https://io.hsoub.com/hardware" rel="external">المجتمعات</a> التي تشاركك الشغف ذاته لبناء علاقات مهنية مع مهندسي روبوتات آخرين وحضور ورشات عمل ومؤتمرات متعلقة بالمجال.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">برمجة الروبوت: الدليل الشامل</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AD%D8%B1%D9%8A%D9%83-%D8%B4%D8%AE%D8%B5%D9%8A%D8%A9-%D9%83%D8%B1%D8%AA%D9%88%D9%86%D9%8A%D8%A9-%D8%B9%D8%A8%D8%B1-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%81%D9%8A-%D8%B1%D8%A7%D8%B3%D8%A8%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r2082/" rel="">تحريك شخصية كرتونية عبر سكراتش في راسبري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A2%D9%84%D8%A9/" rel="">تعلم الآلة Machine Learning</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/artificial-intelligence/%d8%aa%d8%b9%d9%84%d9%85-%d8%a7%d9%84%d8%b0%d9%83%d8%a7%d8%a1-%d8%a7%d9%84%d8%a7%d8%b5%d8%b7%d9%86%d8%a7%d8%b9%d9%8a/" rel="">تعلم الذكاء الاصطناعي</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2285</guid><pubDate>Sun, 31 Mar 2024 12:00:01 +0000</pubDate></item><item><title>&#x62F;&#x644;&#x64A;&#x644;&#x643; &#x627;&#x644;&#x634;&#x627;&#x645;&#x644; &#x625;&#x644;&#x649; &#x62A;&#x639;&#x644;&#x645; &#x623;&#x633;&#x627;&#x633;&#x64A;&#x627;&#x62A; &#x627;&#x644;&#x62A;&#x62D;&#x643;&#x645; &#x648;&#x642;&#x64A;&#x627;&#x62F;&#x629; &#x627;&#xFEF5;&#x644;&#x627;&#x62A;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%AF%D9%84%D9%8A%D9%84%D9%83-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-%D8%A5%D9%84%D9%89-%D8%AA%D8%B9%D9%84%D9%85-%D8%A3%D8%B3%D8%A7%D8%B3%D9%8A%D8%A7%D8%AA-%D8%A7%D9%84%D8%AA%D8%AD%D9%83%D9%85-%D9%88%D9%82%D9%8A%D8%A7%D8%AF%D8%A9-%D8%A7%EF%BB%B5%D9%84%D8%A7%D8%AA-r2276/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2024_03/1061910277_.png.e1550642fd51e3167798f2d763ac4a23.png" /></p>
<p>
	يزداد اعتماد البشر على اﻵلات يومًا بعد يوم، ويبتكر اﻹنسان وسائل مختلفة لتطوير هذه اﻵلات وتسهيل قيادتها والتعامل معها. وقد راكم البشر معارفهم في بناء اﻵلات وتسخيرها منذ القدم، لكننا سنقفز في الزمن إلى أواخر القرن التاسع عشر وبداية القرن العشرين، إذا ساهمت جهود العديد من المخترعين وعلى رأسهم أديسون وتيسلا في وصول الطاقة الكهربائية (التي اكتشفت واستخدمت سابقًا) بشكل محدود إلى المنازل واخترعت المحركات الكهربائية.
</p>

<p>
	وقد تمّيزت هذه الطاقة بنظافتها وسهولة التحكم بها، وتوجيهها نحو المكان المطلوب بالكمية المطلوبة، وإمكانية وصل وفصل التجهيزات التي تعمل عليها عن مصادر التغذية بشكل آني. والكهرباء هي اﻵن بلا شك العماد اﻷساسي لحضارتنا الراهنة بكل تفاصيلها. وقد رافق الاستخدام المتزايد لهذه الطاقة نشوء العديد من العلوم القائمة عليها كعلم اﻹلكترونيات، وعلوم توليد الطاقة الكهربائية ونقلها وتوزيعها، وعلوم التحكم اﻵلي اﻹلكتروني، وصولًا إلى بناء الروبوتات.
</p>

<p>
	ومع تطور تلك العلوم ظهرت الحاجة إلى فنيين ومختصين ومهندسين وعلماء لصيانة المنظومات التي تعتمد على الطاقة الكهربائية وتطويرها، وتطوير أساليب التحكم بالتجهيزات الكهربائية من أجل قيادتها بالشكل اﻷمثل واﻷكثر فعالية. ويمر هؤلاء بمسارات تعليمية وتقنية مختلفة لبلوغ المستوى العلمي والفني المناسب لتأدية عملهم. وحتى لو تباعدت هذه المسارات التعليمية عن بعضها في مرحلة ما نظرًا لتشعب علوم الطاقة الكهربائية وتجهيزاتها، فهنالك مسارات أساسية لا بد أن يمر بها جميع المهتمين في هذا المجال والتي تشكل حجر اﻷساس في مسيرتهم العلمية والفنية وهذا ما سنناقشه في مقالنا.
</p>

<p>
	هذا المقال موجّه إلى كل الطلاب اليافعين الراغبين في احتراف علوم اﻹلكترونيات والتحكم باﻵلات والروبوتات وإلى أهاليهم. إذ سنناقش فيه المسارات التعليمية التي توصلهم إلى المكان المطلوب وما الذي عليهم معرفته، وما الفوائد المتوقعة من هذه المسارات وكيف نجنيها؟ حتى تتكون لديهم صورة واضحة عن هذا الاختصاصات ونضعهم على الطريق الصحيح للانطلاق.
</p>

<h2 id="-1">
	المسارات الرئيسية لتعلم التحكم المبرمج والروبوتات
</h2>

<p>
	نستعرض سريعًا في هذه الفقرة أهم المسارات التعليمية وفق التسلسل المنطقي الصحيح، ثم نفصّل فيها في فقرات تالية:
</p>

<ol>
	<li>
		مسار تعلم اﻹلكترونيات.
	</li>
	<li>
		مسار التحكم الصناعي وقيادة اﻵلة.
	</li>
	<li>
		مسار اﻹلكترونيات المبرمجة والمتحكمات المصغّرة.
	</li>
	<li>
		مسار وحدات التحكم المتكاملة والحواسب المصغّرة.
	</li>
	<li>
		مسار علوم الروبوت.
	</li>
</ol>

<h2 id="-2">
	مسار تعلم اﻹلكترونيات
</h2>

<p>
	علم اﻹلكترونيات مجال واسع وشديد التشعب ودراسته ليست بالأمر بالسهل وهو يحمل الكثير من التحديات، لكنه مع ذلك علم ممتع وتخصصاته مطلوبة في كل مجالات حياتنا المعاصرة.
</p>

<h3 id="-3">
	ما هو علم اﻹلكترونيات
</h3>

<p>
	يُعرف علم اﻹلكترونيات بأنه علم يدرس ويبحث في إنتاج عناصر كهربائية قادرة على التحكم بالتيار الكهربائي وتوجيهه نحو عناصر محددة في المكان المحدد والتوقيت المحدد. ولكل عنصر إلكتروني وظيفة محددة: فمنها ما يخفض شدة التيار الكهربائي، ومنها يرفعه، ومنها ما يمتص الطاقة الكهربائية ويحوّلها إلى ضوء، وأخرى تمتص الضوء وتحوّله إلى تيار كهربائي.
</p>

<p>
	لكن ما الفائدة من كل ذلك؟ للإجابة عن هذا السؤال سنتخيل أنك تريد أن تتحكم بشدة الإضاءة في غرفتك، فقد تريدها أن تكون قوية عندما تجلس إلى طاولة الدراسة وأن تكون منخفضة جدًا عندما تجلس إلى شاشة الحاسب لتلعب إحدى ألعابك المفضلة، فكيف يساعدنا علم اﻹلكترونيات؟
</p>

<p>
	اﻷمر بغاية البساطة. إذ تتعلق شدة اﻹضاءة بزيادة شدة التيار الكهربائي الي يصلها، وهكذا نستخدم مثلًا عنصرًا يُدعى "مقاومة متغيرة Variable resistor". يأتي هذا العنصر على شكل مفتاح يمكن تدويره. فعندما يدور هذا المفتاح باتجاه معين يزيد تدفق التيار عبره إلى اﻹضاءة وتزيد شدتها وإن أدرته بالاتجاه المعاكس يعيق تدفق التيار الكهربائي وتقل شدة اﻹضاءة. هل ذكرّك هذه اﻷمر بشيء ما؟ تمامًا صنبور المياه!
</p>

<p>
	لكن ماذا لو أردت أن تفعل ذلك دون أن تضطر إلى مغادرة اللعبة التي تستمتع بها كثيرًا وتصل إلى المفتاح المثبّت على جدار الغرفة، هل هناك حل في عالم اﻹلكترونيات؟ بالتأكيد يوجد حل!
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146711" href="https://academy.hsoub.com/uploads/monthly_2024_03/01_electroniccircuit_schematic_capture.png.b7979191dbdc899576c12506ac0cb402.png" rel=""><img alt="01 electronic circuit schematic capture" class="ipsImage ipsImage_thumbnailed" data-fileid="146711" data-unique="to3i4bgz1" style="width: 700px; height: auto;" src="https://academy.hsoub.com/uploads/monthly_2024_03/01_electroniccircuit_schematic_capture.png.b7979191dbdc899576c12506ac0cb402.png"> </a>
</p>

<p style="text-align: center;">
	مخطط لدائرة إلكترونية
</p>

<h3 id="-4">
	كيف تبدأ رحلتك في تعلم اﻹلكترونيات
</h3>

<p>
	عليك في <strong>المرحلة اﻷولى</strong> أن تتعلم بعض الأساسيات التي سنلخصها في النقاط التالية:
</p>

<ul>
	<li>
		التعرف على مفاهيم ضرورية مثل الجهد الكهربائي، والتيار الكهربائي، وحركة التيار في اﻷسلاك.
	</li>
	<li>
		إجراء بعض الحسابات الكهربائية البسيطة لتحديد العناصر المناسبة لدائرتك اﻹلكترونية.
	</li>
	<li>
		تصميم بعض الدوائر البسيطة التي تهدف إلى تعليمك التعامل مع العناصر اﻹلكترونية اﻷساسية.
	</li>
	<li>
		اختيار مصادر التغذية الكهربائية التي تلزمك والطريقة الصحيحة في توصيلها مع الدائرة.
	</li>
	<li>
		تعلّم قراءة مواصفات العناصر اﻹلكترونية اﻷساسية، والطريقة الصحيحة في توصيلها مع مصدر التغذية الكهربائية.
	</li>
	<li>
		استكشاف اﻷخطاء الناتجة في الدوائر اﻹلكترونية البسيطة.
	</li>
	<li>
		استخدام بعض أجهزة القياس اﻷساسية مثل "المقياس متعددة الوظائف Multi-meter" الذي تستخدمه في قياس الكثير من المقادير الكهربائية مثل الجهد، وشدة التيار، ومقاومة العناصر، وتفقد صحة التوصيل بين عنصرين، وتحديد نقاط الانقطاع في الدائرة وغيرها.
	</li>
</ul>

<p>
	أما في <strong>المرحلة الثانية</strong> فيُفترض بك أن تتعلم العمل مع المفاتيح اﻹلكترونية بأنواعها المختلفة، وهي عناصر تمنع أو تسمح للتيار الكهربائي بالمرور وفق شروط كهربائية خاصة، ولها أهمية كبيرة في التحكم بدوائرك.
</p>

<p>
	ثم تتعرف في <strong>المرحلة الثالثة</strong> على العناصر اﻹلكترونية المتكاملة وهي دوائر إلكترونية كاملة لها وظيفة أو عدة وظائف، تُصنّع ضمن غلاف واحد لا يُرى منها سوى بضعة أرجل تربطها مع بقية العناصر. ومع تقدمك في هذا المسار ستتعلم أسماء ووظائف العديد منها وتتعلم طريقة استخدامها.
</p>

<p>
	تساعدك الكثير من البرامج الحاسوبية الخاصة والتي تُدعى بالمحاكيات في تصميم الدوائر اﻹلكترونية، والتأكد من سلامة عملها قبل أن تنجزها في الواقع. إذ يسهّل عليك تعلم أحد هذه البرامج إجراء الحسابات وتجربة العناصر التي تعتقد أنها مناسبة قبل أن تتخذ قرارك النهائي.
</p>

<h4 id="-5">
	ما الذي تتوقعه من تعلم اﻹلكترونيات؟
</h4>

<p>
	ستكون في نهاية هذا المسار قادرًا على:
</p>

<ul>
	<li>
		البحث عن العناصر التي تحتاجها من خلال شبكة اﻹنترنت.
	</li>
	<li>
		فهم ميزات العناصر اﻹلكترونية، وطريقة توصيلها من خلال القراءة الصحيحة، وفهم ورقة المواصفات الخاصة data sheet بالعنصر والتي تقدمها الجهة المصنعة له.
	</li>
	<li>
		تنظيم مجموعتك الخاصة من العناصر اﻹلكترونية التي أتقنت استخدامها وألفت طريقة توصيلها وحل مشاكلها.
	</li>
	<li>
		فهم الكثير من الدوائر اﻹلكترونية المختلفة وتحليل عملها للاستفادة من اﻷفكار المطبقة ضمنها.
	</li>
	<li>
		التواصل الفعّال مع أعضاء المجتمعات الافتراضية التي تهتم باﻹلكترونيات على شبكة اﻹنترنت لتجد حلولًا للمشكلات التي تعترضك.
	</li>
	<li>
		تحليل وتطبيق الكثير من المشاريع المميزة الجاهزة والتعلم منها لتطوير أفكارك.
	</li>
</ul>

<h2 id="-6">
	مسار التحكم الصناعي وقيادة اﻵلة
</h2>

<p>
	بعد أن تتعلم أساسيات اﻹلكترونيات وربما في نهاية المرحلة اﻷولى وبداية الثانية، ستكون قادرًا على الانطلاق في هذا المسار المميز على الصعيدين العلمي والمهني. وإن كنت ملمًا بأساسيات الطاقة الكهربائية وتوصيل العناصر الكهربائية، يمكنك الانطلاق في هذا المسار على التوازي مع مسار تعلم اﻹلكترونيات.
</p>

<h3 id="-7">
	ماذا نقصد بالتحكم وقيادة اﻵلات؟
</h3>

<p>
	نقصد <strong>بقيادة اﻵلات</strong> القدرة على تشغيلها في الوقت المناسب ﻹنجاز عمل محدد وخلال فترة محددة، تخيّل مثلًا آلة تغليف ألواح الشوكولا، ما الذي قد يحدث إن لم تكن حركة هذه اﻵلة دقيقة؟ وما الذي قد يحدث إن لم تنجز تغليف اللوح قبل وصول اللوح التالي؟ ماذا لو كان عملها مرتبطًا بعمل آلة تسبقها؟ إن اﻹجابة عن هذه اﻷسئلة هو جوهر هذا المسار التعليمي.
</p>

<p>
	تتكون اﻵلات على مختلف أنواعها من محرّكات وأجزاء متحركة أخرى ترتبط بها، وتتكامل هذه اﻷجزاء لأداء وظيفة معينة، وعندما تجتمع عدة آلات تشكل خطًا آليًا، وهكذا سيكون التحكم بهذه اﻵلات وقيادتها بالطريقة الصحيحة أمرًا جوهريًا في نجاح هذا الخط اﻵلي.
</p>

<p>
	وللتحكم الصناعي نوعان: اﻷول تقليدي يعتمد على عناصر كهربائية مخصصة لأداء كل وظيفة من وظائف اﻵلة، والثاني مبرمج ترتبط فيه هذه اﻵلات بوحدات خاصة تُدعى وحدات التحكم المبرمجة تقودها معًا عن طريق برمجيات قيادة خاصة تطوّر خارج وحدات التحكم ثم تنقل إليه، وباﻹمكان تعديلها في أي وقت دون الحاجة إلى إيقاف خط اﻹنتاج لفترات طويلة.
</p>

<p>
	إذًا فالتحكم الصناعي هو قيادة اﻵلات واﻷجزاء المتحركة اﻷخرى ﻷداء وظائفها بالشكل اﻷنسب، أما كيف ستنطلق في تعلم هذه المسار، فهذا ما نناقشه تاليًا.
</p>

<h3 id="-8">
	كيف تبدأ رحلتك في مسار التحكم الصناعي وقيادة اﻵلات؟
</h3>

<p>
	عليك في <strong>المرحلة اﻷولى</strong> أن تتعلم بعض النقاط اﻷساسية ونلخصها كالتالي:
</p>

<ul>
	<li>
		التعرف على نوعي التيار الكهربائي المستخدمان في تغذية اﻵلات، وهما التيار المستمر والتيار المتناوب والتعرف على خصائصهما ومجالات استخدامهما.
	</li>
	<li>
		الاطلاع على أنواع المحركات المختلفة، وطريقة تشغيلها وإطفائها، ونوع التغذية الكهربائية التي تحتاجها.
	</li>
	<li>
		التعرّف على عناصر فصل ووصل أجهزة الحركة وعناصر التوقيت واﻷزرار والمبدلات وغيرها من العناصر اﻷساسية في دوائر التحكم الصناعي.
	</li>
	<li>
		تعلم توصيل دوائر بسيطة للتحكم في تشغيل محركات صغيرة أو منظومات إضاءة بسيطة.
	</li>
	<li>
		تعلم قراءة مخططات دوائر التحكم والتمييز بينها وبين مخططات دوائر التغذية الكهربائية.
	</li>
	<li>
		تعلم استخدام عناصر حماية الدوائر مثل قواطع الحماية والمنصهرات fuse.
	</li>
</ul>

<p>
	ستألف في نهاية هذه المرحلة الكثير من اﻷفكار التي تتعلق بالمحركات وأساليب فصل ووصل الطاقة عنها وعن اﻷجزاء اﻷخرى من اﻵلة وطريقة التحكم بها.
</p>

<p>
	توسّع <strong>المرحلة الثانية</strong> معارفك من خلال الاطلاع على تجهيزات مراقبة التغذية الكهربائية وعلى الحساسات الصناعية التي تعطيك معلومات هامة عن وضع اﻵلة أو أجزائها مثل حساسات تقدير المسافة، وحساسات اكتشاف الحركة وغيرها. وهي عناصر غاية في اﻷهمية ولها دور مفصلي في تحقيق التشغيل المتوازن للآلة.
</p>

<p>
	وستطلع في <strong>المرحلة الثالثة</strong> على أسلوب التحكم المبرمج، وفهم آلية عمل وحداته وطرق توصيلها واستثمارها مثل وحدات "الدوائر المنطقية القابلة للبرمجة PLC". أما تعلّم برمجة هذه الوحدات فهذا أمر اختياري ويتعلق بمدى جديتك في تطوير مهنتك. فقد تطلب من مختصين أن يبرمجوا لك هذه الوحدات لتنفيذ الوظائف التي تريدها ثم تقوم بتركيبها ووصلها، وقد تحاول أن تتعلم برمجتها بنفسك وهنا لابد من <strong>مرحلة رابعة</strong> تتعلم فيها أساسيات البرمجة عمومًا ثم تنتقل إلى اﻷساليب البرمجية الخاصة بالوحدات المبرمجة.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146712" href="https://academy.hsoub.com/uploads/monthly_2024_03/02_PLC_module.png.960a92b3b8a72713006cc8fe3ad89f59.png" rel=""><img alt="02 plc module" class="ipsImage ipsImage_thumbnailed" data-fileid="146712" data-unique="s69f7bk1m" src="https://academy.hsoub.com/uploads/monthly_2024_03/02_PLC_module.png.960a92b3b8a72713006cc8fe3ad89f59.png"> </a>
</p>

<p style="text-align: center;">
	وحدة دائرة منطقية قابلة للبرمجة PLC
</p>

<h3 id="-9">
	ما الذي تتوقعه من تعلم التحكم الصناعي وقيادة اﻵلات؟
</h3>

<p>
	ستكون قادرًا عند إكمال هذا المسار التعليمي على:
</p>

<ul>
	<li>
		فهم أساليب التحكم باﻵلات وقيادة اﻷجزاء المتحركة.
	</li>
	<li>
		تمييز مخططات التحكم عن مخططات التغذية الكهربائية للآلات وقرائتها جيدًا.
	</li>
	<li>
		تمييز معظم عناصر التحكم الكهربائي التقليدي في الدوائر الكهربائية.
	</li>
	<li>
		اكتشاف أخطاء دوائر التحكم وحل مشاكلها.
	</li>
	<li>
		إنجاز دوائر تحكم خاصة بك لقيادة منظومات آلية محدودة.
	</li>
	<li>
		استخدام وحدات التحكم المبرمج وتوصيلها بالشكل الصحيح.
	</li>
	<li>
		فهم طريقة برمجة وحدات التحكم.
	</li>
	<li>
		كتابة برامج كاملة لقيادة اﻵلات إن تابعت حتى نهاية المرحلة الرابعة من هذا المسار.
	</li>
</ul>

<h2 id="-10">
	مسار اﻹلكترونيات المبرمجة والمتحكمات الصغرية
</h2>

<p>
	يتابع في هذا المسار كل من يريد تحقيق الأهداف التالية:
</p>

<ul>
	<li>
		يريد التعمق في التحكم اﻵلي المبرمج.
	</li>
	<li>
		يرغب في فهم تفاصيل تصميم وحدات التحكم المبرمج.
	</li>
	<li>
		أكمل مسار اﻹلكترونيات ويريد تهيئة نفسه للعمل على الروبوتات دون المرور بمسار التحكم الصناعي.
	</li>
	<li>
		أكمل المسارين السابقين ويريد تعزيز قدراته في التحكم باﻵلات ومخاطبتها وصولًا إلى العمل مع الروبوتات وبناء أنظمة <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%82%D8%AF%D9%85%D8%A9-%D9%81%D9%8A-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1514/" rel="">انترنت اﻷشياء</a>.
	</li>
</ul>

<h3 id="-11">
	ما هي اﻹلكترونيات المبرمجة والمتحكمات الصغرية؟
</h3>

<p>
	هي دوائر إلكترونية متكاملة يمكن أن تتغير وظيفتها وفقًا لبرنامج مخصص يُكتب خارجها ثم ينقل إليها. وتقسم هذه الدوائر عمومًا إلى صنفين عامين أولهما دوائر متكاملة تُبرمج كي تؤدي وظيفة إلكترونية محددة مثل "مصفوفة البوابات القابلة للبرمجة FPGA"، وثانيهما دوائر تتتحكم ببقية العناصر الكهربائية واﻹلكترونية وتتبادل المعلومات مع محيطها وتُدعى بالمتحكمات الصغرية Micro-controller وهي بمثابة دماغ مصغّر يتحكم بالدائرة اﻹلكترونية الخارجية كما نريد.
</p>

<p>
	تبدأ هنا ملامح التخاطب مع اﻵلة بالظهور، فهذه المتحكمات قادرة على التواصل مع محيطها وتحسس التغيرات فيها. وستتمكن من استخدام هذه المتحكمات مثلًا في تصميم دوائر تفهم إشارات يدك أو تحلل صوتك لتأمر بعض الطرفيات المتصلة بدائرتها بتنفيذ عمل معين مثل فتح باب أو تشغيل جهاز ما.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146713" href="https://academy.hsoub.com/uploads/monthly_2024_03/03_micro_controller.png.0eec3e2737dfd194d8a299d5de9ca1ac.png" rel=""><img alt="03 micro controller" class="ipsImage ipsImage_thumbnailed" data-fileid="146713" data-ratio="60.80" data-unique="6xznom4c3" style="width: 500px; height: auto;" width="500" src="https://academy.hsoub.com/uploads/monthly_2024_03/03_micro_controller.png.0eec3e2737dfd194d8a299d5de9ca1ac.png"> </a>
</p>

<p style="text-align: center;">
	لوحة تشغيل متحكم صغري يظهر المتحكم في وسطها
</p>

<h3 id="-12">
	كيف تبدأ رحلتك في تعلم اﻹلكترونيات المبرمجة؟
</h3>

<p>
	عليك في <strong>المرحلة اﻷولى</strong> تعلّم البرمجة، والتفكير كمبرمج، فلن تستطيع إكمال هذا المسار دون أن تتقن أساسيات البرمجة و<a href="https://academy.hsoub.com/programming/general/%D8%A3%D9%87%D9%85%D9%8A%D8%A9-%D8%A7%D9%84%D8%AA%D9%81%D9%83%D9%8A%D8%B1-%D8%A7%D9%84%D9%85%D9%86%D8%B7%D9%82%D9%8A-%D9%81%D9%8A-%D8%AA%D8%B9%D9%84%D9%85-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r2095/" rel="">التفكير المنطقي</a>، ستجد الكثير من لغات البرمجة والكثير من اﻵراء المتضاربة حول اختيار اللغة الأفضل، لكني أنصحك بتعلم <a href="https://academy.hsoub.com/programming/python/" rel="">لغة بايثون</a> إذ تُعد عمومًا من اللغات القوية وسهلة التعلم نتيجة لصياغتها القريبة من صياغة الجمل في اللغة اﻹنكليزية، وإن أردت فعلًا احتراف هذا المجال من أوسع أبوابه فعليك بلغتتي <a href="https://academy.hsoub.com/programming/general/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%84%D8%BA%D8%A9-c-%D9%88%D9%85%D9%85%D9%8A%D8%B2%D8%A7%D8%AA%D9%87%D8%A7-%D9%88%D8%AE%D8%B7%D9%88%D8%A7%D8%AA-%D8%AA%D8%B9%D9%84%D9%85%D9%87%D8%A7-r2268/" rel="">C</a> أو <a href="https://academy.hsoub.com/programming/cpp/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-c-r802/" rel="">++C</a> فهما أكثر اللغات استخدامًا في هذا المجال واﻷمر يعود إليك أولًا وأخيرًا.
</p>

<p>
	تحتاج في <strong>المرحلة الثانية</strong> إلى التعرّف على أقسام المتحكمات الصغرية وميزاتها المختلفة، وما الذي تقدّمه لك كل شركة مصنعة وكل عائلة من خلال أوراق المواصفات الخاصة بهذه المعالجات. وهكذا ستكون قادرًا على اختيار المعالج الذي يناسب مشروعك. ولا بد في هذه المرحلة من تفهم طريقة توصيل المتحكم مع بقية عناصر الدائرة اﻹلكترونية وتتدرب على كتابة برامج بسيطة لهذا المتحكم وتعرف كي تنقلها إليه. ولا تنس أن مسار تعلّم اﻹلكترونيات ضروري جدًا في هذه المرحلة.
</p>

<p>
	وعليك في <strong>المرحلة الثالثة</strong> تعلّم طريقة وصل بعض الطرفيات اﻷساسية إلى المتحكم مثل لوحات المفاتيح وبعض أنواع شاشات العرض لتتمكن من إدخال بعض القيم وإخراج نتائج مرئية لما ينفذه برنامجك. وغالبًا ما تستفيد في هذه المرحلة من مكتبات برمجية جاهزة للتحكم بأكثر الطرفيات شيوعًا وكل ما عليك حينها هو دمجها مع شيفرتك وتعلم كيفية استخدامها.
</p>

<p>
	أما <strong>المرحلة الرابعة</strong> واﻷخيرة فهي مرحلة تعلّم العمل على المحاكيات، وهي برمجيات تقرأ شيفرتك وتريك نتيجة تنفيذها قبل ترحيلها إلى المتحكم وبالتالي ستوفّر عليك الوقت والجهد وخاصة عند تصميم دوائر أكثر تعقيدًا.
</p>

<p>
	هذا المسار شديد الخصوصية، فلكل متحكم طريقة مختلفة في البرمجة وطريقة مختلفة في نقل البرنامج إليه وبيئات عمل حاسوبية مختلفة لبرمجته، لكنها تتشابه إجمالًا في الخطوط العريضة ولن يصعب عليك في نهاية هذا المسار من تعلم برمجة متحكمات أخرى وبأقل جهد.
</p>

<h4 id="-13">
	ما الذي تتوقعه من تعلم برمجة المتحكمات الصغرية؟
</h4>

<p>
	ستكون قادرًا عند إكمال هذا المسار التعليمي من:
</p>

<ul>
	<li>
		اختيار المتحكم الصغري الملائم لمشروعك.
	</li>
	<li>
		تصميم الدائرة اﻹلكترونية اللازمة لاستثمار وتشغيل المتحكم.
	</li>
	<li>
		التعامل مع الحساسات والتحكم بتشغيل الكثير من التجهيزات الكهربائية.
	</li>
	<li>
		التعرف على بروتوكولات نقل المعطيات بين اﻷجهزة واستخدامها للتواصل مع التجهيزات المختلفة.
	</li>
	<li>
		كتابة برمجيات صحيحة ونقلها إلى المتحكمات لتنفيذها.
	</li>
</ul>

<h2 id="-14">
	مسار وحدات التحكم المتكاملة والحواسب المصغّرة
</h2>

<p>
	يأتي هذا المسار متممًا ومكملًا للمسارين السابقين، وهو موجّه لمين يريد احتراف بناء أنظمة تحكم متكاملة سواء على الصعيد الصناعي كأنظمة إدارة المعامل أو على الصعيد التقني مثل بناء الروبوتات والتجهيزات اﻹلكترونية الذكية وأجهزة القياس والتحليل اﻵلي (وتُدعى أنظمة هذه التجهيزات باﻷنظمة المدمجة<br>
	embedded systems)
</p>

<h3 id="-15">
	ما هي الوحدات المتكاملة وما هي الحواسب المصغّرة؟
</h3>

<p>
	تُعرّف وحدة التحكم المتكاملة control module بأنها دائرة إلكترونية لها تصميم محدد تضم متحكمًا أو معالجًا مصغرًا يحلل البيانات التي تصل إليه عبر نقاط محددة تُدعى نقاط الدخل ويصدر بيانات أو إشارات إلى نقاط أخرى تُدعى نقاط الخرج.
</p>

<p>
	لن تحتاج في الوحدات المتكاملة إلى الغوص في تفاصيل المعالج أو دائرته بل كل ما عليك فعله هو معرفة كيفية التعامل مع نقاط الدخل والخرج وكتابة برامج للتعامل معها مباشرة. نذكر من هذه الوحدات على سبيل المثال <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%8A-%D9%84%D9%88%D8%AD%D8%A9-%D8%A3%D8%B1%D8%AF%D9%88%D9%8A%D9%86%D9%88-arduino%D8%9F-r1800/" rel="">لوحات أوردوينو Arduino</a> الشهيرة.
</p>

<p>
	تختلف الحواسب المصغّرة عن وحدات التحكم المتكاملة بأنها تمتلك نظام تشغيل حاسوبي وتستطيع الارتباط بطرفيات الحاسوب مثل شاشات العرض ومكبرات الصوت، كما تُكتب برامجها وتُنفّذ كما تكتب برامج الحاسوب تمامًا. لكنها تختلف عن الحواسب بوجود نقاط الدخل والخرج التي يمكنك التحكم فيها من خلال برامجك وربطها بما تشاء من الطرفيات وفق أسس محددة. من أشهر الأمثلة عليها الحاسوب المصغّر <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D8%A7-%D9%87%D9%88-%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-raspberry-pi%D8%9F-r1578/" rel="">راسبيري باي Raspberry pi</a>.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146714" href="https://academy.hsoub.com/uploads/monthly_2024_03/04_raspberry_pi.png.49f96089faa451e442fb2625c7e17070.png" rel=""><img alt="04 raspberry pi" class="ipsImage ipsImage_thumbnailed" data-fileid="146714" data-unique="ru1oopnaw" src="https://academy.hsoub.com/uploads/monthly_2024_03/04_raspberry_pi.png.49f96089faa451e442fb2625c7e17070.png"> </a>
</p>

<p style="text-align: center;">
	الحاسوب المصغّر راسبيري باي 4
</p>

<h3 id="-16">
	كيف تبدأ مسار الوحدات المتكاملة والحواسب المصغّرة؟
</h3>

<p>
	لابد أولًا أن تكمل مسار علم اﻹلكترونيات فهو مسار أساسي جدًا، ثم تنتقل بعد ذلك إلى مسار الإلكترونيات المبرمجة والمتحكمات الصغرية، إذ يساعدك هذا المسار على فهم طريقة كتابة البرامج المخصصة لوحدات التحكم المتكاملة والحواسب المصغّرة دون أدنى جهد. لكن إن قررت تخطي هذا المسار فلا بد على اﻷقل من تعلم إحدى لغتي البرمجة <a href="https://wiki.hsoub.com/Python" rel="external">بايثون</a> أو ++C، لكنك ستبذل جهدًا كبيرًا لفهم النقاط التي تتعلق ببرمجة المتحكمات الصغرية.
</p>

<p>
	إن العمل مع وحدات التحكم المتكاملة أكثر صعوبة من العمل مع الحواسب المصغّرة لأنه عليك في الواقع أن تبني نظام القيادة الخاص بها بنفسك بينما ستتعامل حرفيًا مع نظام تشغيل جاهز ومتطور في الحواسب المصغّرة.
</p>

<p>
	ننصحك بداية باقتناء لوحة أوردوينو (أيًا كان طرازها) ثم تتعلم طريقة توصيل الطرفيات إليها وكيفية كتابة برامج لها ونقلها إلى المتحكم الذي يقود اللوحة. بإمكانك التعرف على <a href="https://wiki.hsoub.com/Arduino" rel="external">اللغة المستخدمة</a> في برمجة هذه اللوحة من خلال موسوعة حسوب التي تقدم توثيقًا عربيًا متكاملًا لها. تساعدك أيضًا المحاكيات الحاسوبية في التأكد من صحة شيفرتك قبل نقلها إلى الوحدة. ويمكنك البحث في اﻹنترنت عن مشاريع جاهزة بسيطة والاشتراك في المناقشات وطرح اﻷسئلة ضمن مجتمعات أوردوينو الافتراضية وستجد بالتأكيد حلولًا لمعظم مشاكلك.
</p>

<p>
	وإن قررت العمل مع الحواسب المصغرة، بإمكانك شراء حاسوب راسبيري باي ثم العمل ضمن سلسلة مقالات "<a href="https://academy.hsoub.com/tags/%D8%AF%D9%84%D9%8A%D9%84%20%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A%20%D8%A8%D8%A7%D9%8A/" rel="">دليل راسبيري باي</a>" التي تقدمها أكاديمية حسوب عن طريقة استخدام هذا الحاسوب من الصفر وحتى مرحلة تطبيق المشاريع المختلفة، كما ستجد في اﻷكاديمية كمًا جيدًا من <a href="https://academy.hsoub.com/programming/os-embedded-systems/" rel="">المقالات ومقاطع الفيديو</a> العملية التي تساعدك على التعلم بصورة أفضل.
</p>

<h3 id="-17">
	ما الذي تتوقعه من تعلم برمجة وحدات التحكم المتكاملة والحواسب المصغّرة؟
</h3>

<p>
	ستكون قادرًا عند إكمال هذا المسار التعليمي من:
</p>

<ul>
	<li>
		اختيار وحدة التحكم المتكاملة أو الحاسوب المصغّر الذي يلبي احتياجك.
	</li>
	<li>
		وصل الطرفيات إلى وحدات التحكم بالشكل الصحيح.
	</li>
	<li>
		كتابة برامج وتطبيقات لتنفيذ مختلفة اﻷفكار التي تتعلق بالتحكم بالوسط المحيط وتبادل البيانات معه.
	</li>
	<li>
		تصميم وتحريك روبوتات بسيطة.
	</li>
	<li>
		تعلم الأساسيات اللازمة لبناء منظومات إنترنت اﻷشياء IoT والروبوتات المتقدمة.
	</li>
</ul>

<h2 id="-18">
	مسار الروبوتكس
</h2>

<p>
	يشمل علم الروبوتات علوم الحركة واﻹلكترونيات واﻵلات والبرمجة، فغايته اﻷساسية التخاطب الفعال مع آلة تستطيع من تلقاء نفسها تنفيذ أعمال متكاملة عالية التعقيد بناء على برمجيات صممت خصيصًا لإنجاز تلك اﻷعمال.
</p>

<h3 id="-19">
	كيف تبدأ مسار تعلم تصميم الروبوتات وبرمجتها
</h3>

<p>
	عليك في <strong>المرحلة اﻷولى</strong> أن تكمل مسار علم اﻹلكترونيات ثم تنتقل إلى مسار التحكم الصناعي وقيادة اﻵلة فالروبوتات في معظمها آلات متحركة ولا بد من التعامل مع المحركات والحساسات التي تساعدها على التوجه والحركة.
</p>

<p>
	أتقن <strong>في المرحلة الثانية</strong> مسار المتحكمات المصغّرة وكيفية التخاطب مع الطرفيات المختلفة مثل المحركات الصغيرة والحساسات. أما إذا أردت استخدام طرفيات جاهزة مثل أنظمة قيادة محرّك متكاملة أو أنظمة حساسات جاهزة، فعليك الانتقال إلى مسار الوحدات المبرمجة المتكاملة وستجد كمًا هائلًا من الطرفيات التي تساعدك على بناء الروبوتات.
</p>

<p>
	ولا بد في <strong>المرحلة الثالثة</strong> من الإطلاع على طريقة عمل بعض الروبوتات الجاهزة واﻷجزاء المكوّنة منها وطريقة برمجتها ثم تجريب بعض المشاريع الجاهزة كي تطلع على التجهيزات الأكثر استخدامًا وطريقة توصيلها وعملها، وسيكسبك ذلك خبرة عملية ويساعدك في تجنب الكثير من اﻷخطاء التي يقع فيها المبتدئين.
</p>

<p>
	في الواقع تتشعب علوم الروبوتات وأنواعها كثيرًا ولكل منها طريقة عمل محددة وأسلوب برمجة محددة، وللاطلاع أكثر على هذا الموضوع عُد إلى مقال "<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">دليلك الشامل إلى برمجة الروبوت</a>" فستجد فيه كل ما تحتاجه حول تعلم برمجة الروبوت.
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="146715" href="https://academy.hsoub.com/uploads/monthly_2024_03/05_mini_robot.png.f9cb90af99cb2d105de057b1287e7437.png" rel=""><img alt="05 mini robot" class="ipsImage ipsImage_thumbnailed" data-fileid="146715" data-unique="s8zorih0g" src="https://academy.hsoub.com/uploads/monthly_2024_03/05_mini_robot.png.f9cb90af99cb2d105de057b1287e7437.png"> </a>
</p>

<p style="text-align: center;">
	صورة تمثيلية لروبوت متحرك
</p>

<h3 id="-20">
	ماذا تتوقع من تعلم الروبوتكس
</h3>

<p>
	ستكون قادرًا عند إكمال هذا المسار التعليمي من:
</p>

<ul>
	<li>
		فهم آلية عمل الروبوتات بأنواعها.
	</li>
	<li>
		استخدام الروبوتات بفعالية أيًا كان نوعها.
	</li>
	<li>
		برمجة رويوت معين لينفذ أية أعمال تريدها.
	</li>
	<li>
		تصميم روبوتات بسيطة إلى متوسطة التعقيد من الصفر وبرمجتها.
	</li>
</ul>

<h2 id="-21">
	الخلاصة
</h2>

<p>
	قدمنا في هذا المقال فكرة عن المسارات التعليمية التي تلزم أي شخص يرغب في احتراف العمل مع الأنظمة المدمجة والروبوتات وشرحنا فيها بشكل مبسط ما يضمه كل مسار وماهي المراحل التي يمر بها والنتيجة المتوقعة لما تعلمّه في نهاية كل مسار. مع ذلك، ليس من الضرورة التقيد تمامًا بالترتيب الذي اقترحناه لكنه النهج اﻷسلم لليافع الذي لا يمتلك شيئًا سوى العزيمة والالتزام!
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%AC%D9%85%D9%8A%D8%B9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D9%88%D8%A7%D9%84%D8%AA%D8%AD%D8%B6%D9%8A%D8%B1-%D9%84%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85%D9%87-r2078/" rel="">تجميع راسبيري باي والتحضير لاستخدامه</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A5%D9%86%D8%B4%D8%A7%D8%A1-%D9%83%D8%AA%D8%A7%D8%A8-%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D8%B3%D9%83%D8%B1%D8%A7%D8%AA%D8%B4-%D9%88%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-r1519/" rel="">إنشاء كتاب تفاعلي باستخدام سكراتش وحاسوب راسبيري باي</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D9%84%D8%B9%D8%A8%D8%A9-%D8%AD%D8%B3%D9%8A%D8%A9-%D8%AA%D9%81%D8%A7%D8%B9%D9%84%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1934/" rel="">تصميم وتنفيذ لعبة حسية تفاعلية باستخدام لوحة راسبيري باي بيكو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B5%D9%85%D9%8A%D9%85-%D9%88%D8%AA%D9%86%D9%81%D9%8A%D8%B0-%D8%A2%D9%84%D8%A9-%D9%85%D9%88%D8%B3%D9%8A%D9%82%D9%8A%D8%A9-%D8%A8%D8%A7%D8%B3%D8%AA%D8%AE%D8%AF%D8%A7%D9%85-%D9%84%D9%88%D8%AD%D8%A9-%D8%B1%D8%A7%D8%B3%D8%A8%D9%8A%D8%B1%D9%8A-%D8%A8%D8%A7%D9%8A-%D8%A8%D9%8A%D9%83%D9%88-r1910/" rel="">تصميم وتنفيذ آلة موسيقية باستخدام لوحة راسبيري باي بيكو</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-%D8%A7%D9%84%D8%B1%D9%88%D8%A8%D9%88%D8%AA-%D8%A7%D9%84%D8%AF%D9%84%D9%8A%D9%84-%D8%A7%D9%84%D8%B4%D8%A7%D9%85%D9%84-r1855/" rel="">برمجة الروبوت: الدليل الشامل</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2276</guid><pubDate>Tue, 19 Mar 2024 12:00:01 +0000</pubDate></item><item><title>&#x623;&#x646;&#x648;&#x627;&#x639; &#x623;&#x646;&#x638;&#x645;&#x629; &#x627;&#x644;&#x62A;&#x634;&#x63A;&#x64A;&#x644;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%86%D9%88%D8%A7%D8%B9-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_11/--.png.505c9f546fbd3d22b25aa3a7420059cc.png" /></p>
<p>
	نتعرف في مقال اليوم على مفهوم أنظمة التشغيل وما هي أشهر أنواع أنظمة التشغيل ونقارن بين أنواع أنظمة التشغيل المختلفة ونوضح مميزاتها وأبرز الاختلافات فيما بينها.
</p>

<h2 id="">
	مفهوم أنظمة التشغيل
</h2>

<p>
	نظام تشغيل الحاسوب هو برنامج ضروري يعمل كوسيط بينك كمستخدم وبين عتاد الحاسوب الذي تستخدمه يمكّنك من استخدام الحاسوب بسهولة ويفهم أوامرك ويعطيك النتيجة المطلوبة، كما يتولى إدارة كافة موارد الحاسوب ويضمن استخدامها بشكل فعال.
</p>

<p>
	تثّبت أنظمة التشغيل عادةً بشكل ضمني في أي جهاز حاسوب تشتريه أو تتطلب تثبيتها بشكل يدوي، ويوفر كل نظام تشغيل واجهة رسومية أو نصية خاصة به تسهل عليك التعامل مع حاسوبك وتكون قابلة للتخصيص وفق احتياجاتك وتتلقى أنظمة التشغيل حالها كحال أي برمجيات أخرى العديد من التحسينات الدورية لإضافة ميزات جديدة أو إصلاح أخطاء سابقة.
</p>

<p>
	تحتاج مختلف أنواع الأجهزة الإلكترونية إلى نظام تشغيل سواء كانت أجهزة الحواسيب المكتبية أو الأجهزة اللوحية والهواتف الذكية و أجهزة الصراف الآلي والساعات الذكية ووحدات التحكم بالألعاب وغيرها من الأجهزة لتجعلها قابلة للاستخدام فنظام التشغيل ضروري لعمل أي جهاز إلكتروني وبدونه لن يكون هذا الجهاز سوى خردة لا تقوم بأي عمل.
</p>

<p>
	بالإضافة إلى هذه الأنظمة ذات الأغراض العامة، تعمل أنظمة التشغيل ذات الأغراض الخاصة على أجهزة الكمبيوتر الصغيرة التي تتحكم في خطوط التجميع والطائرات وحتى الأجهزة المنزلية. إنها أنظمة تستجيب فوريًا، أي مصممة لتوفير استجابة سريعة لأجهزة الاستشعار واستخدام مدخلاتها للتحكم في الآلات. كما تم تطوير أنظمة التشغيل للأجهزة المحمولة مثل الهواتف الذكية والأجهزة اللوحية. يُعد نظام التشغيل iOS التابع لشركة آبل Apple Inc، والذي يعمل على أجهزة أيفون iPhone وأيباد iPad، ونظام أندرويد Android التابع لشركة غوغل Google Inc. هما نظامان بارزان لتشغيل الهواتف المحمولة.
</p>


<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			دورة علوم الحاسوب
		</p>

		<p class="banner-subtitle">
			دورة تدريبية متكاملة تضعك على بوابة الاحتراف في تعلم أساسيات البرمجة وعلوم الحاسوب
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://academy.hsoub.com/learn/computer-science/" rel="">اشترك الآن</a>
		</div>
	</div>

	<div class="banner-img">
		<img alt="دورة علوم الحاسوب" src="https://academy.hsoub.com/learn/assets/images/courses/computer-science.png">
	</div>
</div>




<h2 id="-1">
	مهام نظام التشغيل
</h2>

<p>
	يعمل نظام التشغيل طوال فترة تشغيل جهاز الحاسوب ويتولى القيام بالعديد من المهام التي تضمن عمل حاسوبك بالشكل المطلوب وأهمها:
</p>

<ol>
	<li>
		توفير واجهة مستخدم رسومية GUI أو واجهة أوامر نصية تمكّن المستخدم من التفاعل مع تطبيقات وعتاد الحاسوب بسهولة.
	</li>
	<li>
		إدارة كافة موارد الحاسوب مثل وحدة المعالجة المركزية CPU أو المعالج والذاكرة وأقراص التخزين وضمان تخصيصها بالشكل الأمثل للبرامج المختلفة.
	</li>
	<li>
		تنسيق عملية تنفيذ البرامج والتطبيقات التي يشغلها المستخدم.
	</li>
	<li>
		تنظيم أمور معالجة وتخزين البيانات على أقراص التخزين.
	</li>
	<li>
		حماية المعلومات المخزنة على حاسوبك ومنع الوصول غير المصرح به إلى البرامج والبيانات.
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B9-%D9%81%D9%87%D9%85-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-files-%D9%88%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D9%84%D9%81%D8%A7%D8%AA-file-systems-r979/" rel="">إدارة الملفات</a> والمجلدات.
	</li>
	<li>
		إدارة أجهزة الإدخال والإخراج وضمان عملها بشكل صحيح.
	</li>
	<li>
		الاتصال بالشبكة واتخاذ إجراءات أمان تضمن حمايتها.
	</li>
	<li>
		اكتشاف ومراقبة أي أخطاء قد تحدث أثناء تشغيل البرامج أو أي مهمة أخرى.
	</li>
	<li>
		جدولة المهام وتحديد ترتيب تنفيذها.
	</li>
</ol>

<h2 id="-2">
	أشهر أنواع أنظمة التشغيل
</h2>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="138661" href="https://academy.hsoub.com/uploads/monthly_2023_11/--.png.4cd0a445d67a139495c08abdd27e7700.png" rel=""><img alt="أنواع أنظمة التشغيل" class="ipsImage ipsImage_thumbnailed" data-fileid="138661" data-ratio="65.17" data-unique="powffzq4s" style="width: 600px; height: 391px;" width="900" src="https://academy.hsoub.com/uploads/monthly_2023_11/--.thumb.png.743025ecaa7ae1a368597d1e0278d103.png"></a>
</p>

<p>
	هناك أنواع متعددة لأنظمة تشغيل الحاسوب، ولكننا سنهتم في مقال اليوم بتوضيح أشهر أنواع أنظمة التشغيل الرئيسية المستخدمة في الأجهزة المختلفة والتي تشمل:
</p>

<ul>
	<li>
		نظام تشغيل يونكس UNIX
	</li>
	<li>
		نظام تشغيل لينكس LINUX
	</li>
	<li>
		نظام التشغيل ماك أو إس macOS
	</li>
	<li>
		نظام التشغيل إم إس دوس MS-DOS
	</li>
	<li>
		نظام تشغيل مايكروسوفت ويندوز Windows
	</li>
	<li>
		نظام تشغيل كروم Chrome OS
	</li>
	<li>
		نظام تشغيل أي أو إس iOS
	</li>
	<li>
		نظام تشغيل أندرويد Android
	</li>
</ul>

<p>
	لنتعرف بمزيد من التفصيل على كل نظام من بينها وأبرز مميزاته واستخداماته.
</p>

<h3 id="unix">
	نظام التشغيل يونكس UNIX
</h3>

<p>
	نظام يونكس UNIX أحد أقدم أنظمة التشغيل فقد طور عام 1969 باستخدام <a href="https://academy.hsoub.com/programming/c/" rel="">لغة البرمجة C</a> وكان متاحًا مجانًا خلال سنواته الأولى ثم أصبحت بعض إصداراته تجارية، يتميز نظام يونكس بالمرونة والتكامل وهو نظام متعدد المستخدمين ومتعدد المهام، وقد شكّل الأساس لتطوير أنظمة تشغيل شبيهة به أو متوافقة معه مثل نظام التشغيل لينكس Linux وماك MacOS X.
</p>

<p>
	يوفر نظام يونكس واجهة <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر أوامر CLI </a> تسمى صدفة يونكس Unix shell تستخدم لتوجيه الأوامر لنظام التشغيل والتفاعل معه، وفي أوائل الثمانينيات أضيف لنظام يونكس واجهة مستخدم رسومية إلى جانب واجهة سطر الأوامر لتجعل التعامل معه أكثر سهولة.
</p>

<p>
	يقتصر استخدام نظام يونكس اليوم على أجهزة الحاسوب العملاقة عالية الأداء كالخوادم ومراكز البيانات وحواسيب الشركات الكبيرة والجامعات وتشغيل التطبيقات المتطورة كتطبيقات تحليل البيانات الضخمة.
</p>

<h3 id="linux">
	نظام التشغيل لينكس LINUX
</h3>

<p>
	<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel="">نظام التشغيل لينكس Linux</a> هو نظام تشغيل مجاني صغير الحجم ومفتوح المصدر أي أن الشيفرة المصدرية الخاصة به متاحة لأي شخص ويمكن تعديلها وإعادة توزيعها، وقد طور لينكس بالاعتماد على نظام التشغيل يونكس Unix وباستخدام لغة البرمجة C ولغة التجميع assembly وهو يتضمن نسخة محسنة من برنامج صدفة يونكس تسمى <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D8%B5%D8%AF%D9%81%D8%A9-%D8%A8%D8%A7%D8%B4-bash-r606/" rel="">صدفة باش bash</a>.
</p>

<p>
	أول من برمج نظام لينكس هو طالب جامعي فنلندي يدعى Linus Torvalds ثم تولى العمل عليه المبرمج الأمريكي Richard Stallman وطوره ليصبح اليوم أحد أكثر أنظمة التشغيل مرونة وأمانًا واستقرارًا وهو سهل التخصيص بشكل كبير ما يجعله النظام المفضل من قبل المستخدمين التقنيين والأكثر استخدامًا في الخوادم والحواسيب العملاقة إضافة إلى الحواسيب المكتبية الشخصية كما أنه يستخدم في الروبوتات وأجهزة <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%88-%D8%A5%D9%86%D8%AA%D8%B1%D9%86%D8%AA-%D8%A7%D9%84%D8%A3%D8%B4%D9%8A%D8%A7%D8%A1-iot-r1783/" rel="">إنترنت الأشياء IoT</a>.
</p>

<p>
	يوفر نظام لينكس مجموعة متنوعة من الإصدارات أو التوزيعات distributions مثل توزيعة أبونتو Ubuntu وديبيان Debian ومينت Mint وجينتو Gentoo …إلخ. كل منها مصمم لاحتياجات معينة لذا عند التفكير في استخدام هذا النظام عليك أن تختار التوزيعة التي تناسب متطلباتك بعناية، ولمطالعة مزيد من التفاصيل حول توزيعات لينكس بينها أنصح بمطالعة مقال <a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D9%88%D9%84%D9%85%D8%A7%D8%B0%D8%A7-%D8%AA%D9%88%D8%AC%D8%AF-100-%D8%AA%D9%88%D8%B2%D9%8A%D8%B9%D8%A9-%D9%85%D9%86%D9%87%D8%9F-r698/" rel="">ما هو نظام لينكس ولماذا توجد 100 توزيعة منه؟</a>.
</p>


<div class="banner-container ipsBox ipsPadding">
	<div class="inner-banner-container">
		<p class="banner-heading">
			هل ترغب في تصميم وتطوير برمجيات متقنة لأعمالك؟
		</p>

		<p class="banner-subtitle">
			وظّف مهندس برمجيات خبير من مستقل
		</p>

		<div>
			<a class="ipsButton ipsButton_large ipsButton_primary ipsButton_important" href="https://mostaql.com/freelancers/skill/software-architecture" rel="external">أضف مشروعك الآن</a>
		</div>
	</div>
</div>



<h3 id="macos">
	نظام التشغيل ماك أو إس macOS
</h3>

<p>
	نظام التشغيل macOS هو نظام تشغيل شهير طورته شركة أبل Apple الأمريكية عام 1984، وهو مخصص للعمل على حواسيب ماك التي تصنعها أبل فقط مثل جهاز Apple Macbook و Apple Macbook Pro و Apple Macbook Air كما يتكامل مع مع منتجات شركة أبل الأخرى مثل أيفون iPhone وأيباد iPad وساعة أبل Apple Watch وخدمة آي كلاود iCloud على عكس لينكس Linux أو ويندوز Windows والتي يمكن أن تعمل على مجموعة كبيرة من أجهزة الحاسوب من مختلف الشركات المصنعة.
</p>

<p>
	يتميز نظام ماك macOS بأمانه واستقراره ويوفر واجهة سهلة الاستخدام ذات تصميم أنيق وهو فعليًا أول نظام تشغيل أدخل واجهة المستخدم الرسومية GUI بدلًا من كتابة الأوامر في نافذة سطر أوامر وهو النظام الذي ألهم شركة مايكروسوفت لتطوير واجهة المستخدم الرسومية الخاصة بنظام تشغيلها ويندوز Windows.
</p>

<p>
	يطور نظام ماك باستمرار ويوفر المزيد من التحديثات ليحسن تجربة المستخدم ومن أشهر إصدارته macOS X و macOS 11 Big Sur و macOS Monterey.
</p>

<h3 id="msdos">
	نظام التشغيل إم إس دوس MS-DOS
</h3>

<p>
	نظام دوس MS-DOS واحد من أقدم أنظمة التشغيل طورته مايكروسوفت في الثمانينيات لأجهزة الحاسوب الشخصية، وكلمة DOS اختصار لـ Disk Operating System وتعني نظام تشغيل القرص، وهو نظام واجهة سطر أوامر بسيط وبدائي يمكن من أداء مهمة واحدة في الوقت الواحد ولمستخدم واحد يتم التفاعل معه عن طريق كتابة أوامر نصية لكل أمر خيارات محددة ويوفر مجموعة من الوظائف مثل إدارة الملفات وتخصيص موارد النظام وتشغيل التطبيقات وتخصيص موارد النظام والتحكم في الأجهزة.
</p>

<p>
	ظل نظام دوس مستخدمًا في معظم أجهزة الحواسيب الشخصية فترة الثمانينيات وأوائل التسعينيات قبل أن تظهر أنواع أنظمة تشغيل أخرى أكثر تطورًا وتوفر ميزات لا يوفرها كتعدد المهام وواجهة المستخدم، وبالرغم من بساطة نظام تشغيل MS-DOS إلا أنه لعب دورًا مهمًا في تطوير أنظمة تشغيل أكثر تطورًا مثل نظام ويندوز، ولا زال يضمن كتطبيق في أنظمة ويندوز لأداء بعض المهام.
</p>

<h3 id="windows">
	نظام التشغيل ويندوز Windows
</h3>

<p>
	نظام التشغيل ويندوز Windows هو أحد أكثر أنظمة التشغيل شهرة واستخدامًا طورته شركة مايكروسوفت عام 1985 لتشغيل أجهزة الحواسيب الشخصية ليكون امتدادًا لنظام تشغيلها MS-DOS المعتمد على واجهة سطر الأوامر.
</p>

<p>
	من مميزات نظام التشغيل ويندوز هو كونه نظام سهل الاستخدام من قبل غير المختصين بفضل واجهته الرسومية الواضحة البسيطة، وهو نظام متعدد المستخدمين و<a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%AB%D8%A7%D9%85%D9%86-%D8%AA%D8%B9%D8%AF%D8%AF-%D8%A7%D9%84%D9%85%D9%87%D8%A7%D9%85-multitasking-%D9%81%D9%8A-%D8%A7%D9%84%D8%AD%D9%88%D8%A7%D8%B3%D9%8A%D8%A8-r1011/" rel="">متعدد المهام</a>، حيث يسمح للمستخدمين بتشغيل واستخدام برامج متعددة في نفس الوقت، ويدعم مجموعة واسعة من الأجهزة والبرامج.
</p>

<p>
	يسيطر نظام تشغيل ويندوز اليوم على سوق أنظمة التشغيل ويشغل معظم أجهزة الحواسيب الشخصية -أو ما يعرف بالحواسيب المتوافقة مع IBM- من علامات تجارية مختلفة مثل حواسيب Toshiba و HP و Dell و Lenovo وغيرها لكنه ليس نظامًا مجانيًا بل يحتاج لدفع رسوم ترخيص لاستخدامه، وهو يوفر تحديثات مستمرة وإصدارات مختلفة بميزات وأسعار مختلفة وأحدث إصدار منه عند كتابة المقال هو أحدث هو <a href="https://academy.hsoub.com/apps/operating-systems/windows/%D9%85%D8%AF%D8%AE%D9%84-%D8%A5%D9%84%D9%89-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-11-%D9%88%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA%D9%87-r704/" rel="">ويندوز11</a>.
</p>

<h3 id="ios">
	نظام إي أو إس iOS
</h3>

<p>
	نظام iOS هو نظام تشغيل طورته شركة أبل Apple Inc وأطلق لأول مرة عام عام 2007 مع ظهور شاشات اللمس للهواتف المحمولة وهو موجه لتشغيل هواتف آيفون ولا يوجد سوى متجر تطبيقات واحد هو متجر تطبيقات أبل Apple App Store يمكن من خلاله تنزيل التطبيقات لأجهزة آيفون.
</p>

<p>
	يتميز بواجهة المستخدم وأمانه وسهولة استخدامه كما يوفر مجموعة كبيرة من التطبيقات والميزات مثل المساعد الشخصي سيري Siri وميزة مشاركة الوسائط بسهولة مع مستخدمي iOS القريبين باستخدام ميزة AirDrop وغيرها من الميزات التي توفر الوقت والجهد وهو يحدّث بشكل مستمر ليوفر المزيد من الميزات لمستخدميه.
</p>

<h3 id="chromeos">
	نظام تشغيل كروم Chrome OS
</h3>

<p>
	نظام التشغيل كروم Chrome OS هو نظام تشغيل مفتوح المصدر طورته جوجل عام 2011 بالاعتماد على نظام التشغيل لينكس وهو مخصص للعمل على أجهزة Chromebook وهي نوع من أجهزة الحاسوب مصممة لتنفيذ المهام بسهولة وسرعة فهي تختلف عن الحواسيب التقليدية بكونها مصممة للعمل وهي متصلة بالإنترنت أكثر من العمل دون اتصال.
</p>

<p>
	يتميز نظام التشغيل كروم بسهولة الاستخدام ويوفر بيئة سطح مكتب تشبه نظام ويندوز لكنه يعمل ضمن متصفح ويب ويستخدمها كواجهة مستخدم رئيسية فالهدف الأساسي من نظام التشغيل كروم هو تشغيل تطبيقات الويب ضمن الهواتف المحمولة حيث يمكنك من خلاله مشاهدة مقاطع الفيديو وتصفح شبكات التواصل الاجتماعي والقيام بالعديد من الأمور التي تقوم بها عادة ضمن أنظمة التشغيل الأخرى لكن من داخل بيئة متصفح.
</p>

<p>
	لا تخلط بين متصفح كروم ونظام تشغيل كروم فمتصفح كروم هو تطبيق مخصص للوصول إلى الإنترنت ويعمل على جميع الأنظمة الأساسية مثل ويندوز Windows وماك أو إس macOS وأندرويد Android أما نظام تشغيل كروم فهو نظام مخصص لتشغيل أجهزة Chromebook.
</p>

<h3 id="android">
	نظام تشغيل أندرويد Android
</h3>

<p>
	نظام التشغيل أندرويد Android هو نظام تشغيل من جوجل مخصص للأجهزة المحمولة التي تعمل باللمس ويستخدم في طيف واسع من الأجهزة مثل الهواتف الذكية والأجهزة اللوحية والساعات الذكية كما أنه يشغل العديد من التلفزيونات الذكية وتستخدمه علامات تجارية مختلفة مثل LG و Samsung و HUAWEI.
</p>

<p>
	يعد نظام التشغيل أندرويد نظام مجاني ومفتوح المصدر فهو يعتمد في برمجته على نسخة معدلة من نواة نظام لينكس Linux kernel كما يستخدم عدة برامج مفتوحة المصدر التي طورتها جوجل بشكل أساسي للأجهزة المحمولة، لكن تجدر الإشارة إلى أن نظام تشغيل أندرويد المضمن في الهواتف الذكية قد يتضمن عدة برامج أخرى مغلقة المصدر كجزء من خدمات متجر التطبيقات جوجل بلاي Google Play والتي تعتمد عليها جوجل بكسب الأرباح.
</p>

<p>
	تطور جوجل نظام التشغيل بصورة دورية وتضيف له العديد من الميزات، أحدث إصدار رئيسي لحظة كتابة هذا المقال هو Android 13 وقريبًا سيصدر Android 14، وفي حال كنت تستخدم جهاز أندرويد فيمكنك معرفة الإصدار المثبت على جهازك وتحديثه من خلال قائمة الإعدادات ثم حول الهاتف.
</p>

<h2 id="-3">
	مقارنة بين أنواع أنظمة التشغيل
</h2>

<p>
	قد تتساءل لماذا توجد أنواع أنظمة تشغيل مختلفة مستخدمة على الأجهزة الإلكترونية وأي نظام علي اختياره؟ والجواب أن لكل نظام تشغيل مزاياه وعيوبه واختيار الإصدار المناسب لك يعتمد على نوع الجهاز المستخدم والتطبيقات التي تحتاج للتعامل معها وخبرتك في التعامل مع نظام التشغيل وغيرها من العوامل بحسب أولوياتك واحتياجاتك.
</p>

<p>
	فنظام ويندوز على سبيل المثال يستهلك موارد أعلى من نظام لينكس وماك لكونه يدعم تطبيقات أكثر لذا قد لا يكون استخدامه مفضلًا على حاسوب ضعيف الأداء، من جهة أخرى يستهلك نظام ماك موارد أقل من أنظمة التشغيل الأخرى لكنه يوفر تطبيقات محدودة ولا يناسب بعض التطبيقات كالألعاب، أما نظام لينكس فهو يوفر أداءً عاليًا وخيارات تخصيص متعددة ومجموعة تطبيقات متنوعة مفتوحة المصدر لكنه يتطلب معرفة تقنية ويصعب استخدامه على المستخدمين العاديين بل يشيع استخدامه بين المبرمجين.
</p>

<p>
	وفي حال كنت تستخدم هاتفًا جوالًا ففي هذه الحالة عليك اختيار نظام تشغيل مصمم ليتناسب مع صغر حجم شاشات الهواتف ومحدودية مواردها وأبرز خيارين متاحين للاستخدام هما نظام التشغيل أندرويد Android ونظام التشغيل iOS، ومن الأفضل اختيار هاتف يعمل أندرويد إذا كنت تحتاج لهاتف يوفر لك خيارات تخصيص عالية ويمكّنك من تنزيل تطبيقات متنوعة من خلال متجر التطبيقات الخاص به Google Play الذي يضم ملايين التطبيقات أو غيره من المصادر العديدة الأخرى على الويب.
</p>

<p>
	لكن تذكر أن نظام أندرويد مفتوح المصدر ما يجعله عرضة للمشاكل الأمنية أكثر من نظام iOS، لذا في حال كنت تفضل الأمن والحماية على تنوع التطبيقات فنظام تشغيل iOS المخصص لأجهزة آبل هو الخيار الأنسب.
</p>

<h2 id="-4">
	الخلاصة
</h2>

<p>
	تعرفنا في مقال اليوم على أبرز أنواع أنظمة التشغيل ورأينا أنها برامج أساسية لا غنى عنها فهي تدير حواسيبنا وهواتفنا الذكية وغيرها من الأجهزة الإلكترونية التي نستخدمها وتتحكم بمواردها وتسهل علينا التعامل معها ووضحنا أهم أنواع أنظمة التشغيل الرائجة حاليًا وأبرز مميزاتها وأنواع الأجهزة التي تستخدمها.
</p>

<h2 id="-5">
	اقرأ أيضًا
</h2>

<ul>
	<li>
		النسخة العربية الكاملة من كتاب <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">أنظمة التشغيل للمبرمجين</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/apps/operating-systems/%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84/" rel="">مدخل إلى نظام التشغيل Operating System</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AF%D9%88%D8%B1-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%AA%D9%86%D8%B8%D9%8A%D9%85%D9%87-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1723/" rel="">دور نظام التشغيل وتنظيمه في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/devops/linux/%D8%AA%D8%AB%D8%A8%D9%8A%D8%AA-%D9%86%D8%B8%D8%A7%D9%85-%D9%84%D9%8A%D9%86%D9%83%D8%B3-%D8%AF%D8%A7%D8%AE%D9%84-%D9%86%D8%B8%D8%A7%D9%85-%D9%88%D9%8A%D9%86%D8%AF%D9%88%D8%B2-%D9%81%D9%8A-%D8%A8%D9%8A%D8%A6%D8%A9-%D9%88%D9%87%D9%85%D9%8A%D8%A9-r577/" rel="">تثبيت نظام لينكس داخل نظام ويندوز في بيئة وهمية</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">2172</guid><pubDate>Sat, 04 Nov 2023 13:00:00 +0000</pubDate></item><item><title>&#x637;&#x631;&#x64A;&#x642;&#x629; &#x639;&#x645;&#x644; &#x627;&#x644;&#x631;&#x627;&#x628;&#x637; &#x627;&#x644;&#x62F;&#x64A;&#x646;&#x627;&#x645;&#x64A;&#x643;&#x64A; &#x645;&#x639; &#x627;&#x644;&#x645;&#x643;&#x62A;&#x628;&#x627;&#x62A; &#x641;&#x64A; &#x645;&#x639;&#x645;&#x627;&#x631;&#x64A;&#x629; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1967/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_04/---------.png.0a5a5761fde52d5cf3c6f6d6b61e28b9.png" /></p>
<p>
	يوفر وجود <span ipsnoautolink="true">الربط الديناميكي Dynamic Linking</span> بعض المزايا التي يمكننا الاستفادة منها وبعض المشاكل الإضافية التي يجب حلها للحصول على نظام فعّال.
</p>

<h2>
	إصدارات المكتبات
</h2>

<p>
	إحدى المشاكل المُحتمَلة هي وجود إصدارات مختلفة للمكتبات. لكن هناك احتمال أقل بكثير لوجود مشاكل عند استخدام المكتبات الساكنة، حيث تُدمَج شيفرة المكتبة البرمجية مباشرةً في الملف الثنائي الخاص بالتطبيق. إن أردتَ استخدام إصدار جديد من المكتبة، فيجب إعادة تصريفها في ملف ثنائي جديد لتحل محل الإصدار القديم. يُعَد ذلك أمرًا غير عملي إلى حد ما بالنسبة للمكتبات الشائعة وأكثرها شيوعًا مكتبه libc والمُضمَّنة في معظم التطبيقات. إذا كانت المكتبة متوفرة فقط بوصفها مكتبة ساكنة، فيجب إعادة بناء كل تطبيق في النظام عند أي تعديل فيها.
</p>

<p>
	يمكن أن تسبّب التعديلات في طريقة عمل المكتبة الديناميكية مشاكلًا متعددة. تكون التعديلات في أحسن الأحوال متوافقة تمامًا دون تغيير أيّ شيء مرئي خارجيًا، ولكن يمكن أن تتسبب التعديلات في تعطل التطبيق مثل تغير الدالة التي تأخذ النوع <code>int</code> لتأخذ النوع <code>int *‎</code>. الأسوأ من ذلك هو أن يغيّر إصدارُ المكتبة الجديد الدلالات ويعيد قيمًا مختلفة وخاطئة فجأةً. يمكن أن يكون هذا خطأً يصعب تعقّبه، حيث إن تعطل أحد التطبيقات، فيمكنك استخدام منقّح أخطاء Debugger لعزل مكان حدوث الخطأ، بينما يمكن أن يظهر تلف البيانات أو تعديلها فقط في أجزاء أخرى من التطبيق.
</p>

<p>
	يتطلب <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B1%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-dynamic-linking-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1965/" rel="">الرابط الديناميكي</a> طريقة لتحديد إصدار المكتبات في النظام بحيث يمكن التعرّف على التعديلات الأحدث. هناك عدد من الأنظمة التي يمكن للرابط الديناميكي الحديث استخدامها للعثور على الإصدارات الصحيحة من المكتبات التي سنوضّحها فيما يلي.
</p>

<h3>
	نظام sonames
</h3>

<p>
	يُستخدَم نظام <code>sonames</code> لإضافة بعض المعلومات الإضافية إلى مكتبة للمساعدة في تحديد الإصدارات. يسرد التطبيق المكتبات التي يريدها في الحقول <code>DT_NEEDED</code> ضمن القسم الديناميكي للملف الثنائي، وتوجد المكتبة الفعلية في ملف على القرص الصلب ضمن المجلد <code>‎/lib</code> لمكتبات النظام الأساسية أو المجلد <code>‎/usr/lib</code> للمكتبات الاختيارية.
</p>

<p>
	يتطلب وجودُ إصدارات متعددة من المكتبة على <a href="https://academy.hsoub.com/certificates/comptia/%D8%A7%D9%84%D9%82%D8%B1%D8%B5-%D8%A7%D9%84%D8%B5%D9%84%D8%A8-%D8%A7%D9%84%D9%87%D9%8A%D9%83%D9%84%D8%A9%D8%8C-%D8%A7%D9%84%D9%85%D9%88%D8%A7%D8%B5%D9%81%D8%A7%D8%AA-%D9%88%D8%A7%D9%84%D8%AA%D9%87%D9%8A%D8%A6%D8%A9-r60/" rel="">القرص الصلب</a> استخدامَ أسماء ملفات مختلفة. لذا يستخدم نظام <code>sonames</code> مجموعة من الأسماء وروابطًا إلى نظام الملفات لبناء تسلسل هرمي من المكتبات من خلال تقديم مفهوم التعديلات الرئيسية Major والثانوية Minor للمكتبة. يُعَد التعديل الثانوي تعديلًا متوافقًا مع إصدار سابق من المكتبة، ويتكون من إصلاحاتٍ للأخطاء فقط. بينما يُعَد التعديل الرئيسي أي تعديل غير متوافق مثل تغيير دخل الدوال أو الطريقة التي تتصرف بها الدالة.
</p>

<p>
	تشكّل الحاجة إلى الاحتفاظ بكل تعديل مكتبة رئيسي أو ثانوي في ملف منفصل على القرص الصلب أساسَ تسلسل المكتبات الهرمي. يكون اسم المكتبة هو <code>libNAME.so.MAJOR.MINOR</code> حسب العِرف المتبع، حيث يمكنك اختياريًا الحصول على إطلاق Release بوصفه معرفًا نهائيًا بعد العدد الثانوي، ويكفي ذلك لتمييز جميع إصدارات المكتبة المختلفة.
</p>

<p>
	مع ذلك، إذا رُبِط كل تطبيق بهذا الملف مباشرةً، فسنواجه المشكلة نفسها التي واجهناها مع المكتبة الساكنة، إذ يجب إعادة بناء التطبيق للإشارة إلى المكتبة الجديدة في كل مرة يحدث فيها تعديل ثانوي. ما نريده هو أن نشير إلى ما يمثله العدد الرئيسي Major من المكتبة الذي إن تغير، فيجب إعادة تصريف Recompile تطبيقنا، لأننا نحتاج إلى التأكد من أن برنامجنا لا يزال متوافقًا مع المكتبة الجديدة.
</p>

<p>
	يكون <code>soname</code> بالشكل <code>libNAME.so.MAJOR</code>، ويجب ضبطه في الحقل <code>DT_SONAME</code> من القسم الديناميكي لمكتبة مشتركة، حيث يمكن لمؤلف المكتبة تحديد هذا الإصدار عند إنشاء المكتبة.
</p>

<p>
	يمكن أن يحدّد كل ملف مكتبة للإصدار الثانوي على القرص الصلب رقمَ الإصدار الرئيسي نفسه في الحقل <code>DT_SONAME</code>، مما يسمح للرابط الديناميكي بمعرفة أن ملف المكتبة يطبّق تعديلًا رئيسيًا معينًا <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">لواجهتي <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> و ABI الخاصتين بالمكتبة.
</p>

<p>
	لذا يُشغَّل تطبيق اسمه ldconfig لإنشاء روابط رمزية للإصدار الرئيسي إلى أحدث إصدار ثانوي على النظام. يعمل تطبيق ldconfig من خلال تشغيل جميع المكتبات التي تطبّق رقم إصدار رئيسي معين، ثم يختار المكتبة التي تحتوي على أعلى رقم تعديل ثانوي، ثم ينشِئ رابطًا رمزيًا من <code>libNAME.so.MAJOR</code> إلى ملف المكتبة الفعلي الموجود على القرص الصلب مثل <code>libNAME.so.MAJOR.MINOR</code>.
</p>

<p>
	الجزء الأخير من التسلسل الهرمي هو اسم تصريف Compile Name المكتبة. إن أردت تصريف برنامجك لربطه بمكتبة، فيمكنك استخدام الراية <code>‎-lNAME</code> التي تبحث عن الملف <code>libNAME.so</code> في مسار بحث المكتبة.
</p>

<p>
	لاحظ أننا لم نحدد أي رقم إصدار، لأننا نريد فقط الربط بأحدث مكتبة على النظام. يعود الأمر إلى إجراء التثبيت الخاص بالمكتبة لإنشاء رابط رمزي بين اسم التصريف <code>libNAME.so</code> وأحدث شيفرة مكتبة على النظام، ويمكن التعامل مع ذلك باستخدام نظام إدارة الحزم dpkg أو rpm. لا يُعَد ذلك عملية آلية، إذ يُحتمَل ألّا تكون أحدث مكتبة على النظام هي المكتبة التي ترغب في تصريفها دائمًا، فمثلًا يمكن أن تكون أحدث مكتبة مُثبَّتة إصدارًا تطويريًا غير مناسب للاستخدام العام.
</p>

<p>
	يوضح الشكل التالي العملية العامة لنظام <code>sonames</code>:
</p>

<p style="text-align: center;">
	<a class="ipsAttachLink ipsAttachLink_image" data-fileext="png" data-fileid="123892" href="https://academy.hsoub.com/uploads/monthly_2023_04/01_libs.png.74d262006ddbc24cae7ac7fd5935c16b.png" rel=""><img alt=" العملية العامة لنظام sonames للربط الديناميكي مع المكتبات" class="ipsImage ipsImage_thumbnailed" data-fileid="123892" data-ratio="97.78" data-unique="76fsoe94i" style="width: 450px; height: auto;" width="511" src="https://academy.hsoub.com/uploads/monthly_2023_04/01_libs.png.74d262006ddbc24cae7ac7fd5935c16b.png"> </a>
</p>

<h3>
	كيف يبحث الرابط الديناميكي عن المكتبات
</h3>

<p>
	يبحث الرابط الديناميكي في الحقل <code>DT_NEEDED</code> للعثور على المكتبات المطلوبة عند بدء تشغيل التطبيق، حيث يحتوي هذا الحقل على اسم <code>soname</code> الخاص بالمكتبة، لذا فالخطوة التالية هي أن يمر الرابط الديناميكي على جميع المكتبات في مسار بحثه بحثًا عن المكتبة المطلوبة.
</p>

<p>
	تتضمن هذه العملية من الناحية النظرية خطوتين. أولًا، يجب أن يبحث الرابط الديناميكي في جميع المكتبات للعثور على تلك المكتبات التي تطبّق نظام <code>soname</code> المحدد. ثانيًا، يجب مقارنة أسماء الملفات الخاصة بالتعديلات الثانوية للعثور على أحدث إصدار والذي يكون جاهزًا للتحميل لاحقًا.
</p>

<p>
	ذكرنا سابقًا أن هناك رابطًا رمزيًا أعدّه برنامج ldconfig بين اسم <code>soname</code> الخاص بالمكتبة والتعديل الثانوي الأخير، وبالتالي يجب أن يتبع الرابط الديناميكي هذا الرابط فقط للعثور على الملف الصحيح المراد تحميله بدلًا من الاضطرار إلى فتح جميع المكتبات الممكنة وتحديد المكتبات التي تريد استخدامها في كل مرة يكون التطبيق مطلوبًا فيها.
</p>

<p>
	يُعَد الوصول إلى نظام الملفات بطيئًا جدًا، لذا ينشئ برنامج ldconfig <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%86%D8%B8%D8%B1%D8%A9-%D8%B9%D9%85%D9%8A%D9%82%D8%A9-%D8%B9%D9%84%D9%89-%D8%AA%D8%B3%D9%84%D8%B3%D9%84-%D8%A7%D9%84%D8%B0%D9%88%D8%A7%D9%83%D8%B1-%D8%A7%D9%84%D9%87%D8%B1%D9%85%D9%8A-%D9%88%D8%A7%D9%84%D8%B0%D8%A7%D9%83%D8%B1%D8%A9-%D8%A7%D9%84%D9%85%D8%AE%D8%A8%D8%A6%D9%8A%D8%A9-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1720/" rel="">ذاكرة مخبئية</a> للمكتبات المُثبَّتة في النظام، حيث تكون هذه الذاكرة المخبئية ببساطة قائمةً بأسماء <code>soname</code> الخاصة بالمكتبات المتاحة للرابط الديناميكي ومؤشرًا لرابط الإصدار الرئيسي على القرص الصلب، مما يوفر على الرابط الديناميكي قراءة مجلدات كاملة مليئة بالملفات لتحديد الرابط الصحيح.
</p>

<p>
	يمكنك تحليل ذلك باستخدام <code>‎/sbin/ldconfig -p</code> الموجود ضمن الملف <code>‎/etc/ldconfig.so.cache</code>. إن لم يُعثَر على المكتبة في الذاكرة المخبئية، فسيعود الرابط الديناميكي إلى الخيار الأبطأ المتمثل في المرور على نظام الملفات، وبالتالي يجب إعادة تشغيل برنامج ldconfig عند تثبيت <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AF%D8%B9%D8%A7%D8%A1-%D8%AF%D9%88%D8%A7%D9%84%D9%87%D8%A7-%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1966/" rel="">مكتبات جديدة</a>.
</p>

<h2>
	البحث عن الرموز
</h2>

<p>
	ناقشنا كيف حصل الرابط الديناميكي على عنوان دالة المكتبة ووضعه في جدول PLT ليستخدمه البرنامج، ولكننا لم نناقش حتى الآن كيف يجد الرابط الديناميكي عنوان الدالة. تُسمَّى هذه العملية بالارتباط Binding، لأن اسم الرمز مرتبط بالعنوان الذي يمثله.
</p>

<p>
	يحتوي الرابط الديناميكي على أجزاء من المعلومات مثل الرمز الذي يبحث عنه وقائمة المكتبات التي يمكن أن يكون هذا الرمز فيها كما هو محدَّد باستخدام حقول <code>DT_NEEDED</code> في الملف الثنائي. تحتوي كل مكتبة كائنات مشتركة على قسم يسمى <code>‎.dynsym</code> مميَّز على أنه <code>SHT_DYNSYM</code>، حيث يُعَد هذا القسم الحد الأدنى من مجموعة الرموز المطلوبة للربط الديناميكي، وهو أيّ رمز في المكتبة يمكن أن يستدعيه برنامج خارجي.
</p>

<h3>
	جدول الرموز الديناميكي
</h3>

<p>
	هناك ثلاثة أقسام تلعب جميعها دورًا في وصف الرموز الديناميكية. لنلقِ أولًا نظرة على تعريف رمز من مواصفات ملف ELF كما يلي:
</p>

<pre class="ipsCode prettyprint lang-sql prettyprinted" id="ips_uid_6665_17" style=""><span class="kwd">typedef</span><span class="pln"> </span><span class="kwd">struct</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  </span><span class="typ">Elf32_Word</span><span class="pln">    st_name</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">Elf32_Addr</span><span class="pln">    st_value</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">Elf32_Word</span><span class="pln">    st_size</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> st_info</span><span class="pun">;</span><span class="pln">
  </span><span class="kwd">unsigned</span><span class="pln"> </span><span class="kwd">char</span><span class="pln"> st_other</span><span class="pun">;</span><span class="pln">
  </span><span class="typ">Elf32_Half</span><span class="pln">    st_shndx</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln"> </span><span class="typ">Elf32_Sym</span><span class="pun">;</span></pre>

<table>
	<thead>
		<tr>
			<th>
				الحقل
			</th>
			<th>
				القيمة
			</th>
		</tr>
	</thead>
	<tbody>
		<tr>
			<td>
				<code>st_name</code>
			</td>
			<td>
				فهرس إلى جدول السلاسل النصية
			</td>
		</tr>
		<tr>
			<td>
				<code>st_value</code>
			</td>
			<td>
				القيمة الموجودة في كائن مشترك قابل للنقل، حيث تحتفظ هذه القيمة بالإزاحة عن قسم الفهرس المعطى في الحقل <code>st_shndx</code>
			</td>
		</tr>
		<tr>
			<td>
				<code>st_size</code>
			</td>
			<td>
				أي حجم مرتبط بالرمز
			</td>
		</tr>
		<tr>
			<td>
				<code>st_info</code>
			</td>
			<td>
				معلومات عن ارتباط Binding الرمز الذي سنشرحه لاحقًا ويكون نوع هذا الرمز دالة أو كائن أو غير ذلك
			</td>
		</tr>
		<tr>
			<td>
				<code>st_other</code>
			</td>
			<td>
				غير مُستخدَم حاليًا
			</td>
		</tr>
		<tr>
			<td>
				<code>st_shndx</code>
			</td>
			<td>
				فهرس القسم الذي يوجد فيه الرمز (اطّلع على الحقل <code>st_value</code>)
			</td>
		</tr>
	</tbody>
</table>

<p>
	تكون السلسلة النصية الفعلية لاسم الرمز ضمن قسم منفصل هو القسم <code>‎.dynstr</code>، حيث تحتوي المدخلة في هذا القسم فهرسًا إلى قسم السلاسل النصية فقط، مما يؤدي إلى ظهور مستوًى معين من الحِمل على الرابط الديناميكي، إذ يجب أن يقرأ الرابط الديناميكي جميع مدخلات الرموز في القسم <code>‎.dynstr</code>، ثم يتبع مؤشر الفهرس للعثور على اسم الرمز للمقارنة.
</p>

<p>
	يمكن تسريع هذه العملية من خلال تقديم قسم ثالث يسمى <code>‎.hash</code> يحتوي على جدول تعمية Hash Table لأسماء رموز مدخلات جدول الرموز. يُحسَب جدول التعمية مسبقًا عند إنشاء المكتبة ويسمح للرابط الديناميكي بالعثور على مدخلة الرمز بصورة أسرع باستخدام عملية بحث واحدة أو اثنتين فقط.
</p>

<h3>
	ارتباط الرموز Symbol Binding
</h3>

<p>
	تشير عملية العثور على عنوان رمز إلى عملية ارتباط هذا الرمز، ولكن ارتباط الرموز Symbol Binding له معنًى منفصل، إذ تفرض عملية ارتباط الرموز رؤيتها خارجيًا أثناء عملية الربط الديناميكي. يُعَد الرمز المحلي Local Symbol غير مرئي خارج ملف الكائن المُعرَّف ضمنه، بينما يُعَد الرمز العام Global Symbol مرئيًا لملفات الكائنات الأخرى ويمكن أن يحقِّق المراجعَ غير المُعرَّفة في كائنات أخرى. يكون المرجع الضعيف Weak Reference نوعًا خاصًا من المراجع العامة ذات الأولوية المنخفضة، مما يعني أنه مُصمَّم لتجاوزه كما سنرى لاحقًا.
</p>

<p>
	يوضح المثال التالي برنامجًا بلغة سي C نحلّله لفحص ارتباطات الرموز:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6665_19" style=""><span class="pln">$ cat test</span><span class="pun">.</span><span class="pln">c
</span><span class="kwd">static</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> static_variable</span><span class="pun">;</span><span class="pln">

</span><span class="kwd">extern</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> extern_variable</span><span class="pun">;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> external_function</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">);</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> function</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> external_function</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> static_function</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="com">#pragma</span><span class="pln"> weak weak_function
</span><span class="typ">int</span><span class="pln"> weak_function</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ gcc </span><span class="pun">-</span><span class="pln">c test</span><span class="pun">.</span><span class="pln">c
$ objdump </span><span class="pun">--</span><span class="pln">syms test</span><span class="pun">.</span><span class="pln">o

test</span><span class="pun">.</span><span class="pln">o</span><span class="pun">:</span><span class="pln">     file format elf32</span><span class="pun">-</span><span class="pln">powerpc

SYMBOL TABLE</span><span class="pun">:</span><span class="pln">
</span><span class="lit">00000000</span><span class="pln"> l    df </span><span class="pun">*</span><span class="pln">ABS</span><span class="pun">*</span><span class="pln">  </span><span class="lit">00000000</span><span class="pln"> test</span><span class="pun">.</span><span class="pln">c
</span><span class="lit">00000000</span><span class="pln"> l    d  </span><span class="pun">.</span><span class="pln">text  </span><span class="lit">00000000</span><span class="pln"> </span><span class="pun">.</span><span class="pln">text
</span><span class="lit">00000000</span><span class="pln"> l    d  </span><span class="pun">.</span><span class="pln">data  </span><span class="lit">00000000</span><span class="pln"> </span><span class="pun">.</span><span class="pln">data
</span><span class="lit">00000000</span><span class="pln"> l    d  </span><span class="pun">.</span><span class="pln">bss   </span><span class="lit">00000000</span><span class="pln"> </span><span class="pun">.</span><span class="pln">bss
</span><span class="lit">00000038</span><span class="pln"> l     F </span><span class="pun">.</span><span class="pln">text  </span><span class="lit">00000024</span><span class="pln"> static_function
</span><span class="lit">00000000</span><span class="pln"> l    d  </span><span class="pun">.</span><span class="pln">sbss  </span><span class="lit">00000000</span><span class="pln"> </span><span class="pun">.</span><span class="pln">sbss
</span><span class="lit">00000000</span><span class="pln"> l     O </span><span class="pun">.</span><span class="pln">sbss  </span><span class="lit">00000004</span><span class="pln"> static_variable
</span><span class="lit">00000000</span><span class="pln"> l    d  </span><span class="pun">.</span><span class="pln">note</span><span class="pun">.</span><span class="pln">GNU</span><span class="pun">-</span><span class="typ">stack</span><span class="pln">        </span><span class="lit">00000000</span><span class="pln"> </span><span class="pun">.</span><span class="pln">note</span><span class="pun">.</span><span class="pln">GNU</span><span class="pun">-</span><span class="typ">stack</span><span class="pln">
</span><span class="lit">00000000</span><span class="pln"> l    d  </span><span class="pun">.</span><span class="pln">comment       </span><span class="lit">00000000</span><span class="pln"> </span><span class="pun">.</span><span class="pln">comment
</span><span class="lit">00000000</span><span class="pln"> g     F </span><span class="pun">.</span><span class="pln">text  </span><span class="lit">00000038</span><span class="pln"> function
</span><span class="lit">00000000</span><span class="pln">         </span><span class="pun">*</span><span class="pln">UND</span><span class="pun">*</span><span class="pln">  </span><span class="lit">00000000</span><span class="pln"> external_function
</span><span class="lit">0000005c</span><span class="pln">  w    F </span><span class="pun">.</span><span class="pln">text  </span><span class="lit">00000024</span><span class="pln"> weak_function

$ nm test</span><span class="pun">.</span><span class="pln">o
         U external_function
</span><span class="lit">00000000</span><span class="pln"> T function
</span><span class="lit">00000038</span><span class="pln"> t static_function
</span><span class="lit">00000000</span><span class="pln"> s static_variable
</span><span class="lit">0000005c</span><span class="pln"> W weak_function</span></pre>

<p>
	لاحظ استخدام <code>‎#pragma</code> لتعريف الرمز الضعيف، حيث يُعَد <code>pragma</code> طريقة لإيصال معلومات إضافية إلى <a href="https://academy.hsoub.com/programming/c/%D8%A7%D9%84%D9%81%D8%B5%D9%84-%D8%A7%D9%84%D8%A3%D9%88%D9%84-%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%AA%D8%B5%D8%B1%D9%8A%D9%81-compilation-%D9%81%D9%8A-%D9%84%D8%BA%D8%A7%D8%AA-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D8%A9-r976/" rel="">المصرِّف Compiler</a> واستخدامه غير شائع، ولكن يكون في بعض الأحيان مطلوبًا لإخراج المصرِّف من العمليات المعتادة.
</p>

<p>
	يمكن فحص الرموز باستخدام أداتين مختلفتين كما هو موضَّح في المثال السابق، حيث يظهر الارتباط في العمود الثاني في كلتا الحالتين، ويجب أن تكون الشيفرات البرمجية واضحة تمامًا.
</p>

<h4>
	تجاوز الرموز Overriding Symbols
</h4>

<p>
	يجب أن يكون المبرمج قادرًا على تجاوز رمز في مكتبة، مما يعني تخريب الرمز العادي بتعريفٍ مختلف. ذكرنا أن ترتيب البحث في المكتبات مُحدَّدٌ حسب ترتيب حقول <code>DT_NEEDED</code> داخل المكتبة، ولكن يمكن إدخال مكتبات لتكون المكتبات الأخيرة التي يجري البحث عنها، وهذا يعني أنه سيُعثَر على أيّ رموز ضمنها بوصفها مرجعًا نهائيًا. يمكن تحقيق ذلك باستخدام متغير بيئة يسمى <code>LD_PRELOAD</code> يحدد المكتبات التي يجب أن يحمّلها الرابط في النهاية كما في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6665_22" style=""><span class="pln">$ cat override</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#define</span><span class="pln"> _GNU_SOURCE </span><span class="lit">1</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdlib.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;unistd.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;sys/types.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;dlfcn.h&gt;</span><span class="pln">

</span><span class="typ">pid_t</span><span class="pln"> getpid</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="typ">pid_t</span><span class="pln"> </span><span class="pun">(*</span><span class="pln">orig_getpid</span><span class="pun">)(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> dlsym</span><span class="pun">(</span><span class="pln">RTLD_NEXT</span><span class="pun">,</span><span class="pln"> </span><span class="str">"getpid"</span><span class="pun">);</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Calling GETPID\n"</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> orig_getpid</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ cat test</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdlib.h&gt;</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;unistd.h&gt;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"%d\n"</span><span class="pun">,</span><span class="pln"> getpid</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ gcc </span><span class="pun">-</span><span class="pln">shared </span><span class="pun">-</span><span class="pln">fPIC </span><span class="pun">-</span><span class="pln">o liboverride</span><span class="pun">.</span><span class="pln">so override</span><span class="pun">.</span><span class="pln">c </span><span class="pun">-</span><span class="pln">ldl
$ gcc </span><span class="pun">-</span><span class="pln">o test test</span><span class="pun">.</span><span class="pln">c
$ LD_PRELOAD</span><span class="pun">=./</span><span class="pln">liboverride</span><span class="pun">.</span><span class="pln">so </span><span class="pun">./</span><span class="pln">test
</span><span class="typ">Calling</span><span class="pln"> GETPID
</span><span class="lit">15187</span></pre>

<p>
	تجاوزنا في المثال السابق الدالة <code>getpid</code> لطباعة عبارة صغيرة عند استدعائها. نستخدم الدالة <code>dlysm</code> التي توفرها مكتبة <code>libc</code> مع وسيط يخبرها بالاستمرار والعثور على الرمز التالي المسمَّى <code>getpid</code>.
</p>

<h4>
	الرموز الضعيفة
</h4>

<p>
	الرمز الضعيف هو الرمز المُميَّز بأنه له أولوية أقل ويمكن تجاوزه برمز آخر، حيث إن لم يُعثَر على تقديم Implementation آخر أبدًا، فسيكون الرمز الضعيف هو الرمز المُستخدَم. لذا يجب أن يحمّل المحمل الديناميكي جميع المكتبات ويتجاهل الرموز الضعيفة الموجودة في تلك المكتبات لصالح الرموز العادية الموجودة في مكتبات أخرى، حيث كانت هذه هي الطريقة المتبعة لتقديم معالجة الرموز الضعيفة في لينكس باستخدام مكتبة <code>glibc</code> سابقًا.
</p>

<p>
	لكن كان ذلك غير صحيح بالنسبة لنص معيار يونكس في ذلك الوقت SysVr4 الذي يفرض أنه يجب أن يتعامل الرابط الساكن مع الرموز الضعيفة التي يجب أن تظل بعيدة عن الرابط الديناميكي. تطابق تقديم لينكس الخاص بجعل الرابط الديناميكي يتجاوز الرموز الضعيفة مع منصة IRIX الخاصة بشركة SGI واختلف عن الأنظمة الأخرى مثل Solaris و AIX في ذلك الوقت. لذا لغى المطورون هذا السلوك عندما أدركوا أنه ينتهك المعيار، وتغير السلوك القديم ليتطلّب ضبط راية بيئة خاصة <code>LD_DYNAMIC_WEAK</code>.
</p>

<h4>
	تحديد ترتيب الارتباط
</h4>

<p>
	رأينا كيف يمكننا تجاوز دالة في مكتبة من خلال التحميل المسبق لمكتبة مشتركة أخرى لها الرمز المحدد نفسه. يُعَد الرمز الذي يُحلَّل بوصفه الرمز الأخير بأن له المرتبة الأخيرة في ترتيب تحميل المحمل الديناميكي للمكتبات، حيث تُحمَّل المكتبات بالترتيب المحدَّد في الراية <code>DT_NEEDED</code> الخاصة بالملف االثنائي، ويُحدَّد هذا الترتيب بدوره من خلال ترتيب تمرير المكتبات في <a href="https://academy.hsoub.com/devops/servers/%D9%85%D8%A7-%D9%87%D9%88-%D8%B3%D8%B7%D8%B1-%D8%A7%D9%84%D8%A3%D9%88%D8%A7%D9%85%D8%B1-%D8%9F-r353/" rel="">سطر الأوامر</a> عند بناء الكائن. يبدأ الرابط الديناميكي عند تحديد موقع الرموز بآخر مكتبة مُحمَّلة ويعمل بصورة عكسية حتى العثور على الرمز المطلوب.
</p>

<p>
	لكن تحتاج بعض المكتبات المشتركة إلى طريقة لتجاوز هذا السلوك، إذ يجب أن تخبر هذه المكتبات الرابط الديناميكي بأنه يجب أن ينظر أولًا بداخلها عن هذه الرموز بدلًا من العمل بصورة عكسية من آخر مكتبة مُحمَّلة. يمكن للمكتبات ضبط الراية <code>DT_SYMBOLIC</code> في ترويسة القسم الديناميكي للحصول على هذا السلوك، إذ يمكن ضبط هذه الراية من خلال تمرير الراية <code>‎-Bsymbolic</code> عبر سطر أوامر الروابط الساكنة عند بناء المكتبة المشتركة، حيث تتحكم هذه الراية برؤية الرمز Symbol Visibility. لا يمكن تجاوز الرموز الموجودة في المكتبة، لذا يمكن عَدُّها خاصةً بالمكتبة المُحمَّلة.
</p>

<p>
	لكن يؤدي ذلك إلى فقدان قدر كبير من التفاصيل نظرًا لتمييز المكتبة بهذا السلوك أو عدم تمييزها، إذ سيسمح النظام الأفضل بجعل بعض الرموز خاصة وبعض الرموز عامة.
</p>

<h4>
	تحديد إصدار الرموز Symbol Versioning
</h4>

<p>
	يأتي النظام الأفضل من خلال استخدام تحديد إصدار الرموز، حيث يمكننا تحديد بعض المدخلات الإضافية للرابط الساكن لمنحه بعض المعلومات الإضافية حول الرموز في المكتبة المشتركة كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_6665_25" style=""><span class="pln">$ cat </span><span class="typ">Makefile</span><span class="pln">
all</span><span class="pun">:</span><span class="pln"> test testsym

clean</span><span class="pun">:</span><span class="pln">
        rm </span><span class="pun">-</span><span class="pln">f </span><span class="pun">*.</span><span class="pln">so test testsym

liboverride</span><span class="pun">.</span><span class="pln">so </span><span class="pun">:</span><span class="pln"> override</span><span class="pun">.</span><span class="pln">c
        $</span><span class="pun">(</span><span class="pln">CC</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln">shared </span><span class="pun">-</span><span class="pln">fPIC </span><span class="pun">-</span><span class="pln">o liboverride</span><span class="pun">.</span><span class="pln">so override</span><span class="pun">.</span><span class="pln">c

libtest</span><span class="pun">.</span><span class="pln">so </span><span class="pun">:</span><span class="pln"> libtest</span><span class="pun">.</span><span class="pln">c
        $</span><span class="pun">(</span><span class="pln">CC</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln">shared </span><span class="pun">-</span><span class="pln">fPIC </span><span class="pun">-</span><span class="pln">o libtest</span><span class="pun">.</span><span class="pln">so libtest</span><span class="pun">.</span><span class="pln">c

libtestsym</span><span class="pun">.</span><span class="pln">so </span><span class="pun">:</span><span class="pln"> libtest</span><span class="pun">.</span><span class="pln">c
        $</span><span class="pun">(</span><span class="pln">CC</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln">shared </span><span class="pun">-</span><span class="pln">fPIC </span><span class="pun">-</span><span class="typ">Wl</span><span class="pun">,-</span><span class="typ">Bsymbolic</span><span class="pln"> </span><span class="pun">-</span><span class="pln">o libtestsym</span><span class="pun">.</span><span class="pln">so libtest</span><span class="pun">.</span><span class="pln">c

test </span><span class="pun">:</span><span class="pln"> test</span><span class="pun">.</span><span class="pln">c libtest</span><span class="pun">.</span><span class="pln">so liboverride</span><span class="pun">.</span><span class="pln">so
        $</span><span class="pun">(</span><span class="pln">CC</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln">L</span><span class="pun">.</span><span class="pln"> </span><span class="pun">-</span><span class="pln">ltest </span><span class="pun">-</span><span class="pln">o test test</span><span class="pun">.</span><span class="pln">c

testsym </span><span class="pun">:</span><span class="pln"> test</span><span class="pun">.</span><span class="pln">c libtestsym</span><span class="pun">.</span><span class="pln">so liboverride</span><span class="pun">.</span><span class="pln">so
        $</span><span class="pun">(</span><span class="pln">CC</span><span class="pun">)</span><span class="pln"> </span><span class="pun">-</span><span class="pln">L</span><span class="pun">.</span><span class="pln"> </span><span class="pun">-</span><span class="pln">ltestsym </span><span class="pun">-</span><span class="pln">o testsym test</span><span class="pun">.</span><span class="pln">c

$ cat libtest</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> foo</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln"> </span><span class="pun">{</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"libtest foo called\n"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">1</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> test_foo</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> foo</span><span class="pun">();</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ cat override</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> foo</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"override foo called\n"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ cat test</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"%d\n"</span><span class="pun">,</span><span class="pln"> test_foo</span><span class="pun">());</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ cat </span><span class="typ">Versions</span><span class="pln">
</span><span class="pun">{</span><span class="pln">global</span><span class="pun">:</span><span class="pln"> test_foo</span><span class="pun">;</span><span class="pln">  local</span><span class="pun">:</span><span class="pln"> </span><span class="pun">*;</span><span class="pln"> </span><span class="pun">};</span><span class="pln">

$ gcc </span><span class="pun">-</span><span class="pln">shared </span><span class="pun">-</span><span class="pln">fPIC </span><span class="pun">-</span><span class="typ">Wl</span><span class="pun">,-</span><span class="pln">version</span><span class="pun">-</span><span class="pln">script</span><span class="pun">=</span><span class="typ">Versions</span><span class="pln"> </span><span class="pun">-</span><span class="pln">o libtestver</span><span class="pun">.</span><span class="pln">so libtest</span><span class="pun">.</span><span class="pln">c

$ gcc </span><span class="pun">-</span><span class="pln">L</span><span class="pun">.</span><span class="pln"> </span><span class="pun">-</span><span class="pln">ltestver </span><span class="pun">-</span><span class="pln">o testver test</span><span class="pun">.</span><span class="pln">c

$ LD_LIBRARY_PATH</span><span class="pun">=.</span><span class="pln"> LD_PRELOAD</span><span class="pun">=./</span><span class="pln">liboverride</span><span class="pun">.</span><span class="pln">so </span><span class="pun">./</span><span class="pln">testver
libtest foo called

</span><span class="lit">100000574</span><span class="pln"> l     F </span><span class="pun">.</span><span class="pln">text    </span><span class="lit">00000054</span><span class="pln">              foo
</span><span class="lit">000005c8</span><span class="pln"> g     F </span><span class="pun">.</span><span class="pln">text    </span><span class="lit">00000038</span><span class="pln">              test_foo</span></pre>

<p>
	يمكننا ذكر ما إذا كان الرمز عامًا أم محليًا في أبسط الحالات على النحو الوارد في المثال السابق. تكون الدالة <code>foo</code> دالة دعم للدالة <code>test_foo</code>، ويمكن أن نكون سعداء بتجاوز الوظيفة الكلية للدالة <code>test_foo</code>، ولكن إن استخدمنا إصدار المكتبة المشتركة، فيجب الوصول إليها دون تعديل، إذ لا ينبغي لأحدٍ تعديل دالة الدعم.
</p>

<p>
	يسمح ذلك بالحفاظ على فضاء أسمائنا منظمًا بطريقة أفضل، إذ يمكن أن ترغب العديدُ من المكتبات في تقديم شيء يمكن تسميته باسم دالة شائعة مثل <code>read</code> أو <code>write</code>، ولكن إن فعلت ذلك، فيمكن أن يكون الإصدار الفعلي الممنوح للبرنامج خاطئًا تمامًا. يمكن للمطور من خلال تحديد الرموز بأنها محلية التأكدُ من عدم تعارض أي شيء مع هذا الاسم الداخلي دون أن يؤثر الاسم الذي يختاره على أيّ برنامج آخر.
</p>

<p>
	جاء مفهوم تحديد إصدار الرموز Symbol Versioning من تلك الفكرة، حيث يمكنك تحديد إصدارات متعددة من الرمز نفسه ضمن المكتبة نفسها. يُلحِق الرابط الساكن بعض معلومات الإصدار بعد اسم الرمز مثل <code>‎@VER</code> الذي يصف الإصدار المعطى للرمز.
</p>

<p>
	إن قدّم المطور دالة لها الاسم نفسه تقديمًا ثنائيًا أو برمجيًا مختلفًا، فيمكنه زيادة رقم الإصدار. تلتقط التطبيقات الجديدة أحدث إصدار من الرمز عند بنائها بمقابل المكتبة المشتركة. لكن ستطلب التطبيقات المبنية بمقابل الإصدارات السابقة من المكتبة نفسها إصدارات أقدم، فمثلًا سيكون لها سلاسل <code>‎@VER</code> أقدم في اسم الرمز الذي تطلبه، وبالتالي ستحصل على التقديم الأصلي.
</p>

<p>
	ترجمة -وبتصرُّف- للقسم <a href="https://www.bottomupcs.com/libraries_and_the_linker.xhtml" rel="external nofollow">Working with libraries and the linker</a> من فصل <a href="https://bottomupcs.com/ch09.html" rel="external nofollow">Dynamic Linking</a> من كتاب <a href="https://www.bottomupcs.com/" rel="external nofollow">Computer Science from the Bottom Up</a> لصاحبه Ian Wienand.
</p>

<h2>
	اقرأ أيضًا
</h2>

<ul>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AF%D8%B9%D8%A7%D8%A1-%D8%AF%D9%88%D8%A7%D9%84%D9%87%D8%A7-%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1966/" rel="">المكتبات وكيفية استدعاء دوالها ديناميكيا في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B1%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-dynamic-linking-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1965/" rel="">مفهوم الربط الديناميكي Dynamic Linking في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%86%D8%B8%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D9%88%D8%AA%D8%B9%D8%A7%D9%84%D8%AC%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB%D8%A9-r1760/" rel="">أهم المفاهيم التي تنظم العمليات وتعالجها في معمارية الحاسوب الحديثة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1722/" rel="">أنظمة المعالجات في معمارية الحاسوب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1967</guid><pubDate>Sun, 30 Apr 2023 18:06:00 +0000</pubDate></item><item><title>&#x627;&#x644;&#x645;&#x643;&#x62A;&#x628;&#x627;&#x62A; &#x648;&#x643;&#x64A;&#x641;&#x64A;&#x629; &#x627;&#x633;&#x62A;&#x62F;&#x639;&#x627;&#x621; &#x62F;&#x648;&#x627;&#x644;&#x647;&#x627; &#x62F;&#x64A;&#x646;&#x627;&#x645;&#x64A;&#x643;&#x64A;&#x627; &#x641;&#x64A; &#x645;&#x639;&#x645;&#x627;&#x631;&#x64A;&#x629; &#x627;&#x644;&#x62D;&#x627;&#x633;&#x648;&#x628;</title><link>https://academy.hsoub.com/programming/os-embedded-systems/%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%88%D9%83%D9%8A%D9%81%D9%8A%D8%A9-%D8%A7%D8%B3%D8%AA%D8%AF%D8%B9%D8%A7%D8%A1-%D8%AF%D9%88%D8%A7%D9%84%D9%87%D8%A7-%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1966/</link><description><![CDATA[
<p><img src="https://academy.hsoub.com/uploads/monthly_2023_04/--------.png.ea433f9bee54c068e9686ef5ed702fab.png" /></p>
<p>
	لقد سئم المطورون من الاضطرار إلى كتابة كل شيء من البداية، لذلك كانت المكتبات من أولى اختراعات <a href="https://academy.hsoub.com/programming/general/%D8%B9%D9%84%D9%88%D9%85-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8/" rel="">علوم الحاسوب</a>، فالمكتبة هي ببساطة مجموعة من الدوال التي يمكنك استدعاؤها من برنامجك. تتمتع المكتبة بالعديد من المزايا مثل أنه يمكنك توفير الكثير من الوقت عن طريق إعادة استخدام العمل الذي أنجزه شخص آخر، وتكون أكثر ثقة في أنها تحتوي على أخطاء أقل بسبب وجود أشخاص آخرين استخدموا هذه المكتبات مسبقًا، وبالتالي ستستفيد من عثورهم على الأخطاء وإصلاحها. تشبه المكتبة الملف القابل للتنفيذ تمامًا باستثناء استدعاء دوال المكتبة باستخدام معاملات من ملفك القابل للتنفيذ بدلًا من تشغيلها مباشرةً.
</p>

<h2>
	المكتبات الساكنة Static Libraries
</h2>

<p>
	الطريقة الأكثر مباشرة لاستخدام دالة المكتبة هي ربط ملفات الكائنات من المكتبة مباشرة بملفك النهائي القابل للتنفيذ كما هو الحال مع تلك الملفات التي صرَّفتها بنفسك، وعندها تُسمَّى المكتبة مكتبة ساكنة، لأن المكتبة ستبقى دون تغيير ما لم يُعاد تصريف البرنامج. تُعَد هذه الطريقة لاستخدام مكتبة الطريقة الأسهل لأن النتيجة النهائية هي ملف قابل للتنفيذ بسيط بدون اعتماديات.
</p>

<p>
	تُعَد المكتبة الساكنة مجموعةً من ملفات الكائنات، حيث يُحتفَظ بملفات الكائنات في سجل Archive، مما يؤدي إلى استخدام لاحقتها المعتادة <code>‎.a</code>. يمكنك التفكير في هذه السجلات بوصفها ملفًا مضغوطًا ولكن بدون ضغط. يوضّح المثال التالي كيفية إنشاء مكتبة ساكنة بسيطة ويقدم بعض الأدوات الشائعة للتعامل مع المكتبات:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_9" style=""><span class="pln">$ cat library</span><span class="pun">.</span><span class="pln">c
</span><span class="com">/* دالة مكتبة */</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> function</span><span class="pun">(</span><span class="typ">int</span><span class="pln"> input</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> input </span><span class="pun">+</span><span class="pln"> </span><span class="lit">10</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ cat library</span><span class="pun">.</span><span class="pln">h
</span><span class="com">/* تعريف الدالة */</span><span class="pln">
</span><span class="typ">int</span><span class="pln"> function</span><span class="pun">(</span><span class="typ">int</span><span class="pun">);</span><span class="pln">

$ cat program</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">
</span><span class="com">/* ترويسة ملف المكتبة */</span><span class="pln">
</span><span class="com">#include</span><span class="pln"> </span><span class="str">"library.h"</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="typ">int</span><span class="pln"> d </span><span class="pun">=</span><span class="pln"> function</span><span class="pun">(</span><span class="lit">100</span><span class="pun">);</span><span class="pln">

  printf</span><span class="pun">(</span><span class="str">"%d\n"</span><span class="pun">,</span><span class="pln"> d</span><span class="pun">);</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ gcc </span><span class="pun">-</span><span class="pln">c library</span><span class="pun">.</span><span class="pln">c
$ ar rc libtest</span><span class="pun">.</span><span class="pln">a library</span><span class="pun">.</span><span class="pln">o
$ ranlib </span><span class="pun">./</span><span class="pln">libtest</span><span class="pun">.</span><span class="pln">a
$ nm </span><span class="pun">--</span><span class="pln">print</span><span class="pun">-</span><span class="pln">armap </span><span class="pun">./</span><span class="pln">libtest</span><span class="pun">.</span><span class="pln">a

</span><span class="typ">Archive</span><span class="pln"> index</span><span class="pun">:</span><span class="pln">
function in library</span><span class="pun">.</span><span class="pln">o

library</span><span class="pun">.</span><span class="pln">o</span><span class="pun">:</span><span class="pln">
</span><span class="lit">00000000</span><span class="pln"> T function

$ gcc </span><span class="pun">-</span><span class="pln">L </span><span class="pun">.</span><span class="pln"> program</span><span class="pun">.</span><span class="pln">c </span><span class="pun">-</span><span class="pln">ltest </span><span class="pun">-</span><span class="pln">o program

$ </span><span class="pun">./</span><span class="pln">program
</span><span class="lit">110</span></pre>

<p>
	أولًا، نصرّف مكتبتنا إلى ملف كائن كما رأينا سابقًا. لاحظ أننا نحدد <a href="https://academy.hsoub.com/programming/general/%D9%85%D8%A7-%D9%87%D9%8A-%D9%88%D8%A7%D8%AC%D9%87%D8%A9-%D8%A7%D9%84%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D8%A9-%D9%84%D9%84%D8%AA%D8%B7%D8%A8%D9%8A%D9%82%D8%A7%D8%AA-api%D8%9F-r1512/" rel="">واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr></a> الخاصة بالمكتبة في ترويسة الملف، حيث تتكون واجهة <abbr title="Application Programming Interface | واجهة برمجية"><abbr title="Application Programming Interface | واجهة برمجية">API</abbr></abbr> من تعريفات الدوال الموجودة في المكتبة حتى يعرف المُصرِّف أنواع الدوال عند إنشاء ملفات الكائنات التي تشير إلى المكتبة مثل الملف <code>program.c</code> الذي يُضمَّن باستخدام <code>‎#include</code> في ترويسة الملف.
</p>

<p>
	ننشئ سجل مكتبة باستخدام الأمر <code>ar</code> الذي يمثل اختصارًا للكلمة "سجل Archive". تُسبَق أسماء ملفات المكتبة الساكنة بالبادئة <code>lib</code> ويكون لها اللاحقة <code>‎.a</code> حسب العرف المتَّبع. يخبر الوسيطُ <code>c</code> البرنامجَ بإنشاء السجل Archive، ويخبر <code>a</code> السجل بإضافة ملفات الكائنات المحددة في ملف المكتبة. تنبثق السجلات المُنشَأة باستخدام الأمر <code>ar</code> في أماكن مختلفة من أنظمة<a href="https://academy.hsoub.com/devops/linux/%D9%85%D8%A7-%D9%87%D9%88-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%8A%D9%86%D9%83%D8%B3%D8%9F-r451/" rel=""> لينكس</a> بخلاف إنشاء مكتبات ساكنة.
</p>

<p>
	أحد التطبيقات المستخدمة على نطاق واسع هي التطبيقات المُستخدَمة في صيغة حزم <code>‎.deb</code> مع <a href="https://academy.hsoub.com/devops/linux/%D9%81%D9%8A-%D9%85%D8%A7%D8%B0%D8%A7-%D9%8A%D8%AE%D8%AA%D9%84%D9%81-ubuntu-%D8%B9%D9%86-debian%D8%9F-r235/" rel="">أنظمة دبيان Debian وأوبنتو Ubuntu</a> وبعض أنظمة لينكس الأخرى، حيث تستخدم ملفات <code>deb</code> السجلات للاحتفاظ بجميع ملفات التطبيق مع بعضها البعض في ملف حزمة واحد. تستخدم حزم RedHat RPM صيغةً بديلةً ولكنها مشابهة لصيغة <code>deb</code> وتُسمَّى cpio. يُعَد ملف <code>tar</code> التطبيقَ الأساسي لحفظ الملفات مع بعضها بعضًا، وهو صيغة شائعة لتوزيع الشيفرة المصدرية.
</p>

<p>
	نستخدم بعد ذلك تطبيق <code>ranlib</code> لإنشاء ترويسة في المكتبة باستخدام رموز محتويات ملف الكائن، مما يساعد المصرِّف على الإشارة إلى الرموز بسرعة، إذ يمكن أن تبدو هذه الخطوة زائدة في حالة وجود رمز واحد فقط ، ولكن يمكن أن تحتوي مكتبة كبيرة على آلاف الرموز مما يعني أن الفهرس يمكن أن يسارع بصورة كبيرة في العثور على المراجع. نفحص هذه الترويسة الجديدة باستخدام تطبيق <code>nm</code>. لاحظ وجود الرمز <code>function</code> الخاص بالدالة <code>function()‎</code> عند إزاحة بمقدار صفر كما هو متوقع.
</p>

<p>
	يمكنك بعد ذلك تحديد المكتبة للمصرِّف باستخدام الخيار <code>‎-lname</code> حيث يكون الاسم هو اسم ملف المكتبة بدون البادئة <code>lib</code>. كما نوفر مجلد بحث إضافي للمكتبات وهو المجلد الحالي (<code>‎-L .‎</code>)، لأنه لا يمكن البحث عن المكتبات في المجلد الحالي افتراضيًا. النتيجة النهائية هي ملف قابل للتنفيذ مع المكتبة الجديدة المُضمَّنة.
</p>

<h3>
	عيوب الربط الساكن
</h3>

<p>
	يُعَد الربط الساكن أمرًا سهلًا للغاية، ولكن له عدد من العيوب، فهناك نوعان من العيوب الرئيسية أولهما أنه يجب عليك إعادة تصريف برنامجك إلى ملف تنفيذي جديد عند تحديث شيفرة المكتبة لإصلاح خطأ مثلًا، وثانيهما احتواء كل برنامج يستخدم تلك المكتبة في النظام على نسخة في ملفه القابل للتنفيذ. يُعَد ذلك غير فعال وخاصة إذا وجدت خطأ واضطررت إلى إعادة تصريفه.
</p>

<p>
	تُضمَّن مكتبة C التي هي glibc مثلًا في جميع البرامج، وتوفر جميع الدوال الشائعة مثل <code>printf</code>.
</p>

<h2>
	المكتبات المشتركة
</h2>

<p>
	تُعَد المكتبات المشتركة طريقةً للتغلب على المشاكل التي تشكّلها المكتبات الساكنة. تُحمَّل المكتبة المشتركة ديناميكيًا في وقت التشغيل لكل تطبيق يحتاجها، حيث يستخدم التطبيق مؤشرات تتطلب مكتبة معينة، وتُحمَّل المكتبة في الذاكرة وتُنفَّذ عند استدعاء الدالة. إن حُمِّلت المكتبة لتطبيق آخر، فيمكن مشاركة الشيفرة البرمجية بين التطبيقين، مما يوفر موارد كبيرة مع المكتبات شائعة الاستخدام.
</p>

<p>
	يُعَد الربط الديناميكي الذي تحدثنا عنه سابقًا أحد الأجزاء الأكثر تعقيدًا في <a href="https://academy.hsoub.com/files/24-%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%84%D9%84%D9%85%D8%A8%D8%B1%D9%85%D8%AC%D9%8A%D9%86/" rel="">نظام التشغيل</a> الحديث.
</p>

<h2>
	جدول البحث عن الإجراءات Procedure Lookup Table
</h2>

<p>
	يمكن أن تحتوي المكتبات على العديد من الدوال، ويمكن أن يحتوي البرنامج على العديد من المكتبات لإنجاز عمله. يستخدم البرنامج دالة أو دالتين فقط من كل مكتبة من المكتبات المتعددة المتاحة، ويمكن أن تستخدم الشيفرة البرمجية بعض الدوال دون غيرها اعتمادًا على مسار وقت التشغيل.
</p>

<p>
	تحتوي عملية <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B1%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-dynamic-linking-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1965/" rel="">الربط الديناميكي Dynamic Linking</a> الكثير من العمليات الحسابية، لأنها تتضمن النظر والبحث عبر العديد من الجداول، لذا يمكن تحسين الأداء عند تطبيق أيّ شيء لتقليل هذا الحِمل الناتج عن هذه العمليات الحسابية الكثيرة. يسهّل جدول البحث عن الإجراءات Procedure Lookup Table -أو PLT اختصارًا- ما يسمى بالارتباط الكسول Lazy Binding في البرامج، حيث يُعَد الارتباط Binding مرادفًا لعملية إصلاح المتغيرات الموجودة في جدول GOT الموضحة سابقًا، إذ يُقال أن المدخلة مرتبطة بعنوانها الفعلي عند إصلاحها.
</p>

<p>
	يتضمن البرنامج في بعض الأحيان دالةً من مكتبة، ولكنه لا يستدعيها أبدًا اعتمادًا على دخل المستخدم. تحتوي عملية الارتباط الخاصة بهذه الدالة الكثير من العمليات لتطبيقها، لأنها تتضمن تحميل الشيفرة البرمجية والبحث في الجداول والكتابة في الذاكرة، لذا تُعَد المتابعة في عملية ارتباط دالة غير مُستخدَمة مضيعة للوقت، حيث يؤجِّل الارتباط الكسول هذه العملية حتى يستدعي جدولُ PLT الدالةَ الفعلية.
</p>

<p>
	لكل دالة في مكتبةٍ مدخلةٌ في جدول PLT تؤشّر في البداية إلى بعض الشيفرات البرمجية الوهمية Dummy Code الخاصة. إن استدعى البرنامج الدالة، فهذا يعني أنه يستدعي مدخلة من جدول PLT باستخدام الطريقة نفسها للإشارة إلى المتغيرات في جدول GOT نفسها.
</p>

<p>
	تحمّل هذه الدالة الوهمية بعض المعاملات التي تريد تمريرها إلى الرابط الديناميكي لتتمكن من تحليل الدالة ثم استدعاء دالة بحث خاصة بالرابط الديناميكي. يجد الرابط الديناميكي عنوان الدالة الفعلي، ويكتب هذا الموقع في استدعاء الملف الثنائي في أعلى استدعاء الدالة الوهمية، وبالتالي يمكن تحميل العنوان دون الحاجة إلى العودة إلى المحمل الديناميكي مرة أخرى في المرة التالية لاستدعاء الدالة. إن لم تُستدعَى دالةٌ مطلقًا، فلن تُعدَّل مدخلة جدول PLT أبدًا ولكن لن يكون هناك وقت تشغيل إضافي.
</p>

<h3>
	كيفية عمل جدول PLT
</h3>

<p>
	يجب أن تبدأ الآن في إدراك أن هناك قدرًا لا بأس به من العمل في تحليل رمز ديناميكي. لنطلع على تطبيق "hello World" البسيط الذي يجري استدعاء مكتبة واحد فقط هو استدعاء الدالة <code>printf</code> لعرض السلسلة النصية للمستخدم كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_16" style=""><span class="pln">           $ cat hello</span><span class="pun">.</span><span class="pln">c
</span><span class="com">#include</span><span class="pln"> </span><span class="str">&lt;stdio.h&gt;</span><span class="pln">

</span><span class="typ">int</span><span class="pln"> main</span><span class="pun">(</span><span class="kwd">void</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  printf</span><span class="pun">(</span><span class="str">"Hello, World!\n"</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">return</span><span class="pln"> </span><span class="lit">0</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span><span class="pln">

$ gcc </span><span class="pun">-</span><span class="pln">o hello hello</span><span class="pun">.</span><span class="pln">c

$ readelf </span><span class="pun">--</span><span class="pln">relocs </span><span class="pun">./</span><span class="pln">hello

</span><span class="typ">Relocation</span><span class="pln"> section </span><span class="str">'.rela.dyn'</span><span class="pln"> at offset </span><span class="lit">0x3f0</span><span class="pln"> contains </span><span class="lit">2</span><span class="pln"> entries</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">Offset</span><span class="pln">          </span><span class="typ">Info</span><span class="pln">           </span><span class="typ">Type</span><span class="pln">           </span><span class="typ">Sym</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Value</span><span class="pln">    </span><span class="typ">Sym</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="typ">Addend</span><span class="pln">
</span><span class="lit">6000000000000ed8</span><span class="pln">  </span><span class="lit">000700000047</span><span class="pln"> R_IA64_FPTR64LSB  </span><span class="lit">0000000000000000</span><span class="pln"> </span><span class="typ">_Jv_RegisterClasses</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="lit">6000000000000ee0</span><span class="pln">  </span><span class="lit">000900000047</span><span class="pln"> R_IA64_FPTR64LSB  </span><span class="lit">0000000000000000</span><span class="pln"> __gmon_start__ </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0</span><span class="pln">

</span><span class="typ">Relocation</span><span class="pln"> section </span><span class="str">'.rela.IA_64.pltoff'</span><span class="pln"> at offset </span><span class="lit">0x420</span><span class="pln"> contains </span><span class="lit">3</span><span class="pln"> entries</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">Offset</span><span class="pln">          </span><span class="typ">Info</span><span class="pln">           </span><span class="typ">Type</span><span class="pln">           </span><span class="typ">Sym</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Value</span><span class="pln">    </span><span class="typ">Sym</span><span class="pun">.</span><span class="pln"> </span><span class="typ">Name</span><span class="pln"> </span><span class="pun">+</span><span class="pln"> </span><span class="typ">Addend</span><span class="pln">
</span><span class="lit">6000000000000f10</span><span class="pln">  </span><span class="lit">000200000081</span><span class="pln"> R_IA64_IPLTLSB    </span><span class="lit">0000000000000000</span><span class="pln"> printf </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="lit">6000000000000f20</span><span class="pln">  </span><span class="lit">000800000081</span><span class="pln"> R_IA64_IPLTLSB    </span><span class="lit">0000000000000000</span><span class="pln"> __libc_start_main </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0</span><span class="pln">
</span><span class="lit">6000000000000f30</span><span class="pln">  </span><span class="lit">000900000081</span><span class="pln"> R_IA64_IPLTLSB    </span><span class="lit">0000000000000000</span><span class="pln"> __gmon_start__ </span><span class="pun">+</span><span class="pln"> </span><span class="lit">0</span></pre>

<p>
	يمكننا أن نرى في المثال السابق أن لدينا الانتقال <code>R_IA64_IPLTLSB</code> للرمز <code>printf</code> الذي يمثل وضع عنوان رمز هذه الدالة في عنوان الذاكرة 0x6000000000000f10. يجب أن نبدأ في البحث بصورة أعمق للعثور على الإجراء الدقيق الذي يعطينا الدالة.
</p>

<p>
	سنلقي في المثال التالي نظرة على تفكيك الدالة الرئيسية <code>main()‎</code> الخاصة بالبرنامج:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_18" style=""><span class="pln">           </span><span class="lit">4000000000000790</span><span class="pln"> </span><span class="str">&lt;main&gt;</span><span class="pun">:</span><span class="pln">
</span><span class="lit">4000000000000790</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">15</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">05</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MII</span><span class="pun">]</span><span class="pln">       alloc r33</span><span class="pun">=</span><span class="pln">ar</span><span class="pun">.</span><span class="pln">pfs</span><span class="pun">,</span><span class="lit">5</span><span class="pun">,</span><span class="lit">4</span><span class="pun">,</span><span class="lit">0</span><span class="pln">
</span><span class="lit">4000000000000796</span><span class="pun">:</span><span class="pln">       </span><span class="lit">20</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">30</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">42</span><span class="pln"> </span><span class="lit">60</span><span class="pln">                   mov r34</span><span class="pun">=</span><span class="pln">r12
</span><span class="lit">400000000000079c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">04</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">84</span><span class="pln">                         mov r35</span><span class="pun">=</span><span class="pln">r1
</span><span class="lit">40000000000007a0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">01</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">01</span><span class="pln"> </span><span class="lit">00</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MII</span><span class="pun">]</span><span class="pln">       nop</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">40000000000007a6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">62</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> c0                   mov r32</span><span class="pun">=</span><span class="pln">b0
</span><span class="lit">40000000000007ac</span><span class="pun">:</span><span class="pln">       </span><span class="lit">81</span><span class="pln"> </span><span class="lit">0c</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">90</span><span class="pln">                         addl r14</span><span class="pun">=</span><span class="lit">72</span><span class="pun">,</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000007b0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">1c</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="lit">01</span><span class="pln"> </span><span class="lit">1c</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="lit">10</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MFB</span><span class="pun">]</span><span class="pln">       ld8 r36</span><span class="pun">=[</span><span class="pln">r14</span><span class="pun">]</span><span class="pln">
</span><span class="lit">40000000000007b6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   nop</span><span class="pun">.</span><span class="pln">f </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">40000000000007bc</span><span class="pun">:</span><span class="pln">       </span><span class="lit">78</span><span class="pln"> fd ff </span><span class="lit">58</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">call</span><span class="pun">.</span><span class="pln">sptk</span><span class="pun">.</span><span class="pln">many b0</span><span class="pun">=</span><span class="lit">4000000000000520</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">_init</span><span class="pun">+</span><span class="lit">0xb0</span><span class="pun">&gt;</span><span class="pln">
</span><span class="lit">40000000000007c0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">02</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">46</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">21</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MII</span><span class="pun">]</span><span class="pln">       mov r1</span><span class="pun">=</span><span class="pln">r35
</span><span class="lit">40000000000007c6</span><span class="pun">:</span><span class="pln">       e0 </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">42</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   mov r14</span><span class="pun">=</span><span class="pln">r0</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000007cc</span><span class="pun">:</span><span class="pln">       </span><span class="lit">01</span><span class="pln"> </span><span class="lit">70</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">84</span><span class="pln">                         mov r8</span><span class="pun">=</span><span class="pln">r14
</span><span class="lit">40000000000007d0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">01</span><span class="pln"> </span><span class="lit">00</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MII</span><span class="pun">]</span><span class="pln">       nop</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">40000000000007d6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">01</span><span class="pln"> </span><span class="lit">55</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   mov</span><span class="pun">.</span><span class="pln">i ar</span><span class="pun">.</span><span class="pln">pfs</span><span class="pun">=</span><span class="pln">r33
</span><span class="lit">40000000000007dc</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">0a</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">07</span><span class="pln">                         mov b0</span><span class="pun">=</span><span class="pln">r32
</span><span class="lit">40000000000007e0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">1d</span><span class="pln"> </span><span class="lit">60</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">44</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">21</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MFB</span><span class="pun">]</span><span class="pln">       mov r12</span><span class="pun">=</span><span class="pln">r34
</span><span class="lit">40000000000007e6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">80</span><span class="pln">                   nop</span><span class="pun">.</span><span class="pln">f </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">40000000000007ec</span><span class="pun">:</span><span class="pln">       </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">84</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">ret</span><span class="pun">.</span><span class="pln">sptk</span><span class="pun">.</span><span class="pln">many b0</span><span class="pun">;;</span></pre>

<p>
	يجب أن يكون استدعاء العنوان 0x4000000000000520 هو استدعاء الدالة <code>printf</code>، حيث يمكننا معرفة مكان هذا العنوان من خلال الاطلاع الأقسام Sections باستخدام الأداة <code>readelf</code> كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_20" style=""><span class="pln">           $ readelf </span><span class="pun">--</span><span class="pln">sections </span><span class="pun">./</span><span class="pln">hello
</span><span class="typ">There</span><span class="pln"> are </span><span class="lit">40</span><span class="pln"> section headers</span><span class="pun">,</span><span class="pln"> starting at offset </span><span class="lit">0x25c0</span><span class="pun">:</span><span class="pln">

</span><span class="typ">Section</span><span class="pln"> </span><span class="typ">Headers</span><span class="pun">:</span><span class="pln">
  </span><span class="pun">[</span><span class="typ">Nr</span><span class="pun">]</span><span class="pln"> </span><span class="typ">Name</span><span class="pln">              </span><span class="typ">Type</span><span class="pln">             </span><span class="typ">Address</span><span class="pln">           </span><span class="typ">Offset</span><span class="pln">
       </span><span class="typ">Size</span><span class="pln">              </span><span class="typ">EntSize</span><span class="pln">          </span><span class="typ">Flags</span><span class="pln">  </span><span class="typ">Link</span><span class="pln">  </span><span class="typ">Info</span><span class="pln">  </span><span class="typ">Align</span><span class="pln">
  </span><span class="pun">[</span><span class="pln"> </span><span class="lit">0</span><span class="pun">]</span><span class="pln">                   NULL             </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00000000</span><span class="pln">
       </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">
</span><span class="pun">...</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">11</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">plt              PROGBITS         </span><span class="lit">40000000000004c0</span><span class="pln">  </span><span class="lit">000004c0</span><span class="pln">
       </span><span class="lit">00000000000000c0</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  AX       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">32</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">12</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">text             PROGBITS         </span><span class="lit">4000000000000580</span><span class="pln">  </span><span class="lit">00000580</span><span class="pln">
       </span><span class="lit">00000000000004a0</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  AX       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">32</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">13</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">fini             PROGBITS         </span><span class="lit">4000000000000a20</span><span class="pln">  </span><span class="lit">00000a20</span><span class="pln">
       </span><span class="lit">0000000000000040</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  AX       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">16</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">14</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">rodata           PROGBITS         </span><span class="lit">4000000000000a60</span><span class="pln">  </span><span class="lit">00000a60</span><span class="pln">
       </span><span class="lit">000000000000000f</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">   A       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">15</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">opd              PROGBITS         </span><span class="lit">4000000000000a70</span><span class="pln">  </span><span class="lit">00000a70</span><span class="pln">
       </span><span class="lit">0000000000000070</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">   A       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">16</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">16</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">IA_64</span><span class="pun">.</span><span class="pln">unwind_inf PROGBITS         </span><span class="lit">4000000000000ae0</span><span class="pln">  </span><span class="lit">00000ae0</span><span class="pln">
       </span><span class="lit">00000000000000f0</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">   A       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">17</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">IA_64</span><span class="pun">.</span><span class="pln">unwind     IA_64_UNWIND     </span><span class="lit">4000000000000bd0</span><span class="pln">  </span><span class="lit">00000bd0</span><span class="pln">
       </span><span class="lit">00000000000000c0</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  AL      </span><span class="lit">12</span><span class="pln">     c     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">18</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">init_array       INIT_ARRAY       </span><span class="lit">6000000000000c90</span><span class="pln">  </span><span class="lit">00000c90</span><span class="pln">
       </span><span class="lit">0000000000000018</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">19</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">fini_array       FINI_ARRAY       </span><span class="lit">6000000000000ca8</span><span class="pln">  </span><span class="lit">00000ca8</span><span class="pln">
       </span><span class="lit">0000000000000008</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">20</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">data             PROGBITS         </span><span class="lit">6000000000000cb0</span><span class="pln">  </span><span class="lit">00000cb0</span><span class="pln">
       </span><span class="lit">0000000000000004</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">4</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">21</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">dynamic          DYNAMIC          </span><span class="lit">6000000000000cb8</span><span class="pln">  </span><span class="lit">00000cb8</span><span class="pln">
       </span><span class="lit">00000000000001e0</span><span class="pln">  </span><span class="lit">0000000000000010</span><span class="pln">  WA       </span><span class="lit">5</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">22</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">ctors            PROGBITS         </span><span class="lit">6000000000000e98</span><span class="pln">  </span><span class="lit">00000e98</span><span class="pln">
       </span><span class="lit">0000000000000010</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">23</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">dtors            PROGBITS         </span><span class="lit">6000000000000ea8</span><span class="pln">  </span><span class="lit">00000ea8</span><span class="pln">
       </span><span class="lit">0000000000000010</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">24</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">jcr              PROGBITS         </span><span class="lit">6000000000000eb8</span><span class="pln">  </span><span class="lit">00000eb8</span><span class="pln">
       </span><span class="lit">0000000000000008</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">25</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">got              PROGBITS         </span><span class="lit">6000000000000ec0</span><span class="pln">  </span><span class="lit">00000ec0</span><span class="pln">
       </span><span class="lit">0000000000000050</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln"> </span><span class="typ">WAp</span><span class="pln">       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">26</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">IA_64</span><span class="pun">.</span><span class="pln">pltoff     PROGBITS         </span><span class="lit">6000000000000f10</span><span class="pln">  </span><span class="lit">00000f10</span><span class="pln">
       </span><span class="lit">0000000000000030</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln"> </span><span class="typ">WAp</span><span class="pln">       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">16</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">27</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">sdata            PROGBITS         </span><span class="lit">6000000000000f40</span><span class="pln">  </span><span class="lit">00000f40</span><span class="pln">
       </span><span class="lit">0000000000000010</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln"> </span><span class="typ">WAp</span><span class="pln">       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">28</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">sbss             NOBITS           </span><span class="lit">6000000000000f50</span><span class="pln">  </span><span class="lit">00000f50</span><span class="pln">
       </span><span class="lit">0000000000000008</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">29</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">bss              NOBITS           </span><span class="lit">6000000000000f58</span><span class="pln">  </span><span class="lit">00000f50</span><span class="pln">
       </span><span class="lit">0000000000000008</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">  WA       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">30</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">comment          PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00000f50</span><span class="pln">
       </span><span class="lit">00000000000000b9</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">31</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">debug_aranges    PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00001010</span><span class="pln">
       </span><span class="lit">0000000000000090</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">16</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">32</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">debug_pubnames   PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">000010a0</span><span class="pln">
       </span><span class="lit">0000000000000025</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">33</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">debug_info       PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">000010c5</span><span class="pln">
       </span><span class="lit">00000000000009c4</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">34</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">debug_abbrev     PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00001a89</span><span class="pln">
       </span><span class="lit">0000000000000124</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">35</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">debug_line       PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00001bad</span><span class="pln">
       </span><span class="lit">00000000000001fe</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">36</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">debug_str        PROGBITS         </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00001dab</span><span class="pln">
       </span><span class="lit">00000000000006a1</span><span class="pln">  </span><span class="lit">0000000000000001</span><span class="pln">  MS       </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">37</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">shstrtab         STRTAB           </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">0000244c</span><span class="pln">
       </span><span class="lit">000000000000016f</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">38</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">symtab           SYMTAB           </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00002fc0</span><span class="pln">
       </span><span class="lit">0000000000000b58</span><span class="pln">  </span><span class="lit">0000000000000018</span><span class="pln">          </span><span class="lit">39</span><span class="pln">    </span><span class="lit">60</span><span class="pln">     </span><span class="lit">8</span><span class="pln">
  </span><span class="pun">[</span><span class="lit">39</span><span class="pun">]</span><span class="pln"> </span><span class="pun">.</span><span class="pln">strtab           STRTAB           </span><span class="lit">0000000000000000</span><span class="pln">  </span><span class="lit">00003b18</span><span class="pln">
       </span><span class="lit">0000000000000479</span><span class="pln">  </span><span class="lit">0000000000000000</span><span class="pln">           </span><span class="lit">0</span><span class="pln">     </span><span class="lit">0</span><span class="pln">     </span><span class="lit">1</span><span class="pln">
</span><span class="typ">Key</span><span class="pln"> to </span><span class="typ">Flags</span><span class="pun">:</span><span class="pln">
  W </span><span class="pun">(</span><span class="pln">write</span><span class="pun">),</span><span class="pln"> A </span><span class="pun">(</span><span class="pln">alloc</span><span class="pun">),</span><span class="pln"> X </span><span class="pun">(</span><span class="pln">execute</span><span class="pun">),</span><span class="pln"> M </span><span class="pun">(</span><span class="pln">merge</span><span class="pun">),</span><span class="pln"> S </span><span class="pun">(</span><span class="pln">strings</span><span class="pun">)</span><span class="pln">
  I </span><span class="pun">(</span><span class="pln">info</span><span class="pun">),</span><span class="pln"> L </span><span class="pun">(</span><span class="pln">link order</span><span class="pun">),</span><span class="pln"> G </span><span class="pun">(</span><span class="pln">group</span><span class="pun">),</span><span class="pln"> x </span><span class="pun">(</span><span class="pln">unknown</span><span class="pun">)</span><span class="pln">
  O </span><span class="pun">(</span><span class="pln">extra OS processing required</span><span class="pun">)</span><span class="pln"> o </span><span class="pun">(</span><span class="pln">OS specific</span><span class="pun">),</span><span class="pln"> p </span><span class="pun">(</span><span class="pln">processor specific</span><span class="pun">)</span></pre>

<p>
	يوجد هذا العنوان في القسم <code>‎.plt</code> كما هو متوقع حيث يوجد استدعاؤها في جدول PLT. لكن لنواصل البحث أكثر ولنفكك القسم <code>‎.plt</code> لنرى ما يفعله هذا الاستدعاء كما يلي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_22" style=""><span class="pln">            </span><span class="lit">40000000000004c0</span><span class="pln"> </span><span class="pun">&lt;.</span><span class="pln">plt</span><span class="pun">&gt;:</span><span class="pln">
</span><span class="lit">40000000000004c0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">0b</span><span class="pln"> </span><span class="lit">10</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">1c</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">21</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MMI</span><span class="pun">]</span><span class="pln">       mov r2</span><span class="pun">=</span><span class="pln">r14</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000004c6</span><span class="pun">:</span><span class="pln">       e0 </span><span class="lit">00</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">48</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   addl r14</span><span class="pun">=</span><span class="lit">0</span><span class="pun">,</span><span class="pln">r2
</span><span class="lit">40000000000004cc</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         nop</span><span class="pun">.</span><span class="pln">i </span><span class="lit">0x0</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000004d0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">0b</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">20</span><span class="pln"> </span><span class="lit">1c</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="lit">14</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MMI</span><span class="pun">]</span><span class="pln">       ld8 r16</span><span class="pun">=[</span><span class="pln">r14</span><span class="pun">],</span><span class="lit">8</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000004d6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">10</span><span class="pln"> </span><span class="lit">41</span><span class="pln"> </span><span class="lit">38</span><span class="pln"> </span><span class="lit">30</span><span class="pln"> </span><span class="lit">28</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   ld8 r17</span><span class="pun">=[</span><span class="pln">r14</span><span class="pun">],</span><span class="lit">8</span><span class="pln">
</span><span class="lit">40000000000004dc</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         nop</span><span class="pun">.</span><span class="pln">i </span><span class="lit">0x0</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000004e0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">1c</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="lit">10</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       ld8 r1</span><span class="pun">=[</span><span class="pln">r14</span><span class="pun">]</span><span class="pln">
</span><span class="lit">40000000000004e6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">88</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   mov b6</span><span class="pun">=</span><span class="pln">r17
</span><span class="lit">40000000000004ec</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few b6</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">40000000000004f0</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">78</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">24</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       mov r15</span><span class="pun">=</span><span class="lit">0</span><span class="pln">
</span><span class="lit">40000000000004f6</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   nop</span><span class="pun">.</span><span class="pln">i </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">40000000000004fc</span><span class="pun">:</span><span class="pln">       d0 ff ff </span><span class="lit">48</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few </span><span class="lit">40000000000004c0</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">_init</span><span class="pun">+</span><span class="lit">0x50</span><span class="pun">&gt;;;</span><span class="pln">
</span><span class="lit">4000000000000500</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">78</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">24</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       mov r15</span><span class="pun">=</span><span class="lit">1</span><span class="pln">
</span><span class="lit">4000000000000506</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   nop</span><span class="pun">.</span><span class="pln">i </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">400000000000050c</span><span class="pun">:</span><span class="pln">       c0 ff ff </span><span class="lit">48</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few </span><span class="lit">40000000000004c0</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">_init</span><span class="pun">+</span><span class="lit">0x50</span><span class="pun">&gt;;;</span><span class="pln">
</span><span class="lit">4000000000000510</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">78</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">24</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       mov r15</span><span class="pun">=</span><span class="lit">2</span><span class="pln">
</span><span class="lit">4000000000000516</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">02</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   nop</span><span class="pun">.</span><span class="pln">i </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">400000000000051c</span><span class="pun">:</span><span class="pln">       b0 ff ff </span><span class="lit">48</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few </span><span class="lit">40000000000004c0</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">_init</span><span class="pun">+</span><span class="lit">0x50</span><span class="pun">&gt;;;</span><span class="pln">
</span><span class="lit">4000000000000520</span><span class="pun">:</span><span class="pln">       </span><span class="lit">0b</span><span class="pln"> </span><span class="lit">78</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">24</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MMI</span><span class="pun">]</span><span class="pln">       addl r15</span><span class="pun">=</span><span class="lit">80</span><span class="pun">,</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000526</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">41</span><span class="pln"> </span><span class="lit">3c</span><span class="pln"> </span><span class="lit">70</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> c0                   ld8</span><span class="pun">.</span><span class="pln">acq r16</span><span class="pun">=[</span><span class="pln">r15</span><span class="pun">],</span><span class="lit">8</span><span class="pln">
</span><span class="lit">400000000000052c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">01</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">84</span><span class="pln">                         mov r14</span><span class="pun">=</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000530</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">1e</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="lit">10</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       ld8 r1</span><span class="pun">=[</span><span class="pln">r15</span><span class="pun">]</span><span class="pln">
</span><span class="lit">4000000000000536</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   mov b6</span><span class="pun">=</span><span class="pln">r16
</span><span class="lit">400000000000053c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few b6</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000540</span><span class="pun">:</span><span class="pln">       </span><span class="lit">0b</span><span class="pln"> </span><span class="lit">78</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">24</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MMI</span><span class="pun">]</span><span class="pln">       addl r15</span><span class="pun">=</span><span class="lit">96</span><span class="pun">,</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000546</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">41</span><span class="pln"> </span><span class="lit">3c</span><span class="pln"> </span><span class="lit">70</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> c0                   ld8</span><span class="pun">.</span><span class="pln">acq r16</span><span class="pun">=[</span><span class="pln">r15</span><span class="pun">],</span><span class="lit">8</span><span class="pln">
</span><span class="lit">400000000000054c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">01</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">84</span><span class="pln">                         mov r14</span><span class="pun">=</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000550</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">1e</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="lit">10</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       ld8 r1</span><span class="pun">=[</span><span class="pln">r15</span><span class="pun">]</span><span class="pln">
</span><span class="lit">4000000000000556</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   mov b6</span><span class="pun">=</span><span class="pln">r16
</span><span class="lit">400000000000055c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few b6</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000560</span><span class="pun">:</span><span class="pln">       </span><span class="lit">0b</span><span class="pln"> </span><span class="lit">78</span><span class="pln"> c0 </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">24</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MMI</span><span class="pun">]</span><span class="pln">       addl r15</span><span class="pun">=</span><span class="lit">112</span><span class="pun">,</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000566</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">41</span><span class="pln"> </span><span class="lit">3c</span><span class="pln"> </span><span class="lit">70</span><span class="pln"> </span><span class="lit">29</span><span class="pln"> c0                   ld8</span><span class="pun">.</span><span class="pln">acq r16</span><span class="pun">=[</span><span class="pln">r15</span><span class="pun">],</span><span class="lit">8</span><span class="pln">
</span><span class="lit">400000000000056c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">01</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">84</span><span class="pln">                         mov r14</span><span class="pun">=</span><span class="pln">r1</span><span class="pun">;;</span><span class="pln">
</span><span class="lit">4000000000000570</span><span class="pun">:</span><span class="pln">       </span><span class="lit">11</span><span class="pln"> </span><span class="lit">08</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">1e</span><span class="pln"> </span><span class="lit">18</span><span class="pln"> </span><span class="lit">10</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln">       ld8 r1</span><span class="pun">=[</span><span class="pln">r15</span><span class="pun">]</span><span class="pln">
</span><span class="lit">4000000000000576</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">04</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">03</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   mov b6</span><span class="pun">=</span><span class="pln">r16
</span><span class="lit">400000000000057c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">80</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few b6</span><span class="pun">;;</span><span class="pln">    </span></pre>

<p>
	إذًا لنمر على التعليمات، حيث أضفنا أولًا القيمة 80 إلى القيمة الموجودة في المسجّل r1، وخزّناها في المسجّل r15. سيؤشّر المسجل r1 إلى جدول GOT، مما يعني تخزين المسجل r15 الذي يحتوي على 80 بايت في جدول GOT. ثانيًا، حمّلنا القيمة المخزنة في هذا الموقع من جدول GOT إلى المسجّل r16، ثم زدنا القيمة الموجودة في المسجل r15 بمقدار 8 بايتات. ثالثًا، خزّنا المسجّل r1 -أو موقع جدول GOT- في المسجّل r14 وضبطنا القيمة الموجودة في المسجل r1 لتكون القيمة الموجودة في 8 بايتات التالية للمسجّل r15، ثم نتفرّع إلى المسجل r16.
</p>

<p>
	ناقشنا سابقًا كيفية استدعاء الدوال باستخدام واصف الدالة Function Descriptor الذي يحتوي على عنوان الدالة وعنوان المؤشر العام. يمكننا أن نرى أن مدخلة جدول PLT تحمّل أولًا قيمة الدالة، مما يؤدي إلى الانتقال بمقدار 8 بايتات إلى الجزء الثاني من واصف الدالة ثم تحميل تلك القيمة في مسجّل العملية Op Register قبل استدعاء الدالة.
</p>

<p>
	نعلم أن المسجل r1 سيؤشّر إلى جدول GOT، ثم سنذهب بمقدار 80 بايت بعد جدول GOT أي بمقدار (0x50).
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_24" style=""><span class="pln">           $ objdump </span><span class="pun">--</span><span class="pln">disassemble</span><span class="pun">-</span><span class="pln">all </span><span class="pun">./</span><span class="pln">hello 
</span><span class="typ">Disassembly</span><span class="pln"> of section </span><span class="pun">.</span><span class="pln">got</span><span class="pun">:</span><span class="pln">

</span><span class="lit">6000000000000ec0</span><span class="pln"> </span><span class="pun">&lt;.</span><span class="pln">got</span><span class="pun">&gt;:</span><span class="pln">
        </span><span class="pun">...</span><span class="pln">
</span><span class="lit">6000000000000ee8</span><span class="pun">:</span><span class="pln">       </span><span class="lit">80</span><span class="pln"> </span><span class="lit">0a</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   data8 </span><span class="lit">0x02a000000</span><span class="pln">
</span><span class="lit">6000000000000eee</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> </span><span class="lit">90</span><span class="pln"> </span><span class="lit">0a</span><span class="pln">                         dep r0</span><span class="pun">=</span><span class="pln">r0</span><span class="pun">,</span><span class="pln">r0</span><span class="pun">,</span><span class="lit">63</span><span class="pun">,</span><span class="lit">1</span><span class="pln">
</span><span class="lit">6000000000000ef2</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p20</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x1</span><span class="pln">
</span><span class="lit">6000000000000ef8</span><span class="pun">:</span><span class="pln">       a0 </span><span class="lit">0a</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   data8 </span><span class="lit">0x02a810000</span><span class="pln">
</span><span class="lit">6000000000000efe</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> </span><span class="lit">50</span><span class="pln"> </span><span class="lit">0f</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few </span><span class="lit">6000000000000ef0</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">_GLOBAL_OFFSET_TABLE_</span><span class="pun">+</span><span class="lit">0x30</span><span class="pun">&gt;</span><span class="pln">
</span><span class="lit">6000000000000f02</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">60</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p58</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x1</span><span class="pln">
</span><span class="lit">6000000000000f08</span><span class="pun">:</span><span class="pln">       </span><span class="lit">60</span><span class="pln"> </span><span class="lit">0a</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   data8 </span><span class="lit">0x029818000</span><span class="pln">
</span><span class="lit">6000000000000f0e</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> </span><span class="lit">90</span><span class="pln"> </span><span class="lit">06</span><span class="pln">                         br</span><span class="pun">.</span><span class="pln">few </span><span class="lit">6000000000000f00</span><span class="pln"> </span><span class="pun">&lt;</span><span class="pln">_GLOBAL_OFFSET_TABLE_</span><span class="pun">+</span><span class="lit">0x40</span><span class="pun">&gt;</span><span class="pln">
</span><span class="typ">Disassembly</span><span class="pln"> of section </span><span class="pun">.</span><span class="pln">IA_64</span><span class="pun">.</span><span class="pln">pltoff</span><span class="pun">:</span><span class="pln">

</span><span class="lit">6000000000000f10</span><span class="pln"> </span><span class="pun">&lt;.</span><span class="pln">IA_64</span><span class="pun">.</span><span class="pln">pltoff</span><span class="pun">&gt;:</span><span class="pln">
</span><span class="lit">6000000000000f10</span><span class="pun">:</span><span class="pln">       f0 </span><span class="lit">04</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p39</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">6000000000000f16</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> c0 </span><span class="lit">0e</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   data8 </span><span class="lit">0x03b010000</span><span class="pln">
</span><span class="lit">6000000000000f1c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">60</span><span class="pln">                         data8 </span><span class="lit">0xc000000000</span><span class="pln">
</span><span class="lit">6000000000000f20</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">05</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MII</span><span class="pun">]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p40</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">6000000000000f26</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> c0 </span><span class="lit">0e</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   data8 </span><span class="lit">0x03b010000</span><span class="pln">
</span><span class="lit">6000000000000f2c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">60</span><span class="pln">                         data8 </span><span class="lit">0xc000000000</span><span class="pln">
</span><span class="lit">6000000000000f30</span><span class="pun">:</span><span class="pln">       </span><span class="lit">10</span><span class="pln"> </span><span class="lit">05</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">       </span><span class="pun">[</span><span class="pln">MIB</span><span class="pun">]</span><span class="pln"> </span><span class="pun">(</span><span class="pln">p40</span><span class="pun">)</span><span class="pln"> </span><span class="kwd">break</span><span class="pun">.</span><span class="pln">m </span><span class="lit">0x0</span><span class="pln">
</span><span class="lit">6000000000000f36</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">40</span><span class="pln"> c0 </span><span class="lit">0e</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln">                   data8 </span><span class="lit">0x03b010000</span><span class="pln">
</span><span class="lit">6000000000000f3c</span><span class="pun">:</span><span class="pln">       </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">00</span><span class="pln"> </span><span class="lit">60</span><span class="pln">                         data8 </span><span class="lit">0xc000000000</span></pre>

<p>
	إذا أضفنا القيمة 0x50 إلى العنوان 0x6000000000000ec0، فسنصل إلى العنوان 0x6000000000000f10 أو القسم <code>‎.IA_64.pltoff</code>.
</p>

<p>
	يمكننا فك شيفرة خرج البرنامج <code>objdump</code> لنتمكّن من رؤية ما جرى تحميله بالضبط. يؤدي تبديل ترتيب البايت لأول 8 بايتات <code>f0 04 00 00 00 00 00 40</code> إلى الحصول على العنوان 0x4000000000004f0، إذ يبدو هذا العنوان مألوفًا، حيث إذا نظرنا إلى الوراء في ناتج التجميع الخاص بجدول PLT ، فسنرى ذلك العنوان.
</p>

<p>
	أولًا تضع الشيفرة البرمجية الموجودة عند العنوان 0x4000000000004f0 قيمة صفرية في المسجل r15، ثم تتفرع مرة أخرى إلى العنوان 0x40000000000004c0، ولكن يُعَد هذا العنوان بداية القسم PLT. يمكننا تتبّع هذه الشيفرة البرمجية، إذ نحفظ أولًا قيمة المؤشر العام في المسجل r2، ثم نحمل ثلاث قيم بحجم 8 بايتات في المسجلات r16 وr17 وr1، ثم نتفرع إلى العنوان الموجود في المسجل r17، حيث يمثّل تلك العملية الاستدعاء الفعلي للرابط الديناميكي.
</p>

<p>
	يجب أن نتعمق قليلًا في فهم واجهة ABI التي تعطينا مفهومين لنفهم بالضبط ما يجري تحميله الآن، وهذا المفهومان هما أنه يجب أن تحتوي البرامج المرتبطة ديناميكيًا على قسم خاص يسمى القسم <code>DT_IA_64_PLT_RESERVE</code> الذي يمكنه الاحتفاظ بثلاث قيم بحجم 8 بايتات، ويوجد مؤشر في مكان وجود هذه المنطقة المحجوزة في المقطع الديناميكي للملف الثنائي الموضّح في المثال التالي:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_26" style=""><span class="typ">Dynamic</span><span class="pln"> segment at offset </span><span class="lit">0xcb8</span><span class="pln"> contains </span><span class="lit">25</span><span class="pln"> entries</span><span class="pun">:</span><span class="pln">
  </span><span class="typ">Tag</span><span class="pln">        </span><span class="typ">Type</span><span class="pln">                         </span><span class="typ">Name</span><span class="pun">/</span><span class="typ">Value</span><span class="pln">
 </span><span class="lit">0x0000000000000001</span><span class="pln"> </span><span class="pun">(</span><span class="pln">NEEDED</span><span class="pun">)</span><span class="pln">             </span><span class="typ">Shared</span><span class="pln"> library</span><span class="pun">:</span><span class="pln"> </span><span class="pun">[</span><span class="pln">libc</span><span class="pun">.</span><span class="pln">so</span><span class="pun">.</span><span class="lit">6.1</span><span class="pun">]</span><span class="pln">
 </span><span class="lit">0x000000000000000c</span><span class="pln"> </span><span class="pun">(</span><span class="pln">INIT</span><span class="pun">)</span><span class="pln">               </span><span class="lit">0x4000000000000470</span><span class="pln">
 </span><span class="lit">0x000000000000000d</span><span class="pln"> </span><span class="pun">(</span><span class="pln">FINI</span><span class="pun">)</span><span class="pln">               </span><span class="lit">0x4000000000000a20</span><span class="pln">
 </span><span class="lit">0x0000000000000019</span><span class="pln"> </span><span class="pun">(</span><span class="pln">INIT_ARRAY</span><span class="pun">)</span><span class="pln">         </span><span class="lit">0x6000000000000c90</span><span class="pln">
 </span><span class="lit">0x000000000000001b</span><span class="pln"> </span><span class="pun">(</span><span class="pln">INIT_ARRAYSZ</span><span class="pun">)</span><span class="pln">       </span><span class="lit">24</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x000000000000001a</span><span class="pln"> </span><span class="pun">(</span><span class="pln">FINI_ARRAY</span><span class="pun">)</span><span class="pln">         </span><span class="lit">0x6000000000000ca8</span><span class="pln">
 </span><span class="lit">0x000000000000001c</span><span class="pln"> </span><span class="pun">(</span><span class="pln">FINI_ARRAYSZ</span><span class="pun">)</span><span class="pln">       </span><span class="lit">8</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x0000000000000004</span><span class="pln"> </span><span class="pun">(</span><span class="pln">HASH</span><span class="pun">)</span><span class="pln">               </span><span class="lit">0x4000000000000200</span><span class="pln">
 </span><span class="lit">0x0000000000000005</span><span class="pln"> </span><span class="pun">(</span><span class="pln">STRTAB</span><span class="pun">)</span><span class="pln">             </span><span class="lit">0x4000000000000330</span><span class="pln">
 </span><span class="lit">0x0000000000000006</span><span class="pln"> </span><span class="pun">(</span><span class="pln">SYMTAB</span><span class="pun">)</span><span class="pln">             </span><span class="lit">0x4000000000000240</span><span class="pln">
 </span><span class="lit">0x000000000000000a</span><span class="pln"> </span><span class="pun">(</span><span class="pln">STRSZ</span><span class="pun">)</span><span class="pln">              </span><span class="lit">138</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x000000000000000b</span><span class="pln"> </span><span class="pun">(</span><span class="pln">SYMENT</span><span class="pun">)</span><span class="pln">             </span><span class="lit">24</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x0000000000000015</span><span class="pln"> </span><span class="pun">(</span><span class="pln">DEBUG</span><span class="pun">)</span><span class="pln">              </span><span class="lit">0x0</span><span class="pln">
 </span><span class="lit">0x0000000070000000</span><span class="pln"> </span><span class="pun">(</span><span class="pln">IA_64_PLT_RESERVE</span><span class="pun">)</span><span class="pln">  </span><span class="lit">0x6000000000000ec0</span><span class="pln"> </span><span class="pun">--</span><span class="pln"> </span><span class="lit">0x6000000000000ed8</span><span class="pln">
 </span><span class="lit">0x0000000000000003</span><span class="pln"> </span><span class="pun">(</span><span class="pln">PLTGOT</span><span class="pun">)</span><span class="pln">             </span><span class="lit">0x6000000000000ec0</span><span class="pln">
 </span><span class="lit">0x0000000000000002</span><span class="pln"> </span><span class="pun">(</span><span class="pln">PLTRELSZ</span><span class="pun">)</span><span class="pln">           </span><span class="lit">72</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x0000000000000014</span><span class="pln"> </span><span class="pun">(</span><span class="pln">PLTREL</span><span class="pun">)</span><span class="pln">             RELA
 </span><span class="lit">0x0000000000000017</span><span class="pln"> </span><span class="pun">(</span><span class="pln">JMPREL</span><span class="pun">)</span><span class="pln">             </span><span class="lit">0x4000000000000420</span><span class="pln">
 </span><span class="lit">0x0000000000000007</span><span class="pln"> </span><span class="pun">(</span><span class="pln">RELA</span><span class="pun">)</span><span class="pln">               </span><span class="lit">0x40000000000003f0</span><span class="pln">
 </span><span class="lit">0x0000000000000008</span><span class="pln"> </span><span class="pun">(</span><span class="pln">RELASZ</span><span class="pun">)</span><span class="pln">             </span><span class="lit">48</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x0000000000000009</span><span class="pln"> </span><span class="pun">(</span><span class="pln">RELAENT</span><span class="pun">)</span><span class="pln">            </span><span class="lit">24</span><span class="pln"> </span><span class="pun">(</span><span class="pln">bytes</span><span class="pun">)</span><span class="pln">
 </span><span class="lit">0x000000006ffffffe</span><span class="pln"> </span><span class="pun">(</span><span class="pln">VERNEED</span><span class="pun">)</span><span class="pln">            </span><span class="lit">0x40000000000003d0</span><span class="pln">
 </span><span class="lit">0x000000006fffffff</span><span class="pln"> </span><span class="pun">(</span><span class="pln">VERNEEDNUM</span><span class="pun">)</span><span class="pln">         </span><span class="lit">1</span><span class="pln">
 </span><span class="lit">0x000000006ffffff0</span><span class="pln"> </span><span class="pun">(</span><span class="pln">VERSYM</span><span class="pun">)</span><span class="pln">             </span><span class="lit">0x40000000000003ba</span><span class="pln">
 </span><span class="lit">0x0000000000000000</span><span class="pln"> </span><span class="pun">(</span><span class="pln">NULL</span><span class="pun">)</span><span class="pln">               </span><span class="lit">0x0</span></pre>

<p>
	لاحظ أننا حصلنا على قيمة جدول GOT نفسه، وهذا يعني أن أول ثلاث مدخلات بحجم 8 بايتات في جدول GOT تمثل المنطقة المحجوزة، وبالتالي سيُؤشَّر إليها دائمًا باستخدام المؤشر العام.
</p>

<p>
	يجب أن يملأ الرابط الديناميكي هذه القيم عند بدء تشغيله، حيث تحدّد واجهة ABI أنه يجب ملء القيمة الأولى بواسطة الرابط الديناميكي الذي يمنح هذه الوحدة معرفًا فريدًا، والقيمة الثانية هي قيمة المؤشر العام للرابط الديناميكي، والقيمة الثالثة هي عنوان الدالة التي تبحث عن الرمز وتصلحه.
</p>

<p>
	يوضّح المثال التالي شيفرة برمجية في الرابط الديناميكي لإعداد قيم خاصة من المكتبة libc أو من <code>sysdeps/ia64/dl-machine.h</code>:
</p>

<pre class="ipsCode prettyprint lang-c prettyprinted" id="ips_uid_5899_28" style=""><span class="pun">‫</span><span class="com">/* ‫إعداد الكائن المحمَّل الموصوف باستخدام المتغير L حتى تقفز مدخلات جدول PLT التي ليس لها انتقالات إلى ‫شيفرة الإصلاح البرمجية عند الطلب في ملف dl-runtime.c.  */</span><span class="pln">

</span><span class="kwd">static</span><span class="pln"> </span><span class="kwd">inline</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> __attribute__ </span><span class="pun">((</span><span class="pln">unused</span><span class="pun">,</span><span class="pln"> always_inline</span><span class="pun">))</span><span class="pln">
elf_machine_runtime_setup </span><span class="pun">(</span><span class="kwd">struct</span><span class="pln"> link_map </span><span class="pun">*</span><span class="pln">l</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> lazy</span><span class="pun">,</span><span class="pln"> </span><span class="typ">int</span><span class="pln"> profile</span><span class="pun">)</span><span class="pln">
</span><span class="pun">{</span><span class="pln">
  </span><span class="kwd">extern</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> _dl_runtime_resolve </span><span class="pun">(</span><span class="kwd">void</span><span class="pun">);</span><span class="pln">
  </span><span class="kwd">extern</span><span class="pln"> </span><span class="kwd">void</span><span class="pln"> _dl_runtime_profile </span><span class="pun">(</span><span class="kwd">void</span><span class="pun">);</span><span class="pln">

  </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">lazy</span><span class="pun">)</span><span class="pln">
    </span><span class="pun">{</span><span class="pln">
      </span><span class="kwd">register</span><span class="pln"> </span><span class="typ">Elf64_Addr</span><span class="pln"> gp __asm__ </span><span class="pun">(</span><span class="str">"gp"</span><span class="pun">);</span><span class="pln">
      </span><span class="typ">Elf64_Addr</span><span class="pln"> </span><span class="pun">*</span><span class="pln">reserve</span><span class="pun">,</span><span class="pln"> doit</span><span class="pun">;</span><span class="pln">

        </span><span class="com">/*
         * ‫احذر من تبديل الأنواع Typecast هنا أو ستُضاف عناصر مؤشر l-l_addr
         */</span><span class="pln">
      reserve </span><span class="pun">=</span><span class="pln"> </span><span class="pun">((</span><span class="typ">Elf64_Addr</span><span class="pln"> </span><span class="pun">*)</span><span class="pln">
                 </span><span class="pun">(</span><span class="pln">l</span><span class="pun">-&gt;</span><span class="pln">l_info</span><span class="pun">[</span><span class="pln">DT_IA_64 </span><span class="pun">(</span><span class="pln">PLT_RESERVE</span><span class="pun">)]-&gt;</span><span class="pln">d_un</span><span class="pun">.</span><span class="pln">d_ptr </span><span class="pun">+</span><span class="pln"> l</span><span class="pun">-&gt;</span><span class="pln">l_addr</span><span class="pun">));</span><span class="pln">
     </span><span class="com">/* تعريف هذا الكائن المشترك  */</span><span class="pln">
      reserve</span><span class="pun">[</span><span class="lit">0</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Elf64_Addr</span><span class="pun">)</span><span class="pln"> l</span><span class="pun">;</span><span class="pln">

     </span><span class="pun">‫</span><span class="com">/* ستُستدعَى هذه الدالة لتطبيق الانتقال‫ Relocation  */</span><span class="pln">
      </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(!</span><span class="pln">profile</span><span class="pun">)</span><span class="pln">
        doit </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Elf64_Addr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">((</span><span class="kwd">struct</span><span class="pln"> fdesc </span><span class="pun">*)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">_dl_runtime_resolve</span><span class="pun">)-&gt;</span><span class="pln">ip</span><span class="pun">;</span><span class="pln">
      </span><span class="kwd">else</span><span class="pln">
        </span><span class="pun">{</span><span class="pln">
          </span><span class="kwd">if</span><span class="pln"> </span><span class="pun">(</span><span class="pln">GLRO</span><span class="pun">(</span><span class="pln">dl_profile</span><span class="pun">)</span><span class="pln"> </span><span class="pun">!=</span><span class="pln"> NULL
             </span><span class="pun">&amp;&amp;</span><span class="pln"> _dl_name_match_p </span><span class="pun">(</span><span class="pln">GLRO</span><span class="pun">(</span><span class="pln">dl_profile</span><span class="pun">),</span><span class="pln"> l</span><span class="pun">))</span><span class="pln">
            </span><span class="pun">{</span><span class="pln">
              </span><span class="pun">‫</span><span class="com">/* ‫هذا هو الكائن الذي نبحث عنه. لنفترض أننا نريد استخدام التشخيص Profiling مع بدء المؤقتات */</span><span class="pln">
              GL</span><span class="pun">(</span><span class="pln">dl_profile_map</span><span class="pun">)</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> l</span><span class="pun">;</span><span class="pln">
            </span><span class="pun">}</span><span class="pln">
          doit </span><span class="pun">=</span><span class="pln"> </span><span class="pun">(</span><span class="typ">Elf64_Addr</span><span class="pun">)</span><span class="pln"> </span><span class="pun">((</span><span class="kwd">struct</span><span class="pln"> fdesc </span><span class="pun">*)</span><span class="pln"> </span><span class="pun">&amp;</span><span class="pln">_dl_runtime_profile</span><span class="pun">)-&gt;</span><span class="pln">ip</span><span class="pun">;</span><span class="pln">
        </span><span class="pun">}</span><span class="pln">

      reserve</span><span class="pun">[</span><span class="lit">1</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> doit</span><span class="pun">;</span><span class="pln">
      reserve</span><span class="pun">[</span><span class="lit">2</span><span class="pun">]</span><span class="pln"> </span><span class="pun">=</span><span class="pln"> gp</span><span class="pun">;</span><span class="pln">
    </span><span class="pun">}</span><span class="pln">

  </span><span class="kwd">return</span><span class="pln"> lazy</span><span class="pun">;</span><span class="pln">
</span><span class="pun">}</span></pre>

<p>
	يمكننا أن نرى كيفية إعداد هذه القيم بواسطة الرابط الديناميكي من خلال النظر في الدالة التي تطبّق ذلك للملف الثنائي. يُضبَط المتغير <code>reserve</code> من مؤشر القسم <code>PLT_RESERVE</code> في الملف الثنائي. تمثل القيمة الفريدة الموضوعة في <code>reserve[0]‎</code> عنوان خارطة الربط Link Map لهذا الكائن، حيث تُعَد خارطة الربط التمثيل الداخلي ضمن مكتبة <code>glibc</code> للكائنات المشتركة. نضع بعد ذلك عنوان الدالة <code>‎_dl_runtime_resolve</code> في القيمة الثانية بافتراض أننا لا نستخدم عملية التشخيص Profiling، ثم تُضبط قيمة <code>reserve[2]‎</code> على <code>gp</code> التي يمكن العثور عليها في المسجل r2 باستخدام الاستدعاء <code>__asm__</code>.
</p>

<p>
	إذا عدنا إلى الوراء في واجهة ABI، فسنرى أنه يجب وضع فهرس انتقال للمدخلة في المسجل r15 ويجب تمرير المعرّف الفريد في المسجل r16. ضُبِط المسجل r15 مسبقًا في الشيفرة الاختبارية Stub Code قبل العودة إلى بداية جدول PLT. ألقِ نظرة على المدخلات، ولاحظ كيف تحمِّل كل مدخلة في جدول PLT المسجل r15 مع قيمة متزايدة، إذ لا ينبغي أن يكون ذلك مفاجئًا إذا نظرت إلى عمليات الانتقال، حيث يكون لانتقال الدالة <code>printf</code> العدد صفر.
</p>

<p>
	نحمّل المسجل r16 من القيم التي هيّأها الرابط الديناميكي، ثم يمكننا تحميل عنوان الدالة والمؤشر العام والفرع في الدالة، ثم نشغّل دالة الرابط الديناميكي <code>‎_dl_runtime_resolve</code> التي تعثر على الانتقال. يستخدم الانتقال اسم الرمز الذي حدّده للعثور على الدالة الصحيحة، حيث يمكن يتضمن ذلك تحميل المكتبة من القرص الصلب إن لم تكن موجودة في الذاكرة، وإلّا فيجب مشاركة الشيفرة البرمجية.
</p>

<p>
	يوفر سجلُ الانتقال للرابط الديناميكي العنوانَ الذي يجب إصلاحه، حيث كان هذا العنوان موجودًا في جدول GOT ثم حمّلته شيفرة PLT الاختبارية، وهذا يعني أنه يمكن الحصول على عنوان الدالة المباشر أو ما يسمى بتقصير دورة الرابط الديناميكي بعد المرة الأولى التي تُستدعَى فيها الدالة أي في المرة الثانية لتحميلها.
</p>

<p>
	رأينا الآلية الدقيقة لعمل جدول PLT والعمل الداخلي للرابط الديناميكي. النقاط المهمة التي يجب تذكرها هي:
</p>

<ul>
	<li>
		تستدعي استدعاءات المكتبة في برنامجك الشيفرة الاختبارية في جدول PLT الخاص بالملف الثنائي.
	</li>
	<li>
		تحمّل هذه الشيفرة الاختبارية عنوانًا وتقفز إليه.
	</li>
	<li>
		يؤشّر هذا العنوان إلى دالةٍ في الرابط الديناميكي قادرةٍ على البحث عن الدالة الحقيقية من خلال النظر إلى المعلومات الواردة في مدخلة الانتقال لتلك الدالة.
	</li>
	<li>
		يعيد الرابط الديناميكي كتابة العنوان الذي تقرأه الشيفرة الاختبارية، بحيث تنتقل الدالة مباشرة إلى العنوان الصحيح في المرة التالية لاستدعائها.
	</li>
</ul>

<p>
	ترجمة -وبتصرُّف- للقسمين <a href="https://www.bottomupcs.com/libraries.xhtml" rel="external nofollow">Libraries</a> و <a href="https://www.bottomupcs.com/dynamic_libraries.xhtml" rel="external nofollow">Libraries</a> من الفصلين <a href="https://www.bottomupcs.com/chapter07.xhtml" rel="external nofollow">Behind the process</a> و <a href="https://bottomupcs.com/ch09.html" rel="external nofollow">Dynamic Linking</a> من كتاب <a href="https://www.bottomupcs.com/" rel="external nofollow">Computer Science from the Bottom Up</a> لصاحبه Ian Wienand.
</p>

<h2>
	اقرأ أيضا
</h2>

<ul>
	<li>
		المقال التالي: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%B7%D8%B1%D9%8A%D9%82%D8%A9-%D8%B9%D9%85%D9%84-%D8%A7%D9%84%D8%B1%D8%A7%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-%D9%85%D8%B9-%D8%A7%D9%84%D9%85%D9%83%D8%AA%D8%A8%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1967/" rel="">طريقة عمل الرابط الديناميكي مع المكتبات في معمارية الحاسوب</a>
	</li>
	<li>
		المقال السابق: <a href="https://academy.hsoub.com/programming/os-embedded-systems/%D9%85%D9%81%D9%87%D9%88%D9%85-%D8%A7%D9%84%D8%B1%D8%A8%D8%B7-%D8%A7%D9%84%D8%AF%D9%8A%D9%86%D8%A7%D9%85%D9%8A%D9%83%D9%8A-dynamic-linking-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1965/" rel="">مفهوم الربط الديناميكي Dynamic Linking في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%86%D8%B8%D9%85%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A7%D8%AA-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1722/" rel="">أنظمة المعالجات في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AA%D8%B9%D8%B1%D9%81-%D8%B9%D9%84%D9%89-%D9%88%D8%AD%D8%AF%D8%A9-%D8%A7%D9%84%D9%85%D8%B9%D8%A7%D9%84%D8%AC%D8%A9-%D8%A7%D9%84%D9%85%D8%B1%D9%83%D8%B2%D9%8A%D8%A9-%D9%88%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1716/" rel="">تعرف على وحدة المعالجة المركزية وعملياتها في معمارية الحاسوب</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%A3%D9%87%D9%85-%D8%A7%D9%84%D9%85%D9%81%D8%A7%D9%87%D9%8A%D9%85-%D8%A7%D9%84%D8%AA%D9%8A-%D8%AA%D9%86%D8%B8%D9%85-%D8%A7%D9%84%D8%B9%D9%85%D9%84%D9%8A%D8%A7%D8%AA-%D9%88%D8%AA%D8%B9%D8%A7%D9%84%D8%AC%D9%87%D8%A7-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-%D8%A7%D9%84%D8%AD%D8%AF%D9%8A%D8%AB%D8%A9-r1760/" rel="">أهم المفاهيم التي تنظم العمليات وتعالجها في معمارية الحاسوب الحديثة</a>
	</li>
	<li>
		<a href="https://academy.hsoub.com/programming/os-embedded-systems/%D8%AF%D9%88%D8%B1-%D9%86%D8%B8%D8%A7%D9%85-%D8%A7%D9%84%D8%AA%D8%B4%D8%BA%D9%8A%D9%84-%D9%88%D8%AA%D9%86%D8%B8%D9%8A%D9%85%D9%87-%D9%81%D9%8A-%D9%85%D8%B9%D9%85%D8%A7%D8%B1%D9%8A%D8%A9-%D8%A7%D9%84%D8%AD%D8%A7%D8%B3%D9%88%D8%A8-r1723/" rel="">دور نظام التشغيل وتنظيمه في معمارية الحاسوب</a>
	</li>
</ul>
]]></description><guid isPermaLink="false">1966</guid><pubDate>Fri, 28 Apr 2023 18:00:00 +0000</pubDate></item></channel></rss>
