سنتعرَّفُ في هذا المقال كيفيَّة التواصل اللاسلكي بين لوحتي  اردوينو باستخدام نموذج nRF24L01 للإرسال والاستقبال، يعتبر هذا النموذج الأكثر استخداماً عند الحاجة إلى التواصل اللاسلكي بين لوحات الاردوينو. يحتوي المقال على خطواتٍ مكتوبة وفيديو توضيحي، يمكنك اختيار ما شئت منها لفهم مداخل النموذج ،مبدأ العمل ،الرَّبط، وبعض نماذج الاكواد.

نظرةٌ عامةٌ

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

الشكل 1 (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

نموذج NRF24L01 للإرسال والاستقبال

يعمل نموذج NRF24L01 ضمن نطاق حزمة ترددات الـ 2.4 غيغا هرتز، حيث يعمل على نقل معلومات بسرعة تصل إلى 2 ميغا بت لكل ثانية، يمكن استعماله للتوصيل في الفراغ بمعدلات نقل أقل ويبلغ نطاق تغطيته حوالي 100 متر.

الشكل 2 (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

قائمة بمواصفات الجهاز كاملة:

نطاق التردد2.4-2.5 غيغا هرتز
معدل نقل البيانات250 كيلو بايت/ثانية – 1 ميغا بت/ثانية – 2 ميغا بت/ثانية
طاقة الخرج العظمى0dBm
جهد التشغيل1.9 – 3.6 فولت
تيار التشغيل الاعظم12.3 ملي امبير
تيار الاستعداد22 مايكرو امبير
المدخلات المنطقية5 فولت
نطاق التغطية100 متر (للمساحات المفتوحة)

مبدأ العمل

يستخدم النموذج 125 قناة مختلفة مما يجعله قابلاً لاستضافة شبكة تمتلك 125 جهاز مودم في مكان واحد يعمل كل منهم بشكلٍ مستقل، ويمكن لكل قناة الحصول على 6 عناوين، أي كل وحدة يمكنها التواصل بـ 6 وحدات مختلفة في الوقت ذاته.

الشكل 3 (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

يستهلك النموذج مقداراً من الطاقة يبلغ 12 ملي أمبير خلال عملية النقل، مما يمثل مستوىً منخفضاً من الطاقة إذ أنه أقل من استهلاك مصباح دايود واحد، ويتراوح جهد التشغيل بين 1.9 و3.6 فولت، ولكن يمكن للمدخلات الأخرى التعامل مع جهد يصل الى 5 فولت مما يسّهل ربط لوحة الاردوينو بدون استعمال أيّة محوّلات منطقية.

الشكل 4  (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

ثلاث من مداخل NRF24L01 مخصصة للاتصال المتسلسل المتزامن ويجب ربطها بمثيلاتها في لوحة الاردوينو، مع الانتباه للاختلاف في المداخل بحسب اللوحة المستخدمة. تربط مدخلات CSN وCE بأيّ مدخل في لوحة الاردوينو حيث تستعمل لوضع الجهاز في حالة العمل او الاستعداد، وايضاً للتحويل بين وضع الإرسال أو تنفيذ الأوامر.

إصدارات النموذج

توجد عدة إصدارات من نماذج NRF24L01، والأكثر شهرة فيها ذو الهوائي المدمج في اللوحة والذي يساعد في تقليل حجم النموذج، لكنه يحدّ من نطاق التغطية الى 100 متراً فقط.

الشكل 5  (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

يمتلك الإصدار الثاني موصل SMA بدلاً عن الهوائي المدمج، والذي يمكن توصيله بهوائي آخر لتحسين نطاق البث.

يحتوي الإصدار الثالث على رقاقة RFX2401C، والتي تتضمن مضخماً للقدرة وخافضاً للضجيج الإضافي، مما يتسبب في تقوية الإشارة المرسلة وتحسين نطاق البث ليصل الى 1000 متر في المساحات المفتوحة.

مخطط مدخلات nRF24L01 :

تحتوي الصورة القادمة على تفاصيل مداخل النموذج بإصداريّ NRF24L01 وNRF24L01+ PA/LNA، حيث يحتوي كلاهما على نفس المداخل مما يجعل ربطهما بالدائرة متماثلاً.

الشكل 6  (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

كيفية ربط نموذج nRF24L01 بالاردوينو

هذا ما نحتاج معرفته لربط النموذج بألواح الاردوينو

الشكل 7  (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

يجدر بالذكر ايضاً تباين مداخل SPI لكل إصدار مختلف من لوحة الاردوينو، لذلك يجب معرفتها قبل الربط

نوع لوحة الاردوينوSCK مدخلMISO مدخلMOSI مدخلSS مدخل
اونو13121110
نانو13121110
ميغا52505153

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

يمكننا كتابة الكود البرمجي بعد ربط الدائرة كاملة، حيث سيُكتب أحدهما للإرسال والأخر للاستقبال.

أولاً، يجب تنزيل مكتبة RF24 لتسهيل العمل البرمجي، والتي يمكن تنزيلها مباشرة من قائمة مكاتب الاردوينو عند البحث عن اسمها بشكل مباشر، مع ضمان تنزيل نسخة ” TMRh20, Avamander”. تحتوي الفقرة اللاحقة على الأكواد والوصف الخاص بهم لتنفيذ عملية النقل اللاسلكي.

كود الإرسال:

لتحميل الكود البرمجي الخاص بالإرسال انقر هنا.

كود الاستقبال:

لتحميل الكود البرمجي الخاص بالاستقبال انقر هنا.

وصف الكود

بدايةً يجب تضمين مدخلات الاردوينو بالإضافة إلى مكتبة RF24 وإنشاء كائن خاص بها، قائمة المتغيرات ستتكون من مداخل CSN وCE.

RF24 radio(7, 8); // CE, CSN

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

const byte address[6] = "00001";

يمكن تغيير العنوان لأية سلسلة من 5 حروف وهذا ما يوفر قابلية التواصل مع جهاز الاستقبال المطلوب، في هذا المثال يجب استخدام العنوان نفسه عند المُرسل والمُستقبل.

لتهيئة البرنامج سنعرّف متغيراً لكائن البث، ونثبت عنوان جهاز الاستقبال باستخدام دالة ()radio.openWritingPipe التي تمكننا من إرسال البيانات. العنوان يمثل سلسلة الحروف الخمسة آنفة الذِّكر.

radio.openWritingPipe(address);

عند محطة الاستقبال، وباستخدام دالة ()radio.setReadingPipe سوف نتمكن من إعطاء العنوان ذاته للمُستقبل بهدف تمكين التواصل بين الجهازين.

radio.openReadingPipe(0, address);

تختص دالة ()radio.setPALevel بتعيين قيمة مضخم القدرة، في هذا المثال سوف تكون أقل ما يمكن لقصر المسافة بين الجهازين. يجب الانتباه إلى قيم مضخم القدرة لكون المستويات العالية منها تستوجب استخدام مكثفة لتصفية الإشارة عند مدخل التأريض والمدخل المقابل له، لضمان استقرار الجهد الكهربائي عند التشغيل.

radio.setPALevel(RF24_PA_MIN);

تعمل دالة ()radio.stopListening على تهيئة محطة الإرسال، وتعاكسها دالة ()radio.startListening والتي تعمل على تهيئة محطة الاستلام.

// at the Transmitter
radio.stopListening(); // at the Receiver
radio.startListening();

تُنشَأ مصفوفة من الأحرف عند الجهاز المُرسل لخزن أحرف كلمة “hello world” باستخدام دالة ()radio.write، والتي تُرسل فيما بعد نحول الجهاز المُستقبِل. يمثل السطر الأول في داخل الحلقة المتغير المُراد ارساله.

تشير علامة & قبل اسم المتغير إلى خزن قيمة البيانات داخله، أما المتغير بعده،  فإنه يمثل عدد الوحدات الخزنية المأخوذة منه، وفي هذه الحالة فإن حجم المتغير “text” محجوز بالكامل نظراً لإستخدام دالة ()sizeof، وفي نهاية البرنامج يُضاف مقدار تخير بمعدل ثانية واحدة.

void loop() {
 const char text[] = "Hello World";
 radio.write(&text, sizeof(text));
 delay(1000);
}

يمكن إرسال 32 بايت من البيانات بحد أقصى عند استخدام دالة radio.write().

عند محطة الاستقبال، نستخدم دالة radio.available() داخل الحلقة للتحقق من وجود بيانات مستلمة. في حال العثور عليها، تنشأ مصفوفة بحجم 32 عنصراً باسم “text” لخزن البيانات القادمة داخلها.

void loop() {
 if (radio.available()) {
 char text[32] = "";
 radio.read(&text, sizeof(text));
 Serial.println(text);
 }
}

يمكن قراءة وخزن البيانات داخل متغير “text” باستخدام دالة ()radion.read. وفي نهاية المطاف، تُعرض الرسالة المستلمة على الشاشة بعد رفع جميع الاكواد، مع ملاحظة تكرار عرض رسالة “Hello World” كل ثانية.

تحديد وإصلاح المشاكل

يجدر بالذكر إن تشويش مزود القدرة هو أحد أكثر المشاكل الشائعة عند استخدام نماذج NRF24L01 للتواصل. تتحسس دوائر الترددات الراديوية للتشويش الصادر من مزودات القدرة عموماً، لذلك يستحسن استخدام متسعة تصفية عند مجهز القدرة، والتي يمكن أن تتراوح بين 10-100 مايكرو فاراد.

الشكل 8 (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

يصعب أيضًا على مدخل 3.3V عند لوحة الاردوينو تجهيز طاقة كافية لتشغيل نموذج NRF24L01. لهذا، ينصح باستخدام مصدر طاقة خارجي لحل هذه المشكلة.

نظام الاتصال اللاسلكي بإتجاهين باستخدام نموذجي NRF24L01 واردوينو

نلقي النظر على مثال آخر يعتمد على مبدأ التواصل باتجاهين بين لوحتي اردوينو، وفيما يلي مخطط الدائرة:

الشكل 9 (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

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

ترفق الأكواد أدناه مع الوصف الخاص بها

كود الإرسال

لتحميل الكود البرمجي الخاص بالإرسال انقر هنا.

كود الاستقبال

لتحميل الكود البرمجي الخاص بالاستقبال انقر هنا.

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

const byte addresses[][6] = {"00001", "00002"};

تستخدم دالة ()radio.stopListening داخل الحلقة لتهيئة الأردوينو الأول كمرسل، وتحديد قيم عصا التحكم من 0 الى 180، ثم إرسال البيانات نحو المُستلم باستخدام دالة radio.write().

// at the Transmitter
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002

// at the Receiver
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001

في الجهة المقابلة، تستعمل دالة ()radio.startListening لتهيئة الاردوينو الثاني لدوره في الاستلام مع التحقق من وجود بيانات مُستلمة، وفي حال وجودها، تُخزن بعد قراءتها داخل متغير “angleV” وتستعمل لتحريك المحرك الدوّار.

radio.startListening();
 if ( radio.available()) {
 while (radio.available()) {
 int angleV = 0;
 radio.read(&angleV, sizeof(angleV));
 myServo.write(angleV);
 }

عند طرف الإرسال، تُترك حلقة while فارغة عند الأردوينو الأول لانتظار البيانات المرسلة من الأردوينو الثاني، وتمثل حالة الزر فيمَ إن كان مُفعلّاً أم لا، في حال التشغيل سوف يضيء المصباح وبالعكس. تتكرر هذه الإجراءات لتعمل كلتا اللوحتين في حالتي الإرسال والاستقبال.

إرسال عدة متغيرات في حزمة واحدة

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

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

يجب الأخذ بعين الاعتبار أن أقصى حجم للبيانات لا يتعدى 32 بايت. يتضمن الكود ثلاثة أنواع من المتغيرات؛ رقمي بحجم 4 بايت، وعشري بحجم 4 بايت، وسلسلة من الحروف بحجم 4 بايت، ويبلغ مجموعها 15 بايت.

كود الاستقبال

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

عند جهة الاستلام، يجب تعريف المتغيرات نفسها لتمكين المُستقبل من استلام البيانات القادمة. طبعت المتغيرات على شاشة للتحقق من عمل النظام بشكل صحيح.

الشكل 10 (مصدر الصورة: موقع HowToMechatronics)
(مصدر الصورة: موقع HowToMechatronics)

الاستنتاج

 يعتبر نموذج NRF24L01 خياراً مثالياً عند الحاجة للتواصل اللاسلكي في مشاريع الاردوينو.


المصدر:هنا.

ترجمة: زينب جواد، مراجعة ، وتصميم: علي العلي، تدقيق لغوي: بولا ابراهيم ، تحرير: نور شريفه.