آموزش راه اندازی rfm12b با آردوینو

rmf12b محصول شرکت چینی HOPE RF هستش و قراره امروز آموزش راه اندازی rfm12b رو در سایت قرار بدیم ، این فرستنده و گیرنده در فرکانس های 433 و 868 و 915 مگاهرتز کار میکنه.این ماژول فرکانس های دیگه هم میتونه تولید کنه ولی خب این 3 فرکانس ، فرکانس های آزاد یا اصطلاحا بدون گواهینامه هستند. واحد های فرستنده و گیرنده هر دو در یک تراشه هستن که در شکل زیر هم پایه ها و اسم هاشون میشه:

پین های rmf12

دیتاشیت این ماژول رو هم میتونید از لینک زیر دانلود کنید:

دانلود دیتاشیت rmf12

و فایل کتابخونه آردوینو رو هم برای آردوینو از اینجا دانلود کنید:

دانلود کتابخانه ی rmf12

اگر بخوام از کاربرد های این ماژول که یک ماژول کم مصرف هستن و برای کاربرد های توان پایین بسیار مناسبه  بگم ، باید به موارد زیر اشاره کنم :

ریموت کنترلها

ریموت سنسورها

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

اسباب بازی ها

و …

توی Example های کتابخونه خیلی ازکدها جنبه کاربردی دارن ،مثل ریموت rgb و کنترل رله و.. که میتونید اونهارو هم چک و امتحان کنید.

ویژگی های RMF12:

توان خروجی 100mw که توان بالایی به حساب میاد.

ورودی/خروجی آنتن 50 اهم

توان ارسال (TX) قابل برنامه ریزی

واسط کنترل سریال با SPI

دارای Wake-Up Timer یا زمان سنج بیدارباش

كنترل خودكار فركانس

حساسیت ورودی بالا

و …

که اگه قرار باشه همشو لیست کنم ، کل وقتمون رو میگیره!

یک نکته فقط اینکه حواستون باشه که تغذیه ی این ماژول 3.3 ولته و واسط ارتباطی ، SPI هستش که در مطلب راه اندازی spi در آردوینو اون رو آموزش دادیم.

نحوه کار Rmf12

درسته که از آردوینو استفاده میکنیم تا از ورود کردن به جزئیات فرار کنیم ، ولی چون بحث آموزشیه ، خوبه که یکم وارد جزئیات هم بشیم، البته این هارو باید بدونین که ادامشو هم بفهمین!

در شبکه بی سیم ، هر گروه از تعدادی گره و یک گره مرکزی تشکیل میشه که هر گره ریزپردازنده ای داره. نمودار گروه رو در شکل زیر میبینید:

توضیح شبکه بی سیم و rmf12

تعداد گره ها در شبکه بی سیم 31 عدد هست که گره های صفر و 31 خاص هستن و در مجموع 30 گره برامون میمونه و کلا 250 گروه هم داریم و نکته اینجاست که گره های متعلق به یک گروه میتونن با هم تبادل اطلاعات داشته باشن.

برای راه اندازی rmf12b یا به شکل کلی تر یک شبکه ی حسگر بی سیم ، نیاز به بسته بندی اطلاعات، قراردادن داده ی سربار برای آدرس ، خطایابی و تایید داریم. در ماژول RFM12b ، یک بسته ی اطلاعاتی 9 بایت اضافی سربار داره:
سه بایت مقدمه
دو بایت همزمانی
دو بایت اطلاعات بسته
دو بایت crc

RF12-packets
payload بسته ای اطلاعاتی است که 66 بایت جا داره. قسمت SYN ، دو بخش داره که بایت اول اون ثابته و بخش دوم اون گروهی تبادل داده میکنه. قسمت Head ، چند بیت داره ک در شکل زیر میبینید.

RF12-packets

بیت A (ACK): این بیت نشون میده ، بسته ای که میفرستیم از گیرنده تاییدِ درسخوات میخواد یا نه.

بیت D (DST): بیت مشخص کننده ، گره مبدا یا مقصده

اگر بخوایم به گره خاصی ، داده بفرستیم ، بیت رو یک میکنیم

اگر بخوایم همه ی گره ها ، داده رو دریافت کنن، بیت رو صفر میکنیم.

بیت C (CTL): این بیت برای ارسال تایید دریافت به کار میره.

گفتیم که تعداد گره ها 30 تاس و 250 گروه میتونیم داشته باشیم .چون گروه ها در فرکانس یکسانی کار میکنن ، همزمان نمیتونن تبادل داده کنن.سرعت تبادل داد هم حدود 50 هزار بیت در ثانیه هستش. درنتیجه ، یک بسته ی داده کامل 66 تایی حدود 12 میلی ثانیه طول میشکه ارسال بشه.

یک بسته داده رو با جزئیات کامل در شکل زیر میبینید:

full bits in rfm12

 

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

تابع های rfm12b

آردوینو تابع های لازم برای ارتباط با RFM12b رو فراهم میکنه که در کتابخونه ی JeeLib.h موجوده .(اگر از افرادی هستین که آموزش آردوینو سایت رو دنبال میکنید این مژده رو بدم که جلسات آخر، آموزش کتابخانه نوشتن برای آردوینو رو هم آموزش میدم و دیگه لازم نیست اگر کتابخونه ای پیدا نکردین بیخیال آردوینو بشین!)

 

تابع rf12_initialize

تابع زیر برای تعریف شبکه rfm12b استفاده میشه و 3 ورودی داره:

id : شماره گره .(گفتم گره صفر و 31 گره های خاصی هستن. گره صفر مخصص حالت ON-Off keying هستش و گره شماره 31 ، پیام مربوط به همه ی گره ها در گروه خود رو برمیداره.)

rf12_band : برای تعریف محدوده ی فرکانسی هستش. فرکانس کاری روی تراشه درج شده.

group :گروهی که گره ها با هم تبادل اطلاعات دارن.

 

مثال:مازول رو در گروه 33 و در فرکانس 433 مگاهرتز و در گره دوم تعریف کردم:

تابع rf12_recvdone(void)

اگر ماژول داده ای دریافت کنه ، خروجی تابع TRUE هست .پس از دریافت داده ، متغیر های زیر معتبرن :

rf12_hdr : بایت header است که شامل بیت های پرچم و شماره گره هستش.

rf12_len : تعداد بایت داده در بسته رو میده. (عددی بین صفر تا66)

rf12_data : اشاره گری به داده ی دریافتی هستش.

rf12_crc : کد crc داده ی دریافتی (2 بایت کدی که بالا گفتم )

که اگر عددی بجز صفر دریافت کنیم ، سایر داده ها صحیح نیستند.

مثال: این برنامه اگر داده ای رو دریافت کنه ، به صورت سریال میفرسته:

تابع rf12_canSend(void)

اگر تراشه آماده ارسال باشه ، خروجی تابع TRUE هستش و در صورت آماده بودن تراشه ، تابع rf12_sendStar رو برای ارسال داده فراخوانی میکنیم.

تابع rf12_sendStar

شکل کلی این تابع به شکل زیره :

با فرخوانی ای تابع ، داده ها شروع به ارسال میشن، قبل از اون باید مطمئن بشیم که داده دیگه ای در حال ارسال یا دریافت نباشه . با بررسی خروجی دو تابع rf12_canSend و rf12_recvDone از این موضوع میتونیم مطمئن بشیم.پارامتر های ورودی تابع بصورت زیره:

hdr : این قسمت شامل بیت های پرچم و شماره ی گره مقصده.

ptr :اشاره گر به داده ی ارسالیه.

len : تعداد بایت های ارسالی رو نشون میده.

 

مثال:

بیست بایت ارسالی رو با درخواست تایید از طرف گیرنده به گره شماره یک قراره بفرستیم:

تابع sendTimer.poll(3000) هر 3 ثانیه TRUE میده ! علت اینکه تاخیر رو جدا از rf12_canSend بررسی میکنیم ، امکان صفر شدن لحظه ای خروجی تابع تاخیر هنگام یک شدن تابع rf12_canSend هستش.

تابع rf12_sendNow(unit8_t hdr,const void*ptr,unit8_t len)

این تابع ترکیبی از تابع هایrf12_cansend  و rf12_sendStar میباشد. به محض اینکه ماژول ، آماده ی ارسال داده باشه ، داده رو ارسال میکنه. پارامتر های ورودی اون مثل تابع rf12_sendstar هستش.

 

مثال پایانی:

برنامه ای قراره بنویسیم که دمای اتاق رو بشکل بی سیم میفرسته و گیرنده داده دریافتی رو به صورت سریال ارسال میکنه.

و برنامه ی گیرنده :

 

تابع های اصلی رو گفتم و همین مطلب خودش یک روز کامل ازم وقت گرفت ! توضیحات بیشتر رو در باره تابع های دیگه توی سایت jeelabs  ببینید.

حمیدرضا مودت

یک مهندس الکترونیک ، علاقه مند به یاد دادن و یاد گرفتن پیرامون دانش برق و الکترونیک

شما ممکن است این را هم بپسندید

پاسخ دهید

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