آموزش راه اندازی ماژول فرستنده و گیرنده +NRF24L01 با آردوينو

پروژه نحوه كار ماژول nRF24L01 +و اتصال آن به آردوينو

ارتباط بيسيم دو يا چند برد آردوينو در بسياري از كاربرد‌هاي صنعتي نظير مانيتور كردن داده سنسور‌ها، كنترل ربات‌ها، اتوماسيون خانگي و … مورد نياز خواهد بود. يك راه حل ارزان قيمت و مطمئن براي ايجاد ارتباط RF دو طرفه استفاده از ماژول +nRF24L01 که یک ماژول فرستنده-گیرنده تولید شرکت Nordic Semiconductor است.

ماژول فرستنده-گيرنده +NRF24L01  يكي از ارزان قيمت‌ترين گزينه‌ها براي ايجاد ارتباط داده محسوب مي‌شود. به علاوه، اين ماژول‌ها معمولا داراي ابعاد فيزيكي كوچكي بوده و بدين ترتيب امكان ايجاد ارتباط بيسيم در بسياري از پروژه‌ها را براحتي فراهم مي‌كند.

معرفي سخت افزار ماژول +NRF24L01

فركانس راديويي

ماژول فرستنده-گيرنده +NRF24L01 در باند فركانسي ISM 2.4 GHZ  كار مي‌كند و براي انتقال داده از مدولاسیون GFSK استفاده مي‌كند. نرخ انتقال داده مي‌تواند يكي از مقادير 250kbps، 1Mbps يا 2Mbps انتخاب شود.

  نکته  : باند فركانسي 2.4GHz ISM : باند 2.4GHz يكي از باند‌هاي فركانسي صنعتي، علمي و پزشكي (ISM) بوده كه بصورت بين‌المللي براي استفاده تجهيزات بدون مجوز كم توان رزرو شده است. به عنوان مثال؛ تلفن‌هاي همراه، وسايل مبتني بر بلوتوث، تجهيزات NFC و شبكه‌هاي كامپيوتري بيسيم (wifi) همگي از فركانس‌هاي ISM استفاده مي‌كنند.

توان مصرفي

ولتاژ كاري ماژول بين1.9 ولت تا 6.3 ولت است اما خبر خوب اين است كه پين‌هاي منطقي تحمل ولتاژ منطقي 5 ولتي را نيز دارند. بنابراين مي‌توان اين ماژول را بدون نياز به مبدل سطح ولتاژ به آردوينو يا هر ميكروكنترلر ديگر با منطق 5 ولت متصل نمود.

اين ماژول از توان خروجي قابل برنامه ريزي 0dBm ، -6dBm، -12dBm, -18dBm پشتيباني مي‌كند و به طرز غير قابل باوري براي انتقال داده 12 ميلي آمپر جريان در 0dBm را مصرف مي‌كند كه حتي از توان مصرفي يك LED نيز كمتر است. همچنين، در مد خاموشي جريان 900nA و در مد آماده بكار (stand-by) فقط 26 ميكروآمپر جريان الكتريكي مي‌كشد. به همین دليل بكارگيري اين ماژول در وسايل بيسيم براي پروژه‌هاي با توان الكتريكي پايين رو به گسترش است.

واسط SPI

ماژول +nRF24L01 از طريق يك واسط سريال SPI چهار پين ارتباط داده را با حداكثر نرخ 10Mbps برقرار مي‌كند. با استفاده از اين واسط كليه پارامتر‌ها نظير كانال فركانسي (125 كانال فركانسي قابل انتخاب است)، توان خروجي (0dBm ،  -6 dBm، -12 dBm , -18 dBm) و نرخ انتقال داده (250kbps، 1Mbps / 2Mbps) قابل تنظيم مي‌باشد.

باس SPI از مفهوم Master و Slave استفاده مي‌كند. آردوينو در اغلب كاربرد‌ها به عنوان master و ماژول فرستنده-گيرنده +nRF24L01 به عنوان slave تعريف مي‌شوند. بر خلاف باس I2C، تعداد slave‌ها بر روي باس SPI محدود است. بر روي آردوينو Uno حداكثر دو slave يعني حداکثر دو ماژول فرستنده-گيرنده +nRF24L01 را مي‌توان استفاده نمود.

مشخصات كامل به شرح زير است:

  
رنج فركانسيباند 2.4 GHz ISM
ماكزيمم نرخ انتقال هوايي داده (Air Data Rate)2 Mb/s
مدولاسيونGFSK
بیشترین توان خروجي0 dBm
ولتاژ كاري1.9V to 3.6V
بیشترین جريان عملياتي13.5mA
کمترین جريان (مد Standby)26µA
ورودي‌هاي منطقي5V Tolerant
رنج انتقال داده800 متر بصورت مستقيم

مقايسه ماژول بيسيم +NRF24L01 با ماژول  PA/LNA+nRF24L01

انواع مختلفي از ماژول‌هاي مبتني بر چیپ +nRF24L01 وجود دارد. در ادامه متداولترين اين ماژول‌ها معرفي مي‌شود.

ماژول فرستنده بیسیم nRF24L01+

نمونه اول از يك آنتن on-board استفاده مي‌كند كه بدين وسيله امكان طراحي و ساخت برد با اندازه كوچكتر را فراهم مي‌كند. هرچند، به دليل اندازه كوچكتر آنتن، طبيعتا رنج ارتباطي ماژول محدودتر خواهد بود. با استفاده از اين برد، حداكثر رنج ارتباط در حدود 100 متر خواهد بود كه البته اين مسافت براي كاربرد‌هاي فضای باز یا outdoor است و در فضا‌هاي داخلي به دليل وجود ديوار و … رنج ارتباطي، اندكي كاهش خواهد يافت.

فرستنده بیسیم ماژول nRF24L01  - آنتن خارجی PA-LNA

نمونه دوم اين ماژول‌ها داراي يك كانكتور SMA و يك آنتن duck است اما در حقيقت تفاوت زيادي به لحاظ سخت افزاري ندارد! تنها تفاوت اين ماژول اين است كه داراي چيپ RFX2401C بوده كه شامل مدار سوئيچينگ فرستنده-گيرنده، PA و LNA است. اين چيپ با كمك آنتن duck سبب افزايش قابل توجه رنج ارتباطي ماژول تا حد 1000 متر شده است.

PA و  LNA چيست؟

PA یا Power Amplifier به معناي تقويت كننده توان است. توان سيگنال ارسالي +NRF24L01 به وسيله PA افزايش داده مي‌شود. LNA یا Low-Noise Amplifier به معنای تقويت كننده سیگنال های ضعیف است. كار LNA اين است كه سيگنال ضعيف و نامطمئن را از آنتن دريافت كرده (در حد چند ميكروولت يا (100dBm- و آن را به سطح بهتري تقويت مي‌كند (معمولا در حد 5/0 تا يك ولت).

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

بلوک دیاگرام تقویت کننده سیگنالهای ضعیف و توان PA-LNA ماژول nRF24L01



  به اين مفهوم علي رغم تفاوت‌هايي كه ذكر شد، اين دو ماژول داراي قابليت سازگاري drop-in هستند. به اين مفهوم كه اگر شما در يك پروژه از يكي از اين ماژول‌ها استفاده كرده باشيد، بسادگي مي‌توانيد آن ماژول را بيرون آورده و بدون نياز به هيچگونه تغييري با ماژول ديگر جايگزين نمائيد.

نحوه كار ماژول +nRF24L01

فركانس كانال RF

ماژول فرستنده-گيرنده +nRF24L01 در يك فركانس خاصي كه كانال ناميده مي‌شود، داده را دريافت و ارسال مي‌كند. براي اينكه دو ماژول فرستنده-گيرنده با يكديگر بتوانند ارتباط داده داشته باشند لازم است در يك كانال يكسان باشند. اين كانال مي‌تواند هر فركانسي در باند 2.4GHz ISM يا به عبارت دقيق تر فركانسي در بازه‌ي 2.4GHz تا 2.525GHz باشد.

هر كانال پهناي باندي كمتر از 1MHz اشغال مي‌كند و بر اين اساس تعداد 125 كانال مختلف وجود خواهد داشت. بنابراين يك ماژول مي‌تواند از 125 كانال مختلف براي ارتباط داده استفاده كند. در نتيجه، در يك فضاي مكاني مي‌توان شبكه اي از 125 مودم مستقل بكارگيري نمود.

ماژول فرستنده-گيرنده+nRF24L01 در يك فركانس خاصي كه كانال ناميده مي‌شود، داده را دريافت و ارسال مي‌كند.

  با نرخ تبادل هوايي داده 250kbps و 1Mbps هر كانال پهناي باندي كمتر از 1MHz اشغال مي‌كند. هر چند، در نرخ تبادل داده 2Mbps پهناي باند 2MHz اشغال خواهد شد (پهناي باندي وسيعتر از رزولوشن فركانس كانال RF). لذا، براي اطمينان از عدم همپوشاني كانا‌ل‌ها و كاهش تداخل در نرخ 2Mbps بايد براي بين هر دو كانال يك فاصله 2MHz را در نظر گرفت.

فركانس كانال RF انتخابي بر اساس رابطه زير تعيين مي‌شود:

FreqSelected=2400+CHSelected

به عنوان مثال اگر كانال RF شماره 108 را براي تبادل داده انتخاب كنيم، فركانس اين كانال 2508MHZ خواهد بود. (2400+108).

شبكه +Multiceiver nRF24L01

nRF24L01 يك ويژگي به نام Multiceiver  دارد كه به مفهوم “چند ارسال كننده-يك دريافت كننده” مي‌باشد. هر كانال RF بصورت منطقي به 6 كانال موازي به نام شريان داده (data pipe) تقسيم بندي مي‌شود. به عبارت ديگر، يك شريان داده بصورت يك كانال منطقي در كانال فيزيكي RF مي‌باشد. هر شريان داده آدرس فيزيكي منحصر به فرد خود را دارد كه مي‌توان آن را پيكربندي نمود. اين مسئله در شكل زير نشان داده شده است.

ماژول nRF24L01 يك ويژگي به نام Multiceiver  دارد كه به مفهوم “چند ارسال كننده-يك دريافت كننده” مي‌باشد.

براي ساده سازي دياگرام فوق، تصور كنيد كه گيرنده اصلي به عنوان يك ‌هاب دريافت كننده بطور همزمان اطلاعات 6 نود ارسال كننده را دريافت مي‌كند. اين ‌هاب دريافت كننده در هر زماني مي‌تواند دريافت اطلاعات را متوقف و به عنوان يك ارسال كننده عمل كند. البته اين ارسال داده در هر زمان فقط براي يك نود يا شريان قابل انجام است.

پروتكل Enhanced ShockBurst

ماژول فرستنده-گيرنده +nRF24L01 از يك ساختار بسته داده اي استفاده مي‌كند كه Enhanced ShockBurst ناميده مي‌شود. اين ساختار داراي 5 بخش مختلف است كه در شكل زير نشان داده شده اند.

استفاده از ساختار بسته داده اي Enhanced ShockBurst كه داراي 5 بخش مختلف است.

ساختار اصلي ShockBurst فقط شامل بخش‌هاي Preamble، Address، Payload و افزونگي CRC است. براي افزايش قابليت‌هاي ارتباطي، Enhanced ShockBurst داراي يك بخش جديد به نام بخش كنترل بسته داده (PCF) است. اين ساختار جديد به چند دليل داراي مزيت است. اولا، در اين ساختار payload با طول متغير (از 1 تا 32 بايت) امكان پذير است. دوما، در اين ساختار هر بسته داده ارسالي داراي يك ID خواهد بود. در نتيجه وسايل گيرنده مي‌توانند بفهمند كه آيا داده اي كه دريافت نموده‌اند جديد است يا اينكه اين داده قبلا ارسال شده است و مي‌توانند آن را به عنوان يك داده تكراري فراموش كنند. نهايتا، مهمترين مزيت اين است كه در اين ساختار ، امکان ارسال پيام تائيد (acknowledgement) پس از دریافت پیام توسط گیرنده وجود دارد.

مديريت اتوماتيك بسته‌هاي داده در +nRF24L01

براي درك بهتر نحوه تبادل داده دو ماژول +nRF24L01 در اين جا سه سناريو در نظر گرفته مي‌شود.

  • سناريوي اول: انتقال داده با دريافت پيام تشكر (ACK) و اعمال وقفه. اين مثالي از يك سناريو موفق است. فرستنده يك بسته داده براي گيرنده ارسال مي‌كند. هنگامي كه كل بسته داده ارسال شد، فرستنده به مدت حدودا 130 ميكروثانيه براي دريافت پيام تشكر (ACK) منتظر باقي مي‌ماند. پس از دريافت بسته داده توسط گيرنده يك پيام ACK براي فرستنده (به عنوان تائيد دريافت پيام) ارسال مي‌شود. به محض اينكه فرستنده پيام ACK را دريافت كند، يك سيگنال وقفه IRQ صادر مي‌شود كه نشان دهنده آماده بودن داده جديد است.
انتقال داده با دريافت پيام تشكر (ACK) و اعمال وقفه

  • سناريوی دوم: انتقال داده در حالتي كه بسته داده ارسالي گم مي‌شود. اين مثالي از يك سناريو ناموفق است كه در آن ارسال دوباره داده نياز خواهد بود. پس از ارسال داده، فرستنده منتظر دريافت پيام ACK مي‌ماند. اگر در طي مدت زمان مشخصي كه زمان تاخير ارسال مجدد اتوماتيك (ARD) ناميده مي‌شود، پيام ACK توسط فرستنده دريافت نشود، بسته داده مجددا ارسال خواهد شد. به محض دريافت بسته داده توسط گيرنده، پيام ACK براي فرستنده ارسال خواهد شد و در نتيجه يك وقفه در فرستنده ايجاد مي‌شود.
انتقال داده در حالتي كه بسته داده ارسالي گم مي‌شود.

  • سناريوی سوم: انتقال داده در حالتي كه بسته داده پيام تشكر گم شود. اين نيز مثالي از يك سناريو ناموفق است كه در آن به دليل گم شدن پيام تشكر ACK، ارسال دوباره داده نياز خواهد بود. در اينجا حتي اگر ارسال بسته داده از فرستنده به گيرنده به درستي تكميل شده باشد، به دليل عدم دريافت پيام تشكر، فرستنده فكر مي‌كند كه پيام به درستي به مقصد نرسيده است و لذا پس از سپري شدن مدت زمان ARD، مجددا اقدام به ارسال بسته داده به گيرنده خواهد كرد. گيرنده وقتي پيام تكراري با ID مشابه پيام قبلي دريافت مي‌كند، آن را فرامش مي‌كند و مجددا يك پيام تشكر ACK براي فرستنده ارسال مي‌كند.
انتقال داده در حالتي كه بسته داده پيام تشكر گم شود.

سه سناريوي بالا همه آن چيزي بود كه +nRF24L01 براي مديريت ارسال اتوماتيك داده و بدون كمك ميكروكنترلر انجام مي‌دهد.

پين‌هاي ماژول فرستنده-گيرنده و +nRF24L01

در ابتدا نگاهي به پين‌هاي هردو نوع ماژول مبتني بر +nRF24L01 (ماژول داراي آنتن duck و ماژول با آنتن on-board) خواهيم داشت:

پين‌هاي ماژول nRF24L01+
پین های ماژول nRF24L01+ PA-LNA
  • GND پين زمين ماژول است كه بر روي برد ماژول معمولا با يك مربع در دور آن قابل تشخيص است.
  • VCC پين تغذیه الكتريكي برد ماژول را تامين مي‌كند كه مقدار آن از 1.9 تا 3.9 ولت مي‌تواند در نظر گرفته شود. شما مي‌توانيد اين پين را به پين 3.3 ولت آردوينو متصل كنيد. لازم به ذكر است كه اتصال پين VCC ماژول به 5 ولت آردوينو ممكن است سبب آسيب دیدن ماژول +nRF24L01 شود.
  • CE پين فعال ساز ماژول و بصورت Active-High است. اعمال منطق High به اين پين سبب فعال شدن ماژول شده و بسته به اينكه در چه مد كاري باشد اقدام به ارسال يا دريافت داده مي‌كند.
  • CSN پين عدم انتخاب ماژول و بصورت active-Low است كه در حال عادي به آن منطق High اعمال مي‌شود. هنگامي كه منطق Low به آن اعمال شود، +nRF24L01 منتظر داده بر روي باس SPI مربوطه و پردازش آن خواهد بود.
  • SCK  كه پالس ساعت توليدي Master باس SPI به آن اعمال مي‌شود.
  • MOSI ورودي SPI به +nRF24L01 است.
  • MISO خروجي SPI از +nRF24L01 است.
  • IRQ پين وقفه است كه در موقعي كه داده‌اي براي پردازش آماده شده باشد، از طريق آن يك هشدار به Master اطلاع رساني مي‌شود.

برای اتصال ماژول به آردوینو و راه اندازی آن یکسری قطعات لازم است که در ادامه به توضیح آن می پردازیم.

قطعات مورد نیاز

نحوه اتصال ماژول فرستنده-گيرنده +nRF24L01 به آردوينو

اكنون كه با نحوه كار ماژول +nRF24L01 آشنا شديم، نحوه اتصال آن به آردوينو توضيح داده مي‌شود. براي شروع، پين‌هاي VCC و GND ماژول را به ترتيب به زمين و خروجي 3.3 ولت آردوينو متصل مي‌كنيم. پين‌هاي CSN و CE ماژول را مي‌توان به هر پين ديجيتال آردوينو متصل نمود كه در اينجا ما آن‌ها را به ترتيب به پين ديجيتال شماره 8 و 9 آردوينو وصل مي‌كنيم. بدين ترتيب، فقط اتصال پين‌هاي مربوط به ارتباط SPI باقي خواهد ماند.

از آنجا كه ماژول فرستنده-گيرنده +nRF24L01 به تبادل داده زيادي نياز دارد، براي افزايش كارايي ماژول بهتر است آن را به پين‌هاي SPI سخت افزاري ميكروكنترلر متصل كنيم. پين‌هاي SPI سخت افزاري بسيار سريعتر از ‘bit-banging’ كد‌هاي نرم افزاري واسط خواهند بود.

دقت شود كه هر برد آردوينو داراي پين‌هاي SPI مختلفي است كه بايد به درستي متصل شوند. در برد‌هاي آردوينو نظير UNO/Nano V3.0 اين پين‌ها عبارتند از پين ديجيتال شماره 13 (SCK)، پين شماره 12 (MISO) و پين شماره 11 (MOSI). در برد Mega اين پين‌ها به اين صورت متفاوت خواهند بود: پين ديجيتال شماره 50 (MISO)، پين شماره 51 (MOSI)، پين شماره 52 (SCK) و پين شماره 53 (SS).  براي درك سريعتر به جدول زير نگاه كنيد.

 MOSIMISOSCK
Arduino Uno111213
Arduino Nano111213
Arduino Mega515052

در صورتيكه برد آردوينويي به غير از سه مدل بالا استفاده مي‌كنيد، توصيه مي‌شود كه اطلاعات مربوط به پين‌هاي آن را بررسی كنيد.

اتصال +nRF24L01 به آردوینو

دقت شود كه شما نياز به دو مدار سخت افزاري داريد. يكي به عنوان فرستنده و ديگري به عنوان گيرنده كه البته نحوه سيم كشي سخت افزاري هر دو يكسان خواهد بود.

كتابخانه RF24 آردوينو براي ماژول +nRF24L01

براي اتصال ماژول فرستنده-گيرنده +nRf24L01 به آردوينو خوشبختانه چندين كتابخانه وجود دارد كه يكي از معروفترين آن‌ها كتابخانه RF24 است. اين كتابخانه از ساليان قبل توسعه داده شده و براي كاربران مبتدي براحتي قابل استفاده است. هرچند، كماكان مورد استفاده كاربران حرفه‌اي آردوينو نيز است. آخرين نسخه اين كتابخانه از RF24 GitHub را می‌توانید از لینک زیر دانلود کنید:

Title of the document دانلود کتابخانه RF24


براي استفاده و نصب اين كتابخانه كافيست نرم‌افزار IDE آردوينو را اجرا كنيد و مسير Sketch > Include Library > Add .ZIP Library را دنبال نموده و فايل RF24-master را كه قبلا دانلود كرده‌ايد را انتخاب كنيد.

كد آردوينو فرستنده

در اين مثال مي‌خواهيم پيام “Hello World”را توسط فرستنده براي يك گيرنده ارسال كنيم. كد فرستنده به شكل زير است:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  radio.begin();
  
  //set the address
  radio.openWritingPipe(address);
  
  //Set module as transmitter
  radio.stopListening();
}
void loop()
{
  //Send message to receiver
  const char text[] = "Hello World";
  radio.write(&text, sizeof(text));
  
  delay(1000);
}

اين كد با فراخواني كتابخانه‌هاي مورد نياز شروع مي‌شود. كتابخانه SPI.h براي ارتباط SPI و كتابخانه‌هاي nRF24L01.h و RF24.h براي كنترل ماژول استفاده خواهند شد.

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

در قدم بعد لازم است شي RF24 را ايجاد كنيم. پارامتر‌هاي اين شي دو شماره پيني هستند كه سيگنال‌هاي CE و CSN به آن‌ها متصل هستند.

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

سپس يك آرايه اي از بايت‌ها براي نشان دادن آدرس شريان ارتباطي (pipe) دو ماژول ايجاد مي‌كنيم.

//address through which two modules communicate.
 const byte address[6] = "00001";

اين آدرس را مي‌توان به هر رشته 5 حرفي مانند “node1” تغيير داد.  اگر چندين ماژول در يك شبكه ارتباطي باشند، تعريف اين آدرس ضروري خواهد بود. با استفاده از آدرس مي‌توان ماژول مورد نظر براي ارتباط را مشخص نمود. در اين‌جا آدرس يكسان براي هر دو فرستنده و گيرنده تعريف مي‌كنيم.

در بخش setup ابتدا شي radio با ()radio.begin  راه اندازي مي‌شود و با استفاده از تابع ()radio.openWritingPipe  آدرس فرستنده را تعیین مي‌كنيم.

//set the address
radio.openWritingPipe(address);

براي  تعريف ماژول به عنوان فرستنده از تابع  ()radio.stopListening  كمك مي‌گيريم.

//Set module as transmitter
radio.stopListening();

در بخش loop آرايه‌اي از كاراكتر‌ها براي پيام “Hello World” ايجاد مي‌كنيم.  با استفاده از تابع ()radio.write  مي‌توان پيام را براي گيرنده ارسال نمود. آرگومان اول اين تابع پيام ارسالي و آرگومان دوم نيز تعداد بايت پيام است.

const char text[] = "Hello World";
radio.write(&text, sizeof(text));

با استفاده از اين روش مي‌توان در هر زمان تا 32 بايت پيام ارسال كرد. (اين عدد ماكزيمم يك بسته داده +nRF24L01  است). براي اخذ تائيد دريافت پيام از گيرنده، ()radio.write يك خروجي باينري برگشت خواهد داد. چنانچه True برگشت داده شود، به معني آن است كه پيام به درستي توسط گيرنده دريافت شده است و چنانچه False داده شود به معني آن است كه بسته داده ارسالي گم شده است و پيام به گيرنده نرسيده است.

  نکته  : .تابع ()radio.write تا زماني كه پيام تشكر ACK دريافت شود يا تا زماني كه همه تلاش‌هاي ارسال مجدد پيام اجرا شود، برنامه را متوقف مي‌كند.

كد آردوينو گيرنده

كد آردوينو گيرنده بصورت زير است:

//Include Libraries
#include <SPI.h>
#include <nRF24L01.h>
#include <RF24.h>

//create an RF24 object
RF24 radio(9, 8);  // CE, CSN

//address through which two modules communicate.
const byte address[6] = "00001";

void setup()
{
  while (!Serial);
    Serial.begin(9600);
  
  radio.begin();
  
  //set the address
  radio.openReadingPipe(0, address);
  
  //Set module as receiver
  radio.startListening();
}

void loop()
{
  //Read the data if available in buffer
  if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }
}

به غير از برخي تغييرات جزئي، برنامه گيرنده مشابه برنامه فرستنده است. در ابتداي بخش setup ارتباط سريال را‌ه‌اندازي مي‌شود. با استفاده از تابع ()radio.setReadingPipe  آدرس مشابه فرستنده براي گيرنده هم گذاشته مي‌شود. بدينوسيله ارتباط دو ماژول فرستنده و گيرنده امكانپذير خواهد شد.

  //set the address
  radio.openReadingPipe(0, address);

آرگومان اول شماره stream است. مي‌توان تا شش stream را براي  پاسخ به 6 آدرس مختلف ايجاد نمود. در اين مثال ما فقط يك آدرس براي stream شماره 0 ايجاد مي‌كنيم. آرگومان دوم آدرسي است كه stream به آن براي جمع‌آوري داده واكنش نشان خواهد داد.

گام بعدي اين است كه آردوينو را به عنوان گيرنده پيام تعريف كنيم تا دريافت داده امكانپذير باشد. براي اين كار از تابع ()radio.startListening استفاده مي‌كنيم. پس از آن مودم براي دريافت داده ارسالي به آدرس مشخص منتظر مي‌ماند.

//Set module as receiver
  radio.startListening();

در بخش loop به كمك تابع ()radio.available مرتبا چك خواهد شد كه آيا داده‌‌ها در آدرس مورد نظر رسيده است يا نه. در صورت دريافت داده در بافر، مقدار خروجي تابع True خواهد شد.

if (radio.available())
  {
    char text[32] = {0};
    radio.read(&text, sizeof(text));
    Serial.println(text);
  }

اگر داد‌ه‌اي دريافت شود، آرايه‌اي از 32 كاراكتر صفر ايجاد خواهد شد (بعدا اين كاراكتر‌هاي صفر توسط برنامه با پيام دريافتي، جايگزين خواهد شد). براي خواندن داده از كد radio.read (& text, sizeof (text)) استفاده مي‌شود و بدين وسيله داده دريافتي در آرايه‌ي كاراكتر‌ها ذخيره خواهد شد.

در انتها فقط كافيست پيام دريافتي روي يك مانيتور سريال پرينت شود. اگر مطابق روال گفته شده عمل كرده باشيد و اشتباهي در اتصال فيزيكي آردوينو و ماژول +nRF24L01 مرتكب نشده باشيد، بر روي مانيتور سريال پيامي شبيه شكل زير مشاهده خواهيد كرد.

نمایش پیام دریافتی بر روی یک مانیتور سریال

بهبود رنج ارتباطي ماژول +nRF24L01

در يك سيستم ارتباطي بيسيم يكي از مهمترين پارامتر‌ها “رنج ارتباطي سيستم” است كه در بسياري از مواقع به عنوان فاكتور اصلي براي انتخاب سيستم ارتباطي RF مد نظر قرار مي‌گيرد. بنابراين در اين بخش به نحوه بهبود رنج ارتباطي ماژول فرستنده-گيرنده خواهيم پرداخت.

كاهش نويز منبع تغذيه

يك مدار RF كه سيگنال راديويي RF ايجاد مي‌كند بشدت به نويز منبع تغذيه حساس است. در صورت عدم كنترل اين نويز، رنج ارتباطي بشدت كاهش خواهد يافت.

بجز موقعي كه براي تغذيه از باتري مستقل استفاده كنيم، يك راه حل موثر كاهش نويز استفاده از خازن 10 ميكروفاراد در سر راه ولتاژ تغذيه است. يك راه حل ارزان قيمت براي اين كار استفاده از يك ماژول Adapter (شكل زير) براي +nRF24L01 است.

استفاده از Adapter برای کاهش نویز منبع تغذیه

اين ماژول داراي يك كانكتور مادگي 8 پين براي اتصال ماژول +nRF24L01 است. هر دو نوع ماژول nRf24L01، يعني مدلي كه داراي آنتن خارجي PA/LNA و مدلي كه داراي آنتن on-board است را مي‌توان به اين ماژول متصل نمود. ماژول Adapter همچنين داراي يك كانكتور نري 6 پين براي باس SPI و اتصال وقفه و يك كانكتور 2 پين براي ورودي تغذيه است.

ماژول Adapter داراي رگولاتور داخلي 3/3 ولتي و يكسري از فيلتر‌هاي خازني است و بنابراين شما مي‌توانيد آن را با يك منبع 5 ولتي تغذيه كنيد.

تغييركانال فركانسي

براي يك مدار RF يك منبع احتمالي نويز مي‌تواند مربوط به محيط و فضاي ارتباطي باشد. بخصوص اگر شبكه‌هاي ارتباطي ديگري بر روي همان كانال فركانسي وجود داشته باشد و يا مدارات الكترونيكي ديگري نيز در آن محيط در حال استفاده باشند. براي جلوگيري از تاثير اين سيگنال‌هاي مزاحم، پيشنهاد مي‌شود كه براي ماژول فرستنده-گيرنده +nRf24L01 از 25 كانال فركانسي بالايي استفاده شود. به اين دليل كه شبكه‌هاي wifi معمولا از كانال‌هاي با فركانس پايين تر استفاده مي‌كنند.

كاهش نرخ تبادل داده

بيشترين حساسيت گيرنده +nRF24L01 در نرخ 250kbps خواهد بود كه برابر 94dBm است. در نرخ 2Mbps حساسيت گيرنده تا مقدار 82- dBm افت خواهد كرد. به عبارت ديگر، حساسيت گيرنده در نرخ تبادل داده 250kbps ، ده برابر حساسيت گيرنده در نرخ 2Mbps است. مفهوم اين عبارت اين است كه گيرنده در نرخ 250kbps مي‌تواند سيگنال‌هايي با توان ده برابر ضعيف‌تر را دريافت و رمزگشايي كند.

مفهوم حساسيت گيرنده (Rx) چيست؟
حساسيت يك گيرنده عبارت است از پايين ترين سطح تواني كه گيرنده مي‌تواند سيگنال RF را آشكار كند. هر چقدر مقدار مطلق عدد منفي‌تر باشد، حساسيت گيرنده بهتر خواهد بود. به عنوان نمونه حساسيت گيرنده 94- dBm به اندازه 12dB بهتر از حساسيت 82- dBm است.

بنابراين كاهش نرخ تبادل داده تا حد قابل ملاحظه‌اي مي‌تواند به بهبود و افزايش رنج ارتباطي كمك كند. هرچند، در بيشتر كاربرد‌ها، نرخ تبادل داده 250kbps سريعتر از آن چيزي است كه واقعا به آن نياز داريم.

توان خروجي بالاتر

تنظيم ماكزيمم توان خروجي نيز مي‌تواند به افزايش رنج ارتباطي كمك كند. +nRF24L01 به شما اجازه انتخاب توان خروجي بر روي يكي از مقادير0dBm ، -6dBm، -12dBm ، -18dBm  را مي‌دهد.  انتخاب 0dBm سبب ارسال سيگنال‌هاي قوي تر (با توان بيشتر) خواهد شد.


مقالات مشابه

۵۵ دیدگاه. Leave new

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

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

      پاسخ
      • سلام ببخشید چگونه نرخ تبادل داده را به ۲۵۰ kbps تنظیم کرد

        پاسخ
        • سلام و درود به ایوب عزیز
          شما با استفاده از تابع setDataRate در کتابخانه RF24 میتونید نرخ رو مشخص کنید. مثلا بنویسید:

          ;radio.setDataRate( RF24_250KBPS )

          پاسخ
  • سلام خسته نباشید من نیاز دارم که برد ماژول NRF24L01که دارم کم باشه آیا راه حلی دارین که مشکل من رو حل کنه مثلا می تونم با تغییر توان خروجی مشکلم رو حل کنم لطفا راهنماییم کنید

    پاسخ
    • سلام محمد عزیز، ممنون از شما
      چیپ nRF24L01 دارای قابلیتی به اسم PA control هست که توان تقویت کننده خروجی رو تعیین می‌کنه و ۴ مقدار قابل تنظیم از ۰ تا ۱۸dBm داره.
      توی کتابخانه RF24 که ازش توی این آموزش استفاده کردیم، تابعی به نام ()setPALevel وجود داره که سطح توان PA رو تنظیم می‌کنه.
      ورودی تابع هم اعداد ۰ تا ۳ هست. مثلا اگر اسم شئ تعریف شده، مثل کد مثال ما، radio باشه، به این صورت نوشته میشه: radio.setPALevel(n); که n رو باید ۰، ۱، ۲ یا ۳ قرار بدیم.

      پاسخ
  • سلام وخسته نباشید

    من می‌خواستم با همین ماژول یک رادیو کنترل ۱۰ کاناله با آردوینو نانو بسازم.

    میخواستم ببینم اگه تو فرستنده از جوی استیک استفاده کنم، تو قسمت سخت افزارش باید موتور ها رو به وسیله موتور درایور به پین های آنالوگ متصل کنم یا پین های دیجیتال؟

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

      پاسخ
  • درود
    کد گیرند اشتباه هست
    if (radio.text style=”color:blue;”>available())
    این یعنی چه؟ نصفش c هست نصفش html
    در ضمن کتاب لینکی چیزی از کتاب خانه قرار ندادین تو گیت هاب ۰۱ تا rf24 هست کدومشون؟

    پاسخ
  • پارسا دانشور
    فروردین ۲۹, ۱۴۰۱ ۰۹:۱۵

    با تشکر از مطلب خوبتون،فقط یک سوال برام پیش اومده این هست که برای خوندن یا ارسال پیام چرا از radio.read یا radio.write خالی استفاده نشده و بجاش از radio.read(&text, sizeof(text)); و radio.write(&text, sizeof(text)); استفاده شده؟

    پاسخ
    • سلام پارسای عزیز، ممنون از شما که ما رو دنبال می‌کنی،
      ساختار توابع write و read، در کتابخانه RF24 به این شکل نوشته شده که دو پارامتر می‌گیره.

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

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

    پاسخ
    • سلام و درود به شما،
      بله امکان‌پذیر هست. داده ارسالی توسط این ماژول می‌تونه فرمان یا هر چیزی باشه، مثلا شما عدد ۱۲۳۴ می‌فرستی و داخل کد آردوینو طوری تعریف می‌کنی که اگر دیتای دریافتی ۱۲۳۴ بود، سروو موتور عمل کنه.

      پاسخ
      • و یک سوال دیگه

        پین های متصل برای نانو اردینو که کوچک تر وسبک تر هست به کدوم پین ها ماژول باید وصل بشه؟

        وهمچنین راهنمایی میکنید که سروو موتور سه تا سیم داره اون سه تا سیم به کدوم بخشم این مدار ها قرار میگیره؟
        ممنون بابت وقتی که برای کاربران و پرسش هاشون میذارید

        پاسخ
        • سلام و دورود به شما پرهام عزیز
          با توضیحی که برای سوال قبلی دادم، پین‌های MISO و MOSI و SCK ماژول nrf که مربوط به پروتکل SPI هستند رو به پین‌های متناظر در آردوینو نانو وصل کنید و بقیه پین‌ها میتونه به هر یک از پینهای دیجیتال آردوینو نانو متصل بشه.
          مجموعه روبوایکیو همیشه به شما همراهان عزیز مفتخر بوده و هست. سپاس از شما 🙂

          پاسخ
      • بله همنیطور هست اما

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

        ببخشید من فوق‌العاده مبتدی هستم و حتی اگه الان بفهمم که پین های کلید و سروو کجای اردینو باید وصل بشه قطعا تو مرحله ی کد نویسی کلافه میشم

        پاسخ
        • سلام و درود به شما پرهام عزیز
          آردوینو یکسری پایه GPIO داره که به معنی ورودی خروجی عمومی هست. هر چیزی که پروتکل خاصی برای ارتباط نیاز نداشته باشه مثل کلید، LED یا پین‌های CE و CSN همین ماژول nrf، میتونن به این پایه‌ها متصل بشن پس کلیدتون رو به هر یک از پایه‌های دیجیتال ۱ تا ۱۳ که در آخر خالی بمونه متصل کنید. در مورد سروو موتور هم این موضوع برقراره و برای راه‌اندازی اون میتونید مقاله زیر رو بخونید:
          https://roboeq.ir/blog/%D8%B1%D8%A7%D9%87-%D8%A7%D9%86%D8%AF%D8%A7%D8%B2%DB%8C-%D8%B3%D8%B1%D9%88%D9%88-%D9%85%D9%88%D8%AA%D9%88%D8%B1-%D8%A8%D8%A7-%D8%A2%D8%B1%D8%AF%D9%88%DB%8C%D9%86%D9%88/

          پیشنهاد ما اینه برای اینکه سردرگم نشید، از پروژه‌های ساده‌تر شروع کنید، مثلا سعی کنید یک ال ای دی رو روشن کنید، در مرحله بعد همین ال ای دی رو چشمک زن کنید، بعد سعی کنید کلید رو به مدار اضافه کنید و وضعیت ال ای دی رو با کلید کنترل کنید. برای یادگیری هم علاوه بر وبلاگ روبوایکیو آموزش‌های بسیار زیادی (به فارسی و انگلیسی) در سطح اینترنت موجود هست، از مثال‌های خود آردوینو هم میتونید کمک بگیرید.
          موفق باشید

          پاسخ
  • سلام
    ماژول Adapter براي +nRF24L01را در فروشگاه دارید؟

    پاسخ
  • علی اصغر حسن زاده
    بهمن ۲۹, ۱۴۰۱ ۱۰:۱۴

    سلام این نکته ای که گفتین:
    نکته : .تابع ()radio.write تا زماني كه پيام تشكر ACK دريافت شود يا تا زماني كه همه تلاش‌هاي ارسال مجدد پيام اجرا شود، برنامه را متوقف مي‌كند
    چقدر طول میکشه ؟میشه کم و زیادش کرد؟ چطوری؟

    پاسخ
    • سلام و درود بر شما علی‌اصغر عزیز
      ما در مقاله ذکر کردیم که حداکثر زمانی که فرستنده برای دریافت ack صبر می‌کند ۱۳۰ میکرو ثانیه است. این مدت زمان به فرکانس ارتباط بی سیم وابسته است و تا جایی که ما اطلاع داریم قابل تغییر نیست.
      موفق باشید 🙂

      پاسخ
  • سلام ممنون از توضیحات کاملتون
    من مبتدی هستم و نمیدونم به جای عبارتsizeoftextچی بنویسم میشه راهنماییم کنید

    پاسخ
    • سلام و درود بر شما انیس عزیز و متشکریم که سایت ما را برای یادگیری هرچه بهتر و سریعتر خود انتخاب نمودید
      توجه کنید که پارامتر دوم تابع ()read، تعداد کاراکتر پیام ارسالی (یا دریافتی) رو مشخص میکنه. بنابراین اگر پیامتون مثلا hello هست تعداد کاراکتر شما ۵ هست و باید عدد ۵ قرار بدید.
      اما داخل کد مقاله، ما از تابع ()sizeof استفاده کردیم و پیام رو هم داخل آرایه text قرار دادیم در نتیجه sizeof(text) به ما یک عدد برمیگردونه که برابر اندازه پیام هست. در این روش نیاز نیست برای هر پیام تعداد کاراکتر رو به شکل دستی وارد کنیم.
      پس شما برای فرستنده، مشابه کد مقاله پیامتون رو داخل text بریزید و sizeof(text) رو هم نیازی نیست تغییر بدید. برای گیرنده هم پیام دریافتی داخل text ریخته میشه که مجدداً نیازی به تغییر نیست.
      با آرزوی موفقیت شما 🙂

      پاسخ
      • سلام خیلی ممنون بابت سایت خوبتون من دوتا ماژول nrf+pA-ln دارم کد های آموزش شما رو نوشتم اما کار نمی کند و پیام ارسال نمی شود ماژول ها هم تازه از بازار خریداری کردم از ماژول رگولاتور ولتاژ nrf هم استفاده کردم اما کار نمی کنه اتصالات هم درست هست فقط بعضی وقتی سیم های nrf گرینده که دست میزنم روی سریال ماتادور متن خالی چاپ میشه

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

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

    پاسخ
    • درود برشما امیر عزیز
      مثال (example) های کتابخونه rf24 رو هم تست کنید و در صورتی که باز هم جواب نگرفتید بهتره برد رو به یک فرد باتجربه نشون بدید.

      امیدواریم به راه پر از موفقیتت ادامه بدی:)

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

        پاسخ
        • سلام و درود خدمت شما دوست عزیز
          در مورد این موضوع در پرسش‌های قبلی هم بحث شده. به طور خلاصه شما در آردوینو مقصد پایه ورودی را می خوانید و وقتی این پایه یک شد، یک پیام مبنی بر ۱ شدن پایه به مقصد ارسال می‌کنید. (مثلاً ارسال می‌کنید pin_is_high) در سمت گیرنده هم مشخص می‌کنید زمانی که همین پیام خاص (pin_is_high) را دریافت کند خروجی را تغییر وضعیت بدهد. به همین شکل زمانی که در مبدا، ورودی تحریک نشده هم یک پیام دیگر مثل pin_is_low ارسال می‌کنید تا مقصد متوجه بشه و خروجی را غیرفعال کند. توجه داشته باشید که سیستم ارتباطی بسته به کاربرد مدنظر شما، می تواند وضعیت ورودی را به طور پیوسته ارسال کند یا فقط در صورت تغییر وضعیت پیام ارسال کند.

          پاسخ
  • سلام
    من این مدار رو بستم و جواب هم گرفتم، اما مشکلی که دارم اینه که وقتی که دستوری از فرستنده میفرستم مثلا پایه های ۲ و ۳ را high کن، و در همان لحظه برق فرستنده رو قطع می کنم پایه های برد گیرنده خاموش نمیشن و high باقی میمونن، و حتی با قطع و وصل برق برد گیرنده هنوز خروجی ها high هستند، اگر ممکنه راهنمایی کنید.
    ممنون از شما

    پاسخ
    • سلام شهریار عزیز
      این مشکل رو در برنامه می‌تونید حل کنید. باید کدتون (سمت گیرنده) رو بررسی کنید و ببینید که بعد از دریافت فرمان و high کردن پایه‌ها، در صورتی که دستور دیگری نرسه گیرنده چه کاری انجام میده. برای مثال فرض کنیم عملکرد مدنظرتون اینه که تا وقتی فرستنده فرمان high کردن ارسال میکنه پایه‌ها high باشند و در غیر اینصورت low باشند، دقیقا همین جمله رو با یک دستور شرطی ساده توی کدمون می‌نویسیم.

      پاسخ
    • سلام
      حتما باید در کنار if که استفاده کردید else هم بزارید و در else بنویسید که پایه رو low کنه

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

        پاسخ
        • سلام
          ببینید ، شما توی کد فرستنده میگید اگه کلید فعال شد ، مثلا مقدار ۱۲۳۴ رو ارسال کنه ، بعد توی گیرنده از if استفاده میکنید و میگید که اگه کد ۱۲۳۴ رو دریافت کردی این پایه رو high کن .
          بعد از این باید بیاید و زیر if که نوشتید یک else هم بزارید و توش بنویسید که پایه رو low کنه

          پاسخ
  • سلام. مثل اینکه این برنامه و ماژول روی برد آردینو WEMOS کار نمیکنه؟؟؟؟
    این خط کد چه در فرستنده و چه در گیرنده که کمی با هم متفاوتند به مشکل می خورند
    radio.openWritingPipe(address);

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

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

    پاسخ
    • سلام مهدی عزیز
      ممنونیم از شما
      احتمالاً یا کد اشتباهی آپلود کردید یا باودریت رو درست تنظیم نکردید. البته هنگام ریست کردن برد، به خاطر صفر و یک شدن لحظه‌ای پایه‌ها احتمال داره در ابتدا چند کاراکتر نامفهوم هم روی سریال مانیتور دریافت کنید که اهمیتی نداره.

      پاسخ
  • سلام و خسته نباشید. توضیحاتتون خیلی خوب بود فقط من یه مشکلی دارم اونم اینه که تووی سریال مانیتور که میخوام متن رو ببینم، به جای hello world مربع های کوچیک میندازه. مشکلم از چیه؟

    پاسخ
  • سلام
    تشکر از مطلب بسیار مفید و توضیحات کامل

    پاسخ
    • سلام احمد عزیز
      خوش‌حالیم که در این آکادمی، ارائه مطالب آموزشی همیشه با رضایتمندی دانش‌پژوهانی مثل شما همراه بوده و هست،
      سپاس از قدردانیتون

      پاسخ
  • درود به شما.
    حضور آردوینو Mega را متوجه نشدم!
    خب مثلن آردوینو Uno بعنوان فرستنده و Nano هم گیرنده یا بلعکس.
    وظیفه Mega این وسط چه هست؟!

    پاسخ
    • سلام و درود برشما دوست عزیز
      ما پروژه رو با دو تا آردوینو UNO انجام دادیم اما پین‌های متناظر در برد آردوینو مگا و نانو هم ذکر شده تا اگر شما به جای UNO، این برد‌ها را در اختیار دارید بتوانید از آموزش استفاده کنید.

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

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

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

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

      پاسخ
  • سلام
    گرم شدن ماژول بعد از اتصال پین‌ها طبیعیه؟

    پاسخ
    • درود بر شما همراه عزیز
      در هنگام ارسال و دریافت اطلاعات گرم شدن به طور جزئی طبیعی است در غیر اینصورت خیر.

      پاسخ
  • با سلام خیلی ممنون از زحماتتون خیلی مفید بود

    پاسخ
    • سلام سینای عزیز
      از اینکه مطالب ما را دنبال می کنید بی اندازه افتخار می کنیم و امیدواریم در آینده هم بتوانیم حس رضایت شما را دوچندان کنیم…
      🙂

      پاسخ

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

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

Fill out this field
Fill out this field
لطفاً یک نشانی ایمیل معتبر بنویسید.
You need to agree with the terms to proceed

پر بازدید ترین مقالات