Testowanie łączności tinyBrd i RPi
W Nettigo robiliśmy wiele testów, by przekonać się jak wygląda zasięg i jakość połączenie między modemami NRF24L01. Udostępniamy Wam przykładowe testy, którymi możecie sami sprawdzić jak w Waszym przypadku wygląda jakość transmisji.
Jak testować
Cała idea polega na tym, że na tinyBrd działa program cyklicznie wysyłający dane do Raspberry. Dane te zawierają:
- ID kolejnych modułów tinyBrd,
- napięcie zasilania
- dane identyfikujące kolejny pakiet
Dzięki temu oglądając dane które docierają na Raspberry można przekonać się czy wszystkie pakiety docierają do celu, czy wymaga to retransmisji.
Skrócona instrukcja
tinyBrd
Zakładamy, że zainstalowany już jest Nettigo tinyBrd core, jeśli nie znajdziesz informację jak to zrobić w tym artykule.
Po ściągnięciu i rozpakowaniu w folderze ze szkicami zestawu przykładów do tinyBrd uruchom Arduino IDE. Otwórz szkic tinyBrdExamples/connectionTester
.
Do każdego tinyBrd, które chcesz testować wgraj szkic, wpisując inną wartość data.id
w funkcji setup
. Ten numer będzie służył do rozróżnienia kolejnych modułów tinyBrd.
Odbieranie danych z NRF24L01 na Raspberry
Zakładamy, że do Raspberry Pi masz podłączony moduł NRF korzystając z naszego NRF-hat.
Zaloguj się na Raspberry Pi. Przygotowany przez nas kod jest dostępny w formie standardowej paczki dla Pythona. Jeśli jeszcze nie masz potrzebujesz pip
dla Pythona3:
sudo apt-get install python3-pip
Teraz zainstaluj naszą bibliotekę w Pythonie do pracy z NRF:
sudo pip3 install git+https://github.com/nettigo/pyNRF.git
Ta komenda zainstaluje bibliotekę i wymagane zależności do jej pracy. Moduł NRF24L01 komunikuje się z Raspberry za pomocą protokołu SPI. Domyślnie w systemie operacyjnym Raspbian obłsuga tego protokołu jest wyłączona. Najprościej będzie użyć programu konfiguracyjnego raspi-config
. Uruchom go:
sudo raspi-config
Wybierz opcję 8. Advanced config
, następnie A6 SPI
(uwaga numery opcji mogą ulec zmianie, czytaj uważnie) i wybierz odpowiedzi Yes
na dwa pytanie, które zada program. Gdy wrócisz do głównego menu, wybierz opcję Finish
. Raspberry spyta się czy zrestartować urządzenie. Jest to potrzebne by SPI zaczęło działać, więc odpowiedz twierdząco.
Jeśli korzystasz z minimalnego obrazu Rasbpiana, może więcej brakować pakietów, więc wtedy musisz doinstalować
sudo apt-get install git python3-rpi.gpio
Po restarcie, zaloguj się na Raspberry i ściągnij a następnie uruchom program testowy:
git clone https://github.com/nettigo/tinyBrdScripts.git
cd tinyBrdScripts/connectionTester
sudo python3 ./connectionTester.py
Jeżeli masz już włączone tinyBrd z wgranym testowym oprogramowaniem powineneś zobaczyć takie wpisy:
27 Jul 2015 13:13:13: ID:100: Msg 0#0 from node: tinyBrd#100 => (100, 3994, 0, 0, 0)
27 Jul 2015 13:13:21: ID:3: Msg 1#1 from node: tinyBrd#3 => (3, 3693, 1, 1, 1)
27 Jul 2015 13:13:21: ID:3: Msg 1#3 from node: tinyBrd#3 => (3, 3693, 1, 3, 1)
27 Jul 2015 13:13:21: ID:3: Msg 1#4 from node: tinyBrd#3 => (3, 3693, 1, 4, 1)
27 Jul 2015 13:13:22: ID:6: Msg 0#0 from node: tinyBrd#6 => (6, 2361, 0, 0, 0)
27 Jul 2015 13:13:26: ID:1: Msg 1#0 from node: tinyBrd#1 => (1, 2486, 1, 0, 0)
27 Jul 2015 13:13:27: ID:2: Msg 2#0 from node: tinyBrd#2 => (2, 3857, 2, 0, 0)
27 Jul 2015 13:13:30: ID:100: Msg 1#0 from node: tinyBrd#100 => (100, 4008, 1, 0, 0)
27 Jul 2015 13:13:40: ID:3: Msg 2#0 from node: tinyBrd#3 => (3, 3693, 2, 0, 2)
27 Jul 2015 13:13:40: ID:3: Msg 2#1 from node: tinyBrd#3 => (3, 3693, 2, 1, 2)
27 Jul 2015 13:13:40: ID:3: Msg 2#3 from node: tinyBrd#3 => (3, 3693, 2, 3, 2)
27 Jul 2015 13:13:42: ID:6: Msg 1#0 from node: tinyBrd#6 => (6, 2356, 1, 0, 0)
27 Jul 2015 13:13:43: ID:1: Msg 2#0 from node: tinyBrd#1 => (1, 2486, 2, 0, 0)
27 Jul 2015 13:13:45: ID:2: Msg 3#0 from node: tinyBrd#2 => (2, 3857, 3, 0, 0)
27 Jul 2015 13:13:48: ID:100: Msg 2#0 from node: tinyBrd#100 => (100, 4008, 2, 0, 0)
27 Jul 2015 13:13:59: ID:3: Msg 3#1 from node: tinyBrd#3 => (3, 3693, 3, 1, 3)
27 Jul 2015 13:13:59: ID:6: Msg 2#0 from node: tinyBrd#6 => (6, 2356, 2, 0, 0)
27 Jul 2015 13:14:01: ID:1: Msg 3#0 from node: tinyBrd#1 => (1, 2486, 3, 0, 0)
27 Jul 2015 13:14:03: ID:2: Msg 4#0 from node: tinyBrd#2 => (2, 3857, 4, 0, 0)
27 Jul 2015 13:14:06: ID:100: Msg 3#0 from node: tinyBrd#100 => (100, 4008, 3, 0, 0)
27 Jul 2015 13:14:17: ID:6: Msg 3#0 from node: tinyBrd#6 => (6, 2356, 3, 0, 0)
27 Jul 2015 13:14:18: ID:3: Msg 4#0 from node: tinyBrd#3 => (3, 3693, 4, 0, 3)
27 Jul 2015 13:14:18: ID:1: Msg 4#0 from node: tinyBrd#1 => (1, 2486, 4, 0, 0)
27 Jul 2015 13:14:21: ID:2: Msg 5#0 from node: tinyBrd#2 => (2, 3857, 5, 0, 0)
27 Jul 2015 13:14:24: ID:100: Msg 4#0 from node: tinyBrd#100 => (100, 4008, 4, 0, 0)
Jak czytać wyniki
Nim dowiesz się co znaczą te wpisy, trzeba powiedzieć kilka słów o tym jak działa program testowy. Moduły tinyBrd wysyłają do RPi pakiety zawierające ID modułu, napięcie zasilania oraz dane pakietu.
I tak ID:6: Msg 1#0 from node: tinyBrd#6 => (6, 2356, 1, 0, 0)
oznacza - wiadomość od tinyBrd z numerem 6 (ID:6
oraz tinyBrd#6
). Zapis Msg 1#0
oznacza pakiet numer 1, pierwsza (zerowa) próba wysłania. Na końcu znajduje się cały pakiet rozpisany na wartości. Np w ostatniej linii to (100, 4008, 4, 0, 0)
. Kolejno są to:
- 100 - nr urzadzenia tinyBrd ustawiony w
setup
- 4008 - napięcie (podziel przez 1000 żeby mieć wartośc w V)
- 4 - nr kolejny pakietu
- 0 - numer próby wysłania tego konkretnego pakietu
- 0 - liczba pakietów dla których tinyBrd nie był w stanie odebrać potwierdzenia.
Co znaczą poszczególne liczby?
Moduł NRF w tinyBrd jest skonfigurowany by sam próbował dostarczyć pakiet wiele razy (dokładniej nawet 15) jeżeli transmisja za pierwszym razem się nie powiodła. Z punktu widzenia naszego testu jest to traktowane jak doręczenie za jednym razem.
Jeżeli moduł NRF nie doręczy w 15 próbach pakietu, informuje o tym tinyBrd, który każe wysłać cały pakiet jeszcze raz, ale tym razem zwiększa licznik ponownóch prób. I tak do pięciu razy, lub do momentu doręczenia. Jak wygląda taki zapis w logu na Raspberry:
27 Jul 2015 13:13:40: ID:3: Msg 2#0 from node: tinyBrd#3 => (3, 3693, 2, 0, 2)
27 Jul 2015 13:13:40: ID:3: Msg 2#1 from node: tinyBrd#3 => (3, 3693, 2, 1, 2)
27 Jul 2015 13:13:40: ID:3: Msg 2#3 from node: tinyBrd#3 => (3, 3693, 2, 3, 2)
Co tutaj widzimy? tinyBrd o numerze 3 ma najwyraźniej problem z doręczeniem pakietów. I tak RPi odebrało pakiet nr 2 z numerami retry 0,1, i 3. Retry o nr 2 nie dotrało do RPi. Na liście pakietów odebranych przez RPi nie ma retry o nr 4, co mogłoby sugerować że w końcu potwierdznie odbioru dotarło do tinyBrd. Jednak jeżeli spojrzymy na następny wpis dotyczacy tinyBrd#3:
27 Jul 2015 13:13:59: ID:3: Msg 3#1 from node: tinyBrd#3 => (3, 3693, 3, 1, 3)
Możemy zobaczyć, że tinyBrd wysyłało do RPi kolejny pakiet o nr 3, dotarł do RPi pakiet o retry 1, ale ostatnia liczba w linii informuje nas, że potwierdzenie za poprzedni pakiet nie zostało w ogóle odebrane przez tinyBrd.
Gdy tinyBrd 5 raz nie otrzyma potwierdzenia doręczenia pakietu, wówczas zwiększa globalny licznik niedoręczonych pakietów. Jest on prezentowany na ostatniej pozycji. Czyli przy próbach wysyłania pakietu nr 2 tinyBrd#3 miało niedoręczonych 2 pakiety. Przy trzecim - 3, czyli z tinyBrd#3 nie odebrało żadnego potwierdzenia nadania za pakiet nr 2.
Obserwując wyniki prezentowane przez conectionTester.py
możesz wywnioskować czy dane są doręczane w sposób stabilny.
Co można poprawić?
Jak widać z powyższych przykładów w niektórych przypadkach są problemy z zasięgiem. Zależy to od wielu czynników, często drobna nawet zmiana położenia potrafi radykalnie poprawić parametry pracy.
Prawie zawsze dużą poprawę uzyskacie podłączając modem NRF do tinyBrd z użyciem przewódów męsko-żeńskich. Obecnie do każdego modułu dodajemy taki zestaw przewodów. Prowadzimy też testy innych rozwiązań, które zmniejszą liczbę tego typu problemów.
Jak odbierać dane na Raspberry
Jeżeli intersuje Cię jak obierać dane wysłane z tinyBrd na Raspberry z użyciem modułu NRF24L01 to zapoznaj się z omówieniem naszego testowego programu connectionTester.py
.