تقييم الموضوع :
  • 3 أصوات - بمعدل 3.67
  • 1
  • 2
  • 3
  • 4
  • 5
[سلسلة التحكم] {5} - التحكم بالمصباح بواسطة الـ USB و Arduino
#1
بسم الله الرحمن الرحيم

والصلاة والسلام على اشرف الخلق محمد وعلى آله الطيبين الطاهرين

السلام عليكم ورحمة الله وبركاته


--

نرحب بكم اخواني الاعزاء في المقالة الاولى عربيا التي تشرح كيفية التحكم بمصباح led بواسطة الUSB وبوردة Arduino والتحكم بها برنامجنا بالسي شارب

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

لذلك ارجو ان لايحدث خلل وانا اكتب هذا المقال حاليا والا راح يصير شيئ مو زين Angry

في هذا المقال سنقوم بشرح نظري وبالصور
وفي النهاية هناك شرح عملي بالفيديو (صوت + صورة)


وكل هذا لتوصيل المعلومة بشكل مثالي للجميع .

في هذا المقال انا اعتمدت على الشرح المبسط جداااا ، لدرجة ان حتى لو اي شخص ماعنده خبرة في الالكترونيات يقدر يتبع الصور ويطبق التحكم

اعلم ان هذا قد يكون القسم الغير مناسب لوجود قسم "التحكم في الاجهزة الخارجية" وهذا الموضوع يناسبه جدا ولكن هذا المقال من تابع لسلسلة التحكم . وانا قد بدأتها هنا لذلك بعد اذن الادارة انا سأقوم بعمل نسختين . نسخة في هذا القسم ، ونسخة في ذاك القسم .











صفر :- اجزاء المقالة :-

1- المتطلبات والقطع الالكترونية
2- تصميم برنامج تحكم بالمصباح بالسي شارب
3- برمجة بوردة الـ Arduino
4- توصيل الComponent
5- تشغيل البرنامج والتحكم بالLed (فيديو من تصويري صوت وصورة تطبيقي)
6- الخاتمة









اولا :- المتطلبات والقطع الالكترونية





يفضل وجودة voltmeter لفحص الجهد والتأكد من توصيلتك

--

ملاحظة انا غير مسؤول عن خطأ في التوصيلات يؤدي الى تلف الcomponent

اتبع خطوات التوصيل الصحيحة والتي سأذكرها بالتفصيل لاحقا .


صور للمتطلبات :-













ثانيا :- تصميم برنامج تحكم بالمصباح بالسي شارب

بوردة Arduino يعتبرها الوندوز ك Serial port ، وبما انه يمكننا التعامل معها كـ Serial port اذن لاحاجة لأي مكتبات اضافية .
فقد خصصت لنا الدوت نت مكتبة كاملة للتعامل مع الSerial port وهي :-

System.IO.Port.SerialPort

وطريقة التعامل مع السيريال بورت سهلة ، فكل ماتحتاجه هو اسم الPort فقط

كيف نحصل على اسم الPort ؟ :-

--

اولا : قم بتوصيل بوردة Arduino الى جهازك (الصورة ليست للArduino تبعنا) :-



ثانيا : سيظهر لك اعلان تثبيت درايفر جديد في على الtaskbar :-



بعد التثبيت ستظهر علامة الصح (الصورة هي لدرايفر اخر ولكن ستظهر لك نفس الرسالة) :-




ثالثا : اذهب MyComputer > System Properties > Device Manger وستظهر لك هذه النافذة :-



وها هو اسم الPort ظاهر : COM16


انا جهزت دالة سهلة بدل كل هلخطوات الطويلة لجلب اسم الport ، الدالة هي :-

PHP كود :
//add refreance > System.Managment
        
public string GetPortName()
        {
            
ManagementObjectCollection ManObjReturn;
            
ManagementObjectSearcher ManObjSearch;
            
ManObjSearch = new ManagementObjectSearcher("Select * from Win32_SerialPort");
            
ManObjReturn ManObjSearch.Get();

            foreach (var 
ManObj in ManObjReturn)
            {
                if (
ManObj["Caption"].ToString().ToLower().Contains("arduino"))
                {
                    return 
ManObj["DeviceID"].ToString();
                }
            }
            return 
string.Empty;
        } 

وسترجع لك الدالة اسم الport كما ظهر لنا في الخطوات السابقة



--

كما قلت سابقا يجب ان نعرف اسم الport الذي سنقوم بارسال البيانات اليه

وها قد عرفناه من خلال الخطوات السابقة او الكود السابق ، الان بكل بساطة قم باضافة هذه الدالة :-

PHP كود :
private void WriteToSerial(string stringToWritestring portName)
        {
            
vcp.BaudRate 9600;
            
vcp.DataBits 8;
            
vcp.StopBits StopBits.One;
            
vcp.Parity Parity.None;
            
vcp.PortName portName;


            
vcp.Open();

            
vcp.Write(stringToWrite);

            
vcp.Close();

        } 

^الدالة مضبوطة بالاعدادات الافتراضية


الدالة تطلب بارمترين :-

الاول :- الdata المراد ارسالها الى البوردة
الثاني :- عنوان الport ولقد استخرجناه في الخطوات السابقة



الان يبقى علينا موضوع الdata وهذا يحتاج القليل من التفسير .

--

الـ data التي سترسلها الى البوردة ستتم قرائتها من جهتها وستترجمها الى امر .

وهذا الامر يكون (فتح pin , اغلاق pin) وهذا فقط ماسنحتاجه من اوامر .

اذن لو ارسلت مثلا "Open pin 4" بااستعمال دالتنا السابقة:-

PHP كود :
string data "Open pin 4";
            
WriteToSerial(data"COM16"); 

هل ستقوم البوردة بفتح الpin رقم 4 ؟

الجواب هو : لا ، لابد من برمجة الArduino لتفهم هذا الامر وهذا ماسنقوم بفعله في الجزء القادم


--

تخطيط بوردة Arduino (الداتا شييت) :-




كل مايهمنا هو الdigital pins (الملونين بالاخضر)
والGround pin (موجود في اكثر من مكان بإسم GND)
وتقدر تستفيد من الpins الاخرين حسب احتياجك

--

انا الان قررت التحكم في Pin 4 لنهاية المقال ، لذلك تابع ...

الان كما قلنا سنقوم بإرسال نص الى البوردة وهي ستقوم باترجمة النص الى امر فتح Pin 4 او اغلاقه

لذلك سأقوم بصنع برنامج بهذا الشكل :-




وساضع فيه الاكود التالية :-

PHP كود :
private void Zero_Click(object senderEventArgs e)
        {
            
string data "4_Low";
            
WriteToSerial(data"COM16");
        }

        private 
void One_Click(object senderEventArgs e)
        {
            
string data "4_High";
            
WriteToSerial(data"COM16");
        }

        private 
void WriteToSerial(string stringToWritestring portName)
        {
            
vcp.BaudRate 9600;
            
vcp.DataBits 8;
            
vcp.StopBits StopBits.One;
            
vcp.Parity Parity.None;
            
vcp.PortName portName;


            
vcp.Open();

            
vcp.Write(stringToWrite);

            
vcp.Close();

        } 

لاحظ كتبت :-

كود :
4_High
وذلك امر لفتح الpin رقم 4

وكتبت :-

كود :
4_Low
وذلك امر لإغلاق الpin رقم 4



الان لو نفذت البرنامج مابيصير شيئ لأن البوردة لاتعرف هذه اللغة وتحتاج لبرمجة ، وهذا ماسنقوم به في الجزء القادم











ثالثا : برمجة بوردة الـ Arduino



لبرمجة البوردة يجب علينا تنزيل برنامج خاص بالبوردة وهو متوفر مجانا على الموقع الرسمي للبوردة

التحميل هنا برابط مباشر

بعد التنزيل والتسطيب ، اوصل البوردة ، ثم شغل البرنامج وستظهر لك هذه النافذة :-


كما ترون الواجهة معربة ايضا Cool

الان اذهب الى ادوات > المنفذ التسلسلي ، واختار عنوان الPort الذي يكون عادا Com15 :


كما ترون الخيار غير مفعل عندي لأن البوردة غير موصلة حاليا . لذلك عليك توصيلها

بعد ذلك اختر "لوحة" واختر نوع البوردة التي تستعملها ، ونحن قلنا في بداية المقالة اننا سنتعامل مع Arduino mega 2560 :


خلاص احنا جاهزين لكتابة الsketch (البرمجة) ، والبرمجة تكون بلغة جافا

ولكن لن تلاحظ ابدااا اننا نكتب بلغة جافا بل ستظن اننا نكتب بلغة سي شارب لشدة التقارب بين السي شارب وجافا الذي يوصف ب 99% . لذلك نحن محظوظين فمن اتقن السي شارب اتقن الجافا وايضا قليل من السي++

المهم سنقوم بكتابة الكود التالي :-
PHP كود :
har inData[20]; // Allocate some space for the string
char inChar=-1// Where to store the character read
byte index 0// Index into array; where to store the character

void setup()
{
  
pinMode(4,OUTPUT);
  
Serial.begin(9600);
}

void loop()
{
  
//high
  
if (Comp("4_High")==0)
  {
    
digitalWrite(4,HIGH);
  }
  
//low
  
else if (Comp("4_Low")==0)
  {
    
digitalWrite(4,LOW);
  }
}


char Comp(charThis) {
  while (
Serial.available() > 0// Don't read unless
    // there you know there is data
  
{
    if(
index 19// One less than the size of the array
    
{
      
inChar Serial.read(); // Read a character
      
inData[index] = inChar// Store it
      
index++; // Increment where to write next
      
inData[index] = '\0'// Null terminate the string
    
}
  }

  if (
strcmp(inData,This)  == 0
  {
    for (
int i=0;i<19;i++) 
    {
      
inData[i]=0;
    }
    
index=0;
    return(
0);
  }
  else 
  {
    return(
1);
  }




ههه ماذا تضن الان ، نحن نكتب بالسي شارب ؟؟

في الحقيق لا نحن نكتب بالجافا ولكن لافرق لأن اللغتين قريبتين جدااااا من بعض من (ناحية الsyntex فقط)Big Grin

انظرو كيف افادتنا السي شارب وهذا احد الفروق التي اعتبرها كبيرة جدا بينها وبين الفيجوال بيسك ، فستواجهك الكثير من المواقف التي ستتطلب منك استخدام لغة اخرى وبما انك تجيد السي شارب فقد ادركت قواعد واساسيات (php, js, c, c++,java) واعذروني اذا نسيت لغة اخرى هههه



المهم نجي نشرح شوي في الكود الي كتبناه :-

PHP كود :
void setup()
{
  
pinMode(4,OUTPUT);
  
Serial.begin(9600);


هذا الكود لتهيئة الPin 4 وجعله output
وتهيئة البوردة على ال baud 9600 وهو الافتراضي للبوردة (الbaud هو يعبر عن سرعة نقل البيانات بال KB اي انه ينقل 9600 بايت في الثانية) < لست متاكد من هذه المعلومة.

المهم ماعلينا نروح للدالة الثانية :-

PHP كود :
void loop()
{
  
//high
  
if (Comp("4_High")==0)
  {
    
digitalWrite(4,HIGH);
  }
  
//low
  
else if (Comp("4_Low")==0)
  {
    
digitalWrite(4,LOW);
  }


هذه الدالة تعمل بشكل دااائم مادامت البوردة موصلة بالحاسب (كما هو مبين في اسمها LOOP)

والان اتضح لماذا كتبنا في السي شارب هذا الكود :-



فإذا تم ارسال "4_High" الى البوردة قم :
PHP كود :
digitalWrite(4,HIGH); 

يعني افتح الpin 4 وانت تعرف ويش يعني افتح pin 4

يعني قم باعطاء signal قيمته 5 volt .


العكس سيحصل لو ارسلت "4_Low"

فسيتم اغلاق ال pin 4 وبالتالي سيصبح الجهد فيه volt 0




واما بالنسبة للدالة Comp .. في الحقيقة لست انا من كتب هذه الدالة ، فقد وجدتها على الانترنت

وظيفتها هي قراءة النص المرسل من برنامجنا ، لان في الحقيقة استعمال الدالة الاصلية لقراءة البيانات المرسلة من برنامجنا اسمها read وهي تقرا بايت واحد واحد

لذلك توجب علينا صنع buffer وهو في الكود باسم[ inChar[20 وقد استخدمته الدالة Comp لقراءة النصوص بشرط ان لايتجاوز طولها 20 حرف

يعني لا ترسل "4_higgggggggggggggg" لان هذا طوله اكثر من 20 حرف ولن تقرأ البوردة هذا النص بالتالي لن يتنفذ الامر .


بالنسبة للمقارنة مع ==0 في هذا الكود

PHP كود :
if (Comp("4_High")==0

فلا تغير هذه 0 ابدا

في الحقيقة لااعلم السبب ولكن مصمم دالة Comp قال لاتغير هذه ال0

ماعليك سوا تغيير البارمتار وتكتب محله نص ليتم مقارنته "4_High" .. فالكود السابق يوازي :

PHP كود :
if (dataReceived.Equals("4_High"))
            {
                ....
            } 


المهم الان .. اكملنا كتابة الsketch ويجب علينا رفعه الى البوردة لكي تتم برمجتها

اولا : تضغط على (صح) ليتم فحص كودك من اي خطا:-




ثانيا : نرفع الsketch الى البوردة :-




خلااص الان تقدر تستعمل برنامج وترسل 1 او 0 وسيتم تنفيذ الامر

كما قلنا ..
1 يعني فتح الpin 4 وهذا يعني خروج 5 فولت منه
و 0 يعني اغلاق الpin 4 وهذا يعني لايخرج شيئ (zero volt)



في الجزء القادم سنقوم باجراء التوصيلات لكي نقوم بالاستفادة من هذا الpin .












رابعا :- توصيل الComponent



طريقة التوصيل (نظريا) :-

1- يتم وضع سلك في الpin 4
2- يتم توصيل هذا السلك مع احد اطراف الresistor
3- يتم توصيل الطرف الاخر من الresistor بالطرف الطويل للled
4- يتم توصيل الطرف الاخر للled بالGND اي الGround وله اكثر من pin في البوردة (أستخدم احدها)


طريقة التوصيل عمليا (تصويري) :


طريقة التوصيل كـ (مخطط رسومي) :


اعتقد كل شيئ واضح فأنا وضحت 3 مرات لكيفية التوصيل (ويش تبون اكثر) هههه

--

الان ممكن انت متابع الموضوع ايها العزيز مبتدأ في الالكترونيات

وممكن تسأل نفسك ليش استخدمنا الresistor قبل التوصيل للLed ؟

الجواب هو : ان الled لاتتحمل ال5 فولت الي يعطيها الpin 4 ، لذلك استخدمنا الresistor لتخفيف الجهد (لأن بما ان التوصيلة هي Series (توالي) فالذي سينقص هو الجهد ... وبهذا سيقل الى 2.5 فولت تقريبا)

طبعا اشتر اكثر من led لانها قد تحترق اذا قمت بتوصيلة خاطئة واقرب مثال هو اعطائها 5 فولت مباشرة فهذا يؤدي الى حرقها مباشرا .


--


انتهينا من شرح جميع الاجزاء وحان وقت جني الثمار ....











خامسا:- تشغيل البرنامج والتحكم بالLed (فيديو من تصويري صوت وصورة تطبيقي)



الشرح النظري :-

طبعا انت المفروض تستنتج كيف تشغل المصباح



--
شغل برنامجنا الذي صممناه بالسي شارب واضغط على 1 ، والان المفروض ان الLed اشتغلت عندك وإلا هناك خلل .

لو اشتغل الled واردت أن تطفأه ، قم بالضغط على 0



--



بدل ان اقوم بشرح عادي بالصور قررت تصوير فيديو وانا اقوم بفعل ذلك شخصيا

في الفيديو هناك تقنيات لم اذكرها في الموضوع :-
1- استخدمت تقنية البث الراديوي الاسلكي (xbee)
2- استخدمت مصباح صغير (ليس led) وهو يعمل بتيار متردد (AC)
3- استخدمت Relay لتشغيل المصباح الصغير








او من على اليوتيوب مباشرة

كود :
http://www.youtube.com/watch?v=jFVDN8HT5vg










سادسا :- الخاتمة


اتمنى انكم قد استفدتم من هذا الموضوع الي تعبت عليه 5 ساعات (ان شاء الله في احد راح يستفيد منه في يوم من الايام ومايروح هذا الموضوع في طي النسيان)

طبعا انا استخدمت دارة سهلة جدا وهي مجرد تشغيل led ولكن يمكنك تطوير الامثلة وصنع دارات اكثر تعقيدا كاستخدم 7 segment وتشغيل موتورات

وحتى تحريك سيارة !! نعم حتى يمكنك تحريك سيارة بضغطات زر بالكيبورد ، كانك تلعب لعبة سيارات هههههه

في النهاية نلاقاكم بعد شهر في المقالة السادسة من [سلسلة التحكم]





Done by - Alshaki LLah



الملفات المرفقة
.rar   vb4arb.rar (الحجم : 36.84 ك ب / التحميلات : 110)
الرد }}}}
#2
السلام عليكم

مقال رائع بارك الله فيك وجعله في ميزان حسناتك

يعطيك العافية
شـــايـفـــك

الرد }}}}
تم الشكر بواسطة: الشاكي لله , 30june
#3
مقالة قوية جدا .. و عربي كمان

الله يعطيك العافية

شكرا لك أخي محمد..
منقطع .. للدراسة Confused
الرد }}}}
تم الشكر بواسطة: الشاكي لله , 30june
#4
هذا المقال من ذهب ولاكن للأسف بعالمنا العربي لانجد له اي اهتمام ، قبل فترة قمت بتصميم تجربة وتوقفة المشكلة هنا بحيث لاتتوفر هذه الادوات في السعودية ، واضطريت إلى تحويل الماوس إلى بوردة والاستفادة من احداثها على شاشة الكمبيوتر .

اسئل الله أن لا يحرمك الاجر أخوي الشاكي
الرد }}}}
تم الشكر بواسطة: الشاكي لله
#5
نعم ، وحتى لو توفرت سعرها عالي جدا

لذلك نحن نشتريها من الخارج (order)

او من احد الربع ، اخر مرة اخذت من صاحبيxbee .. كان يستخدمها في احد مشاريعه منزمان والحين مايستعملها فاعطاني اياها Smile

موفق
الرد }}}}
تم الشكر بواسطة:
#6
مجهود رائع بارك الله فيك

ارجوا التحقق من وجود الفيديو
(وَقُل رَّبِّ زِدْنِي عِلْمًا)

الرد }}}}
تم الشكر بواسطة:
#7
اي فيديواتي حذفها اليوتيوب امس Angry

وللاسف ماقدر ارفع الفيديو لان حجمه 120 مب < مصور بجودة عالية

لذلك تاريخ 10 من الشهر القادم برفع الفيديوهات

موفق
الرد }}}}
تم الشكر بواسطة: kiai87
#8
شكرا لك يا صديقي
مقال ممتاز ويحفز المبتدئين امتالي Big Grin
الرد }}}}
تم الشكر بواسطة: الشاكي لله
#9
السلام عليكم
اريد اربط الاردينيو بالفيجول بيسك 6.0 ممكن وكيف؟؟؟
واريد العمليةبلعكس ادخل من الاردينيو اشاره الى الفيجول
ارجو الرد
وجزكم الله خيرا
ونفع بكم الامه
ahmed.akram201422@gmail.com
الرد }}}}
تم الشكر بواسطة:
#10
(14-03-14, 05:51 AM)leddd كتب : السلام عليكم
اريد اربط الاردينيو بالفيجول بيسك 6.0 ممكن وكيف؟؟؟
واريد العمليةبلعكس ادخل من الاردينيو اشاره الى الفيجول
ارجو الرد
وجزكم الله خيرا
ونفع بكم الامه
ahmed.akram201422@gmail.com

عليكم السلام

نعم ممكن اخي

شوف اخي الاردوينو مالها علاقة بالغة سواء كانت فيجوال بيسك او سي شارب او اسمبلي

الاردوينو تريد شيئ واحد وهو بيانات بنمط الSerialPort وفي الدوت نت لدينا مكتبة تسمى System.IO.Port.SerialPort

الان في الفيجوال بيسك6 عليك ان تجد فئة تتعامل مع الserialPort وباطبع هناك مكون اسمه MSComm في فيجوال6 يتعامل معه

وهنا مثال حول كيفية استخدامها Example


كل ماعليك هو استخدام الدالة Write لكتابة نص مثلا ، وهذا النص سيتم قرائته من جهة الاردوينو وستترجمه الى امر معين (حسب برمجتك لها)



--


اما لقراءة اشارة من الاردوينو

هل ستستخدم sensor ؟

على العموم اقرأ كتاب (الاردوينو ببساطة) كتاب رائع جدا وقد تطرق لهذي المواضيع

http://vb4arb.com/vb/thread-2235-post-10...l#pid10894



--

على العموم من واجبي ان انصحك بالابتعاد عن vb6 لانها لغة قديمة ويوجد افضل منها

الرد }}}}
تم الشكر بواسطة:


المواضيع المحتمل أن تكون متشابهة .
الموضوع : الكاتب الردود : المشاهدات : آخر رد
  [سلسلة التحكم] {2} - التحكم بواسطة Remoting الشاكي لله 8 3,447 06-12-16, 04:22 PM
آخر رد: الشاكي لله
  [سلسلة التعامل مع الويب] تحليل الصفحات باستخدام HtmlAgilityPack الشاكي لله 9 1,243 25-09-16, 12:19 PM
آخر رد: ابراهيم كركوكي
  [مقال] برمجة نظام تشغيل بواسطة #C الشاكي لله 9 4,062 02-06-16, 11:34 AM
آخر رد: CLARO
  انشاء قاعدة MySQL على الانترنت والتعامل معها من برنامجك بواسطة EF5 الشاكي لله 5 1,114 02-06-16, 11:29 AM
آخر رد: CLARO
  تجميعية مقالات [سلسلة التحكم] الشاكي لله 8 1,332 02-06-16, 11:25 AM
آخر رد: CLARO
  [سلسلة التحكم] {3} - خدمة الويب (Web Service) الشاكي لله 8 4,329 02-06-16, 11:25 AM
آخر رد: CLARO
  [سلسلة ادوات المبرمج] {2} - اداة تحليل صفحات الويب HAPXPathFinder الشاكي لله 9 2,012 02-06-16, 11:24 AM
آخر رد: CLARO
  [سلسلة التعامل مع الويب] - ارسال الطلبات HttpWebRequset الشاكي لله 14 4,840 02-06-16, 11:21 AM
آخر رد: CLARO
  [سلسلة التحكم] {1} - طرق التحكم في البرامج الشاكي لله 7 3,229 12-02-16, 10:16 PM
آخر رد: nani49
  [سلسلة التحكم] {6} - التحكم في البرامج بطريقة SendMessage الشاكي لله 3 1,135 12-02-16, 02:01 PM
آخر رد: nani49

التنقل السريع :


يقوم بقرائة الموضوع: بالاضافة الى ( 1 ) ضيف كريم