آموزش قدم به قدم راه اندازی +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> |
حتیالامکان اگر از هر تابعی داخل پروژه استفاده میکنید آن را دستی ننویسید و بروید از هدر nrf24.h کپی و استفاده کنید، چون حروف کوچک و بزرگ داخل این توابع زیاد هست و ممکن است اشتباهات ناخواستهای رخ بدهد.
نحوه شخصیسازی فایل radioPinFunctions.c برای میکروکنترلر موردنظر
ابتدا ببینیم اصلا هدف و کاربرد این فایل چی هست؟! قرار است ما در این فایل به کتابخانه بفهمانیم که چه پایهای از ماژول به چه پایهای از میکروکنترلر وصل است، سپس بیایم ورودی-خروجی بودن اون پایهها رو تعیین کنیم و در نهایت نحوه صفر و یک کردن اون پایه رو به کتابخانه یاد بدهیم. علت این کار هم این هست که کتابخونه بتونه با spi نرمافزاری با ماژول صحبت کند. (یعنی یه spi که ما خودمون با gpio ها ساختیم و دیگه محدودیت کتابخونه به یک میکروکنترلر رو برداشتیم و میتوانیم با هر میکروکنترلری کار کنیم) در این قسمت همه مثالها و کدها بر اساس میکروکنترلر atmega8 ،avr است چراکه یک چیز عام باشد و همه بتوانند درکش کنند و ازش استفاده کنند. و شما باتوجه به فهمی که از avr دارید و توضیحاتی که داده شده، باید کد های مربوط به میکروکنترلر خودتان را جایگزین کنید. بریم سراغ کدنویسی … در خطوط اول فایل باید هدر میکروکنترلر مربوطه رو ضمیمه کنید تا برنامه رجیسترهای GPIO را بشناسد.مثال
1 | #include <mega8.h> |
مثال
میخواهیم پایه x از یک پورت میکرکنترلر مورد نظر را که به ce ماژول متصل است خروجی کنیم:1 | set_bit(Register,x); |
مثال
پایه ce ماژول به پین 1 از پورت B میکروکنترلر mega8 متصل است که باید خروجی شود، پس:1 | set_bit(DDRB,1); |
نکته: توجه داشته باشید چه در سمت فرستنده چه در سمت گیرنده میکروکنترلر ما در حالت Master قرار دارد و ماژول Slave است، پس باید تمام پایههای متصل به ماژول +NRF24L01، به جز پایه MISO، در هر دو طرف خروجی شوند.
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); } } |
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) { } } |
نکته: بعد از فراخوانی این تابع ماژول به صورت خودکار به حالت گیرنده میرود.
آدرس دهی
هر ماژول یک مک آدرس 5 بایتی مختص به خود را دارد که ما آن را به دلخواه انتخاب میکنیم و به ماژول اعلام میکنیم. یک چیز دیگر که باید به ماژول اعلام شود، این است که طرف مقابل چه مک آدرسی دارد. که اینها از طریق دو تابع زیر انجام میشود:1 | nrf24_rx_address(rx_mac); |
1 | nrf24_tx_address(tx_mac); |
مثال
کد در قسمت فرستنده
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); |
تنظیم فرستنده یا گیرنده
برای این کار از دو تابع زیر استفاده میشود که نیازی به توضیح ندارند. ()nrf24_powerUpRx: تنظیم به عنوان گیرنده. ()nrf24_powerUpTx: تنظیم به عنوان فرستنده.بردن ماژول +NRF24L01 به حالت خواب (Sleep Mode)
با استفاده از تابع زیر در زمانهایی که به ماژول نیاز نداریم میتوانیم مصرف توان ماژول را به حداقل برسانیم.
1 | nrf24_powerDown(); |
ارسال داده (Transmit)
برای ارسال داده از تابع زیر استفاده میشود:1 | nrf24_send(data_array); |
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; |
1 | while(nrf24_isSending()); |
دریافت داده (Recieve)
چون در این کتابخانه از پین IRQ استفاده نمیشود، بنابراین برای دریافت داده باید پیوسته تابع زیر را بخوانیم تا از رسیدن دیتا مطلع شویم: ()nrf24_dataReady این تابع ورودی نمیگیرد و هر وقت عدد 1 را برگرداند یعنی در FIFO ماژول حداقل یک دیتا رسیده و باید خوانده شود.نکته: اگر یک عملکرد بهینه در دریافت مدنظرتان است کمی در مورد پین IRQ مطالعه کنید و به کمک اینتراپت خارجی میکروکنترلر میتوانید کارهای جالبی انجام بدهید.
1 | nrf_getData(data_array); |
1 | unsigned char data_array[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 استفاده کرد هم اینکه دیگه فرکانس کاری میکرو مهم نباشه روی چی تنظیم شده باشه یا نه یه فکری برای سنسورم بکنم یا یک کتابخونه دیگه استفاده کنم بهتر هس؟
قطعا شما با این کتابخونه کار کردین و تجربتون تو این زمینه از من بیشتر هس که بگین آیا این کار شدنی هس یا نه
سلام و عرض ادب
می خواستم بدونم چطور میشه با دو عدد از این ماژول یه رادیو کنترلر چند کاناله ساخت؟
مثل رادیو کنترلر کواد کوپتر که به صورت هم زمان اگه چند کلید در فرستنده فشرده بشه در گیرنده هم چندین عمل مختلف رو به صورت همزمان انجام بده؟
سلام
با استفاده از کدنویسی مناسب میتونید به اینطور هدفی برسید ولی برای ارسال شما از طریق یک کانال بین دو ماژول میتونید ارسال داشته باشید . باید ببینید تاخیر این دستورات در حد چند میکرو ثانیه تأثیری تو عملکرد مواد کوپتر شما میذاره یا نه !
روش دیگه ای که میتونید استفاده کنید اینه که ورودی ها رو بگیرید و اگه چند کلید باهم فشرده شده بود خبر فشرده شدن کلید هارو در یک ارسال به اطلاع کواد کوپتر برسونید اینجوری حداقل در سمت کواد تاخیری وجود نخواهد داشت .
دیدگاه شما در انتظار بررسی میباشد
سلام و خسته نباشید.
ببخشید بجای این ماژول NRF24L01میشه از ماژول هایESP8266استفاده کرد برای وصل کردن به میکرو و ارتباط بین دو ماژول؟
اگه میشه چجوری؟
ممنون میشم اگه راهنماییم بکنین؟
بله شدنش میشه
در مورد بردش اطلاعی ندارم ولی کلیت به این صورت خواهد بود که یکی رو توی مد هات اسپات میذارید و یکی رو تو مد دیوایس وصل میشه به هات اسپات و دیتا رد و بدل میکنید 🙂
امکان شبکه کردن بی نهایت هم وجود داره 🙂
با یک ماژول درسه میشه به همه ی هات اسپات های موجود چه تو لب تاب چه تو گوشی وصل شد ولی بین دو تا ماژول ارتباط برقرار نمیشه هر چقدر یکیشو کلاینت میکنم یکیشو سرور یا همون اکسس پویونت هی ارور میده و وصل نمیشه
امم – تست کردم وصل میشن 😐
البته من از طریق at کامند با این ماژول ها کار نکردم ها
من برای خود ماژول برنامه نوشتیم و به این صورت کار کرد
مهندس من از atبه جواب نمیرسیدم.
شما میشه لطف کنین بگین با چه محیط برنامه نویسی و با چه سورسی این ارتباطو برقرار کردین؟ خیلی ممنونتون میشم اگه کمکم کنین به خدا کلافه شدم بس به جواب نرسیدم😢
سلام من از آردوینو برای برنامه نویسی این ماژول استفاده میکنم – البته میتونید از SDK هم استفاده کنید ولی مقداری پیچیده تر خواهد بود
آموزش برنامه نویسی رو هم توی سایت آموزش دادیم
در سه سوت به وای فای متصل شویم – ESP8266
آموزش اتصال ربات تلگرام به آردوینو ESP8266 – ربات تلگرام در خانه
و …
مهندس با یک ماژول بلدم وصل شدنشو فقط ومیتونم یه ماژول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 را قرار دادم. اما نتونستم اون ارایه را در قسمت گیرنده دریافت کنم
مشکل کجاس ؟ ممنون میشم راهنماییم کنید
با این کتابخونه امکان شبکه بندی ماژول ها هست ؟ یعنی یک مستر داشته باشیم و چند فرستنده گیرنده
سلام دوست عزیز
بله امکانش رو حتی به شکل سخت افزاری با پایپ کردن داره ؛ نرم افزاری که جای خود.
سلام به این ماژول آنتن با چه مشخصاتی باید وصل کرد؟حداکثر آنتنی که میتونه ساپورت کنه.
با توجه به فرکانس کاری 2.4 این ماژول ها شما میتونید از آنتن های وایفای استفاده کنید و هرچه گین انتن بالاتر باشه نتیجه بهتری خواهید گرفت 🙂
سلام جناب مهندس.من راجع به nrf24l01 کار کردم برنامه هایی که ما دادید رو تغییر دادم اما نتونسم با زدن کلید تو فرستنده حتی یه ال ای دی را تو گیرنده روشن کنم…میشه شما راهنماییم کنید یا یه برنامه مختصر بنویسید.من حاظرم هزینشم بدم..دوماهه گیرم.
سلام شما اول باید ببینید دیتایی که اینطرف میفرستید به اونور میرسه دقیقا یا نه
بعد بیاید با توجه به دیتایی که اینطرف میفرستید در گیرنده یه led برای مثال روشن کنید
خیلی از دوستان مشکل داشتن ولی علت ۹۹.۹ درصد مشکلات بی دقتی هست و کمبود تجربه توی زبان C
چند بار این مقاله رو بخونید و ریز به ریز همه چی رو چک کنید
و همچنین روی زبان C تون کار کنید
سلام و وقت بخیر ممنون از پاسخ و توجهتان.
خوشبختانه مشکل من حل شد و الان برد واقعا خوبی گرفتم.
من چند نمونه از ماژول را تست کردم و از چند جای مختلف تهیه کردم. یک مدل که اخرین بار تست کردم واقعا خوب جواب داد و کار مار راه افتاد.
متاسفانه بردهایی که به رنگ آبی بودند و البته قیمت بالاتری هم داشتند کارکرد منطقی را نداشتند.
ممنون از راهنماییتان، من بیت مربوط به توان و سرعت انتقال را هم روی ماژل هایی که خوب نبودند تست کرده بودم اما متاسفانه بهتر که نشدند بدتر هم شدند.
سپاس و موفق باشید
سلام دوست عزیز
ممنون برای به اشتراک گذاری تجربیاتتون
منم واقعا با کیفیت ماژول های موجود توی بازار مشکل داشتم و البته دارم هنوز 😐
سلام
خواهش میکنم کاری نکردم
والا من حدود یه سالی میشه ماژول جدید نخریدم و با همین قدیمی هایی که داشتم کار میکنم و مشکلی ندارن
شما خودت استادی دیگه باید از یه جای معتبر بخری یا با یه توزیع کننده چین که خیالتون راحته از جای معتبری میخره هماهنگ کنی تا برات بیاره
یه روش هم خرید خود چیپ هست و بردش رو زدن که اینجوری به نظرم کارت سخت میشه ولی احتمال اینکه چیپ فیک به پستت بخوره کمتره …
سلام
خواهش میکنم
خوشحالم که نتیجه گرفتید
پس مشکل از ماژول بوده …
اگه میشه نوع ماژول و مرجعی که ازش ماژول های خوب رو خریدید به اشتراک بذارید تا بقیه دوستان هم بتونن استفاده کنن
سلام
خواهش میکنم
خوشحالم که نتیجه گرفتید
پس مشکل از ماژول بوده …
اگه میشه نوع ماژول و مرجعی که ازش ماژول های خوب رو خریدید به اشتراک بذارید تا بقیه دوستان هم بتونن استفاده کنن
سلام جناب مهندس با توجه به تحقیقات بنده راجع به NRF24L01 نکات شما بسیار ناب و اموزشی بود..
بنده یه پروژه ساده ای دارم که میخام با زدن کلیدها توسط فرستنده میکروکنترلر ATMEGA8 حدود شش LED رو در سمت گیرنده ATMEGA8 خاموش و روشن کنم.اما چند وقته همینطور سردر گم هستم.شما میتونید راجع به این قضیه با توجه به توضیحاتی که راجع به این ماژول دادید کمکم کنید.خیلی نیاز دارم به کمک.مطالب شما رو خوندم انالیز کردم فقط نمیدونم چجوری این پروژه خودمو به ثمر برسونم.
سلام دوست عزیز
خواهش میکنم
شما باید کد مثال ها رو بردارید و به کمک اونها مثلاً شش تا led میخواید روشن کنید اعداد ۱ تا ۶ رو بفرستید و اونطرف تو گیرنده چک کنید که آیا کدوم عدد اومده و led متناسب رو روشن کنید
سلام. من دو سه سال پیش با این ماژول کار کردم. مشکل بزرگی داره که کلا بیخیالش شدم. ظاهراً در هوای سرد ماژول از کار میوفته. علتش و نفهمیدم
سلام . چه جالب من تجربه کار تو هوای سرد رو نداشتم … حالا اگه شد تست میکنم و همین پست رو آپدیت میکنم ، اگه تونستید بهم بگید که تا چند درجه دما به پایین کار نمیکرد .
سلام و عرض ادب! در رابطه با این ماژول احتیاج به مشورت یک دوست و همکار خبره در این زمینه دارم. ممنون میشم راهنمایی بفرمایید.
من این ماژول را راه اندازی کردم و ارسال دریافت به خوبی انجام میشه.
تنها مشکلی که دارم با برد این ماژول هست. در فضایی مثل سالن (حدود 50 متر) نیاز به کارکرد دارم به قابلیت اطمینان خوب.
ابتدا نوع معمولی را تهیه کردم که در فضای یک اتاق در حدود 6-7 متر خوب جواب میداد. بعد یک مدل آنتن دار چینی استفاده کردم که برد حدود 15 متر بیشتر شد. اما همیشه این برد را ندارم و برد کاهش پیدا کرد. بعد از اون برای فرستنده مدل PA اصلی را استفاده کردم که با کمال تعجب برد این ماژول از مدل بدون آنتن هم برای من کمتره.
الان با وجود یک ماژول معمولی در فرستنده و گیرنده های آنتن دار چینی بردی حدود 10 متر را دارم.
به کلی گیج شدم که آیا سیستم من اشکالی دارد یا قطعات…
پیشاپیش از توجه و همفکری شما سپاسگزارم.
سلام ممنون . یکی از دلایل کم بودن برد میتونه در اثر کد شما باشه . علتش هم این هست که در ماژول یک پارامتر قابل تنظیم برای توان ارسالی وجود داره اگه براتون مقدوره با این کتابخونه کد رو بزنین و نتیجه رو اعلام کنید( در کتابخونه توان ارسالی رو ماکزیمم مقدار تنظیم شده ) چون همونجور که نوشتم من با مدل چینی که مشکی هم هست برد بسیار بالاتری گرفتم .
یک سوال دیگه که دارم اینه که آیا در اون سالنی که هستید دیوار بین دو ماژول قرار میگیره یا نه و یا اینکه پوشش فلزی بین دو ماژول میوفته ؟ چون هر گونه پوشش فلزی میتونه تقریبا ارتباط رو قطع کنه
سرعت انتقال رو کاهش بدین