Vaša IP adresa: 3.17.79.59
Počet návštev: 30458

Bezdrôtový modul nRF24L01+

Modul nRF24L01+ je lacný bezdrôtový modul pracujúci na frekvencii 2,4 GHz. Jeho dosah je približne 50 až 200 stôp (15 - 61 m). Dosah závisí hlavne od nastaveného výkonu, rýchlosti prenosu údajov a rušenia okolitými sieťami WiFi. Dá sa použiť na ovládanie zariadení a monitorovanie stavu senzorov v dosahu. Modul je dostupný v dvoch základných prevedeniach: so zabudovanou anténou na plošnom spoji a s externou anténou.

Verzia s anténou na DPS.
Verzia s anténou na DPS.
Verzia s externou anténou.
Verzia s externou anténou.


Konfigurácia vývodov modulu je uvedená na nasledujúcom obrázku a ich význam je uvedený v tabuľke.

Zapojenie vývodov nRF24L01+. Zapojenie vývodov nRF24L01+.
PinNázovFunkciaPopis
1GNDNapájanieZem (0V)
2VCCNapájanie+1,9V – +3,6V
3CEDigitálny vstupChip Enable (aktivuje RX alebo TX mód)
4CSNDigitálny vstupSPI Chip Select
5SCKDigitálny vstupSPI Clock
6MOSIDigitálny vstupSPI Slave Data Input
7MISODigitálny výstupSPI Slave Data Output
8IRQDigitálny výstupMaskable interrupt pin. Activ low.

Konfigurácia vývodov Raspberry PI 3 je uvedená na nasledujúcom obrázku.


Konfigurácia vývodov Raspberry PI 3. Konfigurácia vývodov Raspberry PI 3.

Nasledujúca tabuľka udáva vzájomné prepojenie Raspberry PI 3 a modulu nRF24L01+.


nRF24L01+Raspberry PI 3 (NAME)Raspberry PI 3 (PIN)
GNDGround06, 09, 14, 20, 25, 30, 34, 39
VCC3.3v01, 17
CEGPIO1711
CSNGPIO0824
SCKGPIO1123
MOSIGPIO1019
MISOGPIO0921
IRQGPIO0529

Poznámka: Vývody CE a IRQ môžeme pripojiť na ľubovoľný vstup Raspberry PI 3. V ďalšom texte predpokladáme ich pripojenie podľa tabuľky vyššie.


Pripojenie modulu nRF24L01+ k Raspberry PI 3. Pripojenie modulu nRF24L01+ k Raspberry PI 3.
Programovanie Raspberry PI 3

Knižnica pre nRF24L01+ v jazyku Python

Pre komunikáciu Raspberry PI s modulom nRF24L01+ je možné využiť skriptovací jazyk Python. Jeho nevýhodou je nižšia rýchlosť ako v prípade použitia jazyka C. Naopak, výhodou je jenoduchosť kódu a dostupné riešenia práve v tomto jazyku. Podarilo sa mi úspešne otestovať dve knižnice: lib_nrf24 od Blavery a nrf24 od jpbarraca. Knižnica lib_nrf24 je upravenou verziou nrf24. Obe zdrojvé stránky obsahujú príklady na odosielanie a príjímanie údajov prostredníctvom modulu nRF24L01+.

Update:Pod operačným systémom Raspbian Stretch (Kernel 4.14) a pod Python3 knižnica od jpbarraca nefunguje správne, do lib_nrf24.py treba do funkcie begin(self, csn_pin, ce_pin=0): dopísať rýchlosť pre SPI: self.spidev.max_speed_hz = 1000000:

def begin(self, csn_pin, ce_pin=0): # csn & ce are RF24 terminology. csn = SPI's CE!
# Initialize SPI bus..
# ce_pin is for the rx=listen or tx=trigger pin on RF24 (they call that ce !!!)
# CE optional (at least in some circumstances, eg fixed PTX PRX roles, no powerdown)
# CE seems to hold itself as (sufficiently) HIGH, but tie HIGH is safer!
self.spidev.open(0, csn_pin)
self.ce_pin = ce_pin
self.spidev.max_speed_hz = 1000000 #rychlost SPI v Hz

Upravenú verziu knižnice si môžete stiahnuť tu.

Komunikácia medzi Raspberry PI 3 a MCU typu AVR

V tejto časti je príklad bezdrôtovej komunikácie medzi Raspberry PI 3 a mikrokontrolérom typu AVR prostredníctvom dvojice modulov nRF24L01+. Raspberry slúži ako základňová stanica, ktorá prijíma údaje z periférnych senzorov (napr. teplotný údaj). Senzory sú riadené pomcou AVR mikrokontroléra. Program pre mikrokotrolér spolu s podrobným opisom je uvedený tu.

Kód pre Raspberry PI v skriptovacom jazyku Python s využitím knižnice lib_nrf24:

import RPi.GPIO as GPIO
from lib_nrf24 import NRF24
import time
import spidev

pipes = [[0xe7, 0xe7, 0xe7, 0xe7, 0xe7], [0xc2, 0xc2, 0xc2, 0xc2, 0xc2]]
radio = NRF24(GPIO, spidev.SpiDev())
radio.begin(0, 17) #0-SPI bus,17-GPIO pin s pripojenym CE
radio.setPayloadSize(5) #dlzka 5 bajtov
radio.setChannel(0x6C) #kanál dekadicky:108

radio.setDataRate( NRF24.BR_250KBPS ) #nastavenie rýchlosti prenosu
#radio.setDataRate( NRF24.BR_1MBPS )
radio.setPALevel(NRF24.PA_HIGH) #nastavenie výkonu
radio.setAutoAck(True)
radio.enableDynamicPayloads()
radio.enableAckPayload()
radio.openReadingPipe(0, pipes[1])

radio.printDetails()

radio.startListening()
try:
while(1):
ackPL = [1]
while not radio.available(0):
time.sleep(1 / 100)
receivedMessage = []
radio.read(receivedMessage, radio.getDynamicPayloadSize())
print("Received: {}".format(receivedMessage))
radio.writeAckPayload(1, ackPL, len(ackPL))
print("Loaded payload reply of {}".format(ackPL))
time.sleep(.5)
except KeyboardInterrupt:
GPIO.cleanup()
print("Channel closed!")

Po spustení uvedeného kódu sa zobrazia detaily s nastavenými a prečítanými parametrami pripojeného modulu nRF24L01+. Program čaká na prijatie údajov z ďalšieho modulu.

Zobrazenie detailov nastavenia modulu nRF24L01+ po spustení programu. Zobrazenie detailov nastavenia modulu nRF24L01+ po spustení programu.

Zaujímavé odkazy

Wireless Pi to Pi Python Communication with NRF24L01+
Python port of the RF24 library for NRF24L01+ radios
Python library for NRF24L01+ Transceivers