در این پست از سایت اِمیک, ماژول رادیویی +NRF24L01 را با استفاده از برد آردوینو راه اندازی خواهیم کرد. ما در این پروژه نیاز به دو عدد برد اردوینو داریم که یکی از انها به عنوان فرستنده و دیگری به عنوان گیرنده استفاده می شود. قبلا در این پست ماژول +NRF24L01 را با میکروکنترلر AVR راه اندازی کرده بودم که توضیحات کاملی در مورد این ماژول و پایه های ان و… داده شد که توصیه می کنم مطالعه کنید.
این ماژول یکی از بهترین و مطمئن ترین ماژول های رادیویی برای ارسال و دریافت داده و اطلاعات می باشد که می توان در موارد مختلفی مانند قطعات کامپیوتری وایرلس, هدست های بیسیم, ریموت کنترل ها, اتوماسیون خانگی و غیره از ان استفاده کرد. این ماژول در دو نوع انتن دار و بدون انتن وجود دارد که نوع بدون انتن ان (انتن روی خود برد) برد حدود ۱۰۰ متر دارد و نوع انتن دار بردش بالای ۱۰۰۰ متر است.
قطعات لازم برای راه اندازی ماژول +NRF24L01 شامل دو عدد برد اردوینو که من برد اردوینو UNO و MEGA 2560 داشتم و استفاده کردم شما می تونید از هر نوع برد اردوینو که دارید استفاده کنید, البته دقت کنید که حتما بردتون باید از ارتباط SPI پشتیبانی بکند. همچنین شما نیاز به دو عدد ماژول +NRF24L01 دارید (یکی برای فرستنده و دومی برای گیرنده) و یه سری قطعات دیگه که در ادامه توضیح داده می شود.
برای راه اندازی ماژول +NRF24L01 ما از کتابخانه ان استفاده می کنیم بنابراین لازم است در ابتدا شما کتابخانه این ماژول را به نرم افزار اردوینو اضافه کنید, برای این منظور فایل زیر را دانلود کرده و از حالت Zip خارج کنید (پسورد www.emic.ir) و پوشه RF24-master را به پوشهی libraries موجود در محل نصب برنامه اردوینو اضافه کنید.
کتابخانه راه اندازی ماژول +NRF24L01 :
همانطور که گفته شد ما برای راه اندازی ماژول +NRF24L01 از کتابخانه ان استفاده خواهیم کرد, در ادامه شما با این کتابخانه و توابع ان اشنا خواهید شد و نحوه راه اندازی ماژول +NRF24L01 با استفاده از این کتابخانه را یاد خواهید گرفت.
در ابتدا شما باید کتابخانه های زیر را به ابتدای برنامه خود اضافه کنید:
1 2 3 |
#include<SPI.h> #include<RF24.h> #include<NRF24L01.h> |
در ادامه ما یک شیء از کلاس RF24 به نام radio میسازیم. این شیء دارای دو آرگومان ورودی است که اولین پین CE و دومین پین CSN را مشخص می کند. (می توانید این شماره پین ها را به دلخواه تغییر دهید)
1 |
RF24 radio(9,10 ); |
سپس یک آرایه به نام rxAddr تعریف میکنیم, در این آرایه آدرس گیرنده که اطلاعات برای ان ارسال می شود قرار دارد. (ادرس ارتباط را مشخص می کنیم)
1 |
const byte rxAddr[6] = "00001"; |
دستور زیر باعث فعال شدن ماژول می شود که در تابع setup از ان استفاده می کنیم
1 |
radio.begin(); |
در ماژول +NRF24L01 با هر بار ارسال داده از فرستنده به گیرنده، گیرنده یک ack ایجاد میکند. حال با استفاده از تابع زیر، در صورتی که این ack توسط فرستنده دریافت نشد، فرستنده سعی به ارسال دوباره ی داده میکند. به زبان ساده تر اگر اطلاعات توسط گیرنده دریافت نشود، فرستنده داده ها را دوباره ارسال خواهد کرد.
در آرگومان اول عدد مورد نظر در ۲۵۰ میکرو ثانیه ضرب میشود (حداکثر مقدار برای آرگومان ۱۵ می باشد) و زمان تغییر در هر بار ارسال داده را مشخص میکند. بنابراین در مثال ما اگر گیرنده موفق به دریافت داده ای نشد، فرستنده هر۳۷۵۰ میکرو ثانیه یا هر ۳٫۷۵ میلی ثانیه (۱۵*۲۵۰=۳۷۵۰) سعی به ارسال داده میکند. آرگمان دوم تعداد دفعات سعی برای ارسال داده را مشخص میکند. در این مثال اگر ماژول گیرنده داده ای دریافت نکرد، ماژول فرستنده قبل از متوقف شدن ۱۵ بار برای ارسال مجدد داده تلاش میکند.
1 |
radio.setRetries(15, 15); |
دستور زیر ماژول را به عنوان فرستنده تنظیم می کند و ادرس گیرنده را در ورودی ان وارد می کنیم.(در بالا یک ارایه به نام rxAddr تعریف کردیم که حاوی ادرس گیرنده بود)
1 |
radio.openWritingPipe(rxAddr); |
دستور زیر اطلاعات موجود در متغیر DATA را ارسال می کند و ورودی دوم اندازه ی مقدار ارسالی می باشد که به کمک تابع sizeof به طور اتوماتیک اندازه ی آن را مشخص میکنیم
1 |
radio.write(DATA, sizeof(DATA)); |
دستور زیر ماژول را برای دریافت اطلاعات اماده می کند, این دستور و دستورات پایین مربوط به گیرنده هستند
1 |
radio.startListening(); |
دستور زیر در صورتی که ماژول گیرنده اطلاعاتی دریافت کند برابر یک می شود و در غیر این صورت برابر صفر است
1 |
radio.available() |
دستور زیر دارای دو ارگومان ورودی است که مقدار اول مربوط به تعداد فرستنده هایی است که گیرنده از انها اطلاعات دریافت می کند, توجه کنید که حداکثر از 6 فرستنده می توان به طور همزمان اطلاعات دریافت کرد, در اینجا فقط از ادرس 0 استفاده می شود و ارگومان دوم هم ادرس ارتباط ما میباشد
1 |
radio.openReadingPipe(0, rxAddr); |
دستور زیر اطلاعات را از فرستنده دریافت می کند و درون متغیر DATA می ریزد همانند دستوری که در بالا برای ارسال اطلاعات معرفی کردیم دستور زیر هم در قسمت ورودی دوم ان از تابع sizeof برای محاسبه اتوماتیک اندازه متغیر استفاده شده است
1 |
radio.read(DATA, sizeof(DATA)); |
پروژه آردوینو راه اندازی ماژول NRF24L01 :
در زیر یک پروژه با این ماژول قرار داده شده است که هدف ان اشنایی شما با راه اندازی این ماژول به صورت عملی می باشد, شما می توانید پروژه زیر را با توجه به توضیحات ارائه شده در این پست با توجه به نیاز خود تغییر دهید. عملکرد این پروژه به این صورت است که قسمت فرستنده دارای دو کلید فشاری است و در قسمت گیرنده هم دو عدد LED وجود دارد. با فشار داده هر کدام از کلیدهای فشاری یک LED در قسمت گیرنده روشن می شود, در کلیپی که در انتهای مطلب گذاشته شده است می توانید عملکرد این پروژه را به صورت عملی مشاهده کنید.
پایه های ماژول +NRF24L01 :
همانطور که گفته شد ما در این پروژه برای قسمت فرستنده از برد اردوینو UNO و برای گیرنده از برد اردوینو MEGA 2560 استفاده کرده ایم و همچنین نیاز به دو عدد ماژول +NRF24L01 داریم, پایه های این ماژول در هر دو مدل با انتن و بدون انتن به صورت زیر است :
همانطور که در بالا مشاهده می کنید, تغذیه این ماژول حداکثر ۳٫۳ ولت است و در صورتی که ولتاژ بیشتری به ان اعمال کنید امکان اسیب دیدن ان وجود دارد. بهتره که از برد راه انداز این ماژول هم استفاده کنید که کار رو راحت می کنه و می تونید با ۵ ولت هم ماژول و هم بقیه قطعات پروژه رو تغذیه کنید و خطر اسیب دیدن ماژول با استفاده از برد راه انداز از بین میره. در تصویر زیر یه نمونه از این برد راه انداز را مشاهده می کنید که ماژول +NRF24L01 روی اون نصب میشه و به راحتی میتونید با ۵ ولت تغذیه کنید و در پروژه استفاده کنید. من برای تست این پروژه از این برد راه انداز استفاده کردم که میتونید در اخر مطلب مشاهده کنید
شماتیک فرستنده :
- پین CE <<< 9
- پین CSN <<< 10
- پین MOSI <<< 11
- پین MISO <<< 12
- پین SCK <<<13
شماتیک گیرنده :
برای دیدن تصویر در اندازه بزرگتر ان را ذخیره کنید
- پین CE <<< 48
- پین CSN <<< 49
- پین MISO <<< 50
- پین MOSI <<< 51
- پین SCK <<<52
برنامه فرستنده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
#include <RF24.h> #include <nRF24L01.h> #include <SPI.h> RF24 radio(9, 10); const byte rxAddr[6] = "00001"; int DATA[2]; void setup() { radio.begin(); radio.setRetries(15, 15); radio.openWritingPipe(rxAddr); pinMode(2, INPUT); pinMode(3, INPUT); } void loop() { DATA[0] = digitalRead(2); DATA[1] = digitalRead(3); radio.write(DATA, sizeof(DATA)); delay(100); } |
برنامه گیرنده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
#include <RF24.h> #include <nRF24L01.h> #include <SPI.h> RF24 radio(48, 49); const byte rxAddr[6] = "00001"; int DATA[2]; void setup() { radio.begin(); radio.openReadingPipe(0, rxAddr); radio.startListening(); pinMode(2, OUTPUT); pinMode(3, OUTPUT); } void loop() { while (radio.available()) { radio.read(DATA, sizeof(DATA)); digitalWrite(2, DATA[0]); digitalWrite(3, DATA[1]); } } |
برنامه های فرستنده و گیرنده را در بالا مشاهده می کنید که در ابتدای مطلب در قسمت توضیح کتابخانه NRF24L01 دستورات استفاده شده بطور کامل توضیح داده شده اند. در صورتی که می خواهید از بردهای اردینو دیگری استفاده کنید فقط کافی است در خط 5 برنامه ها پین های CE و CSN را با توجه به برد اردوینو مورد نظر خود به دلخواه تغییر دهید و پایه های ماژول را به پین های مربوط به ارتباط SPI در برد جدید متصل کنید.
- برای اشنایی با دستورات مهم برنامه نویسی اردوینو اینجا کلیک کنید
- برای مشاهده پروژه راه اندازی ماژول NRF24L01 با میکروکنترلر AVR اینجا کلیک کنید
- برای اشنایی با نحوه پروگرام کردن برد اردوینو (ریختن برنامه روی برد) اینجا کلیک کنید
کلیپ تست عملی پروژه :
پسورد فایل زیپ : www.emic.ir
نظر یادتون نره…
سلام این پروژه رو با اردوینو مگا و UNO انجام دادم ولی و ماژول به هم متصل نمی شوند من مدل ارتقا یافته ماژول رو خریداری کردم ممکن به خاطر مدل جدیدش کتابخانه برای این جواب نده ؟
من رفتم یک سایت خارجی یک کتابخانه ای که اون فرد نوشته بود را دانلود کردم و جواب داد و دو ماژول به هم متصل شد ولی به دلیل ضعیف بودن کتابخانه ان نمی خواهم از ان استفاده کنم ایا راه حلی برای مشکل من دارید ؟
ممنون از سایت خوبتون
سلام.برای اتصال به ال سی دی باید چیکار کرد؟مثلا مقدار فاصله رو روی ال سی دی گیرنده داشته باشیم
سلام
در int DATA[2]; اون کروشه و عدد درونش یعنی چی؟
سلام, یک ارایه شامل 2 عضو تعریف کرده ایم
سلام
چطور میتونم به جای led از servo موتور استفاده کنم که مثلا با فشردن کلید سروو از زاویه 0 به 120 بره و با رها کردن آن به صفر برگردد
سلام, قبلا پست اموزش راه اندازی سروو موتور را در سایت قرار دادم شما باید این دو پروژه را با هم ترکیب کنید
»واقعا خیلی متشکرم عالی بود«
سلام توی این کد ها فقط دوتا پین رو میشه فعال و غیر فعال کرد
زمانی که میخوایم این تعداد رو افزایش بدیم کلا میکرو هنگ مینه و هیچ کاری انجام نمیده
انگار ماژول اردینو یا میکرو خاموشه
لطفا بگید چجوری میشه تعداد ورودی و خروجی رو افزایش داد
بغد یه سوال دیگه اینه که میشه زمانی که یه ماژل رو فرستنده در نظر میگیریم یه سری اطلاعات هم دریاف کنه
اگه میشه باید چجوری دستوراتشو بنویسیم
ممنون میشم توضیح بدید
int DATA[4]; از 2 به چهار تغیر بدین
DATA[0] = digitalRead(2);
DATA[1] = digitalRead(3);
DATA[2] = digitalRead(4);
DATA[3] = digitalRead(5);
اینا را هم به دلخواه اضاف نمایید هر تعداد مثلا ما چهار نوشتیم 4 تا خروجی داریم
و تو گیرنده هم اضاف نمایید دقیقا مثل هم
من تست کردم جواب گرفتم
اگر جواب نگرفتید یه جا اشتباه کردید .
سلام ببخشید اگر بخواهیم شبکه ای کار کنیم باید چه تغییری در برنامه بدیم؟
سلام ممنون از آموزش های عالیتون ببخشید میخواستم ببینم میتوانید با اردینو و ماژول nrfپروژه کنترل 4عدد ال ای دی از راه دور را بزارید که بتوانم با 4ولوم بصورت بیسیم نور ال ای دی ها را کنترل کرد
سلام, در اینده اگر وقت شد حتما انجام میدم
سلام
ممنون از آموزشای خوبتون
ایا میشه با برد اردوینو و node mcu این رو ساخت ؟
سلام, در مورد برد Nodemcu اطلاع زیادی ندارم ولی تا اونجایی که می دونم یک برد برای ارتباط وای فای بر اساس ESP8266 هست و راه اندازیش با ماژول های رادیویی تفاوت داره. البته به زودی اموزش راه اندازی ماژول ESP8266 را در سایت قرار خواهم داد
سلام ممنون بابت راهنماییتون.برای استفاده چند فرستنده چه باید گرد؟
با دیتای مختلف
سلام
ممنون از اموزش خوبتون
خط 18 و 19 فرستنده میخوام به جاش یه سنسور بزارم که اگه مقدار سنسورم 0 بود 0 رو ارسال کنه
و اگر مقدار سنسورم 1 بود 1رو ارسال کنه
یه راهنمایی کنید ممنون میشم
سلام, فقط کافیه که خروجی دیجیتال سنسورتون را به عنوان مثال به پایه 2 اردوینو بجای کلید متصل کنید و اون یکی کلید را هم اگر نیاز ندارید حذف کنید
سلام ببخشید چطور میشه آدرس فرستنده رو تغییر داد
سلام
ممنون از این پروژه ای که توضیح دادین . فقط یک سوال و اون هم اینکه وقتی ما یک فرمان به گیرنده بفرستیم و همزمان ماژول فرستنده رو خاموش کنیم آخرین دستور داخل گیرنده میمونه و فقط تنها راحش ریست آردوینویی هست که در ماژول گیرنده قرار داره .
لطفا در مورد رفع عیب این ایراد راه حلی دارین ؟
سلام
اگر بخواهیم بجای ال ای دی یک موتور سروو بزازیم که با فشردن کلید سروو زاویه 120 بگیره باید چطور کدشو بنویسیم
سلام
من خیلی دتبال کتابخانه nrf برای proteus گشتم ولی چیز خوبی گیرم نیومد میشه کتابخونه ای که ازش تو تصویر بالا استفاده کردید رو معرفی کنید ؟
من خیلی لازم دارم
مرسی
سلام, از پین هدر 2*4 استفاده کردم. می تونید از کتابخانه connectors در پروتئوس انوع ان را مشاهده کنید
فقط برای ترسیم شماتیک و برد مدار چاپی میتونید ازش استفاده کنید، اما برای کد نویسی پیشنهادم اینه که برای رفع عیب و یا بررسی نتایج، داده های ارسالی و دریافتی رو روی پنجره سریال ادیتور آردوینو (IDE) بررسی کنید . کافیه تنظیمات سریال و دستور ارسال هر داده ای رو که میخواید وضعیتش رو بدونید به برنامتون اضافه کنید .
سلام
با آردوینو unoو مینی می شه درستش کرد ؟
سلام, بله میشه