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:
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.
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
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 / C++
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
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 / C++
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