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

4. Drugi program – transmisja tablicy

Aby ta część kursu była jak najbardziej douczająca to wprowadzę tutaj coś, czego jeszcze nie było do tej pory czyli tablice. Z początku może brzmieć groźnie, ale wcale takie nie jest. Tablica- w tym rozpatrywanym przypadku -jest miejscem gdzie są zgromadzone różne zmienne. Można by wręcz powiedzieć, że jest to pewnego rodzaju „segregator” na zmienne. Wygląda on następująco:

Załóżmy, że chcemy w naszej tablicy trzymać trzy zmienne, więc piszemy:

Tutaj możesz się zastanawiać, jak powinny nazywać się zmienne, aby były przechowywane w tablicy. Tutaj nie ma innego wyjścia niż nazwać zmienne tak samo jak tablicę. Każda zmienna musi być numerowana. Tutaj ważna sprawa, o której się często zapomina. Zmienne zawarte w tablicy numerujemy od zera.

Można to łatwo zapamiętać, ponieważ jakbyśmy numerowali od jedynki to by się okazało, że ostania zmienna ma taką samą nazwę jak tablica.

Tyle temat wstępu do tablic. Czas użyć je praktyce.

Schemat nadajnika:

kurs14.2nadajnik

Program nadajnika:

Definiowanie modułu nic się nie różni od poprzedniego przykładu, tylko jak widać doszły nam jeszcze dwie linijki:

W pierwszej linii definiujemy prędkość transmisji. Mamy do wyboru 3 prędkości:

Można sukcesywnie korzystać z najwyższej prędkości, bez obaw o zerwanie transmisji, jakby to miało miejsce w tanich modułach RF. Nie mniej jednak przy transmisjach tego typu, gdzie przesyłamy nie więcej niż 4bitowe dane, nie ma odczuwalnej różnicy.

Druga linia decyduje wzmocnieniu modułu. Mamy do dyspozycji 4 poziomy wzmocnienia:

Wystarczy zamiast X wstawić, któreś z powyższych:

Jeżeli korzystamy z tych opcji to musimy je wykorzystać zarówno w odbiorniku jak i nadajniku, aby nie było problemu z transmisją. Następnie przechodzimy do pętli głównej programu. Jak widać nie ma tutaj nic nadzwyczajnego. Do zmiennej pot[0] przypisujemy wartość odczytu ADC, gdzie podłączony jest potencjometr, a następnie podzieloną przez 4, aby w ostateczności uzyskać poziomy zbliżone do PWM. Tak przygotowane dane wysyłamy. Jak widać zamiast pisać typ zmiennej jako długość, możemy wpisać samą nazwę zmiennej jako długość, ale nie zawsze może działać poprawnie. Teraz można przejść do odbiornika.

Schemat odbiornika:

kurs14.2odbiornik

Program odbiornika:

Przy definiowaniu odbiornika nic się nie zmieniło w porównaniu z poprzednim odbiornikiem, zatem wtrącę jeszcze parę słów odnośnie transmisji tablic. Przy transmisji tablicy z jednego układu do drugiego, kolejność zawartych w niej zmiennych się nie zmienia. Dlatego kolejność definiowania zmiennych z tablicy w odbiorniku powinna być taka sama tzn. jak korzystamy z dwóch potencjometrów to potrzebujemy zapisać dwie zmienne w tablicy np. pot[0] odpowiadający za pierwszy potencjometr i pot[1] odpowiadający za drugi. Zatem w odbiorniku, musimy również stworzyć tablicę, do której będą trafiać dane z nadajnika. Czyli jak będziemy chcieli skorzystać z danych pierwszego potencjometra to musimy dokonać odczytu ze zmiennej zakończonej [0], ponieważ kolejność rozpakowywania danych jest taka sama jak kolejność pakowania.
Wracając do programu. Funkcja warunkowa if() sprawdza czy są jakieś dane w buforze. Jeżeli tak, to dokonywany jest zapis do tablicy pwm, o długości takiej jaką posiada. Następnie przy pomocy funkcji analogWrite() przypisywana jest wartość diodzie z pierwszej zmiennej z tablicy pwm.

Tak wgrane program powinny dać taki efekt:

5. Podsumowanie

Jak widzimy obsługa modułów nRF24L01+ nie jest aż taka trudna, aczkolwiek sama biblioteka modułu jest momentami problematyczna, tzn. czasem, żeby wysłać jakieś dane, to trzeba napisać wysyłanie ich drogą na około niż bezpośrednio, ale nie są to jakieś problemy, z którymi nie można by sobie poradzić. Zawsze jak pokaże się jakiś błąd kompilacji, to warto go przeczytać, bo czasem znajduję się w nim odpowiedź rozwiązania problemu. To tyle, mamy nadzieję, że poradnik trochę rozjaśni Ci sposób obsługi tego modułu. Polecam zajrzeć do pełnej dokumentacji biblioteki, ponieważ tutaj poruszyliśmy tylko podstawy obsługi tego modułu, a żeby napisać kompletny kurs dla tego modułu to by powstała już dobra książeczka. ;)

Materiały do dzisiejszego kursu:
Download-icon

 

 

 

 


Jeżeli chcesz być informowany na bieżąco o nowych częściach kursu to kliknij „Lubię to!” bądź subskrybuj naszą stronę, aby otrzymywać na adres e-mail nowości ze strony. Jeżeli masz jakieś pytania to śmiało zadawaj je na forum ; )

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