ارتباط بی سیم بین دو آردوینو با ماژول NRF24L01
محتویات
در بعضی از پروژه ها، سنسور و آردوینو در محیطی قرار میگیرند که رفتن به آنجا و خواندن آن مقادیر سخت و گاهی نا ممکن است. به عنوان مثال جایی خطرناک یا جایی که امکان انتقال سیم وجود ندارد. در این چنین شرایط هایی ما باید داده ها را از طریق ارتباط بی سیم به مکانی دیگر منتقل کنیم.
برای این آموزش، ما از یک سنسور فشار و دما BMP280 متصل به یک آردوینو استفاده می کنیم و سپس از یک ماژول رادیویی 2.4 گیگاهرتز استفاده میکنیم تا داده ها را به آردوینو دوم که یک ماژول رادیویی 2.4 گیگاهرتز دیگر به آن متصل است در فاصله ای دورتر منتقل کنیم. این فاصله با توجه به دیوارهای بین آن باید کمتر از حدود 50 متر باشد.
در این پروژه یک آردوینو از طریق ارتباط I2C به BMP280 متصل است و NRF24L01 از طریق SPI به آن متصل است. در این قسمت داده های فشار و دما از سنسور به آردوینو داده میشود و سپس از طریق ماژول رادیویی به آردوینو دیگر فرستاده میشود. آردوینو دیگر با استفاده از ماژول رادیویی داده ها را دریافت میکند و روی سریال مانیتور نمایش میدهد. شما میتوانید از ال سی دی نیز استفاده کنید تا داده ها را روی آن نشان دهید. ماژول رادیویی NRF24L01 دو طرفه است یعنی هم میتواند چیزی را بفرستد و هم دریافت کند.
ماژول فشار سنج BMP280
محدوده فشار 300hPa تا 1100hPa را اندازه گیری میکند که حدود 10 متر زیر سطح دریا تا ارتفاع 9 کیلومتر است. بین 950hPa و 1050hPa، دقت ارتفاع +/-1m است که بسیار عالی است. در برخی از ماژول ها، آدرس I2C 0x77 و در برخی دیگر، 0x76 است.
جدول زیر اتصالات بین ماژول فشار سنج BMP280 با آردوینو را نشان میدهد.
BMP280 | Uno |
VCC | 3.3V |
GND | GND |
SCL | A5 |
SDA | A4 |
CSB | استفاده نمیشود |
SDD | استفاده نمیشود |
ماژول رادیویی NRF24L01
NRF24L01 یک گیرنده و فرستنده رادیویی است که با پروتکل SPI کار میکند. این ماژول محبوب قادر به ارسال و دریافت داده در باند ISM 2.4 گیگاهرتز است (ISM مخفف عبارت Industrial, Scientific & Medical) است. این همان باندی است که توسط بلوتوث و وای فای استفاده می شود و نیازی به مجوز ندارد زیرا کم مصرف است.
اتصالات بین آردوینو و ماژول رادیویی NRF در جدول زیر آورده شده است.
NRF24L01 | Uno |
VCC | 3.3V |
GND | GND |
MOSI | 11 |
MISO | 12 |
SCK | 13 |
CE | 9 |
CSN | 8 |
IRQ | استفاده نمیشود |
مدار اتصال دو آردوینو بیسیم
اینها قطعاتی هستند که برای ساختن نمونه پروژه زیر نیاز دارید:
- 2 * آردوینو Uno
- 2 * ماژول فرستنده گیرنده NRF24L01
- سنسور فشار سنج BMP280
- برد بورد
- سیم های جامپر
هنگامی که قطعات را در اختیار دارید، همه چیز را به دنبال شماتیک زیر متصل کنید.
نصب کتابخانه ها
چند کتابخانه مورد نیاز است:
- #include <SPI.h>
- #include <nRF24L01.h>
- #include <RF24.h>
- #include <Adafruit_BMP280.h>
نکاتی در مورد کد
- تابع sizeof() اندازه متغیر را تشخیص میدهد.
- شما باید یک نوع داده را ارسال و دریافت کنید.
- بیشتر از ظرفیت هر متغیر در آن نریزید.
- اگر از یک آرایه استفاده میکنید، میتوانید چندین قطعه داده را در یک پیام ارسال کنید به شرط اینکه از محدودیت 32 بایت عبور نکنید. شما می توانید هر نوع داده ای مانند رشته کاراکتر، اعداد صحیح یا اعداد اعشاری را ارسال کنید. فقط مطمئن شوید که گیرنده انتظار دارد همان نوع داده را بگیرد. در مثال ما، چون 3 مقدار اعشاری می خواهیم، از یک آرایه دارای 3 داده اعشاری استفاده می کنیم. حداکثر طول یک پیام 32 بایت است. بنابراین 3 عدد اعشاری به 12 بایت نیاز دارند که فضای زیادی را اشغال نمیکند.
- تمام پین ها به جز CE و CSN باید همانطور که در جدول ها داده شده سیم کشی شوند.
جهت کسب اطلاعات بیشتر، مقاله متغیر های آردوینو را مشاهده کنید.
کد آردوینو Master برای ارسال بی سیم داده ها
کد کامل در فایل دانلودی انتهای صفحه قرار داده شده است. در اینجا قسمت های مهم کد را توضیح میدهیم.
float QNH = 1022.67;
کلمه QNH یک اصطلاح هوانوردی است. این یک ضریب تصحیح است که وقتی روی یک ارتفاع سنج اعمال می شود، به آن اجازه می دهد تا ارتفاع بالاتر از سطح دریا را در مکان فعلی به دقت بخواند.nrf.openWritingPipe(linkAddress);
یکی از 125 کانال را آغاز می کند. فرستنده و گیرنده باید آدرس یکسانی داشته باشند.nrf.setPALevel(RF24_PA_HIGH);
سطح توان فرستنده را تنظیم می کند. اگر برق 3.3 ولتی شما از طریق سیم های بلند باشد، ممکن است باعث مشکلات ناپایداری شود. بهتر است یک خازن 100uF در مسیر آن قرار دهید.nrf.stopListening();
به ماژول می گوید که به عنوان یک فرستنده رفتار کند و برعکس،nrf.startListening();
به آن می گوید که مانند یک گیرنده رفتار کند.- داده هایی که قرار است ارسال شوند روی سریال مانیتور چاپ می شوند (در صورت اتصال) و همچنین به گیرنده ارسال می شوند. خطوط
Serial.write(0xC2); Serial.write(0xB0);
یک علامت درجه را به مانیتور سریال ارسال میکند. اگر از LCD استفاده می کنید، می توانید این کار را باlcd.print((char) 223);
انجام دهید. nrf.write(data, sizeof(data));
محتویات آرایه داده را منتقل می کند. توجه داشته باشید که ماژول باید بداند چند بایت ارسال می شود و sizeof() آن مقدار را اعلام میکند.
کد آردوینو برای Slave گیرنده داده ها
بیشتر کدها بسیار شبیه به کد Master هستند، اما nrf.openReadingPipe(0, linkAddress);
یکی از 6 خط را راه اندازی می کند. فرستنده و گیرنده باید آدرس یکسانی داشته باشند. توجه داشته باشید که در اینجا یک پارامتر اضافی وجود دارد که تعیین می کند کدام خط برای خواندن استفاده می شود.
اگر همه چیز به درستی سیمکشی شده باشد، پنجره سریال مانیتور آردوینو گیرنده باید موارد زیر را نشان دهد:
اگر سوالی دارید یا در تنظیمات این پروژه مشکل دارید، حتماً در زیر نظر بگذارید.
موارد موجود در فایل : فایل سورس کامل
برای دانلود فایل ها باید حساب کاربری داشته باشید ثبت نام / ورود
سلام
میتونیم کد nrf.write یا nrf.read رو به صورت زیر بنویسیم:
radio.read(&x, sizeof(1023);
من دارم یک ماشین کنترلی میسازم که در قسمت مستر جوی استیک داره تا بتونم موتور های قسمت اسلیو رو کنترل کنم.
در قسمت اسلیو باید در برنامه نویسی بگم که اگر مقدار x در جوی استیک 1023 باشه ماشین بره سمت راست.با کد زیر میتونم اینکار رو انجام بدم:
if(radio.read(&x, sizeof(1023))){
digitalWrite(l1,HIGH)
digitalWrite(l1LOW)
digitalWrite(l1,LOW)
digitalWrite(l1,HIGH)
digitalwrite ها برای حرکت موتور به راست هستن.
لطفا بگید درسته یا نه.
سلام عزیز
اشتباه هست
در انجمن یک موضوع ایجاد کنید بهتر میتوانیم بررسی کنیم.
سلام وقتتون بخیر چرا در قسمت سریال مانیتور علامت سوال نمایش میده؟
سلام عزیز
باود ریت را درست تنظیم کردید؟
ریت خوانش اطلاعات در داخل ide رو از طریق تنظیمات درست کن .
میتوانیم روی یک برداردویینو همزمان ماژول لمسی وماژول پخش فایل صوتی نصب کنیم؟
سلام عزیز
بله
اگر بخواهیم بین اردوینو و برد ویرو که سنسور لمسی رو آن لحیم کردیم ارتباط برقرار کنیم باید چکارکنیم؟
سلام عزیز
اگر میخواهید ارتباط از طریق NRF باشد باید از دو برد آردوینو استفاده کنید. برای یادگیری برنامه نویسی آردوینو میتونید دوره آردوینو را مشاهده کنید
سلام ببخشید یه سوال دیگه داشتم
اگر از طرف ای ماژول به صورت بی سیم
2عدد موتور را سرعتشان را کنترل کنم
و هر دو تا رو با 2 ماژول جوی استیک کنترل کنم
با یکی از ماژول ها سرعت هر دو تا را افزایش دهم
و با اون یکی ماژول سرعت یکی از آنها را کاهش دهم
آیا میشه اولین متور را با همان سرعت زیاد نگه داشت
و سرعت موتور دوم رو هم پایین آورد
یا نمیشه سرعت موتور دوم را در عالی که اولین فرمان سرعت زیاد بوده
به سرعت کم کاهش داد
سلام عزیز
منظورتون رو متوجه نشدم، اگر طولانی هست در انجمن اعلام کنید.
سلام ببخشید نمیشه هر دو ماژول را هم به عنوان گیرنده و هم به عنوان فرستنده تنظیم کرد
مثلاً من میخوام یه چیزی رو بفرستم و یه چیزی رو دریافت کنم اگه میشه لطف کنید راهنمایی بفرمایید
سلام عزیز
برای ارتباط دو طرفه باید از چهار ماژول استفاده کنید.
و ببخشید اینکه آدرس ها به صورت عدد هست مثل123456789
و در طرف دیگر هم باید همین رو بنویسم
سلام عزیز
بله
nrf.openWritingPipe(linkAddress); //set the address
nrf.openReadingPipe(0, linkAddress); //set the address
مگر اینا آدرس را مشخص نمیکنند
const byte linkAddress[6] = “link1”;
پس این در طرف فرستنده کجا نوشته شده که با هم مچ بشن
ممنون برای آموزش های خوبتون
سلام عزیز
در قسمت void setup کد فرستنده و گیرنده میتونید مشاهده کنید.
سلام ببخشید این قسمت کد را متوجه نشدم میشه راهنمایی بفرمایید ممنون میشم
const byte linkAddress[6] = “link1”;
سلام عزیز
این آدرس هست که در دو سمت نوشته میشه و باید یکسان باشه تا ارتباط بین دو ماژول برقرار بشه. اگر آدرس در دو سمت یکسان نباشه ارتباط برقرار نمیشه
سلام ببخشید ایا این ماژول مثل ماژول sim800lاگر در اتصالات از سیم رشته ای استفاده کنیم عملکر ماژول کاهش میابد یا فرقی نداره؟
سلام وقت بخیر
بهتر هست از سیم خشک استفاده کنید