ویژگی های ماژول فرستنده گیرنده NRF24L01
در بسیاری از مواقع نیاز است که تجهیزات الکترونیکی به صورت بی سیم به یکدیگر متصل شوند. در این مواقع از تجهیزات Radio Frequency یا به اختصار RF استفاده میشود. RF ها شامل تمامی امواج رادیویی هستند که با توجه به فرکانس و دامنه میتوانند فاصلههای مختلفی را طی کنند و به گیرنده برسند.
ماژول NRF24 امکان برقراری ارتباط دو طرفه را ایجاد کرده و همچنین با برقراری پروتکل mesh network این امکان را به ما میدهد تا تعداد زیادی از این ماژولها را به صورت بی سیم به یکدیگر متصل کنیم. همچنین این ماژولها به دلیل سرعت بالا در انتقال داده و همچنین برد بالا در بین کاربران از محبوبیت زیادی برخوردارند.
ماژولهای NRF24L01 در مدلها و شکلهای متفاوتی تولید میشوند که تفاوتی در راهاندازی ندارند و فقط بسته به مدل ممکن است ICهای LNA و PA که تقویتکننده سیگنال هستند بر روی برد قرار گرفته باشد تا بتواند دادهها را در مسافتهای بیشتری ارسال و دریافت کند.
نکته
اگر نیاز به مخابره داده در مسافتهای طولانی دارید نیز میتوانید از این ماژول استفاده کنید اما باید از آنتنهای بسیار قوی استفاده کنید.
جهت دریافت دیتاشیت NRF24L01 به لینک زیر مراجعه شود.
NRF24L01 Module Datasheet
جهت دریافت اطلاعات بیشتر NRF24L01 اینجا کلیک کنید.
معرفی پایه ها (Pinout) ماژول فرستنده گیرنده NRF24L01
ماژول NRF24L01 دارای 8 پایه به شرح زیر است:
- VIN: تغذیه ماژول
- GND: زمین
- MOSI: خط ارسالی اطلاعات برای پروتکل SPI
- MISO: خط دریافتی اطلاعات برای پروتکل SPI
- SCK: همزمان سازی برای پروتکل SPI
- IRQ: وقفه برای پروتکل SPI
- CSN: انتخاب ماژول برای پروتکل SPI (معکوس)
- CE: فعال سازی پروتکل SPI
لوازمی که به آن احتیاج دارید
قطعات مورد نیاز
لیست انواع ماژولهای NRF24L01 که میتوانید از آنها استفاده کنید، در زیر آورده شده است. برای حداقل ارتباط به 2 عدد از آنها نیاز دارید و نیازی نیست که هر دو از یک مدل باشند.
نرم افزارهای مورد نیاز
راه اندازی ماژول فرستنده گیرنده NRF24L01 با آردوینو
گام اول: سیم بندی
اگر ماژول از نوع DIP است مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
اگر ماژول از نوع SMD است مطابق مدار زیر، ماژول را به آردوینو وصل کنید.
گام دوم: نصب کتابخانه
کتابخانه زیر را بر آردوینوی خود نصب کنید.
توجه
اگر نیاز به راهنمایی بیشتر برای نصب کتابخانه بر روی آردوینو دارید، می توانید به آموزش نصب کتابخانه بر آردوینو مراجعه کنید.
گام سوم: کد
کد زیر را بر روی آردوینوی سمت گیرنده آپلود کنید.
/*
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)
برای راه اندازی طبق آموزش خودتون پیش رفتم که خطای printf.h: No such file or directory میده
آموزش های دیگه هم بررسی کردم خطا نمیده اما برنامه عملکردی نداره
از آردوینو مگا 2560 و آردوینو یونو استفاده کردم ( ترتیب اتصال پینهای CE و CSN و MOSI و MISO و SCK رو با توجه به آردوینو های استفاده شده رعایت کردم ) VCC رو هم به 3.3 ولت متصل کردم
یا را اندازی متفاوتی داره ( چون اکثر اتفاق از این نوع ماژول استفاده نشده و فقط توضیحات ماژول داده شده ) و یا ماژول ها واقعا خرابه و کار نمیکنن
سلام،
کتابخونه printf.h جزو کتابخونههای پیشفرض آردوینو هست و در صورتی که موقع کامپایل کد، برد رو یکی از بردهای آردوینو انتخاب کرده باشید این خطارو نباید دریافت کنید. اگر برد رو به درستی انتخاب کردید و هنوز خطارو دریافت میکنید سعی کنید از نسخه آپدیت شده نرمافزار آردوینو استفاده کنید. در صورتی که مشکل بر طرف نشد میشه گزینههای دیگر رو بررسی کرد.
و همچنین در مورد ماژولهای توضیح داده شده در این آموزش، این ماژولها همگی راهاندازی یکسان دارند و با همین آموزش میشه از این ماژولها استفاده کرد. تنها برخی مشخصات فنیشون در عمل متفاوت هست.
سلام
از صحت این کد مطمئن هستید ؟ من دو جفت nrf مختلف گذاشتم ولی جوابی نگرفتم
سلام.
بله تمامی کدهایی که در آموزشها گذاشته میشن کامل چک میشن. کد مربوط به این آموزش هم اخیرا استفاده شده و مشکلی نداشته. اگر تو راهاندازی مشکلی خاصی برخورد کردید میتونید با بخش تلگرام پشتیبانی فنیمون هم مشورت کنید.
سلام رو فایل کتابخونه ای #include ارور printf.h: No such file or directory رو می ده می شه یه راهنمایی کنید که الان باید چیکار کنم
سلام.
همین مورد در یکی از کامنتهای قبلی هم بررسی شده که براتون همون پاسخ رو میذارم:
“کتابخونه printf.h جزو کتابخونههای پیشفرض آردوینو هست و در صورتی که موقع کامپایل کد، برد رو یکی از بردهای آردوینو انتخاب کرده باشید این خطارو نباید دریافت کنید. اگر برد رو به درستی انتخاب کردید و هنوز خطارو دریافت میکنید سعی کنید از نسخه آپدیت شده نرمافزار آردوینو استفاده کنید. در صورتی که مشکل بر طرف نشد میشه گزینههای دیگر رو بررسی کرد.”
احتمالا با آپدیت آردوینو و انتخاب درست برد مشکلتون حل میشه.
سلام
من میخوام از این ماژول ها یک فرستنده و گیرنده درست کنم
و راستش کانال های زیادی نمیخوام فقط دو تا کانال ثابت
و دارم با نانو اردینو راه اندازیش میکنم طبق راهنمایی سایت های دیگه با نانو اردینو و کمی هم از سایت شما
و میخوام این رو به کوادکوپتر وصل کنم وقتی دکمه ای فلانی چیزی توی قرستنده میزنی گیرنده عمل کنه و سروو رو تا درجه اخر بچرخونه که با این حساب دیگه سروو نیاز به سه تا سیم نداره و و چیزی که بهش وصله به کمک سروو جدا بشه و من مبتدی هستم خواهش میکنم کامل و دقیق راهنمایی کنید در رابطه با سیم کشی و کد های مورد ویرایش
سلام
این کدهای که برای فرستنده و گیرنده نوشته شده رو میتونید استفاده کنید، در قسمت گیرنده دیتایی رو که از طریق فرستنده میفرستید در این تابع میتونید دریافت کنید radio.read(&data, sizeof(MyData));//Read payload data from the RX FIFO buffer(s).
و کاری خواستید روی data انجام بدید ، همون سروو رو راه اندازی کنید یا هر تسک دیگه ایی، در کد فرستنده هم به همین شکل از تابع radio.writeFast(&data, sizeof(MyData)); جهت ارسال data استفاده میشود که میتونید دیتای مد نظرتون رو در ورودی همین تابع قرار بدید
برای دریافت توضیحات تکمیلی تر میتونید سوالتون رو در انجمن فنی کافه ربات بپرسید.
با تشکر
سلام من چند تا از این ماژول ها را دارم ولی مشکلی که هست بعضی از ماژول ها ارتباط برقرار نمی کنند و بعضی از ماژول ها را فقط می توان به عنوان فرستنده استفاده کرد و وقتی که به مدار گیرنده متصل می کنم ارتباط برقرار نمی کنند و بر عکس بعضی از ماژول ها را فقط می توان برای گیرنده استفاده کرد .
من از اردوینو مگا و unoو از ماژول رگلاتور استفاده می کنم.
با سلام
در کد های فرستنده و گیرنده خطی وجود دارد به صورت زیر
#define Debug_mode false
آن را به true تغییر بدهید تا مود دیباگ فعال بشود. ماژول ها را وصل کنید و بررسی کنید در آنجا دیتا هایی در مورد خود میکرو و رجیستر هایش به شما نمایش داده می شود.
امکان دارد خطایی برای ارتباط وجود داشته باشد که این اتفاق برای شما می افتد می توانید به این صورت بررسی کنید.
سلام
كامپايل كدهاي sketch من دچار مشكل شدن و كدهاي خيلي ساده هم كامپايلش نزديك ٥دقيقه طول ميكشه، البته اخطار ميده ولي اِرور نيست و بالاخره كامپايل و اپلود ميشن اما بسيار زمان طولاني لازمه. جالبه هميشه اين اخطارو نميده و گاهي فقط، يعني يكي درميان اخطار ميده.
لازم به ذكره آنتي ويروس رو هم غيرفعال كردم.
ورژن اردوينوم ١.٨.١٩ هستش.
اين هم اخطارش:
The directory name is invalid
Access is denied.
امکان دارد به دسترسی های نرم افزار آردوینو به سیستم شما باشد.
میتوانید نرم افزار را یک بار حذف و دوباره نصب کنید تا دسترسی ها درست بشود. در صورتی که درست نشد.
آدرس فایل هایی که نرم افزار به آن درسترسی دارد را دسترسی سطح ادمین بدهید.
برای تنظیم کردن این موضوع بر روی پوشه مورد نظر راست کلیک کرده و Properties را باز کرده و در تب Security گزینه Edit را بزنید از بخش بالا بر روی تک تک User ها کلیک کنید و در بخش پایین سطح دسترسی را بر روی Full Control قرار بدهید.(توجه داشته باشید که به چه چیز هایی سطح دسترسی میدهید)
امکان داشته باشد از این بخش باشد.
از esp32 هم میشه برای راه اندازی این ماژول استفاده کرد؟
بله
در بخش کد دقت کنید پین های مورد استفاده برای ESP32 نیز آمده اند.