مدار فرستنده گیرنده رادیویی باماژول NRF24L01+ با کامپایلر کدویژن
در این قسمت با آموزش راه اندازی و برنامه نویسی ماژول رادیویی NRF24L01+ در خدمت شما هستیم.
این آموزش به زبان C و در کامپایلر codevision خواهد بود.
نویسنده آموزش : سید محمد روستا
این آموزش و کدهای آن به صورت open source توسط نویسنده آن منتشر شده است.
این ماژول تا برد 100 متر وماژول های تقویت شده دیگر از همین نوع 1 یا 2 کیلومتر یا بیشتر اطلاعات را انتقال میدن.
از این ماژول می توان به صورت بی سیم دیتا رو فرستاد و میتوان دستگاه ها رو به صورت بی سیم یا وایرلس کنترل کرد مانند درب برقی و ماشین ولامپ و هر نوع وسیله دیگه و ساخت بسیم ودیگر کاربردها را نیز مد نظر قرار داد.
شناخت nrf24l01+:
نحویه کار آن به این صورت است که فرستنده اطلاعات رو میفرسته وبعد گیرنده با دریافت اطلاعات وبرسی خطا ودرست بودن دیتا یک تصدیق نامه به فرستنده میفرستد.اگرتصدیق توسط فرستنده دریافت شد یعنی اینکه دیتا به درستی ارسال شد درغیر این صورت فرستنده با یه تایم تنظیمی دوباره دیتا رو میفرسته از این رو درست رسیدن دیتا به گیرنده مشخص میشه
بررسی توابع مهم وکاربردی فرستنده و گیرنده:
1 |
void nrf24l01_init_to_ack_at_tx(byte size_crc,byte retransmit_delay,byte retransmit_count,byte power_amplifier,character *name_address ) |
تابع ارسال پایلود با تصدیق که در این حالت اگر گیرنده دیتا را درست دریافت کرد یک تصدیق به فرستنده میفرستد اگر تصدیق توسط فرستنده دریافت شد به این معنی است که دیتا به درستی توسط گیرنده دریافت شده است در غیر این صورت فرستنده دوباره دیتا را توسط زمان تنظیمی retransmit_delay میفرستد. retransmit_max_count حداکثرشمارش ارسال مجدد که تعداد ارسال مجدد را تعیین میکند.که بعد از این تعداد ارسال مجدد تمام میشود ویک شارش به بسته های از دست رفته اضافه میشود اما دوباره توسط همین تابع ارسال مجدد به حالت اولیه برمیگردد .
1 2 3 4 |
),name_address=string(3_5)character نام یا آدرس فرستنده و کاراکتر پوچ نیز یک کاراکتر به حساب می آید // retransmit_delay=(250*n(1_16))us,retransmit_count=(0_15) void nrf24l01_init_no_ack_at_tx( byte power_amplifier,character *name_address ) |
function set nrf at mode transmit no_ack(at send data speed no_ack fast of to_ack):
تابع ارسال پایلود بدون تصدیق که در این حالت سرعت بیشتر اما صحت دریافت دیتا مشخص نیس در این حالت دیگه فرستنده نیاز به دریافت تصدیق از طرف گیرنده نمی باشد.
1 |
nrf24l01_init_common_tx_rx( AIR_DATA_RATE_1_MBPS,90 ); تابع تنظیمات مشترک |
input data size_air_data_rate ONE_MBPS(0) or TOW_MBPS(1) or 250(2)kbps and number_channel_ferquenc between 0 to 127
تعین کانال فرکانسی و میزان سرعت انتقال اطلاعات در هوا هرچه دیتا ریت بیشتر صحت دیتا بیشتر رنج یا مسافت کمتر وبرعکس .
1 2 |
nrf24l01_set_at_mode( TX ); تابع تنظیم مود ماژول در حالت فرستنده یا گیرنده بودن input data mode==rx or tx |
در این تابع اگر مود گیرنده را تنظیم کنیم گیرنده به مود دریافت میفرود اما فرستنده در حالت ارسال پایلود یا دیتا ابتدا فعال وسپس غیره فعال میشود یا به مود استندبای یا مدریت توان میرود.
1 |
void nrf24l01_puts( character *string_tx ) |
در این تابع می توان یک رشته را توسط ماوژل فرستاد که داری حداکثر سایز 1_32 می تواند باشد که کاراکتر NULL یا پوچ یا 0 نیز باید برای انتهای رشته نیز به حساب آید
1 |
void nrf24l01_putchar( character chara ( |
این تابع یک کاراکتریا یک بایت را توسط ماژول میفرستد در واقع کاراکتر را تبدیل به رشته میکند و میفرستد.
1 |
void nrf24l01_putdata( void *data_tx , character type( |
این تابع انواع داده ای زیر را توسط ماژول میفرستد
/****************************************************************
input type==’c’==character(byte_(0_255)) , ‘i’==signed inte , ‘f’==float
data_tx==character(byte_(0_255)) , number signed inte , number float
data_tx convert to character ascii and save
*****************************************************************/
1 |
void nrf24l01_init_number_pipe_rx(byte number_pipe,character *name_address_pipe( |
این تابع مربوط به تنظیمات گیرنده است
/****************************************************************
function know one pipe set at rx
( input number_pipe=(0_5 لوله ای که میخواهیم دیتا رو دریافت کند
name_address=string(3_5)character آدرس گیرنده لوله مورد نظر
*****************************************************************/
1 |
character nrf24l01_gets( character *string_rx( |
تابع دریافت رشته توسط ماژول واگر از تابع put_dataدر طرف فرستنده استفاده شد باید طول رشته را در طرف گیرنده بخوانیم ودر خانیه آخر اگر کاراکتر c باشد کاراکتر و اگر i باشد عدد صحیح واگرf باشد عدد اعشاری می باشد.
1 |
character nrf24l01_getchar( void( |
تابع دریافت کاراکتر توسط ماژول که کاراکتری را که به صورت رشته ای توسط تابع putchar ارسال شده است را می توان توسط تابع gets نیزدریافت کرد
1 |
character nrf24l01_getdata( character *string_rx( |
این تابع انواع داده ای زیر را دریافت می کند.می توان انواع دادهای زیر را توسط تابعgetsنیز دریافت کرد
/****************************************************************
function recive string_rx(size==0_33)
return character NULL(0)==if data not recive or ather character(type data)==if recive data
return type data ‘c’==character ‘i’== int and ‘f’==float
****************************************************************/
1 |
void change_automat_channel_ferquency_at_tx(void ( |
این تابع تعداد بسته های از دست رفته را چک می کند که اگر تعداد بسته های (دیتاها یا پایلودها)از دست رفته توسط فرستنده با تعداد بسته های تنظیمی توسط کاربرdefine SIZE_PACKET_LOST 15 # برابر شد برای اینکه داده ای از دست رفته کاهش یابد کانال فرکانسی رو عوض میکند.ابتدا با فرستادن رشتیه تغییر کانال به گیرنده و سپس با در یافت تصدیق توسط فرستنده (فرستنده و گیرنده کانال فرکانسی را تغییر می دهند)
1 |
void change_automat_channel_ferquency_at_rx( character *string_rx( |
تابع تغیر کانال توسط گیرنده که این تابع با دریافت رشتیهchannel_change_ferquency توسط فرستنده و ارسال تصدیق به فرستنده کانال فرکانسی رو تغیر میدهد
برنامه فرستنده :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 |
/****************************************************************/ //writer:sayed mahmood roosta //date: //circuit:tx_nrf24l01_0 #include <mega16a.h> #include <string.h> #include <stdlib.h> #include <delay.h> #include <spi.h> #include "works_data.h" #include "spi_0.h" #include "nrf24l01+_0.h" /****************************************************************/ #define OSCILLATOR 8MHZ /****************************************************************/ void main( void ); void init_input_output(void); /****************************************************************/ void main( void ) { bit loop=1; character address_tx[SIZE_ADDRESS]="NRFM"; تعیین آدرس فرستنده // character payload_tx[SIZE_PAYLOAD]="channel"; //دیتا ارسالی توسط فرستنده init_input_output( ); nrf24l01_init_to_ack_at_tx( 1,2,12,3,address_tx );تنظیمات فرستنده/ در حالت تصدیق/ nrf24l01_init_common_tx_rx( AIR_DATA_RATE_1_MBPS,90 ); nrf24l01_set_at_mode( TX ); تنظیم ماژول در مد فرستنده while( loop ) { nrf24l01_puts( payload_tx );دیتا هریک ثانیه یک بار فرستاده میشود delay_ms(2000); } } /****************************************************************/ void init_input_output(void) { spi_init_master( DATA_ORDER_MSB,4,0 ); تنظیمات اس پی آی return; } /****************************************************************/ برای ارسال بدون تصدیق فقط به جای این تابع nrf24l01_init_to_ack_at_tx( 1,2,12,3,address_tx )ازاین تابع nrf24l01_init_no_ack_at_tx( 3, address_tx); |
مدار فرستنده:
برنامه گیرنده:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 |
/****************************************************************/ //writer:sayed mahmood roosta //date: //circuit:tx_nrf24l01_0 #include <mega16a.h> #include <string.h> #include <stdlib.h> #include <delay.h> #include <spi.h> #include “works_data.h” #include “spi_0.h” #include “nrf24l01+_0.h” /****************************************************************/ #asm .equ __lcd_port=0x1b ;PORTA #endasm #include <lcd.h> /****************************************************************/ #define OSCILLATOR 8MHZ /****************************************************************/ void main( void ); void init_input_output(void); /****************************************************************/ void main( void ) { bit loop=1; character address_pipe_0_rx[SIZE_ADDRESS]=”NRFM”; character payload_rx[SIZE_PAYLOAD]=””; init_input_output( ); nrf24l01_init_number_pipe_rx( PIPE_0 , address_pipe_0_rx ); تنظیمات گیرنده nrf24l01_init_common_tx_rx( AIR_DATA_RATE_1_MBPS,90 ); nrf24l01_set_at_mode( RX );// تنظیم ماژول در مد گیرنده while( loop ) { if( nrf24l01_gets(payload_rx)!=NULL)اگر دیتا دریافت بشه مقداربرگشی مخالف0 است lcd_puts( payload_rx ); } } /****************************************************************/ void init_input_output(void) { spi_init_master( DATA_ORDER_MSB,4,0 ); lcd_init(16); return; } /****************************************************************/ |
مدار گیرنده :
برای تغذیه ماژول باید از رگولاتور 3.3 ولت(lf33 (استفاده کرد به همرا یک عدد خازن موازی با رگولاتور که میتواند مقادیر مختلف ر ا تست کرد اما ظرفیت بالتر بهتر است مانند220میکروفاراد به بالا
بهتر است که مدار بر روی برد نصب گردد بر روی برد برد سخت ترجواب میدهد که در صورت جواب ندادن باید تغذیه ها را چک کرد یا رگلاتورها را تکان داد تا جواب دهد اتصالات وتغذیه کل مدار باید تست شود
برنامه فرستنده گیرنده:
در برنامه زیر بازدن یک کلید برنامه به مد گیرنده وبا زدن یک کلید دیگر برنامه به مد فرستنده می رود ابتدا هر دو مدار در مد گیرنده تنظیم می شوند و با زدن کلید پایه صفر مدار به مود فرستنده میرود
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 |
//writer:sayed mahmood roosta //date: //circuit:tx_nrf24l01_0 #include <mega16a.h> #include <string.h> #include <stdlib.h> #include <delay.h> #include <spi.h> #include "works_data.h" #include "spi_0.h" #include "nrf24l01+_0.h" /****************************************************************/ #asm .equ __lcd_port=0x1b ;PORTA #endasm #include <lcd.h> /****************************************************************/ #define OSCILLATOR 8MHZ /****************************************************************/ void main( void ); void init_input_output(void); /****************************************************************/ void main( void ) { bit loop=1; character address_tx[SIZE_ADDRESS]="NRFM"; تعیین آدرس فرستنده // character payload_tx[SIZE_PAYLOAD]="channel"; دیتا ارسالی توسط فرستنده// character address_pipe_0_rx[SIZE_ADDRESS]="NRFM";//تعیین آدرس لولیه صفر گیرنده character payload_rx[SIZE_PAYLOAD]="";آرایه یا بافر یا پایلود گیرنده// init_input_output( ); nrf24l01_init_to_ack_at_tx( 1,2,12,3,address_tx );تنظیمات فرستنده در حالت تصدیق// nrf24l01_init_number_pipe_rx( PIPE_0 , address_pipe_0_rx );برای لولیه صفر// تنظیمات گیرنده nrf24l01_init_common_tx_rx( AIR_DATA_RATE_1_MBPS,90 ); تنظیمات مشترک// nrf24l01_set_at_mode( RX );در مود گیرنده تنظیم میکنیم// ابتدا ماژول را while( loop ) { if( CHECK_RESET_BIT_DATA( PINC , BIT(0) )) { //اگر کلید صفر زده شود مدار به مد فرستنده میرود برای اینکه دیتا به صورت پیوسته فرستاده شود از یک کلید معمولی استفاده شود در غیر این صورت از کلید فشاری یا پوش باتن استفاده شود nrf24l01_set_at_mode( TX ); nrf24l01_puts( payload_tx );ارسال دیتا// delay_ms(1000);بعد از ارسال یک ثانیه صبر میکنیم// } if( CHECK_RESET_BIT_DATA( PINC , BIT(1) ) ) {برای این که مدار به مد گیرنده رود از یک کلید معمولی یا وصل پیوسته استفاده شود زیرا در این تابع چک میشود که دیتا گرفته شده یا نه وبرای دریافت دیتا منتظر نمی ماند nrf24l01_set_at_mode( RX ); if( nrf24l01_gets(payload_rx)!=NULL)اگر دیتا دریافت بشه مقداربرگشی مخالف0 است lcd_puts( payload_rx ); } } } /****************************************************************/ void init_input_output(void) { spi_init_master( DATA_ORDER_MSB,4,0 ); تنظیمات اس پی آی lcd_init(16); RESET_BIT_DATA( DDRC, BIT(0)+ BIT(1) ); پایه 0 و1 به عنوان ورودی// SET_BIT_DATA( PORTC, BIT(0)+ BIT(1) );فعال کردن پول آپ پایه 0 و 1// return; } /****************************************************************/ می توان توابع درون حلقیه وایل را به صورت زیر نیز نوشت یعنی اگر کلید شماره صفر زده شود مدار به مود فرستنده رود ودر غیره اینصورت به مود گیرنده رود while( loop ) { if( CHECK_RESET_BIT_DATA( PINC , BIT(0) )) { nrf24l01_set_at_mode( TX ); nrf24l01_puts( payload_tx );ارسال دیتا// delay_ms(1000);بعد از ارسال یک ثانیه صبر میکنیم// Flag=1;برای اینکه بتوان گیرنده را تنظیم کرد این پرچم را یک میکنیم } else{ if(flag==1){برای اینکه در هر بار اجرای این بلوک گیرنده دو باره تنظیم نشود و وقت برنامه تلف نشود از// یک پرچم فلگ استفاده می کنیم و این متغیر را در ابتدای برنامه با مقدار یک باید تعریف کرد nrf24l01_set_at_mode( RX ); flag=0; } if( nrf24l01_gets(payload_rx)!=NULL)اگر دیتا دریافت بشه مقداربرگشی مخالف0 است lcd_puts( payload_rx ); } } |
استفاده از توابع تغییر کانال فرکانسی بدست آوردن بهترین کانال وکم کردن گم شدن دیتا:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
while( loop ) { if( CHECK_RESET_BIT_DATA( PINC , BIT(0) )) { nrf24l01_set_at_mode( TX ); change_automat_channel_ferquency_at_tx( ); اگر تعداد بسته های از دست رفته توسط فرستنده زیاد شد یا با #define SIZE_PACKET_LOST 15 برابر شد این تابع رشتیه تغییر کانال را برای گیرنده میفرستد وبا دریافت تصدیق کانال خودش را تغییر می دهد// nrf24l01_puts( payload_tx );ارسال دیتا// delay_ms(1000);بعد از ارسال یک ثانیه صبر میکنیم// Flag=1;برای اینکه بتوان گیرنده را تنظیم کرد این پرچم را یک میکنیم } else{ if(flag==1){برای اینکه در هر بار اجرای این بلوک گیرنده دو باره تنظیم نشود و وقت برنامه تلف نشود از// یک پرچم فلگ استفاده می کنیم و این متغیر را در ابتدای برنامه با مقدار یک باید تعریف کرد nrf24l01_set_at_mode( RX ); flag=0; } if( nrf24l01_gets(payload_rx)!=NULL)اگر دیتا دریافت بشه مقداربرگشی مخالف0 است lcd_puts( payload_rx ); change_automat_channel_ferquency_at_rx(payload_rx);اگر رشتیه تغییر کانال به گیرنده رسید کانال رفرش میشود } } |
تست سالم بودن ماژول
برای اینکه ببینیم ماژول سالم است و تنظیمات به درستی انجام شد از دستورات زیر استفاده میکنیم این دستورات را بعد از توابع تنظیمات به کار میبریم.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
char str[10]=""; char a=2; nrf24l01_command_read_of_buffer(RX_ADDRESS_PIPE_0,str); در گیرنده از این تابع استفاده میکنیم// lcd_puts(str); nrf24l01_command_read_of_buffer(TX_ADDRESS,str); در فرستنده از این تابع استفاده میکنیم// lcd_puts(str); a=nrf24l01_command_read_of_register(CONFIG); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(ENABLE_AUTO_ACK); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(ENABLE_RX_ADDRESSES); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(SETUP_ADDRESS_WIDTH); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(SETUP_RETRANSMIT); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(RF_CHANNEL); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(RF_SETUP); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(FLAGS_RX_TX); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(DYNAMIC_PAYLOAD_LENGHT); itoa(a,str); lcd_puts(str); a=nrf24l01_command_read_of_register(FEATURE); itoa(a,str); lcd_puts(str); |
توابع هدر spi (فایل.h)
در این فایل ها نحویه ایجاد فایل کتابخانه ای نیز به کار برده شده است که ایجاد فایل کتابخانه ای یا نحویه یادگیری فایل کتابخانه ای را می توان فرا گرفت این فایل ها برای میکروکنترلر مگا 16 نوشته شده است که با مگا 32 یکی است . برای میکروهای دیگه باید پایه های آن را در نظر گرفت واصلاح کوچکی را برای پایه های آن طبق defineهای برنامه در نظر گرفت فایل های .c هر کتابخانه باید به پروژه لینک شوداین لینک کردن در سربرگ Configure project صورت می گیرد
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 |
/**************************************************************** writer:sayed mahmood roosta date: functions spi_0 ****************************************************************/ #ifndef NULL #define NULL 0 #endif #ifndef DISABLE #define DISABLE 0 #endif #ifndef ENABLE #define ENABLE 1 #endif #pragma used+ typedef unsigned char byte; typedef unsigned char character; /****************************************************************/ #define SPI_SLAVE 0 #define SPI_MASTER 1 #define SPI_SS 4 #define SPI_MOSI 5 #define SPI_MISO 6 #define SPI_SCK 7 /***********************************functions_spi_seting***********************************/ void spi_init_master( byte data_order , byte clock_division , byte status_sck ); void spi_init_slave( void ); void spi_clock_division( byte clock_division ); #define CLOCK_DIVISION(clock_division) clock_division //number_division==2_4_8_16_32_64_128 void spi_data_order( byte data_order ); #define DATA_ORDER_MSB 0 #define DATA_ORDER_LSB 1 void spi_status_sck( byte status_sck ); #define STATUS_SCK(status_sck) status_sck //number_status==0_1_2_3 void spi_control(byte control); void spi_control_interrupt( byte control ); void spi_mode( byte mode ); void spi_direction_pins( byte mode ); /***********************************functions_spi_put_get***********************************/ void spi_putchar( character data ); character spi_getchar( void ); void spi_puts( character *string ); character spi_gets( character *string ); void spi_putdata( void *data , character type ); character spi_getdata( character *string ); |
توابع و کتابخانه های دیگر از جعبه ی دانلود قابل دریافت میباشند(کل پروژه + امکانات جانبی رو میتونید از جعبه دانلود دریافت کنید.)
نتیجه گیری
از این ماژول می توان به صورت بی سیم استفاده کرد و برای ساخت وسایل بی سیم نظیر ماشین کنترلی و واکی تاکی یا بی سیم وغیره استفاده نمود . این ماژول برای ارسال صوت مناسب وبرای ارسال تصویر با تاخیر می تواند نیز مناسب باشد این ماژول بر روی برد بهتر جواب می دهد .
منابع
رضا سپاس یار انتشارات آوا
جابر الوندی انتشارات نص
مقاله ( ترجمیه دیتا شیت ماژول nrf24l01 ) مهدی دمرچیلو
سایت های ایرانی وخارجی
جعبه دانلود
فایل های مورد نیاز فایل های ضمیمه

درباره مهدی
مهدی طالبی هستم ،مدرس وبسایت هشت هسته.. تو زمینه الکترونیک ، بعضی وقت ها هم توی علوم کامپیوتری و علوم دیگه براتون مطالب مفید میذارم.برای دیدن اطلاعات بیشتر از من اینجا کلیک کنید.
نوشته های بیشتر از مهدیمطالب زیر را حتما بخوانید
-
Pharma tech steroids, safest steroid to use for bodybuilding
104 بازدید
-
Steroide anabolisant legal Anavar 10 mg, stéroïdes anabolisants effets secondaires
104 بازدید
-
Best steroid stack to get huge, anabolic steroid detection times
107 بازدید
-
Forbrænde fedt på armene compra steroidi in contrassegno
92 بازدید
-
Anabolic steroids and depression, best steroid cycle for muscle gain in hindi
94 بازدید
4 دیدگاه
به گفتگوی ما بپیوندید و دیدگاه خود را با ما در میان بگذارید.
کجاست لینک دانلود ؟
درست شد . از آخر نوشته میتونین دانلود کنین
شماتیک مدار گیرنده کجاس اون لینک فعال نیست
سلام عزیز
لینک شماتیک رو می شه بفرمایید کجاست ؟