Raspberry Pi i nRF24L01+

Trochę się pozmieniało w moim systemie inteligentnego domu. Przede wszystkim rozpoczynam prace nad instalacją systemu alarmowego. Ponieważ alarm to wręcz wymarzony zestaw czujników dla automatyki domowej, postanowiłem zintegrować go z moim systemem. Będzie to pewnie tematem serii wpisów na blogu, jednak dla dzisiejszego tekstu istotne jest, że mam zamiar użyć do tego Raspberry Pi (o którym już pisałem przy okazji tekstu o monitoringu).

nRF24l0+ i Raspberry Pi

Dodatkowo należy Wam się informacja, że w ostatnim czasie zacząłem używać modułów do komunikacji bezprzewodowej – nRF24L01+ w połączeniu z Arduino Pro Mini. O tym też mam zamiar napisać (tak wiem, dawno nie pisałem, przez brak czasu), jednak zacznę od Raspberry Pi. Dlaczego? Bo przy okazji integracji z centralą alarmową stanie się ono główną jednostką systemu automatyki domowej. A skoro już tak będzie, to dobrze by było, żeby było też centralnym punktem komunikacji bezprzewodowej (używanej np. do zdalnego załącznia światła, ale też odczytów różnych czujników).

Zacznijmy od strony sprzętowej. Na portalach aukcyjnych dostępne są rozsądne cenowo układy nRF24L01+, w postaci niewielkiej płytki 1,5cm x 3cm, ze zintegrowaną anteną (lub gniazdem anteny w bogatszej wersji) i ośmioma wyprowadzonymi goldpinami. Zasilane są one napięciem 3,3V, a do komunikacji wykorzystują interfejs SPI. Wszystko więc świetnie pasuje do Raspberry Pi (jak i zwykle do Arduino).

nRF24l01+

Połączenia są dość proste. Piny 1-7 z nRF24L01+ łączymy odpowiednio z pinami RPi: 25 (gnd), 17 lub 1 (3,3V), 22 (GPIO25, CE), 26 (GPIO7, CSN), 23 (GPIO11, SCK), 19 (GPIO10, MOSI), 21 (GPIO9, MISO).

Przed dalszymi działaniami, należy upewnić się, czy SPI po stronie Raspberry Pi jest włączone. W pliku /etc/modprobe.d/raspi-blacklist.conf nie powinno być wpisu blacklist spi-bcm2708 lub powinien być on zakomentowany. Jeżeli SPI jest włączone, to w katalogu /dev/ powinny być widoczne urządzenia spidev0.0 i spidev0.1. W tym miejscu wypadałoby podkreślić, że moje Raspberry Pi działa pod kontrolą Raspbiana i jego dotyczą zawarte tu instrukcje.

Kolejnym krokiem będzie pobranie biblioteki do obsługi modułu radiowego. Użyjemy biblioteki, która jest dostępna zarówno na Raspberry Pi, jak i Arduino. Pozwoli to na bezproblemową komunikację urządzeniami opartymi na Arduino (np. do włączania oświetlenia LED pod szafkami w kuchni, załączania urządzeń elektrycznych, fizycznego restartu routera, czujnikiami temperatury i wilgotności) a centralnym serwerem zarządzającym inteligentnym domem na Raspberry Pi. Ściągnięmy ją z gita, skompilujemy i zainstalujemy:

git clone https://github.com/stanleyseow/RF24
cd RF24/librf24-rpi/librf24-bcm
make
sudo make install

W katalogu RF24/librf24-rpi/librf24-bcm/examples mamy przykłady dla Raspberry a w examples dla Arduino. Na początek, dla weryfikacji, czy komunikacja działa poprawnie, najlepiej użyć programu pingpair po stronie Arduino i pingtest lub pongtest po stronie Raspberry. Aby to się udało trzeba pamiętać, żeby odpowiednio ustawić parametry układu – po obu stronach musi być taki sam numer kanału, długość pakietu z danymi i prędkość transmisji. Oba urządzenia muszą mieć też wzajemnie zaprogramowane adresy nadawcze i odbiorcze. To dość oczywiste, natomiast jeżeli czegoś nie dopatrzymy, to poszukiwanie przyczyny problemów, może zabrać trochę czasu.

Dla wymienionej wyżej konfiguracji połączeń między RPi a nRF24L01+ (spi 0.1) inicjalizacja interfejsu radiowego w programie powinna wyglądać tak:

RF24 radio(RPI_V2_GPIO_P1_22, RPI_V2_GPIO_P1_26, BCM2835_SPI_SPEED_8MHZ);

Natomiast efektem działania programu pingtest przy „pongu” po stronie Arduino powinno być:

pi@rpi ~/RF24/librf24-rpi/librf24-bcm/examples $ sudo ./pingtest
RF24/examples/pingtest/
ROLE: Ping out
================ SPI Configuration ================
CSN Pin = Custom GPIO7 (CE1) Software Driven
CE Pin = Custom GPIO25
Clock Speed = 8 Mhz
================ NRF Configuration ================
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xf0f0f0f0e1 0xf0f0f0f0d2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xf0f0f0f0e1
RX_PW_P0-6 = 0x20 0x20 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x20
RF_SETUP = 0x05
CONFIG = 0x0f
DYNPD/FEATURE = 0x00 0x00
Data Rate = 1MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_HIGH
Now sending 121...ok...Got response 121, round-trip delay: 7
Now sending 1130...ok...Got response 1130, round-trip delay: 7
Now sending 2138...ok...Got response 2138, round-trip delay: 7
Now sending 3146...ok...Got response 3146, round-trip delay: 8
Now sending 4155...ok...Got response 4155, round-trip delay: 7

Działa bez zarzutu. Zasięg nawet całkiem przyzwoity, bo w domu przez 2 piętra nie ma specjalnie problemu. Nie jest natomiast tak, że przy umieszczeniu urządzeń w dwóch najbardziej odległych punktach domu nadal jest zasięg (nawet przy wersji układu z dokręcaną anteną). Natomiast przy możliwie centralnym umieszczeniu Raspberry Pi, z komunikacją nie powinno być problemów. A jak będą, zawsze jest możliwość zbudowania sieci retransmiterów…

zaciskarka goldpin

Na koniec jeszcze uwaga techniczna – jak docelowo połączyć nRF25l01+ z Raspberry Pi tak, żeby łatwo było w razie czego rozłączyć układy? Najprościej użyć popularnych złącz zwanych „dupont” (występujących często, np. przy płytach głównych). Przy testowych połączeniach używam zwykle pojedynczych wtyków, natomiast w konfiguracji ostatecznej najlepiej jest zastosować jedną „wtyczkę” dla wszystkich przewodów.

Ten wpis został opublikowany w kategorii Inteligentny Dom i oznaczony tagami , , , . Dodaj zakładkę do bezpośredniego odnośnika.

0 odpowiedzi na Raspberry Pi i nRF24L01+

  1. życzliwy pisze:

    Zainteresuj się http://mysensors.org 🙂

  2. irek pisze:

    Z czego zasilasz arduino + nRF25l01 ? Gdzie można kupić te złącza „dupont” ?

  3. Paszczak pisze:

    a jaka jest różnica pomiędzy NRF24L01 a wersją z + ?

    • Możliwość zmiany prędkości transmisji – od 2MB/s do 250KB/s. Wcześniej tak się nie dało. Ale jakoś nie widzę problemu – w allegro na fv nrf jest po 6,5zł. Im wolniej, tym dalej sygnał przebija się. Generalnie jak jeden nrf będzie miał antenę, a transmisja pójdzie po 0,25, to przebija się niemal przez wszystko. No – w Wilczym Szańcu widzę problem. Mi tam przebija się przez 2 piętra, parę ścian + stare rury co. Oczywiście szału nie ma, ale i da się żyć, a receivera nie tworzę, bo muszę mieć mimo wszystko albo szybko info zwrotne, albo w ogóle.

  4. Pawel Waleka pisze:

    Jaka zaciskarke uzywasz do zaciskania BLS (BLT). Jest ona pokazana na jednym zdjeciu. Mozesz ja polecic?

    Blog ten pozwolil mi sie uporac z komunikacja PI>Arduino z pythonem po stronie RPi. Za co wielkie dzieki

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *