المشروع الأول فلاشر متنوع الحركات

 وصف المشروع
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
هذا المشروع يعتبر بدايه حقيقيه في عالم احتراف برمجه الميكرو كنتروللر وهذا المشروع يعرض بعض المهارت البرمجيه التي تسهل علي المبرمج كتابه برنامج بسيط ومرتب ومفهوم عند قرائته وفي نفس الوقت ذو امكانيات عاليه


الدائرة الكهربية
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

البرنامج
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

شرح البرنامج
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

يتكون هذا المشروع من عده مشاريع
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
1-  حركات الليدات متنوعه
2-  PWM
3-   حركات الليدات مع PWM


أولا:- حركات الليدات المتنوعه
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

تم تقسيم الحركات الي عده دوال وبرامج فرعيه صغيره
1-   حركه ليد من اليسار الي اليمين نستخدم الداله  toright
2-   حركه ليد من اليمين الي اليسار نستخدم الداله  toleft
3-   حركه ليد من اليسار الي اليمين والتجمع اليدات علي اليمين نستخدم الداله  toright_stop
4-   حركه اليد من اليمنين الي اليسار والتجمع من جهه اليسار نستخدم الداله  toleft_stop
5-   حركه اليدين الاول من اليسار والثاني من اليمين  والوصول كل منهما الي الجه المعاكسه نستخدم الداله  tofromcenter
6-   حركه اليدات كفرشر سريع أضاءه ثم أنطفاء نستخدم نستخدم البرنامج الفرعي  on_off  
7-   تبادل الأضاءه بين اليدات نستخدم نستخدم البرنامج الفرعي  convert
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
الداله toleft
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

{( void toright (int speed,short no
بدايه الداله وأستخدمنا فيها متغيرين الأول للتحكم في السرعه والثاني عدد حركات اليد

PORTB=0b10000000 ;
ليبدأ اليد الحركه من ناحيه اليسار
  
for(i=0;i<no;i++){ PORTB>=1; VDelay_ms(speed);}}
حلقه تكراريه يعتمد عدد دورتها علي المتغير noوفي كل دوره يتم أزاحه الخرج  Bناحيه اليمين بمقدار خطوه واحده وهنا الزمن يتوقف علي الرقم الذي يوضع في المتغير speed وطبعا يكون بالمللي ثانيه
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

 الداله toleft
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
نفس الداله السابقه ولكن هنا الأزاحه ناحيه اليسار


ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
البرنامج الفرعي on_off
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

نستخدم في هذا البرنامج الفرعي حلقه تكراريه تقوم بأطفاء الليدات بزمن أكبر من زمن الأضاءه مع تكرر ذلك عن طريق الحلقه التكرايه ليظهر وكأنه فلاشر كاميرا
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
البرنامج الفرعي convert
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

نستخدم ايضا حلقه تكراريه ووضع البورت Bفي البدايه كما 10101010ثم عكس خرج البورت B عن طريق الأمر portb=~ portb وتكرار ذلك عن طريق الحلقه التكراريه
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
الدالةtoright_stop
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ

1-   الحلقه i تتكرر بمقدارالحلقه  jوعدد دورات الحلقه i  يعتمد علي قيمه j
2-   الحلقه i  تعمل علي ترحيل الليد المضئ بمقدار واحد ليد تبعا للأمر q>>=1 ; وسوف يظهر ذلك علي خرج الميكرو للأننا كتبناالأمر التاليportb=q|k;  وهذا الأمر يعمل مقارنه من نوع (أو) بين المتغير  q و  kثم أظهار النتيجه علي خرج الميكرو
3-   بعد نهايه أول حلقه تكراريه (i) وداخل الحلقه j يتم كتابه الأمر k+=1; والذي يقوم بأضافه واحد منطقي الي المتغير  k وتخزين الناتج داخل المتغير k نفسه للأننا كتبنا هنا = ليصبح المتغير  kبعد نهايه أول حلقه تكراريه ل j بهذه القيمه K=0b00000001  

4-   بعد نهايه ثاني حلقه تكراريه (i) وداخل الحلقه j يتم كتابه الأمر k<<=1; والذي يقوم بترحيل ما بداخل المتغير kبمقدار واحد بت وتخزين الناتج في نفس المتغيرليصبح قيمه kبعد هذا الأمر   K=0b00000010ثم يأتي الأمر   k+=1; الذي يقوم بأضافه واحد منطقي الي المتغير k ليصبح في النهايه المتغير يساوي هذه القيمه K=0b00000011

جدول يبين حركات الليدات في كل حلقه

ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
الدالهtoleft_stop
ـــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
  نفس الداله السابقه ولكن هنا سوف يتم الترحيل الي اليسار وبذلك تختلف أتجاهات الأزاحه وكذلك القيم المضافه علي المتغيرات فهنا مثلا سوف يتم عمل مقارنه(أو) بين المتغير k والقيمه 128بدل من أن نضيف واحد منطقي في الداله  السابقه وايضا المتغير q سوف يأخذ القيمه واحد بدلا من القيمه 0b10000000 في الداله السابقه 

ليصبح الجدول كما يلي

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
الداله tofromcenter
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
    1- الحلقه i تتكرر بمقدارالحلقه  jوعدد دورات الحلقه i  8 دورات
2-   في بدايه الحلقه  j وقبل البدء في الحلقه i يتم تعريف كلا من  المتغيرين  qوk  كما يلي  q=1;k=128;
3-   داخل الحلقه iيتم ترحيل المتغير  q ناحيه اليسار بمقدار واحد وتخزين الناتج في المتغير نفسه عن طريق الأمر q <<=1; وترحيل المتغير  kناحيه اليمين بمقدار واحد عن طريق الأمر  k >>=1;ثم عمل مقارنه(أو) بين هذين المتغيرين وأظهار النيجه علي الخرج بالأمر  PORTB=q|k;

4-   يتم عمل تكرار لهذه العمليه 8 مرات عن طريق الحلقه j


ثانيا:-  PWM
ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
أولا :: PWM: اختصار لـ Pulse Width Modulation . المقصود هو إرسال موجة مربعة أو مستطيلة square wave هذه الموجة عبارة عن hi و low كما هو معلوم فمثلا لو لدينا مصدر جهد خمسة فولت وقمنا بعمل موجة منه عن طريق المايكروكنترولر مثلا هذه الموجة قد تجعل معدل جهد الخرج أقل من خمسة فولت (  4 فولت أو 3 أو 2.4 أو .. كما نريد ) ومن المعلومات المهمة الخاصة بالموتور dc أنه كلما قل الفولت الداخل إليه كلما قلت سرعته .
ثانيا : يمكننا عمل موجة عبارة عن hi , low بينهم زمن انتظار معين ومن خلال هذا الزمن يمكننا التحكم في الموجة الناتجة وبالتالي التحكم في الفولت الناتج أو الطاقة الناتجة وبالتالي التحكم في سرعة الموتور لأن سرعة الموتور تتغير إذا تغير جهد التغذية (فمثلا لو كان الجهد خمسة سيلف الموتور بسرعة معينة ولو كان الجهد ستة فولت سيلف بسرعة أكبر وهكذا .. على حسب نوع الموتور.

أيضا يمكننا التحكم في شدة الإضاءة كما يلي

   ويمكن عمل ذلك في أي نوع من أنواع كما بمشروعنا حيث نقوم  بأضاءه اليدات كلها بزمن أقل بكثير من زمن أطفائها هذا في البدايه ثم نقوم بزياد هذا الزمن (زمن الأضاءه) حتي نساوي الزمنين (زمن الأطفاء وزمن الأضاءه) مع ملاحظه أن كل مره نستخدم فيها زمن أطفاء  وزمن أضاءه معين نقوم بتكرار هذه الحاله عدد معين من خلال عمل لوب حتي يتهيئ للعين أن اليد ضعيف الأضاءه ويزيد تدريجيا كما بالبرنامج كما يلي




ثالثا:- حركات الليدات PWM

ــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــــ
    في هذا البرنامج نستخدم خاصيه   مع تحريك اليدات يمين ويسار وأيضا بالتداخل وفكره هذا المشروع تعتتمد علي أننا سوف نضئ ثلاث ليدات متجاوره ولكن كل ليد بدرجه سطوع مختلفه فمثلا لو كانت الحركه ناحيه اليسار فأن أول ليد أتجاه اليسار سوف يكون مائل للسطوع واليد الذي بجواره سيكون ساطع والذي يليه يكون مائل للأطفاء مع تحريك ذلك سوف يطفي علي الحركه أنسيابيه جميله ويهيئ للعين أن حركه اليدات يتبعها زيل مثل النجوم الساقطه ولفهم أكثر هذه البرنامج ننظر الي الصوره التاليه


    من الصور التاليه يتضح لنا  أننا نتعامل مع خرجين للبورت بي مع حيث نقوم بعرض هذين الخرجين بزمن صغير جدا مع تكرار عرض هذين الخرجين ثم عرض الخرجين التاليين كما بالصور فينتج هذا الشكل كما بالشكل


ملاحظات
     هنا أستخدمنا دوال تعبر عن أوقات مختلفه وذلك لتوفير المساحه في الذاكره حيث أن أمر التأخير الزمني يأخذ حجم كبير في الذاكره وتكراره داخل البرنامج يستهلك حجم كبير جدا في الذاكره ولذلك أستخدمنا هذه الحيله مع ملاحظه ايضا عند أستخدام التأخير الزمني كداله يوفر في ذاكره البرنامج أما عند أستخدامه كتعريف جديد بأستخدام define فأنه لا يوفر في ذاكره البرنامج كما بالصوره التاليه

برنامج المقاطعه
   نستخدم هذا البرنامج لتغير السرعه عن طريق مفتاح وذلك بكل ضغطه علي المفتاح نقوم بزياده كلا من متغيرات الخاصه بالسرعه (الزمن)وهي t1  ,t2  ,t3حيث يقوم البرنامج بزياده هذه المتغيرات بقدر ثابت عند كل ضغطه

ليست هناك تعليقات :

إرسال تعليق