آردوینو پروژه های آردوینو مدارهای الکترونیک

راه اندازی ماژول nRF24L01 آردوینو

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

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

nRF24L01 ماژولی برای انتقال  داده  به صورت بی سیم می باشد و در مواردی مانند:هدست های بی سیم ،  کنسول های بازی مانند ps3   ، اتوماسین خانگی  ، سیستم های مسیر یاب مانند GPS و …. استفاده می شود

این ماژول در نوع آنتن دار و بدون آنتن ارا,ه میشود که برد آنتن دار ۱۱۰۰ متر و بدون آنتن آن ۱۰۰ متر می باشد.

nRF24L01 ماژول یک ماژول بسیار عالی برای ارسال و دریافت اطلاعات  بدون خطا  می باشد در مقابسه با ماژول های HMTR  از امکانات بسیار بیشتری برخورد دار می باشند.

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

توضیحات ماژول NRF24L01:

ولتاژ کاری :الی ۳٫۳ ولت

دیتاریت ۲ مگابیت بر ثانیه  در فضای باز

دارای رگولاتور داخلی

 

 

سخت افزار مورد نیاز برای کنترل سروو موتور  با جوک استیک با استفاده از  nRF24L01

دو عدد Arduino (در این پروژه از یک عدد آردوینو mega2560 و یک عدد آردوینو uno استفاده شده است).

دو عدد ماژول nrf24l01 (خرید از فروشگاه )

جوی استیک

سروو موتور

دو عدد خازن ۱۰ میکروفاراد به تغذیه ماژول nRF24L01 متصل می‌شود.

پین VCC به۳٫۳ولت و GND به GND  متصل شود.

 

 

در تصویر زیر نحوه ی اتصال پین ها را مشاهده می‌کنید.

آموزش راه اندازی nrf24l01 -دیجی اسپارک

آموزش راه اندازی nrf24l01 -دیجی اسپارک

 

پین های 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

 

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

  • MOSI is connected to the digital pin 51
  • MISO is connected to the digital pin 50
  • SCK is connected to the digital pin 52

ابتدا کتابخانه را از این لینک دانلود کنید و به نرم افزار اضافه کنید.

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

در ابتدای برنامه ابتدا سه کتابخانه  SPI.h ,nrf24L01.h,RF24.h را فراخوانی میکنیم.

از کلاس RF24   یک شی به نام radio میسازیم .

این شی  دو آرگمان ورودی دارد.که آرگومان اول  CE  و آرگومان دوم  CSN   می باشد.

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

 

سپس یک آرایه  به نام rxAddr تعریف میکنیم.در این آرایه آدرس گیرنده  که قرار است اطلاعات برایش ارسال شود قرار میگیرد.

در تابع setup   برای شروع کار با مودم از دستور زیر استفاده میکنیم.این دستور باعث فعال شدن  ماژول می شود.

سپس  از دستور ;(radio.setRetries(15, 15 استفاده میکنیم.

در این ماژول با هر بار ارسال داده به فرستنده به گیرنده  ، گیرنده یک ack ایجاد میکند.حال با استفاده از تابع بالا ، در صورتی که این ack  توسط فرستنده دریافت نشد ، فرستنده سعی به ارسال دوباره ی داده میکند.

به زبان ساده تر ، اگر اطلاعات توسط گیرنده دریافت نشود ، فرستنده داده ها را دوباره ارسال خواهد کرد.

در آرگومان اول عدد مورد نظر در ۲۵۰ میکرو ثانیه ضرب میشود (حداکثر مقدار برای آرگومان ۱۵ می باشد)و زمان تغییر در هر بار ارسال داده را مشخص میکند. بنابر این در مثال ما اگر گیرنده موفق به دریافت داده ای نشد ، فرستنده هر۳۷۵۰ میکرو ثانیه یا هر ۳٫۷۵ میلی ثانیه (۱۵*۲۵۰=۳۷۵۰) سعی به ارسال داده میکند. آرگمان دوم تعداد دفعات سعی برای ارسال داده را مشخص میکند.در این مثال  اگر ماژول گیرنده داده ای دریافت نکرد ، ماژول فرستنده قبل از متوقف شدن ۱۵ بار برای ارسال مجدد داده تلاش میکند.

این متد ماژول را در مد فرستنده قرار میدهد و در ورودی آن آدرس گیرنده اطلاعات را وارد میکنیم.
ابتدا مقدار آنالوگ جوی استیک که بین ۰ و ۱۰۲۳ می باشد در خانه ی صفرم آرایه joystick   قرار میگیرد، سپس به کمک تابع map   مقدار ۰ الی ۱۰۲۳ به مقدار ۰الی ۱۸۰ نسبت داده میشود.

 

متد write داری دو ورودی می باشد  که ورودی اول  مقداری است که ارسال خواهد شد و ورودی دوم اندازه ی مقدار ارسالی می باشد که به کمک تابع sizeof    به طور اتوماتیک اندازه ی آن را مشخص میکنیم.

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

 

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

آرگمان  اول تعداد فرستتنده هایی است که گیرنده از آن ها اطلاعات در یافت میکند. قابل ذکر است از۶  فرستنده به طور همزمان میتوان اطلاعات دریافت نمود.

آرگمان دوم آدرس فرستنده اطلاعات می باشد.

 

این متد ماژول را برای دریافت اطلاعات آماده میکند.

 

اگر ماژول داده ای دریافت نمود ، این متد مقدار true و اگر مقداری دریافت نکرد مقدار false را بر میگرداند.

 

پس از دریافت داده،  مقدار مورد نظر به سروو موتور نسبت داده می شود.

 

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

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

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

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

۱۱۲ دیدگاه

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

    • سلام
      اگه ماژول بدون آنتن باشه کریستالش بزرگه و اگر هم آنتن داشته باشه ، کریستالش کوچیکه
      تفاوتی در راه اندازی ندارن
      موفق باشید

  • سلام
    اول باید یه تشکر بکنم از این آموزشهای روان و خوبتون
    یه نکته هم هست فکر کنم توی توضیح کدهای فرستنده radio.available() را اشتباه نوشتین باید radio.begin(); رو مینوشتین

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

    • سلام

      امکانش هست ولی یکم مشکله. الان اکثرا تو راه اندازی همین ماژول مشکل دارن چه برسه به انتقال صدا.

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

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

      سوالی بود در خدمتم

      • ممنون از اینکه پاسخ دادین

        یک سوال دیگه ازتون دارم
        اگر نخوایم اطلاعات خاصی رو ارسال و دریافت کنیم یعنی نوع اطلاعاتی که قراره بفرستیم هرچیزی بتونه باشه مثل متن…عکس… یا حتی فیلم ..امکانش هست؟
        من هر پروژه ای که تو این زمینه دیدم توش دقیقا داره یه کاره خاصی انجام میشه مثلا اینجا کنترل سروو موتور یا پروژه ی دیگه که گذاشته بودین خاموش روشن شدن ال ای دی یا پروژه های دیگه اما سواله من اینه که اگر بخوایم بسته ی اطلاعاتی که میتونه هرچیزی باشه رو ارسال کنیم این امکان وجود داره؟ چطوری باید توی کد بهش بگم packet رو ارسال و دریافت کنه؟
        خیلی ممنون میشم راهنمایی بفرمایین

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

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

    • پینگ پونگ (فرستنده و گیرنده با یک ماشول) رو ک خواستم درست کنم، اونم فیلد میشد، یه خازن به خروجی۳٫۳ برد سری کردم ، مشکلش حل شد(مشکلش نویز رگلاتور بود فکنم)،
      ولی الان نمیدونم چی کار کنم
      .
      .
      .
      بعد اگه فرستنده رو قطع کنم، گیرنده میفهمه ولی اطلاعات غلطه وقتی وصله!!!!!!!!!

  • سلام مچکرم از راه نماییت
    یه سوال دگه حتماً باید از این اردینو ها استفاده کنم یا با اردینو هایه دگه هم مشه این کار رو کرد مثلاً من یه نانو شو دارم می خواستم ببینم می شه

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

  • بسیار عالی ممنونم
    بعد کلی کار با بیسیک از اول شروع کردن با آردوینو گرچه خیلی امکانات عالی داره ولی تند تند پیشرفتن رو سخت میکنه
    اسباب زحمت من یه برنامه میخوام قسمت فرستنده مقدار ADC رو بخونه روی LCD نمایش بده بعد به گیرنده بفرسته
    برنامه مشابه آماده دارید بهم معرفی کنید
    سرهم کردن کامل کدها بدون ارور کار سختیه

  • سلام
    ممنونم به خاطر اموزش خوب و کاملتون.
    فقط دو سوال دارم:
    ۱- توی دستور radio.openReadingPipe چرا ارگومان اول رو صفر گذاشتید؟ مگه نگفتید تعداد فرستنده ها رو مشخص میکنه

    ۲- توی کلیپی که گذاشتید از چه کلیدی استفاده میکردید که برای هر دستور راهنما میداد و کاملش میکرد؟

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

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

  • با سلام
    من دو تا ماژول nrf24l01 معمولی دارم که تنها وقتی کار میکنند که دستم رو اطراف ماژول نگه دارم یا اینکه به کل پایه ی gnd ماژول رو وصل نکنم!
    به نظرتون مشکلشون چیه؟

  • با سلام و تشکر بابته مطلب
    مدار رو دقیقا به شکل بیان شده بستم ولی چرا واسه من کار نمیکنه؟
    هر کاری کردم درس نشد
    لطفا راهنمایی کنید

  • باسلام و تشکر بابت مطالبی که به صورت رایگان ارائه شده.
    گفتید که با دستور radio.begin() ارتباط فعال میشه حالا اگه بخوایم وسط برنامه این ارتباط قطع شه دستورش چیه؟(لطفا محبت کنید و به ایمیلم بفرستید)

  • سلام… ممنون بابت مطالب مفیدتون.
    میشه توضیح بدین چرا آرایه ی joystick رو بصورت آرایه ی سه تایی استفاده کردین و نه بصورت متغییر ساده. در ضمن چرا سه تا؟؟
    دز ضمن من این مدار رو دقیقا بستم. توی سریال مانیتور failed میزنه و توی هر دو آردوینو فقط ال ای دی چشمک میزنه.

    • درود
      آرایه ی joyStick را به صورت آرایه ی ۲ تایی تعریف کردم نه سه تایی .
      دلیل استفاده از ارایه هم به این دلیل بوده که جوی استیک دارای دو مقدار x و y و اگر بخواهیم هر بار متغیر ارسال کنیم فقط برنامه ی خود را پیچیده تر کرده ایم پس بهتر است با آرایه این کار را انجام دهیم

  • سلام
    من اینو راه انداختم جواب داد روی مدل بدون انتن اما روی انتن دار جواب نمیده!!!!
    رو سالم بودن وصحت سخت افزار هام مطمئنم
    البته اینم بگم روی انتن دار فقط بار اول ارسال میشه و دیگه fail میشه…

  • سلام .ممنون از آموزش های مفیدتون
    من می خوام از دوتا nrf برای دوتا فرستنده و یک nrfبرای یک گیرنده استفاده کنم البته با آردینو.در قسمت گیرنده برای مشخص کردن این که از کدام فرستنده دیتا دریافت شود و در کجا ذخیره شود از چه کد هایی باید استفاده کنم

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

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

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

  • سلام ممنون از اطلاعاتتون میخواستم بدونم ادرس گیرنده رو بر چه اساسی مشخص کردید(rxAddr[6] = “00001)
    من ی سری اطلاعات از sdcard به کامپیوتر میفرستم میخواستم بدونم ادرس گیرنده من که کامپیوتر های متفاوت ممکنه باشه چی بنویسم؟؟؟

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

  • سلام یک سوال ضروری برای خرید
    ماژولnrf24le1 چه فرقی با nrf24l01 داره ؟
    آیا میشه با این آموزش اون ماژول رو راه اندازی کرد ؟
    آیا بی سیم هم میشه راه انداخت با این ماژول ؟
    ممنون

    • با سلام
      ضمن عذرخواهی بابت تاخیر در پاسخگویی، ماژول NRF24LE01 قابلیت برنامه ریزی دارد. یعنی دارای GPIO میباشد و بدون نیاز به برد کمکی میتوان به صورت مستقل روی آن کدها را کامپایل کرد. ولی ماژول NRF24L01 فقط به واسطه یک پردازنده دیگر میتواند راه اندازی شود و به صورت مستقل کارایی ندارد.
      برای راه اندازی با این کدها باید از کتابخانه‌ها و آدرس‌دهی مرتبط با همان ماژول استفاده کنید.

  • سلام ممنون از سایت جامع و کاملتون . یک سوال داشتم . آیا راهی هست که بشه به بیش از ۶ ماژول اطلاعات رو ارسال و دریافت کرد ؟

  • نوع برد رو تو نرم افزار تعقیر دادم ولی منظورتون رو از پین ها نمی فهم
    من از ماژول USB to Serial PL2303 استفاده میکنم و همونطور که می دونید dtr نداره میتونه مشکل از اونجا باشه
    اگه میشه یخورده دربارش توضیح بدین وبگین راه حلش چیه

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

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

    • با سلام
      ضمن تشکر از توجه شما
      ۱- ساختن شیئ در کدهای آردوینو مربوط به قوانین برنامه نویسی ++C می‌باشد.
      ۲- تابع Sizeof جهت مشخص کردن میزان مقادیر ارسالی توسط جوی استیک است که به صورت اتوماتیک اندازه گیری می‌شود.

      • ممنون از پاسخگویی ب موقعتون.
        منظورتون از مقادیر ارسالی توسط تابع sizeof همون مقادیر ۰ تا ۱۰۲۳ هست؟
        ببخشید چون من ب قطعات دسترسی ندارم ک تست کنم وقتتون رو میگیرم.
        فعلا مجبورم تئوری کار کنم.

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

  • سلام . من این ماژول هارو دارم با اردویونو مگا و آنو . همین برنامه رو نوشتم ولی گیرنده چیزی دریافت نمی کنه که به سروو ها بده . ماژول های nrf24L01 رو چک کردم . سالم هستند ولی فرستنده اطلاعات رو از جوی استیک می گیره و میفرسته (تا اینجاش مطمئنم چون با سریال مانیتور چکش کردم) ولی اینکه چرا گیرنده نمی گیره هنوز راهی برای حل مشکلش پیدا نکردم . **لطفا کمک کنید.**
    با تشکر از سایت خوبتون.

    • با سلام
      ضمن تشکر از توجه شما، برای این منظور از تغذیه مجزا برای nrf استفاده کنید. همچنین از یک خازن ۱۰۰ میکرو نزدیکی پین تغذیه nrf استفاده کنید.

      • سلام و خسته نباشید.
        مشکلی که من با nrf خودم دارم اینه که با اینکه تغذیه هر دو ماژولم رو به ۳٫۳ ولت ثابت وصل کردم ولی هر کاری میکنم هیچ کدوم از ماژول ها دریافت نمیکنند(ماژول ها ارسال میکنن ولی دریافت نمیکنند.)…
        ممنون میشم اگه راهنمایی کنید

  • سلام
    از انجایی که گفتین این ماژول رگولاتور داخلی داره
    یعنی میشه به تغذیه ۵ ولت هم وصلش کرد یا نه؟؟؟

      • من یک عدد ماژول +NRF24L01 ویک عدد NRF24L01+PA+LAN میخاهم تهیه کنم
        آیا این دو نوع ماژول برای هواپیما کنترلی کاربرد داره
        از ماژول اول بعنوان گیرنده و از ماژول دوم هم بعنوان فرستنده میخام استفاده کنم.

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

  • با عرض سلام وخدا قوت
    میشه ماژول ها هم فرستنده باشن هم گیرنده یعنی سیستم اول اطلاعات رو بفرسته سیستم دو دریافت کنه و باتوجه به چیزی که دریافت کرده اطلاعات بفرسته و سیتم اول دریافت کنه به طور کلی میشه نقل و انتقال داده دو طرفه داشت .
    سوال دیگه اینکه آردوینورو میشه تو ووید لوپ ورودی و خروجی پین هاشو مشخص کرد.یعنی مثلا پین ۱۱ اول برنامه خروجی باشه و وسط برنامه ورودی .