الاثنين، 27 يناير، 2014

المرسل-المستقبل اللاسلكي NRF24L01

المرسل-المستقبل  اللاسلكي  NRF24L01








في المشاريع الألكترونية المتنوعة , نحتاج احياناً لربط القطع لاسلكياً معاَ سواءاً لارسال البيانات او استقبالها او ارسال اشارات للتحكم في تشغيل او اغلاق القطع  اللتي بالمشروع ! 



تتعد هذه الوسائل ما بين السرعة و المدى و معدل صرف الطاقة .
من هذه الطرق :

1) Wifi .



2) Xbee .




3) RF Radio Frequency .



4)bluetooth .





الطريقة التي سنتحدث عنها هي القطعة nrf24L01 و هي قطعة ارسال لاسلكي تعمل كمرسل و كمستقبل معاً ! لها العديد من المزايا مثل 




1)العمل على التردد  2.4GHz 
2)سرعات متعددة لارسال البيانات "250kHz,1MB,2MB "
3)استهلاك قليل للطاقة 13.5mA-3.3V
4)وجود وضعية توفير الطاقة  900nA 

5)استخدام البروتوكول SPI في البرمجة 
6)امكانية الأستقبال لأكثر من اشارة من أكثر من مرسل في نفس الوقت Multiceiver  .

في النشرة الفنية لهذه القطعة كل المعلومات اللازمة للبرمجة بالأضافة لتصميم أمثل لهذه القطعة على لوحات الطباعة PCB

بشكل عام ربط هذه القطعة مع الأردوينو سهل و لكي تبدأ في برمجتها عليك أن تتعرف في البداية على البروتوكول SPI و هو بروتوكول اتصال سريع بين المتحكمات الأصغرية MCU و القطع الألكترونية الأخرى و يسمح بالأتصال و نقل البيانات بسرعة عالية جداً .

للتعرف أكثر على هذا البروتوكول يمكنك قراءة الرابط هنا .

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


1) بطاقة أردوينو اونو عدد 2 .
2)القطعة NRF24L01 عدد 2 .
3) اسلاك توصيل Female-male عدد 20 .

4) breadBoard عدد 1 .
5)مقاومة متغيرة  Potentiometer  50Kohm .
6) اسلاك توصيل Male-Male .

ما سنقوم بعمله هو قراءة قيمة المقاومة المتغيرة و ارسال هذه القيمة للطرف الأخر و عرض القيمة على شاشة السيريال .

التوصيل :
يفضل  استخدامك لاردوينو من الأصدار R3  لان القطعة nrf24L01 تعمل على فولتية تبلغ 3.3V و الأردوينو في مختلف اصداراتها تعمل على 5 فولت ! فالحل يكون بتوصيل مدخل IOREF ب 3.3V و هكذا يصبح مستوى الدخل-الخرج المنطقي للاردوينو 3.3V بدلاً عن 5V .


التوصيل سيعتمد على الأصدار الأحدث Arduino UNO R3.

دارة الأرسال :




دارة الأستقبال :


البرنامج  :

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



كتبت مكتبة خاصة لهذه القطعة تصلح لكل بطاقات الأردوينو UNO, MEGA,Leonardo ,DUE و سأقوم بنشرها بعد أن اتحقق من عمل كل الأوامر بشكل صحيح .

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

لمعرفة كيفية تثبيت المكتبات الجديدة في الأردوينو 

كود الأرسال:



#include <ELECHOUSE_NRF24L01.h>

const int TX_ADR_WIDTH =  5;   // TX address width 
const int TX_PLOAD_WIDTH =1;   // TX payload width 1byte
byte TX_ADDRESS[TX_ADR_WIDTH] = {0x00,0x10,0x10,0x10,0x10};  // TX address
byte TX_buffer[TX_PLOAD_WIDTH]={0};     // data buffer to transmit


void setup()
{
  Serial.begin(9600);
  ELECHOUSE_nRF24L01.Init();      //initialization
  ELECHOUSE_nRF24L01.RegConfigSettings();  //RF,address width,enable AA
}

void Send_nrf24L01(byte pot){
  int CheckTransmissionState=0;
  TX_buffer[0]=pot;
  Serial.print(" send Data state ... ");
  while(!CheckTransmissionState){
  ELECHOUSE_nRF24L01.TX_Setting(TX_ADDRESS,TX_ADR_WIDTH,TX_buffer,TX_PLOAD_WIDTH);//TX setting
  ELECHOUSE_nRF24L01.TX_ModeStart();  //start TX  
  CheckTransmissionState=ELECHOUSE_nRF24L01.CheckSendFlag();  //TX flag
  }
  Serial.println("Complete...");
}


void loop() {
  // put your main code here, to run repeatedly: 
int pot_value=analogRead(A0);
delay(100);
int value=map(pot_value,0,1023,0,255);
byte value_send=constrain(value,0,255);
Send_nrf24L01(value);
delay(700);
}
كود الأستقبال:
#include <ELECHOUSE_NRF24L01.h>

const int RX_ADR_WIDTH= 5;  // RX address width 
const int RX_PLOAD_WIDTH=1 ; // RX payload width

byte RX_ADDRESS_P0[RX_ADR_WIDTH] = {0x00,0x10,0x10,0x10,0x10}; //pipe 0 address
byte RX_buffer[RX_PLOAD_WIDTH]={0};        //RX buffer
void setup()
{
  Serial.begin(9600);
  ELECHOUSE_nRF24L01.Init();        //initialization
  ELECHOUSE_nRF24L01.RegConfigSettings();  //RF,address width,enable AA
  ELECHOUSE_nRF24L01.RX_Setting(0,RX_ADDRESS_P0,RX_ADR_WIDTH,RX_PLOAD_WIDTH); // pipe 0 address
  ELECHOUSE_nRF24L01.RX_ModeStart(); //start receive
}

void loop(){
 int check_reciever_status=ELECHOUSE_nRF24L01.CheckReceiveFlag(); //check status
  while(check_reciever_status){
 check_reciever_status=ELECHOUSE_nRF24L01.CheckReceiveFlag(); //check status
  
int receivedByte=RX_buffer[0];
receivedByte=receivedByte*4;
Serial.print("Potentiometer value : ");
Serial.println(receivedByte);
check_reciever_status=0;
  }
  
}

بشكل عام هذا كل شيء عن هذه القطعة , مميزاتها كبيرة و تعطي امكانيات كبيرة لمشروعك من حيث سرعة الأرسال و الأستقبال و ايضاً طول البيانات المرسلة و سهولة التعامل معها .

33 التعليقات :

  1. السلام عليكم و رحمة الله و بركاته
    أشكرك جزيل الشكر على ما تقدمه في مدونتك الأكثر من رائعة و جزاك الله كل خير
    لي سؤال بسيط كم يبلغ مدى الإرسال لهذه القطعة (المسافة)؟
    وشكرا لك مجددا

    ردحذف
    الردود
    1. يبدأ المدى من 60م و اذا تم استخدام انتين خارجي يصل المدى لحدود 1.5 كم

      حذف
  2. شكرا على الرد مداه جيد لكثير من التطبيقات

    ردحذف
  3. ما شاء الله أكثر من رائع
    لي سؤال هل يمكن إستخدامها مع تكنولوجيا Wifi?

    ولي سؤال أخر خارج الموضوع هو كيف يمكنني التعرف علي كل الدوال اللي في المكتبه يعني إزاي أعرف كل وظائفها؟
    وبارك الله في علمك وعمرك ونفعك بهما

    ردحذف
    الردود
    1. شكراً

      تستخدم تردد 2.4GHz مدى التردد نفسه لل WiFi

      بروتوكوله مختلف عن الوايفاي لذلك لا يمكن ربطه مباشرة مع الأجهزة التي تدعم الوايفاي

      من خلال النشرة الفنية , و للمكتبة من خلال قراءة ملفات المكتبة Header.h, source.cpp

      حذف
    2. شكرا جدا علي ردك وبارك الله في علمك

      حذف
  4. السلام عليكم اذا اريد اربط زكبي عن طريق شيلد يركب على الاردينو من نوع اونو وزكبي اخر يربط بادابتر usb وتربط بالحاسبة
    هل احتاج الى تغيير في الكود البرمجي بسبب استخدام الزكبي ام لا مجرد اوحد معد سرعة نقل البيانات و استخدم عبارة print لارسال البيانات الى الحاسبة

    ردحذف
    الردود
    1. يوجد بعض الأعدادات الأخرى مثل العنوان لكل xbee

      حذف
  5. نعم اخي لفد قرأت حول الموضوع وكيفية توحيد العنوان
    واحاول تعلمه الان واذا واجهتني صعوبة سوف اسألك بارك الله بك
    لكن سؤالي انا شاهدت فديو باليوتيوب حول كتابة برنامج الاردينو بواسطة بيئة الباسكوم avr لان المتحكم المستخدم في الاردينو من عائلة avr لاني عندي خبرة برمجية بلغة البيسك بواسطة بيئة الباسكوم
    فسؤالي هو هل يمكن ذلك ان اكتب برنامج بالباسكوم ثم ارفعه للاردينو
    اذا حظرتك مجرب هالطريقة ارجوا الاجابة واذا لا شكرا وماقصرت

    ردحذف
    الردود
    1. انصحك بالنتقال ل Atmel Studio هو البرنامج الرسمي للشركة و فيه كل ما هو جديد .

      و ايضاً يمكنك كتابة الكودات و رفعها للاردوينو عن طريقه "افضل من الباسكوم "

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

      حذف
    2. السلام عليكم ورحمة الله وبركاته
      اخي العزيز لدي استفسار اذا كانت لديك معلومة تنفعني
      انا استخدمت AT89C51 كمتحكم في مشروعي وقمت بارسال واستلام المعلومات من الحاسوب بواسطة uart & rs 232
      لكن يجب ان انقل البيانات وايرليس لذلك قرأت عن الزكبي
      واخترت المواد اذا كانت لديك فكرة هل اختياري صحيح لكي اطلب هذه المواد من الانترنت وشكرا جزيلا
      المواد

      1-Breakout Boards

      عدد القطع = 1

      السعر في موقع SparkFun=

      $2.95

      https://www.sparkfun.com/products/8276

      >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      2- XBee 2mW Wire Antenna - Series 2 (ZigBee Mesh)

      عدد القطع=2

      السعر في موقع SparkFun=
      $20.95

      https://www.sparkfun.com/products/10414

      >>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
      3- XBee Explorer Dongle

      عدد القطع=1

      السعر في موقع SparkFun=

      $24.95


      https://www.sparkfun.com/products/9819

      حذف
    3. التعامل مع series2 ليس سهلاً ,ايضاً العمل على 8051 ليس بهذه السهولة بدون وجود لغة برمجة مناسبة

      حذف
    4. طريقة الربط تعلمتها بواسطة كتاب انكليزي وعدد من الفديوات على يوتيوب

      يمكن ان تلخص بالتالي
      1- نحدد PAN Addresses اي رقم من 0 الى ffff يجب ان يكون نفس الرقم في المرسل والمستقبل
      2- نكتب ارقام ATDH/ATDL ....... ATDH مذكور في خلف الزكبي نفس الرقم في جميع الاجهزة ........ اما ATDL فهو الرقم الذي يكون بالاسفل كل جهاز يكتب به رقم الجهاز الاخر وهذا الرقم لايتكرر.
      3- في coordinator نضع علامة مقابل API
      4- اما في الجهاز الاخر فلانضع اي علامة امام API
      5- نوحد البود ريت وعدد البتات والستوب بت في كلا الجهازين

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

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

    ردحذف
    الردود
    1. 120 قناة , و هذا لا علاقة له بعدد المواتير التي يمكنك التحكم بها , هذا يعتمد على نوع المحرك و دوائر قيادة المحرك المستخدم

      حذف
  7. المحركات 5 DC و3 سرفو استخدمت مع ال dc l293 فهل هيكون ال120قناة متاحين اني ابرمج منهم 12 قناة منفصلين كل قناة على زرار ولا مينفعش
    ؟؟؟؟

    ردحذف
    الردود
    1. معنى قناة , انه يمكن ان يستقبل من 120 مرسل مختلف او يرسل ل 120 مستقبل مختلف , يعني بنفس القناة ترسل لها بيانات و تعالجها الأردوينو و تتحكم في ما تشاء

      حذف
  8. اخي العزيز لقد اشتريت xbee s1 عدد 2 وقمت بعمل الاعدادات وتمكنت من الاتصال فيمابينهما وقداشتريت explorer xbee usb من شركة sparkfun لكني اريد انقل بيانات من متحكم AT89C51 بواسطة الزكبي AT89C51 يحوي UART وكذلك الXBEE
    لكني حين ربطت TX مع RX والعكس بالعكس لم اتلقى اي شيء من طرف المايكروكنترولر
    هل هنالك اعدادت معينة يجب ان اعرفها في البرنامج لاني لاحظت اكثر من فديو عن الاردينو لم يستخدموا اي اعدادات مجرد كتابة البرنامج "مثلا طباعة عبارة معينة " وربط TX للمتحكم مع RX لل XBEE ؟؟؟؟؟؟ علما اني قد قمت بنقل البيانات عن طريق RS232 بشكل طبيعي للحاسب من دون اي اعدادات مجرد كتابة برنامج يقوم بطباعة عبارة معينة باستخدام لغة البيسك بواسطة الباسكوم

    ردحذف
  9. أزال المؤلف هذا التعليق.

    ردحذف
  10. من فضلك بشمهندس الكود اللي حضرتك رفعه مش بيشتغل معاي دايما يعطينيي error ومش عارف اوصل للخطأ ممكن حضرتك لو في كود اخر شغال ومجرب ترفعه

    ردحذف
    الردود
    1. حمل المكتبه الخاصه ب NRF وضعها في مسار المكتبات بشكل صحيح في مسار مكتبات اردوينو

      حذف
  11. لو سمحت كيف ممكن أتأكد أن NRF24L01 تعمل بشكل صحيح ويصلها التغذية كما يجب أم أنها معطلة ؟
    هل عليها LED يجب أن يضيء ؟

    ردحذف
  12. اخي العزيز مكتبتك لاتعمل بشكل صحيح



    Arduino: 1.5.6-r2 (Windows 8), Board: "Arduino
    \NRF24L01_Library/ELECHOUSE_NRF24L01.h:85: error: 'byte' does not name a type
    NRF24L01_TX.pde: In function 'void loop()':
    NRF24L01_TX:27: error: no matching function for call to 'ELECHOUSE_NRF24L01::TX_Setting(byte [5], int, byte [32], int)'
    arduino-1.5.6-r2\libraries\NRF24L01_Library/ELECHOUSE_NRF24L01.h:81: note: candidates are: void ELECHOUSE_NRF24L01::TX_Setting(int*, int, int*, int)
    NRF24L01_TX:29: error: 'class ELECHOUSE_NRF24L01' has no member named 'CheckSendFlag'

    ردحذف
  13. هل يمكنك شرح عمل القطعه
    اعني كيف اعمل اتصال وكيف اعطي المستقبل العنوان وماهو طوله وماهو طول buffer الاقصى .
    وكيف استقبل البيانات المرسله من المستقبل وكيف يمكن استقبال اكثر من اشاره في نفس الوقت .
    انت لم تشرح القطعه بشكل كافي .
    وانا اتمنه ان تسرحهها بلتفصيل الكافي .
    مع تحياتي ..انا معحب بمدونتك...............

    ردحذف
  14. السلام عليكم ورحمة الله وبركاته أخي مهند لدي ملاحظة صغيرة : منذ ايام هممت ببناء مشروع يعتمد على هذه الشريحة و عندما اطلعت على النشرة الفنية لهذه الشريحة لحظت ان مداخل SPI للشريحة يمكنه العمل بجهد 5 فولت و بالتالي يمكن ان تعمل على اي اردوينو بشرط تأمين تغذية خارجية للشريحة 3.3 فولت .

    ردحذف
  15. عمل جميل , بارك الله فيكم

    ردحذف
  16. اريد شرح لعمل الكاميرا ارسال من الروبوت الى الحاسوب

    ردحذف
  17. من فضلك ما مدى التحكم بها عن بعد هل يصل الى 300 متر .....وسعرها من فضلك

    ردحذف
  18. لو سمحتو الي عندة فكرة عن طريقة ربط قطعة الواي فاي esp8266وكيفة اضافة مكتبات لهاء وربطهاء بقطعة الاردونيو

    ردحذف
  19. لو سمحت ممكن اعرف طريقه عمل مشروع تشويش اشاره اتصال gsm عن طريق اردينيو

    ردحذف
  20. لو سمحت ممكن اعرف طريقه عمل مشروع تشويش اشاره اتصال gsm عن طريق اردينيو

    ردحذف

 
Creative Commons License
This work is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 4.0 International License.