اطلاعیه

Collapse
No announcement yet.

[آموزش]راه اندازی ماژول +nRF24L01

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

    پاسخ : راه اندازی ماژول +nRF24L01

    نوشته اصلی توسط mohammadttl
    از کجا میتونم بفهمم آیا دیتا از فرستنده ارسال میشه یا نه؟؟؟
    1: معمولا یک برنامه ی ساده مینویسن یا ببینن اطلاعات رد و بدل میشه یا نه
    مثلا چند بایت رو میفستن
    و در گیرنده اگه بایت دریافتی -که از قبل معلومه چیه- با ارسالی یکی بود
    یک ال ای دی روشن میشه (چشمک میزنه) یا روی ال سی دی نمایش داده میشه
    یا یک صوت پخش میشه یا ... (هر نشونه ای که بتونیم ببینیم که داده اومده یا نه)

    2: بررسی پایه IRQ در گیرنده!
    اگه فرستنده گیرنده در فاصله مناسبی از هم باشند
    وقتی گیرنده داده دریافت کنه پایه IRQ تغییر میکنه

    3: استفاده از آمپرسنج یا وات سنج در فرستنده!
    زمانی که داده میخواد ارسال بشه
    فرستنده جریان میکشه (در حد میلی آمپر)
    حالا شما بیا در فواصل مثلا 1 ثانیه به 1 ثانیه داده ارسال کن
    یعنی 1 ثانیه مدام بفرست
    1 ثانیه چیزی نفرست
    و با آمپرمتر تغذیه ی ماژول رو بررسی کن
    در زمان ارسال جریان خواهد کشید

    4: استفاده از سیم پیچ و اسیلوسکوپ!
    یک تکه سیم مثلا 1 متری رو دور فرستنده بپیچ
    دو سر سیم رو به پراب اسکوپ بزن
    در زمان ارسال داده، باید تغییراتی در اسکوپ ببینی

    5: استفاده از یک مدار پسیو در فرکانس کاری فرستنده!
    دیدی روی این موبایل ها یا برچسب میزنن
    و در زمان تماس یا پیامک یه چراغی روشن میشه؟
    این کار هم میشه کرد!
    البته باید مدارشو خودت طراحی کنی!
    و ...

    نوشته اصلی توسط mohammadttl
    من حواسم نبود 5 ولت دادم به ماژول یعنی ماژولم سوخته؟؟
    انشالله که نسوخته باشه
    1: اللهم صل علي محمد و آل محمد و عجل فرجهم و ...
    2: دانش بهتره يا ثروت؟ بدون شعور هيچکدوم!
    3: دلا معاش چنان کن که گر بلغزد پاي *** فرشته‌ات به دو دست دعا نگه دارد (حافظ)

    دیدگاه


      پاسخ : راه اندازی ماژول +nRF24L01

      ازتوضیحات شما ممنون آقای رستمی،اما میخوام بدونم توی هدر کجا باید تغیرات رااعمال کنم؟آقای ایمانی فر اگر براتون مقدور بود راهنمایی بفرمایید ممنون

      دیدگاه


        پاسخ : راه اندازی ماژول +nRF24L01

        نوشته اصلی توسط زوار
        ازتوضیحات شما ممنون آقای رستمی،اما میخوام بدونم توی هدر کجا باید تغیرات رااعمال کنم؟آقای ایمانی فر اگر براتون مقدور بود راهنمایی بفرمایید ممنون
        من دیروز خواستم جوابتون رو بدم ولی خودمم مطمئن نبودم.
        ببینید داخل تابع nRF_Config این قسمت برای تنظیم رجیسترهاست:

        کد:
        Command_Reg = 0x01;
          Set_Reg(0x21);  
          
          Command_Reg = 0x01;
          Set_Reg(0x22);  
           
          Command_Reg = 0x03;
          Set_Reg(0x23);  
          
          Command_Reg = 0x2f;
          Set_Reg(0x24);  
                    
          Command_Reg = 0x01;  
          Set_Reg(0x25);   
          
          Command_Reg = 0x06;  
          Set_Reg(0x26);   
          
          Set_Reg(0x2A);   
          
          Set_Reg(0x30);   
          
          Command_Reg = 0x01;  
          Set_Reg(0x3C);   
            
          Command_Reg = 0x07;  
          Set_Reg(0x3D);     
          
          if(mode==0)
          {
            Command_Reg = 0x4E;
            Set_Reg(W_REGISTER);  
            delay_ms(100);
            send_actived = 1;
          }
          else
          {
            Command_Reg = 0x3F;
            Set_Reg(W_REGISTER);  
            delay_ms(5);
            CE = 1;
          }
        آدرس 0x06 برای RF_Setup هست و بیتهای 1و2 هم برای RF_PWR یا همون قدرت خروجی، ولی متوجه نشدم چرا 3بار مقدار دهی شده!

        کد:
          Command_Reg = 0x06;  
          Set_Reg(0x26);   
          
          Set_Reg(0x2A);   
          
          Set_Reg(0x30);
        از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

        دیدگاه


          پاسخ : راه اندازی ماژول +nRF24L01

          از راهنمایی شما آقای shahin2222 خیلی ممنون،من میخوام این رجیستر متغییر باشه یعنی روی lcd بتونم گین را کم وزیاد کنم آیا از داخل هدر این امکان وجئدداره

          دیدگاه


            پاسخ : راه اندازی ماژول +nRF24L01

            نوشته اصلی توسط زوار
            از راهنمایی شما آقای shahin2222 خیلی ممنون،من میخوام این رجیستر متغییر باشه یعنی روی lcd بتونم گین را کم وزیاد کنم آیا از داخل هدر این امکان وجئدداره
            خواهش میکنم
            باید بشه اینکارو کرد چرا نشه!
            البته مستقیم از داخل هدر که نه، باید چند خط به برنامه تون اضافه کنید
            شما قبل اینکه ماژول رو راه اندازی کنید یعنی قبل از فراخوانی تابع ()nRF_Config ، از کاربر بخواید که قدرت خروجی رو بصورت عدد 0 تا 3 وارد بکنه و یا به هر صورتی که تو ذهنتون هست، سپس اونو داخل یک متغیر مثل x بریزین و موقع مقدار دهی به رجیستر آدرس 0x06 اون متغیر رو با تابع Set_Reg به رجیستر اعمال کنید. به این شکل:
            کد:
            Command_Reg = 0x06;  
              Set_Reg(x<<1);
            البته اول باید تکلیف این مشخص بشه بعد:
            کد:
              Command_Reg = 0x06;  
              Set_Reg(0x26);   
              
              Set_Reg(0x2A);   
              
              Set_Reg(0x30);
            اگه کسی اطلاع داره ممنون میشم مارو هم در جریان بذاره
            از سختی نترس! این سختی هاست که جایگاه و مقام انسان را بالا میبرد...

            دیدگاه


              پاسخ : راه اندازی ماژول +nRF24L01

              آقای صادقی خیلی خیلی خیلی ممنون از توضیحاتتون من 1چیزایی فهمیدم 1 چیزایی هم نفهمیدم
              این کارهایی که شما گفتید مگه همش در خود چیپ انجام نمیشه؟ صفحه 28 دیتاشیت 78 صفحه ای یا همون بخش 7.3 Enhanced Shockburst™ packet format
              حالا همه اینهایی که شما گفتید رو خودش داره انجام میده یعنی هم بایت برای شروع می فرسته هم آدرس هم تعداد بایت های ارسالی و چندتا چیز دیگه
              خوب الان بازم من باید اینهارو دوباره توی اون 32بایتی که برای من به عنوان payload گذاشته دوباره بفرستم؟!!!!

              دیدگاه


                پاسخ : راه اندازی ماژول +nRF24L01

                نوشته اصلی توسط shahin2222
                خواهش میکنم
                باید بشه اینکارو کرد چرا نشه!
                البته مستقیم از داخل هدر که نه، باید چند خط به برنامه تون اضافه کنید
                شما قبل اینکه ماژول رو راه اندازی کنید یعنی قبل از فراخوانی تابع ()nRF_Config ، از کاربر بخواید که قدرت خروجی رو بصورت عدد 0 تا 3 وارد بکنه و یا به هر صورتی که تو ذهنتون هست، سپس اونو داخل یک متغیر مثل x بریزین و موقع مقدار دهی به رجیستر آدرس 0x06 اون متغیر رو با تابع Set_Reg به رجیستر اعمال کنید. به این شکل:
                کد:
                Command_Reg = 0x06;  
                  Set_Reg(x<<1);
                البته اول باید تکلیف این مشخص بشه بعد:
                کد:
                  Command_Reg = 0x06;  
                  Set_Reg(0x26);   
                  
                  Set_Reg(0x2A);   
                  
                  Set_Reg(0x30);
                اگه کسی اطلاع داره ممنون میشم مارو هم در جریان بذاره
                کسی نمیتونه به من کمک کنه و یه توضیح درباره مشکل من بده؟

                دیدگاه


                  پاسخ : راه اندازی ماژول +nRF24L01

                  نوشته اصلی توسط saeed210
                  آقای [glow=red,2,300]رستمی[/glow] خیلی خیلی خیلی ممنون از توضیحاتتون من 1چیزایی فهمیدم 1 چیزایی هم نفهمیدم
                  این کارهایی که شما گفتید مگه همش در خود چیپ انجام نمیشه؟ صفحه 28 دیتاشیت 78 صفحه ای یا همون بخش 7.3 Enhanced Shockburst™ packet format حالا همه اینهایی که شما گفتید رو خودش داره انجام میده یعنی هم بایت برای شروع می فرسته هم آدرس هم تعداد بایت های ارسالی و چندتا چیز دیگه. خوب الان بازم من باید اینهارو دوباره توی اون 32بایتی که برای من به عنوان payload گذاشته دوباره بفرستم؟!!!!
                  با این حساب نه!
                  اما برای "اولین ارتباط" شما باید نکاتی رو رعایت کنی
                  یعنی حالتی که فرستنده بعد از گیرنده روشن بشه!
                  شما برنامه ت رو طوری بنویس که هر زمانی که فرستنده روشن شد
                  قبل از اینکه بخوای داده های اصلی رو با ماژول گیرنده رد و بدل کنی
                  یک ارتباط بین گیرنده و فرستنده برقرار بشه

                  میتونه اینطوری باشه:
                  (فرض: ماژول 1 در ابتدا فرستنده، ماژول 2 در ابتدا گیرنده)
                  ماژول 1 بعد از روشن شدن ابتدا یک "کد مشخص و از قبل تعیین شده" رو برای ماژول 2 میفرسته
                  سپس تغییر وضعیت میده و به حالت گیرندگی میره
                  و متنظر یک کد مشخص از ماژول 2 میشه
                  ماژول 2 که در ابتدا گیرنده بود، هر زمان که "کد مشخص و از قبل تعیین شده" ارسالی از ماژول 1 رو دریافت کرد
                  ابتدا اون کد رو بررسی میکنه تا ببینه درسته یا نه
                  در صورت درستی، ماژول 2 به حالت فرستندگی میره و کد مشخصی رو ارسال میکنه
                  بعدش دوباره در حالت گیرندگی قرار میگیره
                  نکته:
                  ماژول 1 که در ابتدا فرستنده بود و یک کد رو فرستاد
                  و بعدش در وضعیت گیرنده قرار گرفت و منتظر یک کد مشخص شد،
                  برای اینکه در یک حلقه ی نامعلوم گیر نکنه
                  باید در برنامه ش یک تایمر تعریف بشه
                  تا اگه بعد از مدت زمانی چیزی دریافت نکرد
                  ارسالش رو دوباره تکرار کنه

                  مثالی دیگه:
                  فرض کن من میخوام توی یک محله دنبال شما بگردم
                  یه بلندگو دست میگیرم و میگم "سعید"
                  و بعد "منتظر" پاسخ شما میمونم
                  اگه شما گفتی "بله" که خب حله و من میام "پیام مورد نظرم" رو به شما میگم
                  در صورتی که جوابی از شما دریافت نکردم
                  دوباره صدا میکنم "سعید" و "منتظر" پاسخ میمونم ...
                  1: اللهم صل علي محمد و آل محمد و عجل فرجهم و ...
                  2: دانش بهتره يا ثروت؟ بدون شعور هيچکدوم!
                  3: دلا معاش چنان کن که گر بلغزد پاي *** فرشته‌ات به دو دست دعا نگه دارد (حافظ)

                  دیدگاه


                    پاسخ : راه اندازی ماژول +nRF24L01

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

                    من نگاه کردم اگه اشتباه نگفته باشم شما باید توی کتابخونه بخشه
                    کد:
                      Command_Reg = 0x06;  
                      Set_Reg(0x26);   
                      
                      Set_Reg(0x2A);   
                      
                      Set_Reg(0x30);
                    به جای Command_Reg = 0x06; یک مقدار دیگه بدی مثلا برای 18dbm- باید بدی 0x00 و برای 6dbm- باید بدی 0x04
                    در اصل این عدد همون مقدار وضعیت رجیستر rf_setup هستش
                    موفق باشی

                    دیدگاه


                      پاسخ : راه اندازی ماژول +nRF24L01

                      آقای صادقی بازم ممنون از توضیحاتتون
                      من الان اومدم دوبایت مختلف توی دو نوبت (یعنی دوتا 1 بایت) از فرستنده فرستادم
                      اگه فرستنده و گیرنده باهم وصل بشن که هر دوبایت دریافت میشه و مشکلی نیست
                      اما اگه فرستنده بعد حدود 7ثانیه بفرسته دیگه گیرنده دریافت نمی کنه درواقع این اتفاق می افته: توی گیرنده وقفه اتفاق می افته و مقدار رجیستر payload صفر می مونه و وقتی فرستنده بایت دوم رو ارسال میکنه گیرنده دیگه وقفه نمیده و مقدار رجیستر payload دیگه خونده نمیشه.
                      مثل این میمونه اکه گیرنده بعد از یک مدت که بیکار میمونه میره روی standby ( که درواقع همین طور هم هست و توی دیتاشیتش هم نوشته ) ولی دیگه توی دیتاشیت ننوشته که چطوری باید از standby در آوردش
                      یعنی من کلا نمیتونم براش چیزی بفرستم که بخوام کارهایی که شما گفتید رو انجام بدم
                      نظر دوستان چیه؟؟؟؟

                      دیدگاه


                        پاسخ : راه اندازی ماژول +nRF24L01

                        نوشته اصلی توسط saeed210
                        سلام
                        خوب یکدفعه کتابخونه رو یا یک عدد که به set_reg میدی مقدار دهی کن و ببین رفتار و منطق برنامه چیه؟

                        من نگاه کردم اگه اشتباه نگفته باشم شما باید توی کتابخونه بخشه
                        کد:
                          Command_Reg = 0x06;  
                          Set_Reg(0x26);   
                          
                          Set_Reg(0x2A);   
                          
                          Set_Reg(0x30);
                        به جای Command_Reg = 0x06; یک مقدار دیگه بدی مثلا برای 18dbm- باید بدی 0x00 و برای 6dbm- باید بدی 0x04
                        در اصل این عدد همون مقدار وضعیت رجیستر rf_setup هستش
                        موفق باشی
                        از پاسخ شما ممنون اما Command_Reg = 0x06 فکر کنم آدرس رجیستر rf_setup میباشد ونمیشه عوضش کرد و این مقدارها که نمیدونم از کجا آمده باید عوض بشه
                        کد:
                        Set_Reg(0x26);   
                          
                          Set_Reg(0x2A);

                        دیدگاه


                          پاسخ : راه اندازی ماژول +nRF24L01

                          نوشته اصلی توسط زوار
                          از پاسخ شما ممنون اما Command_Reg = 0x06 فکر کنم آدرس رجیستر rf_setup میباشد ونمیشه عوضش کرد و این مقدارها که نمیدونم از کجا آمده باید عوض بشه
                          کد:
                          Set_Reg(0x26);   
                            
                            Set_Reg(0x2A);
                          خواهش می کنم
                          نه دوست من اون set_reg(0x26 برای تعیین رجیستر rf_setup هستش و خط Command_Reg = 0x06; مقدار رجیستر رو تعیین میکنه شما کتابخونه رو دوباره نگاه کن اگه لازم بود بگو توضیح بدم

                          دیدگاه


                            پاسخ : راه اندازی ماژول +nRF24L01

                            بله اگر ممکنه توضیح بدید که 0x6 چیه؟
                            وچرا بعدش این اعداد را وارد کرده؟

                            Set_Reg(0x26);

                            Set_Reg(0x2A);
                            من برای عوض کردن این که بتونم برد را کم و زیاد کنم باید چی کار کنم؟
                            ممنون

                            دیدگاه


                              پاسخ : راه اندازی ماژول +nRF24L01

                              حالا نمی شد این رو قبول کنید و توضیح ندم :biggrin:
                              خوب ببینید اگه تابع set_reg رو توی کتابخونه ببینید اولش این هست:
                              کد:
                              void Set_Reg(unsigned char ins)
                              {
                                int i;               
                                CSN = 0;  
                                Status_Reg=spi(ins);    
                                switch(ins & 0xE0)
                                {
                              یعنی مقداری که شما به تابع وارد میکنید مستقیم وارد تابع spi میشه درسته؟
                              خوب حالا شما وقتی می نویسی set_reg(0x26 این عدد 0x26 تو خط پنجم تابع set_reg وارد تابع spi میشه و اگه دیتا شیت رو ببینی فرستادن عدد 0x26 به ماژول یعنی اینکه شما می خواهی رجیستر 0x06 ماژول رو بنویسی(یعنی تغییرش بدی)- از وجود 2 می فهمه که می خوای بنویسی اگه 0x06 رو میفرستادی فکر میکرد که می خواهی رجیستر 0x06 رو بخونی--- صفحه 51 جدول 20 اون دیتاشیت 78 صفحه ای کامند R_REGISTER و W_REGISTER رو ببین---
                              برمیگردیم به تابع set_reg تا خط 5 اومدیم و به ماژول گفتیم که میخواهیم رجیستر 0x06 که همون RF_SETUP هست رو تغییر بدیم. خط ششم دستور زیر هست
                              کد:
                              switch(ins & 0xE0)
                              خوب این دستور اون 0x26 اول رو با 0xe0 اند میکنه که جوابش میشه 0x20 توی case ها اگه بگردی یکشی نوشته: W_REGISTER: که این عبارت رو بالا تعریف کرده::
                              کد:
                              #define W_REGISTER 0x20
                              حالا دستور های این case این هاست
                              کد:
                              }
                                  case W_REGISTER: 
                                  {             
                                    if((ins & 0x1F)==0x0A || (ins & 0x1F)==0x0B || (ins & 0x1F)==0x10)
                                    {
                                      for(i=4;i>=0;i--)
                                      {
                                        spi(Base_Addrs[i]);
                                      } 
                                    }
                                    else
                                    { 
                                      spi(Command_Reg);
                                    }
                                    break;
                                  }
                              توی if اولی اومده همون 0x26 اول که به تابع دادیم رو با 0x1f اور کرده جوابش میشه 0x3f . همونجور که میبینی توی if اول این 0x3f نه با 0x0a نه با 0x0b و نه با 0x10 برابره پس if اول صحیح نیست و وارد else میشیم
                              کد:
                              else
                                    { 
                                      spi(Command_Reg);
                                    }
                              اینجا فقط یک دستور ساده داریم که میگه مقدار Command_Reg رو به spi بفرست درسته؟ حالا مقدار این Command_Reg چیه؟ اگه یادت باشه قبل دستور set_reg(0x26 نوشته شده بود Command_Reg = 0x06 کد های زیر رو نگاه کن یادت بیاد
                              کد:
                                Command_Reg = 0x06;  
                                Set_Reg(0x26);   
                                
                                Set_Reg(0x2A);   
                                
                                Set_Reg(0x30);
                              خوب نتیجه چی شد؟ اگه تابع set_reg(0x26 رو اجرا کنیم و چیزهای اضافه رو پاک کنیم این کد ها رو داریم
                              کد:
                              Command_Reg = 0x06; 
                              Set_Reg(0x26)
                              {               
                                CSN = 0;  
                                Status_Reg=spi(0x26);    
                                spi(0x06);    
                                CSN=1; 
                                delay_us(10);
                              }

                              اول csn صفر میشه که یعنی باس spi ماژول فعال میشه
                              دوم 0x26 فرستاده میشه به ماژول که به ماژول بفهمونه که میخواهیم رجیستر 0x06 رو تغییر بدیم
                              سوم 0x06 رو میفرسته به ماژول که مقدار رجیستر rf_setup رو برابر 0x06 میکنه
                              چهارم پایه csn رو دوباره یک میکنه که به معنی غیر فعال کردن باسspi ماژول و پایان نقل و انتقالاته اطلاعت هست

                              آخی خسته شدم انقد تایپ کردم
                              امیدوارم متوجه شده باشی اگر هم نشدی چند بار بخون اگه بازم نشد دوباره بپرس توضیح بدم

                              کاشکی یکی هم پیدا میشد جواب من رو بده
                              من الان اومدم دوبایت مختلف توی دو نوبت (یعنی دوتا 1 بایت) از فرستنده فرستادم
                              اگه فرستنده و گیرنده باهم وصل بشن که هر دوبایت دریافت میشه و مشکلی نیست
                              اما اگه فرستنده بعد حدود 7ثانیه بفرسته دیگه گیرنده دریافت نمی کنه درواقع این اتفاق می افته: توی گیرنده وقفه اتفاق می افته و مقدار رجیستر payload صفر می مونه و وقتی فرستنده بایت دوم رو ارسال میکنه گیرنده دیگه وقفه نمیده و مقدار رجیستر payload دیگه خونده نمیشه.
                              مثل این میمونه اکه گیرنده بعد از یک مدت که بیکار میمونه میره روی standby ( که درواقع همین طور هم هست و توی دیتاشیتش هم نوشته ) ولی دیگه توی دیتاشیت ننوشته که چطوری باید از standby در آوردش
                              یعنی من کلا نمیتونم براش چیزی بفرستم که بخوام کارهایی که شما گفتید رو انجام بدم
                              نظر دوستان چیه؟؟؟؟

                              دیدگاه


                                پاسخ : راه اندازی ماژول +nRF24L01

                                راستی اون دستورهای
                                کد:
                                  Set_Reg(0x2A);   
                                  
                                  Set_Reg(0x30);
                                برای تنظیم رجیسترهای آدرس RX_ADDR_P0 و TX_ADDR هستش

                                دیدگاه

                                لطفا صبر کنید...
                                X