آردوینو آردوینو Arduino Uno پروژه های آردوینو

پروژه ارتباط بی سیم دو طرفه با ماژول رادیویی NRf24l01 و برد آردوینو

NRF Training- Digispark
نوشته شده توسط علیرضا قربانی

در پست‌های قبلی روش اتصال ماژول nrf24l01 را به آردوینو و همچنین برنامه نویسی آن را که به صورت کنترل یک سروو موتور به وسیله جوی استیک بود را آموزش دادیم که می‌توانید برای دیدن آن به پست زیر مراجعه کنید.آموزش ماژول NRF24L01 در آردوینو اگر توجه کرده باشید در آموزش قبلی دو برد آردوینو به وسیله‌ی NRF با هم‌دیگر ارتباط یک طرفه برقرار می‌کردند به صورتی که یکی از آردوینوها فقط به صورت فرستنده و آردوینو دیگر فقط به صورت گیرنده عمل‌ می‌کرد.در این پست ارتباط دوطرفه به وسیله‌ی nrf24l01 را آموزش می‌دهیم به صورتی که آردوینو هم بتواند اطلاعات دریافت کند و هم اطلاعات ارسال کند. در ادامه آموزش با مرجع تخصصی آردوینو همراه باشید.

 


ماژول NRF24L01


ماژول NRF24L01 یک ماژول بی‌سیم (Wireless Module) با فرکانس ۲٫۴ گیگاهرتز است که توسط شرکت Nordic Semiconductor طراحی و تولید شده است. این ماژول یکی از محبوب‌ترین و پرکاربردترین ماژول‌ها برای انتقال داده بی‌سیم در پروژه‌ها و ابزارهای الکترونیکی مختلف است. این فرکانس استاندارد، بسیار پرکاربرد و مجاز در بسیاری از کشورها است، که به کمک آن امکان انتقال داده‌ها در فاصله‌های دور فراهم می‌شود. با پهنای باند بالا (۲ مگاهرتز) می‌تواند حجم زیادی از داده‌ها را به طور همزمان منتقل کند.پروتکل ارتباطی SPI (Serial Peripheral Interface) از پروتکل ارتباطی SPI برای ارتباط با میکروکنترلرها و بردهای الکترونیکی استفاده می‌کند، که به راحتی می‌توان آن را به میکروکنترلرها متصل کرد. ماژول NRF24L01 قابلیت ارتباط دوطرفه (Full-Duplex) را دارد و می‌توان با استفاده از آن ارتباط داده‌ها را به صورت دوسویه بین دو دستگاه برقرار کرد.با توجه به پهنای باند بالا، این ماژول قابلیت انتقال داده‌های تصویری و صوتی را نیز دارد.ماژول NRF24L01 با مصرف انرژی کم، برای کاربردهایی که نیاز به مصرف انرژی پایین دارند، بسیار مناسب است.


اتصالات ماژول NRF24L01


اتصالات در هر دو آردوینو به صورت زیر می‌باشد. پین های CE  و CSN می‌توانند به هر پین دیجیتالی منصل شوند(‌ ما پین ce را به پین ۹ و پین csn را به پین شماره ۱۰ آردوینو متصل می‌کنیم)

 

در برد آردوینو uno  پین های پرروتوکل spi به صورت زیر می باشند:

  • MOSI is connected to the digital pin 11
  • MISO is connected to the digital pin 12
  • SCK is connected to the digital pin 13

همچنین یک تاچ سوییچ را به پین شماره ۳ متصل می‌کنیم و آن را به صورت PULL Down در می‌آوریم . یک عدد LED نیز به پین شماره ۲ متصل می‌کنیم.

 

 

 

اتصالات دو عدد ماژول nrf24l01 به دو عدد آردوینو

اتصالات دو عدد ماژول nrf24l01 به دو عدد آردوینو

 

 


کدنویسی ارتباط رادیویی با NRF24L01


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

دانلو د کتابخانه nrf24l01

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

کد‌های زیر را بر روی هر دو آردوینو آپلود کنید. همانطور که مشاهده می‌کنید بر روی هر آردوینو که کلید را فشار دهید ، وضعیت LED متصل به آردوینو مقابل تغییر می‌کند.

 

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

 

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

 

 


شیوه کار برنامه ماژول NRF24L01 آردوینو


در setup برنامه تنظیمات مربوط به ماژول و LEDها و کلید‌ها را انجام‌می‌دهیم. سپس تابعی به نام chk_incoming تعریف می‌کنیم .

void chk_incoming()
{

  if ( radio.available() ) //چک می‌کنیم که آیا اطلاعاتی برای دریافت وجود دارد یا خیر
  {


    //اطلاعات دریافت شده را خوانده  و در متغیر button_states میریزیم
    radio.read( button_states, num_button_pins );




    // با توجه به داده‌های دریافت شده از وضعیت کلید‌های آردوینو مقابل ،‌وضعیت ال‌ای‌دی ها را تغییر می‌‌کنیم
    int i = num_led_pins;
    while (i--)
    {
      if ( button_states[i] )
      {
        led_states[i] ^= HIGH;
        digitalWrite(led_pins[i], led_states[i]);
      }
    }

  }
}

در این تابع چک می‌کنیم که در صورتی  که آردوینو مقابل اطلاعات را ارسال کند، آن اطلاعات را دریافت کند و متناسب با  آن‌ اطلاعات دریافت شده(این اطلاعات شامل وضعیت کلید‌های متصل  به آردوینو مقایل می‌باشد) وضعیت LED ها را تغییر دهد. سپس تابعی به نام  TX_mode تعریف می‌کنیم.

void TX_mode()// TX_mode function......
{
  radio.stopListening(); // must stop listening before you open a writing pipe
  radio.openWritingPipe(pipe);

  bool ok = radio.write( button_states, num_button_pins ); // ارسال اطلاعات
  if (ok) {              // چک می‌کنیم که اطلاعات ارسال شده است یا نه


// سپس ماژول را  در وضعیت گیرنده قرار می‌دهیم
    radio.openReadingPipe(1, pipe); //
    radio.startListening();
    delay(200);
  }
  else {
    printf("failednr"); // for debugging " lets you know other did not received transmittion "
  }
}

در این تابع ابتدا ماژول در وضعیت  فرستنده قرار می‌گیرد سپس اطلاعات را ارسال می‌کند ، پس از ارسال اطلاعات دوباره ماژول در وضعیت گیرنده قرار می‌گیرد. بعد از مراحل فوق تابعی به نام chk_outgoing ایجاد می‌کنیم.

void chk_outgoing() //
{
  int i = num_button_pins;
  bool different = false;
  while (i--)
  {
    uint8_t state = ! digitalRead(button_pins[i]);
    if ( state != button_states[i] )
    {
      different = true;
      button_states[i] = state;
    }
  }
  if (different)// اگر کلید فشرده شود
  {
    TX_mode(); //calls Tx_mode function
  }
}

در این تابع مرتبا وضعیت فشرده شدن کلید‌ها چک می‌شود و در صورتی که یکی از کلید‌ها فشرده شود از تابع TX_mode قرار می‌گیرد و اطلاعات مربوط به وضعیت کلید‌ها را برای آردوینو مقابل ارسال می‌کند و سریع دوباره ماژول در مد گیرنده قرار می‌گیرد.در مرحله آخر تمام توابع نوشته شده را در loop برنامه قرار می‌هیم:

void loop (void)
{

  chk_incoming();
  delay(20);
  chk_outgoing();

}

 


سخت افزار مورد نیاز


دو عدد آردوینو Uno

دو عدد ماژول nrf24l01

دو عدد LED
دو عدد تاچ سویج

 

در پایان نظرات و پیشنهادات خود را با ما درمیان بگذارید و با اشتراک گذاری این آموزش در شبکه های اجتماعی , از وبسایت دیجی اسپارک حمایت کنید.

 

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

علیرضا قربانی

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

تبادل نظر و رفع عیب با ثبت دیدگاه

۵۰ دیدگاه

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

  • ببخشید من سوالم رو توی اون یکی مثال این ماژول گذاشته بودم.
    من این مدار رو دقیقا بستم. توی سریال مانیتور failed میزنه و توی هر دو آردوینو فقط ال ای دی چشمک میزنه.

    بعدشم من یه جا خوندم که تو مثالش واسه هر کدوم یه آدرس مختلف نوشته. هر چند تستش نکردم.

  • سلام اقای قربانی
    خسته نباشین
    من بابت پروژم یکم راهنمایی میخوام، فکر کنم شما بتونین کمکم کنین

    ممنون میشم ایمیلتونو بدین بهم
    باتشکر

  • سلام خسته نباشین.
    بنده از ماژول + استفاده میکنم و ماژول رو صحیح وصل کردم.
    هرموقع کلید رو فشار می دم تو سریال مانیتور می نویسه failed.
    چی کار می تونم بکنم؟

  • سلام خسته نباشین
    من برنامه نویس اندروید هستم و میخام یه اپلیکیشن بسازم که کاربر باهاش به این برد وصل بشود و یه ارتباط دو نفره ایجاد بشود .من را در این راه یاری بفرمایید
    چطور باید این کار را بکنم؟

  • سلام خسته نباشین
    من پروژه را بستم جواب هم گرفتم ولی مشکلی که داره فاصله را که زیاد میکنم از ده متر بیشتر ارسال و دریافت هنگ میکنه این دلیلش از چیه؟

  • سلام من میخواهم ۳تا گیرنده داشته باشم و یک فرستنده و یک رابطه دوطرفه بین انها ایجاد کنم ممنون میشم اگه کمکم کنید

    • با سلام و تشکر از شما
      در این خصوص بنده تجربه کار عملی ندارم. از دیگر کاربرانی که با این ماژول کار کرده‌اند، تقاضا دارم تا در این بحث شرکت کنند.

  • ن تو ی پروژه میخوام از ماژول کارت حافظه sd و nrf استفاده کنم و هر دو از پروتکل spi استفاده می کنند میشه جفتش با هم فعال باشند ؟

      • با سلام
        کاربر گرامی، ما نسبت به اعتبار مطالب منتشر شده در دیجی اسپارک بسیار اهمیت داریم. از اینرو امکان نمایش لینک‌های نا معتبر وجود ندارد. دقت داشته باشید که اگر تمایل به همفکری و کمک به دیگر کاربران هستید، نسبت به انتقال دانش تلاش بفرمایید.

    • با سلام
      بنده در این خصوص تجربه عملی ندارم ولی تا جایی که می‌دانم می‌توانید از طریق یک فایل روی مموری SD این کار را انجام دهید. از دیگر کاربران که دراین خصوص تجربه عملی دارند تقاضا دارم تا در این بحث شرکت کنند.

  • با سلام
    برای ارسال صدا بین طبقات یک ساختمان استفاده از ماژول nrf24l01 مناسب است؟
    اگر راه و روش بهتری وجود دارد لطفا راهنمایی کنید.

  • سلام
    اگه ممکنه برای ارسال صدا یا تصویر از طریق ماژول هایی مثل nrf یا esp راهنمایی کنید. یا از هر طریق دیگری بدون استفاده از سیمکارت.

  • سلام اگه ممکنه برای ارسال صدا یا تصویر از طریق ماژول هایی مثل nrf یا esp راهنمایی کنید. یا از هر طریق دیگری بدون استفاده از سیمکارت.

  • با سلام دوستان من یک پروژه رادیو کنترل نوشتم با ماژول nrf طلایی که بردش ۱۸۰۰ متره حالا بردش نهایتا پنج متره دیتاریت رو که کم میکنم ماژول ها همدیگر رو پیدا نمیکنن میشه راهنمایی کنید تشکر

    • با سلام و تشکر از شما
      بسیار عالی، متاسفانه بنده در این خصوص تجربه عملی ندارم. از دیگر کاربران که در این زمینه کار کرده‌اند، تقاضا دارم تا در این بحث شرکت کنند.

  • سلام من nrf رو با آردوینو Dip uno راه اندازی کردم اما همون کد و شماتیک رو با آردوینو smd uno راه اندازی میکنم ولی جواب نمیگیرم میشه کمکم کنید؟

    • با سلام
      جابجایی برد UNO R3 و UNO SMD نباید تفاوتی در عملکرد مدار ایجاد کند. مشکل شما از جای دیگری مانند تغذیه و یا اتصالت می‌باشد. نکته دیگر اینکه، کدها روی برد SMD درست آپلود شده‌اند؟

  • با سلام.
    من در یک طرف nodemcu استفاده کردم و در طرف دیگه atmega8.
    برنامه atmega8 رو با کدویژن نوشتم و برای nodemcu رو با آردوینو ide ولی اصلا به هم پیغام نمیدن. اصلا این کار درسته؟ و میخوام بدونم یک ماژول nrf به چند تا nrf دیگه که همه در یک کانال و یک آدرس دارن کار میکنن پیام ارسال کنه. (نیاز به ack نیست )

    • با سلام و تشکر از شما
      اگر هر دو ماژول فرستنده و گیرنده از یک نوع و ورژن یکسان باشند. طبیعتا ربطی به بخش قبل از ماژول یعنی میکروکنترلر مربوطه ندارد. مشکل را از بخش دیگری دنبال کنید. پیشنهاد میکنم دیتاشیت NRF را کاملا با دقت مطالعه بفرمایید.

  • با سلام من نیاز به فرستنده و گیرنده تک کاناله دارم که میخام سه تا دیوار مانع از کارارایی سیستم نشه یعنی فرستنده و گیرنده رو در روی هم نباشه
    بنظر شما از چه فرستنده و گیرنده استفاده کنم؟ دیتا هم فقط دستور قطع و وصل هست

  • سلام من موقع راه اندازی ماژول nrf در فرستنده هر چی ارسال می کنم از اون طرف صفر دریافت می کنم فکر کنم چون خازن مناسبی در قسمت تغذیه نذاشتم درسته؟
    چون وقتی خازن ها رو دست کاری می کنم گاهی اوقات اون مقداری که می خواهم را در خروجی دریافت می کنم الان باید چی کار کنم؟
    چه خازنی مناسب است؟دوتا ۱۰ میکرو فاراد رو امتحان کردم

    • با سلام
      علاوه بر خازن‌ها، اتصالات هم اهمیت دارد، مثلا اگر از کابل جامپر استفاده کردید، در این موضوع اهمیت دارد. لطفا بررسی و نتیجه را از همین طریق اعلام کنید.

  • سلام وعرض ادب و احترام و ممنونم به خاطر آموزش خیلی زیباتون
    من موقع کامپایل کردن این ارور را می گیرم حتی لایبراری رو هم اضافه کردم ولی این خط رو ارور می ده
    همه ی include ها و توابع ای که گفتید رو قبل از setup اضافه کردم

    ‘radio’ was not declared in this scope

    • با سلام و تشکر از شما
      لطفا به سطر ۲۹ در کدهای اصلی همین صفحه دقت کنید. در اینجا radio را به عنوان یک شی داخل کدها تعریف کرده‌ایم. و پس از آن دقیقا عبارت radio برای کدها شناخته می‌شود. لطفا دقیق‌تر بررسی کرده و نتیجه را از همین طریق اعلام کنید.

  • سلام
    من کدها رو نوشتم وقتی کامپایل رو میزنم کامپایل نمیشه و هیچ خطی هم رو مشخص نمیکنه که مشکل از اون خط باشه

    • با سلام
      منظورتان از اینکه کامپایل نمی‌شوند دقیقا چیست؟ در چنین حالتی حتما باید ارور دریافت کنید. که در این صورت باید ارور دریافتی را کپی کرده و در پاسخ بعدی ارسال کنید.

  • سلام وقت بخیر من میخوام با گوشی اندروید به ۳ یا ۴ تا میکروکنترلر که قراره استپ موتور فعال کنند به صورت هم زمان فرمان بدم به صورت بی سیم که برای هر استپ موتور ۴تا فرمان باید بدم جمعا ۱۶ تا مقدار عددی ایا با استفاده از ماژول های nrfمیتونم این کار رو انجام بدم که یک برد مستر باشه بقیه اسلو .ممنون میشم اگر راهنمایی کنید

    • با سلام و تشکر از شما
      دقت داشته باشید که ماژول NRF امکان اتصال به شبکه وای فای موبایل را ندارد. از این رو عملا اقداماتی که میخواهید انجام دهید با این برد قابل اجرا نخواهد بود.

  • با سلام
    خسته نباشید
    امکان استفاده از آردوینو نانو هست؟
    واینکه اگر بلندگو و میکروفون به این مدار اضافه بشه و در کد ها تغیراتی ایجاد بشه امکان استفاده به عنوان بیسیم وجود داره؟؟؟

  • سلام مهندس . من یک هفته هست که هر کار میکنم ماژول داده ارسال نمیکنه . لطفا راهنمایی کنید. جالب اینجاست که وقتی پایه مثبت تغذیه رو جدا میکنم یه سری داده ی اشتباه میفرسته