Cześć,
nie dawno pokazywaliśmy jak obsłużyć tanie moduły 433MHz, dzisiaj przedstawimy jak obsłużyć moduł 2,4GHz nRF24L01+. Zapraszamy
Spis treści:
- Co to jest moduł nRF24L01+ i jego zasada działania
- Podstawowe funkcje
- Pierwszy program- transmisja zmiennej typu int
- Drugi program – transmisja tablicy
- Podsumowanie
Co będziemy potrzebować:
- 2x Arduino
- 2x moduł nRF24L01+
- 1x przycisk typu Tact-Switch
- 1x rezystor 220 ohm
- 1x termometr DS18B20
- 1 zestaw przewodów połączeniowych
1. Co to jest moduł nRF24L01+ i jego zasada działania
Jest to moduł radiowy, operujący na częstotliwości 2,4GHz (nie mylić z Wi-Fi). W dobrych warunkach możemy osiągnąć zasięg nawet do 100m, a jeżeli skorzystamy z modułu posiadającego zewnętrzną antenę to ten zasięg może nawet wynieść 1,1km !!. Najzwyklejsze moduły posiadają wbudowaną antenę w PCB.
Wielką zaletą tego modułu jest sposób zasilania. Do działania ten moduł potrzebuje 3,3V. Przy odbiorze danych pobiera 12mA, a przy nadawaniu 11mA. Możemy szybko wyciągnąć wniosek, że ten moduł tak naprawdę pobiera mniej prądu niż dioda LED. Moduł posiada również stany oszczędzania energii. W tych stanach moduł nie pobiera prąd w zakresie 900nA – 320 uA.
Wspomniałem, że moduł potrzebuje do zasilania 3,3V, ale toleruje poziomy logiczne na poziomie 5V (samego modułu nie możemy zasilać napięciem 5V ponieważ możemy go uszkodzić). Co jest bardzo ważne, a zarazem ułatwia obsługę, ponieważ nie musimy używać układu obniżającego stany logiczne.
Moduł pracujący na paśmie 2,4GHz posiada 125 kanałów, dzięki czemu możemy korzystać z paru urządzeń na raz bez obawy o wszelkie konfilkty przy transmisji. Kolejną wielką zaletą tego modułu jest to, że sam tworzy pakiet danych zabezpieczony sumą kontrolną CRC. Zatem dane albo dojdą dobre w całości, albo nie dojdą w cale, ponieważ ich suma kontrolna nie będzie zgadzać z oczekiwaną. Po odebraniu danych modem docelowy odsyła potwierdzenia odbioru danych.
Moduł łączy się z mikrokontrolerem przy pomocy interfejsu SPI. Moduł oddaje nam również do wybór prędkość transmisji danych:
- 250kbps
- 1Mbps
- 2Mbps
Moduł został wyposażony dodatkowo w IRQ, którym możemy wybudzać mikrokontroler w momencie odbioru danych, przez co zaoszczędzimy trochę energi. Dobre rozwiązanie, gdy chcemy je wykorzystać do stacji meteo.
Pełną specyfikację modułu można znaleźć tutaj.
Sposób podłączenia do Arduino:

| nRF24L01+ | Arduino |
| Vcc | 3,3V |
| GND | GND |
| CE | 9 |
| CS | 10 |
| MOSI | 11 |
| MISO | 12 |
| SCK | 13 |
2. Podstawowe funkcje
Podstawowe biblioteki potrzebne do nadajnika jak i odbiornika:
|
1 2 3 |
#include <SPI.h> //biblioteka obsługi SPI #include <nRF24L01.h> //biblioteka do obsługi danego modułu #include <RF24.h> //bazowa biblioteka dla rodziny modułów RF24 |
kod kanału do transmisji danych:
|
1 2 |
const uint64_t pipe = 0xYYYYYYYYYYLL //zamiast Y wstawiamy dowolne znaki zgodne z system szesnastkowym czyli od 0-9 i od A-F |
W tym momencie tworzymy tak właściwie stałą 64bitową. Po znaku równości podajemy kod kanału, na którym będą nadawać nasze moduły. Do programu odbiornika dodajemy ten sam kod. Zamiast pipe możemy nadać dowolną nazwę, np. „kod”. Ważne, aby koniec kodu był unikalny, jak np. u mnie, gdzie zakończony jest typem long long.
Teraz definiujemy instancję komunikacji modułów, aby Arduino wiedziało, że chcemy dokonać transmisji przewodowej:
|
1 2 |
RF24 radio(CE_Pin, CS_Pin); //tworzymy instancję komunikacji o nazwie radio i przypisujemy do modułu piny CE i CS |
Dla nadajnika:
void setup()
|
1 2 |
radio.begin(); //uruchom moduł radio.openWritingPipe(pipe); //ustaw moduł w tryb wysyłania |
Mam nadzieję, że ta część jest zrozumiała i nie trzeba jej zbytnio tłumaczyć ;)
void loop()
Poniżej przedstawię jedną z najbardziej podstawowych funkcji, która pozwoli nam na komunikację z drugim modułem:
|
1 2 3 |
radio.write(zmienna , dlugosc_zmiennej); //zmienna- tutaj podajemy nazwę zmiennej //dlugosc_zmiennej- podajemy długość zmiennej np. jako długość tablicy, długość zmiennej boolowskiej itp. |
Przy pomocy tej funkcji, możemy realizować najprosztsze operacje tj. wysyłanie pojedynczych znaków, ciągów znaków, zmiennej boolowskie itp. Dla nadajnika to już wszystko.
Odbiornik:
void setup():
Podstawowe funkcje aby zacząć odbiór danych:
|
1 2 3 |
radio.begin(); //uruchom moduł radio.openReadingPipe(1,pipe); //zacznij odczyt z kanału pierwszego, przypisanego stałej 64bitowej pipe radio.startListening(); //zacznij nasłuch (odbiór) danych |
void loop():
Proces odbioru jest prosty. Najpierw program sprawdza, czy są jakieś dane na kanale. Jeżeli są to je zczytaj, a następnie zapisz do zmiennej…
|
1 2 3 4 5 6 7 8 9 |
void loop() { if ( radio.available() ) //sprawdza czy są dane do odbioru, { //jeżeli tak: radio.read(zmienna, dlugosc_zmiennej); //odbierz dane i zapisz do zmiennej o //długości... } } |
Tyle informacji będziemy potrzebować w dzisiejszym kursie. Pełne repozytorium biblioteki dostępne jest tutaj.