- Wymagane materiały
- Łączenie Raspberry Pi z LoRa
- Łączenie Arduino z LoRa
- pyLoRa dla Raspberry Pi
- Konfiguracja Raspberry Pi dla modułu LoRa
- Programowanie Raspberry Pi dla LoRa
- Kod Arduino dla LoRa do komunikacji z Raspberry Pi
- Testowanie komunikacji LoRa pomiędzy Raspberry Pi a Arduino
LoRa staje się coraz bardziej popularna wraz z nadejściem IoT, Connected Cars, M2M, Industry 4.0 itd. Ze względu na swoją zdolność do komunikowania się na duże odległości z bardzo mniejszą mocą, jest ona preferowana przez projektantów do wysyłania / odbierania danych z urządzenia zasilanego bateriami. Omówiliśmy już podstawy LoRa i jak używać LoRa z Arduino. Chociaż technologia była pierwotnie przeznaczona do komunikacji węzła LoRa z bramą LoRa, istnieje wiele scenariuszy, w których węzeł LoRa musi komunikować się z innym węzłem LoRa w celu wymiany informacji na duże odległości. Tak więc w tym samouczku nauczymy się, jak używać modułu LoRa SX1278 z Raspberry pido komunikacji z innym SX1278 podłączonym do mikrokontrolera, takiego jak Arduino. Ta metoda może być przydatna w wielu miejscach, ponieważ Arduino może działać jako serwer do pobierania danych z czujników i wysyłania ich do Pi na dużą odległość przez LoRa, a następnie Pi działając jako klient może odbierać te informacje i przesyłać je do mógł, ponieważ ma dostęp do internetu. Brzmi interesująco, prawda? Więc zacznijmy.
Wymagane materiały
- Moduł SX1278 433 MHz LoRa - 2 szt
- Antena 433MHz LoRa - 2
- Arduino UNO- lub inna wersja
- Raspberry Pi 3
Zakłada się, że Twoje Raspberry Pi jest już flashowane z systemem operacyjnym i jest w stanie połączyć się z Internetem. Jeśli nie, postępuj zgodnie z samouczkiem Wprowadzenie do Raspberry Pi przed kontynuowaniem. Tutaj używamy Rasbian Jessie zainstalowanego Raspberry Pi 3.
Ostrzeżenie: Zawsze używaj modułu SX1278 LoRa z antenami 433 MHz; inaczej moduł może ulec uszkodzeniu.
Łączenie Raspberry Pi z LoRa
Zanim przejdziemy do pakietów oprogramowania, przygotujmy sprzęt. SX1278 jest 16-pin moduł Lora, który komunikuje się przy użyciu SPI 3.3V Logic. Raspberry pi działa również na poziomie logicznym 3,3 V, a także ma wbudowany port SPI i regulator 3,3 V. Możemy więc bezpośrednio połączyć moduł LoRa z Raspberry Pi. Tabela połączeń jest pokazana poniżejRaspberry Pi | Lora - moduł SX1278 |
3,3 V. | 3,3 V. |
Ziemia | Ziemia |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Enable |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Możesz również skorzystać z poniższego schematu obwodu w celach informacyjnych. Zwróć uwagę, że schemat obwodu został utworzony przy użyciu modułu RFM9x, który jest bardzo podobny do modułu SX1278, stąd wygląd może się różnić na poniższym obrazku.
Połączenia są dość proste, jedynym problemem, z którym możesz się spotkać, jest to, że SX1278 nie jest kompatybilny z płytką prototypową, dlatego musisz użyć przewodów połączeniowych bezpośrednio, aby wykonać połączenia lub użyć dwóch małych płytek prototypowych, jak pokazano poniżej. Również niewiele osób sugeruje zasilanie modułu LoRa oddzielną szyną zasilającą 3,3 V, ponieważ Pi może nie być w stanie zapewnić wystarczającego prądu. Jednak Lora będąca modułem małej mocy powinna pracować na szynie 3,3V Pi, przetestowałem to samo i stwierdziłem, że działa bez problemu. Ale nadal weź to ze szczyptą soli. Moja konfiguracja połączenia LoRa z Raspberry pi wygląda mniej więcej tak jak poniżej
Łączenie Arduino z LoRa
Połączenie dla modułu Arduino pozostaje takie samo, jak to, z którego korzystaliśmy w naszym poprzednim samouczku. Jedyna różnica będzie polegać na tym, że zamiast korzystać z biblioteki Sandeep Mistry użyjemy biblioteki Rspreal opartej na głowicy Radia, o której będziemy mówić w dalszej części tego projektu. Obwód jest podany poniżej
Ponownie możesz użyć pinu 3,3 V na Arduino Uno lub użyć oddzielnego regulatora 3,3 V. W tym projekcie wykorzystałem pokładowy regulator napięcia. Tabela połączeń pinów jest podana poniżej, aby ułatwić wykonanie połączeń.
Moduł LoRa SX1278 | Płytka Arduino UNO |
3,3 V. | 3,3 V. |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Ponieważ moduł nie mieści się w płytce stykowej, użyłem przewodów połączeniowych bezpośrednio do wykonania połączeń. Po nawiązaniu połączenia konfiguracja Arduino LoRa będzie wyglądać mniej więcej tak poniżej
pyLoRa dla Raspberry Pi
Istnieje wiele pakietów Pythona, których można używać z LoRa. Również powszechnie Raspberry Pi jest używany jako LoRaWAN do pobierania danych z wielu węzłów LoRa. Ale w tym projekcie naszym celem jest komunikacja Peer to Peer między dwoma modułami Raspberry Pi lub między Raspberry Pi a Arduino. Postanowiłem więc skorzystać z pakietu pyLoRa. Posiada moduły rpsreal LoRa Arduino i rpsreal LoRa Raspberry pi, które mogą być używane w środowisku Arduino i Raspberry Pi. Na razie skupmy się na środowisku Raspberry Pi.
Konfiguracja Raspberry Pi dla modułu LoRa
Jak powiedziano wcześniej, moduł LoRa współpracuje z komunikacją SPI, więc musimy włączyć SPI na Pi, a następnie zainstalować pakiet pylora . Wykonaj poniższe kroki, aby zrobić to samo, po otwarciu okna terminala Pi. Ponownie używam szpachli, aby połączyć się z moim Pi, możesz użyć wygodnej metody.
Krok 1: Wejdź do okna konfiguracji za pomocą następującego polecenia. Aby uzyskać poniższe okno
sudo raspi-config
Krok 2: Przejdź do opcji interfejsu i włącz SPI, jak pokazano na poniższym obrazku. Musimy włączyć interfejs SPI, ponieważ jak omówiliśmy, LCD i PI komunikują się za pośrednictwem protokołu SPI
Krok 3: Zapisz zmiany i wróć do okna terminala. Upewnij się, że pip i python są zaktualizowane, a następnie zainstaluj pakiet RPi.GPIO za pomocą następującego polecenia.
pip zainstaluj RPi.GPIO
Ta klasa pakietu pomoże nam kontrolować pin GPIO w Pi. Po pomyślnym zainstalowaniu ekran będzie wyglądał tak
Krok 4: Podobnie kontynuuj instalację pakietu spidev za pomocą następującego polecenia. Spidev to powiązanie Pythona dla Linuksa, które może być używane do komunikacji SPI na Raspberry Pi.
pip install spidev
Jeśli instalacja się powiedzie, terminal powinien wyglądać jak poniżej.
Krok 5: Następnie zainstalujmy pakiet pyLoRa za pomocą następującego polecenia pip. Ten pakiet instaluje modele radia skojarzone z LoRa.
pip install pyLoRa
Jeśli instalacja się powiedzie, pojawi się następujący ekran.
Pakiet PyLoRa obsługuje również szyfrowaną komunikację, która może być bezproblemowo używana z Arduino i Raspberry Pi. Poprawi to bezpieczeństwo danych w Twojej komunikacji. Ale po tym kroku musisz zainstalować oddzielny pakiet, którego nie robię, ponieważ szyfrowanie nie jest objęte zakresem tego samouczka. Możesz skorzystać z powyższych linków github, aby uzyskać więcej informacji.
Po tym kroku możesz dodać informacje o ścieżce pakietu do pi i spróbować z programem w Pythonie podanym na końcu. Nie udało mi się jednak pomyślnie dodać ścieżki i dlatego musiałem ręcznie pobrać bibliotekę i użyć jej bezpośrednio dla moich programów. Musiałem więc wykonać następujące kroki
Krok 6: Pobierz i zainstaluj pakiet python-rpi.gpio i pakiet spidev za pomocą poniższego polecenia.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Okno terminala powinno wyświetlić coś takiego po obu instalacjach.
Krok 7: Zainstaluj także git, a następnie użyj go do sklonowania katalogu Pythona dla naszego Raspberry Pi. Możesz to zrobić za pomocą następujących poleceń.
sudo apt-get install git sudo git clone
Po zakończeniu tego kroku powinieneś znaleźć podkatalog SX127x w folderze domowym Raspberry Pi. Będzie to mieć wszystkie wymagane pliki powiązane z biblioteką.
Programowanie Raspberry Pi dla LoRa
W komunikacji typu peer to peer LoRa moduł, który przesyła informacje, nazywany jest serwerem, a moduł, który odbiera informacje, nazywany jest klientem. W większości przypadków Arduino będzie używane w terenie z czujnikiem do pomiaru danych, a Pi będzie używane do odbierania tych danych. Dlatego zdecydowałem się użyć Raspberry Pi jako klienta i Arduino jako serwera w tym samouczku. Kompletny program kliencki Raspberry Pi można znaleźć na dole tej strony. Tutaj spróbuję wyjaśnić ważne wiersze programu.
Przestroga: Upewnij się, że plik programu znajduje się w tym samym katalogu, w którym znajduje się folder biblioteki SX127x. Możesz skopiować ten folder i używać go w dowolnym miejscu, jeśli chcesz przenieść projekt.
Program jest dość prosty, musimy ustawić moduł LoRa do pracy w 433Mhz, a następnie nasłuchiwać nadchodzących pakietów. Jeśli coś otrzymamy, po prostu wydrukujemy je na konsoli. Jak zwykle program zaczynamy od zaimportowania wymaganych bibliotek Pythona.
od czasu import uśpienia z SX127x.LoRa import * z SX127x.board_config import BOARD BOARD.setup ()
W tym przypadku pakiet czas jest używany do tworzenia opóźnienia, pakiet Lora służy do komunikacji Lora i board_config służy do ustawiania parametrów płytę i Lora. Konfigurujemy również płytkę za pomocą funkcji BOARD.setup () .
Następnie tworzymy klasę Python LoRa z trzema definicjami. Ponieważ robimy wcięcia tylko po to, aby program działał jako klient malinowy, klasa ma tylko trzy funkcje, a mianowicie klasę init, klasę startową i klasę on_rx_done . Klasa init inicjuje moduł LoRa w częstotliwości 433 MHz z pasmem 125 kHz ustawionym w metodzie set_pa_config . Następnie przełącza również moduł w tryb uśpienia, aby oszczędzać zużycie energii.
# Wartości domyślne średniego zakresu po inicjalizacji to 434,0 MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128 chipów / symbol, CRC on 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (gadatliwy) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Funkcja start polega na tym, że konfigurujemy moduł jako odbiornik i uzyskujemy RSSI (wskaźnik siły sygnału odbioru), status, częstotliwość pracy itp. Ustawiamy moduł na pracę w trybie ciągłego odbiornika (RXCONT) z trybu uśpienia, a następnie używamy pętli while do odczytu wartości takich jak RSSI i stan modemu. Przesyłamy również dane z bufora szeregowego do terminala.
def start (self): self.reset_ptr_rx () self.set_mode (MODE.RXCONT) while True: sleep (.5) rssi_value = self.get_rssi_value () status = self.get_modem_status () sys.stdout.flush ()
Wreszcie funkcja on_rx_done zostaje wykonana po odczytaniu nadchodzącego pakietu. W tej funkcji odebrane wartości są przenoszone do zmiennej o nazwie payload z bufora Rx po ustawieniu flagi odbioru na wysoką. Następnie odebrane wartości są dekodowane za pomocą utf-8, aby wydrukować na powłoce dane czytelne dla użytkownika. Wprowadzamy również moduł z powrotem w tryb uśpienia do czasu otrzymania innej wartości.
def on_rx_done (self): print ("\ nReceived :") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (payload).decode ("utf-8", 'ignore')) self.set_mode (TRYB.SLEEP) self.reset_ptr_rx () self.set_mode (TRYB.RXCONT)
Pozostała część programu to po prostu wydrukowanie odebranych wartości na konsoli i zakończenie programu za pomocą przerwania klawiatury. Ponownie ustawiamy płytkę w tryb uśpienia nawet po zakończeniu programu, aby oszczędzać energię.
spróbuj: lora.start () z wyjątkiem KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") w końcu: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Kod Arduino dla LoRa do komunikacji z Raspberry Pi
Jak wspomniałem wcześniej, kod rpsreal obsługuje zarówno Arduino, jak i Pi, dzięki czemu komunikacja między Arduino i Pi jest możliwa. Działa w oparciu o Bibliotekę Radiohead z AirSpayce's. Musisz więc najpierw zainstalować bibliotekę radiową w swoim Arduino IDE.
Aby to zrobić, odwiedź stronę Github i pobierz bibliotekę w folderze ZIP. Następnie umieść go w folderze biblioteki swojego Arduino IDE. Teraz uruchom ponownie Arduino IDE, a znajdziesz przykładowe pliki dla biblioteki radiowej. Tutaj zaprogramujemy Arduino do pracy jako serwer LoRa do wysyłania pakietów testowych, takich jak od 0 do 9. Kompletny kod, aby zrobić to samo, można znaleźć na dole tej strony, jak zawsze. Tutaj wyjaśnię kilka ważnych linii programu.
Program rozpoczynamy od importu biblioteki SPI (instalowanej domyślnie) do korzystania z protokołu SPI, a następnie biblioteki RH_RF95 z głowicy Radia do realizacji komunikacji LoRa. Następnie definiujemy, do którego pinu Arduino podłączyliśmy pin Select Chip (CS), Reset (RST) i Interrupt (INT) w LoRa z Arduino. Na koniec określamy również, że moduł powinien pracować na częstotliwości 434MHz i inicjalizować moduł LoRa.
#zawierać
W funkcji konfiguracji zresetujemy moduł LoRa, przeciągając jego pin resetowania do niskiego poziomu na 10 milisekund, aby rozpocząć od nowa. Następnie inicjalizujemy go za pomocą modułu, który stworzyliśmy wcześniej przy użyciu biblioteki radiowej. Następnie ustawiamy częstotliwość i moc transmisji dla serwera LoRa. Im większa transmisja, tym większa odległość, którą będą podróżować pakiety, ale będą zużywać więcej energii.
void setup () { // Zainicjuj Serial Monitor Serial.begin (9600); // Reset modułu LoRa pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); opóźnienie (10); digitalWrite (RFM95_RST, HIGH); opóźnienie (10); // Zainicjuj moduł LoRa while (! Rf95.init ()) { Serial.println ("Inicjalizacja radia LoRa nie powiodła się"); podczas gdy (1); } // Ustaw domyślną częstotliwość 434,0 MHz if (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); podczas gdy (1); } rf95.setTxPower (18); // Moc transmisji modułu Lora }
Wewnątrz funkcji nieskończonej pętli musimy po prostu wysłać pakiet danych przez moduł LoRa. Te dane mogą być dowolnymi danymi, takimi jak wartość czujnika polecenia użytkownika. Ale dla uproszczenia będziemy wysyłać wartość char od 0 do 9 co 1 sekundę, a następnie zainicjujemy wartość z powrotem do 0 po osiągnięciu 9. Zauważ, że wartości mogą być wysyłane tylko w formacie tablicy znaków, a typ danych powinien być unit8_t to to 1 bajt na raz. Kod umożliwiający to samo pokazano poniżej
void loop () { Serial.print ("Wyślij:"); char radiopacket = char (wartość)}; rf95.send ((uint8_t *) radiopacket, 1); opóźnienie (1000); wartość ++; if (wartość> '9') wartość = 48; }
Testowanie komunikacji LoRa pomiędzy Raspberry Pi a Arduino
Teraz, gdy mamy gotowy sprzęt i program, musimy po prostu załadować kod Arduino na płytkę UNO i szkic w Pythonie powinien zostać uruchomiony na pi. Moja konfiguracja testowa z podłączonym sprzętem wygląda mniej więcej tak poniżej
Po uruchomieniu szkicu klienta Pythona na Pi (używaj tylko Pythona 3), jeśli wszystko działa poprawnie, powinieneś zobaczyć pakiety Arduino odebrane w pi przez okno powłoki. Powinieneś zauważyć, że „Otrzymano: 0” do 9, jak pokazano na poniższym obrazku.
Pełny kod Raspberry pi ze wszystkimi wymaganymi bibliotekami można pobrać stąd.
Możesz teraz przenieść serwer Arduino i sprawdzić zasięg modułu; w razie potrzeby można również wyświetlić wartość RSSI w powłoce. Kompletny roboczego projektu można znaleźć w filmie połączonego poniżej. Teraz, gdy wiemy, jak ustanowić komunikację LoRa na duże odległości między Arduino i Raspberry pi, możemy przystąpić do dodawania czujnika po stronie Arduino i platformy chmurowej po stronie Pi, aby stworzyć kompletny pakiet IoT.
Mam nadzieję, że rozumiesz projekt i cieszysz się jego budowaniem. Jeśli masz problem z uruchomieniem go, skorzystaj z sekcji komentarzy poniżej lub na forach, aby uzyskać inne pytania techniczne.