Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

nRF24l01+ - nie jestem w stanie napisać dwustronnej komunikacji

domints 17 Sie 2014 11:51 2334 3
  • #1 17 Sie 2014 11:51
    domints
    Poziom 12  

    Witam wszystkich,
    Mam problem jak w temacie, a mianowicie:
    konstruuję quadrocopter i postanowiłem zaoszczędzić trochę pieniędzy - co się nie dało zrobić kupiłem, a reszta, czyli główną elektronikę postanowiłem skonstruować sam - moduł kontroli lotu to MultiWii skonfigurowany i wgrany na Arduino Pro Mini, moduł nadawczo-odbiorczy, to pilot własnej konstrukcji (jeszcze w fazie tworzenia) oraz Atmega328P zamieniająca sygnał z modułu bezprzewodowego na sygnał SumPPM oraz UART. Jako moduł bezprzewodowy początkowo obrałem tanie i popularne moduły 433MHz, lecz gdy znalazłem tanio szybsze, bardziej niezawodne i o większym zasięgu moduły nRF24l01+ z dodatkowym wzmacniaczem i anteną zewnętrzną zakupiłem je i teraz męczę się z ich okodowaniem.

    I teraz do rzeczy:
    Piszę w środowisku Arduino, gdyż moje pierwsze kroki z programowaniem to był mocno obiektowy język C#, dlatego czyste C jest dla mnie trochę dziwne. Dlatego też widząc, że są gotowe biblioteki dla tych modułów, postanowiłem z nich skorzystać i tu zaczynają się schody. Gdy uruchamiam jeden z przykładów, wszystko działa jak należy, jeden z modułów nadaje, drugi odbiera, odpowiada, pierwszy wszystko rejestruje, wylicza ping itd. Ale gdy próbuję napisać swój program, mocno bazując na przykładach, jeden z modułów nadaje, drugi to widzi, ale pierwszy nie widzi odpowiedzi - nie wiem, czy ten drugi nie wysyła, czy pierwszy nie odbiera.
    Oto mój kod:

    Kod: c
    Zaloguj się, aby zobaczyć kod

    Ogólnie rzecz biorąc jak na razie to tylko próba, czy tak się da, jakie to może być szybkie itd. ale właśnie nie działa. W tym momencie idea była taka, żeby wypełnić 17-bajtową tablicę losowo wybranymi bajtami (jako ziarno używam szumu z jednego z analogów), wysłać ją w eter, odbiornik ją odbiera i "odbija", a nadajnik gdy odbierze "odbity" pakiet sprawdza, czy wszystko się zgadza i wtedy inkrementuje lub nie odpowiedni licznik. Niestety inkrementuje się jedynie licznik wysłanych pakietów (musi ;) ) oraz timeOut.

    Co do wyboru MASTER / SLAVE to po prostu w środowisku Arduino zmieniam port, na który ma wysyłać kod i przekomentowuję odpowiedni #define.

    Biblioteka, której używam, to Mirf, poniżej jeszcze załączę jak wyglądają deklaracje funkcji send i receive w tej bibliotece, bo podejrzewam, że tu kod jest pokaszaniony.
    Kod: c
    Zaloguj się, aby zobaczyć kod


    Podejrzewam, że problem może być w tym, że ciągle nie jestem w stanie ogarnąć w jaki sposób poprawnie wypełnia się i przesyła do funkcji tablice w językach C-podobnych. W C# miałem tablicę i była ona zwykłą zmienną, którą można było manipulować jak Intem, a tutaj jakieś wskaźniki itd...

    Z góry bardzo dziękuję za wszelką pomoc :)

    Pozdrawiam,
    Dominik Szymański

    0 3
  • #2 19 Sie 2014 13:15
    208885
    Użytkownik usunął konto  
  • #3 23 Sie 2014 12:10
    domints
    Poziom 12  

    A masz może jakiś link? Bo nie jestem w stanie jej znaleźć. A co do rozwiązania problemu, to przerzuciłem się z pozornie łatwiejszej Mirf na RF24 i przerabiając przykład doszedłem do bezprzewodowej komunikacji między 2 arduinami, działającej na zasadzie, że gdy wpiszę coś w terminal jednego, wypisywane jest na terminalu drugiego, ale niestety gdy tą metodą próbuję uruchomić MultiWiiConfig nie dostaję żadnej odpowiedzi. Czy jest możliwość, że MultiWii przesyła zbyt duże ilości danych na raz i przepełnia bufory? W tym momencie jako rozmiar ramki modułu bezprzewodowego obrałem 26 bajtów: 1 bajt zawierający liczbę bajtów danych, n bajtów danych (max 24), jednobajtowa suma kontrolna obliczana przez XOR wszystkich bajtów danych (bez liczby bajtów) z początkowej wartości 0.
    A może problemem jest kwarc, który zastosowałem - 8MHz, w porównaniu do 16MHz w Arduino, który to okazuje się być zbyt wolny, aby utrzymać szybką komunikację z nRF i UART na baudrate 115200 jednocześnie?
    Aczkolwiek dzięki Ci bardzo za odpowiedź :)

    0
  Szukaj w 5mln produktów