- Material som krävs
- Ansluter Raspberry Pi med LoRa
- Ansluter Arduino med LoRa
- pyLoRa för Raspberry Pi
- Konfigurera Raspberry Pi för LoRa-modulen
- Programmering av Raspberry Pi för LoRa
- Arduino-kod för LoRa för att kommunicera med Raspberry Pi
- Testar LoRa-kommunikation mellan Raspberry Pi och Arduino
LoRa blir allt populärare med tillkomsten av IoT, Connected Cars, M2M, Industry 4.0 etc. På grund av dess förmåga att kommunicera till långa sträckor med mycket mindre kraft används den företrädesvis av designers för att skicka / ta emot data från ett batteridrivet sak. Vi har redan diskuterat grunderna i LoRa och hur man använder LoRa med Arduino. Även om tekniken ursprungligen är avsedd för en LoRa-nod för att kommunicera med en LoRa-gateway, finns det många scenarier där en LoRa-nod måste kommunicera med en annan LoRa-nod för att utbyta information över långa avstånd. Så i den här handledningen lär vi oss hur man använder en LoRa-modul SX1278 med Raspberry piför att kommunicera med en annan SX1278 ansluten till en mikrokontroller som Arduino. Denna metod kan vara till nytta på många ställen eftersom Arduino kan fungera som en server för att hämta data från sensorer och skicka den till Pi över ett långt avstånd genom LoRa och sedan kan Pi som fungerar som klient ta emot denna information och ladda upp den till kunde eftersom det har tillgång till internet. Låter intressant, eller hur? Så, låt oss komma igång.
Material som krävs
- SX1278 433MHz LoRa-modul - 2 nr
- 433MHz LoRa-antenn - 2Nos
- Arduino UNO- eller annan version
- Raspberry Pi 3
Det antas att din Raspberry Pi redan har blinkat med ett operativsystem och kan ansluta till internet. Om inte, följ guiden Komma igång med Raspberry Pi innan du fortsätter. Här använder vi Rasbian Jessie installerade Raspberry Pi 3.
Varning: Använd alltid din SX1278 LoRa-modul med 433 MHz-antenner. annars kan modulen skadas.
Ansluter Raspberry Pi med LoRa
Innan vi går in i programvarupaketet, låt oss göra hårdvaran redo. Den SX1278 är en 16-polig Lora modul som kommunicerar med användning av SPI på 3.3V Logic. Raspberry pi fungerar också på 3,3 V-logiknivå och har också inbyggd SPI-port och 3,3 V-regulator. Så vi kan direkt ansluta LoRa-modulen till Raspberry Pi. Anslutningstabellen visas nedanRaspberry Pi | Lora - SX1278-modul |
3,3V | 3,3V |
Jord | Jord |
GPIO 10 | MOSI |
GPIO 9 | MISO |
GPIO 11 | SCK |
GPIO 8 | Nss / Aktivera |
GPIO 4 | DIO 0 |
GPIO 17 | DIO 1 |
GPIO 18 | DIO 2 |
GPIO 27 | DIO 3 |
GPIO 22 | RST |
Du kan också använda kretsschemat nedan för referens. Observera att kretsschemat skapades med hjälp av RFM9x-modulen som liknar SX1278-modulen, och därför kan utseendet skilja sig åt i bilden nedan.
Anslutningarna är ganska rakt fram, det enda problemet du kan möta är att SX1278 inte är kompatibel med brädbrädor, därför måste du använda anslutningsledningar direkt för att göra anslutningarna eller använda två små brädbrädor som visas nedan. Det är också få som föreslår att driva LoRa-modulen med separat 3,3 V-strömskena, eftersom Pi kanske inte kan skaffa tillräckligt med ström. Men Lora som en lågeffektsmodul borde fungera på 3,3 V-skenan på Pi, jag testade samma och fann att den fungerade utan problem. Men ta det fortfarande med en nypa salt. Min anslutningsuppsättning av LoRa med Raspberry pi ser ungefär så här ut
Ansluter Arduino med LoRa
Anslutningen för Arduino-modulen förblir densamma som den vi använde i vår tidigare handledning. Den enda skillnaden kommer att vara istället för att använda biblioteket från Sandeep Mistry kommer vi att använda Rspreal-biblioteket baserat på Radio-huvudet som vi kommer att diskutera senare i detta projekt. Kretsen är nedan
Återigen kan du använda 3.3V-stiftet på Arduino Uno eller använda en separat 3.3V-regulator. I detta projekt har jag använt den inbyggda spänningsregulatorn. Stiftanslutningstabellen anges nedan för att hjälpa dig att göra anslutningarna enkelt.
LoRa SX1278-modul | Arduino UNO styrelse |
3,3V | 3,3V |
Gnd | Gnd |
En / Nss | D10 |
G0 / DIO0 | D2 |
SCK | D13 |
MISO | D12 |
MOSI | D11 |
RST | D9 |
Eftersom modulen inte passar i en bräda har jag använt anslutningskablarna direkt för att göra anslutningarna. När anslutningen har gjorts kommer Arduino LoRa- installationen att se ut så här nedan
pyLoRa för Raspberry Pi
Det finns många pythonpaket som du kan använda med LoRa. Raspberry Pi används också ofta som en LoRaWAN för att få data från flera LoRa-noder. Men i detta projekt är vårt mål att göra Peer to Peer-kommunikation mellan två Raspberry Pi-moduler eller mellan en Raspberry Pi och en Arduino. Så jag bestämde mig för att använda pyLoRa-paketet. Den har en rpsreal LoRa Arduino och rpsreal LoRa Raspberry pi-moduler som kan användas på Arduino och Raspberry Pi-miljön. Låt oss för närvarande fokusera på Raspberry Pi-miljön.
Konfigurera Raspberry Pi för LoRa-modulen
Som sagt tidigare de lora modul arbetar med SPI kommunikation, så måste vi göra det möjligt för SPI på Pi och sedan installera pylora paketet. Följ stegen nedan för att göra detsamma efter att ha öppnat terminalfönstret på Pi. Återigen använder jag kitt för att ansluta till min Pi, du kan använda din praktiska metod.
Steg 1: Gå in i konfigurationsfönstret med följande kommando. För att få fönstret nedan
sudo raspi-config
Steg 2: Navigera till gränssnittsalternativ och aktivera SPI enligt bilden nedan. Vi måste aktivera SPI-gränssnittet, för som vi diskuterade kommunicerar LCD och PI via SPI-protokollet
Steg 3: Spara ändringarna och gå tillbaka till terminalfönstret. Se till att pip och python uppdateras och installera sedan RPi.GPIO- paketet med följande kommando.
pip installera RPi.GPIO
Denna paketklass hjälper oss att kontrollera GPIO-stiftet på Pi. Om installationen lyckats ser din skärm ut så här
Steg 4: Fortsätt på samma sätt med installationen av spidev- paketet med följande kommando. Spidev är en pythonbindning för Linux som kan användas för att utföra SPI-kommunikation på Raspberry Pi.
pip install spidev
Om installationen lyckas ska terminalen se ut så här nedan.
Steg 5: Därefter kan vi installera pyLoRa-paketet med följande pip-kommando. Detta paket installerar de radiomodeller som är associerade med LoRa.
pip installera pyLoRa
Om installationen lyckas ser du följande skärm.
PyLoRa-paketet stöder också krypterad kommunikation som kan användas med Arduino och Raspberry Pi sömlöst. Detta kommer att förbättra datasäkerheten i din kommunikation. Men du måste installera ett separat paket efter det här steget, vilket jag inte gör eftersom kryptering inte omfattas av denna handledning. Du kan följa ovanstående github-länkar för mer information.
Efter detta steg kan du lägga till information om paketvägen till pi och försöka med python-programmet som ges i slutet. Men jag kunde inte lägga till sökvägen framgångsrikt och var därför tvungen att ladda ner manuellt bibliotek och använda detsamma direkt för mina program. Så jag var tvungen att gå vidare med följande steg
Steg 6: Ladda ner och installera paketet python-rpi.gpio och spidev med kommandot nedan.
sudo apt-get install python-rpi.gpio python3-rpi.gpio sudo apt-get install python-spidev python3-spidev
Terminalfönstret ska visa något liknande efter båda installationerna.
Steg 7: Installera också git och använd den för att klona pythonkatalogen för vår Raspberry Pi. Du kan göra det med följande kommandon.
sudo apt-get install git sudo git klon
När detta steg är klart bör du hitta SX127x-underkatalogen i Raspberry Pi-hemmappen. Detta kommer att ha alla nödvändiga filer associerade med biblioteket.
Programmering av Raspberry Pi för LoRa
I en peer-to-peer-LoRa-kommunikation kallas modulen som sänder informationen en server och modulen som tar emot informationen kallas en klient. I de flesta fall kommer Arduino att användas i fält med en sensor för att mäta data och Pi kommer att användas för att ta emot dessa data. Så jag bestämde mig för att använda Raspberry Pi som klient och Arduino som server i denna handledning. Det fullständiga Raspberry Pi-klientprogrammet hittar du längst ner på denna sida. Här kommer jag att försöka förklara de viktiga raderna i programmet.
Varning: Se till att programfilen finns i samma katalog där biblioteksmappen SX127x finns. Du kan kopiera den här mappen och använda den var som helst om du vill portera projektet.
Programmet är ganska enkelt, vi måste ställa in LoRa-modulen så att den fungerar i 433Mhz och sedan lyssna efter inkommande paket. Om vi får något skriver vi enkelt ut dem på konsolen. Som alltid börjar vi programmet med att importera de nödvändiga pythonbiblioteken.
från tid importera sömn från SX127x.LoRa import * från SX127x.board_config import BOARD BOARD.setup ()
I det här fallet används tidspaketet för att skapa förseningar, Lora-paketet används för LoRa-kommunikation och board_config används för att ställa in kort- och LoRa-parametrar. Vi ställer också in kortet med funktionen BOARD.setup () .
Därefter skapar vi python LoRa-klassen med tre definitioner. Eftersom vi bara drar in oss för att få programmet att fungera som hallonklient har klassen bara tre funktioner, nämligen init-klassen, startklassen och on_rx_done- klassen. Init-klassen initierar LoRa-modulen i 433MHz med 125kHz bandbredd enligt inställningen i metoden set_pa_config . Då sätter den också modulen i viloläge för att spara strömförbrukning.
# Medium Range Standardvärden efter init är 434.0MHz, Bw = 125 kHz, Cr = 4/5, Sf = 128chips / symbol, CRC på 13 dBm lora.set_pa_config (pa_select = 1) def __init __ (self, verbose = False): super (LoRaRcvCont, self).__ init __ (verbose) self.set_mode (MODE.SLEEP) self.set_dio_mapping (* 6)
Startfunktionen är där vi konfigurera modulen som mottagare och erhålla liknande RSSI (Ta emot signalstyrkeindikator), status, driftfrekvens osv. Vi ställer in modulen för att fungera i kontinuerligt mottagarläge (RXCONT) från viloläge och använder sedan en stundslinga för att läsa värden som RSSI och modemstatus. Vi spolar också data i den seriella bufferten till terminalen.
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 ()
Slutligen körs on_rx_done- funktionen efter att det inkommande paketet har lästs. I denna funktion flyttas de mottagna värdena till en variabel som kallas nyttolast från Rx-bufferten efter att ha mottagit flaggan hög. Därefter avkodas de mottagna värdena med utf-8 för att skriva ut en användarläsbar data på skalet. Vi sätter också tillbaka modulen i viloläge tills ett annat värde tas emot.
def on_rx_done (self): print ("\ nReceived:") self.clear_irq_flags (RxDone = 1) payload = self.read_payload (nocheck = True) print (bytes (nyttolast).decode ("utf-8", "ignorera"))) self.set_mode (MODE.SLEEP) self.reset_ptr_rx () self.set_mode (MODE.RXCONT)
Den återstående delen av programmet är bara att skriva ut de mottagna värdena på konsolen och avsluta programmet med ett tangentbordsavbrott. Vi sätter igen styrelsen i viloläge även efter avslutat program för att spara ström.
försök: lora.start () utom KeyboardInterrupt: sys.stdout.flush () print ("") sys.stderr.write ("KeyboardInterrupt \ n") slutligen: sys.stdout.flush () print ("") lora. set_mode (MODE.SLEEP) BOARD.teardown ()
Arduino-kod för LoRa för att kommunicera med Raspberry Pi
Som jag nämnde tidigare stöder rpsreal- koden både Arduino och Pi och därför är kommunikation mellan Arduino och Pi möjlig. Det fungerar baserat på Radiohead Library från AirSpayce's. Så du måste installera radiohuvudbiblioteket först på din Arduino IDE.
För att göra det, besök Github-sidan och ladda ner biblioteket i ZIP-mappen. Placera den sedan i biblioteksmappen på din Arduino IDE. Starta nu om Arduino IDE så hittar du exempelfiler för Radio head-biblioteket. Här kommer vi att programmera Arduino för att fungera som en LoRa-server för att skicka testpaket som 0 till 9. Komplett koden för att göra detsamma finns längst ner på denna sida som alltid. Här kommer jag att förklara några viktiga rader i programmet.
Vi börjar programmet med att importera SPI-biblioteket (installerat som standard) för att använda SPI-protokollet och sedan RH_RF95-biblioteket från radiohuvudet för att utföra LoRa-kommunikation. Sedan definierar vi till vilken stift av Arduino vi har anslutit Chip select (CS), Reset (RST) och Interrupt (INT) -stift på LoRa med Arduino. Slutligen definierar vi också att modulen ska fungera i 434MHz frekvens och initiera LoRa-modulen.
#omfatta
Inuti installationsfunktionen kommer vi att återställa LoRa-modulen genom att dra dess återställningsstift till lågt i 10 milli sekund för att börja nytt. Sedan initialiserar vi den med modulen som vi skapade tidigare med hjälp av Radio-huvudbiblioteket. Sedan ställer vi in frekvensen och överföringseffekten för LoRa-servern. Högre överföring mer avstånd dina paket kommer att färdas men förbrukar mer kraft.
ogiltig installation () { // Initiera Serial Monitor Serial.begin (9600); // Återställ LoRa-modulens pinMode (RFM95_RST, OUTPUT); digitalWrite (RFM95_RST, LOW); fördröjning (10); digitalWrite (RFM95_RST, HÖG); fördröjning (10); // Initiera LoRa-modulen medan (! Rf95.init ()) { Serial.println ("LoRa radio init failed"); medan (1); } // Ställ in standardfrekvensen 434.0MHz om (! Rf95.setFrequency (RF95_FREQ)) { Serial.println ("setFrequency failed"); medan (1); } rf95.setTxPower (18); // Lora-modulens överföringsförmåga }
Inuti den oändliga slingfunktionen måste vi helt enkelt skicka datapaketet genom LoRa-modulen. Dessa data kan vara ungefär som sensorvärdet för användarkommandot. Men för enkelhetens skull skickar vi char-värde 0 till 9 för varje 1 sekunds intervall och initierar sedan värdet tillbaka till 0 efter att ha nått 9. Observera att värdena endast kan skickas i ett char-array-format och datatypen ska vara enhet8_t som är 1 byte åt gången. Koden för att göra detsamma visas nedan
void loop () { Serial.print ("Skicka:"); char radiopacket = char (värde)}; rf95.send ((uint8_t *) radiopaket, 1); fördröjning (1000); värde ++; om (värde> '9') värde = 48; }
Testar LoRa-kommunikation mellan Raspberry Pi och Arduino
Nu när vi har gjort både vår hårdvara och vårt program måste vi helt enkelt ladda upp Arduino-koden till UNO-kortet och pythonskissen bör lanseras på pi. Min testuppsättning med både ansluten hårdvara ser ut så här nedan
När python-klientskissen har startats på Pi (använd endast python 3), om allt fungerar ordentligt bör du se Arduino-paketen som tas emot i pi genom skalfönstret. Du bör lägga märke till "Mottaget: 0" till 9 som visas i bilden nedan.
Den fullständiga Raspberry pi-koden med alla nödvändiga bibliotek kan laddas ner härifrån.
Du kan nu flytta Arduino-servern och kontrollera modulens räckvidd. det är också möjligt att visa RSSI-värdet på skalet om det behövs. Det fullständiga arbetet med projektet finns i videon som länkas nedan. Nu, när vi vet hur man skapar LoRa-kommunikation med långa avstånd med låg effekt mellan Arduino och Raspberry pi, kan vi fortsätta med att lägga till sensor på Arduino-sidan och molnplattform på Pi-sidan för att göra ett komplett IoT-paket.
Hoppas att du förstod projektet och gillade att bygga det. Om du har problem med att få det att fungera, använd kommentarsektionen nedan eller forumet för andra tekniska frågor.