آموزش قدم به قدم راه اندازی +NRF24L01 با کتابخانه سازگار با انواع میکروکنترلرها و کامپایلرها
قبل از اینکه قسمت بشه با ماژول +NRF24L01 کار کنم، خیلی از دوستان را دیده بودم که با این ماژول درگیر بودند و توی راهاندازیش مشکل داشتند و مثل یک اپیدمی شده توی گروههای تلگرامی و فرومها. همانطور که حدس میزنید وقتی که به ماژول +NRF24L01 نیاز پیدا کردم تا راهش بندازم و ازش استفاده کنم دقیقا همین بلا سر خودم هم اومد.
هدفم از نوشتن این مطلب این هست که دیگه مشکلی توی راهاندازی ماژول +NRF24L01 نباشه و همه به راحتی بتونن باهاش کار کنن و از قابلیت های این کتابخونه تقریباً بطور کامل استفاده کنن.
پس وقت را تلف نکنیم و بریم سراغ راهاندازی … با سیسوگ همراه باشید.
ترتیب پایه های ماژول +NRF24L01
نکات
- در این کتابخانه از پین IRQ استفاده نمیشود.
- CSN همان SS در ارتباط SPI است و CE یک پین اضافه کنترلی برای ماژول +NRF24L01 میباشد.
- نحوه اتصال پایهها به میکروکنترلر در فایل c تعریف میشود که متعاقباً مفصل توضیح داده خواهد شد.
- همانطور که میدانید تغذیه ماژول 3 ولت هست اما بقیه پایههای ارتباطی ماژول (5v tolerant) هستند. یعنی سطح لاجیک 5 ولت رو تحمل میکنه و میتونیم مستقیم به میکروکنترلرهای 5 ولتی، مثل بعضی از مدلهای avr متصل کنیم.
توضیحات در مورد کتابخانه
این کتابخانه شاید بهینهترین نباشه اما احتمالاً portable ترین هست. (نمیدونم فارسیش چیه) یعنی شما میتوانید با تغییرات کوچکی این کتابخانه را متناسب با میکروکنترلر خودتان شخصیسازی کنید. علت این صحبت هم این هست که شما با تغییر دادن چند تا تابع (که به قسمت GPIO هر میکروکنترلر مربوط میشه) در فایل radioPinFunctions.c، میتوانید کتابخانه موردنظر را شخصیسازی کنید و هر پایهای از میکروکنترلر را به هر کدام از پایههای ماژول +NRF24L01 که خواستید وصل کنید و از این بابت جای هیچ نگرانی نیست. این قسمت فقط یکم دانش زبان C میخواد و آشنایی با GPIO میکروکنترلر مربوطه.
در این کتابخانه حالتهای Auto Acknowledgement و Auto Retransmission فعال شده است و تعداد دیتا باید یک اندازه ثابت باشه (static length payload mode).
دو ویژگی ذکر شده از مهمترین قابلیتهای +NRF24L01 هستند که با آنها میتوانیم بفهمیم دیتا درست رسیده یا نه!
همچنین اگر دیتا در مرحله ارسال از دست رفت و درست به مقصد نرسید این چیپ میتواند خودش کار ارسال دوباره (Retransmision) رو انجام بدهد، که میتوانیم این قسمت را هم خودمان تنظیم کنیم که چه تعداد تلاش دوباره انجام بدهد و بین هر کدام از این تلاشها چه تاخیری ایجاد شود.
البته تعداد تلاش دوباره روی 15 بار و تاخیر 1000 میکروثانیه به صورت خودکار تنظیم شده است، اما با تابع nrf24_RetransmissionConfig میتوانیم این مقادیر را تغییر بدهیم.
برای راهاندازی ماژول باید چهار فایل زیر در مسیر پروژه قرار بگیرد:
- nrf24.c
- nrf24.h
- nRF24L01.h
- radioPinFunctions.c
و در ابتدای کد برنامه باید دو فایل زیر ضمیمه شود:
1 2 | #include <nrf24.c> #include <radioPinFunctions.c> |
ممکن است کامپایلر یک سری Warning هم بدهد، آنقدر مهم نیستند، آنها را نادیده بگیرید.
(علت اینکه فایلهای c. رو داریم ضمیمه میکنیم این هست که یه سری از توابعی که داخل فایل nrf24.c وجود دارند داخل فایل nrf24.h موجود نیست. حال اگر فایل h. رو ضمیمه کنیم، احتمالا کامپایلر کلی ارور خواهد داد؛ اگرچه در عمل فایلهای h. و c. فرقی باهم ندارند و فقط فایل h. یک نامگذاری دیگر است که تفاوت بین فایلهای کتابخانه و کد پروژه مشخص باشد)
قبل از اینکه برویم سراغ کدنویسی یه نکته رو بگم،
خب شروع کنیم به یاد گرفتن توابع که ماشالله کم هم نیستن، ولی دست ما رو تقریباً واسه هر کاری باز میگذارند.
نحوه شخصیسازی فایل radioPinFunctions.c برای میکروکنترلر موردنظر
ابتدا ببینیم اصلا هدف و کاربرد این فایل چی هست؟!
قرار است ما در این فایل به کتابخانه بفهمانیم که چه پایهای از ماژول به چه پایهای از میکروکنترلر وصل است، سپس بیایم ورودی-خروجی بودن اون پایهها رو تعیین کنیم و در نهایت نحوه صفر و یک کردن اون پایه رو به کتابخانه یاد بدهیم. علت این کار هم این هست که کتابخونه بتونه با spi نرمافزاری با ماژول صحبت کند. (یعنی یه spi که ما خودمون با gpio ها ساختیم و دیگه محدودیت کتابخونه به یک میکروکنترلر رو برداشتیم و میتوانیم با هر میکروکنترلری کار کنیم)
در این قسمت همه مثالها و کدها بر اساس میکروکنترلر atmega8 ،avr است چراکه یک چیز عام باشد و همه بتوانند درکش کنند و ازش استفاده کنند. و شما باتوجه به فهمی که از avr دارید و توضیحاتی که داده شده، باید کد های مربوط به میکروکنترلر خودتان را جایگزین کنید.
بریم سراغ کدنویسی …
در خطوط اول فایل باید هدر میکروکنترلر مربوطه رو ضمیمه کنید تا برنامه رجیسترهای GPIO را بشناسد.
مثال
1 | #include <mega8.h> |
در ادامه سه تا define خواهید دید که کارشان مثل یک تابع هست که دو تا ورودی میگیرد و اونا رو توی یک عملیات جایگذاری میکند. (این قسمت برای کوتاه شدن کد استفاده شده است و شما ممکن است اصلا بهش نیازی نداشته باشید و بستگی به میکروکنترلرتون داره …)
(set_bit(reg,bit: یک بیت از یک رجیستر رو 1 میکند.
(clr_bit(reg,bit: یک بیت از یک رجیستر رو 0 میکند.
(check_bit(reg,bit: مقدار یک بیت بخصوص از یک رجیستر را برمیگرداند.
بقیه فایل دارای پنج تابع است که کاربرد و نحوه تغییر دادنشون را خدمت شما شرح خواهیم داد.
()nrf24_setupPins: نقش این تابع تعیین ورودی-خروجی بودن پایههای متصل به میکروکنترلر از ماژول میباشد.
مثال
میخواهیم پایه x از یک پورت میکرکنترلر مورد نظر را که به ce ماژول متصل است خروجی کنیم:
1 | set_bit(Register,x); |
که Register همان رجیستر مربوط به تعیین خروجی میکروکنترلر مورد نظر است.
مثال
پایه ce ماژول به پین 1 از پورت B میکروکنترلر mega8 متصل است که باید خروجی شود، پس:
1 | set_bit(DDRB,1); |
مابقی را نیز به همین شکل انجام میدهیم.
تابع (nrf24_ce_digitalWrite(state
برای مثال در این قسمت ما پایه ce را به پایه 1 پورت B میکروکنترلر atmega8 متصل کردهایم و تغییر آن به شکل زیر میشود:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | void nrf24_ce_digitalWrite(unsigned char state) { if(state) { set_bit(PORTB,1); } else { clr_bit(PORTB,1); } } |
همانطور که مشاهده میکنید کار این تابع این است که از ورودی 0 یا 1 میگیرد و اگر 1 بود دستور set_bit و اگر 0 بود دستور clr_bit را اجرا میکند. اما اینبار ورودی دستورات define شده، رجیستری است که مستقیماً سطح لاجیکی ( Logic Level ) پایهها را کنترل میکند.
برای مابقی توابع همین عملیات تکرار میشود.
برای تابع آخر هم باید مانند این مثال تغییر را اعمال کنیم.
برای مثال اگر پایه miso ماژول به پین 4 پورت B متصل باشد، کد مربوطه به شکل زیر خواهد شد:
1 2 3 4 5 6 7 | unsigned char nrf24_miso_digitalRead() { return check_bit(PINB,4); } |
خب کار شخصیسازی این فایل تمام شد، فایل را ذخیره میکنیم و دیگه کاری با فایلهای کتابخانه نداریم و میرویم سراغ یادگیری توابع و بکارگیریشون داخل کد اصلی برنامه.
توابع شامل چند دسته میشن که به ترتیب توضیح داده میشه :
پیکربندی (Configuration) ماژول +NRF24L01
برای پیکربندی اولیه ماژول +NRF24L01 سه تابع زیر تعریف میشود :
1- ()nrf24_init
این تابع باید اول از همه در تابع main فراخوانی شود و کارش تعیین ورودی-خروجی پایههای انتخاب شده از قبل و در کل، تخصیص پایههای میکروکنترلر به پایههای ماژول است.
2- (nrf24_config(channel , payload_length , data_rate
داخل این تابع کارهای زیادی انجام میشود، اما کارهایی که ما میتوانیم با ورودی تغییرشان بدهیم دو متغیر است، یکی انتخاب کانال فرکانسی هست؛ که میتوانیم به جای channel از 0 تا 83 قرار بدهیم و دیگری تعداد بایتهایی که میخواهیم در هر ارسال فرستاده شود؛ که میتوانیم به جای payload_length از 0 تا 32 قرار بدهیم.
به جای data_rate باید یکی از سه عدد زیر قرار گیرد:
0 -> 1Mbit/s
1 -> 2Mbit/s
2 -> 250Kbit/s
مثال
1 2 3 4 5 6 7 8 9 10 11 12 13 | void main(void) { nrf24_init(); nrf24_config(1,4,1); while(1) { } } |
در این مثال کانال 1 انتخاب شده است، یعنی فرکانس 2.401Ghz تعداد بایتهای ارسالی 4 عدد و سرعت ارسال 2Mbit/s میباشد.
3- (nrf24_RetransmissionConfig( delay_us , trial
این تابع برای تعیین تعداد تلاش دوباره برای ارسال و تاخیر بین هر دو تلاش در حالتی که دیتا به مقصد نرسیده است یا خطا دارد کاربرد دارد.
در این تابع مقدار تاخیر، به جای delay_us فقط ضرایب خاصی از 250 میتواند قرار گیرد. در غیر اینصورت رفتار ماژول قابل پیشبینی نیست.
این مقادیر تاخیر از طریق فرمول زیر به دست میآیند:
delay = (250*n)+250
که n از 0 تا 15 مقدار میپذیرد . یعنی ضرایب 250 تا حداکثر عدد 4000 قابل فهم و کار کردن برای ماژول است. پس میتوانیم اعداد 250، 500، 750، 1000، …، 4000 را در ورودی تابع قرار دهیم.
این تاخیر بر حسب میکرو ثانیه میباشد.
تعداد تلاش دوباره برای ارسال 0 تا 15 بار میباشد و به جای trial قرار میگیرد.
این تابع را خودم به کتابخونه اضافه کردم و دیدم به درد میخورد!
آدرس دهی
هر ماژول یک مک آدرس 5 بایتی مختص به خود را دارد که ما آن را به دلخواه انتخاب میکنیم و به ماژول اعلام میکنیم.
یک چیز دیگر که باید به ماژول اعلام شود، این است که طرف مقابل چه مک آدرسی دارد. که اینها از طریق دو تابع زیر انجام میشود:
1 | nrf24_rx_address(rx_mac); |
1 | nrf24_tx_address(tx_mac); |
این توابع باید در تابع main، بعد از توابع پیکربندی نوشته شوند.
اما چرا نوشتن این دو تابع مهم است؟ لطفا به مثال زیر دقت کنید تا اشتباه من رو مرتکب نشوید و مثل من یک هفته وقتتان گرفته نشود…
مثال
کد در قسمت فرستنده
1 2 3 4 5 6 7 | unsigned char rx_mac[5] = {0xE7,0xB2,0xE7,0xE7,0xE7}; unsigned char tx_mac[5] = {0xD7,0xD7,0xD7,0x12,0xD7}; nrf24_rx_address(rx_mac); nrf24_tx_address(tx_mac); |
کد در قسمت گیرنده
1 2 3 4 5 6 7 | unsigned char rx_mac[5] = {0xD7,0xD7,0xD7,0x12,0xD7}; unsigned char tx_mac[5] = {0xE7, 0xB2,0xE7,0xE7,0xE7}; nrf24_rx_address(rx_mac); nrf24_tx_address(tx_mac); |
میبینید که [rx_mac[5 در قسمت فرستنده با [tx_mac[5 در قسمت گیرنده برابر است و [tx_mac[5 در قسمت فرستنده با [rx_mac[5 در قسمت گیرنده برابر است و مک آدرسها به صورت ضربدری عوض شدهاند.
تنظیم فرستنده یا گیرنده
برای این کار از دو تابع زیر استفاده میشود که نیازی به توضیح ندارند.
()nrf24_powerUpRx: تنظیم به عنوان گیرنده.
()nrf24_powerUpTx: تنظیم به عنوان فرستنده.
بردن ماژول +NRF24L01 به حالت خواب (Sleep Mode)
با استفاده از تابع زیر در زمانهایی که به ماژول نیاز نداریم میتوانیم مصرف توان ماژول را به حداقل برسانیم.
1 | nrf24_powerDown(); |
ارسال داده (Transmit)
برای ارسال داده از تابع زیر استفاده میشود:
1 | nrf24_send(data_array); |
متغیر ورودی تابع در اینجا، برای مثال ما data_array میباشد.
در این تابع، برای فرستادن دیتا ابتدا ماژول به صورت خودکار در حالت فرستنده قرار میگیرد (کد داخل این تابع به این شکل هست) و برای برقراری ارتباط باید ماژول دیگر در حالت گیرنده قرار گرفته باشد و قسمت ( …. , …. , …. )nrf_config باید یکی باشند.
برای مثال متغیر data_array هم به شکل زیر تعریف می شود ( با فرض اینکه payload_length در تابع nrf_config برابر با 4 باشد):
1 2 3 4 5 6 7 8 9 | unsigned char data_array[4]; data_array[0] = 0x00; data_array[1] = 0xAA; data_array[2] = 0x55; data_array[3] = 0xFF; |
بعد از هر ارسال نباید دیتای دیگری را ارسال کرد و باید ابتدا از ارسال کامل دیتای قبلی اطمینان حاصل نمود برای این کار از تابع زیر استفاده میشود:
()nrf24_isSending
این تابع ورودی نمیگیرد و تا وقتی که دیتا در حال ارسال است، 1 را برمیگرداند و وقتی که ارسال تمام شد، 0 را برمیگرداند. و معمولا قبل از هر ارسال کد زیر قرار میگیرد:
1 | while(nrf24_isSending()); |
بعد از هر ارسال پیشنهاد میشود از درست ارسال شدن آخرین دیتا اطمینان حاصل کنیم و روی آخرین ارسال پردازش انجام دهیم که با دو تابع زیر انجام پذیر است:
()nrf24_lastMessageStatus
این تابع ورودی نمیگیرد و اگر 0 را برگرداند یعنی دیتا درست ارسال شده و اگر 1 را برگرداند یعنی ارسال دیتا به مشکل برخورده است.
()nrf24_retransmissionCount
این تابع نیز ورودی نمیگیرد و تعداد تلاش دوباره برای فرستادن آخرین دیتا را برمیگرداند.
دریافت داده (Recieve)
چون در این کتابخانه از پین IRQ استفاده نمیشود، بنابراین برای دریافت داده باید پیوسته تابع زیر را بخوانیم تا از رسیدن دیتا مطلع شویم:
()nrf24_dataReady
این تابع ورودی نمیگیرد و هر وقت عدد 1 را برگرداند یعنی در FIFO ماژول حداقل یک دیتا رسیده و باید خوانده شود.
برای دریافت دیتا باید تابع روبرو فراخوانی شود:
1 | nrf_getData(data_array); |
چون در زبان C قابلیت return یک آرایه قرار داده نشده است ما از این ترفند و ورودی قرار دادن آرایه در تابع استفاده کردیم.
که متغیر data_array باید به شکل زیر تعریف شود (فرض بر این است که payload_length در تابع nrf_config برابر 4 تنظیم شده است):
1 | unsigned char data_array[4]; |
که دیتای اول در [data_array[0، دیتای دوم در [data_array[1 و … قرار میگیرند.
با این توضیحات و توابعی که ذکر شد میتوانید کاملا ماژول را راهاندازی کنید.
توابعی که در پایین تر ذکر میشود توابع دیگری هستند که در کتابخانه موجود است و ممکن است برحسب پروژه خود، به آنها نیاز پیدا کنید.
nrf24_rxFifoEmpty: ورودی نمیگیرد و اگر FIFO دریافت خالی باشد 1 را برمیگرداند.
nrf24_payloadLength: ورودی نمیگیرد و تعداد بایت منتظر در FIFO را برمیگرداند.
nrf24_getStatus: رجیستر Status در NRF را برمیگرداند.
nrf24_configRegister: فقط یک بایت داده را در رجیستر مورد نظر مینویسد.
nrf24_readRegister: رجیستر مورد نظر را از NRF را میخواند.
nrf24_writeRegister: هر تعداد بایت داده به دلخواه در رجیستر مورد نظر مینویسد.
نکات کلی
برای استفاده از این ماژول ابتدا از میکروکنترلر mega 8 استفاده کردم با کلاک 8 مگاهرتز. و سپس قرار شد که میکروکنترلر عوض شود و LPC1768 استفاده شود با کلاک 100 مگاهرتز، پس من به این فکر افتادم که سرعت Software spi رو چک کنم تا از حد پشتیبانی nrf بیشتر نشود.
تست من طبق شرایط زیر است:
میکرو mega8 کلاک 8 مگاهرتز.
کلاک تایمر-کانتر را بر 8 تقسیم کردم تا محاسبات سادهتر شود و هر عدد کانتر نماینده یک میکروثانیه باشد. با یک کد ساده محاسبه شد که ارسال یک بایت داده با spi نرم افزاری 150 میکروثانیه طول میکشد. با یک محاسبه میتوان فهمید سرعت ارسال داده 53.333Kbit/s است پس با 10 برابر شدن کلاک GPIO باز هم از مرز 10Mbit/s رد نمیشویم و این خبر خوبیست.
خبر بد این است که برای جاهایی که سرعت ارسال داده (data rate) بالا نیاز است، خوب نیست و به درد نمیخورد.
پس بهترین کار این است که تابع spi_transfer در فایل nrf24.c را برای میکروکنترلر خودمان به spi سختافزاری تغییر بدیم تا دیگه این کتابخانه هیچ مشکلی نداشته باشد. (اینو دیگه میذارم به عهده خودتون)
فقط تنظیمات spi باید به شکل زیر باشد:
Sck idle state :low
Sampling rising edge :idle to active
Bit order :MSB First
شرایط بالا Mode=0، پروتکل spi را توصیف میکند.
یک تست خاص هم برای بُرد ماژول انجام دادم گفتم بذارم شاید به درد کسی بخورد.
شرایط تست: فرستنده از نوع دارای pa+lna مشکی رنگ میباشد و گیرنده از نوع معمولی +NRF24L01 .
میکروکنترلر: مگا 8
در محیط بسته تا 3 لایه دیوار ارتباط برقرار است .(تا صد متر فاصله)
اگر هر دو از نوع pa+lna باشد تا 10 لایه دیوار نیز ارتباط برقرار است.
خب خسته نباشید امیدوارم ماژول +NRF24L01 را راه انداخته باشید و ازش به خوبی استفاده کنید.
اگر سوالی داشتید حتما کامنت بگذارید سعی میکنم همه سوالات را جواب بدهم.
سورس کامل را هم میتوانید از منبع ( گیت هاب) و همچنین در زیر رایگان دانلود و استفاده نمایید.
سلام آیا امکان این هست که کد فرستنده و گیرنده یکی باشد
اگر منظورت برنامه است – میتونه یه برنامه هم کار فرستندگی رو انجام بده و هم کار گیرندگی رو ولی ماژول در آن واحد یا فرستنده است یا گیرنده
سلام.
آیا از این ماژول میشه صدا رو به صورت real time و یک طرفه منتقل کرد؟؟
یعنی یک فرستنده وجود داشته باشه که صدا رو بدون تاخیر(یا تاخیر خیلی کم که احساس نشه) به یک یا چندتا گیرنده یک طرفه منتقل کنه با کیفیت متوسط به بالا.
سلام به یکی میشه فکر کنم ولی چند تا رو با توجه محدودیت بیت ریت به مشکل برمیخوره
سلام ببخشید من هر بار کد به اردوینو دادم این خطا داد
sketch_sep14a:2:10: fatal error: nRF24L01.h: No such file or directory
سلام دوست عزیز
فکر میکنم این کتابخانه برای بستر آردوینو نباشه برای همین هم هست که احتمالا خطا دریافت میکنید.
سلام . من میخوام روی keil راه اندازی کنم. میشه مراحلش رو بفرمایید ک چطور add کنم کتاب خانه رو. ؟ من یکم تازه کارم
سلام وقت بخیر. ممنون بابت زحماتتون.
من میخوام یک ارتباط دو طرفه رو داشته باشم. مدار رو با یک عدد میکرو مگا 32 و یک عدد مگا 8 راه اندازی کردم. در طرف مگا 8یک سری کلید دارم که با فشار دادن هر کدوم عمل ارسال انجام میشه و در مگا 32 عملیات مربوط به کد دریافتی به درستی انجام میشه. در این لحظه وقتی میخوام از مگا 32 عملیات ارسال رو داشته باشم میکرو ریست میشه . دلیلش چی میتونه باشه. ممنون میشم راهنمایی بفرمایین
سلام و وقت بخیر. ممنون از زحماتتون.
من میخوام یک ارتباط دو طرفه رو داشته باشم. در یک طرف با atmega8 و طرف دیگ atmeg32 .در طرف مگا 8یه سری کلید تعبیه کردم که با فشار دادن هر کدوم ارسال انجام میشه و در طرف مگا 32 دریافت انجام میشه و مشکلی نیست. حالا میخوام کدی رو از مگا 32 ارسال کنم. در این لحظه میکرو ریست میشه. و دوباره عملیات قبل از ریست شدن انجام میشه.این در حالیه که وقتی مدار رو از برق جدا میکنم و دوباره میزنم و اینبار بدون اینکه از مگا 8 اطلاعاتی رو بفرستم، اطلاعاتی که میخوام با مگا32بفرستم و انجام میدم به درستی کار میکنه. بنظرتون ایرادم کجاست که این اتفاق می افته.
سوختن بس دلیل و کاهش برد مسافتی این ماژول ها چیه و از. کجا میشه ماژول توان بالا و خوب خرید؟ آخرین برد مسافتی که گرفتید چند بوده؟
سلام مهندس
خیلی ممنون از اموزش خوبتون
ما میتونیم به تنهایی خود NRF24L01 رو پروگرم کنیم؟
که مثلا فقط دیتای یک ماژول رو به یه nrf دیگه بفرسته که نیازی به اردوینو نباشه و یک شبکه بی سیم توی کل مکان راه بندازیم؟
نه این امکان نیست متاسفانه و حتما نیاز به میکروکنترلر کنای است
Nrf24le1
سلام مهندس من الان یک هفته دارم رو nrf24 کار میکنم هنوز جواب نگرفتم
نمیدونم مشکل از کجاست
از کتابخانه سایت خودتونم استفاده کردم اما نشد که نشد
حتی برنامه خودتونو پروگرم کردم اما بازم ارتباط برقرار نشد
خب مهندس سوال را یه کم دقیق تر بپرسیدتا بشه بررسی اش کرد
اینجور کلی که نمیشه :-))
من هم همین مشکل رو دارم
جالبه دوستان زیادی این مشکل رو دارن
اجازه بدید منم تست کنم این کد را فکر نکنم مشکلی داشته باشه
سلام ببخشید می خوام 2 تا دیتا بفرستم تو کانفیگ هم 2 رو قرار میدم ولی ارتباط بر قرار نمیشه لطفا ی مثال از نحوه ی فرستادن و گرفتن قرار بدید
سلام . من این کتابخونرو راه انداختم روی تنظیمات nrf24_config(1,1,0), اوکی بودش ولی زمانی که تنظیماتمو روی nrf24_config(1,2,0); تنظیم می کنم .زمانی که فرستنده می ره برای ارسال دیتا اجرای برنامه توی همون مرحله متوقف می شه ,انگار که پاسخ از گیرنده دریافت نمی کنه.البته تنظیماتم توی هر دو طرف یکسانه. تعداد بایت های بیشترو هم تست کردم جواب نداد.تنظیمات جای دیگه ای از برنامرو هم باید تغییر بدم یا نه,ممنون میشم که کمکم کنید.
تنظیم دوم مربوط به چی هست – یعنی چه چیزی رو فعال می کند ؟
سلام
میشه یه توضیح کاملی درباره ی قطعاتی که روی بورد جای اون ها هست و مونتاژ نشدن بدین
تشکر
سلام دوست خوبم
اول ممنون از توضیخات و فایلهای خوبتون
بعد اینکه من پوشه لایبراری را درون INC و دست آخر در همه پوشه ها کپی کردم
ولی بعد از build all این ارور رو می دهد
spi_transfer(W_REGISTER | (REGISTER_MASK & reg));
لطفا در اسرع وقت راهنمایی بفرمایید
سلام بچه ها
خوب هستید؟؟؟؟؟؟؟؟؟
میشه لطفا یه راهنمایی کنید که کتابخونه nrf2401برای پروتئوس رو از کجا می تونم دانلود کنم ؟؟
من هرچی دنبالش گشتم نیافتم
سلام درود
من با یه بی دقتی ولتاژ ورودی ماژول رو 5 ولت وارد کردم ولی به محض اطلاع درستش کردم چطوری می تونم متوجه شم که هر کدوم از ماژول ها سالم هستن یا نه؟؟
سلام
مقاومت بین پین های Vcc و Gnd چک کن حدود 4 5 مگ
سلام. وقتتون بخیر. من مدار رو راه اندازی کردم و داده ها رو روی پورت سریال دریافت میکنم.
مشکلی که دارم اینه که داده های تکراری دریافت میشن. مثلا 5تا 1 بعد 4تا 2 و…
و مشکل دوم اینکه بدون استفاده از هرگونه تاخیر در ارسال و دریافت، سرعت دریافت داده ها خیلی پایینه. انگار با تاخیر حدود 500 میلی ثانیه دریافت میشه.
ممنون میشم راهنمایی بفرمایید.
سلام وقت به خیر من میخواستم از این کتابخانه استفاده کنم برای راه اندازی stm32 برای ورودی و خروجی کردن از cube استفاده کردم پس تابع setup رو خالی کردم و برای نوشتن ۱ و۰ روی پایه ها از HAL_GPIO_Write استفاده کردم و بقیه کد را بدون تغییر استفاده کردم کد کامپایل میشود اما ارتباط برقرار نمی شود این هم کد radiofunction :
void nrf24_setupPins()
{
}
/* ————————————————————————- */
void nrf24_ce_digitalWrite(unsigned char state)
{
if(state)
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,1);
}
else
{
HAL_GPIO_WritePin(GPIOB,GPIO_PIN_0,0);
}
}
/* ————————————————————————- */
void nrf24_csn_digitalWrite(unsigned char state)
{
if(state)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,1);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_4,0);
}
}
/* ————————————————————————- */
void nrf24_sck_digitalWrite(unsigned char state)
{
if(state)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,1);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_5,0);
}
}
/* ————————————————————————- */
void nrf24_mosi_digitalWrite(unsigned char state)
{
if(state)
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,1);
}
else
{
HAL_GPIO_WritePin(GPIOA,GPIO_PIN_7,0);
}
}
/* ————————————————————————- */
unsigned char nrf24_miso_digitalRead()
{
return HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_6);
}
به نظر شما مشکل از کجاست که ارتباط برقرار نمیشود
سلام منم همین کار رو کردم کامپایل شد ولی عمل نکرد چه کار باید بکنم؟
سلام
خیلی ممنونم
یه سوالی که برام پیش اومده اینه که برای تغییر کانفیگ در وسط برنامه
اونم ممکنه چندین بار در دقیقه بخوایم تغییر کانفیگ بدیم
کتابخونه هایی که دارم کار نمیکنن
این کتابخانه کار میکنه برای این تغییر؟
به چه روشی باید تغییر کانفیگ رو انجام بدم؟
درود و خسته نباشید.
خب از اونجا که avr وقفه خارجی داره پس میتونم اون تابعی که منتظر دریافت هست رو بذارم تو تابع وقفه خارجی که هر وقت داده ای دریافت شد مثلا میکرو رو از خواب بیدار ✔✌ کنه و عملیات مورد نظر ر انجام بده و نیازی به تغییر در این کتابخونه نیست?؟! نه?؟ درست فک میکنم؟?، یعنی همینطوره دیگه
چون من چند تا کتابخانه دیگه تو اینترنت می گشتم کسی به کتابخونه ای که از پایه irq استفاده کرده باشه نشده بود!
مخصوصا گیت هاب!
سلام مهندس وقت بخیر
با lpc1788 روی spi2 تنظیمات رو انجام دادم (از spi سخت افزاری) استفاده کردم و نرم افزاری رو حذف کردم.
مشکل اینجاس در مد گیرنده status فقط مقدار 0xff رو برمیگردونه!
ایا این مقدار بازگشتی درسته؟
سلام خسته نباشید.
من با atmel studio شروع کردم به کار.
میخام با c++ این ماژول رو راه اندازی کنم.
با این کتابخونه میتونم؟
نیازه تغییری داخل کتابخونه بدم چون توی اتمل میخام باش کار کنم؟؟؟
منطقا نباید مشکلی وجود داشته باشه و به سادگی با تغییراتی که توی پست گفته شده باید بتونید از این کتابخانه استفاده کنید.
باشه خیلی ممنونم امتحان میکنم و اگر مشکلی داشت ازتون میپرسم.
اگر هم که درست شد و نیاز به تغییرات داشت فایل رو براتون ارسال میکنم که درصورت امکان توی سایت قرار بدید بقیه هم استفاده کنن
بازم ممنون❤️
سلام من از این ماژول میخوام یه led رو روشن کنم از یه طرف data رو گذاشتم 10
از گیرنده هم اگر 10 اومد یه پین 1 بشه اما نشد
آیا تنظیمات خاصی داره
کد گیرنده if(nrf24_dataReady())
{
nrf24_getData(data);
if(data[0]==10) PORTC.4=1;
}
فرستنده
data[0]=10;
do
{
nrf24_send(data);
while(nrf24_isSending());
}
while(nrf24_lastMessageStatus()) ;
مگا 8 دارم استفاده میکنم دست به هیچ چیز دیگه ای نزدم
سلام و خدا قوت
مطالب عالی هستند و تشکر میکنم
من برای تست دو تا مدار ساده پیاده سازی کردم. یکی برای فرستنده و یکی گیرنده. مساله ای که هست اینه که مدار کار میکنه و مشکلی نداره، اما اون بردی رو که توقع داشتم رو نداره. اول از ماژول دوچیپ معمولی استفاده کردم. برد حدود 50 تا 60 متر بود. بعد دوتا ماژول آنتن دار تهیه کردم و جایگزین کردم. اما در کمال ناباورب برد از نصف هم کمتر شد!
میخواستم بدونم به نظر شما ماژول ها مرغوب نیستند؟ یا اینکه برای راه اندازی از نظر سخت افزاری باید موارد خاصی رو رعایت کنم؟
در ضمن تغذیه مدارات از طریق برد تامین میشه که به USB سیستم وصله
سلام ماژولتون مرغوب نیست وگرنه تو فضای آزاد باید تا پونصد متر رو بگیرید
راه اندازی ماژول ها هیچ فرقی ندارن با هم دیگه
با سلام ممنون خیلی کامل و عالی توضیح دادید بدون مشکل انجام شد خدا خیرتون بده
سلام
خواهش میکنم، هدف ما هم همین بوده. موفق باشید
این ماژول رو هر کاری کردم با stm32 راه اندازی بشود نشد که نشد یعنی آقا رسول گیرکردم الان یه ماهه به هر دری میزنم نمیشه که …….
سلام فکر نمی کنم اینقدر چیز پیچیده ای باشه !!!!
همین کتابخانه رو تبدیل کردید ؟
چطور تست میکنید می بینید میشه یا نمیشه ؟
طبق کل نوشته های سایت جلو رفتم نه چیزی کم کردم نه زیاد
آیا امکان داره ماژولهاتون رو با سورس های سایت انجام بدید که برای avr هست ؟
انجام دادم نشد بی خیال شدم البته بیشتر سطح اولویت عوض شد من قبلا با avr و کتابخانه مرتضوی راه انداخته بودم اما دوست داشتم با stm32 راه بندازم که نشد بیشتر به خاطر اینکه الان stlink_v2 از اون مدل که شبیه usb هست وقتی وصل میکنم می نویسه traget not connect تا پول دستم بیاد نو بخرم بعد ها تست کنم
اها از اون جهت – ببینید راه اندازی با stm32 واقعا هیچ چیز اظافه ای نداره که بخوام بهش اشاره کنم واقعا همین قدر ساده است که توی پست بهش اشاره شده.
اون تست رو برای این گفتم انجام بدید چون میخواستم تست کنم که ماژلتون مشکلی نداشته باشه
شما از کدوم پایه های میکروی stm32 برای اتصال به ماژول استفاده می کردید ؟
سلام مد power down خوبه اما عالی نیست چرا ؟؟
برای اینکه 1.1 میلی آمپر هنوز مصرف داره و اگه با باتری کار کنم زود تموم میشه این یعنی هزینه
سوال:چطور باید به مد standby رفت تا مصرف به کمینه (حداقل) برسه
جواب :من بلد نیستم کمک کنید لطفا
سلام ، ممنون از مطلب عالی که گذاشتید.
من برای تست دقیقا مداری که به عنوان مثال گذاشته بودید رو بستم ولی فقط روی ال سی دی دیتا برابر صفر نشون میده.
نمیدونم مشکل از چیه!
تا برق ۳.۳ ماژول رو قطع نکنم هیچی روی صفحه نمایش بالا نمیاد، گیج شدم کلا
ولتاژ ها گرفتم درست بودند ، اتصالات رو چک کردم درست بودن ، ماژول رو هم عوض کردم ، منبع تغذیه هم عوض کردم دیگه چیزی به ذهنم نمیرسه.
ممنون میشم راهنمایی کنید
سلامی دوباره ،مشکل رو پیدا کردم ، متاسفانه از کیفیت بد ماژول ها بود ، با اینکه از یه سایت معتبر خرید کرده بودم ولی متاسفانه ماژول ها مشکل داشتن.
دو ماژول قدیمی دقیقا مانند این ماژول جدید ها پیدا کردم و جایگذاری کردم به خوبی جواب دادن .
به نظر جنس بدون کیفیت این روز ها بلای جان همه شده
با سلام
فایل ها قابل دانلود نیست.
مشکل دانلود فایل حل شد.
سلام جناب مهندس وقت بخیر
میخواستم بدون ایا بصورت نرم افزاری میتوان مد فرسنده و گیرنده را تغییر داد که به صورت شبکه دیتا هم ارسال و هم دریافت شود؟
سپاس اگر ممکنه یک پیام بدهید خیلی واجب است سپاس 09154256458
سلام
بله امکن پذیر هست
توی متن توضیح داده شده
دوباره براتون کپی کردم :
()nrf24_powerUpRx: تنظیم به عنوان گیرنده.
()nrf24_powerUpTx: تنظیم به عنوان فرستنده.
ممنون راه اندازی شد با STM32F103
09154256458
https://www.aparat.com/v/geZ9P
ممنون دوست عزیز
من برای راه اندازی STM32F103 به مشکل خوردم اگر ممکنه بگید چه تغییراتی در کتابخانه ایجاد کردید من به جای ۱ و۰ کردن از HAL_GPIO_Write استفاده کردم و تابع setup را هم خالی کردم چون خروجی و ورودی کردن پین ها را با cube انجام داده ام اما هنوز ارتباط برقرار نمیشود
سلام خسته نباشین خدمت همه کسانی که این آموزش خوب رو فراهم کردم
من این ماژول رو طبق این آموزش تست کردم و خوشبختانه توی همون تست اول جواب رو گرفتم در اون تست یکی از ماژول هام به atmega32A وصل بود یکی به atmega16A و یکی هم به atmega16L که فرکانس کاری نرم افزاری 32A روی 8مگاهرتز بود اما موقع پروگرام کردن فیوز بیت هارو روی 1مگاهرتز میزاشتم برای atmega16ها هم به دو صورت فرکانس 8مگاهرتز در نرم افزار و فیوزبیت 1مگاهرتز و هم بصورت 1مگاهرتز در نرم افزار و فیوزبیت 1مگاهرتز هم جواب میداد اما حالا مجبور شدم atmega32A رو هم بصورت نرم افزاری هم از طریق فیوزبیت ها روی 8 مگاهرتز بزارم و atmega16 هارو هم نرم افزاری هم فیوز بیت ها روی 1 مگاهرتز تنظیم کنم با انجام این کار دیگه انتقال بین ماژول ها صورت نمیکیره آیا تغییر فرکانس ها باعث بوجود اومدن این مشکل شده ؟
لازم به توضیح هس که روی atmega32A برای کانتر0 از مقسم 8 هم استفاده کردم و اینکه ماژولی که به atmega32 وص هس فقط وظیفه دریافت داره و بقیه هم فقط ارسال میکنن این موارد رو هم گفتم شاید نکته ای داشته باشن
ممنون میشم اگه راهنماییم کنین
سلام خواهش میکنم .
دفعه اول شانسی جواب گرفتید چون همه ماژول ها یه جور تنظیم شده بودن . برای اینکه درست کار کنه ماژول ها همه رو هم نرم افزاری هم با فیوزبیت روی یه فرکانس تنظیم کنید. حالا اگه میخواید ۸ مگ بذارید همه رو یا یک مگ مهم نیست زیاد .
چون به صورت نرم افزاری این کتابخانه، spi رو میسازه باید فرکانس نرم افزار و فیوز بیت یکی باشه تا کار کنه
ممنون از اینکه پاسخ دادین
شانسی نبود مهندس دفه اول همونطور که شما گفتین فرکانس های کاری هرسه میکرو روی یک تنظیم بودن منظورم از اولین این بود که توی اولین پروگرامی که کردم جواب گرفتم البته به لطف آموزش بسیار عالی شما(اون موقع زیاد در مورد فیوز بیت ها اطلاع نداشتم واسه همین هرسه میکرو رو ناخواسته با فرکانس 1 پروگرام میکردم :-D) واسه همین خیلی عالی جواب میداد اما الان بخاطر فرکانس کاری یکی از سنسور هام (ds18b20) مجبورم یکی از میکروهامو روی فرکانس 1 تنظیم کنم.
الان سوالی که برام پیش اومد این هست که میتونم این کتابخونه رو بصورتی تغییر بدم که این مشکل رو رد کنم به عنوان مثال اگه بتونم این رو با کتابخونه SPI خوده کدویژن تنظیم کنم هم بشه از اینتراپت SPI استفاده کرد هم اینکه دیگه فرکانس کاری میکرو مهم نباشه روی چی تنظیم شده باشه یا نه یه فکری برای سنسورم بکنم یا یک کتابخونه دیگه استفاده کنم بهتر هس؟
قطعا شما با این کتابخونه کار کردین و تجربتون تو این زمینه از من بیشتر هس که بگین آیا این کار شدنی هس یا نه
سلام دوست من
بنده هم از میکرو mega32 استفاده کردم با فرکانسی که توی codewizar تعریف کردم روی 1mhz ولی جواب نگرفتم
به اینصورت بود که گیرنده خودش خود به خود عدد شمارش می کرد در صورتی که اصلن فرستنده متصل نبود به نظر شما اشکال کار من کجاس ؟
سلام و عرض ادب
می خواستم بدونم چطور میشه با دو عدد از این ماژول یه رادیو کنترلر چند کاناله ساخت؟
مثل رادیو کنترلر کواد کوپتر که به صورت هم زمان اگه چند کلید در فرستنده فشرده بشه در گیرنده هم چندین عمل مختلف رو به صورت همزمان انجام بده؟
سلام
با استفاده از کدنویسی مناسب میتونید به اینطور هدفی برسید ولی برای ارسال شما از طریق یک کانال بین دو ماژول میتونید ارسال داشته باشید . باید ببینید تاخیر این دستورات در حد چند میکرو ثانیه تأثیری تو عملکرد مواد کوپتر شما میذاره یا نه !
روش دیگه ای که میتونید استفاده کنید اینه که ورودی ها رو بگیرید و اگه چند کلید باهم فشرده شده بود خبر فشرده شدن کلید هارو در یک ارسال به اطلاع کواد کوپتر برسونید اینجوری حداقل در سمت کواد تاخیری وجود نخواهد داشت .
دیدگاه شما در انتظار بررسی میباشد
سلام و خسته نباشید.
ببخشید بجای این ماژول NRF24L01میشه از ماژول هایESP8266استفاده کرد برای وصل کردن به میکرو و ارتباط بین دو ماژول؟
اگه میشه چجوری؟
ممنون میشم اگه راهنماییم بکنین؟
بله شدنش میشه
در مورد بردش اطلاعی ندارم ولی کلیت به این صورت خواهد بود که یکی رو توی مد هات اسپات میذارید و یکی رو تو مد دیوایس وصل میشه به هات اسپات و دیتا رد و بدل میکنید 🙂
امکان شبکه کردن بی نهایت هم وجود داره 🙂
با یک ماژول درسه میشه به همه ی هات اسپات های موجود چه تو لب تاب چه تو گوشی وصل شد ولی بین دو تا ماژول ارتباط برقرار نمیشه هر چقدر یکیشو کلاینت میکنم یکیشو سرور یا همون اکسس پویونت هی ارور میده و وصل نمیشه
امم – تست کردم وصل میشن 😐
البته من از طریق at کامند با این ماژول ها کار نکردم ها
من برای خود ماژول برنامه نوشتیم و به این صورت کار کرد
مهندس من از atبه جواب نمیرسیدم.
شما میشه لطف کنین بگین با چه محیط برنامه نویسی و با چه سورسی این ارتباطو برقرار کردین؟ خیلی ممنونتون میشم اگه کمکم کنین به خدا کلافه شدم بس به جواب نرسیدم?
سلام من از آردوینو برای برنامه نویسی این ماژول استفاده میکنم – البته میتونید از SDK هم استفاده کنید ولی مقداری پیچیده تر خواهد بود
آموزش برنامه نویسی رو هم توی سایت آموزش دادیم
مهندس با یک ماژول بلدم وصل شدنشو فقط ومیتونم یه ماژولesp8266رو به یک ماژولesp8266 دیگه وصل کنم اینش مشکله برام??
لیست دستوراتی که برای وصل شدن دو ماژول به هم استفاده میکنید رو قرار بدید.
سلام
من این ماژول رو طبق توضیحات شما با میکرو atmega16 smd راه اندازی کردم
اتفاق عجیبی که میفته اینه که پایه هایی که من به عنوان SPI مجازی برای این ماژول انتخاب کردم، صحیح عمل نمیکنه و این در صورتی هست که با برخی از پایه های دیگه این ماژول بدون مشکل کار میکنه. فکر میکنید باید پایه های خاصی رو در نظر گرفت برای اینکه این برد با پروتکل SPI مجازی صحیح کار کنه؟اگر بله، چه پایه هایی و چرا؟
پایه هایی که من انتخاب کردم و منتج به راه اندازی صحیح نشد، به این شکل هست:
CE -> PORTA.2
CSN-> PORTC.3
SCK-> PORTA.1
MOSI-PINA.0
پایه های دیگه ای که امتحان کردم و صحیح جواب داد :
CE -> PORTB.0
CSN-> PORTB.1
SCK-> PORTB.4
MOSI-PINB.3
مشکلم حل شد جناب مهندس
مشکل از فعال بودن بیت JTAG به صورت پیشفرض بود و باعث میشد پورت C نتونه به عنوان خروجی عمل کنه و با غیرفعال کردنش مشکلم به کلی مرتفع شد
ممنون
چه عالی 🙂
خوشحالم خودتون تونستید مشکل رو پیدا کنید
متشکر که اطلاع دادید
آیا رابط jtag رو از توی فیوز بیت ها غیر فعال کردید ؟
همونطور که میدونید این رابط به شکل پیش فرض فعاله و روی پورت c هست
اطلاعات بیشتر در مورد jtag
تاریخچه و قابلیتهای خاص پروتکل JTAG
سلام مهندس خسته نباشید
من قصد دارم که چند ماژول فرستنده(حدود 10 تا) و یک ماژول گیرنده داشته باشم که هر کدام از این ده ماژول به گیرنده دیتا خودشون رو ارسال کنند.
با این کتابخونه چطور میشه راه اندازی کرد؟
یعنی سمت گیرنده کجا وچطور مک آدرس های فرستنده هارو چک کنم و بفهمم که دیتا برای کدوم فرستندست؟
خیلی ممنون میشم پاسخ بدید
سلام ، ممنون سلامت باشید
فک نکنم بشه مک آیدی فرستنده رو فهمید. ولی شما میتونید یه کلک ساده بزنید همون اول که میخواید دیتا رو بفرستید یه شماره مربوط به فرستنده هم بفرستید اینجوری تو گیرنده یه کد برای اون تعبیه کنید و بفهمید که دیتا از کدوم فرستنده داره میاد .
سلام
خسته نباشید?
جناب مهندس من تمام مطالب رو با دقت مطالعه کردم و دو بار دیگه هم مجددا با دقت مرور کردم
فرمانس داخلی atmega8. رو روی ۸ مگ تنظیم کردم و خطوط برنامه ارسال و دریافت رو هم تا حد امکان کم کردم و برنامه فقط به این صورت هست که فرستنده هر ۰.۵ ثانیه یه بار یک دیتا ارسال میکنه و فرستنده هر بار که دیتایی رو دریافت میکنه قراره یک پورت خاص رو روشن و خاموش کنه به همین سادگی!
ولی نمیدونم اشکال کار از فرستنده هست با گیرنده یا هردو…
ممکنه راهنماییم کنین؟ ممنون
سلام ممنون
به نظر بنده همون کد مثال که تو فایل زیپ هست رو کامپایل کنید(کدویژن) و تستش کنید چون اون کاملا تست شده است و کار میکنه
دوتا ماژول nrf میخواد و یک lcd کاراکتری که احتمالا دارید
و اگه اون هم جواب نداد ماژول هارو عوض کنید و از یه تامین کننده معتبر خریداری کنید چون زیاد من برخوردم که مشکل از ماژول ها بوده ،اگه باز هم کار نکرد محض احتیاط میکرو هارو هم نو بخرید و کد مثال رو آپلود کنید ( احتمالا انجام دادید ولی اتصالات رو هم با تست بوق تست کنید و مطمئن بشید)
همچنین از تغذیه ماژول ها هم اطمینان حاصل کنید و رگولاتور سویچینگ جریان بالا مثلا 3A استفاده کنید .( البته من بدون رعایت این هم جواب گرفتم ولی خب ممکنه تولید های جدید حساس باشن )
موفق باشید
سلام ممنون از مطلب خوبتون فقط برای تبدیل کد به spi سخت افزاری تنیظیم باید modeصفر باشد یعنی idle صفرونمونه برداری در اولین لبه (لبه ی بالارونده) لطفا اصلاح کنید.
سلام دوست عزیز. ممنون از دقتتان و اینکه به ما این موضوع را یادآوری کردید. تصحیح کردیم.
با سلام.
من یک PCB دارم که میکروکنترلر MEGA8 و nRF24L01 داره. تو این PCB میکرو با SPI سخت افزاری (پایه های MISO، MOSI، SCK و…) به nRF متصل شده. نکته ای که وجود داره تو متن نوشتید که کتابخونه از SPI نرم افزاری استفاده می کنه. برای تبدیل به حالت سخت افزاری چه کارهایی نیازه که انجام بشه؟
متشکرم.
سلام دوست عزیز
من کد رو ندیدم ولی این کار نباید کار سختی باشه – احتمالا توی کد دو تا تابع هست یکی برای ارسال دیتا از طریق رابط نرم افزاری و دیگری برای دریافت داده
اگر این دو تا تابع رو جایگذین کنید به راحتی میتونید از رابط سخت افزاری نیز استفاده کنید.
سلام مجدد، ممنونم از پاسخ سریعتون.
بله درسته. در واقع توی فایل nrf24.c یک تابع به نام spi_transfer وجود داره که SPI رو به صورت نرم افزاری پیاده سازی کرده و همچنین یک قطعه کد کامنت شده در همین تابع وجود داره که به پیاده سازی SPI سخت افزاری میکروکنترلر های AVR مربوط میشه. ظاهرا باید همین تابع رو تغییر داد به علاوه تنظیم رجیستر های مربوطه مطابق اون تنظیماتی که در متن نوشته شده.
سلام خواهش میکنم 🙂
بله درسته، ممکنه تابع ارسال و دریافت یکی باشه ِ تو بعضی کد ها دو تا تابع مجزا هست با جایگزین کردن این تابع احتمالا مشکل حل میشه
سلام
من از این ماژول برای ارتباط بین چند ماژول nodemcu استفاده میکنم ،
مشکلی که برام پیش اومده اینه که ، داده ای که میخوام ارسال کنم یه استراکچر هست و سایزش حدود 80 بایت هست ولی همونجور که خودتون هم گفته بودین بیشتر از 32 بایت نمیشه ارسال کرد ، توی نت راه حل قابل فهمی براش پیدا نکردم ، هر روشی هم که به ذهنم رسید تست کردم ولی جواب نداد .
چیکار میتونم بکنم که این مشکل برطرف بشه ؟
تشکر
خوب ساده ترین راه اینه که در سه پارت داده هاتون رو منتقل کنید 🙂 دقیقا مثل حالتی که متن sms از 160 کارکتر بزرگتر میشه و گوشی اونو برای ارسال به پارت های 160 تایی میشکنه !
برای این کار لازمه که یه هدر اول داده ارسالی بذارید که به گیرنده بگه این بسته داده پارت مثلا پارت 1 از پارت 3 داده هست تا گیرنده بتونه داده ها رو به هم بچسبونه !
اگر میخواید کار دقیق تر باشه توی هدر یه عدد یونیک قرار بدید که گیرنده بتونه بفهمه کدوم بسته ها به هم مربوط هستند (برای وقت هایی که چند فرستنده و یک گیرنده دارید).
سلام و عرض ادب . من میخوام یک فرستنده ی NRF و چندین گیرنده داشته باشم که بتونم با یک میکرو و یک فرستنده چندین رله رو در نقاط مختلف خونه کنترل کنم . هر چی گشتم منبع درستی در مورد این مطلب پیدا نکردم ولی ظاهرا این ماژول این قابلیت رو داره اما چجوری !؟ من مبتدی هستم ممنون میشم واضح توضیح بدید چون به ادمین تلگرام پیام دادم گفتن اینجا پیام بدم تا به صورت جزئی جواب بدین . ممنون از لطفتون
سلام دوست عزیز
این کار دقیقا با تنظیم کردن Mac ID قابل انجام هست به طوریکه به هر دستگاه Mac id خاصی داده میشه و برای مثال جهت اتصال رله مربوط به کولر از طریق Mac id گیرنده ای که به کولر متصل هست باید ارتباط برقرار بشه در این حالت بقیه گیرنده ها پیام رو نادیده میگیرند و فقط گیرنده مورد نظر دیتا رو دریافت میکنه .
در نظر داشته باشید در این حالت بهتره همه گیرنده ها تو یه کانال فرکانسی تنظیم شده باشند تا نیاز به تنظیم دوباره برای هر گیرنده نباشه . موفق باشید
ببخشید من باز مزاحم میشم ولی یک ماهه پروژم سر همین ماژول NRF متوقف شده ! تلگرامی از شما ندارم لطفا به تلگرام این شماره پیام بدید » ****0915496 . ممنون میشم راهنماییم کنید
فایل که در لینک زیر هست شامل سه پروژه پورت شده این کتابخونه هست
یکی برای محیط آردوینو
یکی هم STM32Duino
یکی هم برای میکروی STM در محیط KEIL
همگی با هم ارتباط دارن
http://uupload.ir/view/icbo_nrf_plus.rar/
دوستان لطفا اگر کسی مثال پروژه شبکه شده این کتابخونه رو داره به اشتراک بزاره بقیه هم استفاده کنن.
متشکر برای به اشتراک گذاری کتابخونه تون
سلام دوست عزیز ، ممنون .
شبکه کردن اگه منظورتون ارتباط در هر لحظه با هر کدوم از ماژول ها هست خب این با عوض کردن Mac id به راحتی قابل انجام هست .
اما اگه منظورتون شبکه مش هست خب قضیه کمی پیچیده میشه به صورت نرم افزاری اما به صورت سخت افزاری هم قابلیتش تعبیه شده ، تو دیتاشیت تقریبا توضیحات کامله درباره این مورد
سلام . مهندس شما شبکه مش رو کارکردید ؟ میشه راهنمایی کنید ؟
سلام به همه دوستان. ممنون از زحماتی که میکشید و اشتراک میزارید
میشه در مورد این کتابخونه که برایstm۳۲ پورت شده کمی توضیح بدید ؟
من دو تا برد اماده کردم کدها را ریختم و تو بالای کد ادرس ها را هم در فرستنده و گیرنده ضربدری عوض کردم. تو فرستنده که تابع send_data بود در گیرنده این را حدف کردم و تابع get_data را قرار دادم. اما نتونستم اون ارایه را در قسمت گیرنده دریافت کنم
مشکل کجاس ؟ ممنون میشم راهنماییم کنید
با این کتابخونه امکان شبکه بندی ماژول ها هست ؟ یعنی یک مستر داشته باشیم و چند فرستنده گیرنده
سلام دوست عزیز
بله امکانش رو حتی به شکل سخت افزاری با پایپ کردن داره ؛ نرم افزاری که جای خود.
سلام
یعنی جوری هست که بشه ارسال و دریافت دیتا رو ایمن کرد و کسی نتونه دیتا رو بخونه از محیط ؟
چون ماژول هایی مثل HM-TR و غیره وقتی دوتاشون با هم ارتباط دارن ماژولی دیگر میتونه دیتاهاشونو بخونه.
راه کاری هست که ارتباط بیسیم رو ایمن کرد؟
سلام خب میشه دیتا را انکریپت کرد
پروتکلهای زیادی وجود داره AES 128 یکی از اینهاست
سلام به این ماژول آنتن با چه مشخصاتی باید وصل کرد؟حداکثر آنتنی که میتونه ساپورت کنه.
با توجه به فرکانس کاری 2.4 این ماژول ها شما میتونید از آنتن های وایفای استفاده کنید و هرچه گین انتن بالاتر باشه نتیجه بهتری خواهید گرفت 🙂
سلام جناب مهندس.من راجع به nrf24l01 کار کردم برنامه هایی که ما دادید رو تغییر دادم اما نتونسم با زدن کلید تو فرستنده حتی یه ال ای دی را تو گیرنده روشن کنم…میشه شما راهنماییم کنید یا یه برنامه مختصر بنویسید.من حاظرم هزینشم بدم..دوماهه گیرم.
سلام شما اول باید ببینید دیتایی که اینطرف میفرستید به اونور میرسه دقیقا یا نه
بعد بیاید با توجه به دیتایی که اینطرف میفرستید در گیرنده یه led برای مثال روشن کنید
خیلی از دوستان مشکل داشتن ولی علت ۹۹.۹ درصد مشکلات بی دقتی هست و کمبود تجربه توی زبان C
چند بار این مقاله رو بخونید و ریز به ریز همه چی رو چک کنید
و همچنین روی زبان C تون کار کنید
سلام و وقت بخیر ممنون از پاسخ و توجهتان.
خوشبختانه مشکل من حل شد و الان برد واقعا خوبی گرفتم.
من چند نمونه از ماژول را تست کردم و از چند جای مختلف تهیه کردم. یک مدل که اخرین بار تست کردم واقعا خوب جواب داد و کار مار راه افتاد.
متاسفانه بردهایی که به رنگ آبی بودند و البته قیمت بالاتری هم داشتند کارکرد منطقی را نداشتند.
ممنون از راهنماییتان، من بیت مربوط به توان و سرعت انتقال را هم روی ماژل هایی که خوب نبودند تست کرده بودم اما متاسفانه بهتر که نشدند بدتر هم شدند.
سپاس و موفق باشید
سلام دوست عزیز
ممنون برای به اشتراک گذاری تجربیاتتون
منم واقعا با کیفیت ماژول های موجود توی بازار مشکل داشتم و البته دارم هنوز 😐
سلام
خواهش میکنم کاری نکردم
والا من حدود یه سالی میشه ماژول جدید نخریدم و با همین قدیمی هایی که داشتم کار میکنم و مشکلی ندارن
شما خودت استادی دیگه باید از یه جای معتبر بخری یا با یه توزیع کننده چین که خیالتون راحته از جای معتبری میخره هماهنگ کنی تا برات بیاره
یه روش هم خرید خود چیپ هست و بردش رو زدن که اینجوری به نظرم کارت سخت میشه ولی احتمال اینکه چیپ فیک به پستت بخوره کمتره …
سلام
خواهش میکنم
خوشحالم که نتیجه گرفتید
پس مشکل از ماژول بوده …
اگه میشه نوع ماژول و مرجعی که ازش ماژول های خوب رو خریدید به اشتراک بذارید تا بقیه دوستان هم بتونن استفاده کنن
سلام
خواهش میکنم
خوشحالم که نتیجه گرفتید
پس مشکل از ماژول بوده …
اگه میشه نوع ماژول و مرجعی که ازش ماژول های خوب رو خریدید به اشتراک بذارید تا بقیه دوستان هم بتونن استفاده کنن
سلام جناب مهندس با توجه به تحقیقات بنده راجع به NRF24L01 نکات شما بسیار ناب و اموزشی بود..
بنده یه پروژه ساده ای دارم که میخام با زدن کلیدها توسط فرستنده میکروکنترلر ATMEGA8 حدود شش LED رو در سمت گیرنده ATMEGA8 خاموش و روشن کنم.اما چند وقته همینطور سردر گم هستم.شما میتونید راجع به این قضیه با توجه به توضیحاتی که راجع به این ماژول دادید کمکم کنید.خیلی نیاز دارم به کمک.مطالب شما رو خوندم انالیز کردم فقط نمیدونم چجوری این پروژه خودمو به ثمر برسونم.
سلام دوست عزیز
خواهش میکنم
شما باید کد مثال ها رو بردارید و به کمک اونها مثلاً شش تا led میخواید روشن کنید اعداد ۱ تا ۶ رو بفرستید و اونطرف تو گیرنده چک کنید که آیا کدوم عدد اومده و led متناسب رو روشن کنید
سلام. من دو سه سال پیش با این ماژول کار کردم. مشکل بزرگی داره که کلا بیخیالش شدم. ظاهراً در هوای سرد ماژول از کار میوفته. علتش و نفهمیدم
سلام . چه جالب من تجربه کار تو هوای سرد رو نداشتم … حالا اگه شد تست میکنم و همین پست رو آپدیت میکنم ، اگه تونستید بهم بگید که تا چند درجه دما به پایین کار نمیکرد .
سلام و عرض ادب! در رابطه با این ماژول احتیاج به مشورت یک دوست و همکار خبره در این زمینه دارم. ممنون میشم راهنمایی بفرمایید.
من این ماژول را راه اندازی کردم و ارسال دریافت به خوبی انجام میشه.
تنها مشکلی که دارم با برد این ماژول هست. در فضایی مثل سالن (حدود 50 متر) نیاز به کارکرد دارم به قابلیت اطمینان خوب.
ابتدا نوع معمولی را تهیه کردم که در فضای یک اتاق در حدود 6-7 متر خوب جواب میداد. بعد یک مدل آنتن دار چینی استفاده کردم که برد حدود 15 متر بیشتر شد. اما همیشه این برد را ندارم و برد کاهش پیدا کرد. بعد از اون برای فرستنده مدل PA اصلی را استفاده کردم که با کمال تعجب برد این ماژول از مدل بدون آنتن هم برای من کمتره.
الان با وجود یک ماژول معمولی در فرستنده و گیرنده های آنتن دار چینی بردی حدود 10 متر را دارم.
به کلی گیج شدم که آیا سیستم من اشکالی دارد یا قطعات…
پیشاپیش از توجه و همفکری شما سپاسگزارم.
سلام ممنون . یکی از دلایل کم بودن برد میتونه در اثر کد شما باشه . علتش هم این هست که در ماژول یک پارامتر قابل تنظیم برای توان ارسالی وجود داره اگه براتون مقدوره با این کتابخونه کد رو بزنین و نتیجه رو اعلام کنید( در کتابخونه توان ارسالی رو ماکزیمم مقدار تنظیم شده ) چون همونجور که نوشتم من با مدل چینی که مشکی هم هست برد بسیار بالاتری گرفتم .
یک سوال دیگه که دارم اینه که آیا در اون سالنی که هستید دیوار بین دو ماژول قرار میگیره یا نه و یا اینکه پوشش فلزی بین دو ماژول میوفته ؟ چون هر گونه پوشش فلزی میتونه تقریبا ارتباط رو قطع کنه
سرعت انتقال رو کاهش بدین