poniedziałek, 22 grudnia 2014

Obsługa modułu radiowego nrf24l01p + AVR m32, m128 m328p

Moduły nrf24l01+ w wersji z dodatkowym wzmacniaczem i anteną SMA pozwalają na uzyskanie teoretycznie około 1 km zasięgu w otwartej przestrzeni (przy najniższej prędkości 250 kbps). Ponadto są niezwykle energooszczędne, posiadają mechanizmy sprzętowej retransmisji pakietu oraz wysyłania potwierdzeń ACK. Te cechy sprawiają, iż są one niezwykle interesujące dla każdego konstruktora systemów wbudowanych wykorzystujących bezprzewodową transmisję danych.



Wykorzystane moduły to dokładnie: NRF24L01+PA+LNA SMA Antenna zakupione u naszych dalekowschodnich przyjaciół :) Zdjęcie poniżej:



Początkowo oprogramowanie do obsługi tych modułów radiowych rozwijane było na dwóch płytach rozwojowych: ZL3AVR oraz płytce GoTronika z ATmega128 na pokładzie. Bardzo pomocne podczas uruchamiania modułów okazały się także debugger, analizator logiczny oraz przejściówka USB-UART_TTL.


Po uruchomieniu podstawowej wersji oprogramowania z poprawną inicjalizacją modułów radiowych zdecydowałem się na wykorzystanie minimodułów z mikrokontrolerem ATmega328P. Kod źródłowy został dostosowany do współpracy z tymi uC.


Po zmontowaniu całości uzyskałem dwa urządzenia - nadajnik i odbiornik. Oba urządzenia są zasilane napięciem 3,3V. Wynika to z dopuszczalnego napięcia zasilającego moduł radiowy. Moduły z mikrokontrolerem są przez to trochę "podręcone" tzn. przy 3,3V pracują z taktowaniem 16 MHz, jednak na potrzeby protypowania dopuściłem takie rozwiązanie. W końcowym produkcie najbezpieczniej zastosować translatory napięć i wyższe napięcie dla mikrokontrolera.


 Oprogramowanie dostosowane do konkretnego mikrokontrolera AVR (M32, M128, M328P) można pobrać tutaj. Na chwilę obecną jest to mocno rozwojowa wersja, jednak spokojnie może posłużyć jako podstawa do dalszego rozwoju konkretnego urządzenia. Urządzenie nadawcze jest oznaczane jako PTX, natomiast odbiorcze PRX. W kodzie znajdują się dwie wersje inicjalizacji modułów radiowych - krótsza oraz bardziej rozbudowana. Polecam wykorzystywać tę drugą, ponieważ działa za każdym razem i może być stosowana jako programowy reset modułu. Niestety jednym z większych (jeśli nie największym) problemem jest brak zaimplementowanej operacji resetu sprzętowego bezpośrednio w module radiowym. Rozwiązania są dwa:
  • dodać tranzystor sterujący zasilaniem modułu radiowego i odpowiednio nim sterować z uC w zależności od potrzeb lub,
  • wykonać reset programowy układu z zapisaniem początkowych wartości do WSZYSTKICH rejestrów układu.
Dobrą praktyką jest też wykonanie pull-up do wyprowadzenia CSN (aktywującego stanem niskim transmisję po SPI). Przydaje się to zwłaszcza podczas rozwoju oprogramowania urządzenia - wspólne linie SPI programatora i modułu radiowego oraz nieokreślone stany na wyprowadzeniu CSN powodują, iż bez pull-up moduł radiowy jest niepoprawnie inicjalizowany (zbiera przypadkowe "śmieci" podczas programowania).


Na koniec jeszcze praktyczne informacje z testów tych modułów (wersja z antenami - przedstawiona na zdjęciach):

Pierwszy test: bez większych problemów możliwe było przesłanie danych przez dwie kondygnacje w dużym domu wolnostojącym (stare budownictwo). Dane wysyłane z piwnicy przez parter na 1 piętro, czyli przez 2 podłogi. Zdarzały się martwe punkty do których  sygnał nie docierał, jednak były to miejsca gdzie sygnał musiałby "przejść" przez bardzo grube powierzchnie betonowe.

Drugi test: nadajnik umieszczony wewnątrz tego budynku w pokoju na pierwszym piętrze. Odbiornik bez większych problemów odbierał dane w promieniu 30 metrów wokół budynku. W praktyce urządzenia mogły się komunikować w obrębie dosyć dużej działki.

W wolnej chwili wypadałoby wykonać test faktycznego zasięgu w otwartej przestrzeni - jeśli znajdzie się czas na takie testy, postaram się zamieścić wyniki i spostrzeżenia. Szacuję kilkaset metrów w "dobrych" warunkach, jednak 1,1 km podawane przez producenta wydaje mi się mocno przesadzone (chyba że testowane nad jeziorem, z dala od cywilizacji, zasilane bateryjnie itd.).

Pozdrowienia
Michał