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 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+.Pin | Názov | Funkcia | Popis |
---|---|---|---|
1 | GND | Napájanie | Zem (0V) |
2 | VCC | Napájanie | +1,9V – +3,6V |
3 | CE | Digitálny vstup | Chip Enable (aktivuje RX alebo TX mód) |
4 | CSN | Digitálny vstup | SPI Chip Select |
5 | SCK | Digitálny vstup | SPI Clock |
6 | MOSI | Digitálny vstup | SPI Slave Data Input |
7 | MISO | Digitálny výstup | SPI Slave Data Output |
8 | IRQ | Digitálny výstup | Maskable 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.
Nasledujúca tabuľka udáva vzájomné prepojenie Raspberry PI 3 a modulu nRF24L01+.
nRF24L01+ | Raspberry PI 3 (NAME) | Raspberry PI 3 (PIN) |
---|---|---|
GND | Ground | 06, 09, 14, 20, 25, 30, 34, 39 |
VCC | 3.3v | 01, 17 |
CE | GPIO17 | 11 |
CSN | GPIO08 | 24 |
SCK | GPIO11 | 23 |
MOSI | GPIO10 | 19 |
MISO | GPIO09 | 21 |
IRQ | GPIO05 | 29 |
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.
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 AVRV 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.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