الاتصال التسلسلي Serial communication



الاتصال التسلسلي


ماهو الاتصال التسلسلي



يعتبر الاتصال التسلسلي من أهم المميزات الموجودة في الأردوينو والتي تتيح ربط
الأردوينو مع الحاسوب وإرسال واستقبال البيانات بين الجهازين، فيمكن من خلالها
قراءة وعرض قيم الحساسات أو التحكم بالعناصر أو الاجهزة الموصولة في الاردوينو
من خلال الحاسوب بشكل مباشر.

ماهو الاتصال التسلسلي


كيف يعمل الاتصال التسلسلي



يتم الاتصال التسلسلي بين الجهازين من خلال بروتوكول UART والذي سوف نتحدث عنه
بشكل تفصيلي في مقال آخر، ولكن باختصار عملية النقل تتم عن طريق إرسال واستقبال
سلسلة من الإشارات الرقمية بشكل تسلسلي وبمعدل نقل يتم تحديده من خلال
الجهازين، فيكون الارسال عبارة عن بتات فردية تمثل: البيانات، بت البداية، بت
التوقف، وبت التكافؤ لمعرفة هل البيانات صحيحة أو لا.

كيف يعمل الاتصال التسلسلي


كيفية استخدام الاتصال التسلسلي



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


تهيئة الاتصال التسلسلي



في البداية نحتاج لتهيئة الاتصال التسلسلي لكي نستطيع من استخدامه ويتم ذلك من
خلال كتابة التابع التالي داخل التابع الرئيسي لأننا فقط نحتاجه في بداية تنفيذ
الكود:


class="language-cpp"
>Serial.begin(buad rate);



الbuad rate: يتم مكانها كتابة معدل نقل البيانات وهي عبارة عن عدد البتات
التي سوف يتم نقلها في الثانية الواحدة وهناك قيم معتمدة مثل 4800 أو 9600 أو
115200…الخ وغالبا ما يتم استخدام 9600 لنقل البيانات.



إرسال البيانات الى الحاسوب



بعد تهيئة الاتصال التسلسلي الان نستطيع إرسال البيانات من الاردوينو الى
الحاسوب وذلك من خلال استخدام التابع:


class="language-cpp"
>Serial.print(data);

أو استخدام التابع:


class="language-cpp"
>Serial.println(data);



data: يتم كتابة البيانات التي نريد ارسالها مكانها سواء كانت عبارة عن أرقام
أو نصوص أو متغيرات.




والفرق بين التابعين أن الثاني بعد ارسال البيانات ينتقل الى سطر جديد فيكون
عرض البيانات مرتب أكثر.


إستقبال البيانات من الحاسوب



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


class="language-cpp"
>Serial.available ();


لاستقبال البيانات من الحاسوب الى الاردوينو يمكننا استخدام التابع التالي،
والذي يقوم بقراءة البيانات من المنفذ التسلسلي المرسلة من الحاسوب بشكل
تسلسلي:


class="language-cpp"
>Serial.read();


أو يمكن لاستقبال البيانات من الحاسوب الى الاردوينو يمكننا استخدام التابع
التالي، والذي يقوم بقراءة البيانات من المنفذ التسلسلي المرسلة من الحاسوب
بشكل سلسلة نصية (string):


class="language-cpp"
>Serial.readString();


الأدوات المساعدة في بيئة الاردوينو


نافذة serial monitor



تحتوي بيئة الاردوينو على شاشة تسلسلية متكاملة والتي يمكن استخدامها في عرض
البيانات، بعد رفع الكود البرمجي الى لوحة الأردوينو يمكنك فتح شاشة السيريال
من خلال Tools >> serial monitor أو من خلال الأيقونة الموجود في الشاشة
الرئيسية للبرنامج كما هو موضح في الصورة

نافذة serial monitor



بعد فتح شاشة السيريال سوف تظهر لك نافذة بالشكل التالي، في الاعلى يوجد حقل
إدخال للبيانات التي تريد ارسالها من الحاسوب الى الأردوينو وبعد كتابة
البيانات يمكنك إرسالها من خلال الزر الموجود في اليمين، في الاسفل هناك حقل
خيارات لاختيار معدل نقل البيانات والذي يجب أن يتوافق مع الذي موجود في الكود
البرمجي، والصورة سوف توضح النافذة التي سوف تظهر.د لك.

serial monitor


نافذة Serial Plotter



هي عبارة عن ميزة رائعة جداً موجودة في بيئة الأردوينو المتكاملة، تقوم برسم
البيانات المستقبلة في الحاسوب الى إشارات يتم رسمها بشكل موجات، وتفيد جدا في
عرض البيانات وتصحيح الأخطاء، يمكنك الوصول الى نافذة Serial Plotter من خلال
tools ومن ثم Serial Plotter كما هو موضح في الصورة التالية:

نافذة Serial Plotter


تطبيقات عملية


عداد من 0 إلى 100



  1. العناصر المستخدمة



  • لوحة أردوينو أونو



  1. الكود البرمجي


class="language-cpp"
>int counter = 0;

void setup() {
Serial.begin(9600);
}

void loop() {
Serial.print("The counter is: ");
Serial.println(counter);
if(counter < 100){
counter++;
}
else{
counter = 0;
}
delay(1000);
}


counter output

3. شرح الكود البرمجي


في البداية قمنا بتعريف متغير من نوع int سوف يتم تخزين قيمة العداد فيه


class="language-cpp"
>int counter = 0;


في التابع الرئيسي ()void setup قمنا بتهيئة الاتصال التسلسلي بمعدل نقل
للبيانات 9600


class="language-cpp"
>void setup() {
Serial.begin(9600);
}


في التابع التكراري سوف نقوم بطباعة جملة " :The counter is" ومن ثم سوف نقوم
بطباعة قيمة العداد counter والنزول الى سطر جديد


class="language-cpp"
>Serial.print("The counter is: ");
Serial.println(counter);


بعدها سوف نسخدم الشرط if لفحص قيمة العداد في حال كانت أصغر من 100 سوف نقوم
بزيادة العداد بمقدار واحد وفي حال لم يتحقق الشرط سوف نقوم بتصفير قيمة العداد


class="language-cpp"
>if(counter < 100){
counter++;
}
else{
counter = 0;
}

وفي النهاية قمنا بإضافة تأخير زمني بمقدار 1 ثانية


class="language-cpp"
>delay(1000);



  1. محاكاة المشروع

    اضغط هنا


التحكم بالليد من خلال الحاسوب



  1. العناصر المستخدمة



  • لوحة أردوينو أونو



  1. الكود البرمجي


class="language-cpp"
>char Data;

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

void loop() {
if(Serial.available() > 0){
Data = Serial.read();
if(Data == '1'){
digitalWrite(13, HIGH);
Serial.println("The LED is on");
}
else if(Data == '0'){
digitalWrite(13, LOW);
Serial.println("The LED is off");
}
}
}


led on

led off

3. شرح الكود البرمجي

تعريف متغير من نوع char لتخزين القيمة التي سوف يتم استقبالها من الحاسوب


class="language-cpp"
>char Data;


في التابع الرئيسي ()void setup قمنا بتهيئة الاتصال التسلسلي بمعدل نقل
للبيانات 9600 وضبط القطب رقم 13 على أنه قطب خرج


class="language-cpp"
>void setup() {
Serial.begin(9600);
pinMode(13, OUTPUT);
}


في التابع التكراري بالبداية قمنا باستخدام الشرط if لفحص هل هناك بيانات مرسلة
من الحاسوب أو لا وفي حال كان الشرط محقق سوف نقوم بقراءة هذه البيانات
وتخزينها في متغير Data الذي قمنا بتعريفه سابقا وبعدها سوف نقوم بفحص قيمة هذا
المتغير في حال كانت 1 سوف نقوم بتشغيل الليد على القطب 13 وطباعة “The LED is
on” على شاشة السيريال واذا كانت قيمة المتغير 0 سوف نقوم بإطفاء الليد الموصول
على القطب 13 وسوف نقوم بطباعة “The LED is off”


class="language-cpp"
>void loop() {
if(Serial.available() > 0){
Data = Serial.read();
if(Data == '1'){
digitalWrite(13, HIGH);
Serial.println("The LED is on");
}
else if(Data == '0'){
digitalWrite(13, LOW);
Serial.println("The LED is off");
}
}
}



  1. محاكاة المشروع

    اضغط هنا


رسم موجة جيبية sin wave



  1. العناصر المستخدمة



  • لوحة أردوينو أونو



  1. الكود البرمجي


class="language-cpp"
>void setup() {
Serial.begin(9600);
}

void loop() {
for (float j = 0; j < 360.00; j++) {
Serial.println(sin(j * (PI / 180.00))); //plot sinewave
}
}


src="https://i.suar.me/NYJGZ/m"
alt="enter image description here"
/>

3. شرح الكود البرمجي

في التابع الرئيسي ()void setup قمنا بتهيئة الاتصال التسلسلي بمعدل نقل
للبيانات 9600


class="language-cpp"
>void setup() {
Serial.begin(9600);
}


في التابع التكراري قمنا بعمل حلقة for من 0 الى 360 وتمثل الدور الكامل
للإشارة الجيبية وفي داخل هذه الحلقة قمنا بطباعة التابع sin مع تحويل الزاوية
من الدرجات الى الراديان


class="language-cpp"
>void loop() {
for (float j = 0; j < 360.00; j++) {
Serial.println(sin(j * (PI / 180.00))); //plot sinewave
}
}



  1. محاكاة المشروع

    اضغط هنا



المقال التالي المقال السابق
لا تعليقات
إضافة تعليق
رابط التعليق