اطلاعیه

Collapse
No announcement yet.

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

Collapse
X
 
  • فیلتر
  • زمان
  • Show
Clear All
new posts

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

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


    دیتاشیت این ماژول رو هم میتونید از لینک زیر دانلود کنید:
    و فایل کتابخونه آردوینو رو هم برای آردوینو از اینجا دانلود کنید:
    اگر بخوام از کاربرد های این ماژول که یک ماژول کم مصرف هستن و برای کاربرد های توان پایین بسیار مناسبه بگم ، باید به موارد زیر اشاره کنم :
    ریموت کنترلها
    ریموت سنسورها
    انتقال داده بصورت بیسیم
    اسباب بازی ها
    و …
    توی Example های کتابخونه خیلی ازکدها جنبه کاربردی دارن ،مثل ریموت rgb و کنترل رله و.. که میتونید اونهارو هم چک و امتحان کنید.

    ویژگی های RMF12:

    توان خروجی 100mw که توان بالایی به حساب میاد.
    ورودی/خروجی آنتن 50 اهم
    توان ارسال (TX) قابل برنامه ریزی
    واسط کنترل سریال با SPI
    دارای Wake-Up Timer یا زمان سنج بیدارباش
    کنترل خودکار فرکانس
    حساسیت ورودی بالا
    و …
    که اگه قرار باشه همشو لیست کنم ، کل وقتمون رو میگیره!
    یک نکته فقط اینکه حواستون باشه که تغذیه ی این ماژول 3.3 ولته و واسط ارتباطی ، SPI هستش که در مطلب راه اندازی spi در آردوینو اون رو آموزش دادیم.
    نحوه کار Rmf12

    درسته که از آردوینو استفاده میکنیم تا از ورود کردن به جزئیات فرار کنیم ، ولی چون بحث آموزشیه ، خوبه که یکم وارد جزئیات هم بشیم، البته این هارو باید بدونین که ادامشو هم بفهمین!
    در شبکه بی سیم ، هر گروه از تعدادی گره و یک گره مرکزی تشکیل میشه که هر گره ریزپردازنده ای داره. نمودار گروه رو در شکل زیر میبینید:
    تعداد گره ها در شبکه بی سیم 31 عدد هست که گره های صفر و 31 خاص هستن و در مجموع 30 گره برامون میمونه و کلا 250 گروه هم داریم و نکته اینجاست که گره های متعلق به یک گروه میتونن با هم تبادل اطلاعات داشته باشن.
    برای راه اندازی rmf12b یا به شکل کلی تر یک شبکه ی حسگر بی سیم ، نیاز به بسته بندی اطلاعات، قراردادن داده ی سربار برای آدرس ، خطایابی و تایید داریم. در ماژول RFM12b ، یک بسته ی اطلاعاتی 9 بایت اضافی سربار داره:
    سه بایت مقدمه
    دو بایت همزمانی
    دو بایت اطلاعات بسته
    دو بایت crc

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

    بیت A (ACK): این بیت نشون میده ، بسته ای که میفرستیم از گیرنده تاییدِ درسخوات میخواد یا نه.
    بیت D (DST): بیت مشخص کننده ، گره مبدا یا مقصده
    اگر بخوایم به گره خاصی ، داده بفرستیم ، بیت رو یک میکنیم
    اگر بخوایم همه ی گره ها ، داده رو دریافت کنن، بیت رو صفر میکنیم.
    بیت C (CTL): این بیت برای ارسال تایید دریافت به کار میره.
    گفتیم که تعداد گره ها 30 تاس و 250 گروه میتونیم داشته باشیم .چون گروه ها در فرکانس یکسانی کار میکنن ، همزمان نمیتونن تبادل داده کنن.سرعت تبادل داد هم حدود 50 هزار بیت در ثانیه هستش. درنتیجه ، یک بسته ی داده کامل 66 تایی حدود 12 میلی ثانیه طول میشکه ارسال بشه.

    (66+9)*8*20us=12ms

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


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

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

    تابع rf12_initialize

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

    کد HTML:
    rf12_initialize(id,rf12_band,group)
    id : شماره گره .(گفتم گره صفر و 31 گره های خاصی هستن. گره صفر مخصص حالت ON-Off keying هستش و گره شماره 31 ، پیام مربوط به همه ی گره ها در گروه خود رو برمیداره.)
    rf12_band : برای تعریف محدوده ی فرکانسی هستش. فرکانس کاری روی تراشه درج شده.
    group :گروهی که گره ها با هم تبادل اطلاعات دارن.

    مثال:مازول رو در گروه 33 و در فرکانس 433 مگاهرتز و در گره دوم تعریف کردم:
    کد HTML:
    rf12_initialize(1,rf12_433,2)
    تابع rf12_recvdone(void)

    اگر ماژول داده ای دریافت کنه ، خروجی تابع TRUE هست .پس از دریافت داده ، متغیر های زیر معتبرن :
    rf12_hdr : بایت header است که شامل بیت های پرچم و شماره گره هستش.
    rf12_len : تعداد بایت داده در بسته رو میده. (عددی بین صفر تا66)
    rf12_data : اشاره گری به داده ی دریافتی هستش.
    rf12_crc : کد crc داده ی دریافتی (2 بایت کدی که بالا گفتم )
    که اگر عددی بجز صفر دریافت کنیم ، سایر داده ها صحیح نیستند.
    مثال: این برنامه اگر داده ای رو دریافت کنه ، به صورت سریال میفرسته:
    کد HTML:
    if(rf12_recvDone() && rf12_crc==0){
        for(byte i=0;i<rf12_len;i++)
           serial.println(rf12_data[i]);
    }

    تابع rf12_canSend(void)

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

    شکل کلی این تابع به شکل زیره :
    کد HTML:
    rf12_sendStar(hdr,ptr,len)
    با فرخوانی ای تابع ، داده ها شروع به ارسال میشن، قبل از اون باید مطمئن بشیم که داده دیگه ای در حال ارسال یا دریافت نباشه . با بررسی خروجی دو تابع rf12_canSend و rf12_recvDone از این موضوع میتونیم مطمئن بشیم.پارامتر های ورودی تابع بصورت زیره:
    hdr : این قسمت شامل بیت های پرچم و شماره ی گره مقصده.
    ptr :اشاره گر به داده ی ارسالیه.
    len : تعداد بایت های ارسالی رو نشون میده.

    مثال:
    بیست بایت ارسالی رو با درخواست تایید از طرف گیرنده به گره شماره یک قراره بفرستیم:
    کد HTML:
    #include <JeeLib.h>
    #define RF12_HDR_ACK 0X20 
    MilliTimer sendTimer;
    const byte Node_ID ;
    char buf[20];
    byte needToSend;
    void setup(){
      }
    void loop(){
    if (sendTimer.poll(3000))
    needToSend=1;
    if(needToSend && rf12_canSend()){
    needToSend=0;
    rf12_sendStart(RF12_HDR_ACK|Node_ID,buf,20);}}
    تابع 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 هستش.

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


    کد HTML:
    #include <JeeLib.h>
    byte temp,pending;
    MilliTimer sendTimer;
    void setup(){
      analogReference(INTERNAL);
      rf12_initialize(1,RF12_433MHZ,88);
    }
    void loop(){
      temp=analogRead(0);
      rf12_recvDone();
      if(sendTimer.poll(100)){
        pending=1;
      }
      if(pending && rf12_canSend()){
        rf12_sendStart(0,&temp,sizeof temp);
        pending =0;
      }
    }
    ,و برنامه ی گیرنده :

    کد HTML:
    #include <JeeLib.h>
    void setup(){
      Serial.begin(9600);
      rf12_initialize(1,RF12_433MHZ,88);
    }
    void loop(){
      if(rf12_recvDone()&& rf12_crc ==0){
        for(byte i=0;i<rf12_len;i++){
          Serial.print(' ');
          Serial.print(rf12_data[i],HEX);    
        }
       
      }
    }
    تابع های اصلی رو گفتم و همین مطلب خودش یک روز کامل ازم وقت گرفت ! توضیحات بیشتر رو در باره تابع های دیگه توی سایت jeelabs ببینید.

    منبع : لوینیک
لطفا صبر کنید...
X