به آموزشگاه مجازی سینا خوش آمدید!

ارتباط وایرلس بین دو برد آردوینو با nRF24L01

 

 در این آموزش، یاد می گیریم که چگونه بین دو برد آردوینو با استفاده از ماژول  nRF24L01 ارتباط برقرار کنیم. ماژول nRF24L01 برای ارتباطات وایرلس، وقتی که از آردوینو استفاده می کنیم، اهمیت دارد و بسیار محبوب است. در این مقاله، هر چیزی که باید در مورد ماژول nRF24L01 بدانید توضیح داده شده است، مانند نمودار آرایش پین ها(pinout)، قواعد کار، سیم کشی و مثال های کدنویسی.

نکته: این آموزش جنبه تئوری دارد و به طور عملی توسط مترجم تست نشده است.


 بررسی اجمالی

برای توضیح دادن ارتباطات وایرلس دو مثال می زنیم. مثال اول، یک پیغام "Hello World" ساده را از یک برد آردوینو را به یک برد آردوینوی دیگر ارسال می کند. و در مثال دوم، یک ارتباط دو طرفه بین بوردهای آردوینو برقرار می کنیم به طوری که در آردوینوی اول از یک جوی استیک(Joystick) استفاده می کنیم و در آردوینوی دوم یک سروو موتور را کنترل می کنیم و برعکس. و با استفاده از یک دکمه فشاری در آردوینوی دوم، یک LED را در آردوینوی اول کنترل می کنیم. 

 


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

اجازه دهید نگاه دقیق تری به ماژول NRF24L01 بیندازیم. این ماژول از باند با فرکانس 2.4 GHz استفاده می کند و می تواند با نرخ انتقال از 250 kbps تا 2 Mbps عمل کند. این ماژول اگر در فضای باز و با نرخ انتقال(baud rate) کمتری استفاده شود، برد آن به 100 متر هم می رسد.

مشخصات فنی این قطعه در جدول زیر قرار دارد:

محدوده فرکانس 2.4 تا 2.5 گیگاهرتز در باند رادیویی ISM
نرخ داده ها 250Kbps / 1Mbps / 2Mbps
حداکثر توان خروجی 0dBm
ولتاژ کاری 1.9V تا 3.6V
حداکثر جریان کاری 12.3mA
جریان حالت انتظار(Standby current) 22µA
ورودی های سطح منطقی تحمل 5 ولت(5V tolerant)
محدوده ارتباطی 100 متر (در فضای باز)

 


 این ماژول چگونه کار می کند؟

این ماژول می تواند از 125 کانال مختلف استفاده کند که امکان داشتن شبکه ای از 125 مودم مستقل را در یک مکان فراهم می کند. هر کانال می تواند 6 آدرس داشته باشد یا اینکه هر واحد(unit) می تواند حداکثر با 6 واحد(unit) دیگر به طور همزمان ارتباط برقرار کند.

 مصرف برق این ماژول در حین انتقال، فقط در حدود 12mA است. که حتی از یک LED تکی هم کمتر است. ولتاژ عملیاتی این ماژول از 1.9 تا 3.6 ولت است، اما خبر خوب این است که دیگر پین ها تا سطح منطقی 5 ولت تحمل دارند، بنابراین به سادگی می توانیم آن را به یک آردوینو متصل کنیم، بدون اینکه از مبدل های سطح منطقی(logic level) استفاده کنیم.

 سه تا از پین های بالا برای ارتباطات SPI هستند و نیاز دارند تا به پین های SPI در آردوینو وصل شوند، اما توجه کنید که هر بورد آردوینو، پین های SPI مختلفی دارد. پین های CSN و CE می توانند به هر پین دیجیتالی در بورد آردوینو وصل شوند و از آنها برای تنظیم کردن ماژول در حالت آماده به کار(حالت انتظار، standby) یا حالت فعال، علاوه بر سوئیچ بین حالت انتقال(transmit mode) یا حالت فرمان(command mode) استفاده می شود.

نکته1: به مکانیزم انتقال داده بین دو دستگاه که در یک شبکه به یکدیگر متصل شده اند، حالت انتقال(transmit mode) گفته می شود.

نکته 2: به حالتی که باعث می شود کامپیوتر یا مودم دستورات اجرایی را بپذیرند، حالت فرمان(command mode) گفته می شود.

 آخرین پین، (پین پایین و سمت راست) برای قطع کردن است که نباید مورد استفاده قرار گیرد.


انواع ماژول NRF24L01

چندین نوع ماژول NRF24L01 وجود دارد. محبوب ترین ماژول از این نوع، حاوی یک آنتن داخلی می باشد. این آنتن داخلی باعث می شود تا ماژول جمع و جور تر شود اما از طرف دیگر، برد انتقال آن تا حدود 100 متر، کاهش می یابد.

 نوع دوم، به جای یک آنتن داخلی، از یک کانکتور SMA برخوردار است و می توانیم یک آنتن خارجی را برای بهتر شدن برد انتقال به آن اضافه کنیم. سومین ماژول، علاوه بر آنتن خارجی، از یک چیپ RFX2401C برخوردار است که حاوی یک تقویت کننده برق(Power Amplifier) و یک آمپلی فایر کم نویز(Low-Noise Amplifier) است. این باعث می شود سیگنال ماژول NRF24L01 تقویت شود و باعث می شود برد انتقال این ماژول بهتر شود و در فضای باز، تا 1000 متر نیز برسد.


 نمودار ماژول nRF24L01 

 در زیر می توانید جزئیات پین های ماژول NRF24L01 و ماژول NRF24L01+ PA/LNA را مشاهده کنید:

 هردوی ماژول های NRF24L01 و NRF24L01+ PA/LNA از نمودار پین های یکسانی برخوردار هستند، بنابراین می توانیم آنها را به یک روش، در مدار متصل کنیم.


 آموزش اتصال ماژول nRF24L01  به آردوینو

در تصویر زیر، روش اتصال ماژول NRF24L01 به بردهای آردوینو نشان داده شده است:

 همان طور که قبلا نیز گفتیم، هر برد آردوینو، پین های SPI مخصوص به خود دارد. بنابراین وقتی که دارید ماژول مورد نظر را به برد آردوینوی خود متصل می کنید، باید از جدول زیر استفاده کنید:

SS MOSI MISO SCK Arduino
10 11 12 13 Uno
10 11 12 13 Nano
53 51 50 52 Mega

 


آردوینو و کدنویسی ماژول nRF24L01

هنگامی که ما ماژول های NRF24L01 را به بردهای آردوینو متصل کنیم، می توانیم برای هردو ماژول گیرنده و فرستنده برنامه نویسی کنیم. ابتدا نیاز داریم کتابخانه RF24 را دانلود و نصب کنیم. این کتابخانه باعث می شود کار ما ساده تر شود. برای دانلود آن اینجا کلیک کنید. و یا برای مشاهده این کتابخانه در گیتهاب، به این آدرس بروید.

 در زیر دو قطعه کد برای ارتباطات وایرلس وجود دارد و پس از آنها، توضیحاتی در مورد شان داده شده است:

کدهای فرستنده:

/*
* Arduino Wireless Communication Tutorial
*     Example 1 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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

const byte address[6] = "00001";

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

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

 

کدهای گیرنده:

/*
* Arduino Wireless Communication Tutorial
*       Example 1 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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

const byte address[6] = "00001";

void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

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

توضیح کدها

ما نیاز داریم کتابخانه SPI و کتابخانه RF24 را به کدها اضافه کنیم و یک آبجکت RF24 را ایجاد کنیم. پین شماره 7 مشخص کننده CE و پین شماره 8 مشخص کننده CSN است.

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

سپس نیاز داریم یک آرایه بایتی(byte) ایجاد کنیم که آدرس یا به اصطلاح، تونلی(pipe) که دو ماژول با هم ارتباط برقرار می کنند را مشخص می کند. 

const byte address[6] = "00001";

ما می توانیم برای مقدار این آدرس(address) هر رشته ی 5 حرفی را مشخص کنیم تا انتخاب کنیم که می خواهیم با کدام گیرنده مکالمه کنیم؛ بنابراین در پروژه ما، باید از همین آدرس در هردو کدهای گیرنده و فرستنده استفاده کنیم.

در کدهای فرستنده، در متد setup() نیاز داریم آبجکت radio را مقدار دهی اولیه(initialize) کنیم و با استفاده از تابع radio.openWritingPipe() ما آدرس گیرنده ای که داده ها را به آن ارسال می کنیم، را تنظیم می کنیم. یعنی همان رشته 5 حرفی که قبلاً آن را تنظیم کردیم.

radio.openWritingPipe(address);

 از طرف دیگر اگر برای گیرنده، از تابع radio.setReadingPipe() استفاده کنیم، می توانیم همان آدرس را تنظیم کنیم و با این کار، ما ارتباط بین دو ماژول را برقرار می کنیم:

radio.openReadingPipe(0, address);

سپس با استفاده از تابع  radio.setPALevel() سطح تقویت کننده برق(Power Amplifier) را تنظیم می کنیم؛ در هر دو قطعه کد بالا، ما مقدار تابع مذکور را برابر با مینیمم مقدار قرار داده ایم، زیرا ماژول های ما بسیار به یکدیگر نزدیک هستند. 

radio.setPALevel(RF24_PA_MIN);

 توجه کنید که اگر می خواهید از یک سطح بالاتر (برای برق) استفاده کنید، توصیه می شود که از یک خازن بای پَس(bypass capacitors) که پایه های آن به GND و 3.3V متصل هستند، استفاده کنید تا آنها از ولتاژ پایدارتری به هنگام کار برخوردار باشند.

سپس به متد radio.stopListening() در کدهای فرستنده می رسیم، که باعث می شود ماژول ما بعنوان یک ماژول فرستنده تنظیم شود. و از طرف دیگر، در کدهای گیرنده به متد radio.startListening() می رسیم که باعث می شود ماژول ما بعنوان یک ماژول گیرنده تنظیم شود.

// در کدهای فرستنده
radio.stopListening();

 

// در کدهای گیرنده
radio.startListening();

اکنون به کدهای بخش حلقه(loop) در فرستنده می رسیم. در این کدها ما یک آرایه(array) از نوع کاراکترها(char) ایجاد می کنیم  و پیغام "Hello World" را در داخل آن قرار می دهیم. با استفاده از متد radio.write() ، ما این پیغام را به گیرنده ارسال می کنیم. اولین آرگومان متد write در خط شماره 3 از کدهای زیر، همان متغیر text است که ایجاد کردیم:

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

با استفاده از یک علامت & قبل از نام متغیر در خط شماره 3 از کدهای بالا، در حقیقت به متغیری اشاره می کنیم که داده هایی که می خواهیم ارسال کنیم را در خود ذخیره می کند. علامت & موقعیت متغیر را در حافظه(memory)، برمی گرداند. و با استفاده از دومین آرگومان، تعداد بایت هایی که می خواهیم این متغیر بگیرد را مشخص می کنیم. تابع sizeof() تعداد بایت های رشته "text" را محاسبه می کند. در انتهای برنامه، با استفاده از تابع delay() به اندازه 1 ثانیه، تاخیر و وقفه ایجاد می کنیم.

 با استفاده از متد radio.write() در هر بار می توانیم ماکزیمم 32 بایت را ارسال کنیم. از طرف دیگر، در کدهای گیرنده، در بخش حلقه(loop)، با استفاده از تابع radio.available() بررسی می کنیم که آیا داده ای برای دریافت وجود دارد یا نه. اگر ارزش این تابع true باشد، ما ابتدا یک آرایه با 32 عنصر به نام "text" ایجاد می کنیم و در آن داده های دریافتی را ذخیره می کنیم. 

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

 با استفاده از تابع radio.read() ما داده ها را در متغیر "text" می خوانیم و ذخیره می کنیم. و در انتها، ما متن(text) مورد نظر را در سریال مانیتور چاپ(print) می کنیم.


 بنابراین هنگامی که ما هر دوی برنامه های فرستنده و گیرنده را در بردهای آردوینو آپلود کنیم، می توانیم سریال مانیتور(serial monitor) را در گیرنده اجرا کنیم، و در آن خواهیم دید که پیغام "Hello World" هر یک ثانیه یک بار چاپ می شود.


عیب یابی پروژه

شایان ذکر است که نویز منبع تغذیه یکی از متداول ترین مشکلاتی است که ما وقتی سعی می کنیم با ماژول های NRF24L01 ارتباط موفقی برقرار کنیم، به وجود می آید. به طور کلی، مدارهای RF یا همان سیگنال های فرکانس رادیویی(radio frequency signals)، به نویز منبع تغذیه حساس هستند. بنابراین همواره خوب است که از یک خازن بای پَس در دو سر منبع تغذیه استفاده کنیم. این خازن می تواند هر مقداری از 10uF تا 100uF (یعنی از 10 میکروفاراد تا 100 میکروفاراد) داشته باشد.

 یک مشکل متداول دیگر، این است که پین 3.3V در بردهای آردوینو، همواره نمی تواند برق کافی به ماژول NRF24L01 برساند. بنابراین ایده ی خوبی است که با استفاده از یک منبع برق خارجی به این ماژول برق برسانیم.


ایجاد ارتباط دوطرفه با دو ماژول NRF24L01 و آردوینو

اکنون اجازه دهید به مثال دوم در این مقاله بپردازیم و یک ارتباط دوطرفه وایرلس بین دو برد آردوینو برقرار کنیم. شماتیک این مدار به صورت زیر است:

 


قطعات مورد نیاز برای این مثال به صورت زیر هستند:

  1.  ماژول NRF24L01
  2. برد آردونیو
  3. ماژول جوی استیک
  4. سروو موتور
  5. دکمه فشاری
  6. ال ای دی(LED)

کدها و توضیحات مثال شماره 2

در زیر، کدها و توضیحات مثال شماره 2 آورده شده است:

کدهای فرستنده:

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Transmitter Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

#define led 12

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
boolean buttonState = 0;

void setup() {
  pinMode(12, OUTPUT);
  radio.begin();
  radio.openWritingPipe(addresses[1]); // 00002
  radio.openReadingPipe(1, addresses[0]); // 00001
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);

  radio.stopListening();
  int potValue = analogRead(A0);
  int angleValue = map(potValue, 0, 1023, 0, 180);
  radio.write(&angleValue, sizeof(angleValue));

  delay(5);
  radio.startListening();
  while (!radio.available());
  radio.read(&buttonState, sizeof(buttonState));
  if (buttonState == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}

 

کدهای گیرنده:

/*
* Arduino Wireless Communication Tutorial
*     Example 2 - Receiver Code
*                
* by Dejan Nedelkovski, www.HowToMechatronics.com
* 
* Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>
#include <Servo.h>

#define button 4

RF24 radio(7, 8); // CE, CSN
const byte addresses[][6] = {"00001", "00002"};
Servo myServo;
boolean buttonState = 0;

void setup() {
  pinMode(button, INPUT);
  myServo.attach(5);
  radio.begin();
  radio.openWritingPipe(addresses[0]); // 00001
  radio.openReadingPipe(1, addresses[1]); // 00002
  radio.setPALevel(RF24_PA_MIN);
}

void loop() {
  delay(5);
  radio.startListening();
  if ( radio.available()) {
    while (radio.available()) {
      int angleV = 0;
      radio.read(&angleV, sizeof(angleV));
      myServo.write(angleV);
    }
    delay(5);
    radio.stopListening();
    buttonState = digitalRead(button);
    radio.write(&buttonState, sizeof(buttonState));
  }
}

 تفاوت کدهای بین این مثال با مثال قبلی، این است که ما در این مثال نیاز داریم دو تونل(pipe) یا آدرس، برای ارتباط دوطرفه ایجاد کنیم:

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

ما نیاز داریم این دو تونل را در تابع setup() تعریف کنیم، و وقتی نوشتن(write) یک آدرس(تونل) در اولین آردوینو، به این نیاز دارد که این آدرس در دومین آردوینو خوانده(read) یا قرائت شود و برعکس، خواندن آدرس در اولین آردوینو نیاز به این دارد که این آدرس در دومین آردوینو نوشته شود(قرائت شود).

// در کدهای فرستنده
radio.openWritingPipe(addresses[1]); // 00001
radio.openReadingPipe(1, addresses[0]); // 00002

 

// در کدهای گیرنده
radio.openWritingPipe(addresses[0]); // 00002
radio.openReadingPipe(1, addresses[1]); // 00001

در بخش کدهای حلقه(loop) ما با استفاده از تابع radio.stopListening()، اولین برد آردوینو را بعنوان فرستنده تنظیم می کنیم و مقدار جوی استیک را از 0 تا 180 می خوانیم و نگاشت(map) می کنیم و با استفاده از تابع radio.write() داده ها را به گیرنده ارسال می کنیم.

radio.stopListening();
int potValue = analogRead(A0);
int angleValue = map(potValue, 0, 1023, 0, 180);
radio.write(&angleValue, sizeof(angleValue));

از طرف دیگر، ما با استفاده از تابع radio.startListening()، دومین آردوینو را به صورت یک گیرنده تنظیم می کنیم و بررسی می کنیم که آیا داده ای در دسترس هست یا نه. وقتی که داده ای در دسترس باشد، ما آن را قرائت(read) می کنیم و آن را در متغیر angleV ذخیره می کنیم و سپس از این مقدار برای چرخاندن سروو موتور استفاده می کنیم.

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

سپس در کدهای فرستنده، ما اولین آردوینو را به صورت یک گیرنده تنظیم می کنیم و با استفاده از یک حلقه while خالی، برای دومین آردوینو منتظر می مانیم تا داده ها ارسال شوند. و این داده ها مربوط به وضعیت دکمه فشاری است که آیا فشار داده شده است یا نه. اگر این دکمه فشار داده شده باشد، ال ای دی(LED) روشن می شود. و این فرایند دائما تکرار می شود و هردوی بردهای آردوینو دائماً داده ها را ازسال و دریافت می کنند.


 مثال شماره 3، ارسال چند متغیر در یک پکیج تکی

 اجازه دهید نگاهی به یک مثال دیگر برای کدنویسی ماژول NRF24L01 بیندازیم. در این مثال، همه چیز همان طور که در کدهای بالا توضیح دادیم است، اما ساختار و ارسال داده ها تفاوت دارند.

کدهای فرستنده:

/*
  Arduino Wireless Communication Tutorial
      Example 1 - Transmitter Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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

const byte address[6] = "00001";

// NRF24L01 ماکزیمم سایز این ساهتار 32 بایت است. حد بافر
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // ایجاد یک متغیر با استفاده از ساختار بالا

void setup() {
  radio.begin();
  radio.openWritingPipe(address);
  radio.setPALevel(RF24_PA_MIN);
  radio.stopListening();
}

void loop() {
  // ارسال تمام داده ها از ساختار به گیرنده
  radio.write(&data, sizeof(Data_Package));
  delay(500);
}

بنابراین، ما می توانیم یک ساختار(struct) ایجاد کنیم که در حقیقت یک مجموعه از انوع متغیرهای مختلف است:

// NRF24L01 ماکزیمم سایز این ساختار برابر با 32 بایت است- حد بافر
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; // ایجاد یک متغیر با استفاده از ساختار بالا

 ما باید به یاد داشته باشیم که ماکزیمم سایز داده ای که در این ساختار(struct) قرار می گیرد، 32 بایت است. در کدهای بالا، در داخل ساختار مورد نظر، سه متغیر از نوع بایت(byte) اضافه کرده ایم، و همچنین یک متغیر از نوع عدد صحیح(integer) ایجاد کرده ایم( که 4 بایت را مصرف می کند). و یک متغیر از نوع ممیز شناور(float) که 4 بایت مصرف می کند و یک متغیر از نوع رشته(String) ایجاد کرده ایم که 4 کاراکتر دارد و 4 بایت را اشغال می کند. که جمعاً 15 بایت می شود. لازم به ذکر است که متغیرهای از نوع بایت، هرکدام یک بایت را اشغال می کنند.

کدهای گیرنده

/*
  Arduino Wireless Communication Tutorial
        Example 1 - Receiver Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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

const byte address[6] = "00001";

//NRF24L01 ماکزیمم سایز این ساختار 32 بایت است- حد بافر 
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

 

کدهای گیرنده کامل شده

/*
  Arduino Wireless Communication Tutorial
        Example 1 - Receiver Code

  by Dejan Nedelkovski, www.HowToMechatronics.com

  Library: TMRh20/RF24, https://github.com/tmrh20/RF24/
*/

#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

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

const byte address[6] = "00001";

//NRF24L01 ماکزیمم سایز این ساختار 32 بایت است- حد بافر 
struct Data_Package {
  byte a = 0;
  byte b = 125;
  byte c = 255;
  int d = 1024;
  float e = 3.141592;
  String f = "Test";
};

Data_Package data; //ایجاد یک متغیر با استفاده از ساختار بالا
void setup() {
  Serial.begin(9600);
  radio.begin();
  radio.openReadingPipe(0, address);
  radio.setPALevel(RF24_PA_MIN);
  radio.startListening();
}

void loop() {
  // بررسی اینکه آیا داده های برای دریافت وجود دارد یا نه
  if (radio.available()) {
    radio.read(&data, sizeof(Data_Package)); // ساختار Data خواندن تمام داده ها و ذخیره آن در 
  }
  Serial.print("a: ");
  Serial.print(data.a);
  Serial.print(" b: ");
  Serial.print(data.b);
  Serial.print(" c: ");
  Serial.print(data.c);
  Serial.print(" d: ");
  Serial.print(data.d);
  Serial.print(" e: ");
  Serial.print(data.e);
  Serial.print(" f: ");
  Serial.println(data.f);
}

ما در سمت گیرنده، از همان ساختار(struct) برای اینکه بتوانیم داده های ورودی را دریافت کنیم، استفاده کرده ایم. ما برای بررسی اینکه ببینیم آیا ارتباط وایرلس به درستی کار می کند یا نه، هر متغیر را در سریال مانیتور چاپ کرده ایم:

 


نتیجه گیری

ماژول NRF24L01 یک گزینه عالی، وقتی که می خواهیم بین پروژه های آردوینو ارتباط برقرار کنیم، محسوب می شود. پروژه های دیگری نیز وجود دارند که در مقالات بعدی می توانیم از آنها برای یادگیری بیشتر استفاده کنیم:

 


منابع: https://howtomechatronics.com

 

دیدگاه‌ها  

+1 # روح الله 1402-04-17 21:32
سلام. مثل اینکه این برنامه و ماژول روی برد آردینو WEMOS کار نمیکنه؟؟؟؟
این خط کد چه در فرستنده و چه در گیرنده که کمی با هم متفاوتند به مشکل می خورند
radio.openWritingPipe(address);
پاسخ دادن | پاسخ به نقل قول | نقل قول کردن
+1 # احسان عباسی 1402-04-19 18:34
سلام. توی این آموزش از آردوینو MEGA استفاده شده. همچنین به نکته ی شماره 1 در ابتدای مقاله دقت کنید که این مقاله هنوز توسط مترجم تست نشده.
پاسخ دادن | پاسخ به نقل قول | نقل قول کردن

نوشتن دیدگاه

لطفا نظرات خود را بیان کنید. به سوالات در سریع ترین زمان پاسخ داده خواهد شد.اما به نکات زیر توجه کنید:
1. سعی کنید نظرات شما مرتبط با مقاله ی مورد نظر باشد، در غیر این صورت پاسخ داده نخواهد شد.
2. سوالات خود را به صورت کوتاه بیان کنید و از پرسیدن چند سوال به طور همزمان خودداری کنید.
3. سوال خود را به طور واضح بیان کنید و از کلمات مبهم استفاده نکنید.


تصویر امنیتی
تصویر امنیتی جدید

ستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعالستاره غیر فعال