آموزش آردوینوپروژه های آردوینو

ارتباط بی سیم بین دو آردوینو با ماژول 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 با آردوینو را نشان میدهد.

BMP280 Uno
VCC 3.3V
GND GND
SCL A5
SDA A4
CSB استفاده نمیشود
SDD استفاده نمیشود

ماژول رادیویی NRF24L01

NRF24L01 یک گیرنده و فرستنده رادیویی است که با پروتکل SPI کار میکند. این ماژول محبوب قادر به ارسال و دریافت داده در باند ISM 2.4 گیگاهرتز است (ISM مخفف عبارت Industrial, Scientific & Medical) است. این همان باندی است که توسط بلوتوث و وای فای استفاده می شود و نیازی به مجوز ندارد زیرا کم مصرف است.

ماژول رادیویی NRF24L01 

اتصالات بین آردوینو و ماژول رادیویی NRF در جدول زیر آورده شده است.

NRF24L01 Uno
VCC 3.3V
GND GND
MOSI 11
MISO 12
SCK 13
CE 9
CSN 8
IRQ استفاده نمیشود

مدار اتصال دو آردوینو بیسیم

اینها قطعاتی هستند که برای ساختن نمونه پروژه زیر نیاز دارید:

قطعات مورد نیاز را از فروشگاه قطعات آیرنکس تهیه کنید.

هنگامی که قطعات را در اختیار دارید، همه چیز را به دنبال شماتیک زیر متصل کنید.

مدار اتصال دو آردوینو بیسیم

نصب کتابخانه ها

چند کتابخانه مورد نیاز است:

نکاتی در مورد کد

  • تابع 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 خط را راه اندازی می کند. فرستنده و گیرنده باید آدرس یکسانی داشته باشند. توجه داشته باشید که در اینجا یک پارامتر اضافی وجود دارد که تعیین می کند کدام خط برای خواندن استفاده می شود.

اگر همه چیز به درستی سیم‌کشی شده باشد، پنجره سریال مانیتور آردوینو گیرنده باید موارد زیر را نشان دهد:

کد آردوینو برای Slave گیرنده داده ها

اگر سوالی دارید یا در تنظیمات این پروژه مشکل دارید، حتماً در زیر نظر بگذارید.

موارد موجود در فایل : فایل سورس کامل

4.6 (8 نفر)

برای دریافت مطالب جدید کانال تلگرام یا پیج اینستاگرام ما را دنبال کنید.

محمد رحیمی

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

21 نظر

  1. سلام
    میتونیم کد 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 ها برای حرکت موتور به راست هستن.
    لطفا بگید درسته یا نه.

    1. سلام عزیز
      اشتباه هست
      در انجمن یک موضوع ایجاد کنید بهتر میتوانیم بررسی کنیم.

  2. سلام وقتتون بخیر چرا در قسمت سریال مانیتور علامت سوال نمایش میده؟

    1. سلام عزیز
      باود ریت را درست تنظیم کردید؟

    2. ریت خوانش اطلاعات در داخل ide رو از طریق تنظیمات درست کن .

  3. می‌توانیم روی یک برداردویینو همزمان ماژول لمسی وماژول پخش فایل صوتی نصب کنیم؟

  4. اگر بخواهیم بین اردوینو و برد ویرو که سنسور لمسی رو آن لحیم کردیم ارتباط برقرار کنیم باید چکارکنیم؟

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

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

    1. سلام عزیز
      منظورتون رو متوجه نشدم، اگر طولانی هست در انجمن اعلام کنید.

  6. سلام ببخشید نمیشه هر دو ماژول را هم به عنوان گیرنده و هم به عنوان فرستنده تنظیم کرد
    مثلاً من میخوام یه چیزی رو بفرستم و یه چیزی رو دریافت کنم اگه میشه لطف کنید راهنمایی بفرمایید

    1. سلام عزیز
      برای ارتباط دو طرفه باید از چهار ماژول استفاده کنید.

  7. و ببخشید اینکه آدرس ها به صورت عدد هست مثل123456789
    و در طرف دیگر هم باید همین رو بنویسم

  8. nrf.openWritingPipe(linkAddress); //set the address
    nrf.openReadingPipe(0, linkAddress); //set the address
    مگر اینا آدرس را مشخص نمیکنند
    const byte linkAddress[6] = “link1”;
    پس این در طرف فرستنده کجا نوشته شده که با هم مچ بشن
    ممنون برای آموزش های خوبتون

    1. سلام عزیز
      در قسمت void setup کد فرستنده و گیرنده میتونید مشاهده کنید.

  9. سلام ببخشید این قسمت کد را متوجه نشدم میشه راهنمایی بفرمایید ممنون میشم

    const byte linkAddress[6] = “link1”;

    1. سلام عزیز
      این آدرس هست که در دو سمت نوشته میشه و باید یکسان باشه تا ارتباط بین دو ماژول برقرار بشه. اگر آدرس در دو سمت یکسان نباشه ارتباط برقرار نمیشه

  10. سلام ببخشید ایا این ماژول مثل ماژول sim800lاگر در اتصالات از سیم رشته ای استفاده کنیم عملکر ماژول کاهش میابد یا فرقی نداره؟

    1. سلام وقت بخیر
      بهتر هست از سیم خشک استفاده کنید

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

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *