اگر نحوه راه اندازی ماژول فرستنده و گیرنده ASK به یکی از دغدغه های شما تبدیل شده است، در این مقاله می توانید آن را بهطور کامل فرا بگیرید.
اگر تمايل داريد قابليت ارتباط بی سيم را با يک هزينه اندک به پروژهي آردوينوی خود اضافه كنيد، تنها كافی است از ماژول فرستنده و گيرنده ASK با فرکانس 433MHz استفاده كنيد. اين ماژول با قيمتی مناسب در بازار موجود است و به همين علت می توان آن را ارزانترين گزينهی ارتباط بی سيم به حساب آورد. به علاوه، بهترین ویژگی این ماژول ابعاد بسیار کوچک آن است که به شما این امکان را میدهد تا يک واسط بی سيم را به هر پروژهای اضافه کنید.
مرور سخت افزار
اجازه بدهيد نگاه دقيقتری به ماژول فرستنده و گيرنده ASK با فرکانس 433MHz داشته باشيم.
ماژول فرستنده:
در شكل فوق ماژول فرستنده ASK را مشاهده می کنید. این ماژول واقعا به همان سادگی است كه بهنظر میرسد. بخش اصلی اين ماژول يک رزوناتور SAW است كه برای كار در رنج 433xx MHz تنظيم شده است. بهعلاوه، اين ماژول دارای يک ترانزيستور سوئيچينگ و تعدادی المان غيرفعال نيز میباشد. وقتی به ورودی data يك مقدار high اعمال شود، يك موج حامل ASK با فركانس 433MHz توليد میشود. با اعمال منطق Low به اين ورودی، اسيلاتور متوقف خواهد شد. اين تكنيک اصطلاحا كليدزنی شيفت دامنه (Amplitude Shift Keying) ناميده میشود كه در ادامه به اجمال توضيح داده خواهد شد.
ماژول گيرنده:
شكل فوق ماژول گيرنده ASK را نشان میدهد. هر چند اين ماژول پيچيدهتر بهنظر میرسد، اما در واقع به همان سادگی ماژول فرستنده است.
گيرنده شامل يك مدار تنظيم شده ASK و يك جفت آپ-امپ جهت تقويت موج حامل (موج كرير) دريافتي ميباشد. سيگنال تقويت شده به يك PLL داده ميشود که باعث رمزگشایی راحت تر و ایمنی بهتر در برابر نویز می شود.
تكنيك کلیدزنی شیفت دامنه (Amplitude Shift Keying)
همانگونه كه توضيح داده شد، برای ارسال راديويی داده ديجيتال از مدولاسیون ASK استفاده میشود. در اين تكنيک دامنه يا همان سطح موج حامل (كه در اينجا يك سيگنال 433MHz است) در پاسخ به ديتاي دريافتي تغيير ميكند. اين تکنیک شباهت زیادی به مدولاسیون دامنه امواج رادیویی AM دارد. از آنجایی که در این تکنیک فقط دو سطح وجود دارد، گاهی آن را کلیدزنی شیفت دامنه دودویی نيز مینامند. به لحاظ مفهومی، میتوان این تکنیک را بهصورت یک سوئیچ on/off در نظر گرفت:
- به ازای مقدار 1 دیجیتال، موج حامل بهطور کامل (با حداکثر دامنه) خواهد بود.
- به ازای مقدار 0 دیجیتال، موج حامل قطع خواهد شد (دامنه صفر میشود).
شکل زیر نشان دهنده مدولاسیون دامنه است:
مزیت کلید زنی شیفت دامنه در پیادهسازی راحت آن است چرا که طراحی مدار دیکدر کاملا ساده است. بعلاوه، در مقایسه با سایر تکنیک های مدولاسیون نظیر کلیدزنی شیفت فرکانسی (FSK)، تکنیک ASK به پهنای باند کمتری احتیاج دارد که در حقیقت همین مزیت یکی از دلایل ارزان قیمت بودن ASK میباشد.
عیب تکنیک ASK این است که در اين تكنيک امکان تداخل با امواج تجهیزات رادیویی دیگر و یا نویز پس زمینه وجود دارد. با این وجود، مادامی که انتقال اطلاعات با سرعت کمی انجام شود، تکنیک ASK در بسیاری از موارد می تواند قابل اعتماد باشد.
پینهای ماژول فرستنده و گیرنده ASK با فرکانس 433MHz
در این قسمت پینهای ماژول فرستنده و گیرنده ASK با فرکانس 433MHz را معرفی خواهیم کرد.
ماژول فرستنده:
پین DATA : دادههای دیجیتال به این پین ورودی برای ارسال اعمال ميشود.
پین VCC : تغذیه الکتریکی (بین 5.3 ولت تا 12 ولت) جهت تامین توان مورد نیاز برای ارسال داده، به این پین وصل ميشود. شایان ذکر است قدرت خروجی ASK متناسب با اندازه ولتاژ تغذیه ماژول ميباشد. به این معنا که هرچه قدر ولتاژ بزرگتری به VCC اعمال شود، قدرت سیگنال ASK و به عبارت دیگر رنج ارتباطی ماژول افزایش خواهد داشت.
پین GND : پین زمین ماژول است.
پین Antenna : آنتن خارجی به این پین وصل ميشود. برای افزایش برد ارتباطی ماژول ميتوانید یک سیم با طول 17.3 سانتی متری را به عنوان آنتن به این پین لحیم کنید.
ماژول گیرنده:
پین VCC : تغذیه الکتریکی 5 ولتی به این پین وصل ميشود.
پین خروجی DATA : دادههای دیجیتال دریافت شده توسط ماژول گیرنده از طریق این پین در دسترس خواهند بود.
پین GND : این پین زمین ماژول است.
پین Antenna : این پین برای اتصال آنتن خارجی به ماژول گیرنده ميباشد. بر روی برد ماژول گیرنده معمولا محل این پین علامتی ندارد اما مکان آن در بخش چپ سمت پایین ماژول در کنار سیم پیچ برد است. برای افزایش قدرت ماژول گیرنده در دریافت سیگنال، ميتوان یک سیم با طول 17.3 سانتی متری را به عنوان آنتن به این پین لحیم کرد.
راه اندازی ماژول فرستنده و گیرنده ASK با آردوینو UNO
اکنون که اطلاعات لازم را در اختیار داریم، زمان راه اندازی ماژول فرستنده و گیرنده ASK با آردوینو فرا رسیده است. به دلیل آنکه میخواهیم تبادل داده بین دو برد آردوینو را داشته باشیم، در این مثال به دو برد آردوینو، ماژولهای فرستنده و گیرنده و سیمهای رابط احتیاج خواهیم داشت. این وسایل را می توانید از طریق لینکهای زیر خریداری کنید:
- ماژول فرستنده ASK فرکانس 433 مگاهرتز
- ماژول گیرنده ASK با فرکانس 433 مگاهرتز
- برد آردوینو UNO
- مینی برد بورد 400 سوراخ
- کابل نری USB
- سیم جامپر نری به نری 20 سانتی متری
سیم کشی ماژول فرستنده و اتصال آن به آردوینو بسیار ساده است. این ماژول دارای سه اتصال است. پین VCC و پین GND به ترتیب به ولتاژ 5 ولت و زمین آردوینو متصل ميشود. پین ورودی DATA باید به پین دیجیتال شماره 12 آردوینو متصل شود. پین شماره 12 از این جهت انتخاب شده که پین پیش فرض کتابخانهای است که در کدنویسی آردوینو برای ورودی داده مورد استفاده قرار خواهیم داد.
شکل زیر نحوه سیم کشی اتصالات را نشان میدهد:
اکنون به سیم کشی و اتصالات ماژول گیرنده و آردوینو ميپردازیم.
مشابه فرستنده، سیم کشی گیرنده نیز بسادگی قابل انجام است. کافی است پین VCC و پین GND ماژول گیرنده را به ترتیب به ولتاژ 5 ولت و زمین آردوینو متصل کنید. سپس یکی از پینهای خروجی DATA ماژول را به پین شماره 11 آردوینو وصل ميکنیم. سیم کشی نهایی به شکل زیر خواهد بود:
پس از انجام سیم کشی ماژولها و اتصال آنها به دو آردوینو، اکنون کافی است کد برنامه نویسی مربوط به فرستنده و گیرنده را بنویسیم و آنها را روی آردوینوهای مربوطه بارگذاری کنیم.
ابتدا کد نویسی فرستنده و پس از آن کد نویسی گیرنده را توضیح میدهیم. سپس، آردوینو متصل به فرستنده را میتوانیم با استفاده از یک منبع تغذیه یا باتری تغذیه کنیم.
کتابخانه RadioHead
قبل از شروع لازم است کتابخانه RadioHead را در نرم افزار IDE آردوینو نصب کنیم. با استفاده از این کتابخانه، کدنویسی بسیار سادهتر خواهد شد. این کتابخانه تبادل ساده داده بین دو برد آردوینو را امکانپذیر میکند و برای همه وسایل ارتباط رادیویی از جمله ماژولهای 433MHz قابل استفاده میباشد.
کاری که کتابخانه RadioHead انجام میدهد این است که داده مربوطه را که قصد ارسال آن را داریم، دریافت كرده و آن را به شکل یک بسته داده شامل افزونگی کدینگ CRC در میآورد. سپس این بسته داده را به همراه بخشهای مقدماتی دیگری برای آردوینو گیرنده ارسال میکند. اگر بسته داده ارسالی بهدرستی توسط گیرنده دریافت شود، آردوینو گیرنده از وجود داده جدید مطلع شده و آن را رمز گشایی و تجزیه و تحلیل خواهد کرد.
بسته داده RadioHead متشکل از چندین بخش است. قبل از هر انتقال داده، ابتدا یک دنباله 36 بیتی از جفت 0 و 1 ها ارسال می شود. به این دنباله 36 بیتی اصطلاحا “Training Preamble” گفته می شود. با استفاده از این بیتها گیرنده بهره خود را برای دریافت دادههای اصلی تنظیم ميکند. در بخش دوم بسته داده، یک بخش 12 بیتی به نام “Start Symbol” و پس از آن دیتای واقعی به شکل یک بخش 8 بیتی قرار داده میشوند. در بخش آخر بسته داده نيز یک دنباله 16 بیتی به نام Frame Check Sequence یا CRC قرار دارد. کتابخانه RadioHead گیرنده مجددا کد CRC را محاسبه میکند و اگر چک کد صحیح باشد، گیرنده مطلع میشود. اگر نتیجه چک کد CRC صحیح نباشد، بسته داده دریافتی در نظر گرفته نخواهد شد.
ساختار بسته داده بهصورت زیر است:
کتابخانه مورد نظر را میتوانید از سایت airspayce.com و یا با کلیک بر RadioHead.zip دانلود کنید.
برای نصب این کتابخانه کافی است در نرم افزار IDE آردوینو به قسمت Sketch > Include Library > Add .ZIP Library رفته و فایلی که دانلود کردهاید را انتخاب نمایید.
کد آردوینو برای فرستنده ASK با فرکانس 433MHz
در این مثال یک پیام ساده از فرستنده برای گیرنده ارسال میکنیم. این مثال به عنوان نمونهای جهت درک چگونگی استفاده از ماژولهای 433MHz میباشد و میتوان آن را مبنای پروژههای عملی تر قرار داد.
کد آردوینو فرستنده به شکل زیر است:
// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library
#include <SPI.h>
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
void setup()
{
// Initialize ASK Object
rf_driver.init();
}
void loop()
{
const char *msg = "Hello World";
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);
}
این کد بهصورت یک برنامه کوتاه است، اما تمام آن چیزی که برای ارسال سیگنال لازم است را برای ما انجام میدهد. کد با فراخوانی کتابخانه RadioHead ASK و همچنین کتابخانه Arduino SPI شروع میشود.
#include <RH_ASK.h>
#include <SPI.h>
برای دسترسی به برخی توابع خاص کتابخانه RadioHead ASK باید شی ASK را ایجاد کنیم.
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
در بخش setup، شی ASK را راه اندازی میکنیم:
// Initialize ASK Object
rf_driver.init();
اكنون درون یک حلقه، پیام ارسالي مورد نظر را ایجاد ميکنیم. این پیام بصورت رشته ای از کاراکترها است و در اشاره گری با نام msg ذخیره میشود. به خاطر داشته باشید که این پیام میتواند هر چیز دلخواهی باشد، اما برای کارایی بهتر، حداکثر طول پیام باید کمتر از 72 کاراکتر باشد. همچنین، شمارش تعداد کاراکترهای پیام را باید در ذهن داشته باشیم چراکه اين عدد در کد گیرنده مورد نیاز خواهد بود. در این مثال، پیام مورد نظر ما دارای 11 عدد کاراکتر است:
// Preparing a message
const char *msg = "Hello World";
در گام بعد با استفاده از تابع ()send پیام ارسال ميشود. این تابع دارای دو پارامتر است. پارامتر اول آرایه ای از دادهی مورد ارسال و پارامتر دوم تعداد بایتها (طول داده) ميباشد. تابع ()send معمولا با تابع waitPacketSent دنبال ميشود که با بکارگیری آن آردوینو تا زمانی که بسته داده ارسالی قبلی توسط گیرنده دریافت شود، منتظر ميماند. در خط بعدی برنامه، یک وقفه یک ثانیهای آورده میشود که هدف آن دادن مهلت زمان لازم به گیرنده ميباشد:
rf_driver.send((uint8_t *)msg, strlen(msg));
rf_driver.waitPacketSent();
delay(1000);
كد آردوینو – گيرنده ASK با فرکانس 433MHz
آردوينو را به كامپيوتر وصل كنيد و كد زير را بر روي آن بارگذاری كنيد:
// Include RadioHead Amplitude Shift Keying Library
#include <RH_ASK.h>
// Include dependant SPI Library
#include <SPI.h>
// Create Amplitude Shift Keying Object
RH_ASK rf_driver;
void setup()
{
// Initialize ASK Object
rf_driver.init();
// Setup Serial Monitor
Serial.begin(9600);
}
void loop()
{
// Set buffer to size of expected message
uint8_t buf[11];
uint8_t buflen = sizeof(buf);
// Check if received packet is correct size
if (rf_driver.recv(buf, &buflen))
{
// Message received with valid checksum
Serial.print("Message Received: ");
Serial.println((char*)buf);
}
}
مشابه كد فرستنده، در اينجا نيز كد با فراخوانی دو کتابخانه RadioHead ASK و Arduino SPI و تعريف شي ASK شروع میشود.
#include <RH_ASK.h>
#include <SPI.h>
RH_ASK rf_driver;
در تابع Setup، شی ASK را راه اندازی میكنيم و سریال مانیتور را جهت مشاهده نتايج اجرای برنامه پيكربندی می کنیم.
rf_driver.init();
Serial.begin(9600);
در تابع loop، ابتدا یک بافر به اندازه تعداد بيت پيام ارسالی ايجاد میكنيم كه در مثال ما 11 بيت است. دقت كنيد كه تمامی فاصلهها و علائم ويرايشی و نگارشی را بايد در شمارش كاراكترها در نظر گرفت.
uint8_t buf[11];
uint8_t buflen = sizeof(buf);
در گام بعدي تابع ()recv فراخوانی میشود. چنانچه در حال حاضر گيرنده روشن نباشد، به كمك اين تابع گيرنده روشن خواهد شد. اگر يک پيام معتبر در دسترس باشد، پيام توسط تابع در بافر اول كپی میشود و مقدار true را به عنوان خروجی برمیگرداند. در غير اين صورت، خروجی تابع false خواهد بود. اگر تابع recv خروجي true بدهد، عبارت شرطی if فعال شده و پيام دريافتی بر روی سريال مانیتور پرينت میشود.
if (rf_driver.recv(buf, &buflen))
{
Serial.print("Message Received: ");
Serial.println((char*)buf);
}
پس از آن مجددا به ابتداي حلقه برميگرديم و اين مراحل را دوباره تکرار می کنیم. اگر همه چيز را درست انجام داده باشيد، خروجي برنامه به شکل زیر خواهد بود:
بهبود رنج ارتباطی ماژول فرستنده و گیرنده ASK با فرکانس 433MHz
آنتنی كه برای ماژول فرستنده و گیرنده ASK استفاده می کنید، تاثیر زيادی بر روی رنج ارتباطی دارد. رنج ارتباطی بين دو ماژول بدون استفاده از آنتن در حد يک متر خواهد بود. اما با استفاده از يک آنتن خوب و مناسب میتوان رنج ارتباطی را تا 50 متر در فضای باز توسعه داد. البته در فضاي داخلی ساختمان، به دليل وجود ديوارها رنج ارتباطی كاهش خواهد يافت.
نيازی به استفاده از آنتنهای پيچيده نيست. حتی يک قطعه سيم نيز میتواند به عنوان يک آنتن عالی برای هر يک از ماژولهای فرستنده و گيرنده ASK مورد استفاده قرار گيرد. قطر آنتن اهميت چندانی ندارد اما طول آنتن بايد به درستی در نظر گرفته شود.
برای ارتقا كارايی، بهتر است طول آنتن با طول موج سيگنال مورد استفاده برابر باشد. اما در كاربردهای عملی کافی است طول آنتن را به اندازه نصف يا يک چهارم طول موج سيگنال ارتباطی در نظر بگيريم.
طول موج يک فركانس بهصورت زير محاسبه میشود:
سرعت انتقال سيگنال ASK در هوا معادل سرعت نور يعنی 299,792,488 m/s است. بنابراين طول موج سيگنال 433MHz بهصورت زير محاسبه میشود:
به دليل اينكه استفاده از يک آنتن بلند 69.24 سانتيمتری چندان عملی نیست، طول آنتن ماژول فرستنده و گيرنده ASK را يك چهارم مقدار مذكور يعنی در حدود 17.3 سانتیمتر در نظر میگيريم.
چنانچه از سيستم ارتباطی امواج راديويی با فركانس ديگری استفاده كرديد، بههمين روش مذکور میتوانيد اندازه مناسب آنتن را محاسبه كنيد.
نکته:
هرچند يک آنتن 17.3 سانتیمتری ممكن است هنوز بلند و تا حدودی نامناسب به نظر برسد، اما به هيچ عنوان سعی نكنيد اندازه آنتن را با مارپيچ كردن و يا هر روش ديگری كوچک كنيد، زيرا سبب كاهش رنج ارتباطی خواهد شد. به ياد داشته باشيد كه همواره آنتن مستقيم و صاف كارايی بهتری خواهد داشت.
امیدواریم با این مقاله بهراحتی بتوانید این ماژول را راه اندازی کنید. اگر به اطلاعات و راهنمایی بیشتری نیاز داشتید، حتما سوالات خود را با ما به اشتراک بگذارید و پاسخ آن را در اسرع وقت دریافت کنید.
۲۲ دیدگاه. Leave new
سلام
من نمیتونم این ماژول رو راه اندازی کنم از کدی هم که شما گفتید استفاده کردم.
ممکنه سوخته باشه؟
ممنون میشم راهنمایی کنید.
سلام و درود به شما،
برای اینکه بررسی کنی ماژول سوخته یا نه، اول ببین مثبت و منفی تغذیه ماژول به هم متصل نباشه.
اگر مشکلی نبود، با اتصال تغذیه جریان کشی رو بررسی کن. فرستنده باید ۱۰ تا ۲۰ میلی آمپر و گیرنده حدودا همین مقدار جریان داشته باشد.
اگر مشکلی نبود باید اتصالات و کد رو بررسی کنی.
با سلام
میشه بجای ارتباط spi از ارتباط سریال استفاده کرد؟
اگه میشه لطفا آموزششو بزارید.
با تشکر
سلام علیرضای عزیز،
کتابخانه RadioHead ASK از رابط SPI استفاده میکنه. در حالت کلی با هر پایه GPIO میشه ارتباط رو برقرار کرد. مثلا این کتابخانه از وقفه آردوینو استفاده میکنه:
https://github.com/sui77/rc-switch
سلام
از این ماژول میشه در ماشین کنترلی استفاده کرد؟ نهایتا چه تعداد فرمان رو میشه ارسال کرد؟
با تشکر
سلام ایلیای عزیز،
بله امکانپذیره. در اصل شما میتونی با این فرستنده و گیرنده، آردوینو، موتور و درایور، یک ربات بسازید که به صورت بیسیم قابل کنترل باشه.
تعداد فرمانها (در اصل تنوع دادههای ارسالی) محدودیتی نداره.
خیلی ممنون بابت پاسخگویی 🙏
خواهش میکنم، انجام وظیفه ست.
سلام میشه مثلا برای چند تا کلید برای فرستنده شرط ایف گذاشت یک یک کارکتر رو بفرسته برای گیرنده هم نوشت اگر کارکتر دریافتی مثلا اگه حرف ک بود موتور a رو روشن کنه برای ساخت ربات میخام استفاده کنم ماشین rc
سلام امیر حسین عزیز،
بله دقیقا همین کار رو باید بکنی.
سلام وقتتون بخیر.بردش در حالت عادی چه قدر است وایا فرستنده های دیگه روی عملکرد آن اثر میگذارند؟امکانش هست این اثر گذاری رو از بین برد(منظورم از اثر گذاری یعنی بایک ریموت دیگه بشه به گیرنده داد ارسال کرد).ممنون از شما
سلام سعید عزیز،
وقت شما هم بخیر،
برد این فرستنده و گیرنده در فضای باز و بدون نویز تا حدود ۱۰۰ متره.
با توجه به اینکه در این پروژه، امکان برنامهنویسی هردوی فرستنده و گیرنده رو داریم،
دیتایی که ارسال میکنید منحصربهفرده و با یک مقایسه ساده در گیرنده، میتونی دیتایی که توسط فرستندهی شما ارسال شده رو شناسایی کنی.
به عنوان مثال میتونی فرستنده رو طوری برنامهریزی کنی که قبل از ارسال هر دستور، یک یا چند کاراکتر خاص ارسال کنه و فرستنده در صورت دریافت این چند کاراکتر تشخیص بده که فرستنده در حال ارسال اطلاعاته.
سلام
میشه چند فرستنده رو به یک گیرنه متصل کرد؟؟
سلام عباس عزیز،
بله امکانش هست.
سلام
با تشکر از آموزش خوب تون میشه این کار را با آردینو نانو انجام بدیم
سلام مهدی عزیز، خواهش میکنم،
بله امکان پذیره، اگر این پروژه رو انجام دادی، خوشحالیم میشیم برامون از تجربهات بگی.
موفق باشی
با تشکر
با آردینو نانو انجام دادم البته به جای فرستنده از ریموت کنترل ۱۲ کانال استفاده کردم و کتابخانه شم rc switch انتخاب کردم و جواب داد باد سیم دیتا را به پین d2 یا d3 با اینتراپت ۰ یا ۱ در تعریف پین ورودی وصل بشه راحت قابل استفاده است
خواهش میکنم،
ممنون از شما که تجربهات رو با ما و بقیه در میون گذاشتی.
سلام ممنون از توضیحات خوبتون
آیا امکان داره بدون آردینو از این ماژول استفاده کرد
سلام صاحب عزیز،
خواهش میکنم،
با میکروکنترلرهای دیگه هم میتونی از این ماژول استفاده کنی، اما اگر بدون میکرو مدنظرت هست،
طبیعتا مدار دیجیتالی نیازه که با ماژول ارتباط برقرار کنه.
سلام اگه بتونیم این ماژول را راه بیندازیم می تونیم فرستنده گیرنده با برد ۱کیلو متر رو هم راه بیندازیم؟یا فرق میکنه؟
سلام علی عزیز،
اگر ماژولهای NRF مدنظرته، راه اندازیشون متفاوته که البته آموزش اونها هم داخل سایت هست.