آموزش راه اندازی ماژول فرستنده گیرنده رادیویی NRF24L01 با آردوینو

فهرست مطالب

ویژگی های ماژول فرستنده گیرنده NRF24L01

در بسیاری از مواقع نیاز است که تجهیزات الکترونیکی به صورت بی سیم به یکدیگر متصل شوند. در این مواقع از تجهیزات Radio Frequency یا به اختصار RF استفاده می‌شود. RF ها شامل تمامی امواج رادیویی هستند که با توجه به فرکانس و دامنه می‌توانند فاصله‌های مختلفی را طی کنند و به گیرنده برسند.

ماژول NRF24 امکان برقراری ارتباط دو طرفه را ایجاد کرده و همچنین با برقراری پروتکل mesh network این امکان را به ما می‌دهد تا تعداد زیادی از این ماژول‌ها را به صورت بی سیم به یکدیگر متصل کنیم. همچنین این ماژول‌ها به دلیل سرعت بالا در انتقال داده و همچنین برد بالا در بین کاربران از محبوبیت زیادی برخوردارند.

ماژول‌های NRF24L01 در مدل‌ها و شکل‌های متفاوتی تولید می‌شوند که تفاوتی در راه‌اندازی ندارند و فقط بسته به مدل ممکن است ICهای LNA و PA که تقویت‌کننده سیگنال هستند بر روی برد قرار گرفته باشد تا بتواند داده‌ها را در مسافت‌های بیشتری ارسال و دریافت کند.

نکته

اگر نیاز به مخابره داده در مسافت‌های طولانی دارید نیز می‌توانید از این ماژول استفاده کنید اما باید از آنتن‌های بسیار قوی استفاده کنید.

جهت دریافت دیتاشیت NRF24L01 به لینک زیر مراجعه شود.

جهت دریافت اطلاعات بیشتر NRF24L01 اینجا کلیک کنید.

معرفی پایه ها (Pinout) ماژول فرستنده گیرنده NRF24L01

ماژول NRF24L01 دارای 8 پایه به شرح زیر است:

  • VIN: تغذیه ماژول
  • GND: زمین
  • MOSI: خط ارسالی اطلاعات برای پروتکل SPI
  • MISO: خط دریافتی اطلاعات برای پروتکل SPI
  • SCK: همزمان سازی برای پروتکل SPI
  • IRQ: وقفه برای پروتکل SPI
  • CSN: انتخاب ماژول برای پروتکل SPI (معکوس)
  • CE: فعال سازی پروتکل SPI

لوازمی که به آن احتیاج دارید

قطعات مورد نیاز

آردوینو UNO R3 × 2
سیم جامپر نری به مادگی × 1
ماژول رگولاتور 3.3v - Ams1117 × 2

لیست انواع ماژول‌های NRF24L01 که می‌توانید از آن‌ها استفاده کنید، در زیر آورده شده است. برای حداقل ارتباط به 2 عدد از آنها نیاز دارید و نیازی نیست که هر دو از یک مدل باشند.

ماژول انتقال بیسیم اطلاعات +NRF24L01 × 2
ماژول انتقال بیسیم اطلاعات +NRF24L01 SMD × 2
ماژول NRF24L01+PA+LNA × 2
ماژول NRF24L01 + PA + LNA با برد 1100 متر × 2
ماژول NRF24L01 + PA + LNA با برد 1800 متر × 2
ماژول E01-ML01DP5 فرستنده گیرنده NRF24L01 + PA × 2

نرم افزارهای مورد نیاز

آردوینو IDE

راه اندازی ماژول فرستنده گیرنده NRF24L01 با آردوینو

گام اول: سیم بندی

اگر ماژول از نوع DIP است مطابق مدار زیر، ماژول را به آردوینو وصل کنید.

اگر ماژول از نوع SMD است مطابق مدار زیر، ماژول را به آردوینو وصل کنید.

گام دوم: نصب کتابخانه

کتابخانه زیر را بر آردوینوی خود نصب کنید.

https://github.com/maniacbug/RF24

توجه

اگر نیاز به راهنمایی بیشتر برای نصب کتابخانه بر روی آردوینو دارید، می توانید به آموزش نصب کتابخانه بر آردوینو مراجعه کنید.

گام سوم: کد

کد زیر را بر روی آردوینوی سمت گیرنده آپلود کنید.

/*
  Create on Sep 8, 2020
  Create by MohammedDamirchi base of https://github.com/nRF24/RF24
  
Home
*/ /* 1 ch NRF 24 TRANSMITTER example. Module // Arduino UNO // ESP32 GND -> GND -> GND Vcc -> 3.3V(External)-> 3.3v CE -> D9 -> D4 CSN -> D10 -> D5 CLK -> D13 -> D18 MOSI -> D11 -> D23 MISO -> D12 -> D19 */ /* First we include the libraries. Download it from my webpage if you donw have the NRF24 library */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <printf.h> /*//////////////////////////////////////////////////////*/ #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) ||defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) #define CSN 10 #define CE 9 #elif defined(ESP32) #define CSN 5 #define CE 4 #elif defined(ESP8266) #define CSN D3 #define CE D4 #else #error "Make Config you're self" #endif #define Debug_mode false /*Create a unique pipe out. The receiver has to wear the same unique code*/ const uint64_t pipeIn = 0x662266; //IMPORTANT: The same as in the receiver!!! /*//////////////////////////////////////////////////////*/ /*Create the data struct we will send The sizeof this struct should not exceed 32 bytes This gives us up to 32 8 bits channals */ RF24 radio(CE, CSN); // select CSN and CE pins /*//////////////////////////////////////////////////////*/ //Create a struct to send over NRF24 struct MyData { byte test; }; MyData data; /*//////////////////////////////////////////////////////*/ //This function will only set the value to 0 if the connection is lost... void resetData() { data.test = 0; } /**************************************************/ void setup() { pinMode(LED_BUILTIN, OUTPUT); Serial.begin(9600); //Set the speed to 9600 bauds if you want. //You should always have the same speed selected in the serial monitor resetData(); radio.begin(); if (Debug_mode) printf_begin(); radio.setDataRate(RF24_250KBPS); //speed RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps radio.openWritingPipe(pipeIn);//Open a pipe for writing radio.openReadingPipe(1, pipeIn);//Open a pipe for reading radio.openReadingPipe(2, pipeIn);//Open a pipe for reading radio.openReadingPipe(3, pipeIn);//Open a pipe for reading radio.openReadingPipe(4, pipeIn);//Open a pipe for reading radio.openReadingPipe(5, pipeIn);//Open a pipe for reading radio.setAutoAck(true); // Ensure autoACK is enabled radio.setChannel(108);// Set RF communication channel. radio.setPALevel(RF24_PA_MAX); //translate to: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm. radio.enableDynamicPayloads(); //This way you don't always have to send large packets just to send them once in a while. This enables dynamic payloads on ALL pipes. //radio.disableDynamicPayloads();//This disables dynamic payloads on ALL pipes. Since Ack Payloads requires Dynamic Payloads, Ack Payloads are also disabled. If dynamic payloads are later re-enabled and ack payloads are desired then enableAckPayload() must be called again as well. radio.setCRCLength(RF24_CRC_16); // Use 8-bit or 16bit CRC for performance. CRC cannot be disabled if auto-ack is enabled. Mode :RF24_CRC_DISABLED ,RF24_CRC_8 ,RF24_CRC_16 radio.setRetries(10, 15);//Set the number of retry attempts and delay between retry attempts when transmitting a payload. The radio is waiting for an acknowledgement (ACK) packet during the delay between retry attempts.Mode: 0-15,0-15 radio.startListening();//Start listening on the pipes opened for reading. } /******Reset the received data to 0 if connection is lost******/ unsigned long lastRecvTime = 0; void recvData() { while ( radio.available() )//Check whether there are bytes available to be read { radio.read(&data, sizeof(MyData));//Read payload data from the RX FIFO buffer(s). lastRecvTime = millis(); //here we receive the data } } /**************************************************************/ void loop() { recvData(); //Resive Data unsigned long now = millis(); //Here we check if we've lost signal, if we did we reset the values if ( now - lastRecvTime > 1000 ) { // Signal lost? resetData(); } Serial.print("Resive Value: "); Serial.println(data.test); analogWrite(LED_BUILTIN, data.test); delay(100); if (Debug_mode) radio.printDetails();//Show debug data }

کد زیر را بر روی آردوینوی سمت فرستنده آپلود کنید.

/*
  Create on Sep 8, 2020
  Create by MohammedDamirchi base of https://github.com/nRF24/RF24
  
Home
*/ /* 1 ch NRF 24 TRANSMITTER example. Module // Arduino UNO // ESP32 GND -> GND -> GND Vcc -> 3.3V(External)-> 3.3v CE -> D9 -> D4 CSN -> D10 -> D5 CLK -> D13 -> D18 MOSI -> D11 -> D23 MISO -> D12 -> D19 */ /* First we include the libraries. Download it from my webpage if you donw have the NRF24 library */ #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <printf.h> /*//////////////////////////////////////////////////////*/ #if defined(__AVR_ATmega328P__) || defined(__AVR_ATmega328PB__) ||defined(__AVR_ATmega2560__) || defined(__AVR_ATmega1280__) #define CSN 10 #define CE 9 #elif defined(ESP32) #define CSN 5 #define CE 4 #elif defined(ESP8266) #define CSN D3 #define CE D4 #else #error "Make Config you're self" #endif #define Debug_mode false /*Create a unique pipe out. The receiver has to wear the same unique code*/ const uint64_t pipeOut = 0x662266; //IMPORTANT: The same as in the receiver!!! /*//////////////////////////////////////////////////////*/ /*Create the data struct we will send The sizeof this struct should not exceed 32 bytes This gives us up to 32 8 bits channals */ RF24 radio(CE, CSN); // select CSN and CE pins /*//////////////////////////////////////////////////////*/ //Create a struct to send over NRF24 struct MyData { byte test; }; MyData data; byte count = 0; /*//////////////////////////////////////////////////////*/ //This function will only set the value to 0 if the connection is lost... void resetData() { data.test = 0; } void setup() { Serial.begin(9600); if (Debug_mode) printf_begin(); radio.begin(); radio.setDataRate(RF24_250KBPS); //speed RF24_250KBPS for 250kbs, RF24_1MBPS for 1Mbps, or RF24_2MBPS for 2Mbps radio.openWritingPipe(pipeOut); //Open a pipe for writing radio.openReadingPipe(0, pipeOut); //Open a pipe for reading radio.setChannel(108);// Set RF communication channel. radio.setPALevel(RF24_PA_MAX); //translate to: RF24_PA_MIN=-18dBm, RF24_PA_LOW=-12dBm, RF24_PA_MED=-6dBM, and RF24_PA_HIGH=0dBm. radio.enableDynamicPayloads(); //This way you don't always have to send large packets just to send them once in a while. This enables dynamic payloads on ALL pipes. //radio.disableDynamicPayloads();//This disables dynamic payloads on ALL pipes. Since Ack Payloads requires Dynamic Payloads, Ack Payloads are also disabled. If dynamic payloads are later re-enabled and ack payloads are desired then enableAckPayload() must be called again as well. radio.setCRCLength(RF24_CRC_16); // Use 8-bit or 16bit CRC for performance. CRC cannot be disabled if auto-ack is enabled. Mode :RF24_CRC_DISABLED ,RF24_CRC_8 ,RF24_CRC_16 radio.setRetries(10, 15);//Set the number of retry attempts and delay between retry attempts when transmitting a payload. The radio is waiting for an acknowledgement (ACK) packet during the delay between retry attempts.Mode: 0-15,0-15 radio.setAutoAck(true); // Ensure autoACK is enabled radio.stopListening();//Stop listening for incoming messages, and switch to transmit mode. resetData(); } /**************************************************/ void loop() { count++; data.test = count;//fill data to MyData Serial.print("Send"); Serial.println(count); if (count == 254) { count = 0; } NRF24_Transmit();//Transmit MyData delay(200); } void NRF24_Transmit() { radio.writeFast(&data, sizeof(MyData));//Transmit Data. use one of this two: write() or writeFast() if (Debug_mode) radio.printDetails();//Show debug data bool OK = radio.txStandBy();//Returns 0 if failed. 1 if success. delayMicroseconds(50); radio.flush_tx();//Empty all 3 of the TX (transmit) FIFO buffers }

این کد جهت تست ارتباط مابین آردوینوها می‌باشد.

در سریال مانیتور اطلاعات ارسالی را مشاهده می‌کنید.

آموزش های مشابه

Comments (14)

  • مجید افتخاری Reply

    برای راه اندازی طبق آموزش خودتون پیش رفتم که خطای printf.h: No such file or directory میده
    آموزش های دیگه هم بررسی کردم خطا نمیده اما برنامه عملکردی نداره
    از آردوینو مگا 2560 و آردوینو یونو استفاده کردم ( ترتیب اتصال پین‌های CE و CSN و MOSI و MISO و SCK رو با توجه به آردوینو های استفاده شده رعایت کردم ) VCC رو هم به 3.3 ولت متصل کردم
    یا را اندازی متفاوتی داره ( چون اکثر اتفاق از این نوع ماژول استفاده نشده و فقط توضیحات ماژول داده شده ) و یا ماژول ها واقعا خرابه و کار نمیکنن

    ژوئن 16, 2021 at 8:06 ب.ظ
    • مهران ملکی Reply

      سلام،
      کتابخونه printf.h جزو کتابخونه‌های پیشفرض آردوینو هست و در صورتی که موقع کامپایل کد، برد رو یکی از بردهای آردوینو انتخاب کرده باشید این خطارو نباید دریافت کنید. اگر برد رو به درستی انتخاب کردید و هنوز خطارو دریافت میکنید سعی کنید از نسخه آپدیت شده نرم‌افزار آردوینو استفاده کنید. در صورتی که مشکل بر طرف نشد میشه گزینه‌های دیگر رو بررسی کرد.
      و همچنین در مورد ماژول‌های توضیح داده شده در این آموزش، این ماژول‌ها همگی راه‌اندازی یکسان دارند و با همین آموزش میشه از این ماژول‌ها استفاده کرد. تنها برخی مشخصات فنیشون در عمل متفاوت هست.

      ژوئن 19, 2021 at 9:53 ق.ظ
  • Ahmad Reply

    سلام
    از صحت این کد مطمئن هستید ؟ من دو جفت nrf مختلف گذاشتم ولی جوابی نگرفتم

    سپتامبر 11, 2021 at 2:41 ب.ظ
    • مهران ملکی Reply

      سلام.
      بله تمامی کدهایی که در آموزش‌ها گذاشته میشن کامل چک میشن. کد مربوط به این آموزش هم اخیرا استفاده شده و مشکلی نداشته. اگر تو راه‌اندازی مشکلی خاصی برخورد کردید میتونید با بخش تلگرام پشتیبانی فنیمون هم مشورت کنید.

      سپتامبر 12, 2021 at 9:47 ق.ظ
  • محمد امین Reply

    سلام رو فایل کتابخونه ای #include ارور printf.h: No such file or directory رو می ده می شه یه راهنمایی کنید که الان باید چیکار کنم

    اکتبر 12, 2021 at 4:36 ب.ظ
    • مهران ملکی Reply

      سلام.
      همین مورد در یکی از کامنت‌های قبلی هم بررسی شده که براتون همون پاسخ رو میذارم:
      “کتابخونه printf.h جزو کتابخونه‌های پیشفرض آردوینو هست و در صورتی که موقع کامپایل کد، برد رو یکی از بردهای آردوینو انتخاب کرده باشید این خطارو نباید دریافت کنید. اگر برد رو به درستی انتخاب کردید و هنوز خطارو دریافت میکنید سعی کنید از نسخه آپدیت شده نرم‌افزار آردوینو استفاده کنید. در صورتی که مشکل بر طرف نشد میشه گزینه‌های دیگر رو بررسی کرد.”
      احتمالا با آپدیت آردوینو و انتخاب درست برد مشکلتون حل میشه.

      اکتبر 13, 2021 at 8:49 ق.ظ
  • پرهام Reply

    سلام
    من میخوام از این ماژول ها یک فرستنده و گیرنده درست کنم

    و راستش کانال های زیادی نمیخوام فقط دو تا کانال ثابت

    و دارم با نانو اردینو راه اندازیش میکنم طبق راهنمایی سایت های دیگه با نانو اردینو و کمی هم از سایت شما

    و میخوام این رو به کوادکوپتر وصل کنم وقتی دکمه ای فلانی چیزی توی قرستنده میزنی گیرنده عمل کنه و سروو رو تا درجه اخر بچرخونه که با این حساب دیگه سروو نیاز به سه تا سیم نداره و و چیزی که بهش وصله به کمک سروو جدا بشه و من مبتدی هستم خواهش میکنم کامل و دقیق راهنمایی کنید در رابطه با سیم کشی و کد های مورد ویرایش

    ژانویه 27, 2023 at 12:32 ق.ظ
    • علی عبدالملکی Reply

      سلام
      این کدهای که برای فرستنده و گیرنده نوشته شده رو میتونید استفاده کنید، در قسمت گیرنده دیتایی رو که از طریق فرستنده میفرستید در این تابع میتونید دریافت کنید radio.read(&data, sizeof(MyData));//Read payload data from the RX FIFO buffer(s).
      و کاری خواستید روی data انجام بدید ، همون سروو رو راه اندازی کنید یا هر تسک دیگه ایی، در کد فرستنده هم به همین شکل از تابع radio.writeFast(&data, sizeof(MyData)); جهت ارسال data استفاده میشود که میتونید دیتای مد نظرتون رو در ورودی همین تابع قرار بدید
      برای دریافت توضیحات تکمیلی تر میتونید سوالتون رو در انجمن فنی کافه ربات بپرسید.
      با تشکر

      فوریه 28, 2023 at 10:05 ق.ظ
  • علی اصغر Reply

    سلام من چند تا از این ماژول ها را دارم ولی مشکلی که هست بعضی از ماژول ها ارتباط برقرار نمی کنند و بعضی از ماژول ها را فقط می توان به عنوان فرستنده استفاده کرد و وقتی که به مدار گیرنده متصل می کنم ارتباط برقرار نمی کنند و بر عکس بعضی از ماژول ها را فقط می توان برای گیرنده استفاده کرد .
    من از اردوینو مگا و unoو از ماژول رگلاتور استفاده می کنم.

    مارس 24, 2023 at 12:20 ب.ظ
    • محمد دمیرچی Reply

      با سلام
      در کد های فرستنده و گیرنده خطی وجود دارد به صورت زیر
      #define Debug_mode false
      آن را به true تغییر بدهید تا مود دیباگ فعال بشود. ماژول ها را وصل کنید و بررسی کنید در آنجا دیتا هایی در مورد خود میکرو و رجیستر هایش به شما نمایش داده می شود.
      امکان دارد خطایی برای ارتباط وجود داشته باشد که این اتفاق برای شما می افتد می توانید به این صورت بررسی کنید.

      آوریل 8, 2023 at 5:03 ب.ظ
  • shahryar Reply

    سلام
    كامپايل كدهاي sketch من دچار مشكل شدن و كدهاي خيلي ساده هم كامپايلش نزديك ٥دقيقه طول ميكشه، البته اخطار ميده ولي اِرور نيست و بالاخره كامپايل و اپلود ميشن اما بسيار زمان طولاني لازمه. جالبه هميشه اين اخطارو نميده و گاهي فقط، يعني يكي درميان اخطار ميده.
    لازم به ذكره آنتي ويروس رو هم غيرفعال كردم.
    ورژن اردوينوم ١.٨.١٩ هستش.

    اين هم اخطارش:
    The directory name is invalid
    Access is denied.

    ژوئن 17, 2023 at 12:12 ق.ظ
    • محمد دمیرچی Reply

      امکان دارد به دسترسی های نرم افزار آردوینو به سیستم شما باشد.
      میتوانید نرم افزار را یک بار حذف و دوباره نصب کنید تا دسترسی ها درست بشود. در صورتی که درست نشد.
      آدرس فایل هایی که نرم افزار به آن درسترسی دارد را دسترسی سطح ادمین بدهید.
      برای تنظیم کردن این موضوع بر روی پوشه مورد نظر راست کلیک کرده و Properties را باز کرده و در تب Security گزینه Edit را بزنید از بخش بالا بر روی تک تک User ها کلیک کنید و در بخش پایین سطح دسترسی را بر روی Full Control قرار بدهید.(توجه داشته باشید که به چه چیز هایی سطح دسترسی میدهید)
      امکان داشته باشد از این بخش باشد.

      ژوئن 17, 2023 at 3:15 ب.ظ
  • عرفان Reply

    از esp32 هم میشه برای راه اندازی این ماژول استفاده کرد؟

    ژانویه 5, 2024 at 6:37 ب.ظ
    • محمد دمیرچی Reply

      بله
      در بخش کد دقت کنید پین های مورد استفاده برای ESP32 نیز آمده اند.

      ژانویه 6, 2024 at 11:00 ق.ظ

دیدگاهتان را بنویسید

نشانی ایمیل شما منتشر نخواهد شد.