راه اندازی ماژول NRF24L01 با بسکام:

با سلام قبلا تو سایت برنامه نمونه راه اندازی ماژول NRF24L01 با بسکام رو براتون گزاشته بودیم و.لی واقعا مبهم بود حالا کاملش میکنیم:

در این آموزش سعی میکنم تا هر چیزی که در مورد این فرستنده وگیرنده میدونم در اختیارتون بزارم

این فرستنده ها یک نوع فرستنده قوی هستند که دیتا لاس کمتری دارند یعنی اطلاعات ازدست رفته کمتری دارند به طور خلاصه اگه به همدیگه کانکت بشن دیگه هیچ اطلاعاتی ازبین نمیره . اما شاید برای شما هم این سوال بیش اومده که برد این نوع فرستنده ها یا گیرنده ها چقدر هست در جواب باید یگم که اگر خوب تقویت بشن (با استفاده از مدارات تقویت کننده )حداکثر بردی که میتونن داشته باشن اونم تویک فضای باز که باد نباشه 1800 متر در نوع برد ایرانی هست.

بردهای دیگری هم هستند که توی فروشگاه های اینترنتی کمترین برد در فضای باز رو 100 متر تعیین کردن که با تستهای من بردش به این حدود میرسه البته تو یه فضای باز که باد هم نوزه! تست دیگه من این بود که یکی از این بردها رو تو گوشه یه اتاق درست ته خونه گذاشتم که 3تا دیوار داشت تا حدود 15 متر رو جواب داد این برد به شکل زیر هست

 

nrf24l01-arduino

ماژول دیگری هم هست که بردش 1100 متر هست شکلش هم به صورت زیر :

nrf

اولی حدود7تومن دومی هم حدود 35 تومن هستش. اینها مباحث در مورد انتخاب یه ماژول مناسب برای پروژتون بود

نحوه راه اندازی راه اندازی ماژول NRF24L01 با بسکام:

خوب باید در اول توضیح بدم که ما یک ماژول داریم که هم میتونه به صورت فرستنده وهم به صورت گیرنده کار کنه برای شروع باید ابتدا نام پایه ها رو بدونید تا با هاش کار کنید شکل زیر نام پایه ها وترتیبشون رو نششون میده

NRF pin الکترولب

NRF pin الکترولب

نحوه تنظیم به عنوان گیرنده:

برای اینکار باید پین شماره 4 رو 1 کنید یعنی 3.3ولت یا 5 ولت بشه(این نکته را یاد آور شوم که این ماژول تحمل 5 ولت را رویه پایه های دیتا دارد ولی باید حتما حتما ولتاژ تغذیه 3ولت باشه نه بیشتر)

 

PIN CE=1
BIT : PWR_UP=1 IN CONFIG REGISTER
BIT :PRIM_RX=1

نحوه تنظیم به عنوان فرستنده:
طبق دیتا شیت این ماژول نباید این ماژول بیشتر از 4میلی ثانیه در مد فرستنده باشه!!!!من که نفهمیدم واسه چی حالا بیخیال این تنضیمات واسه مد فرستنده هست

PIN CE=1
BIT : PWR_UP=0 IN CONFIG REGISTER
BIT :PRIM_RX=1

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

nrf set

میریم واسه تنظیمات دیتا ریت یا نرخ داده ارسالی این ماژول:
برای تنظیم نرخ داده باید تو2مگابیت بر ثانیه بایدرجیستر زیر به اینگونه تنظیم بشه

bit rate nrf

C++

1

2

06==H0F=00001111 2 MB/S AND LNA GAIN IS ON

06==H07=00000111 1 MB/S AND LNA GAIN IS ON

در این رجیستر میتوان قدرت ارسال داده را نیز تغیر داد یعنی افزایش یا کاهش داد من تا حالا با صفر دسی بل کار کردم ولی فکر میکنم با افزایش میزان دسی بل بتوان برد این ماژول را افزایش داد اگر میخواهی به جای کد هگز بالا از کد هگز پایین استفاده کنید که میزان دسی بل برابر 18 است:

C++

1

06==00001001=H09

هر یک از این ماژول ها میتوانند با 6 دستگاه دیگر ارتباط برقرار کنندبه طور همزمان که من به این توضیحات اکتفا میکنم هرچند کم هست ولی من سعی کردم مشکل اساسی افراد در قدرت ارسال و برد و نحوه تنضیم به عنوان گیرنده وفرستنده رو تو این آموزش کوچک براتون بگم من نمونه برنامه راه اندازی این ماژول با بسکام رو از اینترنت پیدا کردم ولی خیلی مبهم هست پس به توضیح این برنامه شروع میکنم:

کدهای برنامه به صورت زیر هست:

دقت کنید این برنامه هم برای گیرنده و هم برای فرستنده هست که فقط با ست یا ریست کرده یک پایه از میکرو . میکر. به فرستنده یا گیرنده تبدیل میشود بدون اینکه برنامه ریزی مجدد انجام بدید در ضمن در این برنامه از اینتراپت میکرو استفاده نشده ودنبال اینتراپت نگردید:

قسمت 1 کد های راه اندازی ماژول NRF24L01 با بسکام:

Visual Basic

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

قسمت1

$regfile = "M8def.dat"

$crystal = 8000000

$hwstack = 40

$swstack = 20

$framesize = 40

 

'=== Declare sub routines

Declare Sub R_register(byval Command As Byte , Byval C_bytes As Byte)

Declare Sub W_register(byval C_bytes As Byte)

 

'=== Constante ===

'Define nRF24L01 interrupt flag's

Const Idle_int = &H00                                       'Idle, no interrupt pending

Const Max_rt = &H10                                         'Max #of Tx Retrans Interrupt

Const Tx_ds = &H20                                          'Tx Data Sent Interrupt

Const Rx_dr = &H40                                          'Rx Data Received

'SPI(nRF24L01) commands

Const Read_reg = &H00                                       'Define Read Command To Register

Const Write_reg = &H20                                      'Define Write Command To Register

Const Rd_rx_pload = &H61                                    'Define Rx Payload Register Address

Const Wr_tx_pload = &HA0                                    'Define Tx Payload Register Address

Const Flush_tx = &HE1                                       'Define Flush Tx Register Command

Const Flush_rx = &HE2                                       'Define Flush Rx Register Command

Const Reuse_tx_pl = &HE3                                    'Define Reuse Tx Payload Register Command

Const Nop_comm = &HFF                                       'Define No Operation , Might Be Used To Read Status Register

'SPI(nRF24L01) registers(addresses)

Const Config_nrf = &H00                                     'Config' register address

Const En_aa = &H01                                          'Enable Auto Acknowledgment' register address

Const En_rxaddr = &H02                                      'Enabled RX addresses' register address

Const Setup_aw = &H03                                       'Setup address width' register address

Const Setup_retr = &H04                                     'Setup Auto. Retrans' register address

Const Rf_ch = &H05                                          'RF channel' register address

Const Rf_setup = &H06                                       'RF setup' register address

Const Status = &H07                                         'Status' register address

Const Observe_tx = &H08                                     'Observe TX' register address

Const Cd = &H09                                             'Carrier Detect' register address

Const Rx_addr_p0 = &H0A                                     'RX address pipe0' register address

Const Rx_addr_p1 = &H0B                                     'RX address pipe1' register address

Const Rx_addr_p2 = &H0C                                     'RX address pipe2' register address

Const Rx_addr_p3 = &H0D                                     'RX address pipe3' register address

Const Rx_addr_p4 = &H0E                                     'RX address pipe4' register address

Const Rx_addr_p5 = &H0F                                     'RX address pipe5' register address

Const Tx_addr = &H10                                        'TX address' register address

Const Rx_pw_p0 = &H11                                       'RX payload width, pipe0' register address

Const Rx_pw_p1 = &H12                                       'RX payload width, pipe1' register address

Const Rx_pw_p2 = &H13                                       'RX payload width, pipe2' register address

Const Rx_pw_p3 = &H14                                       'RX payload width, pipe3' register address

Const Rx_pw_p4 = &H15                                       'RX payload width, pipe4' register address

Const Rx_pw_p5 = &H16                                       'RX payload width, pipe5' register address

Const Fifo_status = &H17                                    'FIFO Status Register' register address

'Various

Const True = 1

Const False = 0

قسمت 2:

Visual Basic

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

'=== Config hardware ===

Config Spi = Hard , Interrupt = Off , Data Order = Msb , Master = Yes , Polarity = Low , Phase = 0 , Clockrate = 4 , Noss = 1

'Software SPI is NOT working with the nRF24L01, use hardware SPI only, but the SS pin must be controlled by our self

Config Pinb.1 = Output                                      'CE pin is output

Config Pinb.2 = Output                                      'SS pin is output

Config Pinb.0 = Input                                       'IRQ pin is input

Config Pinc.3 = Input                                       'TX/RX Device _select

Config Portc.4 = Output

Ce Alias Portb.1

Ss Alias Portb.2

Irq Alias Pinb.0

Txrx_device Alias Pinc توسط این پایه میکرو گیرنده یا فرستنده میشود

Spiinit                                                     'init the spi pins

Set Ce

Waitms 10                                                   'Wait a moment until all hardware is stable

Reset Ce                                                    'Set CE pin low

Reset Ss                                                    'Set SS pin low (CSN pin)

Dim D_bytes(33) As Byte , B_bytes(33) As Byte               'Dim the bytes use for SPI, D_bytes = outgoing  B_bytes = Incoming

Dim Temp As Byte , W As Word

Dim Packet_count As Byte

 

 

If Txrx_device = True Then Goto Main_tx                     'Is this the RX or TX device?

قسمت سوم:

Visual Basic

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

3

'===Main rx==========================================================================================================================

Main_rx:

Call R_register(status , 1)                                 'Read STATUS register

 

Reset Ce                                                    'Set CE low to access the registers

Gosub Setup_rx                                              'Setup the nRF24L01 for RX

Waitms 2                                                    'Add a delay before going in RX

Set Ce                                                      'Set nRF20L01 in RX mode

Do                                                          'Main loop for RX

If Irq = 0 Then                                             'Wait until IRQ occurs, pin becomes low on interrupt

    Reset Ce                                                'Receiver must be disabled before reading pload

    Do                                                      'Loop until all 3 fifo buffers are empty

      Call R_register(rd_rx_pload , 5)                      'Read 5 bytes RX pload register

      Select Case B_bytes(5)

      Case 2 : Set Portc.4

      Case Else : Reset Portc.4

      End Select

      'Print "Pload  : " ; Hex(b_bytes(1)) ; Hex(b_bytes(2)) ; Hex(b_bytes(3)) ; Hex(b_bytes(4)) ; Hex(b_bytes(5))       'Print the pload

      Call R_register(fifo_status , 1)                      'Read FIFO_STATUS

    Loop Until B_bytes(1).0 = True                          'Test or RX_EMPTY bit is true, RX FIFO empty

    D_bytes(1) = Write_reg + Status                         'Reset the RX_DR status bit

    D_bytes(2) = &B01000000                                 'Write 1 to RX_DR bit to reset IRQ

    Call W_register(2)

    Set Ce                                                  'Enable receiver again

   Waitms 2

End If

'Gosub Dump_registers                                        'Unremark me for debugging

Loop

Return

قسمت چهارم:

Visual Basic

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

'===Main tx==========================================================================================================================

Main_tx:

'Print "TX_device"                                           'Send to terminal who i'm

D_bytes(1) = Flush_tx                                       'Flush the TX_fifo buffer

Call W_register(1)

D_bytes(1) = Write_reg + Status                             'Reset the IRQ bits

D_bytes(2) = &B00110000

Call W_register(2)

Do                                                          'Main loop for TX

Incr Packet_count                                           'Increase the send packet counter, for test only

If Packet_count > 254 Then Packet_count = 0

Gosub Setup_tx                                              'Setup the nrf240l01 for TX

D_bytes(1) = Wr_tx_pload                                    'Put 5 bytes in the TX pload buffer

D_bytes(2) = &HAA                                           'Byte 1

D_bytes(3) = &HBB                                           'Byte 2

D_bytes(4) = &HCC                                           'Byte 3

D_bytes(5) = &H11                                           'Byte 4

D_bytes(6) = 2                                              'Byte 5 will be increase every loop

Call W_register(6)                                          'Write 6 bytes to register

Waitms 2

Set Ce                                                      'Set CE for a short moment to transmit the fifo buffer

Waitms 1                                                    '

Reset Ce                                                    '

Waitms 100                                                  'Some delay to read the output on the terminal, line can be removed for max. speed

W = 0                                                       'Counter for time out

Do

   If Irq = 0 Then

       Call R_register(status , 1)

       Temp = B_bytes(1) And &B01110000                     'Mask the IRQ bits out the status byte

      Select Case Temp                                      'Which IRQ occurs

        Case Max_rt                                         'MAX_RT

            'Print "Maximum number of TX retries, Flussing the TX buffer now !"

            D_bytes(1) = Flush_tx                           'Flush the TX buffer

            Call W_register(1)

            D_bytes(1) = Write_reg + Status

            D_bytes(2) = &B00010000                         'Clear the MAX_RT IRQ bit

            Call W_register(2)

            Exit Do

        Case Tx_ds                                          'TX_DS

            'Print "Packet " ; Packet_count ; " send and ACK received."

            D_bytes(1) = Write_reg + Status

            D_bytes(2) = &B00100000                         'Clear the TX_DS IRQ bit

            Call W_register(2)

            Exit Do

        Case Else                                           'Other IRQ ??

            'Print "Other irq " ; Bin(temp)

            D_bytes(1) = Flush_tx                           'Flush the TX buffer

            Call W_register(1)

            D_bytes(1) = Write_reg + Status

            D_bytes(2) = &B00110000                         'Clear both MAX_RT, TX_DS bits

            Call W_register(2)

        End Select

   End If

    Waitms 1                                                'Time out waiting for IRQ 1ms * 100

    Incr W                                                  'Increment W

    If W > 100 Then                                         'Waited for 100ms

     ' Print "No irq response from RF20L01 within 100ms"

      Exit Do                                               'Exit the wait loop

    End If

Loop

Loop

Return

قسمت پنجم:

Visual Basic

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

'=== Sub routines ===

Sub W_register(byval C_bytes As Byte)                       'Write register with SPI

Reset Ss                                                    'Manual control SS pin, set SS low before shifting out the bytes

    Spiout D_bytes(1) , C_bytes                             'Shiftout the data bytes trough SPI , C_bytes is the amount bytes to be written

Set Ss                                                      'Set SS high

End Sub

 

 

Sub R_register(byval Command As Byte , Byval C_bytes As Byte) As Byte       'C_bytes = Count_bytes, number off bytes to be read

Reset Ss                                                    'Manual controle SS pin, set low before shifting in/out the bytes

    Spiout Command , 1                                      'First shiftout the register to be read

    Spiin B_bytes(1) , C_bytes                              'Read back the bytes from SPI sended by nRF20L01

Set Ss                                                      'Set SS back to high level

End Sub

 

 

Setup_rx:                                                   'Setup for RX

D_bytes(1) = Write_reg + Rx_addr_p0                         'RX adress for pipe0

D_bytes(2) = &H34

D_bytes(3) = &H43

D_bytes(4) = &H10

D_bytes(5) = &H10

D_bytes(6) = &H01

Call W_register(6)                                          'Send 6 bytes to SPI

D_bytes(1) = Write_reg + En_aa                              'Enable auto ACK for pipe0

D_bytes(2) = &H01

Call W_register(2)

D_bytes(1) = Write_reg + En_rxaddr                          'Enable RX adress for pipe0

D_bytes(2) = &H01

Call W_register(2)

D_bytes(1) = Write_reg + Rf_ch                              'Set RF channel

D_bytes(2) = 40

Call W_register(2)

D_bytes(1) = Write_reg + Rx_pw_p0                           'Set RX pload width for pipe0

D_bytes(2) = 5

Call W_register(2)

D_bytes(1) = Write_reg + Rf_setup                           'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on

D_bytes(2) = &H0F

Call W_register(2)

D_bytes(1) = Write_reg + Config_nrf                         'Setup CONFIG-> PRX=1(RX_device), PWR_UP=1, CRC 2bytes, Enable CRC

D_bytes(2) = &H0F

Call W_register(2)

Return

 

Setup_tx:                                                   'Setup for TX

D_bytes(1) = Write_reg + Tx_addr                            'TX adress

D_bytes(2) = &H34

D_bytes(3) = &H43

D_bytes(4) = &H10

D_bytes(5) = &H10

D_bytes(6) = &H01

Call W_register(6)

D_bytes(1) = Write_reg + Rx_addr_p0                         'RX adress for pipe0

D_bytes(2) = &H34

D_bytes(3) = &H43

D_bytes(4) = &H10

D_bytes(5) = &H10

D_bytes(6) = &H01

Call W_register(6)

D_bytes(1) = Write_reg + En_aa                              'Enable auto ACK for pipe0

D_bytes(2) = &H01

Call W_register(2)

D_bytes(1) = Write_reg + En_rxaddr                          'Enable RX adress for pipe0

D_bytes(2) = &H01

Call W_register(2)

D_bytes(1) = Write_reg + Rf_ch                              'Set RF channel

D_bytes(2) = 40

Call W_register(2)

D_bytes(1) = Write_reg + Rf_setup                           'Setup RF-> Output power 0dbm, datarate 2Mbps and LNA gain on

D_bytes(2) = &H0F

Call W_register(2)

D_bytes(1) = Write_reg + Config_nrf                         'Setup CONFIG-> PRX=0(TX_device), PWR_UP=1, CRC 2bytes, Enable CRC

D_bytes(2) = &H0E

Call W_register(2)

Return  

حال توضیح قسمت های کد راه اندازی ماژول NRF24L01 با بسکام:

قسمت یک مربوط به تعاریف نوع میکرو و فرکانس کاری میکرو و نامگزاری آدرس های ماژول میباشد که در طی برنامه فقط نام رجیستر داده شود
در قسمت 2 پیش تنظیمات مربوط به ارتباط اس پی آی به صورت سخت افزاری میباشد پراکه این ماژول با اس پی آی نرم افزاری کار نمیکنه
همچنین پایه هایی از میکرو که باید به ماژول وصل بشه تعریف شده واینکه اگر پورت زیر یک باشد یعنی به ولتاژ3.3 یا 5 ولت وصل بشه میکرو به صورت فرستنده کار میکنه

C++

1

PORTC.3=1

اما اگر به زمین وصل بشه بصورت گیرنده کار میکنه

C++

1

PORTC.3=0

فرستنده وگیرنده هرکدوم 6 بایت رو میفرستند ویا میگیرن اگه فرستنده باشه به این 6 بایت مقدار میدیم ومیفرسته و تو گیرنده اون مقداری رو که تو فرستده قرار دادیم تو 6بایتش میگیریم
در فرستنده یک متغیر ارایه ای هست به نام

C++

1

D_bytes(X)     X=1.2.3.4.5.6

اما تو گیرنده به این نام هست:

C++

1

B_bytes(X)     X=1.2.3.4.5

در این برنامه که تغییر دادم در فرستنده در بایت 6 مقدار 2 رو قرار دادموبا دستوری اون رو میفرستیم
nrf prg

در گیرنده هم اگر مقدار بایت 6 برابر2 باشه یه ال ای دی متصل به میکرو پایه زیر روشن میشه:

C++

1

Portc.4

کته قابل توجه این هست که مهم نیست که فرستنده اول روشن بشه یا گیرنده
قسمت 3و4 رو که مخلوط وار توضیح دادم
قسمت 5 مربوط به سابروتین هست که مقدار دهی به رجیستر ها و آماده سازی برای کارکرد ماژول نوشته شده

نکات راه اندازی ماژول NRF24L01 با بسکام:

برای راه اندازی این ماژول باید بین پینهای تغذیه از یک خازن با ظرفیت بالا استفاده نمود ویک سلف در مسیر تغذیه قراربگیره تا نویز روش اثر نداششته باشه

shematic

و در پایان لینک دانلود پروژه کامل با این ماژول که عبارت فرستاده شده توسط فرستنده در LCD نمایش داده می شود.

 

دانلود پروژه

 

اگه خیلی خلاصه گفتم به لطف خودتون ببخشید

با آرزوی موفقیت برای شما عزیزان
یونس عباسزاده

فایل زیر اصلاح شده هست 100%تست شده و خودم به نتیجه رسیدم

فایل بالایی از سایت خارجی هست ولی شماتیک بالایی مربوط به فایل زیر هست

رمز فایل :electrolab.ir

از اینجا دانلود کنید