Kurs Arduino #14: Obsługa modułu nRF24L01+

KURS ARDUINO#14.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:

  1. Co to jest moduł nRF24L01+ i jego zasada działania
  2. Podstawowe funkcje
  3. Pierwszy program- transmisja zmiennej typu int
  4. Drugi program – transmisja tablicy
  5. 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:

NRFPINOUT

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:

kod kanału do transmisji danych:

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:


Dla nadajnika:

void setup()

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:

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:

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…

Tyle informacji będziemy potrzebować w dzisiejszym kursie. Pełne repozytorium biblioteki dostępne jest tutaj.

  • Łukasz Zalewski

    A w jaki sposób zrobić tę samą komunikację pozwalającą np. na przesłanie temperatury z czujnika podłaczonego do Arduino Pro Mini z nRF24L01 do Raspberry Pi z nRF24L01 i zapisać tę wartość do bazy danych?

    • Wydaje mi się, że najlepiej byłoby zrobić taki program, który będzie zczytywać tą temperaturę, a następnie zapisywał ją do pliku CSV, który będziesz mógł sobie dalej obrabiać ;)

      • Łukasz Zalewski

        Zasadniczo problemem jest oszczędzanie energii w tym module. Mój plan to zasilić Arduino 9V baterią i wybudzić za pomocą nRF24, dokonać pomiaru, wysłać dane i uśpić. Raspberry było by serwerem na ciągłym zasilaniu. Taka jest teoria bo w praktyce nie wiem jak to ogarnąć.

        • ja bym zrobił to tak, że zasilanie do nRF puścił przez tranzystor, którym byś sterował z uC, przez co nRF nie byłby cały czas zasilany. Co do oszczędzanie to możesz to zrealizować na watchodogu, żeby np. na 5 minut wyłączało zasilanie, potem wybudzało, robiło pomiary, wysyłało i znowu usypiało na 5 minut ;) Zobacz ostatnią część kursu Arduino o oszczędzaniu energii

          • Łukasz Zalewski

            Oglądałem i czytałem na forum. Myślę, że to zainteresowało by trochę osób to może jakiś tutorial dało by radę zmontować.