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

3. Pierwszy program- transmisja zmiennej typu int

Jeżeli wystąpią jakieś problemy z transmisją lub jej brakiem to należy podłączyć, jak najbliżej pinów zasilących modułu nRF24L01+ kondensator elektrolityczny 10uF albo ceramiczny 100nF (należy wybrać jeden z nich)

Pierwszy program będzie prosty bo będzie polegać jedynie na przesłaniu zmiennej boolowskiej i zinterpretowanie jej po stronie odbiornika.

Schemat nadajnika:

kurs14.1nadajnik

Program nadajnika:

Jak widać kod jest stosunkowo prosty.  Na samym początku definiujemy biblioteki, z których będziemy korzystać. Następnie tworzymy kod naszej transmisji. Gdy już to mamy to musimy stworzyć instancję komunikacji, podporządkowaną pinom 9 (dla CE ) i 10 dla (CS). Teraz w void setup uruchamiamy moduł oraz rozpoczynamy transmisję. W pętli głównej programu przypisujemy zmiennej dla liczb całkowitych odczyt z przycisku. Tutaj ważna uwaga. Przy obsłudze tych modułów musimy prawidłowo rozróżniać typy jakie musimy wykorzystać. Jak np. w naszym programie korzystamy z liczb całkowitych to musimy dać typ int, a jak np. zmiennoprzecinkowe (odczytując temperaturę) to musimy użyć float. Następnie tak przygotowane dane wysyłamy poprzez funkcję radio.write() podając najpierw jaką zmienną wysyłam, a po przecinku jaką ta zmienna ma długość (wyrażoną typem zmiennej). Program naszego nadajnika jest gotowy. Teraz pozostał nam odbiornik.

Schemat odbiornika:

kurs14.1odbiornik

Program odbiornika:

Do void setup() robimy tak samo jak dla nadajnika. Następnie ustawiamy diodę jak wyjście. Ustawiamy, aby przy uruchomieniu Arduino, program poczekał 1s, nie jest to wymagane ale bez tego czasem były problemy z modułem. Następnie uruchamiamy moduł, zaczynamy odczyt z pierwszego zdefionowanego kanału o kodzie przez nas ustalonym, a następnie zaczynamy odczyt danych. W pętli głównej programu sprawdzamy, czy są jakieś dane do odbioru. Jeśli są to je odczytaj a następnie zapisz do zmiennej stan. Nazwy zmiennej nie muszą być takie same w nadajniku i odbiorniku. Najważniejsze, żeby typ był taki sam, albo kompatybilny względem tego w nadajniku. Okej, mamy już nasze dane. W tym przypadku z nadajnika zostało wysłane zero (stan przycisku odczytany przy pomocy digitalRead() ) więc chcemy aby było to jakoś zinterpretowane, więc tworzymy funkcję warunkową (na potrzeby kursu jest to prosta funkcja, ale w jej miejsce możesz wstawić cokolwiek chcesz). która dla wartości zero wykona jakiś program. W tym przypadku zapali diodę. Jeżeli wartość zmiennej jest inna od zera to zgaś diodę.

Po wgraniu programów powinniśmy otrzymać taki efekt:

  • Ł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ć.

  • Karol

    Cześć! Czy możliwa jest komunikacja w dwie strony? tzn żeby oba nrf-y były w stanie zarówno odbierać jak i wysyłać dane?

    • Cześć,
      jak najbardziej jest to możliwe, do wysyłania używamy write() a do odbioru read() . :)

      • Karol

        Rozumiem że trzeba stworzyć pipe_2 i nadać inny kod? Wówczas pipe służy do przesyłania informacji z nrf_1 do nrf_2, a pipe_2 do przesyłania informacji w drugą stronę?

  • Paweł Ignaszak

    Dzień dobry. Warto by było wspomnieć, że w wyżej wymienionej bibliotece, jest fascynującą możliwość a mianowicie.
    Istnieje możliwość przepisanie do dowolnego pinu (MOSI, MISO, SCK) w pliku RF24CONFIG, tylko trzeba pobrać dodatkową bibliotekę ! Sprawdzone i działa. Kiedyś może być sytuacja, iż jakiś układ nie jest do końca kompatybilny z SPI i wtedy albo robi się osobną płytkę, lub jakiś przełącznik, lecz sądzę, że to rozwiązanie jest prostsze. Mam nadzieję, że kiedyś komuś taka informacja się przyda